Commit Graph

711 Commits

Author SHA1 Message Date
Test
1ff342ae60 design: merge tags-property-type + zoom-shortcuts frames into ui-design.pen 2026-02-28 12:44:18 +01:00
Test
da55318979 fix: useRef type for debounce timer (TS 5.9 compatibility) 2026-02-28 12:43:18 +01:00
Luca Rossi
384cffec48 feat: zoom in/out keyboard shortcuts (Cmd+=, Cmd+-, Cmd+0) (#134)
* feat: zoom in/out keyboard shortcuts (Cmd+=, Cmd+-, Cmd+0)

Add zoom control with keyboard shortcuts, native menu items, command
palette integration, and StatusBar zoom indicator with localStorage
persistence (80-150%, 10% step).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: add zoom-shortcuts design file with StatusBar zoom indicator

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* design: zoom-shortcuts — StatusBar zoom indicator + Command Palette entries

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 12:41:57 +01:00
Test
c0ce5064d8 fix: use number | undefined for debounce timer ref (TS strict compat) 2026-02-28 12:38:23 +01:00
Luca Rossi
e9c869075a feat: add tags (multi-select) property type (#133)
* design: add tags property type wireframes

Three frames showing the Tags multi-select property:
- Display state: colored pills with X to remove, + button to add
- Input state: dropdown with vault suggestions, checkmarks for selected
- Color picker: per-tag color selection row with accent palette

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add tags (multi-select) property type

Adds a new 'tags' display mode for array-valued frontmatter properties.
Includes TagPill components with deterministic color assignment,
inline tag editing with autocomplete from vault-wide values, and
automatic detection for common tag key patterns (tags, keywords,
categories, labels).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: SearchPanel test — fire ArrowDown on document not window

---------

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 12:34:01 +01:00
Test
f881c13b62 design: merge relationship-x-cosmetic frames into ui-design.pen 2026-02-28 12:09:35 +01:00
Luca Rossi
92c7b003d9 fix: useRef type for debounce timer (pre-existing build error on main) (#132)
* design: relationship-x-cosmetic wireframes

* fix: relationship X button appears inline inside pill on hover

X button now renders as a flex child inside the pill (next to the type icon)
instead of being absolutely positioned outside the pill boundary.

- Pill uses inset ring border on hover when bgColor is set
- X appears inline with type icon via flex layout
- Type icon rendered at 50% opacity per design spec
- Updated test selector: .group/link is now the button element itself

* fix: useRef type for debounce timer (pre-existing build error on main)

---------

Co-authored-by: Test <test@test.com>
2026-02-28 12:07:35 +01:00
Test
cafdc84260 fix: remove invalid notarization field from tauri.conf.json (Tauri v2 uses env vars) 2026-02-28 12:03:02 +01:00
Test
d87c80ece4 ci: fix notarization — use Tauri v2 env vars (APPLE_CERTIFICATE + APPLE_SIGNING_IDENTITY) 2026-02-28 11:49:51 +01:00
Test
a67e0bd221 ci: trigger release with notarization 2026-02-28 11:32:17 +01:00
Test
ed8a51aa8f ci: add Apple notarization to release workflow (awaiting certificate) 2026-02-28 11:29:57 +01:00
Test
fb763f5338 feat: sync note title with H1 heading (predictive title)
When the editor's first block is an H1 heading, the note title
automatically stays in sync. Changes are debounced at 500ms.
Manual rename via tab breaks the sync until the tab is switched.

- Show H1 in editor (stop stripping on load, stop reconstructing on save)
- New useHeadingTitleSync hook tracks sync state and debounces title updates
- handleEditorChange keeps frontmatter title: in sync with H1
- Fast path for H1-only content preserves instant new-note interactivity

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:59:05 +01:00
Test
a18a19166b fix: property panel responsive layout + status dropdown click regression
- StatusDropdown: change anchor element from <div> to <span> to fix
  invalid HTML nesting inside <span> parents. Browsers auto-correct
  <div> inside <span> by ripping the element out, breaking
  anchorRef.parentElement positioning. JSDOM doesn't auto-correct,
  so tests passed but the real app's dropdown failed to position.

- StatusValue: revert shrink-0 back to min-w-0 so the status pill
  can truncate in narrow panels instead of overflowing.

- PropertyRow: add min-w-0 and gap-2 for proper flex overflow,
  wrap property key in truncate span.

- AddPropertyForm: add flex-wrap, reduce input widths, set
  min-w-[60px] on value inputs for narrow panel support.

- InfoRow/TypeSelector/ReadOnlyType: add min-w-0 and gap-2.

- Tests: increase timeout for 3 Radix Select interaction tests
  that are slow in JSDOM.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:58:23 +01:00
Test
1efdbfb978 fix: properties panel bar height matches breadcrumb bar
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:56:14 +01:00
Test
233497cb5c fix: search results — type icon on left, type label aligned right
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:55:08 +01:00
Test
6ff3a1929a fix: reverse relationships — remove header, arrow prefix, dotted underline on hover
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:55:03 +01:00
Test
42b463e07a fix: type selector dropdown shows colored icons per type
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:54:37 +01:00
Test
a6b92d5248 fix: relationship item input height consistency + X button overlay on hover
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 10:54:09 +01:00
Test
8c574882e5 fix: tags X button appears on hover without expanding pill width
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.20260228.168
2026-02-28 10:50:34 +01:00
Test
bb0a5c5c98 fix: make new note editor immediately interactive
Extract heading-stripping logic into `extractEditorBody` — fixes a bug
where the regex failed to strip the title heading from newly created
notes (because `splitFrontmatter` left a leading newline that the
regex didn't account for).

Add a fast path in `doSwap` for empty body content: when the body is
empty (common case for new notes), skip the potentially-async
`tryParseMarkdownToBlocks` pipeline entirely and apply a single empty
paragraph block synchronously. This eliminates the multi-second delay
caused by BlockNote's async markdown parser initialization.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.20260228.167
2026-02-28 10:29:28 +01:00
Test
cd1246d43c fix: multiselect uses only Shift+click; add Cmd+Del/Cmd+E bulk actions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v0.20260227.166
2026-02-27 22:49:29 +01:00
Test
92c8dbd1bf fix: restore status dropdown click + color picker per status value
The positionDropdown callback ref ran during React's commit phase
before anchorRef was assigned (children refs commit before parents),
so the dropdown was never positioned and the invisible backdrop
stole all subsequent clicks. Switch to useLayoutEffect which runs
after all refs are set.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 22:49:01 +01:00
Test
4672fcb5c0 fix: add traffic light clearance to note list header when sidebar is collapsed
When the sidebar is hidden (editor-list view mode), the NoteList becomes
the leftmost panel and its header title overlaps with macOS traffic lights.
Add 80px left padding to the NoteList header when sidebarCollapsed is true,
matching the sidebar title bar's existing traffic light clearance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 22:43:19 +01:00
Test
d962cd9eae fix: update Tauri signing pubkey (new keypair, password stored securely) v0.20260227.163 2026-02-27 21:53:47 +01:00
Test
88a8035c45 fix: update Tauri signing pubkey to match new keypair (empty password) 2026-02-27 21:42:14 +01:00
Test
035bd7f630 fix: update Tauri signing pubkey (regenerated keypair with empty password) 2026-02-27 21:26:19 +01:00
Test
9ce890576b fix: use TAURI_KEY_PASSWORD secret for signing (was hardcoded empty string) 2026-02-27 21:14:42 +01:00
Test
f569750666 chore: add .claude-done for pencil-ui-design-light-mode verification
Verified all 115 frames in ui-design.pen render in light mode.
No remaining before-variants, no duplicates found.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 19:06:43 +01:00
Test
9cfa8a7ca2 design: add theme Light to 25 dark-mode frames, remove before variants 2026-02-27 19:06:38 +01:00
Test
918b204d3d design: fix search panel overlay layout positioning 2026-02-27 19:05:16 +01:00
Luca Rossi
177e593e90 fix: use portal-based positioning for property panel dropdowns (#130)
* fix: use portal-based positioning for property panel dropdowns

StatusDropdown and DisplayModeSelector used absolute positioning
within the Inspector's overflow-hidden container, causing dropdowns
to be clipped when the Properties panel is narrow (200-280px).

Both now render via createPortal into document.body with fixed
positioning calculated from the trigger element's bounding rect.
This matches the pattern used by existing Radix UI components
(Select, Popover) in the codebase.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* design: property dropdown narrow panel fix — before/after frames

---------

Co-authored-by: Laputa App <laputa@app.local>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 19:00:30 +01:00
Laputa App
959e4975e3 design: update new-note-creation.pen for unsaved state
Update tab indicator to blue dot (was green), add italic font
style to unsaved tab title, rename frame to match new behavior.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:23:28 +01:00
Laputa App
a2f1476b98 feat: in-memory unsaved state for new notes (Cmd+N)
New notes created via Cmd+N now stay in memory until the user
explicitly saves with Cmd+S. This eliminates the disk-write
blocking delay and lets the cursor appear instantly.

- Add 'unsaved' to NoteStatus; blue dot + italic title in tab bar
- useUnsavedTracker in useVaultLoader manages unsaved path set
- useNoteActions skips persist on create, cleans up on close
- useEditorSave accepts unsavedFallback for first-save scenario
- App.tsx wires tracking via contentChangeRef + clearUnsaved

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:23:28 +01:00
Laputa App
9d5c90f5c0 feat: replace search result snippet with metadata subtitle
Replace the first-line-of-content snippet in search results with
a metadata row showing: relative date, created date (when different
from modified), word count, and outgoing link count.

Uses the existing formatSearchSubtitle() helper. Entry lookup now
stores full VaultEntry for metadata access. Graceful degradation
when fields are missing/zero.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:06:49 +01:00
Laputa App
e91a7ae7f6 design: search results subtitle with metadata frames
Two frames showing the redesigned search result subtitle:
- Main view with metadata (date, word count, links) replacing snippet
- States catalog: all metadata, same dates, no links, empty, no date

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:03:41 +01:00
Laputa App
47e38ba6b0 chore: add src-tauri/target to .gitignore 2026-02-27 17:32:07 +01:00
Laputa App
cbb88b34b8 fix: remove accidental src-tauri/target symlink from repo
Was accidentally committed as a circular symlink in previous commit.
Cargo recreates this directory automatically on build.
2026-02-27 17:31:56 +01:00
Laputa App
52b1693f43 fix: property dropdowns adapt to narrow panel width
- Popover and Select components: add collisionPadding=8 as default
- TypeSelector and AddPropertyForm SelectContent: position=popper, side=left
- DateValue and AddDateInput PopoverContent: side=left
Dropdowns now flip direction when hitting viewport edge instead of clipping.
2026-02-27 16:58:10 +01:00
Luca Rossi
3d784ce740 fix: unify status dropdown and make color swatch visible (#128)
Bug 1: Replace plain-text Radix Select in AddStatusInput with the same
StatusDropdown component used for existing status properties. Both now
show colored pills, search, and custom status creation.

Bug 2: Add color swatch dot next to each status option in the dropdown.
Clicking it opens an inline palette of 8 accent colors that persist via
localStorage (leveraging existing setStatusColor infrastructure).

Refactor StatusDropdown to extract useStatusFiltering, useStatusKeyboard
hooks and VaultSection/SuggestedSection/CreateSection sub-components to
keep Code Health above 9.2 threshold.

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 16:53:31 +01:00
Luca Rossi
480d124a0e fix: multiselect range includes anchor note and prevents text selection (#127)
- selectRange() now includes the currently open note as the anchor
- Added setAnchor() to track which note is the selection start
- Added select-none to NoteList to prevent browser text selection on Shift+click

Co-authored-by: Test <test@test.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 16:53:18 +01:00
lucaronin
b15a4d143c fix: raise property type dropdown z-index above BlockNote editor
BlockNote uses z-index: 11000 for its toolbar/popover elements.
The Radix UI Select and Popover portals used z-50 (z-index: 50),
causing all inspector dropdowns (type selector, property type picker,
date pickers) to render behind the editor. Raised to z-[12000] to
match the existing StatusDropdown and DisplayModeSelector z-index.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 16:37:56 +01:00
lucaronin
baca6b1098 perf: optimize pre-push hook from ~12min to ~30s
- Add --no-clean to cargo llvm-cov for incremental builds (~5s vs ~8min)
- Skip Rust checks when no src-tauri/ files changed
- Merge redundant frontend test + coverage into single coverage step
- Reorder: fast lints (fmt, clippy) before slow coverage for quick feedback
- Add timing output and LAPUTA_FULL_COVERAGE=1 escape hatch

Expected: frontend-only push ~1 min, frontend+Rust ~2-3 min
v0.1.0
2026-02-27 15:53:05 +01:00
lucaronin
8a38dfc3c7 fix: deduplicate search results by path in useUnifiedSearch 2026-02-27 15:42:14 +01:00
lucaronin
464d143313 fix: apply 3 pending fixes directly to main
- fix: deduplicate search results by note path (was PR #116)
- fix: raise z-index on all overlays to appear above BlockNote editor (was PR #119)
- fix: repair corrupted design-full-layouts.pen (was PR #121)

PRs were blocked by merge conflicts after main advanced; applying directly.
2026-02-27 15:35:19 +01:00
lucaronin
990bcfc83a fix: remove unsupported --silent flag from vite build in pre-push hook 2026-02-27 15:29:51 +01:00
lucaronin
35c5e0f2c3 ci: replace remote CI with local pre-push hook
All checks now run locally via .husky/pre-push before any push.
This eliminates GitHub Actions queue, runner saturation, and
'waiting for status' blocks entirely.

Hook runs: tsc, Vite build, frontend tests, frontend coverage (≥70%),
Rust coverage (≥85%), Clippy, rustfmt, CodeScene (≥9.2).

Claude Code is explicitly forbidden from using --no-verify (documented
in CLAUDE.md). Branch protection required status checks removed.
Remote CI kept as non-blocking safety net only.
2026-02-27 15:29:51 +01:00
lucaronin
1e2ed97630 ci: trigger GitHub Actions run 2026-02-27 15:29:51 +01:00
Luca Rossi
49b8e1d817 feat: status color picker — assign persistent color per status value (#120)
Add color dot indicators to each status option in the dropdown. Clicking
the dot opens an inline palette of 8 accent colors (from the design system).
Color assignments persist in localStorage and override the built-in defaults.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-27 14:27:43 +00:00
Luca Rossi
a6140fe277 fix: revert notelist subtitle to show snippet instead of metadata (#118)
The metadata subtitle (date + word count) from #94 was only intended for
search results. Reverts NoteItem and PinnedCard to show first 2 lines of
note content with a date line underneath.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-27 15:27:38 +01:00
Luca Rossi
4474e635fd fix: unify type selector dropdown to match add-property style (#123)
The TypeSelector on existing properties used a colored pill with no
border, while the add-property form used a bordered muted-bg control.
Align both to the add-property style: 26px height, visible border,
muted background, 4px radius.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-02-27 15:27:30 +01:00