41 Commits

Author SHA1 Message Date
lucaronin
d96d6efd57 fix: support automatic rtl editor direction 2026-05-03 10:51:45 +02:00
lucaronin
f223d4f654 refactor: curate demo-vault-v2 fixture 2026-04-19 22:26:35 +02:00
lucaronin
6334d10540 💅 polish inspector, note list, and history UI 2026-04-16 17:03:50 +02:00
lucaronin
4a4ce4a402 fix: open editor immediately when clicking suggested property slots
Previously, clicking a suggested property slot (Status, Date, URL) would add
an empty property to frontmatter but fail to open the editor. This was due
to a race condition where:

1. handleSuggestedAdd() called onAddProperty() which is async
2. The useEffect tried to detect when the property appeared in frontmatter
3. But frontmatter updates asynchronously after onAddProperty resolves
4. By the time frontmatter is updated, the useEffect had already run

The fix is to directly set the editing key immediately when clicking a
suggested slot, rather than relying on the useEffect to detect the property
being added. This is more reliable because we know we're adding the property
- we don't need to wait for it to appear in frontmatter.
2026-04-07 11:03:50 +02:00
lucaronin
9c87eca226 feat: auto-rename untitled notes + Rust title resolution tests
- Add auto_rename_untitled Rust command: one-shot rename of untitled-*
  files based on H1 heading, with collision handling (-2, -3)
- Wire auto-rename into frontend save flow (useAppSave.ts)
- Update Rust tests: extract_title now uses H1 > frontmatter > filename
- Add extract_h1_title tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:14:43 +02:00
lucaronin
d50f3479dc feat: H1-as-title — title resolution, TitleField hiding, breadcrumb filename
- Rust: extract_title now prioritizes H1 > frontmatter > filename
- Rust: add has_h1 field to VaultEntry for frontend TitleField control
- Frontend: hide TitleField + icon picker when note has H1 in body
- Frontend: breadcrumb shows filename stem instead of display title
- Frontend: new notes use untitled-{type}-{timestamp}.md, no title in frontmatter
- CSS: only hide first H1 in BlockNote when TitleField is visible
- Updated all tests for new title resolution and note creation behavior

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:08:17 +02:00
lucaronin
0b58fd6061 fix: change AI panel shortcut from Cmd+Option+I to Cmd+Shift+L
The previous shortcut (Cmd+Option+I) conflicted with the editor's
italics shortcut (Cmd+I) on some keyboard layouts. Cmd+Shift+L has
no conflicts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 12:52:25 +02:00
lucaronin
d0c3a6b889 refactor: remove Trash system — delete is now permanent with confirm modal
Remove all vestiges of the abandoned Trash system: trashed/trashedAt fields
from types, frontmatter parsing, sidebar filtering, editor banners, inspector
components, mock data, and all related tests. Delete is already permanent via
useDeleteActions with a confirmation dialog. Notes with trashed:true in
existing vault frontmatter are now treated as normal notes (the flag is
ignored by the parser).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 12:21:56 +02:00
lucaronin
1145f4a572 feat: add organized toggle to breadcrumb bar and command palette
- CheckCircle button in breadcrumb bar toggles _organized property
- Green filled icon when organized, gray outline when not
- Command palette: "Mark as Organized" / "Mark as Unorganized"
- _organized hidden from Properties panel
- Handler follows favorite toggle pattern with optimistic updates

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 20:54:16 +02:00
lucaronin
8a86995c23 refactor: move vault UI config from ui.config.md to localStorage
Replace the in-vault ui.config.md file with localStorage persistence
keyed by vault path. Vaults now contain only user content — no app
config files. Removes the Rust vault_config module, Tauri commands
(get/save_vault_config), startup migrations, and demo vault config files.

The reactive store (vaultConfigStore) and consumer hooks (useZoom,
useViewMode, useRawMode) are unchanged — only the storage backend moved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 21:07:38 +01:00
lucaronin
0ac8ad8dff test: Playwright smoke test for title/filename sync + update docs
- 3 smoke tests: new note title, open note title display, rename atomicity
- Updated ABSTRACTIONS.md: title/filename sync section, title in semantic fields
- Updated ARCHITECTURE.md: title_sync.rs module, sync_note_title command

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 16:59:04 +01:00
lucaronin
edc4911eaf Merge remote-tracking branch 'origin/main' into task/image-drop-overlay-fix
# Conflicts:
#	tests/smoke/changing-type-data-corruption.spec.ts
#	tests/smoke/fix-note-filename-on-rename.spec.ts
#	tests/smoke/move-note-to-type-folder.spec.ts
2026-03-17 13:55:34 +01:00
lucaronin
164b76d35c fix: resolve demo vault path relative to project root — fix smoke test failures
DEFAULT_VAULTS was hard-coded to the main repo path, causing the Vault API
to read stale/duplicate files when running from worktrees. Now uses Vite's
define to inject the correct path at build time. Also fix theme heading
titles (remove redundant "Theme" suffix) and make smoke tests resilient
to Theme-type notes appearing first in the note list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 13:14:56 +01:00
lucaronin
144a621b3e fix: frontmatter parsing fails when unknown fields have list values
The Frontmatter struct deserialization failed completely when any unknown
field had a list value (e.g. Owner: [Luca], Cadence: [Weekly]) because
serde expected a string but got an array. This caused unwrap_or_default()
to return all-None, losing type/status/archived for ~7000+ notes.

