Commit Graph
295 Commits
Author SHA1 Message Date
Amit Haridas 487ce2ad45 feat(renderer): Toolbar wired to command store
- 5 functional buttons: Open file, Open folder, Save, Toggle sidebar, Toggle preview
- each dispatches via useCommandStore
- aria-pressed on toggle buttons reflects app store state
- formatting buttons (bold, italic, etc.) stay disabled (Phase 9)
- toolbar now has role='toolbar' and aria-label
- TDD: 9 component tests
2026-06-05 15:58:21 +05:30
Amit Haridas 1717b2e8c0 feat(renderer): register menu commands in AppShell (Phase 6 wiring)
- useRegisterMenuCommands: registers file.open, file.save, file.closeTab,
  tab.next, tab.prev, view.toggleSidebar, view.togglePreview in command store
- useBridgeNativeMenu: useMenuAction for 13 native-menu channels
  (file-save, toggle-preview, load-template-menu, etc.)
- AppShell calls both on mount
- integration test mock extended to include ipc.menu.on
- 145/145 tests pass (was 105)
2026-06-05 15:56:32 +05:30
Amit Haridas cdd370c62d feat(renderer): useMenuAction hook (native menu IPC -> command store)
- bridge between main-process menu events and the command dispatcher
- optional transform: convert raw IPC payload to command args
- extends ipc.ts with ipc.menu.on() helper
- TDD: 5 unit tests covering subscription, payload transform, no-op, unmount
2026-06-05 15:53:37 +05:30
Amit Haridas 6df21ace35 feat(renderer): useShortcut hook (generic key combo binding)
- 'mod+s' / 'mod+shift+s' / 'Tab' / etc.
- mod = meta (Mac) or ctrl (others)
- suppresses when <input>/<textarea>/contentEditable focused
- preventDefault on match
- TDD: 15 unit tests covering parser, match, suppression, unmount
2026-06-05 15:51:35 +05:30
Amit Haridas c93747c476 feat(renderer): command store (action registry for menu/shortcut/toolbar)
- useCommandStore: register/unregister/registerMany/dispatch/get
- keyed by id (e.g. 'file.open', 'view.toggleSidebar')
- TDD: 10 unit tests covering register, dispatch, unregister, batch
- foundation for Phase 6 native menu + toolbar wiring
2026-06-05 15:49:45 +05:30
amitwh 5e5bab3da9 feat(renderer): persist last-opened folder (mc-file-store) + restore on mount 2026-06-05 15:36:59 +05:30
amitwh ce2bf62d42 feat(renderer): drag-to-reorder tabs (dnd-kit) 2026-06-05 15:34:25 +05:30
amitwh 6da98c3a54 feat(renderer): keyboard shortcuts for file ops (open, save, close, next/prev tab) 2026-06-05 15:32:55 +05:30
amitwh 3598d06240 feat(preload): add file.list, file.pickFolder, file.pickFile convenience methods 2026-06-05 15:13:16 +05:30
amitwh 650c266945 feat(renderer): TabBar wired to file store (dirty dot, close, active highlight)
- Renders tabs from useFileStore.openTabs with title + dirty dot + close button
- Uses Zustand selectors for granular re-renders
- Active tab highlighted with aria-current and accent background
- Close button stops propagation; does not trigger tab activation
- Horizontal scroll on overflow, h-9 fixed bar with border
- Empty state preserved when no tabs open

Tests: 6 cases (empty, render, highlight, click-switch, click-close, dirty indicator)
- 75 total tests (was 70, gained 5 new)
- All pass
- Build: succeeds

