Files
verdande/web
Kristian WindandClaude Opus 5 494640c1a8
Release / Build and publish image (push) Failing after 10m8s
fix(mobile): the drawer no longer pushes the page sideways
The task drawer was `width: 100vw`. A viewport unit includes the scrollbar
gutter and a percentage does not, so the drawer came out a few pixels wider
than the page it was pinned to and the whole document could be shoved
sideways. It is `100%` now, and at phone width it is stated as four insets
instead — a box defined by the viewport's own edges cannot be a rounding
error wider than it.

The scrolling body gets `min-width: 0` and `overflow-x: hidden` too, so a
pasted URL or a long unbroken word in a comment cannot stretch the flex
column and take the page with it.

Writing the test for that found another one: creating a project from the
sidebar navigated to it and left the drawer covering the screen. Every link
in there closes it on the way out; the form did not, because it calls
`goto` directly. Now it does the same thing for the same reason.

The phone test checks the document cannot be scrolled horizontally, both
with the drawer shut and with it open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 23:24:49 +02:00
..

web

The SvelteKit PWA. Not written yet — this directory holds its place so the Docker build has something to copy, and so the frontend stage can tell "not built yet" apart from "the build failed".

The Dockerfile builds this directory when it finds a package.json here, and otherwise emits a placeholder page. So adding the real app is exactly: put a SvelteKit project in this directory whose npm run build produces build/.

What it needs to be

  • SvelteKit, adapter-static, output in build/. The Go binary embeds that directory at compile time and serves it, falling back to index.html so client-side routes survive a reload.
  • A PWA: installable, offline reading of already-cached lists, swipe gestures for complete and schedule.
  • Nordic minimalism. Dark by default, light available. One accent colour, everything else neutral. Runic mark for Verdande.
  • Optimistic on every local action. No spinner ever appears for something the browser could already know the answer to.

Talking to the backend

Same origin — the Go binary serves both. /api/v1 for REST, /api/v1/ws for the live sync. Session cookie is httpOnly, so the frontend never handles the token itself.

During development, run the backend on 8080 and point the Vite dev server's proxy at it:

VERDANDE_DATA_DIR=./data VERDANDE_DEV=true go run ./cmd/verdande