Commit Graph

346 Commits

Author SHA1 Message Date
Luca Rossi
ac4db43fd5 perf: speed up Cmd+N note creation from ~150ms to ~16ms (#81)
* fix: speed up Cmd+N note creation from ~150ms to ~16ms

Root cause: the editor focus used a fixed 150ms setTimeout after note
creation, even when the BlockNote editor was already mounted. The
optimistic UI (state updates, tab opening) was already synchronous,
but the focus delay dominated perceived latency.

Changes:
- Editor focus now uses requestAnimationFrame when editor is mounted
  (~16ms on 60Hz), falling back to 80ms timeout for first-mount only
- Rust save_note_content creates parent directories automatically,
  preventing optimistic-UI revert when creating notes in new folders
- Added perf timing markers (console.debug) to measure creation→focus

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

* ci: retrigger after disk space cleanup

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 23:03:38 +00:00
lucaronin
0d6f83d36c feat: remove native titlebar, implement custom drag regions
- titleBarStyle: Overlay + hiddenTitle: true — removes native title bar,
  traffic lights float in sidebar area
- Add core:window:allow-start-dragging capability
- Add useDragRegion hook using startDragging() API (more reliable than
  data-tauri-drag-region with Overlay style)
- Apply drag regions: SidebarTitleBar, NoteList header, TabBar empty zone,
  Inspector header
- Increase header heights 45→52px to give traffic lights breathing room
- Open devtools automatically in debug builds
2026-02-25 21:43:16 +01:00
Luca Rossi
a6d8cc2eb8 feat: unified search panel — progressive keyword+semantic results (#80)
* feat: unify search panel — remove keyword/semantic toggle, progressive results

Replace separate keyword/semantic mode toggle with a unified search that
streams results progressively: keyword results appear first (<500ms),
then hybrid results augment the list (~1-2s). Loading spinner shows in
the input field while semantic search runs. Stale requests are discarded
via generation counter for safe rapid typing.

- Extract search logic into useUnifiedSearch hook (code health 9.26+)
- 300ms debounce, 5s timeout on hybrid, graceful fallback on errors
- 15 tests covering progressive search, spinner, stale results, failures

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

* docs: add design wireframes for unified search panel

Two frames showing the search panel states:
- "keyword results loaded, semantic loading" (with spinner)
- "all results loaded" (no spinner, more results including semantic)

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

* chore: coverage artifacts

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 20:35:30 +00:00
lucaronin
8b8cfee9e0 fix: add missing outgoingLinks field to person mock entries 2026-02-25 20:31:55 +01:00
Luca Rossi
27f0adc104 feat: populate macOS menu bar with native menus (File, Edit, View, Window) (#77)
* feat: populate macOS menu bar with File, Edit, View, Window menus

Add complete native macOS menu structure with all app actions:
- Laputa menu: About, Settings (Cmd+,), Hide/Quit
- File: New Note (Cmd+N), Quick Open (Cmd+P), Save (Cmd+S), Close Tab (Cmd+W)
- Edit: standard Undo/Redo/Cut/Copy/Paste/Select All
- View: Editor Only (Cmd+1), Editor+Notes (Cmd+2), All Panels (Cmd+3),
  Toggle Inspector, Command Palette (Cmd+K)
- Window: Minimize, Maximize, Close Window

All accelerators registered via Tauri menu API. Menu events dispatched
to frontend via useMenuEvents hook. Save/Close Tab items dynamically
disabled when no note tab is active.

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

* fix: wrap Enter selection assertion in waitFor for effect re-registration

* fix: resolve rebase conflict markers in menu.rs

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 19:05:24 +00:00
Luca Rossi
98f0e68e38 feat: back/forward navigation between opened notes (#75)
* feat: add useNavigationHistory hook for browser-style back/forward

Pure state management hook that tracks a navigation stack of note paths
with cursor-based back/forward traversal. Handles edge cases: duplicate
pushes (no-op), forward stack cleared on new push, invalid path skipping,
and path removal when tabs close.

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

* feat: integrate back/forward navigation into UI and keyboard shortcuts

- Add Back/Forward arrow buttons to TabBar (left of tabs)
- Wire useNavigationHistory through App → Editor → TabBar
- Add Cmd+[ and Cmd+] keyboard shortcuts via useAppKeyboard
- Register Go Back/Go Forward in command palette
- History tracks active tab changes, skips closed tabs gracefully
- Navigation from history doesn't re-push to stack (ref guard)

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

* feat: add mouse button 3/4 and trackpad swipe for back/forward

- Mouse buttons 3 (back) and 4 (forward) trigger navigation
- macOS trackpad two-finger horizontal swipe triggers back/forward
  using accumulated wheel deltaX with a 120px threshold
- Debounced reset after 300ms of inactivity

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

* design: add back-forward-nav.pen with 3 state frames

Shows: default (both disabled), one note visited (back disabled),
two notes visited (back enabled). Matches tab bar button placement.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:39:12 +00:00
lucaronin
5f0de00427 fix: wrap Enter key assertion in waitFor to handle async state propagation in SearchPanel test 2026-02-25 19:32:14 +01:00
lucaronin
3a85d47393 fix: resolve conflict markers in InspectorPanels.tsx — take unified NoteSearchList approach 2026-02-25 19:02:29 +01:00
lucaronin
e473b41692 feat: unify note search into shared NoteSearchList + useNoteSearch
Extract a single NoteSearchList component and useNoteSearch hook that
all three note-search UIs now share: wiki-link autocomplete, relations
autocomplete, and Cmd+P quick open. All show note name + type badge
consistently, with identical keyboard navigation behavior.

- NoteSearchList: reusable result list with title + type badge
- useNoteSearch: fuzzy search + arrow-key navigation hook
- WikilinkSuggestionMenu: now wraps NoteSearchList
- QuickOpenPalette: uses useNoteSearch + NoteSearchList
- InlineAddNote: replaces <datalist> with proper search dropdown
- AddRelationshipForm: replaces <datalist> with NoteTargetInput
- InspectorPanels code health improved from 8.99 to 9.04

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 19:01:22 +01:00
Luca Rossi
462b920da1 fix: show type label for all notes in wiki-link autocomplete (#76)
* fix: show type label for all notes in wiki-link autocomplete

Notes with the default 'Note' type (isA: null) had noteType set to
undefined, hiding their type label. Now every note always shows its
type in the autocomplete dropdown.

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

* design: add wiki-autocomplete-type-fix wireframe

Shows the fixed autocomplete dropdown where every note displays its
type label, including default "Note" types in muted color.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:30:35 +01:00
Luca Rossi
48cf359eaa feat: relations autocomplete shows note type badges (matching wiki-link UX) (#74)
* feat: show note type in relations autocomplete dropdown

Replace HTML datalist in InlineAddNote and AddRelationshipForm with
custom NoteAutocomplete component that displays note types as colored
badges, matching the wiki-link autocomplete UX. Supports keyboard
navigation, scrollable results, and graceful truncation.

Also extract ref-group helpers to improve InspectorPanels code health
(8.99 → 9.38).

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

* design: add relations autocomplete dropdown wireframe

Shows the autocomplete dropdown with note type badges (Project, Topic,
Procedure, Person) matching the wiki-link autocomplete UX. Includes
edge case of note with no type badge.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:30:28 +01:00
Luca Rossi
05ac689c2f fix: allow standard text shortcuts in command palette input (#73)
* fix: allow standard text shortcuts in command palette input

Two root causes prevented macOS text shortcuts (Cmd+A, Cmd+Backspace, etc.)
from working in the command palette input:

1. The Tauri native menu only had a View submenu — no Edit menu. On macOS,
   app.set_menu() replaces the entire menu bar, so Cmd+A/C/V/X/Z accelerators
   were removed. Added standard Edit menu with predefined items.

2. useAppKeyboard globally intercepted Cmd+Backspace (mapped to trash note)
   even when a text input was focused. Added an isTextInputFocused guard so
   Cmd+Backspace/Delete fall through to native text editing in inputs.

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

* fix: close missing }) in useAppKeyboard.test.ts

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:30:20 +01:00
Luca Rossi
6e23fc2c62 fix: restore Cmd+1/2/3 layout shortcuts (regression from App.tsx refactor) (#71)
* fix: wire up view mode visibility flags to conditionally render panels

The useViewMode hook correctly computed sidebarVisible and noteListVisible,
but App.tsx only destructured setViewMode — the flags were never used.
Sidebar and note list were always rendered regardless of view mode.

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

* test: add regression tests for Cmd+1/2/3 layout switching

Verifies that keyboard shortcuts actually hide/show sidebar and note list
panels — prevents this regression from recurring.

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

* fix: clear localStorage between App tests to prevent state pollution

The Cmd+1 test persisted 'editor-only' to localStorage, causing subsequent
Cmd+2 and Cmd+3 tests to start with the sidebar hidden (unable to find
'All Notes' text). Clear the view-mode key in beforeEach.

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

* fix: reset localStorage mock between tests to prevent view mode state leaking

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:30:12 +01:00
lucaronin
2c8befab93 fix: make backlinks update reactively when wikilinks are added or removed
Backlinks previously relied on scanning allContent (raw markdown), which
was empty in Tauri mode until notes were explicitly saved. Now outgoing
wikilink targets are extracted during Rust vault scan and stored on
VaultEntry. The frontend useBacklinks hook uses this indexed data, and
outgoingLinks update in real-time on content change.

- Add extract_outgoing_links() in Rust parsing + outgoing_links field on VaultEntry
- Add extractOutgoingLinks() TypeScript utility for real-time updates
- Rewrite useBacklinks to use outgoingLinks instead of scanning raw content
- Add cache version invalidation to force rescan on format change
- Extract useEditorSaveWithLinks hook to keep App.tsx under code health threshold

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:07:04 +01:00
Luca Rossi
fa4905989a fix: remove double border-radius causing rounded corners below macOS title bar (#72)
* fix: remove border-radius from app-shell to eliminate rounded corners below title bar

macOS windows already clip content to the window's own rounded corners.
The CSS border-radius: 10px on .app-shell created a second, inner rounding
that was visible below the transparent title bar, causing a visual gap
between the macOS frame and app content. The inset box-shadow remains for
a clean 1px border.

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

* design: add window-frame-fix.pen showing target state

Shows the corrected window frame appearance with macOS traffic lights,
clean 1px border separator, and content extending edge-to-edge with
no inner rounded corners.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:40:38 +00:00
Luca Rossi
2903196da6 feat: full-text search with qmd backend and SearchPanel UI (Cmd+Shift+F) (#64)
* feat: add search backend (qmd CLI) and design file

- Add search.rs: qmd integration for keyword (BM25), semantic (vsearch),
  and hybrid search modes via CLI JSON output
- Register search_vault Tauri command in lib.rs
- Design file with 3 frames: empty, results, no-results states
- Fix pre-existing test failures: install @tauri-apps/plugin-opener,
  add mock in test setup

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

* feat: add SearchPanel UI with Cmd+Shift+F shortcut

- SearchPanel component: full-text search overlay with keyword/semantic
  mode toggle, debounced search (200ms), arrow key navigation, result
  count + elapsed time display, note type badges from vault entries
- Cmd+Shift+F shortcut registered in useAppKeyboard
- Mock search_vault handler in mock-tauri for browser dev mode
- SearchResult/SearchResponse types in types.ts
- Tests: 15 new tests for SearchPanel + 2 for keyboard shortcut
- scrollIntoView mock in test setup for jsdom compatibility

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

* fix: correct SearchPanel imports for Tauri/browser dual-mode

Use invoke from @tauri-apps/api/core and mockInvoke from mock-tauri
with a searchCall wrapper, fixing the TypeScript build error.

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

* fix: make test_detect_collection_fallback robust when qmd not installed

* fix: reset localStorage between App tests to prevent view mode state leak

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:09:50 +00:00
lucaronin
6b0ee4bf12 test: add tests for @mention autocomplete
- 8 unit tests for filterPersonMentions utility
- 6 integration tests for @ trigger in Editor component
- Verifies Person-only filtering, wikilink insertion, type badges

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:31:45 +01:00
lucaronin
4fd1d97ac1 feat: add @mention autocomplete for Person entries
- Type @ in editor to trigger person-specific autocomplete
- Filters vault entries to show only Person type notes
- Inserts standard [[Person Name]] wikilink on selection
- Lower query threshold (1 char vs 2) since person list is smaller
- Add 3 more Person entries to mock data for testing
- Reuses existing WikilinkSuggestionMenu component

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 16:31:45 +01:00
Luca Rossi
2f7689599b feat: add optimistic error recovery for note creation (#69)
Note creation was already optimistic (UI updates before disk write) but
errors were silently swallowed. Now if the disk write fails, the
optimistic entry is reverted (tab closed, entry removed) and the user
sees an error toast. Each note creation is independent, so one failure
in rapid Cmd+N presses doesn't affect the others.

- Add removeEntry to useVaultLoader for reverting optimistic adds
- Refactor persistNewNote to return a Promise for error handling
- Extract navigateWikilink, persistOptimistic, createAndPersist,
  and runFrontmatterAndApply helpers to reduce hook complexity
- Add tests for error recovery: single note, type, success path,
  and rapid creation with partial failure
- Code health: 8.93→9.01 (CC fixed: 10→7, primitive obsession improved)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 15:11:59 +00:00
Luca Rossi
ca9ede51d5 fix: relation chips now show type color instead of default blue (#68)
* fix: relation chips now display correct type color instead of default blue

Root cause: resolveRef matched entries by path/filename only, while
wiki-links used findEntryByTarget (title, filename, aliases). When a
wikilink target used the note title (differing from filename), resolveRef
failed → null type → default blue.

Changes:
- resolveRef now calls findEntryByTarget first (title/alias match)
- Default color for typeless notes changed from blue to neutral grey
- TypeSelector passes custom color key from Type entries
- DynamicPropertiesPanel refactored to reduce cyclomatic complexity

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

* design: add before/after visual for relations type color fix

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

* docs: add task completion summary

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 14:02:33 +00:00
Luca Rossi
f84ebbe662 refactor: split mock-tauri.ts into focused modules (8.81 → 10.0) (#65)
* refactor: split mock-tauri.ts into focused modules

The monolithic mock-tauri.ts (1927 lines, Code Health 8.8) is now split
into 5 cohesive modules under src/mock-tauri/:

- index.ts (barrel, isTauri, simplified mockInvoke) — 10.0
- mock-content.ts (markdown test data) — 10.0
- mock-entries.ts (VaultEntry[] + bulk generator) — 10.0
- mock-handlers.ts (command handlers + state) — 9.68
- vault-api.ts (vault API detection + proxy) — 10.0

Key improvements:
- mockInvoke complexity reduced from cc=17 to trivial (vault API
  extracted to tryVaultApi, conditional routing via data-driven map)
- save_settings complexity reduced via trimOrNull helper
- All 726 tests pass unchanged, coverage remains above 70%
- Public API surface is identical (no import changes needed)

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

* style: cargo fmt

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:12:23 +00:00
Luca Rossi
e48ac6a828 refactor: improve code health in github.rs, mock-tauri.ts, lib.rs (#63)
* refactor: reduce code duplication and assertion blocks in github.rs

Extract shared mock helpers (mock_json, mock_poll, mock_user, mock_list_repos,
mock_create_repo, mock_device_start) to eliminate repeated server setup.
Use PartialEq-based struct comparison for assertion blocks. Remove
redundant CreateRepoResponse struct in favor of GithubRepo.

Code health: 6.49 → 8.54

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

* refactor: reduce complexity in mock-tauri.ts mockInvoke and save_settings

Replace nested if-chains in mockInvoke with data-driven VAULT_API_ROUTES
lookup table and extracted tryVaultApi function. Extract trimOrNull helper
to reduce cyclomatic complexity in save_settings.

Code health: 8.81 → 9.38

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

* refactor: extract startup tasks from run() in lib.rs

Move vault purge and migration logic into run_startup_tasks() with a
shared log_startup_result helper. Eliminates Bumpy Road and Large Method
code smells from the main run() function.

Code health: 9.14 → 9.68

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:31:25 +01:00
Luca Rossi
558f50e610 refactor: extract hooks from App.tsx to improve code health (#62)
Extract vault management (useVaultSwitcher), git history loading
(useGitHistory), dialog state (useDialogs), and keyboard/command
setup (useAppCommands) into dedicated hooks. App.tsx code health
improves from 8.95 to 10.0 — all extracted hooks also score 10.0.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:31:19 +01:00
Luca Rossi
a8692d021e Merge pull request #61 from refactoringhq/task/command-palette
feat: command palette (Cmd+K) — quick actions and navigation
2026-02-25 00:05:11 +01:00
Luca Rossi
c4be44ffca Merge pull request #60 from refactoringhq/task/autocomplete-flat-list
feat: flat list autocomplete with type badge
2026-02-25 00:05:07 +01:00
Luca Rossi
160db39763 Merge pull request #59 from refactoringhq/task/word-count-title-fix
fix: exclude title heading and wikilinks from word count
2026-02-25 00:03:55 +01:00
lucaronin
af0492b82e fix: exclude title heading and wikilinks from word count
countWords() was including the title line (# Heading) in the count,
inflating it by ~2-3 words. Now strips the first H1 heading and
[[wikilinks]] before counting, so only body prose is tallied.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:03:44 +01:00
lucaronin
0e144b5b40 fix: pass modifiedFiles to NoteList so Changes view filters correctly
App.tsx passed getNoteStatus but not modifiedFiles to NoteList.
The Changes view uses modifiedPathSet (derived from modifiedFiles) to
filter entries, so it was always empty — showing "no pending changes"
even with modifications present.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:03:40 +01:00
Luca Rossi
9109d6dac2 Merge pull request #58 from refactoringhq/task/nuova-nota-lenta
fix: debounce Cmd+N to prevent slow note creation on rapid keystrokes
2026-02-25 00:03:00 +01:00
Luca Rossi
27b58a4a5c Merge pull request #57 from refactoringhq/task/properties-indent
fix: align Type row padding with other property rows in Properties panel
2026-02-25 00:02:56 +01:00
Luca Rossi
812c35631c Merge pull request #56 from refactoringhq/task/url-text-size
fix: apply text-[12px] to URL values in Properties panel
2026-02-25 00:02:53 +01:00
lucaronin
3f79d1631b fix: use Tauri opener plugin for URL property clicks
Replace window.open() with Tauri's opener plugin (openUrl) so that
clicking a URL property in the Properties panel opens the system
browser instead of failing silently or triggering edit mode.

- Install @tauri-apps/plugin-opener (npm + Cargo + capabilities)
- Add openExternalUrl() utility with Tauri/browser fallback
- Add stopPropagation to prevent accidental edit mode activation
- Add double-click guard (500ms debounce via ref)
- Update tests to mock openExternalUrl instead of window.open
- Add explicit test that URL click does not trigger onStartEdit

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:02:09 +01:00
lucaronin
c33495aa82 fix: debounce Cmd+N to prevent slow note creation on rapid keystrokes
- Add deduplication to handleCreateNoteImmediate to prevent rapid calls from creating multiple notes
- Use pending set to track in-flight create operations
- Tests: rapid triple-call dedup, default type, custom type
- Refs: useNoteActions, useTabManagement, useVaultLoader updated
2026-02-25 00:01:52 +01:00
lucaronin
e9e50a7356 fix: align Type row padding with other property rows in Properties panel
ReadOnlyType and TypeSelector containers were missing px-1.5, causing the
Type label to sit flush-left while all other property/info rows were
indented 6px.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:01:51 +01:00
lucaronin
a95625e2bb fix: apply text-[12px] to URL values in Properties panel
The PR #43 text-size reduction missed the UrlValue component — both its
display span and edit input kept the old larger size. Align them with
the 12px used by EditableValue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:01:50 +01:00
lucaronin
154aab5098 test: add command palette and fuzzy match tests
Tests for CommandPalette component (rendering, filtering, keyboard
navigation, grouped results, shortcuts display), useCommandRegistry
hook (contextual actions, archive toggle, git availability), fuzzyMatch
utility, and Cmd+K shortcut.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:43:58 +01:00
lucaronin
765f26c3e5 feat: replace grouped autocomplete with flat list and type badge
Switch wiki-link autocomplete from BlockNote's default grouped suggestion
menu to a custom flat list sorted by relevance. Each item shows the note
type (with its accent color) discretely on the right side. Reduce
MAX_RESULTS from 20 to 10 for a cleaner, more focused list.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:42:09 +01:00
lucaronin
5d24fdaef3 feat: add command palette with Cmd+K shortcut
Raycast-style command palette with fuzzy search across all app actions.
Groups commands by category (Navigation, Note, Git, View, Settings)
with keyboard shortcuts displayed inline. Contextual actions (trash,
archive, save) are only available when a note is open.

Extracts fuzzyMatch into shared utility for reuse.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:41:54 +01:00
lucaronin
23afa89e2a fix: derive green pallino from git status instead of in-memory tracker
The green dot (new note indicator) was disappearing after Cmd+S because
markSaved cleared it from the in-memory newPaths set. Now resolveNoteStatus
derives "new" status from git status (untracked/added files) so the green
dot persists until the note is committed. The in-memory tracker is only
used for the brief window between note creation and first save to disk.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:15:37 +01:00
Luca Rossi
7ed9e30299 fix: deduplicate autocomplete suggestions and disambiguate same-title notes (#54)
BlockNote's SuggestionMenu uses item.title as React key, causing duplicate
rendering and broken arrow-key navigation when multiple notes share the
same title. Fix by:
- Adding path-based deduplication to filter out duplicate entries
- Disambiguating same-title notes with parent folder name (e.g. "Standup (work)")
- Deduplicating aliases within each item (filename vs entry.aliases overlap)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:12:35 +00:00
Luca Rossi
4b4b64d845 fix: use type-defined colors and icons in Relations/Backlinks/ReferencedBy panels (#49)
The inspector panels were calling getTypeColor/getTypeLightColor/getTypeIcon
without passing the custom color/icon overrides from the Type entry, causing
all notes to render with the default blue color regardless of their type.

Now builds a typeEntryMap in Inspector and threads it through to all panels,
matching how NoteList correctly resolves type colors and icons.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 21:30:15 +00:00
lucaronin
048391adcc fix: restore modifiedFiles/changes-filter support alongside getNoteStatus
The previous commit replaced modifiedFiles with getNoteStatus, but main
had tests for the 'changes filter' view that depend on modifiedFiles.

This commit restores full backward compat:
- Both modifiedFiles and getNoteStatus props are accepted
- getNoteStatus takes precedence when provided (used by App.tsx)
- modifiedFiles automatically derives status='modified' when getNoteStatus
  is not provided (used by tests and legacy callers)
- isChangesView / 'Changes' header / changes filter all restored

NoteItem continues to use noteStatus prop (new | modified | clean),
so both green (new) and orange (modified) dots work correctly.
2026-02-24 17:02:22 +01:00
lucaronin
4f03751da5 feat: distinguish new notes (green dot) from modified notes (orange dot)
New notes created in-session show a green dot; existing notes with
uncommitted git changes show an orange dot. Saving a new note clears
the green dot; git commit clears the orange dot.

Introduces NoteStatus type ('new' | 'modified' | 'clean'), extracts
useNewNoteTracker hook and resolveNoteStatus pure function, and adds
onNoteSaved callback to useEditorSave for clearing new-note tracking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 17:02:22 +01:00
Luca Rossi
2519df7425 Merge pull request #47 from refactoringhq/task/icon-picker-sezioni
feat: expand icon picker to 290 Phosphor icons with search and scroll
2026-02-24 16:00:42 +01:00
Luca Rossi
95f11ad2a2 Merge pull request #45 from refactoringhq/task/vista-changes
feat: Changes view — clicking N pending shows modified notes
2026-02-24 16:00:37 +01:00
lucaronin
4c6bc91971 feat: expand icon picker with ~290 icons, search, and scrollable grid
- Extract icon registry to src/utils/iconRegistry.ts with 290 curated Phosphor icons
- Add real-time search field that filters icons by name substring
- Show "No icons found" empty state when search yields no results
- Scrollable icon grid (240px max height) for browsing all icons
- Add teal and pink accent colors to the palette (8 total)
- Widen popover from 264px to 280px for better search field fit
- Update tests: search filtering, empty state, icon count validation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:36:11 +01:00
lucaronin
68b5b5fed3 test: add tests for Changes view + design wireframes
- NoteList: 4 tests for changes filter (shows only modified, header,
  empty state, real-time update on rerender)
- StatusBar: 2 tests for onClickPending callback + accessibility
- Sidebar: 3 tests for Changes nav item visibility + click handler
- design/vista-changes.pen: 3 frames (pending notes, empty state,
  real-time update)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:32:23 +01:00
lucaronin
7b02dc1f9d feat: add Changes view for pending modifications
Clicking "N pending" in the status bar or the "Changes" nav item in
the sidebar shows a filtered list of notes with uncommitted changes.
The view updates in real-time as files are saved or committed.

- Add 'changes' filter to SidebarSelection type
- Make StatusBar "N pending" indicator clickable
- Add "Changes" NavItem in sidebar (visible when modifiedCount > 0)
- Filter NoteList by modifiedFiles paths for changes view
- Show "No pending changes" empty state

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:32:23 +01:00
lucaronin
236ac1c007 fix: use consistent 12px text size for property values in Properties panel
Property values (dates, URLs, text) were inheriting the 14px root font
size instead of using the 12px size already applied in InfoRow and other
inspector sections. Standardize all property value and editing input
text to 12px for visual consistency.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:31:40 +01:00
Luca Rossi
e55e4b6fd0 Merge pull request #42 from refactoringhq/task/change-note-type
feat: editable type picker in Properties panel
2026-02-24 15:00:50 +01:00