SHOWCASE

BUTTONS · APPROVAL CARDS · DROPDOWN MENUS · WEB EFFECTS 2026 · NEXT 10

20 tiles, 20 effects. Hover, click, explore.

Conic Border
Liquid Fill
RGB Glitch
Magnetic
Particle Burst
Aurora
3D Tilt + Glare
Ripple
Glass Shine
Cyber Scanline
Neon Flicker
Morphing Blob
Starfield
Holographic Foil
Plasma
Sonar Pulse
Text Scramble
Shatter on Click
Spotlight
Gooey Metaballs

30 approval cards, each built with a different rendering technique, with its own buttons and link effects. Press a button to record an answer.

01WebGL Shader

161. bustersflooring.com: mobile PageSpeed 49 / LCP 13.1s needs careful workMED

No answer yet

Preload the LCP hero and split the JS bundle. Do not edit live; ship through a build.

Asked by Needs attention · Oct 12, 2026 9:02 AM CT · bustersflooring.com · type: seo
Open report
02SVG Turbulence

162. wolfcreekcabinets.com: contact form drops leads on Safari 17HIGH

No answer yet

Form posts fail when the honeypot field autofills. Patch in source, rebuild, re-verify.

Asked by Deck Boss · Oct 11, 2026 6:40 PM CT · wolfcreekcabinets.com · type: bug
Open report
03@property Conic

163. tfldoor.com: sitemap missing 41 product URLsMED

No answer yet

Generator skips variants with no price. Include them and resubmit to Search Console.

Asked by Proof · Oct 13, 2026 1:15 AM CT · tfldoor.com · type: seo
Open report
043D Flip

164. alabamadronedude.com: hero video 18 MB on mobileLOW

No answer yet

Serve a 1.2 MB poster + lazy HLS. Click Open report to flip the card.

Asked by Fable · Oct 10, 2026 11:30 AM CT · alabamadronedude.com · type: perf
Open report
LCP 2.1s

Projected after poster + lazy HLS. Payload 18 MB → 1.2 MB.

Back to card
05Aurora Glass

165. profuctions.com: SSL renews in 6 days, cron stalledHIGH

No answer yet

certbot timer stopped after the reboot on Oct 9. Re-enable and dry-run.

Asked by Server 3 · Oct 12, 2026 4:18 PM CT · profuctions.com · type: ops
Open report
06Brutalist Mono

166. closetsbybobby.com: duplicate H1 on 12 pagesLOW

No answer yet

Template prints the page title twice. One-line fix in layout.

Asked by Closet 2 · Oct 12, 2026 9:02 AM CT · closetsbybobby.com · type: seo
Open report
07CRT Terminal

167. cnc.tfl.dev: nightly backup exited 137HIGH

No answer yet

OOM during tar of /var/www. Stream to zstd instead of buffering.

Asked by CNC 2 · Oct 11, 2026 6:40 PM CT · cnc.tfl.dev · type: ops
Open report
08Holo Foil

168. bustersflooring.com: AI share images ready for 61 productsMED

No answer yet

og:image only; real photos stay on the page. Needs head-overrides rebuild.

Asked by Theia · Oct 13, 2026 1:15 AM CT · bustersflooring.com · type: content
Open report
09Neumorphic

169. doorpros.net: quote calculator rounds wrongMED

No answer yet

Uses Math.floor on cents. Switch to integer cents end to end.

Asked by Door 1 · Oct 10, 2026 11:30 AM CT · doorpros.net · type: bug
Open report
10Paper & Ink

170. rahmfamily.blog: draft post ready for reviewLOW

No answer yet

"Ten years of doors" is drafted. Proofread before it goes out.

Asked by Fable · Oct 12, 2026 4:18 PM CT · rahmfamily.blog · type: content
Open report
11Gooey Metaball

171. jokerjoinery.com: cart badge stuck at 0MED

No answer yet

State not hydrated after prerender. Read from localStorage on mount.

Asked by Joker 4 · Oct 12, 2026 9:02 AM CT · jokerjoinery.com · type: bug
Open report
12Particle Field

172. grokbot.dev: approvals page needs buttonsMED

No answer yet

Reuse decide_buttons.py so remediation matches approvals.

Asked by Queen Theia · Oct 11, 2026 6:40 PM CT · grokbot.dev · type: ux
Open report
13Magnetic

173. wolfcreekcabinets.com: EXIF stripper tool launchLOW

No answer yet

No-store EXIF stripper is built. Link it from the front page CTA.

Asked by Deck Boss · Oct 13, 2026 1:15 AM CT · wolfcreekcabinets.com · type: feature
Open report
14Decode Scramble

174. vault.tfl.dev: duplicate standing-order note -0840LOW

No answer yet

Two runs overlapped. Remove the copy ending -0840 when convenient.

Asked by Queen Theia · Oct 10, 2026 11:30 AM CT · vault.tfl.dev · type: ops
Open report
15Spotlight Reveal

175. tfldoor.com: hidden broken images on /galleryMED

No answer yet

Eight thumbnails 404 after the rename tool. Map old to new names.

Asked by Proof · Oct 12, 2026 4:18 PM CT · tfldoor.com · type: bug
Open report
16Cyber Glitch

176. server4.tfl.dev: SSH brute force spike: 9k attemptsHIGH

No answer yet

fail2ban jail missing on port 2222. Add the jail, then commit config.

Asked by Deck Boss · Oct 12, 2026 9:02 AM CT · server4.tfl.dev · type: security
Open report
17Blueprint

177. closetsbybobby.com: new closet configurator specMED

No answer yet

Wireframe for 3-step builder: size, finish, hardware. Approve to scope.

Asked by Closet 2 · Oct 11, 2026 6:40 PM CT · closetsbybobby.com · type: feature
Open report
18Luminous Neon

178. nightshift.bar: event page needs Friday lineupLOW

No answer yet

Lineup posted on Instagram; mirror it to the site through a build.

Asked by Server 3 · Oct 13, 2026 1:15 AM CT · nightshift.bar · type: content
Open report
19Isometric

179. tfl-warehouse.app: stock counts drift by 3%MED

No answer yet

Scanner double-posts on retry. Add idempotency key to /scan.

Asked by CNC 2 · Oct 10, 2026 11:30 AM CT · tfl-warehouse.app · type: data
Open report
20Starfield

180. alabamadronedude.com: FAA waiver page outdatedLOW

No answer yet

Waiver renewed through 2028. Update dates and the PDF link.

Asked by Fable · Oct 12, 2026 4:18 PM CT · alabamadronedude.com · type: content
Open report
21Anchor-Positioned Tooltips

181. tfldoor.com: Safari autofill breaks shop checkoutHIGH

No answer yet

Autofill fills the hidden address2 field and the order total fails to submit. Patch the form in source and re-verify on iOS.

Asked by Sentry · Oct 13, 2026 8:12 AM CT · tfldoor.com · type: bug
Open report
Ship it nowHold for laterCancel the requestOpen a thread
22@starting-style Pop

182. profuctions.com: nightly backup runs 43 min and climbingMED

No answer yet

Backup time more than doubled since the photo import. Move to incremental sync before it overlaps the morning cron.

Asked by Overwatch · Oct 13, 2026 9:30 AM CT · profuctions.com · type: ops
Open report

Report 182 · nightly backup run

Last 7 runs averaged 43 min, up from 18. The media bucket doubled after the October photo import; the job re-uploads unchanged files. Fix: switch to incremental sync with a checksum manifest.

Your answer: none yet
23Scroll-Driven Reveal

183. cyberriskquantified.com: 14 pages missing meta descriptionsLOW

No answer yet

Draft unique descriptions for the SPRS and CMMC pages. Nothing ships without a diff for review.

Asked by Fable · Oct 13, 2026 10:05 AM CT · cyberriskquantified.com · type: seo
Open report
24View Transition Morph

184. jokerduel.com: matchmaking queue timeout 30s to 45sMED

No answer yet

Short timeouts are dropping players in off-peak hours. Raise to 45s behind a flag and watch the abandon rate.

Asked by Deck Boss · Oct 13, 2026 11:20 AM CT · jokerduel.com · type: config
Open report
25Mesh Gradient @property

185. stopabusingdrugs.com: add schema markup to 12 guidesLOW

No answer yet

Article and FAQ structured data for the recovery guides. Validate in the Rich Results test first.

Asked by Fable · Oct 13, 2026 12:44 PM CT · stopabusingdrugs.com · type: seo
Open report
26Liquid Glass

186. wolfcreekdesign.com: swap hero for the new kitchen photo setMED

No answer yet

Eight new shots are ready. Replace the hero, keep the old image as a fallback, compress to WebP.

Asked by Needs attention · Oct 13, 2026 1:15 PM CT · wolfcreekdesign.com · type: content
Open report
27Variable Font Kinetic

187. alabamadronedude.com: Part 107 refresher postLOW

No answer yet

Add the 2026 recurrent training changes and link the FAA study guide. Content only, no layout edits.

Asked by Fable · Oct 13, 2026 2:02 PM CT · alabamadronedude.com · type: content
Open report
28Container Query Adaptive

188. bustersflooring.com: import 340 SKUs from supplier CSVHIGH

No answer yet

Map the columns, dedupe by SKU, and stage the import for review before anything goes live.

Asked by Deck Boss · Oct 13, 2026 3:31 PM CT · bustersflooring.com · type: import
Open report
29color-mix + light-dark

189. tfldoor.com: order tracker emails send from the wrong senderMED

No answer yet

Status emails go out from a no-reply address that fails SPF. Point them at the verified domain.

Asked by Sentry · Oct 14, 2026 7:48 AM CT · tfldoor.com · type: email
Open report
30WebGPU Compute Particles

190. profuctions.com: rotate the Supabase service keyHIGH

No answer yet

Key is 180 days old. Rotate through the vault, update the three consumers, confirm each still authenticates.

Asked by Overwatch · Oct 14, 2026 8:26 AM CT · profuctions.com · type: security
Open report

20 working dropdown menus. Click/tap, keyboard (↑↓ Esc), click-outside. Try ⌘K / Ctrl+K.

A · Desktop

03Liquid glass panel
043D fold-down
05Clip-path circle reveal
06Command palette · ⌘K fuzzy filter
07Radial pie menu
09Neon spring physics
10Popover API + CSS anchor positioning

B · Mobile

11Bottom sheet · drag to dismiss
9:41●●● ▮
12Full-screen overlay · staggered links
9:41●●● ▮
STUDIO
13Accordion · nested drill-down
9:41●●● ▮
Shop
14Slide-over drawer · push
9:41●●● ▮
15Circular FAB expand
9:41●●● ▮
Notes
16Hamburger → X · curtain
9:41●●● ▮
17Segmented pill switcher
9:41●●● ▮
Analytics
18Swipeable card-stack menu
9:41●●● ▮
19iOS action sheet
9:41●●● ▮
Photos
20Gooey tab-bar expansion
9:41●●● ▮
Home
⌂⌕♡☺

The ten defining web effects of 2026, built live with no libraries. Each badge shows what your browser supports and which fallback is active.

♿ Wrap heavy effects in @media (prefers-reduced-motion: no-preference) { … }, or check matchMedia("(prefers-reduced-motion: reduce)") in JS. Every demo here does that.

01

Live DOM + GPU shader

A WebGL fragment shader composited over real, selectable HTML. Move over it to bend light through the shader.

Quarterly build report

All 9 sites rebuilt from source. Zero live edits detected this week.

Fallback: without WebGL the DOM shows unshaded. The canvas uses pointer-events:none, so the HTML stays fully interactive.

02

CSS scroll-driven animations

animation-timeline: scroll() and view() drive animations off the compositor, with zero JS. Scroll inside the box.

↓ scroll
Reveal
Rotate
Scale
Blur → Sharp
Color shift
end

Fallback: browsers without animation-timeline fall back to an IntersectionObserver that toggles a class.

03

View Transitions: shared-element morph

Click a tile and it morphs into a detail view. The page tabs above also switch with startViewTransition.

Fallback: without the View Transitions API the swap happens instantly with a CSS fade.

04

Liquid Glass refraction

An SVG displacement map fed into backdrop-filter bends whatever is behind the lens. Drag the lens around.

REFRACTLIQUIDGLASS

Fallback: browsers without backdrop-filter:url() (Safari, Firefox) get a blur-and-saturate frosted lens instead.

05

Kinetic variable typography

Each letter's weight and width follow your cursor distance, and an idle wave runs through the word.

KINETIC TYPE

Fallback: system variable fonts interpolate smoothly; static fonts step between weights 100 and 900.

06

WebGPU 3D scene

A raymarched scene (glossy spheres orbiting a torus, with soft shadows) rendered in WGSL on WebGPU. Drag to orbit.

Fallback: when navigator.gpu is missing, the same scene renders in a GLSL WebGL fragment shader.

07

Magnetic + 3D pointer

Depth layers use translateZ parallax while the CTA magnetically follows the cursor.

◎

Depth

Layered translateZ

Fallback: on touch devices with no hover, the effects stay static and the tap still works.

08

Pinned sticky scrollytelling

The graphic stays pinned with position:sticky while the story steps scroll past and drive its state.

01
Live drifted. Edits landed on the server, not in git.
Reconcile. Pull every live change back into source.
Rebuild. Fresh build, then verify-live.sh diff.
Swap. The build goes live atomically.
Builds only. Rebuilding now reproduces live.

Fallback: sticky positioning is supported everywhere. With reduced motion the state changes without tweening.

09

Staggered bento grid reveal

Asymmetric bento tiles cascade in with spring easing and index-based delays. Hit replay to run it again.

9sites live
⚡LCP 2.1s
uptime99.98%
🛡
builds this week47
✓

Fallback: under reduced motion the tiles appear instantly.

10

Custom cursor + micro-interactions

A lerped dot-and-ring cursor that morphs over targets, plus small interactions: like, toggle, copy and check.

Fallback: on touch or coarse pointers the native cursor stays and the micro-interactions still work.

Twenty 2026 techniques: modern CSS primitives, SVG, WebGL, canvas and layout. Each comes with a live demo, a support badge and copy-ready code.

♿ Wrap heavy effects in @media (prefers-reduced-motion: no-preference) { … }, or check matchMedia("(prefers-reduced-motion: reduce)") in JS. Every demo here does that.

01

CSS anchor positioning

Tooltips are tethered to their trigger with anchor-name and position-anchor, and flip automatically with position-try-fallbacks.

Hover or focus a button

Fallback: without anchor positioning (Firefox and Safari before 26), a small script positions each tooltip from getBoundingClientRect().

02

@starting-style enter/exit

Dialogs and popovers animate in and out of display:none using @starting-style and transition-behavior: allow-discrete.

Swap build live?

Build 61ab28c passed verify-live.sh with zero diffs.

🔔 3 sites reported today

Fallback: browsers without @starting-style open and close the dialog instantly, with no animation.

03

Scroll-snap carousel + ::scroll-marker

A native snap carousel whose dots and arrows come from ::scroll-marker and ::scroll-button, with no JavaScript in supporting browsers.

  • 🪵Oak
  • 🌊Coastal
  • 🪨Slate
  • 🌿Sage
  • 🍷Merlot

Fallback: browsers without ::scroll-marker get dot and arrow buttons built in JavaScript; snapping stays native CSS.

04

text-wrap: balance / pretty + gradient text

Balanced headlines with no orphaned last word, plus animated gradient text through background-clip: text.

Every change ships through a build, and nothing gets edited live again

Pretty wrapping avoids a lone word at the end of a paragraph, which makes body copy like this read noticeably cleaner.

Fallback: text-wrap is a progressive enhancement, so browsers without it use normal greedy wrapping.

05

@property animated mesh blobs

Registered custom properties let the browser interpolate gradient stop positions and colors, so the mesh moves with no JS.

@property--x1 --y1 --c1 …

Fallback: without @property the values jump instead of interpolating, and the gradient stays static.

06

SVG path morph + line draw

A stroke-dashoffset line draw, then the path morphs between matching shapes by interpolating its coordinates.

Fallback: interpolation runs in JS, so it works everywhere. Reduced motion jumps straight to the final shape.

07

WebGL dissolve → WebGPU particles

Your noise dissolve + RGB split eats through a static plate and reveals a live particle field — the same attractor sim as Approvals card 30 (WebGPU compute, with a 2D fallback).

hover / tap → particles

Fallback: without WebGL, a CSS fade into the particle canvas. Without WebGPU the particles still run in 2D (same look as card 30’s fallback).

08

Noise grain + animated mesh hero

Blurred drifting color fields with an SVG feTurbulence grain overlay that jitters with steps().

BUSTERS FLOORING

Floors that feel like home.

Fallback: under reduced motion the mesh and grain freeze but still render.

09

Container queries

The card adapts to its container, not the viewport. Drag the handle to resize; it changes layout at 300px and 460px.

🏡
Wolf Creek Cabinets

Custom kitchens, built in Alabama.

★ 4.9120 reviews
400px

Fallback: @container is Baseline. Older browsers keep the stacked mobile layout.

10

Infinite marquee ticker

Seamless looping rows in opposite directions, with mask-image edge fades and pause on hover or focus.

Busters FlooringWolf CreekTFL DoorDrone DudeProfuctionsJoker Joinery
⚡ 47 builds🛡 0 leaks✓ 9 sites⏱ LCP 2.1s📦 61 og images🔁 builds only
WebGPUView Transitions@starting-styleAnchor positioningContainer queries@property

Fallback: under reduced motion the ticker stops and becomes a horizontally scrollable row.

11

CSS offset-path orbit

A badge travels a closed Bézier with offset-path and offset-distance. No JS keyframes — the browser owns the motion.

offset-path · offset-distance

Fallback: without offset-path the badge sits centered; reduced motion freezes it mid-orbit.

12

interpolate-size accordion

Details panels animate height:auto with interpolate-size: allow-keywords — no measured pixel heights, no max-height hacks.

Builds only
Every change ships through a build. Live edits are treated as drift and get pulled back into source.
verify-live.sh
Diffs the live tree against the latest build artifact so nothing sneaks onto the server unnoticed.
Atomic swap
The new build goes live in one rename. Rollback is the previous artifact, one click away.

Fallback: without interpolate-size the panels open instantly at full height.

13

clip-path morph card

A polygon clip-path morphs between two shapes on hover and focus. Pure CSS, no SVG path interpolation.

Fallback: under reduced motion the shape snaps with no tween.

14

Named scroll-timeline scrub

A progress bar is bound to a horizontal scroller with animation-timeline: scroll(nearest inline). Swipe the gallery.

scroll →
Oak
Coastal
Ember
Sage

Fallback: without animation-timeline a scroll listener sets --p on the bar.

15

OKLCH relative color theme

One hue drives a ladder of related colors through oklch(from …). Drag the slider and every swatch recalculates in CSS.

210°
Theme follows the hue

Relative color syntax keeps tints, shades and a shifted accent in lockstep.

Fallback: without relative color syntax the swatches use plain oklch() stops.

16

3D coverflow carousel

Cards sit in a preserve-3d stage and rotateY away from the active index. Arrow keys and buttons step through the stack.

Fallback: under reduced motion the active card swaps without the rotate tween.

17

Radial mask wipe reveal

A radial mask expands from the pointer so the hero reveals through a soft circular wipe. Move across the card.

BEFORE
AFTERBuilds only

move to wipe

Fallback: without mask-image the reveal fades in with opacity.

18

Canvas particle bloom

A 2D canvas leaves glowing trails that bloom toward the pointer. No WebGL — just requestAnimationFrame and soft brushes.

move · trails bloom

Fallback: under reduced motion a static constellation is drawn once.

19

@scope theme islands

Two cards share markup but keep separate light and dark themes with @scope, so styles never leak across the island.

Light island

Scoped rules paint this card only.

Dark island

Same selectors, different @scope.

Fallback: without @scope the themes are applied with plain class selectors.

20

Difference-blend spotlight

A dark circle follows the pointer with mix-blend-mode: difference, inverting whatever it covers. Move across the type.

Invert the light

mix-blend-mode difference turns the spotlight into a live negative.

Fallback: on touch / coarse pointers the spotlight parks in the corner and still inverts.

Ten page-level motion techniques: transitions between views, loading states, scroll-driven depth and notifications. Each has a live demo, a support badge, copy-ready code and a Copy for bots spec.

♿ Every demo here checks prefers-reduced-motion: motion is removed or replaced by an instant state change, and each effect names its fallback.

01

View Transition page morph

Tap a card and its thumbnail morphs into the detail hero through a shared view-transition-name. The demo is same-document; the code box shows the cross-document version.

Pick a card

Fallback: without document.startViewTransition (Firefox before 144), or with reduced motion, the views swap instantly.

02

Skeleton loader to content

Shimmering placeholders hold the layout, then the real cards enter from display:none with @starting-style and an index-based stagger. No keyframes for the entrance.

Inbox
📬Quote requestNew door order from Pell City
📈Weekly reportTraffic is up 18% on mobile
✅Deploy finishedBuild 61ab28c is live

Fallback: browsers without @starting-style show the content instantly when loading finishes.

03

Reading progress + section reveal

The bar is bound to the scroller with animation-timeline: scroll(), and each section fades up with view(). Scroll inside the box.

Scroll-linked, zero JS

Progress comes from the scroll position itself, not from events.

One

Animations run on the compositor, so they stay smooth while the main thread is busy.

Two

animation-range chooses when each section starts and finishes.

Three

The timeline is the scroller, so there is no scroll listener to throttle.

Four

With reduced motion the sections simply stay visible.

Five

That is the whole trick. Keep scrolling to fill the bar.

Fallback: a passive scroll listener drives the bar and an IntersectionObserver adds the reveal class. Reduced motion keeps the bar and drops the reveal.

04

Route-change top progress bar

A slim bar trickles across the top while the next route loads, then completes and fades. Click a route in the mini browser.

/home

Home

Pick another route to see the bar run.

Fallback: none needed. With reduced motion the bar jumps to full and fades with no trickle.

05

Page flip with curl shading

A leaf hinged on its left edge flips in 3D with backface-visibility, while a shadow sweeps across the page underneath. Hover the dog-ear for a peek.

Page two

The page underneath was always there. The flip just uncovers it.

Page one

A leaf rotates on rotateY with its transform-origin on the left edge.

Fallback: with reduced motion the flip is an instant swap with no shading.

06

Staggered content entrance

Every row enters with an index-based delay, blur-to-sharp and a spring easing where linear() is available. Replay to watch it again.

Today
🧱Cut list approved
🛠CNC program loaded
📦Order 4821 packed
🚚Pickup at 3:30 PM
🧾Invoice sent

Fallback: without linear() the cubic-bezier overshoot easing is used. With reduced motion the rows are simply there.

07

Page shatter exit

The page is cloned into a grid of clipped shards that fall away with gravity and spin, revealing the next page underneath.

Goodbye, page

Every shard is a live clone of this card, clipped to one cell of the grid.

v1.0

Fallback: with reduced motion the old page cross-fades to the next one with no shards.

08

Parallax hero, scroll-driven depth

Four layers move at different rates from one scroll() timeline, so depth comes from the scroll position alone. Scroll inside the box.

DEPTH

Sky, far ridge, near ridge, title. Each layer has its own speed.

The layers are plain divs with CSS gradients and clip-path.

No scroll listener runs in browsers with animation-timeline.

Keep going. The hero is leaving at full speed while the sky barely moves.

Fallback: a passive scroll listener writes a CSS variable that the same layers read. With reduced motion the hero stays still.

09

Blur-up image reveal

A 16 pixel placeholder is shown blurred and scaled while the full image loads, then the sharp image fades and de-blurs over it.

Gallery
Generated artwork one
Generated artwork two
Generated artwork three

Fallback: with reduced motion the sharp image replaces the placeholder with no blur transition.

10

Popover toast stack

Each toast is a popover="manual" element in the top layer, so it never fights z-index. They stack at the bottom right of the screen, slide in with @starting-style, and re-flow when one leaves.

Fire a few toasts. They appear at the bottom right of your screen.

Fallback: without the Popover API the toasts are position:fixed elements with the same stacking and a class-driven entrance.

Ten taskbar and navigation patterns: docks, pill navs, tab bars, floating bars, glass headers, command bars, radial menus, breadcrumbs, rails and status bars. Each has a live demo, a support badge, copy-ready code and a Copy for bots spec.

♿ Every demo here checks prefers-reduced-motion: magnification, springs and bounces are dropped, state changes stay instant and fully usable by keyboard.

01

Magnifying dock

Icons scale with a gaussian falloff from the pointer and push their neighbours apart, like the macOS dock. Slide across it with a mouse, finger or the Tab key.

Slide across the dock

Fallback: without JS the icons scale on :hover and :focus-visible only. With reduced motion there is no scaling, just a highlight.

02

Pill nav with morphing indicator

One white pill glides between items. With View Transitions the browser morphs the named indicator; without them a left/width transition does the same job.

Home

Click another item. Arrow keys move too.

Fallback: browsers without document.startViewTransition animate the indicator with a CSS transition on left and width.

03

Bottom tab bar: haptics + badge pop

Tapping a tab bounces its icon and fires a short navigator.vibrate pulse where available. New messages make the badge pop.

Home

Tap the tabs below, then add a message.

Fallback: devices without navigator.vibrate (desktop, iOS Safari) get the visual bounce only. With reduced motion the bounce and pop are removed.

04

Floating bar: hide on scroll-down

…

The action bar slides away while you scroll down and returns the moment you scroll up. Scroll inside the feed.

Scroll down, then up

Cut list approvedOrder 4821 is ready for the saw.
CNC program loadedNested for 3 sheets of birch.
Edge bandingWhite PVC, 0.5 mm.
Hardware kitHinges, pulls and screws packed.
Quality checkEvery door measured twice.
PackedWrapped and strapped on a pallet.
PickupTomorrow at 3:30 PM.
Invoice sentPaid by card.

Fallback: when scroll-state(scrolled) is unavailable (checked by a live probe), a passive scroll listener plus an IntersectionObserver on a top sentinel drive the same hidden state.

05

Glass top bar, blur on scroll

The header starts clear and gains blur, saturation, tint and a shadow over the first 90 pixels of scroll, driven by animation-timeline: scroll().

◆ Acme

Scroll me

Fallback: an IntersectionObserver on a top sentinel toggles a .stuck class that applies the same end state. With reduced motion the state is applied without animation.

06

Command bar with ⌘ hint

A search pill that shows the right shortcut for your platform and lights up the keys when you hold the modifier. Click it, or press the shortcut while this card is on screen.

Fallback: the hint shows Ctrl on non-Apple platforms. Keyboard use is the same everywhere: arrows, Enter, Escape.

07

Radial FAB menu

The floating button fans its actions along a quarter arc with a staggered spring. Escape or an outside tap closes it, and focus returns to the button.

Tap the plus button

Fallback: with reduced motion the items appear in place instantly with no stagger.

08

Breadcrumbs with anchored dropdowns

Each caret opens a popover menu tethered to its crumb with anchor-name and position-anchor. Choosing a sibling rewrites the trail.

Open a crumb menu

Fallback: without anchor positioning (Firefox and Safari before 26) a script places each menu from getBoundingClientRect(). Without the Popover API the menus toggle in place.

09

Vertical rail: hover or long-press

A slim icon rail expands over the content on hover and focus, or after a 450 ms long-press on touch. It overlays, so the page never shifts.

Dashboard

Hover or focus the rail. On touch, press and hold it.

Fallback: keyboard and switch users get the » toggle, and focus inside the rail expands it. Labels stay in the accessibility tree while collapsed.

10

Status bar: live clock + notification dots

A phone-style status bar with a ticking clock, signal and battery, and a row of notification dots that pop in. The battery reads the real level when the browser allows it.

86%

The clock only ticks while this card is on screen.

Fallback: browsers without the Battery API show a fixed 86%. With reduced motion the dots appear without the pop and the colon does not blink.

Twelve fresh 2026 platform features, each with a live demo, a support badge from a real feature test, a working fallback and copy-ready code.

♿ Every demo here respects prefers-reduced-motion: animation is removed and the end state shows instead. Badges read "✓" when your browser runs the native path, otherwise the named fallback is active.

01

Scroll-triggered animations

Cards play when they scroll into view and rewind when they leave, using timeline-trigger, animation-trigger and trigger-scope. No observer code.

Scroll this box ↓

Alpha
Bravo
Charlie
Delta
Echo

Fallback: without animation-trigger (Chrome before 146, Firefox, Safari), an IntersectionObserver toggles a class and CSS transitions do the same in and out.

02

sibling-index() stagger

Each bar reads its own position and the sibling count in CSS for the wave delay and the hue ramp. Add or remove bars and the maths updates itself.

Fallback: where sibling-index() is missing, a short script writes --fr-i and --fr-n on each bar. The CSS below it is unchanged.

03

Animated float shapes

The blob morphs through shape() keyframes and the paragraph re-wraps around it every frame, because shape-outside follows the same animated shape.

Text flows around the blob because shape-outside tracks the very shape that clips it. As the shape morphs, the line boxes re-wrap on every frame, with no JavaScript, no canvas and no float hacks. Resize the window and the lines settle against the moving edge. The wrap follows the curve, not the bounding box, which used to need a static image mask or a polygon computed by script. Keep the motion slow and let people stop it: this page removes it under reduced motion.

Fallback: without shape() (path() is not supported in shape-outside in Chrome), the blob animates an ellipse(), which wraps the same way.

04

Gap decorations

column-rule and row-rule now draw inside grid gaps, and their colour and width animate. Nothing is added to the markup.

123456789

Fallback: where row-rule is missing, each cell draws its own right and bottom dashes with ::after and ::before.

05

background-clip: border-area

A rotating conic gradient is clipped to the border area only, so the frame keeps its rounded corners and the card interior stays solid.

Gradient frame

Painted by the background, not by a mask or a wrapper element.

Fallback: without border-area (Firefox), border-image paints the same gradient. Its limit is square corners.

06

Images inside light-dark()

One declaration swaps the background image with the colour scheme. Each card has its own toggle, so you can see both at once.

Day card

Image and text switch together.

Night card

Each card owns its scheme.

Fallback: without images in light-dark(), a data-s attribute on each card selects the image with plain selectors.

07

alpha() tint ladder

One base colour, nine opacity steps, each written as alpha(from var(--c) / step). Pick a colour and the ladder follows.

102030405060708090

Fallback: color-mix(in srgb, base N%, transparent) gives the same ladder in older browsers.

08

:open disclosure and dialog

Details and dialog animate from the :open pseudo-class: height via ::details-content, and fade plus scale with @starting-style.

What does :open match?

Any element in an open state: details, dialog, and select or input pickers.

Why not [open]?

The attribute only exists on details and dialog. :open also covers popup state.

Hello

This fades and scales in.

Fallback: without :open, the same rules attach to [open], which tracks the same state on details and dialog.

09

text-fit: grow headline

The headline scales to fill its box. Type a new headline or drag the box's resize handle and the text refits.

WOLF CREEK

Fallback: where text-fit is missing, a ten-step binary search on font-size runs on input and on resize.

10

random() confetti

Every piece gets its own position, hue, speed and tilt from random(… element-scoped), with no script. Burst creates fresh elements, so you get fresh numbers.

Fallback: without random(), Math.random() writes the same five custom properties on each piece.

11

progress() gauge readout

The slider value is in pixels. progress() turns it into a 0 to 1 number in CSS, which drives the arc, the colour and the percent readout via a counter.

Fallback: lengths cannot be divided in older calc(), so a script also writes the unitless --fr-nn and the CSS uses calc(var(--fr-nn) / 400).

12

focusgroup toolbar

Tab once into the toolbar, then move with the arrow keys. The focusgroup attribute does the roving focus; Tab leaves the group in one press.

Fallback: without focusgroup, a script sets a roving tabindex and handles the arrow, Home and End keys.