Eulenwald edition
Seasonal Circle Cards
Twelve illustrated prompts for noticing the year as it changes.
Kaufmann Commerce UI / Promise family
The public sellable promise: editorial meaning, current price and projected availability, without collapsing the Offer into its stock-bearing Items.
A quieter market-facing alternative to the general Product Card, designed for warm storefront compositions.
Eulenwald edition
Twelve illustrated prompts for noticing the year as it changes.
Brief & Geschichte
A letter, a fold-out illustration and a small seasonal practice.
Archive bundle
The complete first year of Forest Letters, gathered as one edition.
The same card lying down, for dense lists and search results. The media becomes a fixed thumb so rows align on a common left edge; the description clamps to two lines rather than being dropped.
Eulenwald edition
Twelve illustrated prompts for noticing the year as it changes.
Digital reader
Five quiet chapters about attention, place and returning.
A small ritual
Transparent paper shapes for bringing low winter light indoors.
Unavailable and changed-price, side by side with an ordinary card. Both are designed states, not error styling.
Eulenwald edition
Twelve illustrated prompts for noticing the year as it changes.
Bound in linen
An undated notebook for weather, walks and things worth keeping.
Brief & Geschichte
Changed from €15.00
A letter, a fold-out illustration and a small seasonal practice.
compareAtPrice is a standing comparison — a recommended or former retail price — and renders struck through beside the current one. previousPrice is something else entirely: what this Offer projected before the projection you are looking at now. It exists so a price cannot be silently swapped under someone who already saw the old one.
They are deliberately styled apart. A changed price is stated plainly in the metadata voice — Changed from €15.00 — and never borrows the discount's presentation, because a change is not a saving and the card may not imply one.
The component accepts an Offer projection and keeps optional items as stable references. It never claims that the public card itself owns stock. A bundle can therefore remain one customer-facing promise while resolving several operational Items later.
---
import { OfferCard } from "@kaufmann/ui";
---
<OfferCard offer={offer} /> <!-- editorial (default) -->
<OfferCard offer={offer} density="compact" /> <!-- no description -->
<OfferCard offer={offer} density="row" /> <!-- lying down, for lists -->