Introduces:
- src/api/fixtures/products.js + src/api/index.js — placeholder catalog
(24 products across Kaiser-Natron / Holste / Gazelle / Grüne Tante /
Linda) so search has real data. Same shape the backend will return.
- Search.vue — Teleported dialog. Token-scored, diacritics-folded, ß→ss
normalized so German terms still match when users type ASCII. Keyboard
navigation (↑/↓/Enter/Esc), autofocus on open, scroll-lock. Full-screen
on mobile, centered command-palette modal on md+. Tone prop defaults
to 'brand' so the overlay reads as the site's primary affordance
(green), with 'paper' and 'cream' variants available.
- SearchSection.vue + ds-search route + sidebar entry.
- DE + EN strings for the overlay and the showcase.
Navbar wires the triggers: desktop search button sits left of the
LanguageSwitcher in the right cluster; mobile gets a matching bottom-
left floating button (cream surface, safe-area padded) that mirrors the
existing bottom-right cart/menu cluster. The Search overlay is mounted
inside Navbar with the default catalog, so every page that renders a
Navbar gets search for free. Selected products bubble up as a
@select event for navigation handling.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Trim the split/centered mediaSize widths and the responsive max-h caps
on the image itself by ~15% so the product cutout doesn't dominate the
first fold.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
DesignLayout now hides its 260px sidebar below lg and shows a fixed
bottom bar surfacing the current page. Tapping it opens a 50svh bottom
sheet with the full nav list (grouped, scrolls internally) plus the
back-to-site link. Route changes auto-close the sheet and the backdrop
is tap-to-dismiss.
Hero split variant: drop the grid's items-center and add lg:justify-center
on the copy column so the headline/CTA block now lines up with the
image's vertical midpoint instead of sitting at the top.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Wrap the hero in an explicit flex-centering row on HomePage so vertical
centering doesn't depend on class merging, and swap the wrapper from
min-h-svh to h-svh so the layout is exactly one fold. Shrink the hero's
own py-16..lg:py-28 to py-10..lg:py-20 so the section fits comfortably
between navbar and viewport bottom.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The hero product image is a tall portrait PNG. With the hero now
stretching to fill the first fold, `w-full h-auto` was letting the
image's intrinsic height exceed the available vertical space — the
product box got clipped at the bottom and pushed the composition off.
Switch to `w-auto max-w-full max-h-[...svh]` so the image fits within
the fold and keeps its aspect ratio. Stepped 40 / 55 / 70 svh across
mobile / tablet / desktop — mobile keeps the image compact so the
headline + CTAs still land on the fold when stacked above.
Also drop the "Featured" badge from the home-page hero — the product
is already the only thing on the first fold.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Wraps the home page in a `min-h-svh flex flex-col` shell so the Hero
can take `flex-1 flex items-center` and vertically fill whatever viewport
height is left after the navbar. Uses `svh` so the hero doesn't pop
below the fold when mobile browser chrome is visible.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replaces the scaffolding copy block. Uses the existing i18n keys the
design-system showcase already exercises, with the italic emphasis
switched to text-accent-soft so the warm yellow reads on the
brand-green surface. Primary CTA → /shop, secondary → /anwendungen.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Portainer's "Pull and redeploy" runs `compose pull` before `compose up`.
With `image: kaiser-natron:portainer` set, that tries to pull the image
from Docker Hub and fails with "pull access denied" because the image
only exists as a local build artifact. `pull_policy: build` tells
compose to skip the pull step for this service.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
On mobile and tablet the split hero now stacks image-first, copy below
(matches the rhythm users expect when the product is the focal point).
Desktop is unchanged — text left, product right on lg+. Uses order-*
utilities so DOM order stays copy-first for readers/SEO while the
visual order flips.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The Portainer host keeps failing on `npm ci` inside the build stage
(both Alpine+libc6-compat and Debian slim exited 1 without ever surfacing
the real error to us). For a dev showcase this isn't worth chasing —
the dev machine is the source of truth for the built output anyway.
- Dockerfile: drop the Node build stage. Image is just nginx:1.27.3-alpine
with /dist copied in. No npm inside the container.
- docker-compose.yml: drop the production hardening (read_only, tmpfs,
security_opt, resource caps) and the container_name. Dev-only, don't
inhibit things.
- .gitignore / .dockerignore: stop ignoring dist/ — it's committed now.
- README: document the `npm run build && commit && push` release flow
and note what to reinstate when this graduates to real production.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Alpine + libc6-compat still lost the fight with Tailwind v4's prebuilt
oxide / lightningcss / rolldown bindings on the Portainer host. Debian
slim (glibc-native) is the known-good base for this stack. The serve
stage stays nginx:alpine, so the deployed image size is unchanged —
only the discarded build stage grew.
Also flip the home-page navbar from floating to the standard layout.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Responsive hero for home + category tops (390→1280px), composed from
Button, Badge, and the Icon/Logo primitives already in the DS.
- Two layouts — split (copy left / product right on lg, stacked below)
and centered — and three surface tones — cream, paper, brand. On the
brand-green surface the secondary CTA is rendered with a cream outline
pill since Button's ghost/secondary variants read dark-on-dark there.
- Decorative disc + soft glow behind the product cutout give the image
a focal point without needing a photographed backdrop.
- Headline can be passed as a string prop or as a slot (so consumers
can mix in the italic `text-brand-soft` emphasis used on the home page).
- Ships with a /design/hero showcase page that renders the component in
the DevicePreview iframe across mobile / tablet / desktop, plus
layout and tone tabs and a usage snippet. Preview route is
/design/preview/hero so the iframe can include the live Navbar.
- i18n keys added to DE + EN; AT inherits from DE.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The prebuilt @tailwindcss/oxide and lightningcss .node bindings expect a
glibc-compat runtime. On bare Alpine musl they fail to load during the
install-time probe, which cascades into `npm ci` exiting 1 in the
Portainer build.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
node:24.13.0-alpine3.20 was never published to Docker Hub, so the
Portainer build failed on pull. Switch to node:24.15.0-alpine3.23
(current Node 24 line on current Alpine line) and update README.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Vue 3 + Tailwind v4 frontend scaffold with living design system
at /design. Pinned dependencies, dev-only a11y toolbar with
colour-vision simulation, WCAG contrast checker, and axe-core audit.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>