Replace placeholder page with Svelte 5 + Vite frontend #1

Closed
opened 2026-08-01 19:58:43 -04:00 by lyssieth · 0 comments
Owner

Replace the placeholder page (crates/sermones/resources/frontend/index.html) with a real Svelte 5 + Vite + TypeScript frontend. Design authority for the real UI: docs/designs/draft/frontend.md.

Checklist

  • Stand up the Svelte 5 + Vite project — top-level frontend/, pnpm-pinned, Lightning CSS pipeline (ce4774e). Deliberate deviation: debug loads frontend/dist/ from disk rather than the Vite dev server URL; the browser dev-server workflow is tied to the planned WebSocket carrier in ipc-pipeline.md. Release embeds dist/ via qrc.
  • Typed IPC projection layer + schema-hash handshake (frontend/src/lib/bridge.ts); codegen artefacts emit into frontend/src/generated/ (ef9b217)
  • Conversation view: streaming markdown rendering, code-block syntax highlighting via arborium — feature parity with the retired placeholder; placeholder deleted
  • TypeBox runtime-validation layer over the QWebChannel surface — JIT-compiled validators from generated/schemas.json wired into frontend/src/lib/bridge.ts (wrapCall validates outgoing, unwrapIncoming validates incoming; failures surface as ipc-drift). See docs/architecture/ipc-pipeline.md
  • Attachment rendering — speculative renderer (frontend/src/lib/AttachmentView.svelte) with hand-written view types (frontend/src/lib/attachments.ts) mirroring crates/sermones-core/src/llm/attachment.rs. Nothing produces attachments yet; the producing surface lands with #11, at which point the view types come from codegen

The real UI per frontend.md is tracked separately: #5 (token core), #6 (chat view), #7 (conversation panel), #8 (composer), #9 (settings). Sending attachments: #11.

Out of scope (tracked separately): SermonErrorStore + ErrorsPanel (#4), persistence backend (#2), configuration loader (#3).

Refs:

  • docs/designs/draft/frontend.md — the design brief
  • docs/designs/draft/architecture/framework-choice.md — why Qt + Chromium
  • docs/architecture/ipc-pipeline.md — envelope, schema-hash, TypeBox validator
  • docs/invariants/ipc-schema-hash.md — handshake contract
  • docs/invariants/error-visibility.md — how errors must surface
  • docs/invariants/html-sanitization.md — every HTML chunk passes through sanitize_html_fragment
Replace the placeholder page (`crates/sermones/resources/frontend/index.html`) with a real Svelte 5 + Vite + TypeScript frontend. Design authority for the real UI: `docs/designs/draft/frontend.md`. ## Checklist - [x] Stand up the Svelte 5 + Vite project — top-level `frontend/`, pnpm-pinned, Lightning CSS pipeline (`ce4774e`). Deliberate deviation: debug loads `frontend/dist/` from disk rather than the Vite dev server URL; the browser dev-server workflow is tied to the planned WebSocket carrier in `ipc-pipeline.md`. Release embeds `dist/` via qrc. - [x] Typed IPC projection layer + schema-hash handshake (`frontend/src/lib/bridge.ts`); codegen artefacts emit into `frontend/src/generated/` (`ef9b217`) - [x] Conversation view: streaming markdown rendering, code-block syntax highlighting via arborium — feature parity with the retired placeholder; placeholder deleted - [x] TypeBox runtime-validation layer over the QWebChannel surface — JIT-compiled validators from `generated/schemas.json` wired into `frontend/src/lib/bridge.ts` (`wrapCall` validates outgoing, `unwrapIncoming` validates incoming; failures surface as `ipc-drift`). See `docs/architecture/ipc-pipeline.md` - [x] Attachment rendering — speculative renderer (`frontend/src/lib/AttachmentView.svelte`) with hand-written view types (`frontend/src/lib/attachments.ts`) mirroring `crates/sermones-core/src/llm/attachment.rs`. Nothing produces attachments yet; the producing surface lands with #11, at which point the view types come from codegen The real UI per `frontend.md` is tracked separately: #5 (token core), #6 (chat view), #7 (conversation panel), #8 (composer), #9 (settings). Sending attachments: #11. Out of scope (tracked separately): `SermonErrorStore` + `ErrorsPanel` (#4), persistence backend (#2), configuration loader (#3). Refs: - `docs/designs/draft/frontend.md` — the design brief - `docs/designs/draft/architecture/framework-choice.md` — why Qt + Chromium - `docs/architecture/ipc-pipeline.md` — envelope, schema-hash, TypeBox validator - `docs/invariants/ipc-schema-hash.md` — handshake contract - `docs/invariants/error-visibility.md` — how errors must surface - `docs/invariants/html-sanitization.md` — every HTML chunk passes through `sanitize_html_fragment`
lyssieth added this to the v1 milestone 2026-08-01 19:59:00 -04:00
lyssieth removed their assignment 2026-08-01 19:59:14 -04:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
lyssieth/sermones#1
No description provided.