verstak/internal/core
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
..
actions stabilization: server.go split + i18n templates + frontend localization 2026-06-02 11:08:29 +08:00
activity feat: ШАГ 1 — Bridge HTTP-сервер для браузерного расширения 2026-06-06 18:23:47 +08:00
bridge test(bridge): add integration tests for empty/undefined secret, full flow 2026-06-09 01:11:51 +08:00
browser feat: ШАГ 2 — Staging-таблица browser_events + Store 2026-06-06 18:27:00 +08:00
config feat: plugin install/uninstall lifecycle + UI buttons 2026-06-07 15:28:37 +08:00
files fix: stabilize markdown notes — internal link modal, rename UI, trash integration 2026-06-15 09:19:26 +08:00
nodes fix: verstak:// links in preview, case-insensitive search, keyboard layout swap 2026-06-15 10:39:44 +08:00
notes fix: stabilize markdown notes — internal link modal, rename UI, trash integration 2026-06-15 09:19:26 +08:00
plugins fix(plugins): empty Lua tables now serialize as [] instead of {} in luaValueToGo 2026-06-08 14:15:37 +08:00
search feat: restore global search in app header 2026-06-06 02:39:29 +08:00
storage fix: verstak:// links in preview, case-insensitive search, keyboard layout swap 2026-06-15 10:39:44 +08:00
sync test: comprehensive sync package unit tests (37 new tests) 2026-06-03 09:16:38 +08:00
templates refactor: implement template-driven node tree and human-readable vault layout 2026-06-02 12:47:06 +08:00
util step 2: init command + SQLite storage + migrations + config 2026-05-30 18:58:47 +08:00
vault step 2: init command + SQLite storage + migrations + config 2026-05-30 18:58:47 +08:00
watcher feat: плагин-система Lua + Calendar reference plugin 2026-06-07 14:59:46 +08:00
worklog feat: edit and delete worklog entries 2026-06-05 00:48:12 +08:00
doc.go step 1: skeleton - go module, CLI stub with --version, structure 2026-05-30 18:42:19 +08:00
smoke_test.go fix: third stabilization pass — template children as nodes, atomicity, fs_path validation, sync_apply compat, smoke test 2026-06-03 02:05:53 +08:00