rte: table creation and editing UI (GFM envelope) #95

Closed
opened 2026-07-18 02:26:21 +02:00 by dominik.polakovics · 1 comment

What to build

Editor affordances for rte tables, available only in bodies whose allow-set includes the table token: insert table (default 3x2 with header row), add/remove row, add/remove column, delete table. All operations stay inside the GFM envelope established by #94 — no merge/split controls, no per-cell block content, header row fixed as the first row.

Follow the existing rte toolbar/chip interaction patterns in web/src/rte/ for how the controls are surfaced (toolbar buttons or a table bubble menu — match what the editor already does for links/chips rather than inventing a new pattern).

Acceptance criteria

  • Insert-table control appears only when the active body's allow-set includes table
  • Row/column add/remove and delete-table work; header row cannot be removed while body rows exist
  • A table created entirely in the UI serializes to a valid GFM pipe table and publishes via real Hugo build
  • Keyboard: Tab/Shift-Tab move between cells; operations reachable without a mouse
  • No control ever produces content outside the GFM envelope (no merges, no block content in cells)

Blocked by

## What to build Editor affordances for rte tables, available only in bodies whose allow-set includes the `table` token: insert table (default 3x2 with header row), add/remove row, add/remove column, delete table. All operations stay inside the GFM envelope established by #94 — no merge/split controls, no per-cell block content, header row fixed as the first row. Follow the existing rte toolbar/chip interaction patterns in `web/src/rte/` for how the controls are surfaced (toolbar buttons or a table bubble menu — match what the editor already does for links/chips rather than inventing a new pattern). ## Acceptance criteria - [ ] Insert-table control appears only when the active body's allow-set includes `table` - [ ] Row/column add/remove and delete-table work; header row cannot be removed while body rows exist - [ ] A table created entirely in the UI serializes to a valid GFM pipe table and publishes via real Hugo build - [ ] Keyboard: Tab/Shift-Tab move between cells; operations reachable without a mouse - [ ] No control ever produces content outside the GFM envelope (no merges, no block content in cells) ## Blocked by - #94
Author
Owner

This was generated by AI during triage.

Triage confirmed — enhancement, ready-for-agent (blocked by #94; the scheduler reads the Blocked-by section and will hold this until #94 lands — the label goes on now by design).

Verified against the codebase: the toolbar/bubble-menu interaction patterns to follow live in web/src/rte/ (RichTextField.tsx chips/toolbar), as the body claims. All operations must stay inside the GFM envelope #94 establishes; the body's constraints match #94's exactly.

> *This was generated by AI during triage.* **Triage confirmed — enhancement, ready-for-agent** (blocked by #94; the scheduler reads the Blocked-by section and will hold this until #94 lands — the label goes on now by design). Verified against the codebase: the toolbar/bubble-menu interaction patterns to follow live in `web/src/rte/` (`RichTextField.tsx` chips/toolbar), as the body claims. All operations must stay inside the GFM envelope #94 establishes; the body's constraints match #94's exactly.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Cloonar/deckle#95
No description provided.