Commit Graph

38 Commits

Author SHA1 Message Date
Dorian
74f013aed2 fix to transition between hero and banner 2026-04-22 11:23:38 +01:00
Dorian
e63157923c mobile fold stitch fix 2026-04-22 10:51:21 +01:00
Dorian
6b92eb5474 addded banner placeholder 2026-04-22 10:45:44 +01:00
Dorian
f27624478c tweaks 2026-04-22 10:28:08 +01:00
Dorian
e777ec9076 revert: restore original hero product cutout
Reverts 9f7753f + 4619ec9 — keep the original 922 kB PNG.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 09:54:09 +01:00
Dorian
f3e4be64c5 original product image 2026-04-22 09:51:40 +01:00
Dorian
4619ec95f9 build: sync dist with compressed hero cutout
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 09:47:19 +01:00
Dorian
9f7753f8ef chore(assets): compress hero product cutout (922k -> 99k)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 09:46:55 +01:00
Dorian
0942840482 build: rebuild dist after brand retune + favicon swap
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 09:45:31 +01:00
Dorian
3a9d0943e2 chore: use kaiser-natron.de favicon
Pulled from the live site
(typo3conf/ext/gmsite_kaiser/Resources/Public/Images/favicon.png).
Replaces the placeholder K-on-brand SVG.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 09:44:58 +01:00
Dorian
a0c37f17cc refactor(tokens): derive brand-green family from --color-brand via color-mix
Set --color-brand to #006548 and cascade every green-tinted token
(hover/soft/float, ink, muted, line, washes, accent-ink, success,
shadows) off it through color-mix(). Retuning the brand is now a
single-variable change.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-22 09:44:44 +01:00
Dorian
b0d0267934 added cart 2026-04-22 08:50:25 +01:00
Dorian
e60e24ab23 refactor(design-system): consolidate cart + sheet-close into IconButton
IconButton adds:
- xs size (36px) for compact chrome
- ghost variant (transparent → brand-wash on hover)
- shadow prop so callers opt into elevation per-instance

Callsites collapsed:
- Navbar desktop + mobile cart buttons now share one IconButton
  (accent variant; mobile uses shadow='md'). CART_CLASS constant
  deleted — the variant owns that coloring now.
- DesignLayout mobile sheet close uses IconButton ghost xs.

Tone-coupled pills left inline by design:
- Navbar desktop search trigger — visual tone bound to navbar variants
- Search overlay input-row close — tone bound to Search's internal tones
- Hero secondary CTA — tone bound to Hero's internal tones
- Navbar overlay menu cart row — compound pill + inline count chip,
  one-off pattern
2026-04-21 14:56:09 +01:00
Dorian
12c41a22b3 refactor(design-system): extract IconButton + polymorphic Badge
Replace inline circular-button markup and duplicated Badge classes with
first-class design-system components so every affordance is globally
controllable:

- IconButton (float / accent / cream-wash / brand-wash × sm / md / lg)
  with optional count overlay; raised variants get the hover-lift
  animation, flat variants keep transition-colors. No visual change.
- Badge gains an `as` prop so the search 'Clear' affordance renders as
  a button with the exact same typography/pill.
- Navbar mobile search/menu + overlay close, and the search overlay's
  mobile floating close, now use IconButton.

