Relationship and backlink items now use getTypeColor/getTypeLightColor
for text and background colors based on the linked note's type. Text
type labels replaced with Phosphor icons matching the NoteList/Sidebar
icon mapping (Wrench=Project, Tag=Topic, Users=Person, etc.).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Section group headers and nav items stay at font-weight 500 (medium).
Individual entity items under sections now use font-weight 400 (normal)
to create better visual hierarchy.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Title now takes full width on top, with timestamp displayed below
in 10px muted text, followed by the snippet. Applies to both flat
list and context view items.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Update NoteList group headers (RELATED NOTES, EVENTS, etc.) to use
font-mono-label class with bg-muted background bar per design.
Update Inspector section titles (Properties, Relationships, Backlinks,
History) and property labels (Type, Status, Modified, Words) to use
font-mono-overline class. Update status badge to IBM Plex Mono with
border-radius 16px per design spec.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Inter to Google Fonts import alongside IBM Plex Mono. Update root
font-family to use Inter as primary. Add .font-mono-label (11px/600/ls1.2)
and .font-mono-overline (10px/500/ls1.5) utility classes per design spec.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Removes unused GROUP_PRIORITY and BACKLINKS_KEY constants, replaces
the reference with a string literal.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Strips the |display-text alias from wikilinks before matching (e.g.
[[essay/foo|Foo]] now correctly resolves to essay/foo.md). This was
preventing the Has, Topics, and other relationship groups from resolving
entries whose wikilink references included aliases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Updates buildRelationshipGroups to use the new relationships map from
VaultEntry instead of only belongsTo/relatedTo. Now shows Has, Topics,
and all other wikilink-containing frontmatter fields as groups. Group
order: Has, Children, Events, Topics, other fields alphabetically,
Referenced By, Backlinks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds `relationships: Record<string, string[]>` to the VaultEntry
interface. Updates mock data with realistic relationship fields (Has,
Topics, Owner, Notes) and adds essay mock entries for testing the
context view.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a note is selected from the sidebar (entity selection), NoteList
now shows a context view instead of a flat list:
- Prominent top card with type-colored background, bold title, snippet,
timestamp, and type icon
- Grouped relationship sections (Children, Events, Referenced By,
Belongs To, Related To, Backlinks) with collapse/expand chevrons
- Backlinks detected by scanning allContent for wikilink references
- Groups show ALL-CAPS headers with count and CaretDown/CaretRight toggle
- Normal flat list shown when sidebar selection is "All Notes"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a small (14px) Phosphor icon in the top-right corner of each note
item, colored by type using getTypeColor(). Uses the same icon mapping
as Sidebar: Wrench=Project, Flask=Experiment, Target=Responsibility,
ArrowsClockwise=Procedure, Users=Person, CalendarBlank=Event,
Tag=Topic, FileText=Note (default).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the filter pills row ("All 12", "Projects 1", etc.) and all
associated filtering logic (typeFilter state, typeCounts memo, displayed
memo, TYPE_PILLS constant). The note list now always shows all notes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each related note in the Relationships section now displays the note
title on the left and the type label on the right.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace individual mb-4 margins with a flex column gap-4 on the
container, ensuring consistent 16px spacing between Inspector sections.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace inline color strings in SECTION_GROUPS and the string-replace
hack for light colors with the shared typeColors utility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Active filter pills now show the accent color matching the type they
represent, instead of hardcoded blue.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The selected note's border-left and background now reflect the note's
type color instead of hardcoded blue.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The single BlockNote editor instance was calling replaceBlocks before the
editor was mounted in the DOM, causing content swaps to silently fail.
Now tracks mount state via editor.onMount() and defers content swaps
until the editor is ready. Also guards against stale async parses when
the user switches tabs before markdown parsing completes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move setActiveTabPath after tab content is loaded to prevent Editor's
useEffect from firing before the tab exists in the tabs array. Add
try/catch around editor.replaceBlocks for defensive error handling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace per-tab BlockNote instances with one shared editor that swaps
content via replaceBlocks(). Cached blocks per tab path make subsequent
switches instant — only first open parses markdown. Cache entries are
cleaned up when tabs close.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of unmounting/remounting BlockNoteTab on every tab switch
(via key={activeTabPath}), render all open tabs simultaneously and
toggle visibility with CSS display:none/block. This eliminates
editor recreation and markdown re-parsing on switch. Also adds a
loading skeleton for new tabs and uses a ref for tabs to avoid
stale closures in handleSelectNote.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add requestAnimationFrame throttling to ResizeHandle so mouse move
events are batched per frame instead of triggering setState on every
pixel. Wrap Sidebar in React.memo so it skips re-rendering when only
the parent wrapper div width changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap Editor in React.memo to prevent re-renders from parent width
changes. Memoize the base wikilink items array with useMemo so it
only recomputes when entries change, not on every keystroke.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace plain .map() rendering with Virtuoso for virtual scrolling of
9000+ notes. Add useMemo to all filtering/sorting chains (filtered,
sorted, searched, typeCounts, displayed). Use entry.snippet directly
instead of computing snippets from allContent. Wrap NoteList in
React.memo to prevent unnecessary re-renders.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add snippet: string to VaultEntry TypeScript interface to match the
Rust backend. Update mock data with snippets for all entries. Add
.laputa-cache.json to .gitignore.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use titleBarStyle: Transparent for native window frame on top
- Add paddingTop: 38px to Sidebar to make room for title bar
- Keep solution simple: native traffic lights + dragging work out-of-the-box
- Removed custom traffic lights and drag handlers
- Empty state rendering with keyboard shortcut hints
- Tab bar rendering and switching between tabs
- Close tab interaction
- Breadcrumb bar with note type, title, and word count
- New note button in tab bar
- BlockNote editor rendering
- Modified indicator and diff toggle button
- Inspector panel integration
- Renders four-panel layout with sidebar, note list, editor
- Loads and displays vault entries from mock data
- Shows empty state when no note is selected
- Keyboard shortcut Cmd+S shows toast
- Verifies default sidebar selection (All Notes)
- Remove Sidebar tests for removed elements (app title, search bar)
- Update Inspector tests: header is now 'Properties' not 'Inspector'
- Fix status pill test to check inline styles instead of old CSS class
- Update relationship tests to use frontmatter-based rendering
- Fix 'no relationships' test to use content without relationship keys
- Fix editor scroll (min-height: 0 + overflow)
- Properties panel extends full height
- Moved Diff button to git-branch icon in breadcrumb bar
- Minor CSS fixes for app layout
- Remove .dark CSS variables block from index.css
- Remove theme toggle state and Cmd+Shift+T shortcut from Sidebar
- Remove dark class initialization from main.tsx
- Hardcode BlockNote theme to 'light' in Editor
- shadcn dark: classes left in place (harmless, no-op without .dark class)
Install Tailwind CSS v4 + shadcn/ui with Radix UI primitives. Migrate all
UI components (Sidebar, NoteList, Editor tabs, Inspector, dialogs, palette)
from BEM CSS to Tailwind utility classes and shadcn components (Button,
Input, Dialog, Badge, etc.). Map theme system to shadcn CSS variables while
preserving BlockNote editor styles untouched. Remove 8 old CSS files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>