diff --git a/src/app/charge/[code]/page.tsx b/src/app/charge/[code]/page.tsx index b66733c..101c32e 100644 --- a/src/app/charge/[code]/page.tsx +++ b/src/app/charge/[code]/page.tsx @@ -57,11 +57,30 @@ export default async function BatchPage(props: PageProps<"/charge/[code]">) {
-
- - {t.chargePage.verifiedBatch} + {/* Echtheitssiegel: wer den QR-Code vom Glas scannt, landet hier โ€” + das Siegel stempelt sich ein, bevor die Details folgen. */} +
+ + + + + + + {t.chargePage.verifiedBatch}
-

+

{batch.harvest.type} {batch.harvest.year}

{t.chargePage.provenanceNote(batch.code)}

@@ -91,20 +110,32 @@ export default async function BatchPage(props: PageProps<"/charge/[code]">) {
-
+
    {steps.map((step, i) => ( -
    +
  1. - + {i < steps.length - 1 ? ( -

    {step.label}

    -

    {step.value}

    -
  2. +

    {step.value}

    + ))} -
+
diff --git a/src/app/ernten/[year]/[type]/page.tsx b/src/app/ernten/[year]/[type]/page.tsx index 7b9df71..76e427f 100644 --- a/src/app/ernten/[year]/[type]/page.tsx +++ b/src/app/ernten/[year]/[type]/page.tsx @@ -45,8 +45,8 @@ export default async function HarvestDetailPage( - - + + {harvest.year} ยท {formatDate(harvest.harvestDate, locale)}

-

{harvest.type}

-

{harvest.description}

+

{harvest.type}

+

{harvest.description}

-

{t.erntenDetailPage.batchesHeading}

-
- {harvest.batches.map((batch) => ( - - {batch.code} - - {t.erntenDetailPage.glassesAvailable(batch.remainingGlasses, batch.glassCount)} - - - ))} +

{t.erntenDetailPage.batchesHeading}

+
+ {harvest.batches.map((batch) => { + const fill = batch.glassCount > 0 ? Math.min(1, batch.remainingGlasses / batch.glassCount) : 0; + return ( + + + {batch.code} + + {t.erntenDetailPage.glassesAvailable(batch.remainingGlasses, batch.glassCount)} + + + {/* Fuellstand der Charge โ€” die Zahl rechts bekommt eine Form. */} +
-

{t.erntenDetailPage.productsHeading}

+

{t.erntenDetailPage.productsHeading}

{harvest.products.map((product) => ( -
+
{years.map((year) => (
-

{year}

+ {/* Jahrgang wie auf dem Etikett: grosse Zahl, auslaufende Linie. */} +
+

{year}

+
-
+
{byYear[year].map((harvest, i) => ( - -

{harvest.type}

-

{t.erntenPage.batchCount(harvest.batches.length)}

+ + + +
+
+

{harvest.type}

+

+ + {t.erntenPage.batchCount(harvest.batches.length)} +

+
+ +
))} diff --git a/src/app/globals.css b/src/app/globals.css index f6cbe83..25eec3a 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -121,10 +121,14 @@ p { transition: background-size 350ms var(--ease-arrive); } .link-draw:hover, -.link-draw:focus-visible, -.link-draw[aria-current="page"] { +.link-draw:focus-visible { background-size: 100% 1px; } +/* Aktive Seite: kraeftigerer Unterstrich in Honig statt in Textfarbe. */ +.link-draw[aria-current="page"] { + background-image: linear-gradient(var(--color-honey), var(--color-honey)); + background-size: 100% 2px; +} @media (prefers-reduced-motion: reduce) { .link-draw { @@ -257,3 +261,25 @@ input::placeholder, textarea::placeholder { color: color-mix(in oklab, var(--color-ink) 45%, transparent); } + +/* Chargen-Seite: das Echtheitssiegel "stempelt" sich beim Oeffnen ein. */ +@keyframes wh-stamp { + 0% { + transform: scale(1.6) rotate(-18deg); + opacity: 0; + } + 60% { + transform: scale(0.94) rotate(3deg); + opacity: 1; + } + 100% { + transform: scale(1) rotate(0deg); + opacity: 1; + } +} + +@media (prefers-reduced-motion: reduce) { + .motion-stamp { + animation: none !important; + } +} diff --git a/src/components/product-card.tsx b/src/components/product-card.tsx index 01a0077..e3ff046 100644 --- a/src/components/product-card.tsx +++ b/src/components/product-card.tsx @@ -41,13 +41,31 @@ export function ProductTeaserLink({ return ( - - - {name} - - {t.product.viewProduct} + + + + + {name} + + {t.product.viewProduct.replace(/\s*โ†’\s*$/, "")} + diff --git a/src/components/site-chrome.tsx b/src/components/site-chrome.tsx index 101b7d4..cab0465 100644 --- a/src/components/site-chrome.tsx +++ b/src/components/site-chrome.tsx @@ -359,7 +359,7 @@ export function Header({ companyName }: { companyName: string }) { href={item.href} aria-current={active ? "page" : undefined} className={`link-draw pb-1 text-sm whitespace-nowrap transition-colors ${ - active ? "text-forest [background-image:linear-gradient(var(--color-honey),var(--color-honey))] [background-size:100%_2px]" : "text-ink/80 hover:text-forest" + active ? "text-forest" : "text-ink/80 hover:text-forest" }`} > {t.nav[item.key]}