verstak/internal/core/storage
mirivlad 88eb99e9af fix: verstak:// links in preview, case-insensitive search, keyboard layout swap
1. Fix verstak:// links rendered as blocked/strikethrough in markdown preview:
   - Changed href from 'javascript:void(0)' to hash-based '#verstak-type-id'
   - DOMPurify no longer strips the link; click handler uses data-verstak-href
   - CSS already handles .md-link--internal with cyan color, no strikethrough

2. Add markdown label escaping for internal link picker:
   - New escapeMarkdownLabel() in markdown.ts escapes [ ] ( )
   - Applied in InternalLinkPicker.selectResult() before inserting markdown

3. Fix case-insensitive search for RU/EN:
   - Add title_lower column (migration 019) populated by Go strings.ToLower
   - BackfillTitleLower() runs after migrations to populate existing rows
   - Search() now queries title_lower with Go-level lowercase (Unicode-aware)
   - insertNode() and UpdateTitle() populate title_lower automatically
   - New migration 019 + BackfillTitleLower in storage.go
   - Tests: TestSearchCaseInsensitive, TestSearchFindsCreatedNode

4. Add keyboard layout swap search support:
   - New keyboardLayout.ts utility with RU↔EN QWERTY mapping
   - expandKeyboardVariants() generates original + swapped + lowercased variants
   - InternalLinkPicker.search() queries all variants in parallel, deduplicates by ID
   - Examples: dthcnfr → верстак, руддщ → hello

Files changed:
- markdown.ts: hash href + escapeMarkdownLabel export
- InternalLinkPicker.svelte: label escaping + layout swap search
- keyboardLayout.ts: new RU/EN layout swap utility
- repository.go: title_lower in Search/insertNode/UpdateTitle
- storage.go: migration019 + BackfillTitleLower
- migrations_019.sql.go: new migration
- search_test.go, repository_test.go: new tests
2026-06-15 10:39:44 +08:00
..
migrations.go step 2: init command + SQLite storage + migrations + config 2026-05-30 18:58:47 +08:00
migrations_002.sql.go steps 4-6 + doc overhaul: files, notes, GUI, plugins docs 2026-05-30 20:35:04 +08:00
migrations_003.sql.go steps 4-6 + doc overhaul: files, notes, GUI, plugins docs 2026-05-30 20:35:04 +08:00
migrations_004.sql.go feat: node section assignment for sidebar filtering + search fix 2026-05-31 01:26:46 +08:00
migrations_005.sql.go step 7: actions — table, service, CLI, GUI tab + confirm dialog 2026-05-31 01:52:23 +08:00
migrations_006.sql.go steps 8+9: worklog + FTS5 search 2026-05-31 02:25:25 +08:00
migrations_007.sql.go steps 8+9: worklog + FTS5 search 2026-05-31 02:25:25 +08:00
migrations_008.sql.go today dashboard: activity_events, ListTodayView with events timeline, frontend TodayDashboard separated from sidebar 2026-06-01 02:16:13 +08:00
migrations_009.sql.go activity: global feed, per-case log, sidebar section, today UX 2026-06-01 02:53:56 +08:00
migrations_010.sql.go feat: sync — migration 010 for sync_ops and sync_state tables 2026-06-01 22:45:12 +08:00
migrations_011.sql.go sync: overhaul sync system — device pairing, server_sequence, auto-sync, dashboards 2026-06-02 02:26:05 +08:00
migrations_012.sql.go refactor: implement template-driven node tree and human-readable vault layout 2026-06-02 12:47:06 +08:00
migrations_013.sql.go feat: journal UX overhaul — picker, export dialog, events, readability 2026-06-03 11:24:59 +08:00
migrations_014.sql.go feat: worklog source field, suggestion logic fix, modal form, activity navigation 2026-06-03 12:27:50 +08:00
migrations_015.sql.go feat: resolve inbox links separately 2026-06-05 07:33:10 +08:00
migrations_016.sql.go feat: aggregate journals across node subtrees 2026-06-05 12:37:25 +08:00
migrations_017.sql.go feat: ШАГ 1 — Bridge HTTP-сервер для браузерного расширения 2026-06-06 18:23:47 +08:00
migrations_018.sql.go feat: ШАГ 2 — Staging-таблица browser_events + Store 2026-06-06 18:27:00 +08:00
migrations_019.sql.go fix: verstak:// links in preview, case-insensitive search, keyboard layout swap 2026-06-15 10:39:44 +08:00
storage.go fix: verstak:// links in preview, case-insensitive search, keyboard layout swap 2026-06-15 10:39:44 +08:00