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>
BlockNote's serializer outputs `*` for bullet lists and inserts ` `
HTML entities around inline code within bold text. Both cause meaningless
git diffs. Fix by post-processing in compactMarkdown:
- Normalize `*` bullet markers to `-` (standard convention)
- Decode HTML entities like ` ` back to literal characters
- Skip normalization inside fenced code blocks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
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>
updateEntry's .map() always returned a new array even when no entry matched,
causing unnecessary state changes. During note creation, addEntry uses
startTransition (deferred) while markContentPending calls updateEntry
synchronously — the entry doesn't exist yet, so the no-op .map() produced a
new reference that cascaded into "Maximum update depth exceeded" (which
surfaced as React error #185 in the production WKWebView build).
The fix makes updateEntry bail out (return prev) when no entry was changed,
preventing the spurious state update. Also removes the defensive try-catch
from the previous fix attempt and cleans up an unnecessary setToastMessage
dependency.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
Wraps the note creation flow in try-catch so errors in title
generation, template resolution, or tab opening are logged to
console instead of crashing the app.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
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>
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>
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>
Verifies that editing the type field in the raw editor (Cmd+\) immediately
updates the Properties panel type selector without navigation or reload.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When editing type/status/color/icon in the raw editor (Cmd+\), changes
now immediately flow into the reactive VaultEntry state, updating the
Properties panel, note list, and sidebar without save/reload.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
- 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>
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>
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>
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>
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>
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>
Extend the Rust vault scanner to index .md files in all visible
subdirectories (hidden dirs excluded). Add FolderNode struct and
list_vault_folders Tauri command that returns the directory tree.
On the frontend, add FolderNode type, extend SidebarSelection with
{ kind: 'folder'; path: string }, and add isInFolder() filtering
in noteListHelpers.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
Wire up @codemirror/lang-markdown with a custom HighlightStyle to
highlight headings, bold, italic, strikethrough, links, lists,
blockquotes, and inline code in the raw CodeMirror editor. The custom
frontmatter plugin is kept for YAML highlighting; its heading
decoration is removed in favour of the language-based parser.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Load JetBrains Mono (regular weight) from Google Fonts and set it as the
primary font for the CodeMirror raw editor, replacing Berkeley Mono.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>
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>
Match the note list header height (52px) across all panel headers for
consistent horizontal alignment. Previously breadcrumb bar, inspector
header, and AI panel header were 45px.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add Cmd+Shift+I keyboard shortcut in useAppKeyboard for toggling the
properties/inspector panel
- Change default inspectorCollapsed to true (panel closed on fresh install)
- Add shortcut hint "⌘⇧I" to Properties button tooltips in breadcrumb
bar and inspector header
- Show shortcut in command palette for "Toggle Properties Panel"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Note windows now render the main App component with panels defaulted to
hidden (editor-only view, inspector collapsed). This gives note windows
full feature parity: zoom, all keyboard shortcuts, properties editing,
and panel toggles — eliminating the maintenance burden of a separate shell.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Apply zero vertical padding when sections are collapsed so they sit flush
against each other, matching the density of main nav items. Expanded
sections retain 4px vertical padding for breathing room.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Generate a commit message from modified files (e.g. "Update winter-2026"
or "Update 12 notes") and pre-fill the CommitDialog textarea so users can
commit immediately or edit the suggestion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When a note has no emoji icon, the NoteIcon area was occupying horizontal
space in the title row, pushing the title text to the right. Fix: render
NoteIcon in a separate div above the title row when no emoji is set, so
the title starts flush with the left margin. When an emoji is present,
the original inline-left layout is preserved.
Changes badge shows GitDiff icon with orange count badge, Pulse badge
sits next to it. Commit & Push is accessible via icon button beside
Changes. Sidebar is now cleaner with only nav filters and sections.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Apply theme CSS variables to the editor scroll area so the title section
uses the same max-width as the BlockNote editor. Add matching margin-left
to the title row/separator for body text alignment. Move NoteIcon inside
the title row unconditionally so top margin is constant regardless of
emoji presence.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add relative z-10 to ResizeHandle so it stacks above adjacent panel
content that was capturing pointer events due to DOM order.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Editor (400px), note list (220px), sidebar (180px), and inspector
(240px) now have CSS min-width constraints. Window minWidth set to
800px in Tauri config. Flex-shrink ratios create cascade order:
editor shrinks first, then note list, then sidebar.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The ResizeHandle div was not stretching to the full height of its flex
row parent, making it only interactive in the top portion. Adding
self-stretch (align-self: stretch) ensures it fills the complete cross-axis
height of the container, so the user can drag at any vertical position.
Fixes: Properties panel resize handle active area.
Add data-tauri-drag-region to the BreadcrumbBar container so users can
drag the window by clicking empty space in the breadcrumb bar. Tauri
automatically excludes interactive children (buttons, links) from the
drag region.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The row of group icons between the search bar and emoji grid looked like
selectable emoji but only scrolled to groups — confusing users who expected
clicking them to select an emoji. Remove the strip entirely so the picker
opens directly with search + categorized grid.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Single-item tag arrays (e.g. Tags: [Has Pic]) now render as pills instead
of plain text: detectPropertyType checks key patterns before value type
- Tags get deterministic hash-based colors (one color per tag name) instead
of all-blue default — manual overrides still take precedence
- All chips (Type, Status, Date, Tags) share consistent sizing: 12px font,
rounded-md, matching padding
- Type label font-size matches other property labels (was 10px, now 12px)
- Tag add button is solid muted pill instead of dashed circle
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove reserved left space when note has no emoji icon (conditional render)
- Move "Add icon" button above the title row (Notion-style hover reveal)
- Increase title font size to 32px and top padding to 32px for proper H1 weight
- Update smoke test to validate no-emoji layout and new hover target
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove IBM Plex Mono + text-transform: uppercase from all UI labels.
CSS classes .font-mono-label and .font-mono-overline now use Inter
with no text-transform. Inline monospace+uppercase styles in
StatusDropdown, TagsDropdown, ReferencedByPanel, AiActionCard replaced.
Tailwind uppercase removed from Sidebar, CommandPalette, PulseView,
CreateNoteDialog, CreateTypeDialog. Hardcoded ALL CAPS text (COLOR,
ICON, TEMPLATE) converted to sentence case. Code blocks and commit
hashes remain monospaced.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sentence-case labels, colored tag pills, date chips, checkbox booleans,
blue URL links, status dot indicator, subtle Add Property button.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add visual separation between properties, Backlinks, and History sections
using Separator components. Restyle Backlinks with arrow-up-right icon header
and blue clickable links. Restyle History with counter-clockwise icon header,
combined hash+message blue links, and muted date below. Both sections now
hide entirely when empty instead of showing placeholder text.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>