Commit Graph

570 Commits

Author SHA1 Message Date
lucaronin
8a08fb67a3 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
9bcc1776cc 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
576ce1f294 design: command-palette wireframes
Three frames: empty state with grouped actions, search results
with fuzzy filtering, and no-results state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:38:25 +01:00
Luca Rossi
9a5b37f602 Merge pull request #52 from refactoringhq/task/pallino-persistenza
fix: derive green pallino from git status instead of in-memory tracker
2026-02-24 23:29:01 +01:00
lucaronin
8b44ebbc22 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
3ea175eec5 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
2e2224865c Merge pull request #50 from refactoringhq/task/relations-colori
fix: use type-defined colors and icons in Relations/Backlinks/ReferencedBy panels
2026-02-24 22:43:06 +01:00
Luca Rossi
7e586eccb0 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
a7abcc21b3 fix: use type-defined colors and icons in Relations/Backlinks/ReferencedBy panels
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 22:15:41 +01:00
lucaronin
d65eba8096 docs: add current state snapshot to VISION.md 2026-02-24 19:13:22 +01:00
lucaronin
45a0098f5c docs: add product vision document 2026-02-24 18:58:13 +01:00
lucaronin
99535cc0da design: merge differenzia-pallino frames into ui-design.pen 2026-02-24 17:31:58 +01:00
Luca Rossi
31d8bfb843 Merge pull request #48 from refactoringhq/task/differenzia-pallino
feat: distinguish new notes (green dot) from modified notes (orange dot)
2026-02-24 17:13:58 +01:00
lucaronin
e7e4dccd3f 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
9a8b2d930a 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
lucaronin
bacd4e17a2 design: merge vista-changes frames into ui-design.pen 2026-02-24 16:01:41 +01:00
Luca Rossi
8276e4225d 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
6a63768892 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
Luca Rossi
49a4ba2491 Merge pull request #43 from refactoringhq/task/properties-text-size
fix: use consistent 12px text size for property values in Properties panel
2026-02-24 15:39:59 +01:00
lucaronin
e607859c5b design: icon-picker-sezioni wireframes (3 frames)
- Frame 1: Full grid view with 8 color swatches and scrollable icon grid
- Frame 2: Search filtered state (searching "book")
- Frame 3: Empty state (no matching icons)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:36:11 +01:00
lucaronin
b4201487ec 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
4c031bdb8b 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
45b48e654c 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
f90bb1f701 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
8a7fb09a46 Merge pull request #46 from refactoringhq/task/codescene-threshold
refactor: raise CodeScene code health threshold to 9.2
2026-02-24 15:16:38 +01:00
lucaronin
8911aad930 feat: raise CodeScene code health threshold to 9.2
The project currently scores ~9.33, so raising the CI gate from 8.45
to 9.2 prevents significant regressions while leaving headroom.
Updates both the CI workflow threshold and CLAUDE.md documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 15:06:24 +01:00
lucaronin
56ed81ccb0 design: merge url-property-click frames into ui-design.pen 2026-02-24 15:02:30 +01:00
Luca Rossi
d127ece50d 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
Luca Rossi
be4e3c72ae Merge pull request #44 from refactoringhq/task/url-property-click
feat: URL properties open in browser on click, underline on hover
2026-02-24 14:55:37 +01:00
lucaronin
7219c0799f feat: make URL properties clickable with hover underline
- Add UrlValue component: click opens in browser, pencil icon for edit
- URL detection via isUrlValue() (http/https URLs + bare domains)
- URL normalization: prepends https:// to bare domains
- Malformed URLs silently ignored (no open attempt)
- Long URLs truncated visually but full URL opens on click
- Edit mode via pencil icon or keyboard (Enter/Escape/blur)
- 22 new tests covering detection, normalization, and component behavior

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:46:18 +01:00
lucaronin
5d73655875 design: url-property-click wireframes (3 frames)
Default, hover (underline + pointer), and edit mode states
for URL properties in the Inspector panel.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:39:08 +01:00
lucaronin
8cbf30358d design: merge relations-edit frames into ui-design.pen 2026-02-24 14:33:05 +01:00
Luca Rossi
ab87c046c2 Merge pull request #41 from refactoringhq/task/relations-edit
feat: editable relations in Inspector panel
2026-02-24 14:08:44 +01:00
lucaronin
fe55f9253d design: relations-edit wireframes (3 frames) 2026-02-24 14:02:05 +01:00
lucaronin
5d833b4203 feat: replace read-only Type field with editable dropdown selector
The Type field in the Properties panel was read-only. Now it uses a
Radix Select dropdown that lists all vault types (entries where
isA === "Type"), plus a "None" option to clear the type. Wired to
the existing onUpdateProperty('type', ...) flow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 14:00:34 +01:00
lucaronin
1a87036087 feat: make relations editable with add/remove controls
Add remove (X) button on hover for each related note in a relationship
group, and inline add control with autocomplete to add new notes to
existing relations. Changes update frontmatter via the existing
update/delete property pipeline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 13:47:30 +01:00
lucaronin
2a9a3dd2f6 fix: remove .claude-done from tracking, add to .gitignore 2026-02-24 13:40:49 +01:00
Luca Rossi
323c8e3cc2 Merge pull request #40 from refactoringhq/task/window-frame-border
fix: add 1px inset border between macOS window frame and app content
2026-02-24 13:40:13 +01:00
lucaronin
ab3221dc13 docs: add design file placeholder for window-frame-border
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 13:32:15 +01:00
lucaronin
4612fe43e0 fix: add 1px inset border between macOS window frame and app content
The transparent titlebar window blended with the app content because
both shared the same background color. An inset box-shadow using the
existing --border-primary color creates a subtle separation. The 10px
border-radius matches the macOS window corner radius.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 13:32:03 +01:00
Luca Rossi
f0eb9e7f22 Merge pull request #38 from refactoringhq/task/wikilink-autocomplete
fix: require 2+ chars before showing wikilink autocomplete, limit to 20 results
2026-02-24 13:10:26 +01:00
lucaronin
7352d056bc Merge remote-tracking branch 'origin/main' into task/wikilink-autocomplete 2026-02-24 13:01:33 +01:00
Luca Rossi
ed26463231 Merge pull request #39 from refactoringhq/task/word-count-frontmatter
fix: exclude YAML frontmatter from word count
2026-02-24 12:52:33 +01:00
lucaronin
cdd33cf41f fix: exclude YAML frontmatter from word count in Inspector panel
The DynamicPropertiesPanel had a local countWords that used a regex
(/^---[\s\S]*?---/) which could match dashes inside frontmatter values,
leaving part of the frontmatter in the body and inflating the count.

