The frontend the app needs to be usable at all. - web/: Svelte 5 + Vite + TypeScript SPA. Login, app shell with per-type nav, library list/create/scan/delete, item grid with covers, admin user management, and an epub.js reader that syncs progress. - Reader resumes by spine index — an integer — which is why the polymorphic progress table needs no text column. - Session state uses classic stores in a plain .ts module rather than runes in a .svelte.ts module, avoiding special module resolution. - Embedding: web/embed.go embeds web/dist. A committed .gitkeep keeps the directive valid before the frontend is built, so `go build ./...` never fails. Unknown non-API paths serve index.html for client routes; /api/* and /healthz always return JSON and never fall back to HTML. - Dockerfile builds the UI in a node stage and overlays dist into the Go stage. - pnpm 12 needs allowBuilds in pnpm-workspace.yaml; esbuild approved, the two unused transitive scripts explicitly denied so install exits 0. svelte-check: 0 errors, 0 warnings. Verified served: SPA shell at /, route fallback, hashed asset, and JSON 404 on /api/*.
42 lines
1.3 KiB
Markdown
42 lines
1.3 KiB
Markdown
# Vellum web
|
|
|
|
Svelte 5 + Vite + TypeScript single-page app. It is built to a static bundle in
|
|
`dist/` and embedded into the Go binary, so all asset paths are relative
|
|
(`base: './'` in `vite.config.ts`).
|
|
|
|
## Commands
|
|
|
|
```bash
|
|
pnpm install
|
|
pnpm dev # dev server on :5173, proxying /api to :7788
|
|
pnpm build # writes dist/
|
|
pnpm check # svelte-check
|
|
```
|
|
|
|
Run the Go server on `:7788` (`make run` from the repo root) and `pnpm dev`
|
|
proxies API and health requests to it, so cookies and sessions behave exactly
|
|
as they will in production.
|
|
|
|
## Layout
|
|
|
|
```
|
|
src/
|
|
main.ts entry point
|
|
App.svelte login gate -> shell
|
|
app.css design tokens and base styles
|
|
lib/
|
|
api.ts typed client; mirrors the Go handlers
|
|
session.ts auth + library stores
|
|
nav.ts view state
|
|
components/
|
|
Login.svelte
|
|
Shell.svelte nav + view switch
|
|
Libraries.svelte library list, create, scan, delete
|
|
LibraryView.svelte item grid with covers
|
|
Reader.svelte epub.js reader with progress sync
|
|
Users.svelte admin user management
|
|
```
|
|
|
|
The reader resumes from a spine index, which is why progress positions are
|
|
integers: it round-trips through the polymorphic `progress` table without
|
|
needing a text column.
|