Amit Haridas
2026-06-05 15:03:01 +05:30
amitwh 05bbb9f86b feat(renderer): Sidebar, FileTree, Outline components wired into AppShell 2026-06-05 14:59:15 +05:30
amitwh 77c8e05fa5 feat(renderer): shadcn collapsible, scroll-area, context-menu primitives 2026-06-05 14:54:31 +05:30
amitwh 17f318dd75 fix(renderer): drop redundant ternary, add loadChildren idempotence test 2026-06-05 14:50:56 +05:30
amitwh fa5a46d5ac feat(renderer): file store with FileNode tree, openTabs, lazy loadChildren 2026-06-05 14:42:08 +05:30
amitwh a4201acad9 feat(renderer): wire PreviewPane into AppShell 2026-06-05 13:15:47 +05:30
amitwh 0b5af04a6a feat(renderer): PreviewPane tracks scroll ratio 2026-06-05 13:14:50 +05:30
amitwh 2d6f909b0e feat(renderer): useScrollSync hook (60fps throttling, ratio calc) 2026-06-05 13:13:37 +05:30
amitwh 8624257c1f feat(renderer): editor buffer content feeds preview store (300ms debounce) 2026-06-05 13:09:34 +05:30
amitwh b75f436aaa feat(renderer): PreviewPane with empty state and MarkdownRenderer 2026-06-05 13:07:55 +05:30
amitwh 559d09cad9 feat(renderer): preview store with 300ms debounced source 2026-06-05 13:04:39 +05:30
amitwh 5ad582ec3e feat(renderer): MarkdownRenderer with mermaid code re-extraction from source 2026-06-05 13:03:32 +05:30
amitwh d02f896167 feat(renderer): MermaidLazy (loads mermaid on first use, error UI) 2026-06-05 13:01:24 +05:30
amitwh f34775ce53 feat(renderer): markdown lib (marked + DOMPurify + mermaid placeholders) 2026-06-05 12:56:31 +05:30
amitwh 5d6a55dd09 feat(renderer): StatusBar reads from editor store (word count, cursor pos) 2026-06-05 12:49:16 +05:30
amitwh 0e80e37d9d feat(renderer): wire EditorPane into AppShell 2026-06-05 12:46:13 +05:30
amitwh 9a7e994224 feat(renderer): EditorPane with empty state and CodeMirror rendering 2026-06-05 12:42:25 +05:30
amitwh 3effacf816 feat(renderer): CodeMirror 6 editor wrapper with markdown, themes, keymaps 2026-06-05 12:38:09 +05:30
amitwh 1be10f9ae5 feat(renderer): CodeMirror light theme with brand-aware syntax colors 2026-06-05 12:25:31 +05:30
amitwh 4c0b7d6e84 feat(renderer): editor store with buffers, dirty state, cursor (immer) 2026-06-05 12:21:48 +05:30
amitwh db04ea5854 feat(renderer): App.tsx renders AppShell 2026-06-05 12:11:01 +05:30
amitwh 567726022c feat(renderer): AppShell with resizable panes, sidebar/preview toggle, persisted sizes 2026-06-05 12:02:35 +05:30
amitwh 1999a7716e feat(renderer): StatusBar placeholder (word count wired in Phase 3) 2026-06-05 11:53:34 +05:30
amitwh 16e071ae5e feat(renderer): Breadcrumb placeholder (wired in Phase 5) 2026-06-05 11:50:45 +05:30
amitwh 7ecf54ceb0 feat(renderer): Toolbar skeleton with formatting buttons 2026-06-05 11:48:26 +05:30
amitwh 95e2f45f1f feat(renderer): TabBar skeleton (no tabs yet — wired in Phase 5) 2026-06-05 11:45:33 +05:30
amitwh 7fbbd60525 feat(renderer): AppHeader with sidebar/preview toggles + theme toggle 2026-06-05 11:40:54 +05:30
amitwh c715bb354c feat(renderer): install shadcn resizable primitive 2026-06-05 11:35:02 +05:30
amitwh 6525de7667 feat(renderer): add useAppStore with sidebar/preview/zen/pane-sizes 2026-06-05 11:30:25 +05:30
amitwh a2c1d0c11a feat(renderer): wire App.tsx shell with theme provider and top-bar 2026-06-05 10:19:36 +05:30
amitwh e0d6315204 feat(renderer): add next-themes provider + theme toggle (sun/moon) 2026-06-05 10:17:38 +05:30
amitwh 68ff7d076a feat(renderer): install shadcn button primitive with tests 2026-06-05 10:13:31 +05:30
amitwh 67b57eae78 feat(renderer): add motion preset transitions for modals/sidebar/toasts 2026-06-05 09:37:49 +05:30
amitwh 904ffbdd5b feat(renderer): implement typed IPC wrapper with IpcResult discriminated union 2026-06-05 09:34:19 +05:30
amitwh ea383783ec test(renderer): add failing test for ipc wrapper + IpcResult types 2026-06-05 09:25:02 +05:30
amitwh e758a81c4c feat(renderer): implement cn() helper for tailwind-merge + clsx 2026-06-05 09:23:30 +05:30
amitwh ea0f3f93bf test(renderer): add failing test for cn() helper + vitest config 2026-06-05 09:20:04 +05:30
amitwh 188e73d7c1 feat(renderer): configure shadcn/ui, extend design tokens for glassy aesthetic 2026-06-05 09:13:52 +05:30
amitwh 7a396f64a6 feat(renderer): setup React, Vite, Tailwind CSS and Zustand state management 2026-06-03 23:23:59 +05:30
amitwh 88e9a5290d fix(renderer): add ensureEditor fallback and fix pandoc export path
1. Source editor blank: Added ensureEditor() method with try-catch that
   lazily creates the CodeMirror editor when setEditorContent is called
   if the initial DOMContentLoaded creation failed or was skipped.
   Replaced inline createEditor calls in createTabElements and
   DOMContentLoaded with ensureEditor().

2. Export via pandoc failing: runPandocCmd parsed the full path
   /bin/linux/pandoc as the command, then prepended it to args because
   parsed.command !== 'pandoc'. This caused pandoc to receive its own
   binary path as the first input file. Fix: use path.basename() to
   check if the command ends with 'pandoc' (or 'pandoc.exe').

Amit Haridas
2026-06-03 20:44:00 +05:30
amitwh fff15d8d3e fix(renderer): add window.electronAPI shim and update CSP for KaTeX
The main window uses nodeIntegration without preload, so window.electronAPI
was undefined. This caused the DOMContentLoaded handler to crash at:
  await window.electronAPI.getAppVersion()
which prevented the CodeMirror editor from being created (blank source
window) and stopped renderer-ready from being sent (broken menu/options).

Fixes:
1. Add window.electronAPI shim at top of renderer.js wrapping ipcRenderer.
2. Update CSP meta tag to allow KaTeX CDN (style-src, script-src, font-src).

Amit Haridas
2026-06-03 15:37:20 +05:30