- Add --color-accent-fill (#cc0230) / -hover / -ink tokens; repoint all
solid yellow "button" surfaces (Button accent, IconButton accent,
language-selector active pill, Navbar cart CTA, Kaiserhacks chip,
accent Badge) to crimson fill + white ink. Yellow --color-accent kept
for functional text accents.
- Secondary button: transparent fill, white border, white text/icons,
translucent-white hover (no longer mimics the primary default).
- Surfaces to pure white: --color-cream and --color-surface -> #ffffff
(cream-toned logo follows via text-cream); theme-color -> #ffffff.
- Self-host Zeitung (Regular/Bold woff2, mirrored from production);
point --font-sans/--font-serif at Zeitung; drop Google Fonts CDN.
- Remove yellow highlighting on hero/title emphasis and hero eyebrows
(text-accent-soft -> text-cream, eyebrows -> text-cream/75).
- WaveDivider + homepage section dividers: straight diagonal (low-left,
high-right) at double height for ~2x the right-to-left difference.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The brand-green media wash was only meant for the homepage's
3-product teaser, not the full shop catalogue. Reverts ShopPage's
ProductCard tone from `brand` → `cream` so shop cards keep the
cream image area / paper body that the rest of the catalogue uses.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bundle data was carrying localized strings (name, usage, items,
description, imageAlt, badge) directly, so EN visitors saw German
copy on the bundle page and home grid. Strings are now keyed under
bundle.<id>.<field> in the i18n catalogue (DE + EN); src/api/bundles.js
keeps only structural data + i18n key references.
HomePage builds a localizedBundles computed that resolves the keys
through t() before passing to the Bundles design-system component,
so the existing component stays agnostic of i18n. BundlePage exposes
a `bundleCopy` computed for the same reason, and resolvedItems now
maps over `itemKeys` instead of static labels.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous "split" commit shipped the background-banner version
under a misleading message. Desktop now genuinely renders as a
1.4fr / 1fr grid: wide 16:9 image on the LEFT, copy + items + price
+ qty + add-to-cart on the RIGHT. Back button stays in its row
above the hero on every viewport — no overlay, no full-bleed
background, no gradient sidebar.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reverts the full-bleed background-banner desktop hero. Desktop uses
a 1.4fr / 1fr grid: image column gets the heavier ratio so the 16:9
landscape source has room for its full composition; copy + items +
purchase cluster sits in the right column. Back button stays in its
own row above the hero on every viewport — no overlay.
BundleCard now uses RouterLink for internal hrefs (was rendering a
plain <a>, which triggered a hard navigation and lost vue-router's
saved scroll position when the user hit back from a bundle page).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Desktop: back button moves out of its dedicated row (which wasted a
strip of brand-green above the image) into an absolute overlay at
the top-left of the max-width column, so the hero artwork starts at
the very top of the fold. Mobile keeps the in-flow row since there's
no overlay surface there.
Gradient stops: from-25% / via-brand/90 via-65% / to-brand to-80%
— image stays clean for the first quarter, then ramps quickly to
opaque brand-green by the two-thirds mark, leaving the right edge
fully solid for the cream-on-green copy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Desktop (lg+) now renders the bundle artwork as the hero background
with a brand-green left → right gradient over the right ~50% so the
cream copy stays legible. All purchase actions (name, description,
items, price, qty, add-to-cart) overlay on the right column,
vertically centred in the fold. The mobile / tablet treatment keeps
the natural-aspect banner + stacked content underneath since the
single-column scroll is the right pattern at thumb-zone widths.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Source bundle art is ~16:9 (1200×670); the previous aspect-square
crop dropped roughly half the picture. Banner now spans the full
container at the image's natural aspect on mobile and caps at 55svh
on desktop so the landscape composition reads in full.
Below the banner: description on the left and the items / price /
qty / add-to-cart cluster on the right (lg+), or stacked on mobile.
Buy actions stay aligned to the same scan column on every viewport.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bundle data extracted to src/api/bundles.js (single source of truth
shared by HomePage's grid and the new BundlePage). Each card on the
home grid now links to the bundle's detail route.
BundleCard's `imageFit` default flipped to `cover` to match the new
/bundles/background/* artwork — full-bleed lifestyle scenes instead
of padded product line-ups. The `contain` mode stays available for
future bundles whose art needs breathing room.
BundlePage layout: split brand-green hero with the bundle artwork
on the left, name + items list (linking to component product pages
where matched) + pricing + qty + add-to-cart on the right. Mirrors
ProductPage chrome (Navbar, dynamic back button, CartDrawer) so the
detail-page experience reads as one piece across SKUs and bundles.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bumps the desktop/mobile split from Tailwind's md (768 px) to a
custom min-[1100px] threshold so tablets and small laptops get the
mobile chrome (menu button + bottom-right floating cluster) instead
of an over-cramped desktop nav. Bottom-clearance spacers on Home and
Shop track the same threshold so they don't disappear before the
floating cluster does.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bundles now sits directly under the Pulver hero (surface band), with
the cream "ein Pulver, hundert Anwendungen" banner below it. Wave
dividers re-routed brand → surface → cream → brand to keep the
colour rhythm continuous across the new ordering.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
· Wire bundle cards to /bundles/transparent/* artwork; rename the
ä/ü/&-bearing source files to ASCII-safe names so dev server and
CDN paths don't choke on URL-encoding edge cases.
· BundleCard gains an `imageFit` prop (`contain` default vs `cover`)
so per-bundle artwork can opt into edge-to-edge framing without
forcing the whole grid to the same fit.
· BrandHero side-fade fade-out now syncs with the tagline fade-in
(700ms ease 1150ms) — one smooth landing instead of two staggered
beats.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Home page now opens with a BrandHero that plays the figure entrance
animation in flow (replacing the full-screen SplashIntro overlay),
followed by a 3-product Cook/Clean/Care teaser feeding the shop. Splash
paths extracted to a shared module so BrandHero can render the same
illustration without duplicating ~500KB of SVG path strings.
ProductCard gains `cream` and `brand` tones (cream/green media wash
with white card body); homepage teaser uses `brand`, shop catalogue
switches to the green wash too. Bundle cards point at the new
/bundles/background/* artwork.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The two newly-shipped components (Footer with cream/brand/paper
tones, CheckoutStepper with active/completed/upcoming states) are
now documented in the design system at /design/footer and
/design/checkout-stepper. Sidebar entries added under "Sections"
and "Components" respectively, with DE + EN copy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Both pages were rendering the Navbar with cart-count but not
listening for the @cart event or rendering the drawer, so tapping
the cart icon did nothing. Hooked up cartOpen ref, search-add,
qty/remove handlers, goCheckout, and the CartDrawer template — same
pattern as HomePage / ShopPage / CategoryPage / LegalPage.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Native <select> chevrons render at varying offsets across browsers.
Replaced them with `appearance-none` + an absolute-positioned
chevron-down Icon at right-4 (16px) so the gap between the chevron
and the right border is consistent. Applied to RegisterPage's
salutation select and ShippingStep's shipping/billing country selects.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- IconButton (icon: user) in the desktop right cluster, left of cart,
and a mobile-only top-right account icon. Both navigate to /login.
- RegisterPage now matches the live kaiser-natron.at flow: salutation
dropdown (Frau/Herr/Divers), required terms & privacy checkbox
linking to /datenschutz, marketing opt-in.
- auth.js stub carries salutation + acceptsTerms through to the
session payload so the eventual backend swap is a no-op.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two fixes:
- Bring back savedPosition handling in scrollBehavior so /shop ⇄
/shop/<slug> back-nav restores the previous scroll y.
- Add a route.hash watcher in HomePage that calls scrollIntoView with
smooth behaviour. Vue Router's scrollBehavior alone wasn't reliably
firing for same-route hash navigations, so this catches them
explicitly. Also handles direct /#bundles deep-links via immediate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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>
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>
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>