Replace with the canonical countWords from utils/wikilinks.ts which uses
splitFrontmatter (line-based indexOf) and correctly finds the closing
delimiter on its own line.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 12:46:21 +01:00
lucaronin
c53b919151 fix: serialize env-var tests with mutex to prevent race in parallel CI 2026-02-24 12:46:19 +01:00
lucaronin
71e9ad364f fix: widen savePending type in useCommitFlow to accept Promise<boolean>
Pre-existing type mismatch where useEditorSave returns Promise<boolean>
but useCommitFlow expected Promise<void>. The return value is unused.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 12:46:19 +01:00
lucaronin
de5154e5f1 fix: require 2+ chars before showing wikilink autocomplete, limit to 20 results
The autocomplete menu for wiki-links was opening immediately on typing
'[[', processing all 9000+ vault entries and causing a visible freeze.

- Extract preFilterWikilinks utility with MIN_QUERY_LENGTH=2 gate
- Pre-filter entries with case-insensitive substring match before
  creating expensive onItemClick closures
- Cap results at MAX_RESULTS=20 after BlockNote's filterSuggestionItems
- Add comprehensive tests for the utility and Editor integration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 12:46:19 +01:00
Luca Rossi
c4f6de9f49 Merge pull request #37 from refactoringhq/task/rinomina-dirty-state
fix: refresh dirty state after rename so indicator reflects reality
2026-02-24 12:43:28 +01:00
lucaronin
8b708f2c81 fix: refresh dirty state after rename so indicator reflects reality
Two bugs caused stale dirty indicators after rename:
1. handleRenameTab didn't call loadModifiedFiles() after rename
2. handleSave (Cmd+S) skipped onAfterSave when nothing was pending

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 12:37:24 +01:00
Luca Rossi
32fd3ca656 Merge pull request #36 from refactoringhq/task/github-oauth-login
fix: surface actual error messages in GitHub OAuth login flow
2026-02-24 12:12:36 +01:00