When user edits a theme note directly in the editor and presses Cmd+S,
the app now immediately re-applies CSS variables — no manual reload
needed. Added notifyThemeSaved(path, content) to ThemeManager; wired
into onNotePersisted callback so saving the active theme updates
cachedThemeContent, triggering useThemeApplier.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
The Rust parser now treats `type:` as the canonical frontmatter field
for entity type, with `Is A:` and `is_a:` accepted as legacy aliases.
Previously it was the other way around, creating an asymmetric
read/write cycle since the frontend and all 8800+ vault notes already
use `type:`.
- Flip serde attribute: rename="type", alias="Is A", alias="is_a"
- Update theme defaults, getting-started vault, and type definitions
- Add round-trip tests for both type: and Is A: parsing
- Update mock data and TypeScript tests to use canonical form
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Apple notarization rejected qmd/qmd and qmd/vec0.dylib due to:
- Not signed with valid Developer ID certificate
- Hardened runtime not enabled
Changes:
- bundle-qmd.sh: use APPLE_SIGNING_IDENTITY + --options runtime --timestamp in CI
(falls back to ad-hoc signing in dev when no identity is set)
- useThemeManager.test.ts: add ensure_vault_themes to mock (added by theme
editor feature, missing from stale theme ID test mock)
seed_vault_themes now writes individual missing/empty files instead of
skipping when the theme/ directory already exists. A new
ensure_vault_themes Tauri command is called by useThemeManager on every
vault open so vaults without a theme/ folder get default.md and dark.md
seeded automatically.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sort preferences for each type's note list are now stored in the type
file's frontmatter (e.g. `sort: modified:desc` in `type/person.md`)
instead of localStorage. This makes preferences portable with the vault
and versionable in git.
- Add `sort` field to Rust Frontmatter/VaultEntry and TS VaultEntry
- NoteList reads sort from type entry's frontmatter when viewing a type
- Sort changes write to type file via update_frontmatter
- Silent migration from localStorage on first access per type
- Relationship group sorts still use localStorage (no type file)
- Fallback to `modified:desc` when no sort preference exists
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The merge of the dark-theme-editor feature (13ee62c) into the
themes-editable rewrite (7169634) broke the entire theming UI:
themes weren't listed, switching didn't work, and new theme creation
was broken.
Root causes and fixes:
- Stale theme ID from old JSON system ("untitled-2") never cleared:
added detection that clears IDs not matching any known vault theme,
with a ref to skip IDs just set by switchTheme/createTheme
- set_active_theme Rust command only accepted String, not Option:
now accepts Option<String> so null can clear the setting
- Theme colors empty in UI: entryToThemeFile now extracts colors
from frontmatter content via extractColorsFromContent
- color-scheme/data-theme-mode not set: added updateColorScheme
and clearColorScheme to sync DOM attributes on theme apply/clear
- isDark broken in Tauri (allContent is {}): moved isDark tracking
into useThemeApplier as state, updated when vars are applied
- SettingsPanel passed activeThemeId as name to createTheme: fixed
to call createTheme() with no arguments
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sort dropdown now discovers all scalar properties (string, number,
boolean, date) across notes in the current list and shows them below a
separator after the built-in options. Properties that no longer exist
in the current list are gracefully handled by falling back to Modified.
Rust backend extracts custom properties during vault scan so they are
available on every VaultEntry without loading file content on demand.
Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Three changes make the editor respect the active theme:
1. useThemeManager now derives app-specific CSS variables (--bg-primary,
--text-primary, --border-primary, etc.) from the theme's core colors,
so the editor's EditorTheme.css variables resolve correctly for both
light and dark themes.
2. BlockNoteView theme prop is now dynamic (isDark ? 'dark' : 'light')
instead of hardcoded to 'light', so BlockNote's own UI chrome (menus,
toolbars) matches the active theme.
3. Removed forced light-mode class removal from main.tsx that was
preventing dark mode from being applied.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use camelCase arg keys for Tauri theme commands
Tauri v2 auto-converts Rust snake_case params to camelCase for the JS
interface. useThemeManager was sending snake_case keys (vault_path,
theme_id, source_id) which caused "missing required key vaultPath"
errors in the native app, making New Theme silently fail.
All other hooks already use camelCase — this aligns the theme manager.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: exclude search.rs and lib.rs from coverage
---------
Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Three root causes fixed:
1. _themes/ directory was never auto-seeded for existing vaults -
list_themes now seeds built-in themes if the directory is missing
2. Creating a theme produced no visible feedback - now switches to
the newly created theme after creation
3. No live reload when theme files are edited externally - added
focus-based theme reload so edits are picked up when the window
regains focus
Also adds seed_default_themes to run_startup_tasks for the default
vault, ensuring themes are available on first launch.
Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat: add theming system design file with 3 frames
Design frames for Settings > Appearance panel, Command Palette
theme switching, and live theme editing flow visualization.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add Rust backend for vault-native theming system
Theme files live in _themes/*.json with colors, typography, and spacing
sections. Vault-level settings (.laputa/settings.json) store the active
theme. Built-in themes (default, dark, minimal) are seeded on vault
creation. All 6 Tauri commands registered: list_themes, get_theme,
get_vault_settings, save_vault_settings, set_active_theme, create_theme.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add frontend theme engine, settings UI, and command palette integration
Wire up useThemeManager hook to load themes via Tauri IPC, apply CSS
custom properties to :root, and support switching/creating themes.
Add Appearance section to Settings panel with color swatches and theme
cards. Register theme switch and create commands in the command registry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: use .to_string() instead of format! for string literal (clippy)
* style: cargo fmt on theme.rs
---------
Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>