Catalogue
Every element, with the caveat that comes with it
81 interface elements, each rendered live on its own page with the source and the one thing that breaks it.
- Hover that stays off touchscreens @media (hover: hover) hover
- The filled half of a range track ::-moz-range-progress form
- Numbering the browser keeps for you counters() text
- An underline you actually drew text-underline-offset type
- Type on rails, not on stops clamp() type
- The fixed element that stopped meaning it fixed under transform layout
- A shadow that knows the shape filter: drop-shadow() surface
- The long word that will not bend overflow-wrap: anywhere text
- An ellipsis is three declarations, not one text-overflow: ellipsis text
- Less motion is not no motion prefers-reduced-motion motion
- A layout drawn as a picture of itself grid-template-areas layout
- Four faint shadows beat one dark one box-shadow ×4 surface
- Five colours out of one token oklch(from …) surface
- Hidden from eyes, kept for readers .visually-hidden a11y
- The link only keyboards ever meet skip link + :focus a11y
- The same two colours, mixed two ways color-mix() surface
- Why the last row stretches, and how to stop it auto-fit vs auto-fill layout
- Centring with no flex and no grid align-content (block) layout
- An edge that fades instead of cutting mask-composite: intersect scroll
- A vertical label that does not break the box writing-mode: vertical-rl layout
- A heading that sits on its own cap height text-box: trim-both type
- Type that inverts itself over anything mix-blend-mode: difference surface
- An outline that does not eat the letters paint-order: stroke fill type
- A drop cap the browser measures for you initial-letter text
- Stripes that stay right when rows are filtered :nth-child(of S) table
- One declaration that covers both themes light-dark() surface
- Carousel dots the browser draws itself ::scroll-marker scroll
- A tooltip that follows its anchor with no JavaScript anchor-name + position-area layout
- Styles that stop at a boundary you name @scope layout
- Animating height to auto, finally interpolate-size motion
- A spring in the easing function linear() motion
- Type that wraps to a curve, not a box shape-outside type
- Reveal on scroll, with no observer animation-timeline: view() motion
- Clipping that leaves sticky alone overflow: clip layout
- A dropdown a keyboard can hold open :focus-within a11y
- Avatars that never squash object-fit: cover media
- An underline that slides in background-size hover
- An analog clock wound by one line of JavaScript animation-delay: -43200s motion
- The logo that never hits the corner animation + cqw motion
- resize keeps writing after max-width stops it resize + max-width layout
- A gradient border that keeps its corners background + padding surface
- A spotlight that follows the cursor radial-gradient at var() hover
- A progress bar tied to scroll, with no JavaScript animation-timeline: scroll() motion
- A table header that stays put position: sticky table
- Cut a paragraph to three lines -webkit-line-clamp text
- A textarea that grows as you type field-sizing: content form
- An accordion with no JavaScript <details name> disclosure
- A focus ring for keyboards only :focus-visible a11y
- A wide table that keeps its first column position: sticky (inline) table
- Shadows that show there is more to scroll background-attachment: local scroll
- A segmented control with a sliding indicator :has() + translate control
- A skeleton that does not lie about the layout @keyframes + gradient loading
- A menu button that turns into a close button aria-expanded menu
- A switch that is still a checkbox appearance: none form
- A marquee that never jumps translateX(-50%) motion
- Frosted glass over anything backdrop-filter surface
- Type painted with a gradient background-clip: text type
- A range slider you can actually style ::-webkit-slider-thumb form
- A card that tips towards the cursor perspective + rotate hover
- A gradient angle that actually animates @property motion
- A card that reads its own container, not the window @container layout
- Type that scales with its container cqi layout
- Boxes that keep their proportions aspect-ratio layout
- A heading that breaks where a typesetter would text-wrap: balance type
- Paragraphs with no orphan last line text-wrap: pretty type
- Hyphenation in a narrow column hyphens: auto type
- An error state that waits its turn :user-invalid form
- Native controls in your palette accent-color form
- A label that floats out of the way :placeholder-shown form
- A carousel the browser drives scroll-snap-type scroll
- Scrolling that stops at the edge overscroll-behavior scroll
- Anchor links that clear a sticky header scroll-padding-top scroll
- A wrapper that knows its input is wrong :has() state
- Hovering one row quiets the others :has() + :not() hover
- A layout that changes when the list gets long :has(:nth-child()) layout
- A modal that traps focus for you showModal() dialog
- A popover with no JavaScript at all popovertarget dialog
- A section the page cannot reach inert a11y
- Animating something in from display: none @starting-style motion
- The exit animation, which is the hard half allow-discrete motion
- Reordering a list without it jumping startViewTransition() motion