Commit Graph

6 Commits

Author SHA1 Message Date
Dorian
b7789bcb0c fix: add pull_policy: build so Portainer builds the image locally
Portainer's git-stack deploy runs `docker compose pull` before `up`,
which tried to fetch kammergut:0.1.0 from a registry and got
"pull access denied". The image only exists locally — `pull_policy:
build` tells Compose to build from the Dockerfile instead.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 14:55:04 +01:00
Dorian
832f7dd602 fix: revert font-display to swap so DM Serif hero loads bold
display=optional gave browsers only ~100ms to fetch DM Serif Display
before sticking with the system serif fallback — on any uncached
visit that meant the hero "Deepstock" title rendered thin (system
serif at weight 400) and never swapped to the thick display font.

Back to display=swap: brief FOUT on first paint, but the bold serif
is what users actually see.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 14:22:56 +01:00
Dorian
f4dadf1ec7 fix: restore landing page layout when navigating back from quiz
The qpb-logo's "back to home" path now soft-restarts via Vue's
@click.prevent="restartQuiz", but restartQuiz never reset the inline
styles startQuiz had set on body and .app to make the quiz scrollable
(height:auto / overflow:auto). On the locked-viewport landing page
those inline overrides collapsed the hero to its content height and
left a white half-screen.

restartQuiz now clears those inline styles so the CSS-defined
height:100vh / overflow:hidden chain takes over again. The original
single-file build never hit this because its qpb-logo was a hard
href="/" reload, which reset the inline styles for free.

Also harden the Vue mount layout: #app is now an explicit 100vh flex
column so the wrapper div Vue introduces between body and main.app
forwards the body's full viewport height (fallback for the same
collapse symptom on first load).

Switch Google Fonts to display=optional + add the gstatic preconnect
to eliminate the bold-flash FOUT on cold loads — fonts now render
either immediately (cached) or stay on the system fallback rather
than swapping mid-paint.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 14:16:24 +01:00
Dorian
570333d776 feat: add Portainer deployment via Docker Compose on port 4422
Multi-stage Dockerfile: node:22.13.1-alpine3.21 builds the Vite
bundle, nginx:1.27.4-alpine3.21-slim serves dist/ on container :80.
Compose maps host :4422 to container :80 with a wget healthcheck
and unless-stopped restart policy.

nginx.conf serves Vite's content-addressed /assets/ as immutable,
caches images for 30d, falls back to index.html for SPA routes,
and sets X-Frame-Options / X-Content-Type-Options / Referrer-Policy
/ Permissions-Policy headers. Server tokens off.

.dockerignore keeps the build context lean (no node_modules, dist,
.git, archive, or compose files).

Pin to image digests in Portainer's stack editor for full lock.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 13:47:54 +01:00
Dorian
07579b5b8c feat: migrate to Vue 3.5 + Vite
Faithful 1:1 port of the single-file index.html to a Vite + Vue 3.5
project. All visuals, behavior, translations, quiz logic, scoring,
SVG paint filters, and modifier panel preserved. The previous
single-file build is archived as index.original.html for A/B compare.

Inline onclick handlers in the static template are converted to
Vue's @click bindings — Vue 3 ignores string-valued on* attributes,
which silently broke the qpb-logo "back to landing" navigation.
Inline handlers inside dynamically-injected innerHTML strings
(quiz options, slider, nav buttons) keep working since the browser
parses them; their target functions are exposed on window from
onMounted.

Pinned: vue 3.5.13, vite 6.4.2, @vitejs/plugin-vue 5.2.1.
Zero npm audit vulnerabilities.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 13:47:41 +01:00
Dorian
d52885266b feat: initial commit with Deepstock landing page
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 08:29:40 +01:00