Commit Graph
242 Commits
Author SHA1 Message Date
amitwh b75f436aaa feat(renderer): PreviewPane with empty state and MarkdownRenderer 2026-06-05 13:07:55 +05:30
amitwh d81d8c28d2 test(renderer): remove non-existent html property from preview-store reset 2026-06-05 13:07:06 +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) phase-3-editor 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 phase-2-shell 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 phase-1-foundation 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 301c51ac84 test(renderer): add failing test for motion presets 2026-06-05 09:36:18 +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 8265e4ff88 chore(deps): add shadcn/ui ecosystem, motion, zustand+immer, test stack 2026-06-05 09:01:45 +05:30
amitwh 8a8671b128 docs(plan): add React UI redesign implementation plan (10 vertical slices)
- Phase 1: Foundation (shadcn, deps, lib utils, motion presets, theme)
- Phase 2: App shell + resizable panes
- Phase 3: Editor (CodeMirror 6 + immer store)
- Phase 4: Preview (marked + KaTeX + mermaid + scroll sync)
- Phase 5: File tree + tabs
- Phase 6: Native menus + toolbar
- Phase 7: Modals (export, settings, about, confirm)
- Phase 8: Toasts (sonner)
- Phase 9: Advanced tools (zen, repl, ascii, table, print, word)
- Phase 10: Polish + delete legacy renderer

Phases 1-4 are fully fleshed out (60+ TDD tasks with working code).
Phases 5-9 are sketched with the same TDD pattern; detailed
steps will be expanded at execution time following the conventions
established in Phases 1-4.
design/react-ui-redesign/plan-v1
2026-06-05 08:52:03 +05:30
amitwh 3646dc29c6 docs(spec): fix spec self-review issues (typo, drag-vs-resize, lazy-load ambiguity) design/react-ui-redesign/v1.0 2026-06-05 08:27:33 +05:30
amitwh a999f598cc docs(spec): add React + shadcn/ui UI redesign design spec
Brainstormed via superpowers:brainstorming. Locks in:
- Full feature parity with legacy renderer
- Polished + Glassy (Raycast/Arc) visual style
- IDE-style layout with draggable divider
- shadcn/ui + Motion (Framer Motion) + Zustand stack
- A/B/D modal patterns (no command palette)
- 10-phase vertical-slice implementation plan
2026-06-05 08:26:02 +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
v4.4.2-stable
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
amitwh c574d77c20 fix(renderer): remove let ModalManager to prevent SyntaxError on load
ModalManager.js is loaded via <script> tag in index.html, which
declares class ModalManager in the global script scope. renderer.js
was then doing 'let ModalManager;' which caused:
  SyntaxError: Identifier 'ModalManager' has already been declared

This prevented renderer.js from executing at all, breaking tabs,
editor, file open, and preview rendering.

Fix: conditionally require ModalManager only if undefined, without
re-declaring. In sloppy mode this safely assigns to the existing global.

Amit Haridas
2026-06-03 15:25:22 +05:30
amitwh 272215f9af fix(renderer): prevent welcome screen from overwriting opened markdown files
The welcome tab setup awaited getAppVersion() inside DOMContentLoaded.
While yielding, the renderer-ready timeout fired, file-opened was processed,
and openFile rendered the markdown. When the welcome setup resumed, it
overwrote tab.content and preview.innerHTML with the welcome screen,
leaving the preview blank.

Fix: only show the welcome screen if the tab is still empty (no filePath
and no content) when the async setup resumes.

Amit Haridas
2026-06-03 15:14:41 +05:30
amitwh 0192590567 fix(renderer): add missing closing brace for redo IPC handler
The ipcRenderer.on('redo') callback was missing its closing });
introduced in a9e05d2, causing SyntaxError: Unexpected end of input.

Amit Haridas
2026-06-03 14:36:59 +05:30
amitwh 96df5652d6 fix: resolve list-directory IPC handler closing brace syntax error 2026-05-26 11:39:57 +05:30
amitwh a9e05d2c0f feat: implement Custom Preview CSS, Reveal.js options, Large File Mode, and Interactive PDF Thumbnail Sidebar 2026-05-25 23:11:47 +05:30
amitwh c982b3e90f chore(diagnostics): add logging to _renderPreview to trace markdown rendering
This will help identify whether the issue is:
1. marked.parse returning a Promise instead of string
2. DOMPurify.sanitize failing
3. The preview element not existing
4. Libraries not being loaded

Amit Haridas
2026-05-25 00:32:27 +05:30
amitwh cfaafc07b2 chore(deps): update vulnerable packages to patched versions
Updated packages:
- simple-git 3.32.3 → 3.36.0 (RCE vulnerability)
- fast-uri 3.1.0 → 3.1.2 (host confusion, path traversal)
- dompurify 3.3.1 → 3.4.5 (XSS bypasses)
- mermaid 11.13.0 → 11.15.0 (CSS injection, DoS)
- uuid 11.1.0 → 11.1.1 (buffer bounds check)
- ws 8.20.0 → 8.20.0 (uninitialized memory)
- ip-address 10.1.0 → 10.2.0 (XSS)
- @xmldom/xmldom 0.8.11 → 0.9.10 (XML injection, DoS)
- docx4js 3.3.0 → 2.0.1 (breaks xml2js dep chain)
- brace-expansion (transitive update)

Also applied lint:fix autofix (const correctness).

Amit Haridas
2026-05-25 00:00:28 +05:30
amitwh 94ad99dc4d fix(renderer): ensure tab content visibility after file open
- Add missing updateUI() call at end of openFile() to set .active class
  on tab content. Without this, the CSS rule .tab-content:not(.active)
  { display: none } kept newly opened files invisible.
- Add diagnostic logging to file-opened IPC handler and openFile()
  to trace future file loading issues.
- Add diagnostic logging to openFileFromPath() in main process.

Amit Haridas
2026-05-24 23:54:31 +05:30
amitwh baf644d62b fix(modal): prevent duplicate ModalManager declaration
window.ModalManager was set unconditionally, causing "Identifier
'ModalManager' has already been declared" when script tag in HTML
also loaded ModalManager before renderer.js required it.

Now checks !window.ModalManager before setting.

Amit Haridas
v4.4.1
2026-05-22 22:08:06 +05:30
amitwh f9a5420ad2 4.4.1: update version everywhere, fix DOMPurify initialization
- Bump version to 4.4.1
- DOMPurify now initialized with window context (fixes markdown rendering)
- Add 'it' to eslint globals

Amit Haridas
2026-05-22 21:54:05 +05:30
amitwh f8361174f2 chore: add it to eslint globals, add debug logging to createEditor
Amit Haridas
2026-05-22 21:42:34 +05:30
amitwh 64df0660c8 fix(renderer): initialize DOMPurify with window context
require('dompurify') returns a factory function, not a sanitizer
instance. Calling .sanitize() on the factory threw a TypeError,
which was caught by the preview renderer's try-catch and displayed
a generic "Error rendering preview" message. Fix by invoking the
factory with the renderer's window object.

Amit Haridas
2026-05-03 16:38:47 +05:30