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