No.101 · Cards· New
Patina
Documentation cards that age with their last review. The paper warms, the corner curls and a red stamp says how long it has been, in stages set by real thresholds, so stale pages get noticed; marking a page as checked brings it back to fresh.
The prompt
Written for the variant you picked above: Light
Build a grid of documentation cards whose appearance encodes how long ago each page was last checked, so freshness is visible without reading dates. Stages come from thresholds (default 90, 180 and 365 days): Fresh, Ageing, Stale, Old. Cards: Newsreader titles and summaries on paper with a hairline border and a soft shadow. Fresh paper is white; Ageing is a faint cream; Stale is a warmer yellowed paper with slightly browner ink and a small folded corner (a diagonal triangle in the bottom-right revealing the background); Old is deeper parchment with a larger fold, a few small foxing spots, and a red rubber stamp rotated about 7° in the top-right reading 'CHECKED 14 MONTHS AGO' in condensed heavy capitals. Under each summary, in small Hanken Grotesk: the owner and 'checked 3 weeks ago'. A dashed rule separates a footer with the stage name in tiny caps and a 'Mark as checked' button. Header: 'Pages that need a look', a summary ('2 pages haven't been checked in over a year; 3 in all are stale.') and a sort select (oldest check first, or title). Marking a page as checked calls onCheck, shows 'Saving…', then the card's paper eases back to white with a brief accent ring and 'Checked today'; a failure leaves it unchanged with the error under it. Selected variant — Light (light): Palette for this theme (Light): --patn-accent #1f5c8f; --patn-bg #f4f3ef; --patn-fox rgb(150 100 40 / 0.18); --patn-ink #1e1d1a; --patn-ink-old #4a4234; --patn-line rgb(30 29 26 / 0.12); --patn-muted #67635b; --patn-p0 #ffffff; --patn-p1 #fcf7ea; --patn-p2 #f5e7c6; --patn-p3 #ead4a2; --patn-stamp #b5361f. Treat these as the root colour tokens, one value per role, and name them to suit your code. Select it with the theme option set to "light". Keep every dimension, spacing value, state and motion from the brief unchanged, and keep text at 4.5:1 contrast or better on these surfaces. This selection takes precedence over references to other themes or options in the general brief. Implement this selected appearance; do not add a variant picker or alternative appearances unless requested. Implementation requirements: Use React and TypeScript. Keep the component self-contained, with uniquely scoped CSS and no animation libraries. Include required imports, styles and font setup in the result. Interaction: Mark as checked calls onCheck(id), which may reject. The sort select reorders the grid. Ages are computed from now (or the viewer's clock after mount). Motion: Paper and ink colours ease over 700ms when a page changes stage; a freshly checked card shows a fading accent ring over 900ms. Reduced motion or motion={false} applies changes at once. Accessibility: Each card is an article labelled by its title; its stage and age are stated in text ('Omar, stale, checked 8 months ago'), not only by colour or the stamp, which is decorative. The result of every check is announced; errors use role=alert. Responsive behavior: The grid fills as many 230px columns as fit; the header wraps. Touch: Every action is a button. Preserve keyboard access, visible focus and reduced-motion behavior. Keep fictional demo data and simulated service calls in a separate usage example; expose callbacks for real actions and recover from rejected requests. Keep usage-example links inside the demo: use local buttons or prevent navigation. Demonstration links must not navigate to Vitrine routes or open other pages; preserve real URL support in the reusable component itself. Verify the result at narrow and wide viewport sizes, with keyboard input and reduced motion enabled.
Notes
- Interaction
- Mark as checked calls onCheck(id), which may reject. The sort select reorders the grid. Ages are computed from now (or the viewer's clock after mount).
- Motion
- Paper and ink colours ease over 700ms when a page changes stage; a freshly checked card shows a fading accent ring over 900ms. Reduced motion or motion={false} applies changes at once.
- Accessibility
- Each card is an article labelled by its title; its stage and age are stated in text ('Omar, stale, checked 8 months ago'), not only by colour or the stamp, which is decorative. The result of every check is announced; errors use role=alert.
- Responsive
- The grid fills as many 230px columns as fit; the header wraps.
- On touch
- Every action is a button.