Commit Graph

589 Commits

Author SHA1 Message Date
lucaronin
8433aad652 feat: rebuild FilterBuilder with shadcn/ui components
Replace native HTML elements with design system components:
- Operator <select> → shadcn Select dropdown
- Field <input>+<datalist> → shadcn Select with all available fields
- Value input → shadcn Select (when suggestions available) or Input
- Date input (type="date") for before/after operators
- Remove button → shadcn Button variant="ghost"
- AND/OR toggle → shadcn Button variant="outline" with rounded-full

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 03:41:16 +02:00
lucaronin
734f13a47f feat: add edit button (pencil) on hover for sidebar view items
Opens the Create View dialog in edit mode with pre-populated fields
(name, icon, filters). Saving updates the existing .yml file.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 02:50:49 +02:00
lucaronin
d3dd0e6ace fix: show view emoji icon in sidebar instead of default funnel
Added optional `emoji` prop to NavItem. When a view has an icon (emoji)
set in its definition, it renders that emoji instead of the default
Funnel icon. Views with no icon still fall back to the funnel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 02:41:12 +02:00
lucaronin
e0cd5378a3 fix: resize Create View dialog and make filters scrollable
Set min-width to 600px, max-height to 80vh. The filters section now
scrolls when it grows past the available space while the header (icon +
name) and footer (Cancel / Create) stay pinned.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 01:56:03 +02:00
lucaronin
de033c79b1 fix: match view items to section items style in sidebar
Removed the `compact` prop from view NavItems so they render with the
same icon size (16px), font size (13px), and vertical padding (6px) as
SectionHeader items. Views and sections now align visually.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 01:33:20 +02:00
lucaronin
b44a6c7900 fix: move separator outside SECTIONS group — between groups, not inside
The border-b was on the SECTIONS header div only, creating a visible
separator between the header and its type entries. Wrapped both header
and sortable entries in a single border-b container so the divider
appears between SECTIONS and FOLDERS instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 01:08:23 +02:00
lucaronin
81142cf15f fix: equalize top/bottom padding on all sidebar group headers
Wrapper divs used '4px 6px 0' (4px top, 0 bottom) — changed to
'4px 6px' (4px top/bottom) so headers appear vertically centered.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 01:04:13 +02:00
lucaronin
9a1ca42c66 fix: align FOLDERS header padding with FAVORITES/VIEWS/SECTIONS in sidebar
Wrapper div used padding '8px 0' instead of '4px 6px 0' — now matches
the other three group headers for consistent left indent.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 00:08:52 +02:00
lucaronin
0ed72c5b98 fix: path display below title — focus-only visibility + robust path computation
1. Filename hint now only shows when title is focused (was always visible when
   slug ≠ filename, causing "path always shown" bug).
2. Vault-relative path computation handles trailing slashes and symlink-resolved
   paths via lastIndexOf fallback on vault directory name.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:33:04 +02:00
lucaronin
8cbbe1e7a0 fix: editor title textarea clips wrapped lines — add field-sizing + robust auto-resize
The textarea auto-resize was not reliably expanding for wrapped titles because
scrollHeight could be stale on the first read (e.g. during tab switches).
Added CSS field-sizing: content as the primary solution, plus requestAnimationFrame
and ResizeObserver fallbacks for older WebKit versions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:24:03 +02:00
lucaronin
269cb5816c feat: unify sidebar group headers — all caps, chevron, collapsable with separators
VIEWS and SECTIONS headers now match FAVORITES/FOLDERS style: all caps text,
left chevron toggle, and collapsable groups. Adds border separators between
all groups and persists collapsed state in localStorage.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 21:50:59 +02:00
lucaronin
05a4194159 feat: release channels (alpha/beta/stable) via PostHog feature flags
- Add `release_channel` to Settings (Rust + TypeScript)
- Add channel selector in Settings panel (alpha/beta/stable)
- Pass `release_channel` as PostHog person property on identify
- Add `isFeatureEnabled()` helper: alpha always true, beta/stable
  use PostHog flags with hardcoded fallback defaults
- Update `useFeatureFlag` to delegate to PostHog-backed evaluation
  (localStorage overrides still work for dev/QA)
- Create ADR-0042 (supersedes ADR-0017)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 21:22:28 +02:00
lucaronin
cd3747c33a feat: implement PostHog event tracking plan
Add trackEvent() calls for all user actions in the tracking plan:
- Vault: vault_opened (with has_git, note_count), vault_switched
- Notes: note_created (with has_type, creation_path), note_deleted,
  note_trashed, note_archived, note_favorited, note_unfavorited
- Git: commit_made, sync_triggered
- Search: search_used
- Editor: raw_mode_toggled, wikilink_inserted
- Types & Views: type_created, view_created
- Telemetry: telemetry_opted_in, telemetry_opted_out