Cart icon buttons left inline for now — they combine size-specific
shadow with the count overlay and deserve a follow-up consolidation
once we add a shadow prop to IconButton.
2026-04-21 14:42:47 +01:00
Dorian
a5b4951720 feat(tokens): add brand-float (#274838) for mobile floating buttons
Applies to navbar mobile search + menu and the search overlay close —
one step lighter than brand so shadow-lg actually reads. Clear pill
label trimmed to just 'Clear' / 'Löschen'.
2026-04-21 14:18:47 +01:00
Dorian
cfcae89809 fix(search): restore accent-fill clear pill, shorten label to 'Clear'
Visible label comes from a new search.clearShort key (DE 'Löschen',
EN 'Clear'). aria-label keeps the descriptive 'Clear search' for
screen readers.
2026-04-21 14:13:11 +01:00
Dorian
f3d8e6f34a style(search): clear pill uses yellow text, not yellow fill
Keeps the small-badge typography (px/py/radius/weight/tracking) but
renders "CLEAR" in accent text so it reads as an inline affordance
rather than a filled chip.
2026-04-21 14:07:58 +01:00
Dorian
c0888530c5 style(search, navbar): brand+shadow-lg for floaters, accent clear badge
Revert mobile search/menu/close floaters to bg-brand text-accent with
shadow-lg — the cream-wash fill blended into the brand surface. Replace
the browser's native search cancel with a yellow accent-style badge
reading "clear", matching the small-badge typography.
2026-04-21 14:03:28 +01:00
Dorian
1cc044bf3b feat(search): mobile floating close button at search-open position
Mirrors the navbar's bottom-left search trigger so users return their
thumb to the same spot to dismiss. Top-right close stays for users
drawn to it.
2026-04-21 13:57:40 +01:00
Dorian
e2c7d83dfa style(navbar): mobile search + menu use cream-wash pill with accent icon
Match the overlay menu's close button: subtle translucent fill on brand
green with a yellow icon. Drops the flat brand-on-brand buttons whose
shadows didn't read on a green page.
2026-04-21 13:49:21 +01:00
Dorian
7b44260fbc feat(search): product search component + navbar triggers
Adds a client-side fuzzy product search to the design system:

- `src/api/products.js`: fixture catalogue (22 products across the Kaiser
  Natron, Holste, Gazelle, Grüne Tante and Linda ranges) plus a scored,
  diacritic-folded search (ß→ss, ä→ae, NFKD) with weighted fields
  (title 5, brand/keywords 3, size/category 2, id 1) and prefix bonus.
- `Search.vue`: tone-driven (brand/paper/cream) full-screen overlay on
  mobile, centered modal on md+. Auto-focus, arrow-key nav, Enter/Esc,
  suggested-products empty state, keyboard-hint footer on desktop, safe-
  area aware, scroll-locks the document while open.
- Navbar now hosts two triggers: a pill-shaped "Search products"
  lookalike (desktop, in the same LanguageSwitcher-style container) and
  a green/accent shadow-sm floating button bottom-left on mobile. Both
  open the same overlay.
- HomePage feeds the products list into Navbar.
- Design-system showcase (`/design/search`) with live demo + canned
  result preview + usage snippet. Sidebar + mobile bottom-nav entries
  and DE/EN i18n added.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:40:21 +01:00
Dorian
af4e03a155 feat(search): tone-aware product search with mobile + desktop triggers
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>
2026-04-21 13:33:18 +01:00
Dorian
45402733f7 fix(hero): scale product image down 15%
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>
2026-04-21 13:05:02 +01:00
Dorian
555060eee3 feat(design-system): mobile bottom nav + hero copy vertical center
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>
2026-04-21 12:41:33 +01:00
Dorian
cad5de0202 fix(hero): center in first-fold and tighten section padding
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>
2026-04-21 12:35:00 +01:00
Dorian
7b27a575d5 fix(hero): cap image to viewport height, drop badge on home
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>
2026-04-21 12:27:26 +01:00
Dorian
89c212e662 feat(home): stretch hero to fill the first fold
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>
2026-04-21 12:11:00 +01:00
Dorian
7881032613 feat: use Hero (split / brand tone) on the home page
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>
2026-04-21 12:05:20 +01:00
Dorian
fcb7673c31 fix: pull_policy: build so portainer doesn't chase docker hub
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>
2026-04-21 12:00:26 +01:00
Dorian
fe5b9641e0 fix(hero): image on top below lg in split layout
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>
2026-04-21 11:56:11 +01:00
Dorian
80f1c8db08 build: skip container npm, ship prebuilt dist for portainer showcase
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>
2026-04-21 11:52:01 +01:00
Dorian
9b4eaafd99 fix: build on debian slim instead of alpine
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>
2026-04-21 11:47:23 +01:00
Dorian
a07058d656 feat: add Hero component to design system
- 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>
2026-04-21 11:44:15 +01:00
Dorian
469ef529b6 fix: add libc6-compat so tailwind oxide binary loads on alpine
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>
2026-04-21 11:39:59 +01:00
Dorian
fdc871859b fix: use valid pinned node image tag
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>
2026-04-21 11:36:01 +01:00
Dorian
9bc6b842cf product cards and containerisation 2026-04-21 11:27:25 +01:00
Dorian
20faf91bda chore: remove orphaned DesignPage.vue
Replaced by nested /design routes in src/pages/design/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 15:12:45 +01:00
Dorian
7bd8e0a181 chore: initial commit
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>
2026-04-19 15:09:27 +01:00