Skip to content

No.388 · Sections· New

Ribbon Changelog

Release notes on a ruled margin with a bookmark ribbon laid where you stopped reading, so what is new since your last visit is simply what lies above it. Filtering folds what doesn't match instead of removing it.

The prompt

Copy this text

Automatic copying is unavailable. Copy the selected text using your device’s copy command.

Written for the variant you picked above: Paper

Build a changelog page section that answers "what is new for me?" without badges or a modal. Data: releases with a version, an ISO date, a title and a list of changes, each tagged new, improved or fixed. Sort newest first. Bar: a row of text filters (All, New, Improved, Fixed), each with a mono count, as buttons with aria-pressed; the chosen one has a 1px underline drawn under it (background-size 0 to 100%, 280ms). On the right, in mono capitals, a role=status line: "3 releases since your last visit", or "You are up to date". Each release is a ruled row: on wide containers (container query at 40rem) the date sits in an 8.5rem margin column in mono capitals and the content beside it; narrow, it stacks. The content has the heading as a serif sentence (26px) with the version in small mono before it, and a list of changes: a mono kind label (New in green, Fixed in amber, Improved in muted ink) and the sentence at 15px. Dates of releases newer than the last visit are accent coloured. The bookmark ribbon: between the newest release the visitor has already seen and the first they have not, draw a 1px accent rule across the width with a small 14 by 22px notched ribbon (path M0 0h14v22l-7-5-7 5z) hanging from it and the words "You were here 12 days ago" in mono capitals. The ribbon hangs in with a scaleY from the top over 520ms the first time. The last visit comes from a prop, or from localStorage (read the previous value, write today's, inside try/catch because storage can be unavailable). Filtering never removes rows. Every change and every release is wrapped in a fold (grid-template-rows 0fr to 1fr, 280ms, with opacity) so non-matching ones close to nothing in place and the ribbon keeps its position in the sequence. Paper and Night themes. Selected variant — Paper (paper): Palette for this theme (Paper): --rc-accent #2f6bff; --rc-fix #a15c00; --rc-ink #1b1a17; --rc-line rgb(27 26 23 / 0.13); --rc-muted #6b6861; --rc-new #1f7a4d. 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 "paper". 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: Choose a filter and everything that doesn't match folds shut; the ribbon stays between what you saw and what you didn't. Motion: Folds 280ms with opacity 200ms; filter underline draws 280ms; ribbon hangs in 520ms once. Accessibility: Filters are buttons with aria-pressed in a labelled group; the count line is a status region. Releases are articles with their version as the heading and real <time> elements. Folded content stays out of the way visually; reduced motion makes folds instant. Responsive behavior: Container query at 40rem moves dates into a margin column; below 26rem change labels sit above their text. Touch: Everything is a plain button; nothing relies on hover. 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
Choose a filter and everything that doesn't match folds shut; the ribbon stays between what you saw and what you didn't.
Motion
Folds 280ms with opacity 200ms; filter underline draws 280ms; ribbon hangs in 520ms once.
Accessibility
Filters are buttons with aria-pressed in a labelled group; the count line is a status region. Releases are articles with their version as the heading and real <time> elements. Folded content stays out of the way visually; reduced motion makes folds instant.
Responsive
Container query at 40rem moves dates into a margin column; below 26rem change labels sit above their text.
On touch
Everything is a plain button; nothing relies on hover.

Featured

425 components