Bugs:
- Fix replaceNthTable off-by-one: findAllTables now uses truly exclusive
end index (start + text.length) so content.slice(start, end) === text
- Replace fragile DOM-based table index resolution with AST-based approach
using node.position.start.offset from hast ReactMarkdownProps
Architecture:
- Unify TableEditorDialog instances: InsertMenu no longer manages its own
dialog, instead calls onOpenTableEditor from parent MemoEditor which
owns the single shared dialog instance
- Remove onInsertText prop chain (InsertMenu → EditorToolbar → MemoEditor)
replaced by onOpenTableEditor
Other improvements:
- Add i18n: all hardcoded English strings now use useTranslate()/t() with
new editor.table.* keys in en.json
- Fix useCallback [props] dependency that defeated memoization (removed
with dialog unification)
- Use stable row IDs (monotonic counter) as React keys instead of array
indices in TableEditorDialog
- Replace hardcoded MONO_FONT constant with Tailwind font-mono class
(maps to project's --font-mono CSS variable)
- Add 28 vitest tests for markdown-table.ts covering parse, serialize,
findAllTables, replaceNthTable, createEmptyTable with edge cases
- Add vitest dev dependency with test/test:watch scripts
Add a dialog-based table editor to create and edit markdown tables via a
visual grid instead of raw pipe-delimited text.
Features:
- Visual grid with inputs for headers and cells; add/remove rows and columns
- Sort columns (asc/desc, text and numeric); tab navigation (new row at end)
- Insert column/row between columns/rows via hover zones and + buttons with
blue highlight lines clipped to table bounds
- Sticky header with solid background; square headers; monospace cell font
- Row numbers with insert zones; delete row at row end; delete column with
spacing from insert button; Add row/Add column in footer and below table
- Delete table button on rendered tables (with confirm); edit pencil opens
dialog with parsed data; always-visible sort/delete at 40% opacity
- Fixed-size dialog (56rem x 44rem); /table slash command and Table in
InsertMenu open dialog; Command.action support for dialog-based commands
New: TableEditorDialog.tsx, utils/markdown-table.ts. Integration in
SlashCommands, EditorContent, InsertMenu, MemoContent Table.
Made-with: Cursor
The failed-to-load key was only used for non-ConnectError exceptions, which
are unreachable in practice since the Connect RPC client always wraps errors
as ConnectError. Use (error as Error).message as a plain fallback instead.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
30 locale files were missing the two keys added in the auth redirect PR.
Added English fallback strings so all locales render properly until
community translations are contributed.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the standalone SSE dot above UserMenu with a small badge
overlaid on the bottom-right of the user avatar. Only visible when
status is connecting (yellow) or disconnected (red) — invisible in the
normal connected state, removing constant visual noise.