Two fixes:
1. Filter parse_frontmatter input to only known keys, preventing unknown
   fields from causing deserialization failures
2. Change Owner and Cadence to StringOrList to handle both formats
2026-03-16 17:12:58 +01:00
lucaronin
a12ad57699 fix: flat vault type resolution — remove type/ prefix from links and protected folders
- Type relationship links: [[type/essay]] → [[essay]] (matches flat vault structure)
- PROTECTED_FOLDERS / KEEP_FOLDERS: only attachments, _themes, assets
- TypeSelector navigation: type/slug → slug
- Updated all 14 affected test files
- All 612 Rust tests + 2151 frontend tests pass
2026-03-16 16:19:24 +01:00
lucaronin
90a3ff8194 refactor: flatten vault structure — simplify migration API and flatten demo vault
- Simplify flatten_vault API to return usize instead of MigrationResult struct
- Add KEEP_FOLDERS: attachments/ and _themes/ alongside type/, config/, theme/
- Use HashSet for collision tracking in unique_filename
- Update wikilinks from path-based [[folder/slug]] to title-based [[slug]]
- Clean up empty directories after flattening
- Flatten demo-vault-v2: move all notes from type-based subfolders to root
- Update smoke tests for flat vault structure
- Remove migrate_to_flat_vault from repair_vault (one-time migration only)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 23:40:47 +01:00
lucaronin
b0252118a8 test: add Playwright smoke test for exact-match search ranking
Verifies that searching "Writing" in Quick Open shows the exact title
match first, followed by prefix matches. Also adds Refactoring test
entries to mock data and demo vault.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 22:15:08 +01:00
lucaronin
d7c210222c fix: exclude .laputa-cache.json and settings.json from vault git tracking
These files are machine-specific and should never be committed or cause
conflicts when syncing vaults across devices.

Changes:
- init_repo() now writes .gitignore with .laputa-cache.json and
  .laputa/settings.json excluded before the first commit
- .DS_Store and common editor artifacts also excluded
- openConflictFileRef falls back to openLocalFile() for non-note files
  so 'Open in editor' works for .json conflict files (opens in system
  default app, e.g. TextEdit/VS Code)
- Removed stale git.rs (replaced by git/mod.rs from refactor)
- 2 new Rust tests for .gitignore creation behavior
2026-03-06 15:22:48 +01:00
lucaronin
059990fce4 fix: remove vault.rs accidentally restored by cherry-pick
The save-regression cherry-pick (4b5812a) re-introduced the pre-refactor
vault.rs alongside vault/mod.rs, causing E0761 (ambiguous module) on CI.

vault/mod.rs (from PR #21 refactor-vault-rs) is the correct implementation
and already exports all needed functions (save_note_content, get_note_content,
purge_trash, etc.). Removing the duplicate vault.rs resolves the CI failure.
2026-02-24 00:33:20 +01:00
lucaronin
08bcab17c0 feat: leaner note creation — immediate Untitled note, no dialog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 11:38:03 +01:00
lucaronin
09609eff55 feat: trash notes — sidebar filter, breadcrumb buttons, cmd+del shortcut, demo vault data 2026-02-21 18:34:40 +01:00
lucaronin
3764bbd14b feat: add trashed notes to demo vault
Added 3 trashed notes with trashed_at dates in frontmatter:
- note-old-meeting-notes.md (trashed 2026-02-10)
- note-deprecated-workflow.md (trashed 2026-01-15)
- experiment-failed-podcast.md (trashed 2026-02-05)

These provide realistic test data for the trash feature in the demo vault.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 17:34:35 +01:00
lucaronin
8573e9b35d content: add type documents to demo-vault-v2 (mirrors production vault) 2026-02-21 16:50:58 +01:00
lucaronin
b3e7854b90 content: enrich event notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:00:17 +01:00
lucaronin
bf7d5aac32 content: enrich task notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:00:12 +01:00
lucaronin
c75da21e6a content: enrich target notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:00:12 +01:00
lucaronin
5af3171e99 content: enrich month notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:00:06 +01:00
lucaronin
1fa34fe0ff content: enrich year notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:00:05 +01:00
lucaronin
b27800fd92 content: enrich quarter notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 12:00:05 +01:00
lucaronin
3bbf4dd15d content: enrich project notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:59:59 +01:00
lucaronin
6e5c87f321 content: enrich person notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:58:55 +01:00
lucaronin
2dfc69f2e6 content: enrich procedure notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:58:54 +01:00
lucaronin
bd7658025c content: enrich note (book) notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:58:53 +01:00
lucaronin
2ae9709b4b content: enrich topic notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:53:39 +01:00
lucaronin
06ff610bad content: enrich responsibility notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:53:39 +01:00
lucaronin
0140ba6613 content: enrich evergreen notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:53:39 +01:00
lucaronin
7e2b981a8b content: enrich measure notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:52:07 +01:00
lucaronin
1216a19a65 content: enrich goal notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:52:07 +01:00
lucaronin
4342a96a70 content: enrich experiment notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:52:02 +01:00
lucaronin
ce701372f1 content: enrich area notes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 11:42:26 +01:00
lucaronin
b1aa087c5e feat: add generated demo-vault-v2 with 1037 synthetic notes (2 years, Luca/Refactoring persona) 2026-02-20 10:21:34 +01:00