Skip to content

feat: UI improvements and responsive layout for v0.1.3#57

Merged
tomymaritano merged 32 commits intomainfrom
feat/ui-improvements-v0.1.3
Jan 3, 2026
Merged

feat: UI improvements and responsive layout for v0.1.3#57
tomymaritano merged 32 commits intomainfrom
feat/ui-improvements-v0.1.3

Conversation

@tomymaritano
Copy link
Owner

Summary

This PR includes multiple UI improvements and bug fixes preparing for v0.1.3 release.

Features

  • NotebookPicker modal - Inkdrop-style modal for moving notes to notebooks
  • NoteListContextMenu - Right-click context menu with move, duplicate, delete options
  • ActionsPanel - Slide-in drawer for additional editor actions
  • Responsive flex-wrap - Editor header and toolbar wrap to multiple rows on narrow widths
  • Performance mode - Infrastructure for performance optimization settings

UI Polish

  • Traffic lights closer to window edge (x: 8, y: 8)
  • Sidebar settings button enabled and aligned
  • Reduced editor/preview padding (24px → 12px) for more content space
  • Tags always display on their own row below notebook/status selectors

Cleanup

  • Removed LicenseDialog and TrialBanner components (preparing for freemium model)

Refactoring

  • Updated navigation state and sidebar components
  • Integrated new components into main views
  • Updated global styles, note-list, and tokens

Test plan

  • Verify responsive layout works when resizing window
  • Test NotebookPicker modal opens from context menu
  • Verify tags wrap correctly in editor header
  • Check toolbar wraps to multiple rows on narrow widths
  • Confirm reduced padding looks good

🤖 Generated with Claude Code

tomymaritano and others added 29 commits January 2, 2026 09:55
- Add NoteStatus type (active, completed, on_hold, dropped)
- Add title field with validation (max 200 chars)
- Add wordCount computed property
- Add updateTitle operation
- Update tests for new fields

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add migration 004 for new note fields
- Update SQLiteNoteRepository to handle new fields
- Map status enum to database string values

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add NavigationState type with global/notebook/tag/search kinds
- Create navigationStore with Zustand for state management
- Add editorPreferencesStore for view mode persistence
- Create useNavigation hook for navigation actions
- Add navigationStore tests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace monolithic Sidebar with composable components
- Add SidebarNav, SidebarSection, NotebookItem, NotebookList
- Add CreateNotebookInput for inline notebook creation
- Delete old Sidebar.tsx and NotebookTree.tsx

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add CodeMirror 6 markdown editor with syntax highlighting
- Add split view (editor | preview | both) with toggle
- Add EditorHeader with notebook selector and status dropdown
- Add FormattingToolbar with markdown shortcuts
- Add MarkdownPreview with react-markdown and GFM support
- Add TitleInput component for note titles
- Add EditorViewToggle with Eye/Columns icons
- Lazy load MarkdownEditor for better initial performance

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Master-slave scroll sync between editor and preview:
- Detects active panel via mouseenter
- Handles lazy-loaded components with onReady callbacks
- Fixes intermittent sync on mode transitions (split→eye→split)
- Uses requestAnimationFrame for smooth sync
- Skips sync when target can't scroll (short content)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update App.tsx to use new sidebar and navigation
- Add IPC handlers for notebooks in main process
- Expose notebook APIs in preload
- Update NoteList with status badges and icons
- Add useNotebooks and useNotes hooks
- Add CSS tokens and note-list styles
- Add formatDate utility

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add react-markdown, remark-gfm for preview
- Add zustand for state management
- Add vitest config for desktop tests
- Update CLAUDE.md with navigation architecture docs
- Add CHANGELOG.md
- Add utility scripts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Backend changes:
- Tags are now persistent entities (exist independently of notes)
- Add deleteTag() to remove tag from system
- Add getAllTagsWithColors() and setTagColor() for tag colors
- Add setManualTags() and getManualTags() for editor tag chips
- Migrations: manual_tags (005), tag_colors (006)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Zustand store that:
- Caches tag colors locally
- Syncs with database on load
- Provides getColor/setColor/removeTag actions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- TagsList: color dot picker, context menu, delete button
- TagsInput: editable tag chips in editor header
- EditorHeader: integrate TagsInput component
- Load tag colors on app mount
- Invalidate tags query after changes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
First CSS Module in the project:
- TagsContextMenu.tsx with scoped styles
- Simplified class names (.menu, .item, .itemDanger)
- Portal renders to document.body (valid HTML)
- Removed context-menu.css from global imports