All events gated by PostHog initialization (only fires when opted in).
No PII in any event properties — counts, booleans, and enums only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 20:42:43 +02:00
lucaronin
fc1d74b84c fix: editor title wraps to multiple lines instead of overflow hidden
Converted the title field from <input> to <textarea> with auto-resize
so long titles wrap naturally onto multiple lines. The textarea grows
to fit content (via scrollHeight) and shrinks back when text is
removed. Added resize:none and overflow:hidden in CSS to suppress
the drag handle and scrollbar.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 19:59:09 +02:00
lucaronin
da51174777 fix: note path below title — show only on focus, remove duplicate filename
Two bugs fixed in TitleField:

1. Vault-relative path was always visible for subdirectory notes. Now
   only appears when the title input is focused, hidden on blur.

2. Both bare filename and vault-relative path rendered simultaneously.
   Now the filename hint is suppressed when the path is visible, so
   only one line shows (e.g. `docs/adr/0001-tauri-stack`). Also
   strips the .md extension from the displayed path.

Root-level notes continue to show no path (unchanged).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 19:33:52 +02:00
lucaronin
e6e8e8aa00 feat: selected type section uses type color — filled icon, colored chip, tinted bg
When a type section is selected in the sidebar, the row now uses the
type's accent color: light-tinted background, filled Phosphor icon,
colored label text, and solid-color badge with white text. Matches
the visual treatment of main sections (Inbox, All Notes). Types with
no custom color fall back to the default muted palette.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 19:06:52 +02:00
lucaronin
aadc704d48 fix: rework Custom Views — 5 QA bugs fixed
1. Icon picker: replaced text Input with EmojiPicker popup
2. Create button: added missing .yml extension to filename
3. Field list: include relationships alongside properties
4. Nested filters: FilterBuilder now supports AND/OR groups
   with recursive nesting (Airtable/Notion-style)
5. Autocomplete: field and value inputs use datalist for
   type-ahead suggestions (type values, status values, etc.)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:52:33 +02:00
lucaronin
5fbb02631b fix: breadcrumb action buttons always right-aligned
Add ml-auto to the BreadcrumbActions container so buttons stay
anchored to the right regardless of whether the title is visible
(display:none when at top of note, display:flex when scrolled).

Previously, buttons shifted from left to right when scrolling
because the hidden title div wasn't taking up flex space.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:01:43 +02:00
lucaronin
13c3fe20fc fix: use useState for prevTitle tracking in TitleField
Replace useRef with useState for the prevTitle comparison — this is
the canonical React pattern for clearing derived state when props change,
and ensures React properly schedules the re-render.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:13:06 +02:00
lucaronin
1fc8652aa8 chore: claude code loops forever — waits 10min when no tasks instead of exiting 2026-04-03 15:10:40 +02:00
lucaronin
790ef77a75 feat: add Custom Views UI — create dialog, filter builder, sidebar integration
CreateViewDialog with FilterBuilder for constructing filter conditions
(field/operator/value rows). Wire onCreateView and onDeleteView in App.tsx
with Tauri command integration. Sidebar VIEWS section shows "+" button
for discoverability even when empty, and delete buttons on hover.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:54:06 +02:00
lucaronin
0fb115bbe1 feat: show vault-relative path below title in editor
Notes in subdirectories now display their vault-relative path
(e.g. docs/adr/0001-tauri-stack.md) as small muted text below
the title field. Root-level notes show no path. Note list entries
do not display any path.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 19:02:42 +02:00
lucaronin
d037272741 feat: show all files in folder view, open text files in raw editor, gray out binary
Vault scanner now includes all files (not just .md). Each VaultEntry has a
fileKind field ("markdown", "text", or "binary") that controls how the
frontend handles it:

- Folder view shows all file kinds; other views (All Notes, type sections)
  continue to show only markdown files
- Text files (.yml, .json, .txt, .py, etc.) open in the raw CodeMirror editor
- Binary files (.png, .jpg, .pdf, etc.) appear grayed out and are not clickable
- Non-markdown files use filename as title, skip frontmatter parsing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:38:09 +02:00
lucaronin
620515ecea feat: add custom views frontend — types, sidebar section, filter evaluation
Add ViewDefinition/ViewFile types, extend SidebarSelection with 'view'
kind. Client-side filter evaluation in viewFilters.ts with full operator
support. VIEWS section in sidebar (hidden when empty). Wire view loading
through useVaultLoader, NoteList, and filterEntries pipeline.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:09:43 +02:00
lucaronin
927e0e11e7 fix: show note title instead of filename in search results
Search results now display the VaultEntry title (from frontmatter)
when available, falling back to the filename-based title from the
search backend when no VaultEntry match is found.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:30:15 +02:00
lucaronin
0889d747fe feat: add favorites section with star button, frontmatter persistence, and drag-to-reorder
Adds FAVORITES sidebar section backed by _favorite and _favorite_index
frontmatter properties. Star button in breadcrumb bar toggles favorite
state. Drag-to-reorder updates _favorite_index on all affected notes.
Section auto-hides when empty.

ADR 0038 documents the decision to use frontmatter for portability.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:44:23 +02:00
lucaronin
c85d12ab55 refactor: remove expand/collapse from sidebar type sections
Type sections are now flat rows — clicking selects the section and loads
the note list. Removed chevrons, inline child lists, and "+" buttons.
Added note count chip to each section header. FOLDERS section expand/
collapse is unchanged.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:11:59 +02:00
lucaronin
49aff89de4 feat: pre-assign type when creating note from type section
When the user clicks "+" in the note list while a type section is
selected (e.g. Projects), the new note now gets that type pre-set in
its frontmatter. Previously, all notes were created as generic "Note"
type regardless of the selected section.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 10:06:40 +02:00
lucaronin
a353509038 fix: reduce editor minimum width and padding at narrow sizes
Halve the editor min-width from 800px to 400px so the window can be
resized narrower. Add a container query that reduces horizontal padding
from 40px to 16px when the editor panel is under 600px wide, keeping
content readable without wasting space on padding.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 02:29:05 +02:00
lucaronin
a525eca980 fix: make commit button always visible in status bar
The commit button was inside ChangesBadge which returned null when
modifiedCount was 0, hiding the button entirely. Extract it into a
standalone CommitButton component that is always visible in the
status bar with a "Commit" text label for discoverability.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 23:17:43 +02:00
lucaronin
3cefc75ec3 fix: remove overflow:hidden from status bar to prevent commit button clipping
The commit button inside ChangesBadge was being clipped by overflow:hidden
on the left status bar div when many badges were visible or at high zoom.
Removing the overflow constraint ensures the commit button is always visible.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 16:04:04 +02:00
lucaronin
01fdadf425 fix: address folder tree QA feedback — recursive filtering, folder creation, path display, remove flatten banner
1. Folder selection now recursively includes notes from subfolders
2. + button creates a new folder with inline rename (Tauri command + UI)
3. Note list items show full path when note is in a subdirectory
4. Remove flat vault migration banner and all related code (Rust commands,
   hook, component, smoke test) — subfolders are now first-class

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 15:29:24 +02:00
lucaronin
1488f6eb08 fix: vault selection dropdown hidden behind sidebar
Add position: relative and zIndex: 10 to the StatusBar footer to
establish a proper stacking context, so the vault menu dropdown
(zIndex: 1000) renders above the sidebar instead of behind it.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 14:48:58 +02:00
lucaronin
8365186b7e fix: active section badge shows primary background instead of gray
The inline badgeStyle (background: var(--muted)) was overriding the
Tailwind activeBadgeClassName (bg-primary) because inline styles have
higher specificity. Fixed by not falling back to badgeStyle when
activeBadgeClassName is provided and the item is active.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:50:02 +02:00
lucaronin
fa37f6ad9e fix: wikilink autocomplete uses relative path, prevent silent rename
Bug 1: Wikilink autocomplete now always inserts the vault-relative path
as the target (e.g. [[docs/adr/0001-tauri-stack|Title]]) instead of
just the filename. This ensures wikilinks are unambiguous and resolve
correctly across subfolders after reload.

Bug 2: unique_dest_path now excludes the source file from collision
checks, preventing false positives where a note's own file is treated
as a naming conflict (causing silent -2 suffix renames).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:15:17 +02:00
lucaronin
06485d517c fix: eliminate scroll stutter and fix breadcrumb shadow consistency
Replace React state (useState + re-render) with direct DOM manipulation
for the breadcrumb title visibility. IntersectionObserver now toggles a
data-title-hidden attribute on the bar element, and CSS handles shadow
+ title visibility. This avoids re-rendering the heavy BlockNote editor
on every scroll intersection change.

Fixes: shadow always appears when title is hidden (CSS-driven, no race),
scroll is smooth (zero React re-renders during scroll).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 17:48:52 +02:00
lucaronin
f8d94c3097 fix: prevent status bar overflow from hiding commit button
The left div in the status bar had no width constraint, causing items
at the end (commit button, Pulse) to overflow behind the right div
when the window is narrow or zoom is high.

Fixes:
- Add flex:1 + minWidth:0 + overflow:hidden to the left div
- Add flexShrink:0 to the right div so it stays visible
- Move ChangesBadge (with commit button) before SyncBadge so it
  appears earlier and is less likely to be clipped

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 17:30:10 +02:00
lucaronin
b9dd9eb9dc fix: normalize property row and chip heights for consistent layout
All chips (type, status, date, tags, boolean, color, text, URL) now use
h-6 (24px) with inline-flex + items-center, and PropertyRow has min-h-7
(28px) so every row aligns regardless of property type.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:30:22 +02:00
lucaronin
93b83007eb feat: detect external file renames and offer wikilink update via banner
When the app regains focus, checks git diff for renames (--diff-filter=R).
If renamed .md files are found, shows a non-blocking banner with "Update
wikilinks" and "Ignore" buttons. The update reuses the existing vault-wide
wikilink replacement logic from rename.rs.

New Tauri commands: detect_renames, update_wikilinks_for_renames.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:58:32 +02:00
lucaronin
3ede96a437 feat: subfolder support — path-based wikilink resolution and cross-folder backlinks
- resolveEntry: add path-suffix matching so [[docs/adr/0031-foo]] resolves
  to entries in subdirectories (Pass 1, before filename match)
- Inspector backlinks: replace hardcoded /Laputa/ regex with generic
  path-suffix matching via targetMatchesEntry helper
- Autocomplete preFilter: also match against file path so searching
  subfolder names (e.g. "adr") surfaces nested notes
- Add relativePathStem utility for vault-relative path extraction

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:47:54 +02:00
lucaronin
4dd30c53b9 feat: move filter chips to bottom of note list with gradient fade
Move FilterPills and InboxFilterPills from the top (below header) to
a floating position at the bottom of the note list. When position is
"bottom", pills are absolutely positioned with a gradient background
(transparent → card color) to create a "floating above content"
effect. Pills are centered with gap-2 and wrap to multiple lines.
Matches the ui-design.pen "Filter Pills Bar" frame.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:38:13 +02:00
lucaronin
5db92fa94c fix: remove duplicate invoke import in App.tsx
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:32:23 +02:00
lucaronin
e693ac2b21 feat: show blocking modal when vault has no git repo, offer auto-init
When opening a vault without a .git directory, a blocking modal prevents
app use until the user either creates a repository (git init + add +
commit) or chooses another vault. The check runs via is_git_repo Tauri
command; browser mode fails open.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:30:39 +02:00
lucaronin
8dd7501a2d test: add folder tree and filtering tests; docs: ADR-0033
Add FolderTree component tests (render, expand, collapse, select,
highlight) and folder filtering tests in noteListHelpers (path
matching, sibling exclusion, archive/trash filtering).

ADR-0033 documents the decision to scan all subdirectories and
expose folder tree navigation, superseding ADR-0006's scanning
constraint.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:19:31 +02:00
lucaronin
19326a7681 feat: add FOLDERS section to sidebar with collapsible tree
Build FolderTree component that renders the vault's directory
structure below the TYPES sections. Integrates with SidebarSelection
to filter the note list by folder path. Styled to match the
ui-design.pen "Folder Tree Sidebar" frame with Phosphor folder
icons, blue highlight for selected folder, and indented children
with guide lines. Wire folder data from useVaultLoader → App → Sidebar.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:14:50 +02:00
lucaronin
19795b6874 feat: show Initialize/Invalid properties prompts for notes without frontmatter
Properties panel now detects frontmatter state (valid/empty/none/invalid):
- No frontmatter: shows "Initialize properties" button that adds type+title
- Invalid YAML: shows warning with "Fix in editor" button (toggles raw mode)
- Valid frontmatter: unchanged behavior

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 11:07:39 +02:00
lucaronin
1b4341b24f feat: show note title in breadcrumb bar when scrolled past title
Use IntersectionObserver on the title section to detect when it
scrolls out of view. When hidden, the breadcrumb bar morphs to
display "<type> › <emoji> <title>" on the left and gains a subtle
shadow to separate it from the content below.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 10:42:38 +02:00
lucaronin
f6b99975ab fix: unify property panel chip sizes and ellipse long text values
Match all property value chips (Status, Date, Tags) to the Type chip's
padding (4px 8px) and border-radius (rounded-md). Fix URL and text values
to use consistent padding and constrain overflow with max-w-full + truncate.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 23:36:55 +02:00
lucaronin
9743f46afd fix: update SearchPanel arrow-key test to fire keyDown on input element 2026-03-30 19:11:01 +02:00
lucaronin
b10e090922 feat: simplify breadcrumb bar — remove left-side content and border
Remove title, breadcrumb path, word count, note status indicators, and
bottom border from the breadcrumb bar. Keep only right-aligned action
buttons (search, diff, raw, AI, archive, trash, properties). The bar
remains as a drag region and button host.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 18:57:23 +02:00