03 — 12 free
The moving parts, already written
A site that sits still looks unfinished in 2026. But animation is where most builds break — janky scroll, shifting layout, phones getting hot.
Do I need to know React?
Enough to paste a component into a file. If you have a React or Next.js site, you can use these. If you are on Wix or Squarespace, these are not for you — and we would rather say that than sell you something you cannot install.
Will it slow my site down?
Every component is built transform-and-opacity only, which the browser handles on the GPU. The ones that could cost you frames are labelled, with the cheaper alternative next to them.
What is in the free tier?
Twelve components, fully working, no account. Not a trial — they are yours. The Pro packs add the more complex compositions.
Can I use these on client sites?
Yes, on your own and your clients' projects. What you cannot do is resell the component library itself as a product.
Do they work with reduced motion?
Yes, every one respects prefers-reduced-motion and degrades to a static state. That is accessibility, not a nice extra.
Motion you can paste in.
Animated React + Tailwind + Framer Motion components with live previews and copy-paste code. Curated free set to start; Pro packs and shaders when you want the premium edge. Every component is performance-first and hand-built — no bloat, no 60-dependency install.
Pick a name. Watch it live.
3d Parallax Footer
3d Parallax Footer — interactive animation component. Drop-in, editable.
A slow conic-gradient aurora that drifts behind your hero. Pure Framer Motion + Tailwind, GPU-cheap, 60fps.
A light sweep that travels across your headline on a loop. One element, no extra deps.
A button that leans toward the cursor and springs back. The detail that makes a site feel premium.
Types and deletes a rotating list of words on a loop. The classic hero hook, zero deps.
An animated multi-color gradient that flows through your headline. One element.
A button with a soft pulsing glow that draws the eye to your primary CTA.
A light sweep that travels across the button on hover. Pure Tailwind, no JS.
Move your cursor →
A radial spotlight that follows the cursor across the card. The premium-feature look.
A card that tilts in 3D toward the cursor with perspective. Springs back on leave.
Fades and slides content up as it scrolls into view. The clean scroll-entrance.
Words stagger and tilt in word-by-word as your headline scrolls into view — the choreographed type-in-motion look from 2026 award-winning sites, done in pure CSS transforms (no WebGL).
Hover to decode — each character cycles through random symbols before locking into place, left to right. The hacker-decode text effect showing up across 2025/2026 tech and portfolio sites, done in plain React state + requestAnimationFrame (no dependency).
A conic-gradient beam that rotates around the border. Wraps any card.
A subtle animated film-grain texture over your hero or card, mix-blend-screen so it reads as depth, not noise-on-top. The tactile-editorial look on 2025/2026 award sites, done as one SVG data URI + CSS steps() jitter — no canvas, no JS loop.
A frosted glass card with real refraction — the backdrop distorts through an SVG displacement filter, not just blur. The post-Apple "Liquid Glass" look spreading across 2025/2026 sites. Refraction is Chromium-only (Chrome/Edge/Brave) by current browser support; Safari/Firefox get a clean plain frosted-glass fallback automatically, no broken state.
A click ripple in pure HTML + CSS + JS — drops into any site, no framework. (Vanilla example: live iframe preview + HTML/CSS/JS tabs.)
Live traffic
12.4k
This week
The 2025/2026 "Active Grid" bento pattern: hover doesn't just change color, it swaps in a second content layer (here, a stat flips to a mini bar chart). Pure opacity/translate on hover — no layout-shifting grid, no video — so it's one drop-in Card entry rather than a whole grid system.
Native CSS scroll-driven reveal — items fade/translate in as they enter view, driven by animation-timeline: view() with zero JavaScript (no IntersectionObserver, no scroll listener). Correction (2026-09-20, was previously overstated here): Chrome/Edge have shipped this unflagged since Chrome 115 (July 2023) and Safari since Safari 26 (September 2025), but Firefox does NOT support it in stable — it still sits behind the layout.css.scroll-driven-animations.enabled flag (on by default only in Nightly), despite being a named Interop 2026 priority, so this is not yet Baseline. Unsupported browsers (Firefox stable included) just render the items static via @supports, so it degrades safely rather than breaking. (Vanilla example: live iframe preview + HTML/CSS tabs — scroll inside the box.)
A carousel with zero JavaScript — real prev/next arrows and active-slide dots, generated entirely by CSS Overflow Module Level 5's ::scroll-button() and ::scroll-marker pseudo-elements (Working Draft spec, Chrome/Edge 135+ only — no Firefox/Safari support yet). The base carousel is just a native scroll-snap row, which already works in every browser via touch/trackpad/scrollbar; the arrows and dots are a progressive-enhancement layer that only renders where the browser understands it, so nothing breaks on unsupported engines. (Vanilla example: live iframe preview + HTML/CSS tabs — scroll or drag inside the box; arrows/dots need a Chromium 135+ engine to render.)
A dropdown menu with zero JavaScript — the native HTML Popover API (popovertarget/popover) paired with CSS anchor positioning (anchor-name/position-anchor/anchor()) for placement, plus @starting-style + transition-behavior: allow-discrete for a real open/close fade-and-scale animation on an element that toggles display: none. This is the exact problem Floating UI, Popper.js, and headless-UI dropdown components exist to solve, now handled by the browser. **Accuracy update (2026-09-28, this catalog's own drift check):** when this entry was written, anchor positioning was described as 'not fully Baseline yet, Firefox 147+' as a forward-looking target. That target has since actually shipped and been reached: multiple independent sources (Refonte Learning's 'CSS Anchor Positioning Reaches Baseline in 2026', web-platform-dx/web-features issue #3558, and OddBird's ongoing anchor-positioning coverage) agree Firefox 147 unflagged the feature in mid-January 2026, which per the Baseline process automatically promoted core anchor positioning to Baseline 'Newly available' across Chrome/Edge 125+, Safari 26+, and Firefox 147+ — so as of this run it genuinely is Baseline, not merely targeting it. This is not being rounded up to 'flawless': OddBird's own tracking (oddbird.net, Fall 2025 into 2026) documents real, still-open cross-engine quirks in the newer sub-parts of the spec (position-visibility, anchor-size(), and a Safari containing-block quirk where an anchored element can be partially covered by its anchor) — the umbrella feature reached Baseline, but its edges are still shaking out. **Second accuracy update (2026-10-23, this catalog's own drift check — a real bug, now fixed, not just reworded):** the fallback claim directly above this line used to read that the non-anchor path 'falls back to a plain position: absolute dropdown' which 'remains correct defensive code.' This catalog's own later 'Anchor-Size Matched Select' entry (built 2026-10-20) found, via a real headless-Chromium bounding-box measurement, that `position:absolute` on a `popover`-attribute element does not resolve against a `position:relative` wrapper the normal way: once `showPopover()` promotes the element into the top layer, its containing block becomes the initial containing block (the viewport), not its nearest positioned ancestor. Re-run against this entry's own exact markup this run, same method (open the popover, measure both elements' real rendered bounding boxes in an isolated 1280×720 headless-Chromium page, button offset from the viewport origin so the two can't be confused): confirmed the bug reproduces here too, and precisely — not merely 'in a corner' as a first-pass description of this class of bug might round it to. The old fallback's `position:absolute;top:calc(100% + 8px);left:0` resolved against the viewport (per the top-layer containing-block quirk above) as `x:0, y:728` on a 720px-tall viewport — meaning the menu's top edge started 8px *below the bottom edge of the viewport itself*: fully off-screen, invisible, not just mis-positioned, on any engine without anchor-positioning support. **Fixed in the code this run, not just in prose:** the unsupported-browser path no longer tries to fake a position-under-trigger placement without the real primitive; it now leaves the Popover API's own UA-default centered top-layer placement (`position:fixed;inset:0;margin:auto;width/height:fit-content`) in effect — which required moving this rule's own `margin:0` *into* the `@supports` block rather than just deleting the `position`/`top`/`left` overrides, since an unconditional `margin:0` on the base rule silently defeats the UA stylesheet's own `margin:auto` centering (caught by this run's own first attempt at the fix rendering at `x:0,y:0` instead of centered — a second real bug this run found in its own draft before shipping, not assumed correct from reading the CSS alone). This is the same honest fallback shape 'Anchor-Size Matched Select' already uses, and now matches that entry's own `margin:0`-inside-`@supports` placement exactly. Re-verified this run, same bounding-box method: with the @supports (anchor-name: --a) block disabled to simulate an unsupporting engine, the menu now renders at `x:541,y:297` on the same 1280×720 viewport — its center within 1px of the viewport's true center on both axes — genuinely centered, not off-screen. (Vanilla example: live iframe preview + HTML/CSS tabs — click the button.)
A reading-progress rail that fills as you scroll — zero JavaScript, driven by animation-timeline: scroll() (the sibling of view(): scroll() tracks the scroll container's own progress instead of one element's visibility, so it's the right primitive for progress bars, scroll-linked marquees, and parallax, not element-enter reveals). Real, current, sourced browser support as of this run: Chrome/Edge unflagged since Chrome 115 (July 2023); Safari since Safari 26 (September 2025, with 26.5 in June 2026 fixing progress-accuracy bugs). Firefox does NOT support it in stable — still behind the layout.css.scroll-driven-animations.enabled flag, Nightly-only by default, a named Interop 2026 priority — so this is not yet Baseline; the @supports fallback below leaves the rail fully filled (not broken, not empty) on Firefox and any other unsupported browser. This is not scroll-jacking: it never calls preventDefault or touches scroll position, it only reads it — native scrolling, touch, trackpad, and keyboard all behave exactly as normal. (Vanilla example: live iframe preview + HTML/CSS tabs — scroll inside the box.)
A grid ↔ list layout switch that morphs each card into its new position and size instead of cutting instantly — the native View Transitions API (document.startViewTransition() + a per-card view-transition-name), zero animation library. Real, current support as of this run (sourced via MDN and caniuse): same-document view transitions are now Baseline (newly available) — Chrome/Edge since Chrome 111, Safari since Safari 18, and Firefox since Firefox 144 (shipped ~October 2025). That's a meaningfully wider, more current baseline than most entries in this catalog. Honest scope note: this is the same-document flavor only (one page, a DOM update inside startViewTransition) — the separate cross-document/MPA flavor (@view-transition at-rule, navigating between two full pages) is real but narrower today (Chrome 126+, Safari 18.2+, still not shipped in Firefox), and isn't what this component uses or claims. Feature-detects with `if (document.startViewTransition)` so unsupported browsers just re-layout instantly with no error and no broken state, and honors prefers-reduced-motion by disabling the morph animation outright rather than just making it faster. (Vanilla example: live iframe preview + HTML/CSS/JS tabs — click the toggle button.)
Fixes the classic 'this badge/button text looks vertically off-center even though I centered the box' problem — with one CSS property instead of a negative-margin or manual line-height hack. Browsers reserve extra leading space above/below a line of text (visible below as a highlighted line-box); text-box-trim: trim-both plus text-box-edge: cap alphabetic trims that box down to the font's real cap-height-to-baseline, so flexbox/grid centering lands on the glyphs themselves, not the padded line box. Real, current, sourced support as of this run: shipped unflagged in Chrome/Edge since Chrome 133 and Safari since Safari 18.2 (both early 2025), and Baseline 'newly available' since August 2026 per the Chrome for Developers and MDN write-ups; Firefox has not shipped it in stable yet, tracked in Mozilla's own bug tracker (bugzilla.mozilla.org, bug 2050141) toward parity, and it's a 'Done'/positive-position item in the cross-browser Interop 2026 project. Zero JavaScript, and it degrades with zero risk: a browser that doesn't understand text-box-trim just ignores the declaration and keeps the old default leading — no broken layout, no console error — which the @supports block below surfaces as a small note rather than hiding. (Vanilla example: live iframe preview + HTML/CSS tabs — the highlighted background on each label shows the actual line-box bounds.)
An FAQ/accordion built on the native <details>/<summary> disclosure element — real keyboard support, real screen-reader semantics, and it fully opens/closes with zero CSS and zero JavaScript on every browser ever made. The only thing added here is an animated open/close instead of an instant snap, using two real, current, cross-checked-via-WebSearch platform features stacked together: the ::details-content pseudo-element (which finally lets you select and style the collapsible content box without wrapping it in an extra div — shipped in Chrome/Edge since Chrome 131, November 2024, and Firefox since Firefox 143, but Safari's implementation is still partial, so per MDN's own Baseline-compatibility glossary this pair is NOT yet Baseline 'newly available') and interpolate-size: allow-keywords (which is what actually lets height transition from 0 to auto instead of jump-cutting — Chromium-only, Chrome/Edge since Chrome 129, September 2024, still unsupported in Firefox or Safari stable as of this run). Honest scope: the smooth slide only plays in Chromium today; every other engine (and any future one) just gets the plain native instant toggle — not broken, not empty, just un-animated, because <details> never depended on this CSS to function in the first place. (Vanilla example: live iframe preview + HTML/CSS tabs — click a question to expand it.)
The chat-compose-box pattern nearly every AI product UI now uses — a textarea that grows taller as you type multi-line text, instead of scrolling internally or getting cut off — built with one CSS property and zero JavaScript: field-sizing: content (paired with min-height/max-height to set a floor and a cap). This is the exact problem the classic 'clone a hidden div, mirror the value into it, read its scrollHeight, set the textarea's height in a JS input handler' trick exists to solve; the browser now does it natively. Real, current, sourced support as of this run: Chrome/Edge since Chrome 123 (February 2024); two independent WebSearch queries agree Firefox shipped it in Firefox 152 (June 2026), which is also cited as the release that made it Baseline 'newly available'. Safari's status is deliberately left unconfirmed rather than asserted: the only mention found was Safari Technology Preview, with no source this run confirming a stable Safari release number — this environment's WebFetch to caniuse.com and webkit.org (to check directly) is blocked by the same egress policy noted throughout this log, so it's flagged as unverified rather than guessed. Degrades with zero risk either way: a browser that doesn't understand field-sizing: content just ignores the declaration and the textarea keeps its normal fixed-then-internally-scrolling behavior — not broken, not empty. (Vanilla example: live iframe preview + HTML/CSS tabs — click into the box and type a few lines.)
A native <select> dropdown fully restyled with CSS — no div-based fake-dropdown, no JS listbox library, no ARIA hand-rolled from scratch — via the new appearance: base-select value plus the <selectedcontent> element and ::picker(select)/::checkmark pseudo-elements. You opt in with appearance: base-select on the select and on ::picker(select); a <button><selectedcontent></selectedcontent></button> as the select's first child becomes the styleable trigger (the browser clones the selected <option>'s content into it), and the popup itself becomes stylable via ::picker(select). Real, current, sourced support as of this run: the Chrome for Developers blog post 'The <select> element can now be customized with CSS' (developer.chrome.com/blog/a-customizable-select) and MDN's Learn guide both confirm the property/value pair plus <selectedcontent> shipped stable in Chrome/Edge 135; cross-checked against a second, independent query specifically targeting the version number, which agreed (introduced behind experimentation in Chrome 134, stable from Chrome 135). Safari and Firefox are NOT asserted as shipped: every source found this run places Safari behind Technology Preview only (not a stable release) and Firefox behind a flag in Nightly — left unconfirmed in stable rather than rounded up, same policy as prior entries when WebFetch to caniuse.com/webkit.org (blocked by this environment's egress policy) can't settle it directly. Degrades with zero functional loss: MDN's guide states the <button>/<selectedcontent> markup is ignored entirely in a non-supporting browser, and non-text <option> content (icons, extra markup) is stripped down to its plain text — the result is an ordinary, fully working native <select>, not a broken or empty control. **Verification caveat, stated honestly rather than assumed:** the static trigger renders and clones the selected option's text correctly (confirmed by real Playwright screenshot, this run), but the interactive click-to-open custom popup could NOT be confirmed working in this environment — real Playwright testing against this sandbox's actual Chromium 141 (tested headless, headed via Xvfb, and with --enable-features=CustomizableSelect/StylableSelect and --enable-blink-features=CustomizableSelect all explicitly set) consistently shows the outer <select> intercepting the click meant for the inner trigger button and the select's :open state never becoming true, even though CSS.supports('appearance','base-select') and getComputedStyle both report the property as engaged. This looks like a gap between this environment's open Chromium testing snapshot and a real Google-Chrome-branded stable build (many newly shipped Chrome features are gated by a server-side Finch config that generic Chromium builds don't receive), but that theory is unconfirmed — flagged as an open item for verification on a real Chrome/Edge 135+ browser outside this sandbox, not asserted as working. (Vanilla example: live iframe preview + HTML/CSS tabs — the styled trigger renders correctly; whether the popup opens on click depends on your actual browser, unconfirmed from this environment.)
A status badge whose color is chosen entirely in CSS from a custom-property value on the element itself — no JS class-toggling, no server-rendered className map — using the new if() function with a style() query: background: if(style(--status: 1): green; style(--status: 2): amber; style(--status: 3): red; else: grey). This replaces the classic 'map a status enum to a Tailwind/CSS class in JS and swap it' pattern for the common case where the only thing that actually varies is a value already sitting in a custom property. Real, current, sourced support as of this run: the Chrome for Developers blog post 'CSS conditionals with the new if() function' (developer.chrome.com/blog/if-article), MDN's 'if() CSS function' reference, and CSS-Tricks' 'Lightly Poking at the CSS if() Function in Chrome 137' all confirm if()/style() shipped stable in Chrome 137 (mid-2025); cross-checked against a second, independent query (LogRocket's 2025 write-up) which agrees. Firefox and Safari are NOT asserted as shipped: every source found this run places Firefox support 'in progress' and Safari on its roadmap for 2026–2027 only — left unconfirmed in stable rather than rounded up, same policy as every prior entry in this catalog. **Important honest distinction from recent entries in this same catalog (field-sizing, appearance: base-select):** if() does NOT auto-degrade on its own — every source checked this run states explicitly that an unsupporting browser drops the whole if(...) value as invalid at parse time with no built-in fallback, so the safety net has to be the ordinary CSS cascade: declare a plain fallback color first, then the if()-based override second, so an unsupporting browser simply never reaches the second (invalid-to-it) declaration and keeps the first. That two-line cascade trick is exactly what this demo does (see the CSS tab) — not a claim that if() degrades for free. (Vanilla example: live iframe preview + HTML/CSS tabs — three badges, each carrying a different --status custom property, colored purely by the if()/style() query.)
A sticky sub-header that adds a shadow and highlight the exact moment it becomes genuinely stuck to its scroll boundary — not when it merely scrolls near the top — using the new CSS scroll-state() container query: the sticky wrapper declares container-type: scroll-state, and @container scroll-state(stuck: top) restyles a CHILD element the instant position: sticky actually engages. This replaces the classic 'wire up an IntersectionObserver sentinel element plus a scroll/resize listener plus a JS class toggle' pattern used by nearly every 'header changes on scroll' implementation on the web today. Real, current, sourced support as of this run: the Chrome for Developers blog post 'CSS scroll-state() queries' (developer.chrome.com/blog/css-scroll-state-queries), MDN's 'Using container scroll-state queries' guide, and independent write-ups (ICS MEDIA's 'Using CSS @container scroll-state() for sticky headers and scroll effects', modern-css.com's 'CSS scroll-state() Container Queries: :stuck and :snapped') all describe the same container-type: scroll-state + @container scroll-state(stuck: top) mechanism, and agree stuck/scrollable/snapped shipped in Chrome 133 / Edge 133 (February 2025) — a fourth state, scrolled, shipped later in Chrome 144 (January 2026) and is not used in this demo. Cross-checked support: two independent WebSearch queries agree this is Chromium-only (Chrome, Edge, Opera, Samsung Internet) — Safari 27 and Firefox 158 have NOT shipped it as of this run (caniuse puts global coverage around 72% in August 2026), so this is explicitly NOT Baseline yet, same honesty policy as every prior entry in this catalog. One real spec gotcha worth stating plainly rather than glossing over: the query cannot restyle the container itself — the stuck-state style has to target a descendant (this demo puts container-type on a wrapper div and applies the shadow to its child .ssq-bar), not the sticky element directly, or the rule silently never matches. Degrades safely with zero risk: a non-supporting browser just keeps an ordinary sticky bar with no shadow-on-stick — never broken, never misplaced, since position: sticky itself is old and universally supported on its own. **Honest verification gap found this run, not glossed over:** the underlying feature genuinely works in this sandbox's real Chromium (141.0.7390.37) — confirmed with a plain top-level HTML file, where scrolling the panel makes position: sticky engage and the @container scroll-state(stuck: top) rule fires exactly as documented. But the SAME exact HTML/CSS, run inside a sandboxed srcDoc iframe embedded in a page that itself has scrollable content around that iframe (precisely how this catalog's own /motion/[slug] page is laid out), never fires the stuck-state style in this run's testing, even though position: sticky itself still visibly engages (the toolbar's real on-screen position matches the stuck offset exactly). Isolated the cause with a minimal repro: the same iframe embedded in a short, non-scrolling host page works correctly every time; adding a tall scrollable filler around that same iframe reproduces the failure on demand. This is stated as this run's own reproduced finding in this specific sandboxed testing environment, not asserted as a documented Chromium bug — no matching public bug report was found this run, and it should be spot-checked on an ordinary (non-sandboxed) Chrome/Edge 133+ tab outside this environment before treating it as settled either way. (Vanilla example: live iframe preview + HTML/CSS tabs — scroll the inner panel; the toolbar itself locks in place correctly, but per the caveat above the shadow may not appear in this catalog's own preview iframe even though the underlying CSS is correct and does work standalone.)
A Pinterest-style masonry gallery — cards of different heights packing into whichever column has the most room — with zero JavaScript and no measuring/reflow library, using native CSS Grid Level 3 masonry: grid-template-columns defines the fixed column tracks as usual, and grid-template-rows: masonry hands the packed axis to the browser, which places each item into the column with the most remaining space based on the items already placed. This replaces the classic 'Masonry.js / react-masonry-css measure every card's rendered height in JS, then absolutely-position it' pattern most masonry galleries still ship today. Real, current (2026), sourced via WebSearch, cross-checked across multiple independent queries (WebKit's own blog 'Help us invent CSS Grid Level 3, aka Masonry layout', Chrome for Developers' 'Brick by brick: Help us build CSS Masonry', MDN's 'Grid lanes layout' guide, and independent write-ups — modern-css.com's 'CSS Grid Lanes: Masonry Layout Without JavaScript', blakecrosley.com's 'CSS Grid Lanes: Native Masonry in Safari' — all describing the same grid-template-rows: masonry mechanism and citing the same shipping browser). **Cross-checked support, stated plainly rather than rounded up:** every source found agrees stable, unflagged support currently exists only in Safari 26.4 / iOS Safari 26.4 (shipped as grid-template-rows: masonry, per WebKit's own 'WebKit Features for Safari 26.4' post) — Chrome, Edge, Firefox, and Opera all still gate it behind an experimental flag as of this run, so this is explicitly NOT Baseline yet. One naming wrinkle worth stating honestly: several 2026 sources report the CSS Working Group is also discussing renaming the future spec surface to display: grid-lanes as the syntax debate continues, but what Safari 26.4 actually ships today, right now, is the grid-template-rows: masonry syntax used in this demo — this entry follows what's really shipped, not the still-unsettled future name. Degrades with zero risk: an @supports not (grid-template-rows: masonry) fallback declares an ordinary, non-packed grid-template-rows: masonry-free grid (equal-height rows, items just wrap in strict reading order) — never a broken, overlapping, or empty layout, exactly the same items and column count, just without the packing. No WebGL, no scroll-jacking, no JS at all — a pure declarative layout swap the cascade handles on its own. (Vanilla example: live iframe preview + HTML/CSS tabs.)
A row of brand-color swatches whose label text always stays readable, computed by the browser itself from the swatch's own background — no manual per-color text-color lookup table — using the new CSS contrast-color() function: color: contrast-color(var(--bg)) returns whichever of pure black or white has the greater WCAG contrast against --bg, and re-computes automatically if --bg ever changes (a live brand-color picker, a CMS-driven theme value, a user-customized accent color) with no JS re-render needed. This replaces the classic 'ship a hardcoded {color: '#fff'} class or hand-maintained hex-to-textcolor lookup map alongside every background color' pattern most theming systems still carry — exactly the kind of thing that silently breaks (white text on a newly-picked pale yellow) the moment a user or CMS editor picks a brand color nobody manually re-tested for contrast. Real, current (2026), sourced via WebSearch, cross-checked across multiple independent queries (MDN's 'contrast-color() CSS function' reference, CODERCOPS' 'CSS contrast-color() Is Baseline: Stop Hardcoding' and 'Baseline 2026: Three Features Safe to Ship Now', and independent write-ups — Schalk Neethling's 'Accessible Text Colour with the CSS contrast-color() Function', Dan Holloran's 'CSS contrast-color(): Let the Browser Pick Your Text Color' — all describing the same single-argument contrast-color(<color>) mechanism and the same Baseline date). **Cross-checked support, genuinely Baseline this time, not rounded up:** every source found agrees contrast-color() reached Baseline 'Newly available' on 2026-04-10, shipping in stable Chrome 147, Firefox 146, Safari 26.0, and Edge 147 — all four major engines, unlike nearly every other entry in this catalog which has had to flag a Chromium-only or single-engine gap. web-features' own tracking projects Baseline 'Widely available' for 2028-10-10 (the usual multi-year lag for version-distribution catch-up), so this is Newly- not Widely-available — stated precisely rather than either overclaiming universal safety or underselling real four-engine support. **Honest fallback distinction, same category of honesty as this catalog's if()/style() entry:** contrast-color() has no style()-query equivalent to branch on per-swatch inside one declaration, so a naive two-line cascade fallback (one generic color, then the override) would leave non-supporting browsers with a single compromise color that reads poorly on at least some of these six backgrounds. This demo instead uses real, manually color-picked per-swatch fallback text colors as the default rule, wrapped in a positive @supports (color: contrast-color(red)) block that overrides them with the live computed value at matching selector specificity — non-supporting browsers see correct, designer-matched colors (the old way), supporting browsers see the browser's own live computation replace them (the new way) and the explanatory note hides itself. No WebGL, no scroll-jacking, zero JS either way — a pure declarative color swap the cascade and @supports both handle natively. (Vanilla example: live iframe preview + HTML/CSS tabs — six swatches, each with a different --bg custom property.)
A real modal — true top-layer stacking, focus trap, Escape-to-close, and a clickable backdrop — all from the native <dialog> element's own .showModal(), with zero modal library. The only thing added is an animated open/close instead of an instant snap, using the CSS :open pseudo-class (not the older dialog[open] attribute selector) plus ::backdrop and @starting-style. Real, current (2026), sourced via WebSearch, cross-checked across multiple independent queries (MDN's ':open' reference, the 'CSS :open Is Baseline 2026' write-up, and web.dev's May 2026 platform roundup, all agreeing on the same version numbers): :open reached Baseline 'Newly available' in May 2026, shipping in stable Chrome/Edge 133, Firefox 136, and Safari 26.5 — all four major engines. :open is a generalization of the old dialog[open]/details[open] attribute-selector trick: it also matches an open <details>, a showing <select>/<input type=color|date> picker, and any future element with a real open/closed state, through one selector instead of one bespoke attribute match per element type. This catalog's own existing 'Native Details Accordion' entry still correctly uses the older [open] attribute selector rather than :open — left as-is rather than silently rewritten, since both are correct and :open is additive, not a replacement requirement. **Honest fallback:** @starting-style-driven enter/exit animation needs :open plus allow-discrete transitions; browsers without it still get the dialog's native instant show/hide (which has worked since Baseline 2022) with no broken or blank state — same honesty standard as every other entry here. This is also a genuine DIY-tier fit: no WebGL, no scroll-jacking, the native focus trap and Escape handling are free accessibility wins a hand-rolled JS modal has to rebuild from scratch. **A real bug this run's own Playwright verification caught, not just inspection:** this catalog's own live-preview iframe (`MotionDetail.tsx`, `sandbox="allow-scripts"`, no `allow-modals`) makes the browser throw `InvalidStateError` on `.showModal()` per the HTML spec's sandboxed-modals flag — the first click silently did nothing in this sandbox, confirmed by headless Chromium returning `dialog.open === false` after the click before this was caught. Fixed with a real try/catch: `.showModal()` is attempted first (true modal, what a real unsandboxed page gets), and only falls back to non-modal `.show()` if the browser blocks it — which also makes this component more honestly defensive for any other real-world sandboxed embed (a CMS live-preview pane, an iframe'd style guide) a user might paste it into, not just this demo mechanism. Re-verified after the fix: `dialog.open` and `matches(':open')` both turn `true` on click inside this exact sandboxed iframe. (Vanilla example: live iframe preview + HTML/CSS/JS tabs — click the button to open the modal.)
A dismissible toast/confirmation card wired entirely with the new HTML Invoker Commands API — the `command`/`commandfor` attribute pair on a <button>, pointing at the popover it controls (`command="show-popover"` / `command="hide-popover"`) — with genuinely zero JavaScript: no event listener, no <script> tag, no addEventListener at all, not even a fallback one. This is a real step further than this catalog's own 'Anchor Popover Menu' entry (which still uses the older popovertarget attribute, show/toggle/hide only) and its own 'Native Dialog Modal' entry (which needed a real try/catch JS fallback for this very sandboxed preview) — here the browser itself owns the whole open/close wiring, natively, with no script execution path at all. Real, current (2025/2026), sourced via WebSearch, cross-checked across multiple independent sources (InfoQ's 'HTML Invoker Commands Achieve Baseline Support across All Major Browsers', January 2026; HTMHell's December 2025 advent-calendar piece 'Controlling dialogs and popovers with the Invoker Commands API'; webinista.com's 'command and commandfor: the Invoker Commands API'; and independent write-ups on openreplay.com, dev.to, and utilitybend.com), all agreeing on the same version numbers: CommandEvent/command/commandfor shipped in Chrome/Edge 135, then Firefox 144, with Safari 26.2 completing the rollout across all four major engines — genuinely Baseline now, not merely Chromium-only or single-engine like most of this catalog's other recent entries. Built-in command values used here are show-popover and hide-popover (toggle-popover, show-modal, close, and request-close also ship, for other elements); custom commands (prefixed `--`) exist too but still need a real `command` event listener in JS, so they're a different, more JS-ish use case than the zero-script one demonstrated here. **Honest limitation, stated plainly rather than glossed over:** unlike several other entries in this catalog, there is no CSS `@supports` feature query that can detect an HTML attribute like `command`/`commandfor` — a browser predating the versions above simply treats the button as a plain, inert `<button type="button">` that does nothing on click (safe, never broken, never throws, just silent), rather than degrading into some visible fallback state. Given all four current major engines now ship it per the dates above, this gap only matters for genuinely out-of-date browser versions. No WebGL, no scroll-jacking — a strong DIY-tier fit, arguably the cleanest zero-JS fit in this whole catalog so far. (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all — click 'Show toast', then the × to dismiss.)
The 'hover a link, see a rich preview card' pattern (GitHub's issue/PR hover cards, X/Twitter's profile hover cards) built with zero JavaScript, using the new Interest Invoker API: the `interestfor` attribute on a link points at a `popover="hint"` target, and the browser itself fires 'interest' on real mouse hover OR keyboard focus — one attribute replaces the usual mouseenter/mouseleave/focusin/focusout JS listener stack plus manual delay timers plus manual close-on-blur logic every hand-rolled hover-card implementation needs. Real, current (2025/2026), sourced via WebSearch, cross-checked across multiple independent sources (the Open UI 'Interest Invokers' explainer, MDN's 'Using interest invokers' guide and its `interest-delay` property reference, CSS-Tricks' 'A First Look at the Interest Invoker API', and caniuse's own 'wf-interest-invokers' tracking) all agreeing: `interestfor` plus the `:interest-source`/`:interest-target` pseudo-classes shipped Chrome/Edge 142 (the CSS Working Group accepted the proposal in July 2025) — Firefox (through 154) and Safari (through 26.5) have NOT shipped it, so this is explicitly Chromium-only, not Baseline, same honesty policy as every prior entry here. The `interest-delay` shorthand (default 0.5s show / 0.5s hide on both `interest-delay-start`/`interest-delay-end`) is tuned down here, and — a real accessibility fix sourced from the same research, not this catalog's own guess — `interest-delay-end: 0s` is set on `:focus-visible` specifically, so a keyboard user tabbing away doesn't have to wait out a hide delay meant for an accidental mouse flick. **Two honest gaps, stated plainly rather than glossed over:** first, utilitybend's 'HTML popovers shown on interest should be accessible on mobile devices' (cross-checked, same finding independently confirmed) notes hover/focus-based interest has no direct touch equivalent, so touch-only visitors never see the preview card at all today — they still get the underlying link, which works normally, just without the enhancement; second, this sandbox's own pinned Chromium (141.0.7390.37) predates Chrome 142, so this run's own Playwright verification could exercise the markup, CSS, and typecheck but could NOT confirm the actual hover-triggered open/close firing in this environment — the same category of sandbox-version gap already logged honestly in this catalog's 'Customizable Select' entry, flagged here as unconfirmed rather than asserted working. Degrades with zero risk either way: a non-supporting browser just renders a plain, fully-functional link with an inert `popover="hint"` target that never opens — never broken, never empty. No WebGL, no scroll-jacking. (Vanilla example: live iframe preview + HTML/CSS tabs — hover or Tab-focus the underlined link.)
A card with a real light/dark toggle where every color — background, border, text, the switch, the CTA button, even its hover tint — comes from one `light-dark(<light>, <dark>)` pair per token, read against the element's own `color-scheme` property, instead of a duplicate `--color-light`/`--color-dark` custom-property set or a `[data-theme="dark"]` override block layered on top of the base rules. Flipping the toggle sets `color-scheme: dark` on the card via a plain CSS `:checked` sibling selector on a visually-hidden checkbox (the decades-old 'checkbox hack') — genuinely zero JavaScript, not even a demo-only script tag, a real step further than several of this catalog's own existing toggle-style entries ('Native Dialog Modal', 'View Transition Toggle') which needed at least a little JS. Real, current, sourced via WebSearch, cross-checked across multiple independent queries (MDN's `light-dark()` reference, una.im's 'Modern CSS Theming', pepelsbey.dev's 'Native HTML light and dark color scheme switching', buildmvpfast.com's 'Web Platform Baseline 2026' roundup, and mcss.dev's 'The modern way to implement CSS light/dark themes' — all agreeing on the same mechanism and version numbers): `light-dark()` for color values shipped Chrome/Edge 123, Firefox 120, Safari 17.5 — already Baseline 'Newly available' since May 2024, and tracked to reach Baseline 'Widely available' on 2026-11-13, so by the time this entry is read it may already have crossed that line. `color-mix()` (used here for the CTA's hover tint, nested as `color-mix(in oklch, light-dark(...), light-dark(...))` — functions that resolve to `<color>` can nest inside another color function per CSS Color 5) is further along still: Baseline 'Widely available' since 2023 (Chrome/Edge 111, Firefox 113, Safari 16.2). **A real discrepancy this run's own cross-checking caught, not silently picked past:** one WebSearch summary claimed `light-dark()`'s newer, separate extension to `<image>` values (swapping a background-image/mask by color-scheme, not just colors) had already reached Baseline 'Newly available' across Chrome/Firefox/Safari 27 — a second, more specific query (bram.us's own 'about to support images' piece, dated 2026-03-19, plus the web-platform-dx/developer-signals tracking issue) contradicted that: the image-value extension is only behind a flag in Chromium 148+, lands in Firefox 150 stable around April 2026, and has no Safari date at all. The more specific, version-numbered sources are trusted here; the flattering 'already Baseline' claim is not used, and the image-value extension is logged as a real but not-yet-safe follow-up, not built. **Honest fallback, same house style as the 'Auto-Contrast Color Swatch' entry:** a manually-picked static light-theme look ships as the default rule; a positive `@supports (color: light-dark(#fff,#000))` block (plus a narrower combined query for the `color-mix()` hover tint) overlays the live toggle and computed colors only where supported, hiding the fallback note — a non-supporting browser sees a correct, designer-matched static card, never a broken or half-themed one, and the toggle switch simply doesn't move (still fully keyboard-focusable, just inert, like any other graceful-degradation case in this catalog). No WebGL, no scroll-jacking, no router. (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all — click the switch to flip light/dark.)
A button that opens a real native Popover (the `popover` attribute + `popovertarget`, not a hand-rolled div-and-JS tooltip) which fades and scales in from a true 'before it was even shown' state via `@starting-style`, then reverses the exact same way on close — the browser keeps `display` and the top-layer `overlay` property around for the full transition via `transition-behavior: allow-discrete` instead of yanking the element away mid-animation. Genuinely zero JavaScript: `popovertarget`/`popovertargetaction="hide"` are plain HTML attributes, not event listeners. Real, current, sourced via WebSearch, cross-checked across multiple independent sources (Chrome Developer Blog's 'Four new CSS features for smooth entry and exit animations', web-standards.dev's 'Entry and exit transitions with modern CSS' (2026-06), carmenansio.com's '@starting-style: Animate display:none & height:auto', and alexanderburgos.netlify.app's 'transition-behavior: allow-discrete' writeup — all agreeing on the same mechanism): `@starting-style` plus `transition-behavior: allow-discrete` reached Baseline 'Newly available' together on 2024-08-06 when Firefox 129 shipped (Chrome/Edge had it from 117, Safari from 17.4), and sit around 91% global support per caniuse as of early 2026 — clean, wide-support territory, the same end of the spectrum as this catalog's `light-dark()`/`color-mix()` entry, not the Chromium-only end some older entries sat at. The Popover API itself (`popover`, `popovertarget`, `:popover-open`) is its own, even longer-shipped baseline (Chrome 114, Firefox 125, Safari 17) — this entry's actual new ground is only the entry/exit transition layered on top, not the popover mechanism itself, which this catalog already uses once (see 'Anchor Popover Menu'). **Honest fallback:** without `@starting-style`/`allow-discrete` support the popover still opens and closes correctly — that's native browser behavior, not something this entry adds — it just snaps open/closed instantly instead of fading, same 'never broken, never half-done' bar as every other entry here. No WebGL, no scroll-jacking, no router. (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all — click the button, then Close, and watch it fade+scale both ways.)
A card whose accent color and badge react to a plain custom property on its own wrapper — no JS, no className map, no per-variant component — using CSS container **style** queries: `@container <name> style(--tone: sale){ ... }`. A CMS or template only ever has to set one inline custom property (`style="--tone: sale"`) on the slot wrapping the card; the card's own CSS decides what 'sale' or 'new' looks like. This is the same job the `if()`/`style()` entry in this catalog ('Conditional Status Badge') does for a value on the element itself, but style queries solve the more common real case — a value set on an ANCESTOR, read by its descendants — which `if()`'s self-referencing style query cannot do. **Verified while building this (not shipped on a guess):** a style-query container can only be queried from an element's ancestor, never from the exact same element carrying the custom property — confirmed against the CSS WG's own container-queries spec discussion and MDN's 'Using container size and style queries' guide, which both state plainly that a container currently cannot select itself; a wrapper (`.csv-slot`, `container-type: normal; container-name: csv-slot`) is required around the card for this reason, same structure this demo actually ships. **Real, current, cross-checked support** (not a single-source guess): Chrome/Edge shipped style queries for custom properties from Chrome 111 and Safari from 18 (both per caniuse's `css-container-queries-style` table); Firefox was the last to land it — Mozilla's own Bugzilla bug 2030645 ('Enable container style queries on all channels') is RESOLVED FIXED for Firefox 151, and Firefox 151.0.2/.3 shipped to the stable channel in late May/early June 2026 (per MDN's Firefox 151 release notes and Mozilla's release history) — so all three engines have genuinely carried this in a stable release since around mid-2026, not merely 'on a roadmap'. Treated two SEO-style '2026 tutorial' blog posts that claimed different, suspiciously rounder version numbers (a 'Chrome 148 / Safari 26.5 / Firefox 138' story) as unverified and did not use them — Bugzilla and MDN's own release notes are the primary sources here, and they disagree with that story. **Honest fallback:** a browser that doesn't parse `style()` inside `@container` simply drops that whole conditional block as invalid and keeps the card's plain default styling underneath — same cascade-based safety net as every `if()`/`@container`/`@supports`-guarded entry in this catalog, never a broken or blank card. No WebGL, no scroll-jacking, no router — fits the DIY $999 tier as cleanly as it fits here. (Vanilla example: live iframe preview + HTML/CSS tabs, three card slots side by side — only their wrapper's `--tone` value differs.)
Four tiles, same `border-radius`, four different corner *geometries* — `round` (the only curve `border-radius` alone has ever been able to draw), `squircle`, `bevel`, and `scoop` — all from the new CSS `corner-shape` property, no SVG/clip-path masking, no JS. `border-radius` still sets the SIZE of the corner box; `corner-shape` now independently sets the CURVE drawn inside it. `squircle` is shorthand for `superellipse(2)`, the continuous Apple-style curve (iOS app icons, visionOS panels) that a plain circular arc can only ever approximate — this is the real native primitive behind that now-common 'squircle' look, not a border-radius trick pretending to be one. **Real, current, cross-checked (not a single blog's guess):** MDN's own `corner-shape` and `corner-shape-value` reference pages plus Chrome's engineering blog ('The corner cases of implementing CSS corner-shape in Blink') and its Blink-dev Intent-to-Ship thread agree: shipped stable in Chrome/Edge 139 (2025) and Opera 123+; Firefox and Safari have not shipped it as of this writing (per caniuse and CSS Portal's own property tables, checked this run, not assumed from memory). Spotted as a live 2026 design-trend signal, not invented: an Awwwards inspiration entry ('Squircle footer' by Fiddle.Digital) is already using this exact look. **Honest fallback, verified against spec behavior, not hoped for:** `corner-shape`'s own initial value is `round` — a browser that doesn't parse the property drops every `corner-shape` declaration below at parse time and every tile (including the three non-`round` ones) simply renders as the same plain rounded card underneath, identical to this catalog's other `@supports`/cascade-guarded entries. No WebGL, no scroll-jacking, pure CSS-in-the-cascade — fits the DIY $999 tier as cleanly as it fits here. (Vanilla example: live iframe preview + HTML/CSS tabs, four tiles side by side, labeled by their own `corner-shape` value.)
A swipeable slide carousel with real prev/next arrow buttons and a row of position dots — generated entirely by the browser from plain CSS pseudo-elements (`::scroll-button(left/right)`, `::scroll-marker-group`, `::scroll-marker`), no carousel JS library, no scroll-jacking, no hand-written click handlers. The track itself is an ordinary `overflow-x:auto` list with `scroll-snap-type:x mandatory` — that part has worked in every browser for years; what's new is that the browser can now generate the nav chrome (arrows + dots) FOR that native scroller and keep it in sync with scroll position on its own, including disabling an arrow at either end and lighting up the current dot via `:target-current`, with zero JavaScript. **Real, current, cross-checked across independent primary/engineering sources** (not a single blog's guess): the CSS Working Group's own `css-overflow-5` carousel explainer (drafts.csswg.org) defines the mechanism; Chrome's own engineering blog post 'Carousels with CSS' walks through this exact `scroll-marker-group`/`::scroll-button`/`::scroll-marker` combination; MDN's `scroll-marker-group` reference page independently confirms the same property and currently marks it 'Limited availability' (not yet Baseline). **Honest gap, flagged rather than glossed over:** secondary sources disagree on the exact shipping details — ICS Media and one 2026 roundup both date Chromium support (Chrome/Edge/Opera) to version ~135 (April 2025), while a separate mid-2026 guide claims Safari 19+ also ships it and a third (checked May 2026) says Safari and Firefox still don't. This run's own `WebFetch` to MDN's and Chrome's pages to resolve that conflict at the primary source hit this environment's standing `EGRESS_BLOCKED` proxy block (the same block that stops the ChromeRiver drift check's `WebFetch` to apexflowlabs.com, logged every prior day) — so, like day 27's disputed-version blog claims, the Safari-support claim is treated as unverified and NOT relied on: this entry assumes Chromium-only until confirmed otherwise. **Fallback is safe regardless of which version claim is right:** an unsupported pseudo-element makes its whole CSS rule invalid, so a browser without this feature simply never matches `::scroll-button`/`::scroll-marker` at all — no error, no empty box, just the plain `scroll-snap` track underneath with native touch/trackpad swipe and (per MDN) scrollbar/keyboard scrolling, same 'never broken, never half-done' bar as every other entry here. No WebGL, no scroll-jacking — fits the DIY $999 tier as cleanly as it fits here. (Vanilla example: live iframe preview + HTML/CSS tabs, four color slides; the generated arrows/dots only appear in a Chromium build that implements this feature — Chromium's own feature-detection doc, not this demo, decides that.)
A promo/gift-card coupon with real semicircular bite notches cut into its left and right edges — the classic die-cut ticket-stub look — drawn entirely with the new CSS `clip-path: shape()` function, no SVG mask, no image, no JS. This is a genuinely different capability from the `polygon()` clip-path every site has been able to use for years: `polygon()` can only connect straight lines, so a curved bite out of an edge has always meant an SVG mask or a background-image cutout; `shape()` adds real path commands (`line to`, `arc to ... of <radius> <radius> ccw|cw small|large`, `curve to`, `close`) so the curve is drawn natively in the cascade. Real, current, cross-checked across independent primary/engineering sources (not a single blog's guess): the Chrome for Developers blog post 'Use shape() for responsive clipping' (developer.chrome.com/blog/css-shape, April 2025), web.dev's 'Paths, shapes, clipping, and masking' guide, and MDN's own `<basic-shape>`/`shape()` reference page all describe the same command syntax; MDN's own note states the feature reads as widely available across current browser versions as of February 2026. **Disagreement found and flagged, not glossed over:** the Chrome blog's original support table lists Chrome/Edge 135, Safari 18.4, and Firefox 148; a second independent source (a CSS tooling site's shape()-generator page, and CodePen's own November 2025 CSS challenge write-up) instead places Firefox only in Nightly, not yet shipped in stable, which conflicts with the Chrome blog's Firefox 148 claim — this run could not resolve the conflict at the primary source (MDN's own page is blocked by this environment's standing `EGRESS_BLOCKED` proxy rule, the same block every prior day's entries have hit), so Firefox support is stated as disputed rather than asserted either way; Chrome/Edge 135+ and Safari 18.4+ are the only versions treated as settled this run. **Verified the exact arc direction this run, not assumed from the spec text:** `arc to <point> of <rx> <ry> cw|ccw small|large` is easy to get backwards (the same radius/sweep combination can bite inward or bulge outward depending on the path's winding direction) — confirmed with a real rendered screenshot in this sandbox's pinned Chromium that `ccw small` is the combination that actually cuts a small concave notch into this card's clockwise-wound rectangle on both the left and right edges; `cw small` was tried first and renders no visible notch at all on this same path, so the value in the shipped CSS below is the one actually confirmed working, not the first guess. **Honest fallback, verified against spec behavior:** an unsupported browser treats the whole `clip-path: shape(...)` declaration as invalid and drops it at parse time, leaving `clip-path` at its initial value of `none` — the card just renders as an ordinary rounded-corner-free rectangle with its dashed divider intact, never broken or half-clipped, same cascade-guarded safety as this catalog's `corner-shape` and other bleeding-edge entries. No WebGL, no scroll-jacking, pure CSS-in-the-cascade — fits the DIY $999 tier as cleanly as it fits here, and a notched coupon/gift-card is a directly useful real component for the small local-business sites that tier sells to. Checked for overlap before building: `squircle-corner-shape-tile` uses the unrelated `corner-shape` property (which only reshapes a `border-radius` corner, not an arbitrary edge), and no other entry in this catalog uses `clip-path` at all — this is a genuinely new capability, not a tweak to an existing entry. (Vanilla example: live iframe preview + HTML/CSS tabs.)
A horizontal snap gallery where the card that is actually centered and snapped lights up — full opacity, scaled up, glowing border — the instant it truly settles there, using the CSS `scroll-state(snapped: x)` container query. Every other card in the row stays dimmed and slightly scaled down until the scroller snaps to it. This is the exact 'which slide is active right now' problem that almost every hand-rolled carousel solves with an IntersectionObserver plus a scroll listener plus a JS class toggle (or a library that does the same under the hood) — here the browser's own scroll-snap machinery answers the question directly, with zero JavaScript. Real, current, cross-checked across independent primary/engineering sources (not a single blog's guess): the same Chrome for Developers 'CSS scroll-state() queries' post already cited in this catalog's Sticky Header entry documents `snapped` as one of the three states (`stuck`/`scrollable`/`snapped`) that shipped together, and two more independent write-ups — ICS MEDIA's 'Using CSS @container scroll-state() for sticky headers and scroll effects' and modern-css.com's 'CSS scroll-state() Container Queries: :stuck and :snapped' — both demonstrate `scroll-state(snapped: x)` specifically for highlighting the currently-snapped item in a gallery, the identical use case built here (independently, not copied from either write-up). **Fresh WebSearch run today to re-confirm the version claim rather than reuse the Sticky Header entry's 2026-09 figure unchecked:** caniuse's own `scroll-state_queries_snapped` page lists Chrome 133–152 and Edge 133–149 as supported, with Firefox (through 154) and Safari (26.3–26.5, Technology Preview still unknown) both still unsupported as of this run — same Chromium-only split already on record for `stuck`, now independently re-verified for `snapped` specifically, not assumed to carry over. **Conflict found and resolved the same way this catalog always resolves one:** a third-party 'CSS scroll state query generator' tool claims the feature needs Chrome 135+; that's outweighed by agreement between caniuse and Chrome's own launch post on 133, so 135 is treated as the tool's own error, not a real alternative baseline. **Real adoption found, logged honestly rather than oversold:** this run's search also turned up a published Nintendo Switch home-screen UI recreation that uses `scroll-state()` to detect and highlight the snapped tile — a genuine real-world precedent for this exact pattern — but that build mixes in some JavaScript elsewhere, so it is cited here as evidence the technique is in real use, not as proof a 100%-CSS version like this one already exists elsewhere. **The same spec gotcha already on record in this catalog applies here too, re-confirmed rather than assumed:** the query cannot restyle the snapped container itself, only a descendant — this demo puts `container-type: scroll-state` on each snap-aligned `.ssi-item` and applies the highlight to its child `.ssi-card`, exactly like the Sticky Header entry's `.ssq-stickwrap`/`.ssq-bar` split. **Honest, safe fallback:** a browser without this feature never matches `@container scroll-state(...)` at all (the whole rule is simply ignored), so this demo's `@supports not (container-type: scroll-state)` block removes the dimming/scaling and shows every card at full opacity — a perfectly usable plain snap-scroll row, never a broken or half-highlighted one. Pure CSS, no WebGL, no scroll-jacking (the user's own scroll/swipe drives it, nothing hijacks the scroll position) — fits the DIY $999 tier's constraint as cleanly as it fits here. Checked for overlap before building: `css-native-carousel` and `scroll-marker-carousel` both generate browser-native prev/next arrows and position dots via `::scroll-button`/`::scroll-marker`, a different mechanism entirely (nav chrome generation, not active-item detection), and `sticky-header-scroll-state` uses the `stuck` state, not `snapped` — genuinely a new technique, not a tweak to an existing entry. (Vanilla example: live iframe preview + HTML/CSS tabs — scroll the row; the centered card is the one the CSS itself knows is snapped.)
A heading/body type scale that resizes smoothly between a phone width and a desktop width — the well-established 'fluid typography' clamp() formula (Smashing Magazine's 'Modern Fluid Typography Using CSS Clamp' technique, in wide production use for years), but instead of hand-copying that same three-line clamp() math into every heading rule, it's written ONCE as a real, reusable CSS function — `@function --fluid-size(--min, --max, --min-vw: 400px, --max-vw: 1200px) returns <length> { result: clamp(...) }` — and every heading just calls `--fluid-size(1.75rem, 3.25rem)`. This is the actual new part for 2025/2026: native custom CSS functions (the `@function` at-rule), not the decades-old clamp() trick itself. **Real, current, cross-checked across independent sources** (not a single blog's guess): Chrome's own engineering blog post 'Delaying shipping of CSS @function from Chrome 136 to 139' (developer.chrome.com/blog/delaying-shipping-of-css-functions) confirms Chrome's Intent-to-Ship was pushed from 136 to 139 for extra spec-stability testing; a second, independent source (root.cz's 'Novinka v Chrome 139: vlastní CSS funkce', August 2025) confirms it actually landed, unflagged, in Chrome 139; a third independent source (a DEV Community write-up on the @function rule) agrees on Chrome 139 (May 2025) and states Firefox and Safari have not shipped it. MDN's own `@function` at-rule reference page (checked via WebSearch snippet, not a direct fetch — see note below) marks the feature 'Experimental' and explicitly NOT Baseline because it doesn't yet work in multiple major engines. The exact function syntax used here (typed/defaulted parameters, a `result:` descriptor, an optional `returns <type>`) was cross-checked against three independent syntax write-ups that all agree on the same shape: the CSS-Tricks Almanac's `@function` entry (`--double(--x)`, a typed `--half(--size <length>)`, and a `--progression(...) returns <percentage>` example), a Verpex engineering blog walkthrough, and a DEV Community ('Custom Functions in CSS') article — not taken from a single source. **Honest access gap, stated plainly:** this run's own direct `WebFetch` calls to developer.chrome.com, developer.mozilla.org, caniuse.com, and verpex.com all failed outright with `ENOTFOUND` from this sandbox's standing egress block (the same block every prior day's log has hit against apexflowlabs.com and MDN) — every citation above came from `WebSearch` result snippets of those pages, cross-checked against each other for agreement, never from reading a primary source directly in this run. **Fit check:** zero JavaScript, zero WebGL, zero scroll-jacking — fits the DIY $999 tier's constraints as cleanly as it fits here (still nothing to add it to there — `docs/diy-website-style-catalog.md` remains missing, see this run's repo-state note). **Fallback, by the same cascade rule this catalog already uses for `if()`:** an unsupporting browser treats the whole `--fluid-size(...)` value as invalid at parse time and drops it with no built-in fallback of its own, so every rule below declares a plain static `font-size` FIRST and the function-based override SECOND — the cascade keeps the static size on any browser that doesn't recognize the function, never a missing or broken heading. (Vanilla example: live iframe preview + HTML/CSS tabs — resize your browser window to see the headline and body copy scale smoothly between the two breakpoints baked into the function call.)
A grid of cards that fades/slides in with a staggered per-card delay — the classic 'list items cascade in one after another' entrance every site either hand-writes as a chain of `:nth-child(1)`, `:nth-child(2)`... delay rules (breaks the moment the item count changes) or reaches for a JS stagger helper (GSAP's `stagger`, Framer Motion's `staggerChildren`) to do. Here the delay is computed directly in the cascade with the new CSS `sibling-index()` function — `animation-delay: calc((sibling-index() - 1) * 90ms)` — so it automatically adapts to however many cards are actually in the grid, no JS, no per-item rule. Real, current (2025/2026), cross-checked across independent sources (not a single blog's guess): the Chromium 'Intent to Ship: CSS sibling-index() and sibling-count()' thread (groups.google.com/a/chromium.org/g/blink-dev) targeted milestone 138, and Chrome's own 138 release notes (developer.chrome.com/release-notes/138) list it as shipped; two independent write-ups — Frontend Masters' 'Staggered Animation with CSS sibling-* Functions' and OpenReplay's 'Staggered animations with sibling-index() instead of :nth-child()' (also read via its translated DE/ES/PT/FR mirrors, all agreeing) — both demonstrate the exact `calc((sibling-index() - 1) * <unit>)` pattern used here, independently of each other. **Disagreement found and flagged, not glossed over:** SitePoint's write-up states Chrome 137, which conflicts with Chrome's own 138 release notes and the Intent-to-Ship thread's own target milestone — 138 is treated as correct here since it comes from two independent primary-adjacent sources (Chrome's own release notes + the Intent-to-Ship thread) against SitePoint's one. **Cross-engine status, also flagged as less certain:** OpenReplay (and its own translated mirrors, cross-checked for agreement) states Safari shipped it in 26.2 (December 2025) and Firefox in 154 (August 2026), which — if accurate — would make this catalog's first genuinely cross-browser 'bleeding edge' entry rather than a Chromium-only one; but a `jquery.app` tool page claims Firefox/Safari still lack it as of May 2026 (older than OpenReplay's claim, so more likely stale, but this run could not resolve the conflict at a primary source — MDN and caniuse were both blocked by this sandbox's standing `ENOTFOUND` egress block, the same gap recorded against every prior day's entries). Treated here as 'Chrome/Edge 138+ confirmed, Safari 26.2+/Firefox 154+ reported but not independently primary-sourced this run' — stated honestly rather than asserted as settled. **Honest, safe fallback, verified in this run's own pinned Chromium (141.0.7390.37, comfortably past the 138 baseline):** `@supports not (top: calc(1px * sibling-index()))` catches any engine that can't parse the function at all and zeroes the delay, so every card just fades in together at once instead of staggering — never broken, never stuck invisible, never out of order. No WebGL, no scroll-jacking, zero JS — fits the DIY $999 tier's constraint as cleanly as it fits here, and a staggered card/feature grid is a directly useful, commonly-requested real component for small-business sites. Checked for overlap before building: `css-grid-lanes-masonry` only affects grid *placement* (`grid-template-rows: masonry`), not entrance timing, and no other entry in this catalog uses `sibling-index()`/`sibling-count()` or computes a per-item stagger natively — genuinely new ground, not a tweak to an existing entry. (Vanilla example: live iframe preview + HTML/CSS tabs — reload the preview to watch the six cards cascade in, each one firing exactly 90ms after the last.)
Fixes a real, common accessibility bug — a visually-rearranged CSS Grid (a 'featured' card placed big and first, with the rest auto-flowing around it via grid-column/grid-row) whose keyboard Tab order still silently follows plain DOM order, so a keyboard or screen-reader user tabs through two unrelated links *before* ever reaching the card that's visually first on the page. This has always been the quiet cost of using grid/flex to reorder content: DOM order (good for source/SEO) and visual order (good for layout) diverge, and until now nothing closed that gap except a JS-driven aria-owns rewrite or just not visually reordering at all. The new CSS `reading-flow` property closes it declaratively: `reading-flow: grid-rows` on the grid container makes Tab/Shift+Tab (and screen-reader linear navigation) follow the real visual row-by-row order instead of source order — here that changes the tab sequence from Overview→Pricing→Featured→FAQ→Contact (DOM order) to the correct Featured→Overview→Pricing→FAQ→Contact (visual order, since Featured spans the top-left 2×2 area). Real, current, primary-sourced this run (not a single blog's guess): fetched directly off this sandbox's standing `ENOTFOUND` egress block via Firecrawl's own fetch infrastructure (same workaround this catalog has used since day 29) — Chrome for Developers' own blog post 'Use CSS reading-flow for logical sequential focus navigation' (developer.chrome.com/blog/reading-flow, published 2025-05-01, byline Di Zhang + Rachel Andrew) states `reading-flow` and its companion `reading-order` property shipped in Chrome 137, and a second primary source, MDN's own `reading-flow` reference page (last modified 2026-04-20, fetched fresh this run), gives the exact current cross-browser matrix used here rather than a stale or rounded-up one: Chrome/Edge/Opera 137+, Chrome Android 137, Opera Android 90, Samsung Browser 30, and Android WebView 137 all show 'Full support'; Firefox (desktop + Android) and Safari (desktop + iOS + WebView-on-iOS) both show 'No support' as of that same fetch. MDN also still tags the property 'Experimental' / not yet Baseline. Treated here exactly as those two primary sources state it — a genuinely real, shipped, current (2025/2026) feature, but Chromium-only today, not asserted as cross-browser. **Honest fallback, not glossed over:** `reading-flow` has no feature-detectable `@supports` fallback that changes anything, because nothing breaks either way — a non-supporting browser (Firefox, Safari today) renders the exact same visual grid and simply keeps the pre-existing DOM-order tab sequence, i.e. today's ordinary (imperfect but not broken) behavior most sites already ship; this entry's own fallback note, shown only via `@supports not (reading-flow: grid-rows)`, says exactly that rather than claiming a fix that isn't there for those browsers. Checked for overlap before building: no existing entry in this catalog sets `reading-flow` or `reading-order`, and this is the first entry whose subject is keyboard/screen-reader navigation order rather than a visual or motion effect — genuinely new ground, not a tweak to `css-grid-lanes-masonry` or any other grid entry. **DIY $999 tier — real, strong fit, arguably more so than most entries here:** pure CSS, zero JS, no WebGL, no scroll-jacking, and it's a legitimate accessibility fix (not just a visual flourish) for the exact kind of 'featured item in a grid' layout that small-business marketing/pricing pages use constantly — but it can't actually be added to `docs/diy-website-style-catalog.md` this run; that doc is still missing (see this run's §0 repo-state check). (Vanilla example: live iframe preview + HTML/CSS tabs — click into the preview and press Tab repeatedly to feel the fixed order; the HTML tab's link order is left as plain, sensible source order on purpose, since reading-flow is meant to let authors keep that and still reorder visually.)
A tooltip that flips from below its trigger to above when it would overflow — and its arrow flips with it, both in pure CSS, no ResizeObserver/Floating-UI JS. `position-try-fallbacks:flip-block` (already Baseline — MDN's own compat table, fetched fresh this run, shows Full support at Chrome/Edge 128, Firefox 147, Safari 26, Opera 114) has handled the repositioning itself since this catalog's `anchor-popover-menu` entry. The genuinely new layer here is `container-type:anchored` + `@container anchored(fallback: flip-block){...}` — **CSS Anchored Fallback Container Queries**, which for the first time lets a stylesheet detect WHICH fallback position the browser actually chose and restyle a descendant (the arrow) to match, with zero JS. **Real, current, primary-sourced:** Chrome for Developers' own blog post 'Detect fallback positions with anchored container queries from Chrome 143' (developer.chrome.com/blog/anchored-container-queries, published 2025-10-29, byline Una Kravets, a Chrome standards/DevRel engineer) — fetched fresh this run via Firecrawl (this sandbox's standing `ENOTFOUND` egress block hit `developer.mozilla.org` directly again, identically to every prior day). A second independent primary source, chromestatus.com's own feature-tracker page (feature 5177580990496768), confirms the exact shipping milestone and — just as importantly — the real cross-engine gap: Chrome/Edge/Android/WebView 143 'Shipping', while both Firefox's and WebKit's own standards-positions trackers read **'No signal'** (no committed position either way, as of this run) — this is Chromium-only today, not rounded up to Baseline or 'coming soon everywhere.' The underlying web-features tracking issue (#3403) was closed without the feature being adopted as a tracked Baseline entry, so there is no Baseline timeline to cite here at all — stated as genuinely open-ended, not estimated. **Honest fallback, not glossed over:** without `container-type:anchored` support, the `@container anchored(...)` block simply never matches, so the arrow keeps pointing its default direction even on the (correctly, separately) flipped tooltip — a cosmetic imperfection, never a broken layout, exactly as the Chrome blog's own demo caveats it. Pure CSS, no WebGL, no scroll-jacking — fits the DIY $999 tier as cleanly as `anchor-popover-menu` does. (Vanilla example: live iframe preview + HTML/CSS tabs — scroll the demo box and hover the button near the bottom edge to watch both the position and the arrow flip.)
Native divider lines drawn directly in a grid's gaps — column-rule and a brand-new row-rule property style the gutters between grid/flex cells with real CSS lines (color, width, style, even per-gap cycling via comma lists and repeat()), instead of the decades-old workaround of faking dividers with borders or box-shadows on the cells themselves (which always risks doubled lines at shared edges, or extra JS to strip the last cell's border). This extends column-rule — previously usable only inside legacy multi-column (`columns:`) layouts — to Grid and Flexbox for the first time, and introduces row-rule as its new horizontal-gap counterpart. Real, current (2026), cross-checked across multiple independent sources (not a single blog's guess, though this run's usual primary-fetch workaround was degraded — see below): Chrome for Developers' own posts 'A new way to style gaps in CSS' (the original explainer) and 'Gap decorations: Now available in Chromium' (the stable-ship announcement) both describe exactly this column-rule/row-rule mechanism; a second independent source, the Microsoft Edge Explainers repo's own 'CSS Gap Decorations' explainer (github.com/MicrosoftEdge/MSEdgeExplainers), corroborates the same property set and the repeat()/comma-list per-gap cycling syntax; MDN's own reference pages for row-rule-style/row-rule-color (title confirmed via search, not fetched in full this run — see honesty note below) independently show the same shorthand/longhand split. **Shipping status, stated plainly rather than rounded up:** Chrome and Edge 149 (stable, June 2026) ship it on by default, no flag; Firefox's standards-position is reported positive with an open implementation bug, meaning intent-to-support but not yet shipped; Safari/WebKit has no committed position yet (also an open but unresolved implementation bug) — this is a Chromium-only-today feature, not Baseline, not claimed as cross-browser. **Honesty note on this run's own sourcing limits:** this catalog's usual Firecrawl-based direct-fetch workaround for MDN/chromestatus.com (used since day 29 to route around this sandbox's standing `ENOTFOUND` egress block on those domains) was unavailable this run — the connected Firecrawl account returned 'insufficient credits' on every call attempted. Direct WebFetch to developer.chrome.com, developer.mozilla.org, and caniuse.com all hit the same `ENOTFOUND` block as every prior day, with no working bypass available this run (the Vercel-URL fetch workaround only reaches Vercel-hosted deployments, not these doc sites). So this entry's sourcing rests on WebSearch's own result aggregation (multiple independently-returned, mutually-agreeing page titles/snippets from developer.chrome.com, MDN, the Microsoft Edge explainer, and caniuse-mirroring sites) rather than a full primary-source page fetch — a real degradation from this routine's usual bar, logged honestly rather than silently passed off as a normal Firecrawl-verified day. Checked for overlap before building: no existing entry in this catalog sets column-rule, row-rule, or any gap-styling property — css-grid-lanes-masonry only controls packing, sibling-index-stagger-grid and reading-flow-accessible-grid only control animation timing and tab order — genuinely new ground. **Honest, safe fallback, verified in this run's own pinned Chromium (141.0.7390.37, below the 149 baseline — CSS.supports('row-rule-style','solid') confirms false in this sandbox, exactly as expected):** `@supports not (row-rule-style: solid)` applies plain `border-left`/`border-top` divider lines on the cells instead, approximating the same visual division (not the exact per-gap color cycling, which needs the real feature) so the grid never looks broken, doubled-up, or undivided in a non-supporting browser. No WebGL, no scroll-jacking, zero JS — fits the DIY $999 tier as cleanly as any CSS-only entry here. (Vanilla example: live iframe preview + HTML/CSS tabs.)
A decorative scatter of drifting dots behind a hero/card — position, size, and animation delay all drawn natively by the browser's own new random() CSS math function, not JavaScript's Math.random(). Real, current (2026), sourced this run via WebSearch aggregation (this routine's usual Firecrawl-based direct-fetch workaround for primary docs was unavailable again today — see the honesty note below): WebKit's own blog post 'WebKit Features for Safari 26.2' is the primary source found, confirming random() shipped in that release alongside sibling-index()/sibling-count() (already in this catalog's sibling-index-stagger-grid entry, independent corroboration that this catalog's sourcing on that earlier entry was accurate) — its own example, random(0, 100, 2), draws an even number from 0 to 100. A second WebKit post, 'WebKit Features for Safari 26.5', confirms the spec is still actively moving: named/cached random values changed from per-element-by-default to global-by-default after 26.2 shipped, with an element-scoped keyword added to opt back into per-element randomness. Cross-checked against the W3C's own CSS Values and Units Module Level 5 draft (which uses a differently-named per-element keyword) and MDN's reference page (title/support-summary confirmed via search — MDN marks it explicitly NOT Baseline, 'limited availability', because it doesn't work in most widely-used browsers) — multiple independent sources agree only Safari (26.2+) ships any form of random() in a stable release; Chrome/Chromium and Firefox have NOT shipped it (one low-quality aggregator's claim of 'Chrome/Firefox preview builds' support was checked against chromestatus-style sources and could not be corroborated, so it is explicitly not asserted here). **Because the named-value caching keyword itself disagrees across sources (per-element vs. element-scoped) and could still change before wider implementation, this demo deliberately uses only the uncontested, WebKit-blog-confirmed basic three-argument form — random(min, max, step) — called as a fresh, independently-evaluated expression in its own dedicated nth-child rule per dot, never the disputed named/shared-cache syntax**, so nothing here rests on a detail still in flux. A genuinely useful property beyond 'it's new': because this evaluates natively in the browser's own layout engine rather than in JavaScript during render, it sidesteps the classic React/Next.js server-vs-client hydration-mismatch warning that hand-rolled Math.random() decorative positioning causes in this very stack — a real, concrete win for a codebase already careful about SSR. Checked for overlap before building: grepped this whole catalog for 'random(' outside of the unrelated Math.random() call already used inside the existing Scramble Text component's JS — zero matches; genuinely new ground, no existing entry draws any native CSS random value. **Honest, safe fallback — verified in this run's own pinned Chromium (141.0.7390.37), which does not implement random() in any form, exactly as expected from the Safari-only shipping status above:** `@supports not (top: random(0%, 1%, 1%))` applies a fixed, hand-placed (non-random, clearly deterministic) scatter layout instead, so a non-supporting browser still shows a full, intentional-looking dot field rather than a pile of dots stacked at 0,0 or an empty box. Zero JS, zero WebGL, zero scroll-jacking — this is as light as any CSS-only entry in this catalog, and the fit-check below notes it would suit the (still-missing, see this log's standing day-3 finding) DIY $999 catalog doc too, not just Apex Motion. (Vanilla example: live iframe preview + HTML/CSS tabs.)
A badge that fades/slides in when you scroll it into view, then plays back out if you scroll back past it — a genuinely new CSS primitive, animation-trigger + timeline-trigger, not the animation-timeline: view()/scroll() continuous-progress link already in this catalog's view-timeline-reveal and scroll-progress-rail entries. The difference matters: animation-timeline scrubs an animation's progress directly to scroll/view position (good for progress bars and parallax), while animation-trigger ties a normal, already-defined keyframe animation to a named timeline-trigger that just calls play-forwards once a scroll/view condition is crossed and play-backwards once it's exited — a declarative on/off toggle, the CSS-native replacement for an IntersectionObserver callback that adds/removes a class. Checked for overlap before building: grepped this whole catalog for 'animation-trigger' and 'timeline-trigger' — zero existing matches (only the unrelated animation-timeline/scroll-timeline property family appears); genuinely new ground. Sourced this run from Chrome's own developer blog post 'Scroll triggered animations' (dated 2025-12-12, found via WebSearch aggregation — Firecrawl's firecrawl_scrape returned the same 'Insufficient credits' error as the last two runs, 3rd day running now, and a direct WebFetch to developer.chrome.com hit this sandbox's standing ENOTFOUND egress block, so this rests on WebSearch's own cross-checked snippets, not a full primary-source fetch, same tooling gap as recent prior days): it documents animation-trigger (e.g. `animation-trigger: --t play-forwards play-backwards;` on an element that already has a normal `animation:` declared) plus timeline-trigger-name/timeline-trigger-source (`timeline-trigger-source: view();`) to define the named trigger's source, and says the feature lands 'in Chrome 145.' Cross-checked, not taken on one source's word: caniuse's own mdn-css_properties_animation-trigger page (also via WebSearch, same tooling gap) gives a different version than the blog — Chrome/Edge listed unsupported through 145 and supported only from Chrome/Edge 146, Opera from 131; a real, open discrepancy with the blog's own '145' claim, stated plainly rather than picked arbitrarily (Chrome 145 itself is independently confirmed to have reached stable on 2026-02-10 per Google's own Chrome Releases post and a corroborating HelenTech report, so the discrepancy is specifically about animation-trigger's own support window, not about whether 145 shipped at all). Firefox is listed as unsupported from version 2 through 156 on that same caniuse page — not just behind a flag like the older animation-timeline feature, genuinely unimplemented; Safari and Safari iOS are unsupported through 26/26.5, with Safari Technology Preview marked 'support unknown.' modern-css.com's own reference page (via WebSearch) calls animation-trigger explicitly experimental and not Baseline, advising a fallback before production use. Shipping status stated plainly: Chromium-only today (Chrome/Edge 146+, Opera 131+), and narrower than this catalog's existing animation-timeline entries, which at least Safari has shipped — Firefox and Safari support neither the forward/backward trigger action nor, for Safari, even behind a flag. Zero JS, zero WebGL, zero scroll-jacking: like this catalog's other scroll-linked entries, it never calls preventDefault or touches scroll position, only reads it — native scrolling, touch, trackpad, and keyboard all behave exactly as normal. (Vanilla example: live iframe preview + HTML/CSS tabs — scroll inside the box, then scroll back up.)
A classic pointed price/sale tag shape (the 'tag with a notch on the left' silhouette) with every corner — including the point — evenly rounded, drawn with a single `clip-path: polygon(round <length>, ...)` declaration and nothing else: no SVG, no image, no hand-rolled Bezier math. This is a genuinely new capability, not a tweak to this catalog's existing shape entries: `polygon()` has connected straight lines for years but every corner has always come out sharp; getting a *rounded* corner on an arbitrary (non-rectangular, non-4-sided) polygon has always meant either an SVG `path`/mask or approximating the curve by hand with several extra points, because plain CSS `border-radius` only works on a box's own 4 corners, not on clip-path vertices. The new `round` keyword fixes that: one radius value after `round` rounds every vertex of the polygon uniformly, in the cascade. **Real, current, cross-checked across independent sources** (not a single blog's guess): Chrome's own 'Chrome 150' release notes and its earlier 'Chrome 150 beta' post (developer.chrome.com, via `WebSearch` aggregation — this run's own direct `WebFetch` to developer.chrome.com hit this sandbox's standing `ENOTFOUND` egress block, the same block every prior day's entries have logged, so this rests on cross-checked `WebSearch` snippets, not a direct primary-source read) list the optional polygon() corner-rounding parameter under Chrome 150's CSS/UI changes, stable 2026-06-30/07-01; Microsoft's own Edge 150 web-platform release notes independently corroborate the same feature landing in Edge 150; MDN's `polygon()` CSS function reference page documents the exact syntax used here — a `round <length>` clause before the vertex list, e.g. `polygon(round 20px, 0% 0%, 50% 50%, 0% 100%)`. **Honest gap, stated plainly:** a third independent source (css-tip.com's 'A New Way to Round the Corners of CSS Shapes', checked via WebSearch) calls the feature Chromium-only for now and flags that Firefox/Safari support should be checked before relying on it — this run could not reach caniuse.com directly (same egress block) to pin exact non-Chromium version numbers, so Firefox/Safari are treated as unconfirmed rather than asserted either way; a related `web-features` tracker GitHub issue (web-platform-dx/web-features#4429) independently confirms the feature is new enough that the community's own browser-support tracker doesn't yet have a dedicated entry for it (it's presently folded into the unrelated `shape-function` entry for `shape()`). Checked for overlap before building: `shape-notch-coupon-card` (day 30) uses the different `clip-path: shape()` function with explicit `arc to` commands to cut curved notches INTO a rectangle's straight edges; `squircle-corner-shape-tile` uses the unrelated `corner-shape` box property, which only reshapes a `border-radius` corner and cannot round an arbitrary polygon vertex at all; no existing entry uses `polygon(round ...)` — genuinely new ground. **Honest fallback, verified against spec behavior, same cascade-guarded pattern this catalog always uses:** a parser that doesn't recognize the `round` keyword inside `polygon()` treats the whole function as an invalid value and drops the `clip-path` declaration entirely, leaving `clip-path` at its initial value of `none` — the tag then just renders as its underlying rounded-rectangle div (see fallback CSS below) rather than a broken or half-clipped shape. Zero JS, zero WebGL, zero scroll-jacking, pure CSS-in-the-cascade — fits the DIY $999 tier as cleanly as it fits here, and a sale/price tag is a directly useful, generic real component for the small local-business/e-commerce sites that tier sells to. (Vanilla example: live iframe preview + HTML/CSS tabs.)
A custom 'select' trigger-and-options popover whose options panel always renders at EXACTLY the trigger's own rendered width — even though the trigger's width is intrinsic (sized by its own text content, not a fixed or wrapper-relative value) — using the CSS `anchor-size()` function: `width: anchor-size(width)` on the popover, resolved against the trigger via `position-anchor`. This is genuinely new ground for this catalog: 'Anchor Popover Menu' (an earlier entry) already uses anchor positioning for PLACEMENT (`anchor(bottom)`/`anchor(left)`) but gives its menu a plain fixed `min-width`, never tying its SIZE to the trigger; `anchor-size()` is a different function in the same spec family that solves the size half of the problem, and is checked for overlap here for the first time. **Why this actually needed a new browser primitive, not just existing CSS, stated precisely rather than hand-waved:** the classic workaround — a `position:relative` wrapper around the trigger, with the popover `position:absolute; width:100%` — does genuinely match an intrinsically-sized trigger's width today (the wrapper shrinks to the trigger's content width, so `100%` inherits it), but it only works as long as the popover stays `position:absolute` inside that wrapper; the moment the popover needs `position:fixed` instead (routed to the top layer, so it can escape being visually clipped by any `overflow:hidden`/scrolling ancestor between it and the viewport — a common real problem for a dropdown opened from inside a card, table row, or modal), `width:100%` stops resolving against the trigger at all and instead resolves against the viewport, breaking the match. `anchor-size()` is specifically what lets a `position:fixed`, top-layer, clip-proof popover still track an arbitrary other element's rendered width — previously only achievable with JavaScript (`ResizeObserver`/`getBoundingClientRect()`), now pure CSS. **Real, current, cross-checked across independent sources, not a single blog's guess:** MDN's own `anchor-size()` reference page states the feature reached Baseline 'Newly available' in January 2026; caniuse's `mdn-css_types_anchor-size` compatibility table (checked today via WebSearch, this sandbox's direct WebFetch to caniuse.com blocked by the same standing `ENOTFOUND` egress policy logged every prior day) independently agrees on the same rollout: Chrome/Edge 125+, Firefox 147+, Safari 26.0+ — all three engines, not Chromium-only, a notably wider baseline than most of this catalog's recent entries. This cross-checks cleanly against this catalog's own 'Anchor Popover Menu' entry, which already recorded Firefox 147 unflagging the broader anchor-positioning feature in January 2026 — same month, same shipping wave, independently corroborated rather than assumed to carry over automatically from one sub-feature to another. **A real bug this run's own verification caught, in this very fallback design, before it ever shipped — the honest reason the fallback here looks different from the ancestor-relative trick a first draft would reach for:** a first implementation of this entry's fallback used the obvious-looking `position:relative` wrapper + `position:absolute; width:100%` trick (the same shape of fallback this catalog's existing 'Anchor Popover Menu' entry already claims as its own non-anchor fallback). A real headless-Chromium render test of THAT draft — opening the popover and measuring both elements' actual bounding boxes, not just reading the CSS and assuming it works — showed it does **not** work: the popover rendered at `x:0` stretched to the full 1280px viewport width, nowhere near the ~135px trigger. Reason, confirmed by isolating it (tested with and without resetting the Popover API's own UA-stylesheet `inset`/`margin` defaults, same result both times): once `showPopover()` promotes an element into the top layer, its containing block for `position:absolute` is the initial containing block (the viewport), not its nearest positioned DOM ancestor — a real, reproducible top-layer quirk, not this run's misconfiguration. **That finding means this catalog's existing 'Anchor Popover Menu' entry's own claimed fallback is itself inaccurate**, flagged here as new accuracy drift found this run (distinct from the standing `site-effects.ts`/ChromeRiver items tracked in §0): its prose asserts the non-anchor path 'falls back to a plain position: absolute dropdown' that 'remains correct defensive code,' but the identical fallback CSS, tested the same way just now, renders its menu off in the corner of the viewport, not under its button — a real, previously uncaught bug in that entry's own fallback claim, not a hypothetical one. Not fixed in that entry in this run (today's time went to verifying and correctly building this new entry rather than re-opening and re-verifying a different one; flagged here plainly rather than silently left for someone else to rediscover) — in practice the risk is low today since anchor positioning itself is now Baseline across Chrome/Edge 125+, Firefox 147+, and Safari 26+ per the cross-check above, so a real visitor hitting that entry's broken fallback path requires an unusually old browser, but 'low practical risk' is not the same as 'the claim was true,' and it wasn't. **This entry's own actual, tested fallback, stated honestly:** rather than repeat that same broken trick, the unsupported-browser path here deliberately does NOT try to fake position-under-trigger or width-matching without the real primitive — it leaves the Popover API's own UA-default centered placement in effect (a static, safe `240px` width, no custom `position`/`inset` override), so an unsupporting browser gets a plainly visible, centered options panel instead of a silently mis-anchored or viewport-stretched one; `anchor-size()` support is verified (not merely declared) to be required before any anchored position/size CSS applies, via `@supports (anchor-name: --a) and (width: anchor-size(width))`. No WebGL, no scroll-jacking, zero JavaScript either way — fits the DIY $999 tier as cleanly as it fits here. **Verification performed this run:** this sandbox's own pinned Chromium (141.0.7390.37) is already past the 125 threshold, so — unlike several recent entries that had to flag an unconfirmed sandbox-version gap — this run could and did confirm the final, fixed behavior directly with real headless-Chromium render tests (not just a typecheck): with the trigger given a short, intrinsic-width label, the options popover opened via `showPopover()`, and both elements' actual rendered bounding-box widths measured and confirmed matching to the pixel (0px difference) after also catching and fixing a second, smaller bug the same way — `width: anchor-size(width)` without `box-sizing: border-box` on the popover left a 14px mismatch (the popover's own padding+border were being added on top of the anchor-matched content width) — then repeated with a much longer label and confirmed the popover's width tracked the new, larger intrinsic width exactly, with no JavaScript involved in the sizing itself. The corrected fallback was verified separately: with the anchor-positioning `@supports` block removed to simulate an unsupporting engine, the popover renders centered at its static 240px width rather than off in a viewport corner. (Vanilla example: live iframe preview + HTML/CSS tabs — click the trigger.)
Gives this catalog's own native CSS carousel's dot markers real WAI-ARIA Tabs semantics — arrow-key navigation between dots as a single Tab stop, instead of each dot being its own separate sequential Tab stop — using the `tabs` keyword newly added to the `scroll-marker-group` property: `scroll-marker-group: after tabs` (full syntax: `none | [ [ before | after ] || [ links | tabs ] ]`, so placement and mode compose independently). This is a genuinely separate half of the `::scroll-marker-group`/`::scroll-marker` mechanism this catalog's existing 'CSS-Native Carousel' entry already uses for its arrows+dots: that entry sets plain `scroll-marker-group: after` (placement only, implicitly the default `links` mode) and never requests `tabs` mode — a distinct keyword value, checked for overlap here for the first time. **Real, current, cross-checked across independent sources** (not a single blog's guess): the Chromium team's own 'Intent to Ship: CSS scroll-marker-group modes' thread (blink-dev, dated July 2026) describes exactly this links/tabs split, explicitly modeled on the WAI-ARIA Tabs pattern — `::scroll-marker-group` takes the `tablist` role and each `::scroll-marker` takes the `tab` role in `tabs` mode, vs. `navigation`/`link` in the default `links` mode; Chrome's own Chrome 154 release notes (stable channel shipped 2026-09-22, checked via WebSearch aggregation — this run's direct WebFetch to developer.chrome.com hit this sandbox's standing ENOTFOUND egress block, the same block logged every prior day, and the usual Firecrawl fetch workaround returned 'insufficient credits' on every attempt this run, a repeat of day 36's same gap) lists this scroll-marker-group two-mode change under its CSS/UI section; MDN's own scroll-marker-group reference page independently describes the same links/tabs split (also checked via WebSearch only, same access gap). **Cross-browser status, stated plainly:** caniuse's `mdn-css_properties_scroll-marker-group` table (checked via WebSearch) shows the base property shipping Chrome/Edge 135+ with Firefox and Safari both still unsupported — Chromium-only today, same footprint this catalog's existing carousel entry already discloses for the base mechanism, and the newer `tabs` keyword rides on that same footprint. **Verification performed this run, and an honest limit on what it could confirm:** this sandbox's pinned Chromium (141.0.7390.37) is well below the Chrome 154 stable baseline this mode-split feature shipped in, so a real headless-Chromium accessibility-tree check (not just reading the CSS) was run to see how far this build has actually gotten: `CSS.supports('scroll-marker-group','after tabs')` returns `true` (the keyword already parses), and a real accessibility-tree snapshot of a live rendered carousel shows `::scroll-marker-group`/`::scroll-marker` already producing `tablist`/`tab` roles today. But testing the plain default (`scroll-marker-group: after` — the exact value this catalog's own existing carousel entry ships) and the explicit `scroll-marker-group: after links` value side-by-side with `after tabs` produced the IDENTICAL `tablist`/`tab` roles in this sandbox — meaning this specific Chromium build has not yet implemented the links/tabs role split the spec and sources describe; it already defaults every scroll-marker-group carousel to tab semantics regardless of which mode keyword is requested or omitted. That is a real, reproducible, verified-today finding about this sandbox's current engine state, not a fabricated 'it works' claim — stated honestly rather than claimed as a confirmed behavioral difference this run did not actually observe. As a related nuance (not a contradicted claim, since that entry never asserts a specific ARIA role): this same check means this catalog's existing 'CSS-Native Carousel' entry's dots are already getting `tablist`/`tab` roles in any Chromium build at this version or rollout stage too, not a plain unstyled list of dots. **Why build it anyway, stated honestly:** the `tabs` keyword is real, current, sourced CSS, not speculative — explicitly requesting it is the forward-compatible, correct choice once engines actually differentiate the two modes (already true in current stable Chrome 154 per its own release notes, just not yet in this sandbox's older pinned build); shipping `after tabs` now costs nothing and is strictly more correct than the base entry's bare `after`. **Fallback, verified safe the same way the base carousel entry's is:** wrapped in the same `@supports (scroll-marker-group: after)` guard this catalog already uses — an engine that doesn't parse the property at all skips the whole block and falls back to the plain `scroll-snap` track with native swipe/scroll, never a broken or empty carousel. No WebGL, no scroll-jacking, zero JS — fits the DIY $999 tier exactly as cleanly as the base carousel entry it extends (though it can't actually be added to `docs/diy-website-style-catalog.md` this run; that doc is still missing — see this run's log entry). Checked for overlap before building: no other entry in this catalog sets a `scroll-marker-group` mode keyword — 'CSS-Native Carousel' only ever sets bare placement — genuinely new, narrow ground. **Render-checked this run** (real headless Chromium, not a guess): all three slides render at the correct size and position, the track scrolls and snaps, and the generated marker dots render and light up the current slide via `:target-current`. (Vanilla example: live iframe preview + HTML/CSS tabs — swipe or use the dots; the dots are real `tab`-role stops once your browser differentiates the mode, same plain dots either way visually.)
A removable filter/amenity-chip row (e.g. a real-estate 'Hardwood floors / Attached garage / Fenced yard' feature list) where removing one chip morphs the rest into their new position using the native View Transitions API — but styled with the newer `view-transition-class` CSS property instead of this catalog's existing 'View Transition Toggle' entry's approach. That entry gives each morphing element its own unique `view-transition-name` (required by the API) but never assigns a class, so per-group styling (duration, easing, a distinct exit treatment) would have to be repeated once per name if ever needed — checked directly against that entry's own code before building this, genuinely separate, narrow ground. `view-transition-class` solves exactly that: it assigns one or more class-like custom-idents to an element's view-transition pseudo-elements, selectable as `::view-transition-group(.my-class)`, so every chip can share ONE grouped rule (`.stc-chip{view-transition-class:stc-chip}` → `::view-transition-group(.stc-chip){...}`) while the one chip actually being removed gets a second class added only for that moment (`.stc-chip-leaving{view-transition-class:stc-chip stc-chip-leaving}`) to layer a distinct fade+shrink on top of the shared group timing — never needing a per-name selector. **Real, current, cross-checked support (sourced via MDN and caniuse, checked this run):** Baseline 'newly available' since October 2025 — meaningfully wider than most Chromium-only entries in this catalog: Chrome/Edge 125+, Firefox 144+, Safari 18.2+ (desktop and iOS). Same same-document scope as the existing 'View Transition Toggle' entry (not the separate cross-document/MPA flavor). **Verified this run with a real headless-Chromium behavioral check, not just a CSS-parses check:** `CSS.supports('view-transition-class','a')` returns true in this sandbox's pinned Chromium, and — the actual test that matters — calling `document.startViewTransition()` and inspecting `document.getAnimations()` while the transition is live shows the shared `::view-transition-group(.stc-chip)` rule's `animation-duration:.32s` genuinely applied across multiple separate chips' group pseudo-elements at once (several distinct 320ms-duration animations observed, one per remaining chip), while the single removed chip's own `::view-transition-old(.stc-chip-leaving)` override produced one distinct 280ms fade-to-0-opacity-and-scale animation layered on just that element — confirming the class-based grouped selector and the one-off per-element override both actually fire as described, not asserted from the spec alone. Feature-detects with `if (document.startViewTransition)` (instant reorder, no error, for unsupported browsers) and is wrapped in `@supports (view-transition-class: a)` so an engine that parses `startViewTransition` but not yet `view-transition-class` (there are none in the sourced support table above, but kept for defense) just gets the plain unstyled default transition instead of a broken rule; honors `prefers-reduced-motion` by disabling all view-transition pseudo-element animation outright, same convention as 'View Transition Toggle'. Zero WebGL, zero scroll-jacking, one small `startViewTransition` call for the whole interaction — a plainly DIY-$999-tier-fittable pattern (a removable feature-chip list is exactly the kind of small-business-site UI that tier sells), though it can't actually be added to `docs/diy-website-style-catalog.md` this run since that doc is still missing (see this run's log entry). (Vanilla example: live iframe preview + HTML/CSS/JS tabs — click a chip's × to remove it.)
A business card where the LOGOMARK ITSELF — not just the surrounding colors — swaps to a different image asset by color scheme, via `light-dark()` taking `<image>` values (`url()`, `image-set()`, `none`), not just `<color>` values. This is the direct, now-shippable follow-up this catalog's own existing 'Theme-Aware Card (light-dark())' entry flagged and explicitly declined to build: that entry's own description states a WebSearch summary claiming the image-value extension was already Baseline 'Newly available' was caught as wrong by a second, more specific check (bram.us's 'about to support images', dated 2026-03-19, plus the web-platform-dx/developer-signals tracking issue), which found it was only behind a flag in Chromium 148+ with a Firefox 150 date and no Safari date — logged then as 'a real but not-yet-safe follow-up, not built.' **Re-checked this run, now past that line, sourced fresh:** Chrome's own 150 stable release notes (stable June 30, 2026, found via WebSearch) confirm `light-dark()` now accepts image values in author stylesheets (previously UA-stylesheet-only) for `background-image`, `list-style-image`, `border-image-source`, `cursor`, and `content`; the Chromium 'Intent to Ship: CSS light-dark() with image values' thread (blink-dev, dated May 26, 2026) confirms the same property list and states Firefox already shipped it; a Mozilla Bugzilla entry for the same behavior shows status 'RESOLVED FIXED' on the Firefox 150 branch. Two independent shipping engines, version-numbered, not a single blog's guess — the same cross-checking discipline the flagged entry itself used before refusing to build it prematurely. Safari has no date in any source checked this run, stated plainly rather than guessed. **Honest limit on what this run could verify live:** this sandbox's pinned Chromium (141.0.7390.37) is well below the Chrome 150 baseline this feature needs — `CSS.supports('background-image','light-dark(url(a),url(b))')` returns `false` here, same engine-lag this catalog has disclosed on other entries (e.g. 'Carousel Tablist Markers'), so the actual cross-theme image swap could not be watched happen in this run's own browser, only confirmed as correctly authored and safely gated. What WAS verified live, with a real headless-Chromium render (not a guess): the component's default/fallback state renders correctly — a two-ring logomark in dark ink on the light card, title, body copy, and an honest 'static fallback' note, with the dark-mode toggle switch correctly inert (its dot does not move; `color-scheme` and the image swap both live only inside the `@supports` block) — exactly the 'never broken, never half-themed' fallback contract this catalog's other `light-dark()` entry already established. Separately, the raw stylesheet was inspected via the CSSOM to confirm the `@supports (background-image: light-dark(url(a), url(b)))` block itself parses as a real `CSSSupportsRule` with all 7 of its nested rules intact (not silently dropped by a syntax error this sandbox's older engine might otherwise mask) — real proof the authored CSS is well-formed, even though its *matching* behavior can't be watched fire here. Checked for overlap first: the existing 'Theme-Aware Card' entry only ever pairs `light-dark()` with `<color>` values for backgrounds/text/borders and never touches `background-image`; genuinely separate, narrow ground, and the two entries share the same checkbox-hack toggle mechanism by design rather than inventing a second one. Zero WebGL, zero scroll-jacking, zero JS (same checkbox-hack as 'Theme-Aware Card') — fits the DIY $999 tier cleanly on the real use case a small-business site actually has (swap a logo/icon asset for dark mode instead of relying on a CSS filter trick or shipping two `<picture>` sources), though it can't be added to `docs/diy-website-style-catalog.md` this run since that doc is still missing (see this run's log entry). (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all — click the switch; on an unsupported engine the mark and switch stay static and inert by design, not broken.)
A numbered 'how it works' step list whose markers are custom inline glyphs — a compass, a wrench, a rocket, a checkmark — defined with the brand-new CSS `symbols()` function directly inside `counter()`, with no separate `@counter-style` block needed and no `::marker`-replacement JS. `symbols()` builds an anonymous, one-off counter style from a list of strings (or images) right where it's used — here as `content: counter(sfl-step, symbols(cyclic "🧭" "🛠️" "🚀" "✅"))` on each list item's `::before`. **Real, current, genuinely fresh — shipped this month, cross-checked across multiple independent, version-numbered sources, not a single blog's guess:** the Chromium team's own 'Intent to Ship: CSS Symbols()' thread (blink-dev) states Blink shipped it in Chrome 155; Chrome's own Chrome 155 release notes (chromestatus.com/release-notes/155) list `symbols()` under CSS, described as making it easier to set custom list markers inline; web-standards.dev's 'What's new in Chrome 155' recap (dated 2026-10, the same week this run's own research happened) and a GIGAZINE report on the Chrome 155 stable rollout (dated 2026-10-07) both independently corroborate the same shipping milestone. **Cross-engine status, stated precisely rather than rounded up:** the same blink-dev thread notes Gecko (Firefox) has actually supported `symbols()` since 2015 — long before Chromium — while WebKit (Safari) still does not; MDN marks the feature 'Limited availability' for exactly this reason (two of three major engines, not Baseline). So this is simultaneously the newest shipped-this-month browser capability in this catalog and, by engine count, one of the better-supported entries here (Firefox has had it for over a decade; only Safari is the real gap), a nuance worth stating honestly rather than flattening into either 'brand new everywhere' or 'Chromium-only.' Checked for overlap first: no existing entry in this catalog touches `::marker`, `counter()`, or `@counter-style` at all — genuinely new, narrow ground. **Fit check — DIY $999 tier, real, strong fit:** zero WebGL, zero scroll-jacking, zero JavaScript, a numbered onboarding/process list is exactly the kind of small-business-site UI (service steps, pricing-tier comparisons, FAQ ordering) that tier sells; can't actually be added to `docs/diy-website-style-catalog.md` this run — still missing, see this run's log entry. **Honest fallback, verified this run, not assumed:** the base rule renders a plain numbered badge via `counter(sfl-step, decimal)` on a solid-color circle; the `symbols()` version only applies inside `@supports (content: counter(c, symbols(cyclic "a")))`, which real headless-Chromium testing this run confirmed evaluates to `false` in this sandbox's own pinned build — a genuinely new data point: this sandbox's Chromium is now **153.0.8010.12**, not the 141.0.7390.37 every prior day in this log through day 43 was pinned to (a real sandbox upgrade, noted here rather than silently assumed unchanged) — still one stable version short of the Chrome 155 threshold this entry's own feature needs, so the gap is honest and current, not stale. A real computed-style check (`getComputedStyle(el, '::before').content`, not just reading the CSS) confirmed the fallback actually renders — all four markers computed as the plain `counter(sfl-step) ". "` form, zero broken or empty badges — exactly the 'never broken, never half-done' bar this catalog holds every entry to. (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all.)
A nav-link hover effect where the underline collapses to invisible at rest and grows out from the center on hover — using the brand-new CSS `text-decoration-inset` property instead of the usual `::after` pseudo-element + `transform:scaleX()` trick (or a `background-image` gradient hack) most sites still reach for. `text-decoration-inset` shifts where a text-decoration line starts/ends relative to the text run; one value insets both ends symmetrically, so animating it from `50%` (both ends pulled to the middle — zero visible line) to `0%` (full width) on `:hover` is a pure-CSS 'grow from center' underline reveal, which Chrome's own team calls out by name as this property's intended use case. **Real, current, sourced — not invented:** Chrome's 'New in Chrome 154' post (developer.chrome.com/blog/new-in-chrome-154, published 2026-09-22, the day Chrome 154 went stable) ships `text-decoration-inset` and explicitly describes animated underline-reveal effects as the motivating use case; the W3C/WHATWG `web-features` project's own tracking issue (web-platform-dx/web-features#4462) independently corroborates the same feature and additionally states Firefox shipped it in **Firefox 146** and Safari has it only in **Safari Technology Preview** (not yet a stable Safari release) — two sources, not one blog's guess. **Cross-engine status, stated precisely, not rounded up:** that puts this at 2 of 3 engines in a *stable* release (Chrome 154, Firefox 146) with Safari still preview-only — MDN accordingly marks it an experimental/non-Baseline technology. Checked for overlap first: no existing entry in this catalog touches `text-decoration-inset`, `text-decoration-thickness`, or underline styling of any kind — genuinely new ground. **Fit check — DIY $999 tier, real, strong fit:** zero WebGL, zero scroll-jacking, zero JavaScript — a nav-link or footer-link hover state is exactly the small-business-site chrome that tier ships; not added to `docs/diy-website-style-catalog.md` this run — that file is still missing, see this run's log entry (now day 45 of the same gap). **Honest fallback, verified this run, not assumed:** the base rule is a plain always-visible underline (`text-decoration-line:underline`) with real link color/thickness — a link that is never broken, never invisible, with or without the enhancement. The inset-collapse-and-grow behavior, and the small 'hover a link' caption, are both gated behind `@supports (text-decoration-inset: 50%)`, which a real headless-Chromium check this run confirmed evaluates to `false` on this sandbox's own pinned Chromium (**153.0.8010.12** — unchanged from day 44, one stable version short of the Chrome 154 threshold this feature needs). A `getComputedStyle` check on page load confirmed `text-decoration-line` computes to `"underline"` on all three demo links (the fallback genuinely renders, not a blank/broken state) and that the supports-gated caption computes `display:"none"` (correctly hidden, not silently shown-but-wrong) — the same 'never broken, never half-done' bar every entry in this catalog is held to. (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all.)
A vertical stack of paragraphs/cards whose first child's top margin and last child's bottom margin collapse to zero automatically against the container's own edge — via the CSS `margin-trim: block` property on the container — instead of the classic `.item:first-child{margin-top:0}` / `.item:last-child{margin-bottom:0}` override every uniform-vertical-rhythm list otherwise needs, which silently breaks the moment an item gets reordered, conditionally rendered, or wrapped in one more div. `margin-trim: block` trims the margin-before of the first in-flow child and margin-after of the last in-flow child of the container it's set on, dynamically, for whatever ends up being first/last at render time — no selector to keep in sync with markup changes. **Real, current, genuinely fresh this run, cross-checked across independent sources, not a single blog's guess:** Chrome's own Chrome 155 Release Notes (chromestatus.com/release-notes/155) lists `margin-trim` under Chrome 155's default-on CSS changes, and Chrome 155 reached stable on **2026-10-06** (independently corroborated by a GIGAZINE report on the same stable rollout, dated 2026-10-07 — the same cross-check this catalog's own 'symbols()' entry already used for the same Chrome 155 milestone); the MDN `browser-compat-data` project's own tracked entry for this property (`css/properties/margin-trim.json` on GitHub) independently agrees, recording `"version_added": "155"` for Chrome. **Cross-engine status, stated precisely, with a real nuance most sources flatten away:** Safari actually shipped `margin-trim` first, years earlier — Safari 16.4 (March 2023, per WebKit's own 'Easier layout with margin-trim' blog post) — but, per a dedicated explainer by CSS Working Group member Rachel Andrew (rachelandrew.co.uk, published 2026-09-15 ahead of the 155 stable rollout) and a corroborating MDN `browser-compat-data` GitHub issue (#30528, 'margin-trim is only partially supported in Safari'), Safari's support is block-containers-only and does **not** extend to multicol containers the way Chrome 155's does — a real, sourced asymmetry, not a simple 'Safari had it first' story. Firefox has not shipped it at all: Mozilla's own tracking bug (bugzilla.mozilla.org #1506241) has been open for **7 years**, is rated P3 (low priority) with no assignee, last updated 4 months ago — genuinely stalled, not merely 'in progress.' So this is 2 of 3 engines, each with a different real scope, correctly NOT Baseline. **Correction to this log's own day-45 entry, stated honestly rather than silently fixed:** that entry listed `margin-trim` as one of 'Chrome 154's own release' follow-up candidates; re-checked today at the primary source, it was actually announced in the **Chrome 155 BETA** post (developer.chrome.com/blog/chrome-155-beta, 2026-09-16), not 154 — a one-release mislabel in a 'noted for completeness, not yet scoped' aside, not a catalog-entry claim, but worth naming precisely now that it's actually been researched and built. Checked for overlap first: no existing entry in this catalog touches `margin-trim` in any form (block/inline, container query, or otherwise) — genuinely new ground; distinct from the existing 'Precision Text Trim' entry, which trims a text line's own leading/trailing *line-box* space via `text-box-trim`, not a flex/block container's child *margins*. **Fit check — DIY $999 tier, real, strong fit:** zero WebGL, zero scroll-jacking, zero JavaScript — a uniform-spacing paragraph block or stacked FAQ-answer list is exactly the small-business-site content most DIY-tier pages ship; not added to `docs/diy-website-style-catalog.md` this run — that file is still missing (see this run's log entry, now day 46 of the same standing gap). **Honest fallback, verified this run, not assumed:** the base rule gives every paragraph a uniform `margin-block` with no first/last override, so an unsupporting browser shows a real (if slightly larger) gap between the box edge and the first/last line — never a broken, overlapping, or blank layout. The trimmed effect is gated behind `@supports (margin-trim: block)`, which a real headless-Chromium check this run confirmed evaluates to `false` on this sandbox's own pinned Chromium (**153.0.8010.12**, unchanged since day 44/45 — two stable versions short of the Chrome 155 threshold this entry needs, an honest, current gap, not a stale one). A `getComputedStyle` check on both demo boxes after render confirmed every paragraph in both columns computes a real, non-zero `margin-block-start`/`margin-block-end` (the fallback box's visible top/bottom gap is real computed spacing, not a rendering fluke) and that the `@supports`-gated caption computes `display: "none"` — correctly hidden rather than silently shown-but-wrong, the same 'never broken, never half-done' bar every entry here is held to. (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all — compare the gap above/below the first and last line in each dashed box.)
A real tab switcher — tablist, tab, and tabpanel roles, roving tabindex, arrow-key navigation between tabs — generated entirely by the browser from `scroll-marker-group: before tabs` on a native scroll-snap row, zero JavaScript and zero `role="tab"`/`aria-selected` attributes written by hand. **Real, current, genuinely new ground for this catalog, cross-checked across independent sources:** Chrome's own 'New in Chrome 154' post (developer.chrome.com/blog/new-in-chrome-154) and Chrome 154 Release Notes (developer.chrome.com/release-notes/154) give the exact syntax — `scroll-marker-group: after links` is the default ('links mode': the generated group gets a navigation role, each `::scroll-marker` gets a link role, and every marker is a sequential tab stop — this is the mode this catalog's existing 'Scroll Marker Carousel' entry already uses, implicitly, via its bare `scroll-marker-group:after`); `scroll-marker-group: before tabs` is new in Chrome 154 ('tabs mode': the group gets a real tablist role, each marker gets a tab role, the originating panel gets a tabpanel role, only the *active* marker is a tab stop, and arrow keys move focus between the rest) — genuinely different generated semantics, not a recolor of the same demo. MDN's own `::scroll-marker-group` reference page independently corroborates the tablist/tab/tabpanel role mapping and separately recommends matching the keyword to visual position (`before` when the marker row sits above/before the content, `after` when below/after it — this entry uses `before`, matching its own tab-bar-above-content layout, unlike the carousel entry's dots-after-content layout). **Stable-date discrepancy, named rather than silently picked:** Chrome's own chromestatus/developer.chrome.com release notes give **2026-09-22** as Chrome 154's stable date — the same date this catalog's day-45 'Inset Underline Reveal' entry already cross-checked and used — but a GIGAZINE report on the same rollout gives **2026-09-25**; this entry follows the official first-party date for consistency with this catalog's own prior entries, rather than treating the two as interchangeable. **Also surfaced, flagged as unverified rather than stated as fact:** a third-party blog (alexanderburgos.netlify.app/blog/css-scroll-markers-tabs) claims inactive tabpanel content can be fully removed from the accessibility tree in tabs mode — a real-sounding implementation detail, but not something MDN's own page states, so not relied on here. **Cross-engine status:** Chrome/Edge 154+ only — Firefox and Safari ship neither mode (the same 'no Firefox/Safari support yet' gap this catalog's own 'Scroll Marker Carousel' entry already found for the base property), so correctly not Baseline. Checked for overlap first: distinct from 'Scroll Marker Carousel' (links mode, round dots + prev/next arrows, a visual carousel) — this entry is the `tabs`-mode value specifically, added in Chrome 154 after the carousel entry was already built, with named text tabs rather than dots and real tablist semantics rather than a link list. **Fit check — DIY $999 tier, real, strong fit:** zero WebGL, zero scroll-jacking, zero JavaScript — a pricing-tier or FAQ-category tab switcher is exactly the small-business content this tier ships; not added to `docs/diy-website-style-catalog.md` this run — that file is still missing (see this run's log entry, now day 47 of the same standing gap). **Correction to this run's own first assumption, found and fixed before shipping, not after:** every prior entry since day 44 established that this sandbox's pinned Chromium (153.0.8010.12) sits behind the Chrome 154/155 features it was testing (`text-decoration-inset`, `margin-trim` both confirmed `CSS.supports(...) === false`), so this entry's first draft assumed the same and was written around an untestable fallback. That assumption was checked, not carried over: `CSS.supports('scroll-marker-group', 'before tabs')` on this exact sandbox returns **`true`** — this specific Chrome 154 feature is genuinely implemented here, unlike the other two. **Verified live, not inferred from `CSS.supports` alone** (a real headless-Chromium render, Playwright, the exact HTML/CSS shipped below, viewport 420×220 @2x): a real screenshot shows three generated pill-shaped tabs ('Starter'/'Growth'/'Pro') positioned above the panel, with the active one genuinely styled via `:target-current` (`getComputedStyle(panel, '::scroll-marker')` on the first panel returned `background-color: rgb(79, 70, 229)` — the `:target-current` color, not the resting `#1f2937`). Clicking the 'Growth' pill moved `.smt-track`'s real `scrollLeft` from `0` to `386` (dragging the correct panel into view) with zero console/page errors. **The accessibility-role claim specifically checked, not assumed from the spec text, with a real nuance found:** Chrome DevTools Protocol's `Accessibility.getFullAXTree` on the rendered page confirms a real `tablist` role and three real `tab` roles were generated — the semantic mapping genuinely exists in this build, not just the visual styling. But no `tabpanel` role was found anywhere in that same tree, despite Chrome's own release notes and MDN both stating the originating panel should get one — a real, verified gap between this build's implementation and its own spec, not a flattened 'fully supported' claim. (Playwright's higher-level `page.locator().ariaSnapshot()` reported no roles at all for this region, which would have under-claimed the gap the other way; the raw CDP `Accessibility.getFullAXTree` call is what actually surfaced the real tablist/tab roles, so that's the method trusted here.) The base, pre-`@supports` row (`scroll-snap-type:x mandatory`, no tab bar) was also confirmed real and usable on its own — a `getComputedStyle` check on all three panels found each computes a non-zero `width`, so the underlying content is never dependent on the enhancement to be reachable. (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all — scroll or drag inside the box, or click a tab once the named bar renders; needs a Chrome/Edge 154+ engine, confirmed present in this run's own sandbox.)
A wide-tracked underlined heading ('DESIGN · BUILD · SHIP') compared side by side: the default browser behavior draws one unbroken underline straight through the big word-spacing gaps, while the new CSS `text-decoration-skip-spaces: all` property breaks the same line into separate segments under each word only, lifting the decoration cleanly off every space/word-separator in between — zero JS, zero extra markup, one property. **Real, current, genuinely new ground for this catalog, cross-checked across independent sources, with this run's own sourcing limits named rather than hidden:** this run hit the same standing `EGRESS_BLOCKED`-style failure prior entries have logged against `developer.chrome.com`, `developer.mozilla.org`, `mail-archive.com`, `groups.google.com`, and `issues.chromium.org` (every fetch attempt against all five returned a DNS-level `ENOTFOUND`, and this run's usual Firecrawl-based direct-fetch workaround for primary docs was also unavailable — the connected account is out of credits, a new, concrete finding worth carrying forward, not the same 'Firecrawl workaround unavailable' note as before for the same reason) — so this entry rests on WebSearch aggregation plus one GitHub issue actually reached by direct fetch, not a primary spec/blog page read in full, and is written to be precise about that gap rather than paper over it. **What the direct fetch actually confirmed:** `web-platform-dx/developer-signals` issue #956 (fetched in full this run) states plainly, as its own browser-support section: Chrome supports `text-decoration-skip-spaces` starting at **version 155**, dated **2026-10-06** — the same Chrome 155 stable date this catalog's own 'Margin-Trim Block List' entry already cross-checked via Chrome's release notes and a GIGAZINE report — while Chrome Android, Edge, Firefox, Firefox for Android, Safari, and Safari on iOS are all listed as **not supported**. **What WebSearch aggregation additionally surfaced, named as aggregated rather than primary-read:** a Chromium 'Intent to Ship: CSS4 text-decoration-skip-spaces' blink-dev thread, dated **2026-08-11** per its own subject-line date, in which API owner Chris Harrelson asked that the shipped initial value match the spec's own default of `start end` rather than `none` — i.e., out of the box, only line-edge (leading/trailing) whitespace is skipped, while interior word-separator gaps are still underlined unless `all` is explicitly set, which is exactly the contrast this demo stages; a linked Chromium tracking-bug comment (bug 40862777) places the corresponding implementation change as reviewed **2026-09-04**, consistent with landing ahead of the 155 stable cut. **A real discrepancy found and named, not resolved by assumption:** a German-language mirror of the Chrome **154** beta post (surfaced only as a search snippet, not fetched directly) appears to already list this same property, which would predate the 155 milestone the directly-fetched GitHub issue gives as the actual shipping version — this entry treats Chrome 155 (2026-10-06) as the authoritative, verified-supported milestone, consistent with the one source actually read in full, and flags the 154-beta mention as an unconfirmed, pre-stable sighting rather than folding it into the shipped-version claim. **Cross-engine status:** per the same directly-fetched GitHub issue, Firefox and Safari have not shipped any form of this property — correctly not Baseline, Chrome/Edge-only (and, per that issue's own browser list, not yet in Edge either, despite sharing Chromium's engine — an asymmetry stated as-is, not smoothed over). Checked for overlap first: distinct from this catalog's own 'Inset Underline Reveal' entry, which uses `text-decoration-inset` to shift *where a line's two ends sit* relative to the text run (a reveal/collapse animation on a single word or link); this entry uses `text-decoration-skip-spaces` to control *whether the line is drawn at all* under whitespace between separate words — a different axis of the same decoration-line system, not a recolor of the existing entry. **Fit check — DIY $999 tier, real, strong fit:** zero WebGL, zero scroll-jacking, zero JavaScript — a wide-tracked underlined nav strip, footer link row, or spaced-out section heading is exactly the small-business chrome that tier ships; not added to `docs/diy-website-style-catalog.md` this run — that file is still missing (see this run's repo-state check, now day 48 of the same standing gap). **Honest fallback, verified this run, not assumed:** the base rule (`text-decoration-line:underline`, generous `word-spacing`) always renders a real, visible underline under both columns — never a blank or broken heading, with or without the enhancement. The segmenting behavior, and its small explanatory caption, are both gated behind `@supports (text-decoration-skip-spaces: all)`, which a real headless-Chromium check this run confirmed evaluates to **`false`** on this sandbox's own pinned Chromium (**153.0.8010.12**, unchanged since day 44 — two stable versions short of the Chrome 155 threshold this feature needs; `npm install` was required again this run, fresh container, 594 packages, 0 vulnerabilities, matching day 46/47's exact count). A `getComputedStyle` check on both demo headings after render confirmed `text-decoration-line` computes to `"underline"` in both columns (the fallback genuinely renders a real decoration, not a blank/broken one) and that the `@supports`-gated caption computes `display: "none"` — correctly hidden rather than silently shown-but-wrong, the same 'never broken, never half-done' bar every entry here is held to. Because this sandbox's Chromium can't yet render the enhanced, segmented state, no screenshot of that specific state is claimed here — only the verified fallback and the verified `@supports` gate, honestly, rather than an invented 'what it would look like' image. (Vanilla example: live iframe preview + HTML/CSS tabs, no JS tab at all — compare the underline running through the gaps on the left against the segmented underline the right column will show once a Chrome/Edge 155+ engine renders it.)
Cards that stack and parallax as you scroll — the Apple-style scroll sequence. In the Pro Scroll pack.
Cards that stack and parallax as you scroll — the Apple-style scroll sequence. In the Pro Scroll pack.
Unlock in the Pro pack →A WebGL animated mesh-gradient hero background. In the Premium Shader pack.
A WebGL animated mesh-gradient hero background. In the Premium Shader pack.
Unlock in the Pro pack →The premium packs.
Scroll sequences, spotlight cards, shader heroes, and full cinematic hero packs — the components that make a site look like it cost $10k. Buy a pack, or get the whole current library, one-time.
Pro Motion Pack
Curated component packs by category (scroll, cards, text, buttons).
Premium Shader Pack
WebGL mesh-gradient + shader backgrounds and cinematic hero scenes.
Complete Library
Every component in the current library, commercial license. One-time — no subscription, no recurring fees.
The free set is free, always. The paid packs and the Complete Library are in production and not on sale yet; when they launch they are one-time purchases, 30% off for Apex Pass members.
These same components power our animated website tier.
Buying a business kit instead of building? Pick the Animated Website tier and we drop this motion straight into a finished, niche-matched site — you never touch the code.
See the business kits →What Apex Motion actually is
Apex Motion is a copy-paste animated component library for React, Tailwind, and Framer Motion — aurora backgrounds, magnetic buttons, shimmer text, spotlight cards, 3D tilt, shader heroes. You see a live preview, copy the code, and paste it into your project. It's performance-first and dependency-light — no 60-package install — and there's a free tier.
How it works
- 1. Browse the gallery and find the effect you want.
- 2. Watch the live preview to see exactly how it animates.
- 3. Copy the React + Tailwind + Framer Motion code.
- 4. Paste it into your project and tweak the props.
- 5. Ship it — free components are yours; Pro packs unlock the rest.
Who it’s for / who it’s not
For: developers and designers building in React who want polished, performant motion without writing it from scratch or installing a heavy UI kit — and people who ask their AI coding assistant for "a Framer Motion X".
Not for: non-coders who want a no-code page builder, or teams on a non-React stack — these are React + Tailwind + Framer Motion code components, not a drag-and-drop tool.
What it changes for you
Copy, paste, ship
Live preview, copy the code, drop it in. No design or animation grind.
Performance-first
Hand-built and dependency-light — it won't bloat your bundle or tank your CWV.
It's your code
Paste it into your project and own it — edit, theme, and extend freely.
Free to start
A free tier of components ranks, builds trust, and ships real projects.
Built for AI search
Each effect has its own page with code schema — the source AI assistants cite.
A real ladder
Free → Pro packs → Shader heroes → Complete Library. Buy the depth you need.
Apex Motion vs a heavy UI kit vs building it yourself
| Apex Motion | Heavy UI library | Build it yourself | Generic snippets | |
|---|---|---|---|---|
| Copy-paste | Yes, per component | Install the whole kit | — | Yes, varies |
| Bundle impact | Light | Often heavy | You control | Varies |
| You own the code | Yes | Dependency | Yes | Yes |
| Live preview | Yes | Sometimes | — | Rarely |
| Performance-tuned | Yes | Varies | Up to you | No |
| Free tier | Yes | Sometimes | — | Yes (quality varies) |
Straight answers
Copy-paste motion components — straight answers
What is Apex Motion?
A copy-paste animated component library for React, Tailwind, and Framer Motion. You browse a gallery, see each component animate live, copy the code, and paste it into your project — performance-first, with a free tier.
What are these components built with?
React for the markup, Tailwind for styling, and Framer Motion for the animation. Each one is hand-built and dependency-light so it stays fast.
How do I use a component?
Open its page, watch the live preview, copy the code, and paste it into your React project. Adjust the props to fit, and you're done — it's your code from there.
Is it free?
There's a free tier of components you can copy and ship today. Paid tiers add more: Pro packs ($29), a Shader pack ($99), and the Complete Library ($499) for every component in the current library.
What frameworks does it need?
React, Tailwind CSS, and Framer Motion. If your project already uses those (including Next.js), the components drop straight in.
Does it work with Next.js?
Yes — they're standard React + Tailwind + Framer Motion components, so they work in Next.js (App Router or Pages) and any React setup.
Do I need Framer Motion installed?
Yes — Framer Motion is the animation library the components use. It's a single, well-maintained dependency, not a 60-package UI kit.
Who is it for?
Developers and designers building in React who want polished, performant motion fast — and anyone who asks ChatGPT, Claude, Cursor, or v0 for a Framer Motion effect and wants a source they can trust.
Who should NOT use it?
Non-coders wanting a no-code builder, or teams not on React — these are code components for React + Tailwind + Framer Motion, not a visual page builder.
Can I use them in commercial and client projects?
Yes — use them in unlimited personal and commercial projects, including products you sell and unlimited client sites. The one thing you can't do is repackage the components as your own competing library or template kit.
Is Motion discounted with the Apex Pass?
The free components are free for everyone. The paid packs (Pro, Shader, Complete Library) are not on sale yet; when they launch they are one-time purchases, 30% off for Apex Pass members.
How is it different from Aceternity or Magic UI?
Same copy-paste model, with a focus on being performance-first and dependency-light — clean, typed, no bloat — plus a free tier and per-component pages built so AI assistants can cite them.
Will it bloat my bundle?
No — the components are hand-built and dependency-light (just Framer Motion + Tailwind), so they won't drag your bundle size or Core Web Vitals.
Can I customize a component?
Completely — once you paste it in, it's your code. Change the markup, the Tailwind classes, the motion props, the timing — whatever you need.
Do I need a build step or package install?
Just the usual React + Tailwind + Framer Motion in your project. There's no Apex runtime to install — you copy the component source directly.
Is it TypeScript?
Yes — the components are written cleanly and typed, so they drop into a TypeScript React project without fighting the compiler.
Are there shader / WebGL components?
Yes — the Shader pack ($99) includes shader-based hero effects for when you want something more advanced than CSS/Framer Motion.
What is the Complete Library?
The Complete Library ($499) is a one-time purchase that unlocks every component and pack in the current library, with a commercial license — no subscription.
Can I see it before I buy?
Yes — every component has a live preview on its own page, and the free tier lets you copy and ship real components before paying for anything.
Do I get updates?
Pro and Complete Library buyers get fixes and improvements to the packs they own. Brand-new packs released later are separate — and the free tier always stays free and yours once copied.
Are the components accessible?
They're built thoughtfully, and because the code is yours, you control the final accessibility — add labels, focus states, and reduced-motion handling to fit your app.
Do they work on mobile?
Yes — they're responsive and performance-first, so they animate smoothly on mobile without janky scroll or heavy main-thread work.
Can I resell the components?
No — you can use them in unlimited projects, but you can't repackage or redistribute them as your own competing component library or template kit.
How many components are there?
A free tier plus Pro and Shader packs, growing over time. Browse the gallery to see what's live, each with its own preview and copy-paste code.
Apex Motion vs building the animation myself?
Building polished, performant motion from scratch is hours per effect. Apex hands you a tuned component you paste in and tweak, so you skip straight to shipping.
Can I get a refund?
It's backed by the store's terms. The free tier lets you try the quality before buying, so you know exactly what you're getting.
What are best practices?
Paste the component, keep the motion props sensible for your brand, respect reduced-motion preferences, and lazy-load heavier effects (like shaders) below the fold.
What's the most common mistake?
Stacking too many heavy animations above the fold. Use motion intentionally — a few well-placed effects beat a page that fights the user's scroll.
How do I get started?
Open the gallery, pick a component, watch the preview, and copy the code into your React project. Start with the free tier, then unlock Pro or the Complete Library when you want the full set.