Following CSS Audit plan: migrate components with logic to CSS Modules.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…SS Modules

- LicenseDialog: ~230 lines extracted from global.css
- ErrorBoundary: ~80 lines extracted from global.css
- TrialBanner: ~50 lines extracted from global.css

Each component now follows the standard structure:
  ComponentName/
    ComponentName.tsx
    ComponentName.module.css
    index.ts

Total: ~360 lines removed from global.css

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, tag changes only invalidated noteKeys.tags() (sidebar),
leaving NoteList with stale cached data until React Query's staleTime
expired (~60s).

Now both handleAddTag and handleRemoveTag also invalidate
noteKeys.lists(), causing NoteList to refetch immediately.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create ColorPicker component with CSS Module
- Use ColorPicker in TagsContextMenu and TagsList
- Remove color picker CSS from global.css (-56 lines)
- Clean up redundant CSS from TagsContextMenu.module.css

This completes the TagsContextMenu encapsulation by eliminating
the last dependency on global.css.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix sidebar status filter visual state
- Deselect note when status change removes it from current filter
- Keep editor and note list consistent

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The note_tags table has PRIMARY KEY (note_id, tag_id) but the code
was using ON CONFLICT(note_id, tag_id, source). When a tag existed
as 'manual' and was also in content, syncExtractedTags would fail.

Changed ON CONFLICT clause to match the primary key constraint.
Tags already linked (regardless of source) are now skipped.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Preparing for freemium model - license validation no longer needed in UI.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…utton

- Move traffic lights closer to window edge (x: 8, y: 8)
- Enable SidebarHeader component with settings button
- Increase settings icon size to 18px for better alignment

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EditorHeader wraps tags to second row when width is reduced
- Toolbar groups wrap to multiple rows instead of hiding
- Remove overflow: hidden from tags-display-chips
- Set toolbar breakpoints to 0 (always show all groups, CSS handles wrap)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CodeMirror content padding: 24px → 12px
- Preview padding: 24px → 12px
- Split/Preview mode padding: 24px 48px → 12px 24px

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Inkdrop-style modal with search, centered design, and CSS variables.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Right-click context menu with move, duplicate, and delete options.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ActionsPanel for additional editor actions
- Updated FormattingToolbar with visibility management
- Export new components from editor/index.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Infrastructure for performance optimization settings.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- App.tsx: remove licensing imports, add new component integrations
- NoteEditor: integrate ActionsPanel and toolbar visibility
- NoteList: integrate context menu and NotebookPicker

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Enhanced navigationStore with new state management
- Updated useNavigation hook
- Improved SidebarBreadcrumb and TagsList components

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add new CSS variables and styles
- Update note-list styling
- Add design tokens

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@chatgpt-codex-connector
Copy link

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

- Remove unused `offset` variable in toolbar-commands.ts
- Remove unused `useNavigation` import in Sidebar.tsx
- Remove unused `TAG_COLORS` import in TagsList.tsx

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
tomymaritano and others added 2 commits January 2, 2026 21:54
- Add CSS Modules type declaration (css-modules.d.ts)
- Fix duplicate export of NoteWithExcerpt in useNavigation.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@tomymaritano tomymaritano merged commit adb9eb5 into main Jan 3, 2026
3 checks passed
@tomymaritano tomymaritano deleted the feat/ui-improvements-v0.1.3 branch January 3, 2026 00:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant