# UI Lab > A reference library of UI patterns for AI coding agents and humans building frontends. > Every pattern is a single self-contained React + Tailwind file with a live demo. How to use: - Pick a pattern below, fetch its /docs/.md (metadata + full source) or /raw/. - Copy src/tokens/tokens.css into the target project first; patterns style themselves with its CSS variables (raw: https://ui-lab-weld.vercel.app/raw/tokens/tokens.css). Tailwind utilities like bg-surface / text-fg-muted map to those tokens via the @theme block in https://ui-lab-weld.vercel.app/raw/index.css. - Every motion pattern respects prefers-reduced-motion. Keep that when adapting. - Machine-readable index: https://ui-lab-weld.vercel.app/patterns.json. Everything in one file: https://ui-lab-weld.vercel.app/llms-full.txt - **Claude: read https://ui-lab-weld.vercel.app/for-claude.md first.** It is the brief-to-build router (worlds, proof sites, techniques, refusals). - Outside references (galleries, studios, open-source demo repos, libraries, tools): https://ui-lab-weld.vercel.app/resources.md - 68 reference teardowns (30 world-class, 20 vibe-coded, 12 recent award winners, 6 community picks) with the pattern that rebuilds each: https://ui-lab-weld.vercel.app/references.md (JSON: https://ui-lab-weld.vercel.app/references.json) ## START HERE: the design procedure Patterns are parts; the playbook is the judgement. Read start-here first, every time you build a UI. - [Start here: how to design a frontend that doesn't look generic](https://ui-lab-weld.vercel.app/playbook/00-start-here.md) - [Accessibility: the short version that actually gets applied](https://ui-lab-weld.vercel.app/playbook/accessibility.md) - [Briefs: how to ask, and how to write the five lines](https://ui-lab-weld.vercel.app/playbook/briefs.md) - [Glossary: design and web words, in plain language](https://ui-lab-weld.vercel.app/playbook/glossary.md) - [Inspiration: how to take it without copying it](https://ui-lab-weld.vercel.app/playbook/inspiration.md) - [Niche worlds: when the product has a physical or editorial home](https://ui-lab-weld.vercel.app/playbook/niche-worlds.md) - [Prompts: what to say to your AI assistant](https://ui-lab-weld.vercel.app/playbook/prompts.md) - [Reference sites: what fifty good (and popular) UIs have in common](https://ui-lab-weld.vercel.app/playbook/reference-sites.md) - [Recipe: scroll-driven 3D product site](https://ui-lab-weld.vercel.app/playbook/scroll-3d-recipe.md) - [Site types: what goes on the page, in what order](https://ui-lab-weld.vercel.app/playbook/site-types.md) - [Verify: the loop that stops "mid and buggy"](https://ui-lab-weld.vercel.app/playbook/verify.md) - [Worlds: design directions to start from](https://ui-lab-weld.vercel.app/playbook/worlds.md) - [Site stack detector](https://ui-lab-weld.vercel.app/tools/site-stack.mjs): `node site-stack.mjs ` lists the libraries a reference site uses - [Accessibility sweep](https://ui-lab-weld.vercel.app/tools/axe-crawl.js): paste into a browser console to run axe-core over every pattern and site ## Foundations - [Design tokens](https://ui-lab-weld.vercel.app/docs/tokens.md): Color, type, spacing, radius, elevation and motion tokens. Light/dark aware, no flash. [design tokens, css variables, theme, dark mode, color, typography, spacing] - [Contrast checker (WCAG)](https://ui-lab-weld.vercel.app/docs/contrast-checker.md): Pick two colours and see the WCAG contrast ratio, with plain pass or fail for normal text, large text and UI parts at AA and AAA, and a live sample. [contrast, wcag, colour, accessibility, tool] - [Fluid type scale](https://ui-lab-weld.vercel.app/docs/fluid-type.md): A type scale where every size is a clamp() between a narrow-screen and wide-screen size, with a base size and ratio you can change, and the CSS to copy. [typography, fluid, clamp, type scale, css] ## Components - [Buttons](https://ui-lab-weld.vercel.app/docs/buttons.md): Primary / secondary / ghost / danger, three sizes, loading state and a tactile press. [button, cta, loading, variants] - [Command palette](https://ui-lab-weld.vercel.app/docs/command-palette.md): Ctrl/⌘K launcher on the native : focus trap, Esc and backdrop for free, arrow-key navigation. [cmdk, search, command menu, keyboard, dialog, ctrl k] - [Toasts](https://ui-lab-weld.vercel.app/docs/toast.md): Provider + useToast() hook. Stacks up to four, auto-dismisses, springs in, announced via aria-live. [notification, snackbar, feedback, alert] - [Drawer](https://ui-lab-weld.vercel.app/docs/drawer.md): Left or right sheet on the native , with animated exit and backdrop fade. [sheet, side panel, dialog, filters, off-canvas] - [Sound opt-in](https://ui-lab-weld.vercel.app/docs/sound-opt-in.md): Asks before playing sound with two equal choices, remembers the answer and leaves a small equaliser toggle. [audio, consent, sound toggle, immersive] - [Liquid glass button](https://ui-lab-weld.vercel.app/docs/liquid-glass-button.md): Glass pill: backdrop blur + saturate, bevel shadows, and a pointer-following highlight on registered CSS properties. [glassmorphism, liquid glass, button, backdrop-filter, @property] - [Expanding cards](https://ui-lab-weld.vercel.app/docs/expanding-cards.md): A rail of tall slivers; the active one widens into a full card. Caption laid out at final width so it never rewraps. [accordion, cards, gallery, hover expand, flex-grow] - [Morph pill card](https://ui-lab-weld.vercel.app/docs/morph-pill-card.md): An avatar pill that grows into a full profile card: one surface animating between two sizes. [morph, hover card, profile, avatar, expand] - [Fan deck](https://ui-lab-weld.vercel.app/docs/fan-deck.md): A hand of cards splayed from one pivot below the deck; the focused card lifts out of the spread. [cards, fan, deck, rotate, transform-origin] - [Form controls](https://ui-lab-weld.vercel.app/docs/form-controls.md): Input with hint/error, switch, checkbox, radio cards, select and range, all native elements restyled. [form, input, switch, checkbox, radio, select, slider, validation] - [Animated tabs](https://ui-lab-weld.vercel.app/docs/animated-tabs.md): Segmented tabs with a sliding indicator, full WAI-ARIA tabs keyboard pattern. [tabs, segmented control, indicator, aria tabs] - [Accordion / FAQ](https://ui-lab-weld.vercel.app/docs/accordion.md): Native
accordion with smooth height (interpolate-size) and exclusive open via name. [accordion, faq, details, collapsible, disclosure] - [Tooltip](https://ui-lab-weld.vercel.app/docs/tooltip.md): Shows on hover and focus, hides on Escape, linked with aria-describedby. [tooltip, hint, popover, aria-describedby] - [Confirm modal](https://ui-lab-weld.vercel.app/docs/confirm-modal.md): Destructive-action dialog: focus starts on Cancel, type-to-confirm guard, native . [modal, dialog, confirm, destructive, delete] - [Magnifying dock](https://ui-lab-weld.vercel.app/docs/dock.md): macOS-style dock: icons grow with a cosine falloff by distance to the pointer. [dock, macos, magnify, navigation, hover] - [OTP / code input](https://ui-lab-weld.vercel.app/docs/otp-input.md): Six boxes that act as one field: auto-advance, backspace, arrows, paste-to-fill, SMS autofill. [otp, one-time code, pin, verification, 2fa] - [Stepper](https://ui-lab-weld.vercel.app/docs/stepper.md): Numbered steps with a filling rail and checks for completed steps. [stepper, wizard, progress, steps, onboarding] - [Loading, empty & error states](https://ui-lab-weld.vercel.app/docs/loading-states.md): Skeleton shimmer, empty state, error with retry and loaded list: the four states of any data view. [skeleton, empty state, error state, loading, placeholder] - [Input effects](https://ui-lab-weld.vercel.app/docs/floating-inputs.md): Floating label, underline-draw and border-trace inputs using :placeholder-shown, no JS. [input, floating label, form, focus effect, css only] - [Particle burst button](https://ui-lab-weld.vercel.app/docs/particle-button.md): Click spawns dots that fly out and fade via WAAPI; exported burst() works on any element. [particles, confetti, burst, click, celebrate] - [SVG distortion button](https://ui-lab-weld.vercel.app/docs/distort-button.md): feTurbulence + feDisplacementMap wobble on hover/focus, animated then removed so text stays crisp. [svg filter, distortion, turbulence, hover, glitch] - [Progress button](https://ui-lab-weld.vercel.app/docs/progress-button.md): The button fills as its own progress bar, then morphs into a success check. [progress, button, upload, loading, morph] - [Gooey FAB menu](https://ui-lab-weld.vercel.app/docs/gooey-menu.md): Action bubbles melt out of a floating button via an SVG goo filter; icons stay crisp on a separate layer. [gooey, fab, svg filter, menu, blob] - [Animated toggle icons](https://ui-lab-weld.vercel.app/docs/animated-icons.md): Hamburger↔close, heart with burst ring, bookmark fill, play↔pause path morph, self-drawing check. [icons, toggle, hamburger, like, svg, morph] - [Fullscreen overlay menu](https://ui-lab-weld.vercel.app/docs/fullscreen-menu.md): Circle clip-path reveal from the toggle, big links sliding up from masks, hover image previews. [menu, overlay, navigation, clip-path, stagger] - [Accessible autocomplete (combobox)](https://ui-lab-weld.vercel.app/docs/combobox.md): An autocomplete following the ARIA combobox pattern: focus stays in the input, arrows move through options, Enter picks, Esc closes, and the result count is announced. [combobox, autocomplete, aria-activedescendant, search, form] - [Keyboard date picker](https://ui-lab-weld.vercel.app/docs/date-picker.md): A calendar grid of buttons with the keyboard model people expect (arrows, Home, End, Page Up and Down), roving tabindex, past dates disabled, and a typed input alongside. [date picker, calendar, grid, roving tabindex, form] - [Dropdown action menu](https://ui-lab-weld.vercel.app/docs/menu-button.md): The ARIA menu-button pattern: a button opens a menu of actions, arrow keys move, type-ahead jumps, Esc closes and returns focus, Tab and outside clicks close. [menu, dropdown, menuitem, keyboard, roving focus] - [Pagination and breadcrumbs](https://ui-lab-weld.vercel.app/docs/pagination-breadcrumbs.md): Labelled breadcrumb and pagination navs: the current page is aria-current, ellipses collapse long ranges to seven slots, and a status line says which results are shown. [pagination, breadcrumbs, navigation, aria-current, lists] - [Carousel that does not trap anyone](https://ui-lab-weld.vercel.app/docs/accessible-carousel.md): A slide carousel with Previous, Next and dot controls, an announced position, auto-play off by default, a visible Pause, and hidden slides made inert. [carousel, slider, aria-roledescription, autoplay, inert] - [Alerts that say it in words](https://ui-lab-weld.vercel.app/docs/alert-banners.md): Error, warning, success and info messages with an icon shape and a text label so colour is only reinforcement, correct live-region roles, and labelled dismiss buttons. [alert, banner, status, aria-live, feedback] - [Password field with live rules](https://ui-lab-weld.vercel.app/docs/password-field.md): A password input with a Show and Hide button, rules that tick off in words, and a strength estimate written out, allowing paste and using new-password autocomplete. [password, form, strength, validation, input] - [Accessible file dropzone](https://ui-lab-weld.vercel.app/docs/file-dropzone.md): A drop area that is really a button that opens the file picker, so keyboard users are never left out, with stated limits, written errors and a labelled Remove for each file. [upload, dropzone, file, form, drag and drop] ## Text - [Scramble text](https://ui-lab-weld.vercel.app/docs/scramble-text.md): Text decodes into place, characters cycling through glyphs and locking in left to right. [text effect, decode, glitch, typewriter, hacker, intro] - [Focus reveal](https://ui-lab-weld.vercel.app/docs/focus-reveal.md): Blurred words come sharp one at a time as a camera-style focus frame travels to each measured word box. [text effect, blur, focus, headline, camera] - [Split text reveal](https://ui-lab-weld.vercel.app/docs/split-text-reveal.md): Headline split into words or letters that slide up from masks with a stagger when scrolled into view. [split text, stagger, reveal, headline, gsap alternative] - [Typewriter](https://ui-lab-weld.vercel.app/docs/typewriter.md): Types, holds, deletes and cycles phrases with a blinking caret. [typewriter, typing, rotating words, caret] - [Shimmer text & running border](https://ui-lab-weld.vercel.app/docs/shimmer-text.md): Gradient shine sweeping across text, and a conic-gradient border that runs around a button. @property animations. [shimmer, gradient text, conic gradient, animated border, @property] - [Glitch text](https://ui-lab-weld.vercel.app/docs/glitch-text.md): RGB-split glitch from two clip-path-banded pseudo-element copies; plays on hover. [glitch, rgb split, clip-path, hover, cyberpunk] - [Link hover effects (8)](https://ui-lab-weld.vercel.app/docs/link-hover-effects.md): Grow underline, centre-out, strike, highlighter, text roll, arrow nudge, double line, colour sweep: pure CSS classes. [link, underline, hover, css only, navigation] - [Scroll typography (blur, highlight, fill)](https://ui-lab-weld.vercel.app/docs/scroll-blur-text.md): Words un-blur, markers sweep behind key phrases, and words fill with colour as you read. CSS view timelines only. [scroll, typography, blur, highlight, animation-timeline, css only] ## Motion - [Scroll reveal (CSS only)](https://ui-lab-weld.vercel.app/docs/scroll-reveal.md): Elements fade and rise as they enter the viewport using animation-timeline: view(). Zero JS. [scroll animation, reveal, fade in, animation-timeline, css only] - [Shared-element view transition](https://ui-lab-weld.vercel.app/docs/view-transition-grid.md): A card morphs into its detail view with the View Transitions API. Falls back to an instant swap. [view transitions, shared element, page transition, morph, gallery] - [Count-up stats](https://ui-lab-weld.vercel.app/docs/count-up.md): Numbers animate from 0 when scrolled into view, with tabular figures so width stays stable. [counter, stats, numbers, kpi, intersection observer] - [Spotlight card](https://ui-lab-weld.vercel.app/docs/spotlight-card.md): Cursor-following glow and slight 3D tilt, driven by CSS variables so React never re-renders. [hover effect, glow, tilt, cursor, card] - [Blueprint intro](https://ui-lab-weld.vercel.app/docs/blueprint-intro.md): Construction lines draw across the frame, then the logo traces itself, then the tagline fades in. SVG stroke animation. [intro, loader, svg, line drawing, stroke-dashoffset, logo animation] - [Pinned horizontal scroll](https://ui-lab-weld.vercel.app/docs/pinned-horizontal.md): Vertical scroll drives a horizontal track inside a pinned (sticky) frame. No library. [scroll, sticky, pin, horizontal scroll, scrollytelling, parallax] - [Magnetic button](https://ui-lab-weld.vercel.app/docs/magnetic-button.md): Button leans toward the pointer inside its hover area, label leans further, springs back on leave. [magnetic, hover, cursor, button, micro-interaction] - [Custom cursor](https://ui-lab-weld.vercel.app/docs/custom-cursor.md): Dot + eased ring cursor with blend-mode inversion; grows and shows a label over [data-cursor] elements. [cursor, custom cursor, mix-blend-mode, hover label, lerp] - [Cursor image trail](https://ui-lab-weld.vercel.app/docs/image-trail.md): Images drop along the pointer path and fade/scale out, recycled from a fixed pool. [image trail, cursor, hover, web animations api, playful] - [Sticky stacking cards](https://ui-lab-weld.vercel.app/docs/stacking-cards.md): Cards pin with increasing offsets and pile up as you scroll; buried cards shrink via a view timeline. No JS. [sticky, stack, scroll, cards, animation-timeline] - [Zoom-out framed hero](https://ui-lab-weld.vercel.app/docs/zoom-out-hero.md): Full-bleed hero image that shrinks into a rounded window as you scroll (clip-path), headline scaling with it. [hero, scroll, clip-path, zoom, frame, cinematic] - [Reading progress bar](https://ui-lab-weld.vercel.app/docs/scroll-progress.md): Progress bar driven by a CSS scroll timeline, no JS. [progress, scroll, reading, animation-timeline, indicator] - [Hover image list](https://ui-lab-weld.vercel.app/docs/hover-image-list.md): Editorial list; hovering a row floats its image near the cursor while other rows dim. [hover, image reveal, list, editorial, portfolio index] - [Image caption hovers (6)](https://ui-lab-weld.vercel.app/docs/caption-hover.md): Slide-up caption, zoom + dim, split reveal, frame draw, circle clip reveal and greyscale-to-colour. [hover, image, caption, card, portfolio, clip-path] - [Direction-aware hover](https://ui-lab-weld.vercel.app/docs/direction-aware-hover.md): The overlay slides in from the edge the pointer entered and leaves through the edge it exits. [hover, direction, overlay, grid, pointer] - [Layered image tilt](https://ui-lab-weld.vercel.app/docs/image-tilt.md): Image plus translucent copies and a title move at different depths with the pointer. [tilt, parallax, layers, hover, depth] - [Click ripple & shockwave](https://ui-lab-weld.vercel.app/docs/click-ripple.md): Ripple from the exact press point (or centre for keyboard), plus a ring shockwave variant. [ripple, material, click, feedback, waapi] - [Pixel page transition](https://ui-lab-weld.vercel.app/docs/pixel-transition.md): A grid of squares covers the screen in random order, the page swaps, then it clears. [page transition, pixel, grid, route change] - [Layered wipe transition](https://ui-lab-weld.vercel.app/docs/layered-wipe.md): Three coloured panels sweep across with a stagger, page swaps under cover, they exit the other side. [page transition, wipe, clip-path, curtain, stagger] - [Elastic grid scroll](https://ui-lab-weld.vercel.app/docs/elastic-columns.md): Each column follows scroll with its own lag; the middle one counter-moves, so the grid stretches and settles. [scroll, parallax, grid, lerp, elastic] - [Pixelated image reveal](https://ui-lab-weld.vercel.app/docs/pixel-image-load.md): Images resolve from big crisp blocks to full resolution when scrolled into view (canvas, smoothing off). [pixel, image reveal, canvas, loading, scroll] - [Flashlight reveal](https://ui-lab-weld.vercel.app/docs/flashlight-reveal.md): A dark, blurred cover with a radial mask hole that follows the pointer, plus a Reveal-all button. [mask, spotlight, cursor, reveal, mask-image] - [Counter preloader](https://ui-lab-weld.vercel.app/docs/preloader.md): Big 000→100 counter with realistic pauses and a thin bar, then curtains split to reveal the page. [preloader, loader, counter, intro, curtain] ## Backgrounds - [Animated mesh gradient](https://ui-lab-weld.vercel.app/docs/mesh-gradient.md): Three blurred blobs drifting on offset loops, plus SVG grain. Pure CSS hero background. [gradient, background, blob, hero, grain, css only] - [Shader backgrounds](https://ui-lab-weld.vercel.app/docs/shader-background.md): One WebGL shader, seven looks (mesh, aurora, swirl, voronoi, flame, halftone, metal) and 16 palette presets with a print-like dither. [shader, webgl, glsl, aurora, flame, voronoi, halftone, metal, gradient, background, hero] - [Dot grid warp](https://ui-lab-weld.vercel.app/docs/dot-grid-warp.md): A faint dot grid that bends toward the pointer like a rubber sheet under a weight. Canvas 2D, Gaussian falloff. [canvas, interactive background, dots, grid, pointer, gravity] - [Warp starfield](https://ui-lab-weld.vercel.app/docs/starfield.md): Stars rushing toward the camera as streaks; hover engages warp speed. Canvas 2D. [starfield, space, warp, canvas, particles, background] - [Synthwave perspective grid](https://ui-lab-weld.vercel.app/docs/perspective-grid.md): Neon grid floor scrolling toward you under a striped sun. Pure CSS. [synthwave, retro, grid, perspective, neon, 80s] - [Morphing blob](https://ui-lab-weld.vercel.app/docs/morph-blob.md): Organic gradient blob cycling border-radius shapes while rotating. No JS. [blob, organic, gradient, border-radius, background] - [WebGL liquid slideshow](https://ui-lab-weld.vercel.app/docs/liquid-slideshow.md): Noise-displaced UVs melt one image into the next in a single fragment shader, no library. [webgl, slideshow, distortion, displacement, shader, transition] - [Scroll morphing shapes](https://ui-lab-weld.vercel.app/docs/morph-shapes.md): One SVG path lerps between blob keyframes while rotating and shifting hue as you scroll. [svg, morph, path, scroll, blob] ## 3D - [3D ring carousel](https://ui-lab-weld.vercel.app/docs/ring-carousel.md): Cards on a true CSS 3D cylinder; drag to spin with momentum, snaps to the nearest card. [carousel, 3d, css 3d, drag, momentum, cylinder, slider] - [Depth coverflow](https://ui-lab-weld.vercel.app/docs/coverflow.md): Coverflow where cards turn edge-on, sink and blur with distance from the active one. Plain CSS 3D. [coverflow, carousel, 3d, depth, slider] - [Particle globe](https://ui-lab-weld.vercel.app/docs/particle-globe.md): A sphere of points on a Fibonacci lattice with a noise land mask; drag to spin with momentum. Canvas 2D. [globe, sphere, particles, canvas, 3d, drag, earth] - [Helix gallery (spiral of pictures)](https://ui-lab-weld.vercel.app/docs/helix-gallery.md): Images wound onto a helix that turns and climbs; far side dims and blurs. Drag to spin, idle rotation. [spiral, helix, 3d gallery, images, carousel, css 3d, drag] - [DNA double-helix carousel](https://ui-lab-weld.vercel.app/docs/dna-carousel.md): Two opposing strands of pictures joined by rungs, drifting along the axis; depth from scale, blur and z-sort. [dna, double helix, 3d, carousel, images, drag] - [Wave gallery](https://ui-lab-weld.vercel.app/docs/wave-gallery.md): An endless ribbon of cards bent into a depth wave; cards crest toward you and sink into fog. Drag or wheel to travel. [wave, 3d, gallery, infinite, fog, ribbon] - [Sphere gallery](https://ui-lab-weld.vercel.app/docs/sphere-gallery.md): Images spread over a sphere (Fibonacci lattice), billboarded, rotating on both axes with inertia. [sphere, globe, 3d gallery, images, drag, inertia] - [Scroll tunnel](https://ui-lab-weld.vercel.app/docs/scroll-tunnel.md): Fly forward through a corridor of images as you scroll; cards emerge from the fog and pass the camera. [tunnel, scroll, 3d, fly through, z-axis, immersive] - [Swipe card stack](https://ui-lab-weld.vercel.app/docs/swipe-stack.md): Tinder-style stack: drag the top card, it tilts and flies off past a threshold; buttons and arrow keys do the same. [swipe, tinder, card stack, drag, gesture, mobile] - [3D flip card](https://ui-lab-weld.vercel.app/docs/flip-card.md): Two faces back-to-back that flip on Y; hover for pointers, click/Enter for everyone. [flip, card, 3d, backface-visibility, hover] - [Depth parallax layers](https://ui-lab-weld.vercel.app/docs/depth-parallax.md): Scene layers shift by depth against the pointer plus a slight whole-card tilt; CSS variables, no re-renders. [parallax, layers, depth, hover, tilt, illustration] - [3D cube slider](https://ui-lab-weld.vercel.app/docs/cube-slider.md): Four slides on the faces of a rotating cube; prev/next turn it 90°. [cube, slider, 3d, carousel, rotate] - [Arc carousel](https://ui-lab-weld.vercel.app/docs/arc-carousel.md): Cards riding a huge circle; one shared transform-origin means rotate() alone places and tilts them. [arc, carousel, rotate, transform-origin, slider] - [Extruded 3D text](https://ui-lab-weld.vercel.app/docs/extruded-text.md): Chunky 3D type from a generated stack of text-shadows, tilting toward the pointer. [3d text, text-shadow, extrude, typography, retro] - [3D grid on scroll](https://ui-lab-weld.vercel.app/docs/scroll-3d-grid.md): Images rotate in from depth as they enter and tilt away as they leave, via CSS view timelines. [3d, scroll, grid, perspective, animation-timeline] ## 3D Motion - [Cursor-following 3D robot](https://ui-lab-weld.vercel.app/docs/cursor-robot.md): Boxy robot mascot: head turns to the cursor, glowing eyes slide inside the visor, antenna springs with lag, eyes brighten on hover. [three.js, react three fiber, cursor follow, robot, mascot, character, eyes] - [Floating shapes that dodge the cursor](https://ui-lab-weld.vercel.app/docs/floating-shapes.md): Glossy clearcoat 3D shapes bob in space and get pushed away by the cursor (pointer projected onto the scene), springing back home. [three.js, floating, repel, cursor, physics, shapes, hero] - [Scroll-driven 3D object](https://ui-lab-weld.vercel.app/docs/scroll-model.md): A 3D planet turns, slides, tilts and recolours through keyframes as text sections scroll past, like an Apple-style product story. [three.js, scroll, scrollytelling, product, keyframes, 3d] - [Refractive glass torus](https://ui-lab-weld.vercel.app/docs/glass-shape.md): A glass torus (MeshTransmissionMaterial) with chromatic aberration refracts big type behind it and tilts toward the cursor. [three.js, glass, refraction, transmission, chromatic aberration, hero] - [Liquid 3D blob](https://ui-lab-weld.vercel.app/docs/distort-blob.md): Noise-distorted sphere that leans toward the cursor, wobbles harder and swells on hover, and changes colour on click. [three.js, blob, distort, liquid, orb, hover, ai] - [Particle morph](https://ui-lab-weld.vercel.app/docs/particle-morph.md): 4,000 particles ripple between a sphere, cube, torus knot and wave plane, rotating toward the cursor. [three.js, particles, morph, points, shape, additive] - [3D keycap](https://ui-lab-weld.vercel.app/docs/keycap-3d.md): A glossy keycap that tilts toward the cursor and physically presses on click, Space/Enter, or when you type its letter. [three.js, keyboard, keycap, press, button, 3d] - [360° product viewer](https://ui-lab-weld.vercel.app/docs/product-viewer.md): Drag-to-orbit product with idle auto-rotate, colourway swatches and hotspots pinned to the model. [three.js, product, orbit controls, 360, configurator, ecommerce, hotspots] - [Animated 3D robot mascot (real rigged model)](https://ui-lab-weld.vercel.app/docs/robot-mascot.md): A rigged, animated GLB character plays its Idle clip while its Head bone and body turn toward the cursor on top of the animation; emote buttons (Wave, Yes, No, Thumbs up, Jump, Dance) crossfade and return to Idle. [three.js, gltf, glb, rigged character, skeletal animation, bone, look at cursor, mascot, emote] - [Fox that chases the cursor](https://ui-lab-weld.vercel.app/docs/fox-follow.md): A rigged fox runs, walks and idles toward the cursor's point on a floor (raycast to ground plane), turning along the shortest angle and crossfading its baked clips. [three.js, gltf, character, follow cursor, raycast, locomotion, animation blending] - [Instanced ripple grid](https://ui-lab-weld.vercel.app/docs/ripple-grid.md): 1,600 cubes in one draw call rise and brighten around the cursor; clicking fires a shockwave ring across the field. [three.js, instancedmesh, grid, ripple, shockwave, cursor, wave] - [Cursor water ripples](https://ui-lab-weld.vercel.app/docs/water-surface.md): A shader-displaced water plane: expanding rings drop along the cursor path (16-drop ring buffer), normals from finite differences catch the light. [three.js, shader, glsl, water, ripple, vertex displacement, cursor] - [Cursor torchlight on 3D tiles](https://ui-lab-weld.vercel.app/docs/cursor-light-tiles.md): A relief wall of randomly deep tiles lit only by a warm point light that follows the cursor, raking shadows across every edge. [three.js, lighting, point light, relief, tiles, instancedmesh, cursor] - [Curved WebGL photo gallery](https://ui-lab-weld.vercel.app/docs/curved-gallery.md): Photos wrap around the inside of a cylinder; drag or wheel to spin with inertia; the hovered photo ripples out from the pointer in a vertex shader. [three.js, webgl gallery, cylinder, images, shader, ripple, drag] - [Cursor square lens](https://ui-lab-weld.vercel.app/docs/square-lens.md): Greyscale photo with a square colour lens following the cursor: magnified, RGB-split at the edges, outlined. One fragment shader. [shader, lens, rgb shift, cursor, image reveal, magnify] - [Swinging lanyard badge](https://ui-lab-weld.vercel.app/docs/lanyard-badge.md): A conference badge hangs on a Verlet-rope lanyard, swings with inertia, and can be grabbed and flung. No physics library. [verlet, rope, physics, badge, drag, swing] - [Raymarched metaballs](https://ui-lab-weld.vercel.app/docs/metaballs.md): Iridescent liquid blobs merge and split (smooth-min SDFs); one blob follows the cursor. Single full-screen shader. [raymarching, sdf, metaballs, shader, liquid, iridescent] - [Magnetic needle field](https://ui-lab-weld.vercel.app/docs/iron-filings.md): 1,200 needles (one InstancedMesh) turn to point at the cursor like iron filings; nearby ones stand up and glow hot. [instancedmesh, magnet, field, needles, cursor, compass] - [Boid flock chasing the cursor](https://ui-lab-weld.vercel.app/docs/boid-flock.md): 220 birds with separation, alignment and cohesion, steering toward the cursor so the swarm chases and swirls. [boids, flocking, swarm, simulation, instancedmesh, cursor] - [Spiral galaxy](https://ui-lab-weld.vercel.app/docs/spiral-galaxy.md): 30,000 stars on spiral arms with differential rotation in a vertex shader, tilting toward the cursor. [particles, galaxy, points, shader, space, additive] - [Particle typography](https://ui-lab-weld.vercel.app/docs/particle-text.md): A word rendered as particles (sampled from a 2D canvas) that springs back into shape while the cursor blasts it apart. [particles, text, typography, cursor, spring, explode] - [Neon sign with bloom](https://ui-lab-weld.vercel.app/docs/neon-sign.md): Glass tubes bent from CatmullRom paths with emissive material and a Bloom post-process; flickers on and toggles on click. [neon, bloom, postprocessing, tube geometry, glow, flicker] - [Portal card (window into a world)](https://ui-lab-weld.vercel.app/docs/portal-card.md): A card whose surface is a window into a separate 3D scene (MeshPortalMaterial); tilting it with the cursor reveals parallax inside. [portal, mesh portal material, parallax, card, world, tilt] - [3D dice roll](https://ui-lab-weld.vercel.app/docs/dice-roll.md): Two dice thrown with bounces and wild spin that settle exactly on pre-chosen faces; total announced. [dice, random, physics feel, quaternion, slerp, game] - [Self-scrambling puzzle cube](https://ui-lab-weld.vercel.app/docs/twist-cube.md): A 3×3 cube turns random layers by re-parenting cubelets to a pivot, then snapping them back to the grid; orbits with the cursor. [rubik, puzzle, cube, pivot, reparent, layer rotation] - [Newton's cradle](https://ui-lab-weld.vercel.app/docs/newton-cradle.md): Five chrome balls with energy handing over through the middle; click to release a ball. Chrome reflects a generated gradient environment. [physics, pendulum, chrome, environment map, desk toy] - [Waving cloth flag](https://ui-lab-weld.vercel.app/docs/cloth-flag.md): A pinned flag rippling on layered sine waves with recomputed normals; the cursor adds a gust and a bulge. [cloth, flag, wind, vertex animation, waves] - [Cursor snake](https://ui-lab-weld.vercel.app/docs/cursor-snake.md): A glossy segmented snake slithers after the cursor using a follow-the-leader distance constraint. [snake, follow, chain, constraint, cursor, playful] - [Endless terrain flyover](https://ui-lab-weld.vercel.app/docs/terrain-flyover.md): Low-poly, height-coloured landscape scrolling forever via noise offset, fog at the edge; cursor banks and steers the camera. [terrain, procedural, noise, flyover, low poly, landscape] - [Exploding crystal](https://ui-lab-weld.vercel.app/docs/explode-shape.md): A faceted crystal bursts into its triangles along face normals on hover/focus and snaps back together. [explode, shards, faces, hover, assemble] - [Audio-reactive 3D ring](https://ui-lab-weld.vercel.app/docs/audio-bars.md): A ring of 64 bars driven by a real AnalyserNode on music synthesised in the browser; nothing plays until you press Play. [audio, web audio, analyser, visualizer, music, instancedmesh] - [Interactive solar system](https://ui-lab-weld.vercel.app/docs/solar-system.md): Planets orbit on tilted rings; hover pauses and highlights; click flies the camera to a planet and shows its facts. [solar system, orbit, camera fly-to, click select, education] - [Cursor comet with light trails](https://ui-lab-weld.vercel.app/docs/comet-trail.md): A glowing comet follows the cursor springily, painting a fading ribbon, with three orbiting sparks leaving their own trails. [trail, cursor, light painting, comet, ribbon] - [Isometric room diorama](https://ui-lab-weld.vercel.app/docs/iso-room.md): Orthographic iso room built from primitives; hovering furniture lifts and labels it; scene parallax-tilts with the cursor. [isometric, orthographic, diorama, room, hover, portfolio] - [Poppable soap bubbles](https://ui-lab-weld.vercel.app/docs/soap-bubbles.md): Thin-film iridescent bubbles drift upward; click to pop into a droplet ring; count announced. [bubbles, iridescent, thin film, shader, click, pop] - [Scroll fly-through on a 3D path](https://ui-lab-weld.vercel.app/docs/spline-flythrough.md): Scroll moves the camera along a CatmullRom spline past image cards, looking ahead so it banks through turns. [scroll, camera path, spline, fly through, gallery, storytelling] - [Holographic foil card](https://ui-lab-weld.vercel.app/docs/hologram-card.md): A trading card with a foil shader: rainbow sheen, sparkles and glare shift with tilt as it follows the cursor. [holographic, foil, shader, card, tilt, sparkle] - [Marbles with cursor gravity](https://ui-lab-weld.vercel.app/docs/marble-gravity.md): 60 glossy marbles are pulled to the cursor, collide and cluster; hold the mouse button to repel. [physics, collision, gravity, marbles, instancedmesh, cursor] - [Kinetic typography ring](https://ui-lab-weld.vercel.app/docs/kinetic-type-ring.md): Bands of looping text wrap around cylinders, spinning in alternate directions around a chrome knot, tilting with the cursor. [kinetic typography, text, cylinder, loop, rotate] - [Click-to-shatter glass](https://ui-lab-weld.vercel.app/docs/glass-shatter.md): An image pane breaks into radial shards around the click point, which fly, spin and fall, then the pane restores. [shatter, glass, shards, click, physics, image] ## Layouts - [Bento grid](https://ui-lab-weld.vercel.app/docs/bento-grid.md): Six-column grid with mixed tile spans and dense packing. Collapses to one column on phones. [bento, grid, features, layout, dashboard summary] - [Article with sticky contents list](https://ui-lab-weld.vercel.app/docs/article-layout.md): A reading layout with a 65-character measure, a sticky table of contents that marks the current section, reading time and generous leading. [article, reading, toc, scrollspy, typography] - [Layout primitives (stack, cluster, sidebar…)](https://ui-lab-weld.vercel.app/docs/layout-primitives.md): Six tiny CSS layouts (stack, cluster, sidebar, switcher, center, auto grid) that respond to available space with no media queries. [layout, flexbox, grid, css, responsive] - [Masonry with CSS columns](https://ui-lab-weld.vercel.app/docs/masonry-columns.md): Cards of different heights packed into columns with CSS only. Notes the one catch: order runs down each column, not across. [masonry, columns, gallery, css, layout] ## Sections - [Pricing tiers](https://ui-lab-weld.vercel.app/docs/pricing-tiers.md): Three plans with a monthly/yearly radiogroup, featured middle card, tick lists and a ghost wordmark. [pricing, plans, section, billing toggle, saas] - [Wordmark footer](https://ui-lab-weld.vercel.app/docs/wordmark-footer.md): Newsletter, link columns and a giant wordmark bleeding off the bottom edge, sized with container query units. [footer, wordmark, newsletter, container queries, section] - [Contact section](https://ui-lab-weld.vercel.app/docs/contact-section.md): Promise list, contact rows and a glass form with labelled fields, validation summary and success state. [contact, form, validation, section, enquiry] - [Testimonial wall](https://ui-lab-weld.vercel.app/docs/testimonial-wall.md): Masonry of quote cards in columns scrolling opposite ways with faded edges. [testimonials, social proof, masonry, marquee, reviews] - [Split hero](https://ui-lab-weld.vercel.app/docs/split-hero.md): Headline, announcement pill, dual CTA and avatar proof beside a rotated image collage. [hero, landing page, cta, collage, social proof] - [Logo cloud & stats](https://ui-lab-weld.vercel.app/docs/logo-cloud.md): Greyscale logos that light up on hover plus a stats band as a definition list. [logos, clients, stats, social proof, trust] - [Site header with skip link and mobile menu](https://ui-lab-weld.vercel.app/docs/site-nav.md): A header with a skip link, a labelled nav landmark, aria-current on the active page, and a menu button on small screens that closes with Esc and returns focus. [header, navigation, mobile menu, skip link, aria-current] - [FAQ with native details and search](https://ui-lab-weld.vercel.app/docs/faq-section.md): An FAQ on native details elements with a search box that reports how many answers match, and an Open all button. Works without script. [faq, accordion, details, search, content] - [Fair cookie consent banner](https://ui-lab-weld.vercel.app/docs/cookie-banner.md): A consent banner where Reject and Accept have equal weight, nothing is pre-ticked, optional categories are explained, and the choice can be reopened. [cookies, consent, privacy, banner, gdpr] - [Sign-up form with real validation](https://ui-lab-weld.vercel.app/docs/newsletter-form.md): An email sign-up with a visible label, the right keyboard, an error tied to the field and announced, a busy state and a clear success message. [form, email, validation, newsletter, aria-invalid] - [Feature rows (not a card grid)](https://ui-lab-weld.vercel.app/docs/feature-rows.md): Each feature gets its own row with the picture alternating sides, with DOM order that stays heading, text, picture. [features, landing, rows, section, layout] - [How it works (numbered steps)](https://ui-lab-weld.vercel.app/docs/how-it-works.md): An ordered list of steps with a connecting line, announced as a real list with step numbers, stacking on narrow screens. [steps, process, ordered list, section, onboarding] - [Plan comparison table](https://ui-lab-weld.vercel.app/docs/comparison-table.md): A comparison where every cell says Included or Not included in words, with proper headers, the recommended plan marked in text, and sideways scrolling in a focusable region. [comparison, pricing, table, plans, accessibility] - [Closing call to action](https://ui-lab-weld.vercel.app/docs/cta-band.md): One sentence, one button, one line of reassurance, in a high-contrast band with its own heading. [cta, call to action, banner, section, conversion] - [Team as a list](https://ui-lab-weld.vercel.app/docs/team-list.md): People as rows of name, role and one real sentence, in a description list, instead of a wall of identical cards. [team, about, people, list, section] - [Single large testimonial](https://ui-lab-weld.vercel.app/docs/pull-quote.md): One testimonial set large in a real figure with blockquote and figcaption, attributed with name, role and tenure. [testimonial, quote, blockquote, social proof, section] ## Screens - [Analytics dashboard](https://ui-lab-weld.vercel.app/docs/analytics-dashboard.md): Full screen: sidebar, KPI tiles with sparklines, paired bar chart, arc dial, donut and orders table, all hand-drawn SVG. [dashboard, admin, charts, svg charts, kpi, table, donut, sparkline] - [Auth screen](https://ui-lab-weld.vercel.app/docs/auth-screen.md): Split sign-in/up: brand quote panel, social buttons, email/password with show/hide and correct autocomplete. [login, signup, auth, form, password] - [Kanban board](https://ui-lab-weld.vercel.app/docs/kanban-board.md): Columns with drag-and-drop cards plus a per-card "Move to" select as the keyboard path. [kanban, drag and drop, board, tasks, trello] - [AI chat screen](https://ui-lab-weld.vercel.app/docs/chat-ui.md): Message log, bubbles, typing indicator, suggestion chips and an auto-growing composer. [chat, ai assistant, messages, composer, chatbot] - [Sortable, filterable data table](https://ui-lab-weld.vercel.app/docs/data-table.md): A real table with scoped headers, sort buttons in the header cells with aria-sort, a filter that reports its row count, tabular figures, and a scroll region on phones. [table, sort, filter, aria-sort, data] - [Shop with basket and live totals](https://ui-lab-weld.vercel.app/docs/shop-cart.md): Product rows, a basket with quantity steppers that stop at one, a separate Remove button, a subtotal and delivery that update in a live region, and a free-delivery nudge. [shop, cart, ecommerce, stepper, totals] - [Settings with switches and unsaved changes](https://ui-lab-weld.vercel.app/docs/settings-screen.md): Switches with visible On and Off words, fieldsets, an unsaved-changes message with Save and Discard, and a separate confirmed delete action. [settings, switch, form, fieldset, confirm] - [Helpful 404 page](https://ui-lab-weld.vercel.app/docs/not-found-page.md): A 404 that says what happened and offers search, popular pages and the home page. No joke needed. [404, error page, search, recovery] - [Search with filters](https://ui-lab-weld.vercel.app/docs/faceted-search.md): A search box and grouped checkbox filters with counts, removable chips for what is applied, a live result count and an honest empty state. [search, filters, facets, checkbox, results] - [First-run checklist](https://ui-lab-weld.vercel.app/docs/onboarding-checklist.md): A getting-started checklist with real checkboxes, a progress bar and words, a suggested next step, any order, and a way to hide it. [onboarding, checklist, progress, first run, app] ## Sites - [Site: SOLAR (3D product scroll)](https://ui-lab-weld.vercel.app/docs/site-solar.md): A complete product site. One procedural 3D can spins through three flavors as you scroll; label, palette and copy swap on every turn. [site, full page, product, 3d, scroll, gsap, scrolltrigger, lenis, react three fiber, can, palette, pinned] - [Site: MARE (editorial luxury)](https://ui-lab-weld.vercel.app/docs/site-mare.md): A slow-travel quarterly. A framed photograph opens to full bleed, a pinned horizontal photo essay slides sideways, and the contents list previews images at the cursor. [site, full page, editorial, serif, luxury, horizontal scroll, pin, clip-path, parallax, gsap, lenis, cursor preview] - [Site: Lattice (technical dark)](https://ui-lab-weld.vercel.app/docs/site-lattice.md): A developer-database landing page. A scroll-scrubbed terminal drives a live canvas edge network that reacts to the pointer, plus a working Ctrl K palette and a latency race. [site, full page, dark, developer, terminal, canvas, network, command palette, scrolltrigger, gsap, lenis] - [Site: HOT MESS (neo-brutalist)](https://ui-lab-weld.vercel.app/docs/site-hotmess.md): A coffee roaster with attitude. A pile of stickers you can grab and throw (hand-rolled pointer physics), hard offset shadows, marquees and a live bag configurator. [site, full page, brutalist, zine, stickers, drag, physics, pointer events, configurator, marquee, shop] - [Site: ABYSS (cinematic descent)](https://ui-lab-weld.vercel.app/docs/site-abyss.md): An ocean descent where scroll is depth. One full-screen fragment shader draws light shafts, marine snow and bioluminescence; a depth gauge and a pointer lantern complete it. [site, full page, cinematic, immersive, webgl, glsl, shader, scroll, depth, three, lenis] - [Site: MERIDIAN NIGHT RAIL (departures board)](https://ui-lab-weld.vercel.app/docs/site-departures.md): A night-train brand set as a station departure hall. A split-flap board that resolves letter by letter, a route map whose line draws itself with a train riding it, a berth comparison table and a ticket that prints. [site, full page, niche world, departures board, split flap, transit, timetable, svg map, offset-path, ticket, signage] - [Site: HEDGEROW PRESS (field notebook)](https://ui-lab-weld.vercel.app/docs/site-herbarium.md): A pressed-plant print shop set as an open field notebook: a taped plate with numbered callouts and handwritten notes, a specimen index, and a plant press you turn with a slider to watch a flower dry and flatten over fourteen days. [site, full page, niche world, herbarium, field notebook, botanical, paper, handwriting, procedural svg, slider, craft] - [Site: KESTREL K-1 (cassette deck)](https://ui-lab-weld.vercel.app/docs/site-tape.md): A product page where the product plays: a cassette deck whose generated drum-and-bass loop runs through a switchable tape stage (saturation, roll-off, wobble), with VU needles that read the real signal, turning reels and a tape counter. Finish chooser re-skins the panel. [site, full page, niche world, hi-fi, tape deck, webaudio, analyser, vu meter, hardware, product, skeuomorphic] - [Site: THE LEDGER (broadsheet newsletter)](https://ui-lab-weld.vercel.app/docs/site-ledger.md): A finance newsletter set as a broadsheet: masthead, ruled columns, a markets table with sign-and-arrow change, a long essay with justified hyphenated text, marginal sidenotes, a reading progress rule and a text-size control. [site, full page, niche world, broadsheet, editorial, newspaper, reading, sidenotes, table, newsletter, serif] - [Site: HARROW SOUND (tide and pilotage)](https://ui-lab-weld.vercel.app/docs/site-tidewater.md): A harbour authority page where the chart is the tool: pick a vessel draft, scrub the time of day, and a generated seabed redraws as the tide moves. Land dries, shallows turn hazard-pink, and a plain sentence says whether the channel is safe to enter. [site, full page, niche world, nautical chart, tide, canvas, marching squares, operate, form, data] - [Site: THE SALT ROAD (museum exhibition)](https://ui-lab-weld.vercel.app/docs/site-salt-road.md): An exhibition site where the object leads: six drawn artefacts, each with a proper wall placard, a Large print switch that scales every label, and an audio-guide keypad that jumps to a stop, shows its transcript and plays a soft tone. [site, full page, niche world, museum, placard, exhibition, audio guide, large print, svg, experience] - [Site: PEBBLE (terminal portfolio)](https://ui-lab-weld.vercel.app/docs/site-pebble.md): A systems engineer’s portfolio as a terminal that really works: help, ls, cat, projects, open, theme, history, tab completion and arrow-key recall, over real content. One button swaps it for an ordinary page with the same content. [site, full page, niche world, terminal, bbs, portfolio, keyboard, command line, theme, developer] - [Site: LIGHTHOUSE FORECAST (plain-text weather)](https://ui-lab-weld.vercel.app/docs/site-plain-forecast.md): A weather page set as plain text: one monospace column, no images, charts drawn with characters. Every character chart has a real table beside it, so the density is honest and the page loads instantly. [site, full page, niche world, plain text, ascii, weather, data, monospace, minimal, operate] - [Site: PIP (tiny-habits app)](https://ui-lab-weld.vercel.app/docs/site-pip.md): A friendly app landing page in the Soft Playful world: a mascot whose eyes follow you and who changes mood as you tick habits in a live demo, pastel fields with two hot pops, big rounded shapes and springy easing. [site, full page, soft playful, mascot, app landing, consumer, rounded, spring, pastel, persuade] - [Site: THE COMMUTE REPORT (data poster)](https://ui-lab-weld.vercel.app/docs/site-commute-report.md): An annual report set as a Swiss data poster: a toggleable twelve-column grid, one earned giant statistic, charts labelled directly, three type sizes, tabular figures and a single red. A line chart draws on, bars grow, and every chart has its data as a real table. [site, full page, swiss grid, data poster, report, chart, svg, tabular figures, grid overlay, read] - [Site: CRUMB & CO. (neighbourhood bakery)](https://ui-lab-weld.vercel.app/docs/site-crumb.md): A local bakery in the Warm Organic world: hand-drawn bakes in arch frames on grainy oat paper, a stamp, and a line that draws under the headline. It also works: bakes show ready, sold out or not yet baked at a chosen hour, the order form totals live, and open-now comes from the real hours. [site, full page, warm organic, bakery, local business, grain, arch, hand-drawn, order form, food] - [Site: FENWICK & ODE (blueprint engineering)](https://ui-lab-weld.vercel.app/docs/site-blueprint.md): A structural engineering practice set as a drawing sheet: title block, grid paper, dimension lines, a truss that draws itself, and a working quick beam check whose diagram bends as you change span, load and material. Sums are the textbook ones, labelled indicative. [site, full page, niche world, blueprint, engineering, drawing, svg, calculator, grid paper, operate] - [Site: TILL ROLL (receipt-style order page)](https://ui-lab-weld.vercel.app/docs/site-till-roll.md): A coffee roaster whose order page is a till receipt: choose beans and the roll prints a line for each, with dotted leaders, a running total, a tip selector and a barcode generated from the order. Torn edges are a CSS mask. [site, full page, niche world, receipt, thermal, shop, order form, monospace, barcode, persuade] - [Site: A GENTLE GUIDE TO CURVES (explorable explainer)](https://ui-lab-weld.vercel.app/docs/site-curves.md): An explorable guide that builds a Bezier curve in four steps (line, quadratic, cubic, easing). Each passage sits beside a figure you can drag, nudge with the arrow keys and scrub with a slider, and the formula, SVG path and CSS easing update as you move. [site, full page, niche world, explorable, explainer, bezier, svg, drag, easing, read] - [Site: SPECIMEN, FRAUNCES (type specimen)](https://ui-lab-weld.vercel.app/docs/site-specimen.md): A type specimen for an open-source variable serif, where you drive the real axes: weight, optical size, softness and wonk reshape the letterforms live. Also a character set to inspect, a size ladder and a text tester for your own words. [site, full page, niche world, type specimen, variable font, typography, font-variation-settings, tool, read] - [Site: PHOSPHOR ARCADE (CRT cabinet with a playable game)](https://ui-lab-weld.vercel.app/docs/site-arcade.md): A CRT arcade cabinet in the browser with a game you can really play: a canvas Snake on a fixed timestep with arrow keys, WASD and on-screen buttons, under phosphor glow, scanlines and a gentle flicker. The effect is cosmetic; scores and instructions are plain text. [site, full page, niche world, crt, retro, arcade, canvas, game, snake, scanlines, experience] ## Signature moves - [Drive-the-site world](https://ui-lab-weld.vercel.app/docs/move-drive-world.md): Navigation as play: a top-down car you drive with the keys (or by holding the pointer) around zones that open sections. [signature move, game, canvas, keyboard, physics, portfolio, navigation] - [Particle field that leans to the cursor](https://ui-lab-weld.vercel.app/docs/move-particle-attractor.md): Hundreds of depth-sorted particles that spring toward the pointer and settle back. [signature move, particles, canvas, cursor, parallax, immersive] - [Physics balls](https://ui-lab-weld.vercel.app/docs/move-physics-balls.md): Verlet circles that fall, pile up and get shoved by the cursor; click to drop more. [signature move, physics, verlet, canvas, playful, cursor] - [Scroll tunnel (scroll as camera)](https://ui-lab-weld.vercel.app/docs/move-scroll-tunnel.md): Frames stacked along the Z axis; scrolling flies the camera through them. Pure CSS 3D with one CSS variable per scroll. [signature move, scroll, 3d, css, perspective, camera] - [Liquid hover (SVG displacement)](https://ui-lab-weld.vercel.app/docs/move-liquid-hover.md): An element that warps under the pointer using an SVG feTurbulence + feDisplacementMap filter. No WebGL. [signature move, svg filter, displacement, hover, distortion, css] - [Glyph trail](https://ui-lab-weld.vercel.app/docs/move-glyph-trail.md): The cursor drops the letters of a word along its path, each rising and fading. DOM nodes spawned by distance. [signature move, cursor, trail, text, playful, dom] - [Scroll-scrubbed frame sequence](https://ui-lab-weld.vercel.app/docs/move-frame-scrub.md): A pinned canvas whose frame number is the scroll progress, the technique behind product-page scroll films. Frames are drawn procedurally so the demo needs no assets. [signature move, scroll, canvas, frame sequence, pinned, product, apple] - [Living mesh-gradient hero](https://ui-lab-weld.vercel.app/docs/move-mesh-gradient.md): Soft colour blobs drifting on sine paths over a base colour, drawn at tiny resolution and scaled up, behind a light large headline. [signature move, gradient, mesh, canvas, hero, fintech] - [Spotlight grid (shared pointer glow)](https://ui-lab-weld.vercel.app/docs/move-spotlight-grid.md): Card borders glow toward the pointer, and the light travels across the gaps between cards because it is tracked once on the grid. [signature move, spotlight, glow, grid, cards, pointer, dark] - [Grid with travelling beams](https://ui-lab-weld.vercel.app/docs/move-grid-beams.md): A quiet grid with short gradient beams that travel along random lines and fade out. One canvas. [signature move, grid, beams, canvas, dark, background] - [Self-typing command launcher](https://ui-lab-weld.vercel.app/docs/move-command-demo.md): A command palette that types a query on its own, then answers to real input: filter, arrow keys, Enter. [signature move, command palette, keyboard, combobox, search, launcher] - [Tilted marquee rows](https://ui-lab-weld.vercel.app/docs/move-tilt-marquee.md): Rows of cards drifting in opposite directions inside a 3D perspective tilt, pausing on hover or focus. [signature move, marquee, 3d tilt, gallery, css, perspective] - [Morphing tab pill](https://ui-lab-weld.vercel.app/docs/move-morph-tabs.md): A tab bar whose highlight is one shape that slides and recolours between tabs. Roving tabindex and arrow keys. [signature move, tabs, pill, morph, tablist, color, spring] - [Rotary knob with detents](https://ui-lab-weld.vercel.app/docs/move-rotary-knob.md): A hardware-style knob turned by dragging, scrolling or arrow keys, with 12 detents and a mono readout. [signature move, knob, slider, hardware, drag, detent, audio] - [Dot-matrix type](https://ui-lab-weld.vercel.app/docs/move-dot-matrix.md): Text drawn as a grid of dots that swell and light up near the pointer, like an LED matrix. [signature move, dot matrix, canvas, type, led, hover] - [Odometer numbers](https://ui-lab-weld.vercel.app/docs/move-odometer.md): Digits that roll like a mechanical odometer: each is a 0-9 strip that slides, so only changed digits move. [signature move, number, counter, odometer, tabular, fintech] - [Code to preview toggle](https://ui-lab-weld.vercel.app/docs/move-code-to-preview.md): A segmented control that cross-fades a code window into the thing the code produces. [signature move, code, preview, tabs, developer, cross-fade] - [Keyboard-run inbox](https://ui-lab-weld.vercel.app/docs/move-shortcut-inbox.md): A mini inbox operated entirely from the keyboard: j/k move, e archive, s star, u undo, with visible buttons. [signature move, keyboard, inbox, shortcuts, listbox, speed] - [Desktop-as-homepage](https://ui-lab-weld.vercel.app/docs/move-desktop-home.md): A page built as an OS desktop: icons open draggable windows that come to the front when clicked. [signature move, desktop, windows, drag, metaphor, playful, os] - [State-machine button](https://ui-lab-weld.vercel.app/docs/move-state-button.md): A button that is always in exactly one of idle, hover, press, loading or success, each with its own pose. [signature move, state machine, button, loading, success, interaction] - [Monumental type](https://ui-lab-weld.vercel.app/docs/move-monument-type.md): One word set so large (62cqw) that its container clips it, with small calm text for contrast. No JavaScript. [signature move, typography, giant type, container query, portfolio, cqw] - [Stacking toasts](https://ui-lab-weld.vercel.app/docs/move-toast-stack.md): Toasts that stack like cards and fan out on hover or focus so each can be read and dismissed. [signature move, toast, stack, notification, spring, sonner] - [Live CSS explainer](https://ui-lab-weld.vercel.app/docs/move-live-css.md): Sliders drive a live element and the CSS that produces it, side by side, from one state. [signature move, explorable, sliders, css, education, docs] - [Inertial scroll with rail](https://ui-lab-weld.vercel.app/docs/move-scroll-rail.md): Wheel input eased by a lerp (what smooth-scroll libraries do), with a progress rail and live velocity readout. [signature move, smooth scroll, lerp, lenis, velocity, progress] - [Solid/outline marquee](https://ui-lab-weld.vercel.app/docs/move-outline-marquee.md): Giant words scrolling in opposite rows, alternating filled and stroked, inverting on hover. Pure CSS. [signature move, marquee, outline text, type, css, studio] - [Labelled cursor](https://ui-lab-weld.vercel.app/docs/move-label-cursor.md): A lagging dot that grows into a labelled pill ('View', 'Play') over elements marked data-cursor. [signature move, cursor, custom cursor, label, portfolio, lerp] - [Scrollytelling chart](https://ui-lab-weld.vercel.app/docs/move-scrollytelling.md): Text steps scroll past a sticky SVG chart; the step nearest the middle sets the chart's state. [signature move, scrollytelling, chart, svg, intersection observer, editorial] - [Book stack menu](https://ui-lab-weld.vercel.app/docs/move-book-stack.md): A pile of covers where the one you point at or focus slides out of the stack and the others make room. [signature move, stack, books, hover, catalogue, serif] - [Draggable block grid](https://ui-lab-weld.vercel.app/docs/move-block-grid.md): A grid of mixed blocks you rearrange by dragging, in one type size; Alt+Arrow keys move a focused block. [signature move, drag, grid, reorder, curation, keyboard] - [Scrollspy table of contents](https://ui-lab-weld.vercel.app/docs/move-scrollspy.md): A sticky contents list that highlights the section nearest the top of the reading area, via one IntersectionObserver. [signature move, scrollspy, toc, docs, intersection observer, navigation] - [SVG-mask hero (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-mask-hero.md): Type as a window onto moving colour: an SVG mask shows a gradient only where the letters are. [signature move, svg mask, hero, type, gradient, v0] - [Globe to map morph (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-globe-to-map.md): Blends orthographic and equirectangular projections so a globe unrolls into a flat map. No D3. [signature move, globe, map, projection, canvas, dataviz, v0] - [Frame grid that trades space (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-frame-grid.md): Hover or focus a frame and it grows while its row grows in the grid, so layout reflows around attention. [signature move, layout, grid, flex, hover, v0] - [Email capture with every state (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-email-capture.md): Idle, invalid-after-blur, submitting, success and server-error states for a waitlist or newsletter form. [signature move, form, email, validation, waitlist, states, v0] - [Progressive blur edge (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-blur-edge.md): Stacked, masked backdrop-filter layers that ramp the blur toward the edge so content dissolves instead of being cut off. [signature move, gradient blur, backdrop-filter, mask, scroll, v0] - [Isometric room with pathfinding (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-isometric-room.md): Click a tile and an avatar walks there by breadth-first search around furniture; arrow keys step it. [signature move, isometric, pathfinding, bfs, canvas, game, v0] - [Particle logo (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-particle-logo.md): A logo made of particles that scatter from the pointer and spring back. A 2D canvas replaces GLSL. [signature move, particles, logo, canvas, spring, v0] - [Sticky footer reveal (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-sticky-footer.md): The page lifts like a curtain to reveal a footer pinned underneath. Pure CSS. [signature move, sticky, footer, reveal, parallax, css, v0] - [Collapsible dashboard shell (v0)](https://ui-lab-weld.vercel.app/docs/move-v0-dashboard-shell.md): An app shell with a collapsible sidebar, view tabs and a slide-in chat panel. [signature move, dashboard, sidebar, app shell, tabs, chat, v0] - [Perforated cover tear (Neutomni)](https://ui-lab-weld.vercel.app/docs/move-perforated-reveal.md): A poster-sized wordmark with a dashed cut line. Scrolling slides the top half up and the bottom half down to reveal what was underneath. [signature move, hero, scroll, clip, reveal, wordmark, awwwards] - [Drafting sheet drawing (Heron AI)](https://ui-lab-weld.vercel.app/docs/move-drafting-rules.md): Fine red rules close in on a pencil elevation that draws itself line by line as you scroll. SVG stroke offsets and transforms only. [signature move, svg, drawing, blueprint, paper, scroll, awwwards] - [Inverting header (twks)](https://ui-lab-weld.vercel.app/docs/move-difference-nav.md): A sticky header in white with mix-blend-mode difference, so it stays readable over any light or dark band. No JavaScript. [signature move, header, navigation, blend mode, css, awwwards] - [Word-by-word focus pull (Butter)](https://ui-lab-weld.vercel.app/docs/move-focus-words.md): A statement that sharpens one word at a time as you scroll, while rounded icon chips drift across it. Blur and opacity only. [signature move, text, blur, scroll, saas, awwwards] - [System status modules (Pensatori Irrazionali)](https://ui-lab-weld.vercel.app/docs/move-status-modules.md): Numbered monospace modules with IDs, a column of status lines and a turning globe. The module in view becomes active and the lights come on in order. [signature move, monospace, status, scroll, documentation, awwwards] - [Scatter and grid layout toggle (Gil Huybrecht)](https://ui-lab-weld.vercel.app/docs/move-scatter-grid.md): The same tiles in a tidy grid or scattered like prints on a table; a toggle moves them with transforms only. [signature move, portfolio, gallery, grid, layout toggle, awwwards] - [Counter into wordmark (Edolus)](https://ui-lab-weld.vercel.app/docs/move-counter-wordmark.md): A percentage counts up in the dark, then the wordmark rises into place letter by letter. Replayable. [signature move, preloader, wordmark, counter, text, awwwards] - [Sentence with inline picture chips (Noho)](https://ui-lab-weld.vercel.app/docs/move-inline-chips.md): A statement where small pictures sit between the words at the size of a letter, each word and chip rising through its own mask as you scroll. [signature move, typography, inline images, reveal, scroll, awwwards] - [One script word in a bold headline (LxL Creative)](https://ui-lab-weld.vercel.app/docs/move-script-accent.md): A heavy caps headline with a single hand-written word in the brand accent, tilted and overlapping the lines. Type your own word to test it. [signature move, typography, script, headline, accent, awwwards] - [CSS halftone split screen (Aspen Search)](https://ui-lab-weld.vercel.app/docs/move-halftone-split.md): Flat black and grey panels with halftone dot imagery made in CSS from a tone gradient and a dot grid, and huge type. The dots follow the pointer. [signature move, halftone, css, split screen, poster, awwwards] - [Scroll-reactive accent band (Boc.Studio)](https://ui-lab-weld.vercel.app/docs/move-band-ticker.md): One flat accent band across a rich image, carrying the logo and a line of facts on repeat. It drifts slowly and speeds up and reverses with your scrolling. [signature move, marquee, ticker, scroll velocity, band, awwwards] - [A creature that follows the cursor (Leo Parpeix)](https://ui-lab-weld.vercel.app/docs/move-feed-the-bee.md): A small bee eases toward the pointer, tilts as it travels and beats its wings. Click to drop a crumb and it goes for it. [signature move, cursor, playful, creature, svg, awwwards] - [Outlined name with a script alias (Tim Van Damme)](https://ui-lab-weld.vercel.app/docs/move-outline-lockup.md): A stroke-only display name, a marker-script alias in one warm colour, and hand-drawn doodles over a CSS halftone portrait. Toggle the doodles. [signature move, typography, outline text, script, halftone, doodles, portfolio] - [Contact-sheet project index (Office Commun)](https://ui-lab-weld.vercel.app/docs/move-contact-sheet.md): Projects as a label line above one horizontal strip of variable-width tiles, with snap scrolling and keyboard and button controls. No cards. [signature move, index, strips, portfolio, scroll snap, minimal] - [The sky as a gradient (sky.dlazaro.ca)](https://ui-lab-weld.vercel.app/docs/move-sky-gradient.md): The sun's height above the horizon is computed from the time, the date and the latitude, and that one number picks a vertical sky gradient. Scrub the day and change the place. [signature move, gradient, time of day, generative, sun, background] ## Niche worlds - [Split-flap departures board](https://ui-lab-weld.vercel.app/docs/niche-split-flap.md): A mechanical-style board where each cell cycles forward through the alphabet to its target, with a falling flap per step. A hidden table mirrors the content. [niche world, split flap, departures, board, transit, timetable, niche] - [Botanical plate with callouts](https://ui-lab-weld.vercel.app/docs/niche-plate-callouts.md): A hand-built SVG botanical plate with numbered callouts; pointing at a number lights the part and shows a handwritten field note. [niche world, botanical, plate, annotation, callout, svg, herbarium, niche] - [Hi-fi deck with real VU meters](https://ui-lab-weld.vercel.app/docs/niche-vu-deck.md): Analogue-style VU meters whose needles read a WebAudio AnalyserNode while a generated arpeggio plays, plus transport and level controls. [niche world, audio, vu meter, webaudio, hardware, hi-fi, niche] - [Broadsheet columns and ticker](https://ui-lab-weld.vercel.app/docs/niche-broadsheet.md): Newspaper typography in pure CSS: double-rule masthead, justified hyphenated columns with a drop cap, a spanning pull quote and a market ticker. [niche world, newspaper, columns, drop cap, editorial, ticker, css, niche] - [CRT scanlines and phosphor](https://ui-lab-weld.vercel.app/docs/niche-crt.md): The phosphor look in CSS only: scanlines, vignette, glow and curvature, with a flicker, and a keyboard-operable menu. [niche world, crt, scanlines, retro, arcade, phosphor, css, niche] - [Museum wall label with audio guide](https://ui-lab-weld.vercel.app/docs/niche-museum-placard.md): A gallery placard set in proper hierarchy with an audio-guide keypad and a large-print toggle that scales the whole label. [niche world, museum, placard, label, audio guide, accessibility, niche] - [Seed packet with planting calendar](https://ui-lab-weld.vercel.app/docs/niche-seed-packet.md): An illustrated packet that tilts to the pointer and tears open along a perforation, revealing a planting calendar table. [niche world, seed packet, packaging, calendar, 3d tilt, organic, niche] - [Text-mode terminal with real prompt](https://ui-lab-weld.vercel.app/docs/niche-terminal-bbs.md): A boot sequence that prints line by line, then a working prompt with help, ls, cat, theme and clear commands. [niche world, terminal, bbs, ansi, command line, text mode, niche] - [Tarot cards that turn over](https://ui-lab-weld.vercel.app/docs/niche-tarot.md): Three illustrated cards on a velvet table that flip in 3D to reveal a glyph and a reading; reshuffle deals a new draw. [niche world, tarot, cards, flip, 3d, mystic, niche] - [Clinical medicine label](https://ui-lab-weld.vercel.app/docs/niche-clinical-label.md): A pharmacy label designed for clarity under risk: strict hierarchy, large tabular doses, a boxed warning with icon and word, and a tickable daily schedule. [niche world, clinical, medicine, label, health, clarity, niche] - [Type specimen with live axes](https://ui-lab-weld.vercel.app/docs/niche-specimen.md): How a type foundry sells a typeface: a giant glyph, a character set, a size ladder and sliders for the variable axes (weight, optical size, softness, wonk). [niche world, type specimen, variable font, axes, typography, fraunces, niche] - [Nautical chart with tide slider](https://ui-lab-weld.vercel.app/docs/niche-nautical-chart.md): Depth contours generated with marching squares, printed soundings and a tide slider that moves the water line. [niche world, nautical, chart, contours, marching squares, map, svg, niche] ## Modern CSS - [Scroll-driven reveal, no JavaScript](https://ui-lab-weld.vercel.app/docs/css-scroll-reveal.md): Cards animate as they enter the scroll box using animation-timeline: view(), wrapped in @supports so unsupported browsers just show the cards. [modern css, scroll-driven, view timeline, animation, no javascript] - [Native popover menu with entry animation](https://ui-lab-weld.vercel.app/docs/css-popover-starting.md): A menu using the Popover API and @starting-style: the browser handles open, close, light dismiss, top layer and focus return; CSS animates it. [modern css, popover, starting-style, menu, top layer] - [Anchor-positioned tooltip](https://ui-lab-weld.vercel.app/docs/css-anchor-tooltip.md): A tooltip tied to its trigger with anchor positioning; the browser flips it to the other side when there is no room. [modern css, anchor positioning, tooltip, position-area] - [Balanced text, growing textarea, :has()](https://ui-lab-weld.vercel.app/docs/css-type-niceties.md): text-wrap balance and pretty, a textarea that grows with field-sizing: content, and a field group styled from its input by :has(). [modern css, text-wrap, field-sizing, has selector, typography] - [Blur-up placeholder from six colours](https://ui-lab-weld.vercel.app/docs/css-blur-up-placeholder.md): A soft placeholder built in CSS from six colours (eighteen bytes) that sits behind a photograph while it loads, then the image fades in. The idea behind blurhash, with no decoder. [modern css, placeholder, lqip, blur, images, performance] - [Multi-stroke text (concentric outlines)](https://ui-lab-weld.vercel.app/docs/css-multi-stroke-text.md): A headline with two concentric outlines in different colours, made from rings of text-shadow, with sliders and colour pickers. Stays real text. [modern css, text, stroke, outline, text-shadow, typography] ## Data viz - [Event timeline](https://ui-lab-weld.vercel.app/docs/timeline.md): Vertical rail with aligned mono timestamps and confidence-coloured dots. Rows reveal on scroll. [timeline, activity feed, history, events] - [SVG charts (line, heatmap, radar)](https://ui-lab-weld.vercel.app/docs/charts.md): Area chart with crosshair + keyboard, contribution heatmap and radar chart, all hand-drawn SVG. [chart, line chart, area chart, heatmap, radar, svg] ## Recipes - [Infinite marquee](https://ui-lab-weld.vercel.app/docs/marquee.md): Seamless looping strip with faded edges, pause on hover, any speed and direction. [marquee, ticker, logo wall, infinite scroll, loop] - [Container-query card](https://ui-lab-weld.vercel.app/docs/container-query-card.md): A card that rearranges itself by the width of its container, not the screen: stacked when narrow, picture beside text when wide. [container queries, responsive, card, css] - [Scroll-snap gallery](https://ui-lab-weld.vercel.app/docs/scroll-snap-gallery.md): A horizontal row that stops neatly on each slide using only scroll-snap, usable with touch, trackpad, scrollbar and arrow keys. [scroll snap, gallery, carousel, css] - [Sticky table header and first column](https://ui-lab-weld.vercel.app/docs/sticky-table-header.md): A table whose header and first column stay in view while the body scrolls both ways, using position sticky on cells. [table, sticky, scroll, css, data] - [Truncate without losing text](https://ui-lab-weld.vercel.app/docs/line-clamp.md): Line-clamp a paragraph to three lines with a Read more button, and ellipsis a single line, while keeping the full text in the page. [line clamp, truncate, ellipsis, css, text] - [Focus rings people can see](https://ui-lab-weld.vercel.app/docs/focus-rings.md): Three focus-visible ring styles (offset outline, two-colour, gap and ring) that survive any background, with a dark-background example. [focus, focus-visible, keyboard, accessibility, css] - [System, Light, Dark switch](https://ui-lab-weld.vercel.app/docs/color-scheme-toggle.md): A three-way colour-scheme choice where System follows the operating setting live, scoped to its own box so it does not change the page. [dark mode, theme, prefers-color-scheme, switch, settings] --- # Start here: how to design a frontend that doesn't look generic This is the operating procedure for any agent (or human) building a website or UI with UI Lab. The patterns in this library are the *parts*. This document is the *judgement* that decides which parts, why, and how to know the result is good. Follow it in order. Do not open an editor before step 3. ## Why output usually comes out "mid" Four causes, in order of impact: 1. **No target.** "Make it premium" has no content. The model falls back to the average of everything it has seen: dark gradient, glass cards, Inter, fade-in-up on every section. 2. **No signature moment.** Premium sites are built around one idea (a product that spins, a number that counts the page's argument, a cursor that carries the brand). Everything else supports it. Without one, you get a pile of sections. 3. **No assets.** The impressive sites run on a model, a frame sequence, a video, real photography, an illustration system. Gradient blobs are what you get instead. 4. **No verification.** Scroll, 3D and motion code breaks in ways reading it never reveals. If the result was never rendered, scrolled and screenshotted, it is probably broken. The procedure below attacks each of these. ## The procedure ### 1. Brief (5 lines, written down) Write these before anything else. If you can't, ask the user one sharp question; do not guess a whole site. - **Who** visits, **where** (laptop at a desk, phone on a train), **in what mood**. - **Mode** (what success looks like for the visitor): - *Persuade*: they decide and act (landing, product, campaign). Design is the product. - *Operate*: they finish a task (app, dashboard, admin). Scannability and consistency beat expression. - *Read*: they understand something (docs, article). Structure for comprehension first. - *Experience*: they are inside the work (portfolio, showcase). The artifact leads, the UI recedes. - **The one memorable moment** (Persuade/Experience). One sentence. "The can spins while features change colour." - **Real content.** Actual copy, numbers, names. Invent plausible ones if missing and flag them as placeholders. - **Constraints**: stack, deadline, devices, brand assets, things the user already said they hate. ### 2. Inspiration (real, not remembered) Before that, skim [`reference-sites.md`](reference-sites.md): sixty-eight teardowns (30 world-class sites, 20 vibe-coded UIs, 12 recent award winners, 6 community picks) with the measured facts and a **Signature moves** pattern for each technique we took; pick 2-3 whose signature moment matches your content. Then start with UI Lab's own five finished sites (category **Sites**: `site-solar`, `site-mare`, `site-lattice`, `site-hotmess`, `site-abyss`; open each full screen from its pattern page): each is a different world with a different signature moment, so you can see what "committed" looks like before studying outside references. Never design from memory of what "good" looks like. Go look. See [inspiration.md](inspiration.md) for the method. Minimum: three references, one teardown each. Output is a short note per reference: - the single idea that makes it work - what is technically happening (run `tools/site-stack.mjs `; open DevTools; scroll it slowly) - type, palette logic, motion pacing - what you will take, and what you will deliberately not Then **synthesize**: the move from A, the palette logic from B, the type attitude from C, all rebuilt around *this* product's content. Never copy code, copy text, brand assets or exact layouts. Re-implement the technique. ### 3. Commit to a world Pick or invent a direction from [worlds.md](worlds.md) (general) or [niche-worlds.md](niche-worlds.md) (physical and editorial forms; brief help in [briefs.md](briefs.md)) and write a **direction card** (6 lines): ``` Name: e.g. "Solar" - saturated flat colour that changes per product Metaphor: what it feels like, in one image Palette: 5 tokens max, with roles (bg, fg, accent, support, danger) Type: display face + body face, both self-hosted (Fontsource), never a system fallback as the voice Motion: one language (e.g. scrubbed, weighty, exponential ease-out) used everywhere Signature: the one moment, and what it needs (asset, library) Refuse: 3 things this world must never contain ``` Rules: the brief wins over taste. When torn between "refined" and "committed", commit. One unexpected tension (a serif in a tech product, a hard shadow in a soft world) beats five safe choices. ### 4. Assets before code The signature moment dictates the asset. Decide *now*: | Moment | Asset | Fallback | |---|---|---| | Spinning product | GLB model, or a rendered frame sequence | Build it procedurally in three.js (see `site-solar`) | | Cinematic hero | Short looped video (< 4 MB, muted, poster frame) | Shader background from the Backgrounds category | | Character / mascot | Rigged GLB (CC0: Quaternius, Khronos samples) | Pattern from "3D Motion" | | Editorial feel | Real photography | Ask the user; never grey placeholder boxes in the final | | Data story | The real numbers | Plausible, labelled as sample | Do not ship decorative stand-ins (blurred orbs, mesh gradients) *as* the signature. Atmosphere is fine; the hero is not atmosphere. ### 5. Build a vertical slice first Make the signature moment work end to end (asset, motion, scroll, responsive) **before** building the other sections. If it doesn't work, the rest doesn't matter. Then build outward. Pull parts from UI Lab: search [`/patterns.json`](../patterns.json) by `tags` and `category`, fetch `/docs/.md`, copy `tokens.css` first. Architecture defaults: - Vite + React + TypeScript. Tailwind only if the project already has it; plain CSS with custom properties is fine. - Scroll-driven sites: **GSAP ScrollTrigger + Lenis**, one master timeline. See [scroll-3d-recipe.md](scroll-3d-recipe.md). - 3D: **React Three Fiber + drei**. Mutable state object read in `useFrame`; never `setState` per scroll tick. - Fonts: Fontsource packages, self-hosted. Preload nothing exotic. Wait for `document.fonts.load()` before drawing canvas text. ### 6. Verify (bounded, batched, honest) See [verify.md](verify.md). In short: build once fully, then one batched inspection round (desktop + mobile, scrolled to every section, console clean, reduced-motion on), fix everything it shows in one batch, one confirming round, stop. Report what was and was not tested. Never say "works" for something you did not render. ### 7. Handoff State the URL to open, what is verified, what is untested (mobile? real GPU? Safari?), what is placeholder, and the two or three things you would do next. Short. ## The craft floor (non-negotiable mechanics) - Contrast: body >= 4.5:1, large >= 3:1. On coloured surfaces tint secondary text from the hue, not grey. - Type: body 65-75ch; display sizes clamp(); tight tracking only on display; balanced headings; real copy at every width. - Spacing: tight inside groups, generous between; more above a heading than below. - Motion: one authored moment plus consistent small ones. Exponential ease-out from a visible default. Honour `prefers-reduced-motion`. - States: hover, focus-visible, disabled, loading, empty, error. Keyboard reaches everything. - Touch targets >= 44px. `100svh` not `100vh`. No horizontal scroll at 375px. - Browser surfaces are part of the design: `::selection`, scrollbar, caret, focus ring, `tabular-nums` on data. - Copy: product's own voice. Buttons name their action. Errors name problem and fix. ## Reflexes to refuse (unless the brief earns them) - Grids of identical icon + heading + text cards as the page structure. Nested cards, always. - The hero-metric block (big number, small label, three of them in a row) as filler. - Eyebrow/kicker labels above headings. Numbered sections (01/02/03) that carry no information. - Gradient text. Glass/blur as decoration. Coloured `border-left` accents. Hard offset shadows outside a neo-brutalist world. - Emoji or unicode glyphs as icons. Draw SVG or use one real icon set at one stroke weight. - A system font as the display voice. `Inter` everywhere by default. - Fade-up-on-scroll applied identically to every block. - Light vs dark chosen by category ("tech = dark"). Choose from the use scene. ## How to think when the brief is thin Ask, in this order, and write one line for each: 1. What is this page's *argument*? (What should the visitor believe after 20 seconds?) 2. What is the most *specific* thing about this product that no competitor could claim? Build the page around it. 3. What would this look like if it could **only** exist for this product? Delete anything that fits any product. 4. Where does the visitor's attention need to go first, second, third? Make size, contrast and motion agree with that order. 5. What is the one thing I'd be embarrassed to ship? Fix that before polishing anything else. # Accessibility: the short version that actually gets applied Accessible design is not a separate phase. It is a handful of habits that, applied while building, cost almost nothing and are expensive to retrofit. This page is the checklist UI Lab itself is audited against (axe-core run over every pattern page, plus keyboard and reduced-motion checks). ## The ten habits 1. **Use the real element.** A `