Designing with motion
Pace and choreography as a first-class concern in interface design.
One .lsd-card base — CSS-var driven for size, tone,
shape, and layout. Role variants layer on top: author,
product, article, vehicle, book, property.
Chain .lsd-fx--* for motion. Container queries on the card itself
decide image-top vs image-side — no viewport media query in sight.
The base is layout + tokens: --card-bg, --card-fg,
--card-border, --card-radius, --card-shadow,
--card-pad, --card-gap. Modifier classes swap those vars —
size, tone, shape, and layout are independent concerns.
Five tone mods change --card-bg + --card-border + shadow. Shape stays.
Default elevation.
Transparent + strong border.
Frosted backdrop blur.
<div class="lsd-card lsd-card--outlined">…</div> <div class="lsd-card lsd-card--glass">…</div>
Size mods shift --card-pad + --card-gap. Tone untouched.
14px pad.
18px pad.
<div class="lsd-card lsd-card--sm">…</div> <div class="lsd-card lsd-card--lg">…</div>
Shape mods change --card-radius or clip-path. Layout untouched.
16px radius.
28px radius.
Polygon clip.
<div class="lsd-card lsd-card--cut-corners">…</div>
Border brightens on hover. Cards inherit :focus-visible styling when wrapped in <a>.
Watch the border.
Tab to focus.
<a class="lsd-card" href="…">…</a>
Structural variants — each carries its own inner-element contract. They handle the bones: cover image, overlay, quote, stat, icon-led.
Image · title · body · CTA. The bone marrow of every variant.
Pace and choreography as a first-class concern in interface design.
<article class="lsd-card"> <div class="lsd-card__media">…</div> <h4 class="lsd-card__title">…</h4> <p class="lsd-card__sub">…</p> </article>
Explicit alias for the default vertical layout. 16:9 hero image with bleed-to-edge.
A six-hour timelapse rendered live in the browser.
<article class="lsd-card lsd-card--image-top">…</article>
Image left, body right. Common for blog rows and search results.
Why your interface should breathe between user actions.
<article class="lsd-card lsd-card--image-side"> <div class="lsd-card__media">…</div> <div class="lsd-card__body">…</div> </article>
Image fills the card. Text floats over a bottom gradient scrim.
A photo essay on neon and silence.
<article class="lsd-card lsd-card--overlay"> <div class="lsd-card__media">…</div> <h4 class="lsd-card__title">…</h4> </article>
Big opening curly-quote, attribution row with avatar + name + role.
The fastest builder I've used in a decade. It feels like a design system that thinks.
<blockquote class="lsd-card lsd-card--quote"> <p class="lsd-card__quote-text">…</p> <footer class="lsd-card__attribution">…</footer> </blockquote>
Giant gradient number, uppercase label, sparkline placeholder. Plays nice with count-up.
1,278
Active projects
<div class="lsd-card lsd-card--stat"> <p class="lsd-card__stat-num">1,278</p> <p class="lsd-card__stat-label">…</p> </div>
Leading icon chip, title, one-line description. Used in feature grids.
<div class="lsd-card lsd-card--icon"> <div class="lsd-card__icon-chip">◇</div> <h4 class="lsd-card__title">…</h4> </div>
Author cards, team grids, speaker bios. The avatar is a .lsd-card__avatar primitive — sized via class.
Avatar · name · role · bio · social row · CTA.
<div class="lsd-card lsd-card--author"> <div class="lsd-card__avatar">AS</div> <h4 class="lsd-card__title">…</h4> <p class="lsd-card__bio">…</p> </div>
Headshot. Hover reveals role + social links in an accent overlay.
Senior engineer
<div class="lsd-card lsd-card--team-member">
<div class="lsd-card__media">
…image…
<div class="lsd-card__team-overlay">…</div>
</div>
</div>
Author layout + talk title chip + session time chip. Conference card.
<div class="lsd-card lsd-card--author
lsd-card--speaker">
…avatar + name…
<span class="lsd-chip lsd-chip--accent">Talk · …</span>
<span class="lsd-chip">Day 2 · 10:30</span>
</div>
Vcards, address blocks, support channels.
Name · role · contact rows · save button. Optional QR code corner.
Solutions Architect · Helix Studio
<div class="lsd-card lsd-card--vcard"> <div class="lsd-card__qr"></div> <h4>…</h4> <div class="lsd-card__row">☎ +1…</div> </div>
Map placeholder header, address lines, directions CTA.
228 Harrison Street
San Francisco, CA 94105
<div class="lsd-card lsd-card--address"> <div class="lsd-card__media">…map…</div> …address lines… </div>
Channel icon, heading, response-time chip, CTA. One per channel in a grid.
<div class="lsd-card lsd-card--support
lsd-card--icon">
<div class="lsd-card__icon-chip">💬</div>
…
</div>
E-commerce primitives: catalog tile, cart row, hero feature, variant picker, subscription tier.
Image, title, price, rating, add-to-cart. The everyday catalog card.
Insulated · 16oz · matte
<article class="lsd-card lsd-card--product"> …media… <span class="lsd-card__price">$38</span> <span class="lsd-card__rating">★★★★★</span> </article>
Tiny thumbnail · title · price · cart-icon. Drops into cart lists or wishlists.
3-pack · $12.95
<article class="lsd-card lsd-card--product-compact"> …small media… <div class="lsd-card__body">…</div> <button class="lsd-btn lsd-btn--icon">+</button> </article>
Image left, large title + description + CTA right. Front-of-store anchor.
Articulating brass arm, milk-glass shade. 2700K warm. Built to outlive the room it sits in.
<article class="lsd-card lsd-card--product-hero"> <div class="lsd-card__media">…</div> <div class="lsd-card__body">…</div> </article>
Click a swatch to swap the image-placeholder tint. Vanilla JS, no library.
Heavyweight cotton
<article class="lsd-card lsd-card--product
lsd-card--product-variants"
data-variants>
…media + swatches + sizes…
</article>
Tier label, price, feature list with check chips, CTA. Pricing-table primitive.
<article class="lsd-card lsd-card--subscription"> <span class="lsd-card__tier">Studio</span> <div class="lsd-card__plan-price">…</div> <ul class="lsd-card__features">…</ul> </article>
Editorial primitives: articles, podcasts, videos, courses.
Cover · category chip · title · excerpt · author + date.
Why your interface should breathe between user actions, and the math behind making it feel intentional.
<article class="lsd-card lsd-card--article">
<div class="lsd-card__media">
…media…
<span class="lsd-chip lsd-card__category">Motion</span>
</div>
</article>
Large variant with prominent accent gradient overlay. Hero post.
A long read on OKLCH, semantic axes, and why your design tokens deserve more than hex codes.
<article class="lsd-card lsd-card--overlay
lsd-card--article-featured">
…
</article>
Circular cover · title · duration · play button.
38 min · with Plover Hexstrom
<article class="lsd-card lsd-card--podcast"> …circle cover… <button class="lsd-card__play">▶</button> </article>
16:9 poster · play overlay · duration chip in corner · title below.
A live walkthrough · LSD weekly
<article class="lsd-card lsd-card--video">
<div class="lsd-card__media">
…poster + play overlay + duration chip…
</div>
</article>
Cover · level chip · title · lesson count · progress bar.
From spring physics to scroll choreography.
<article class="lsd-card lsd-card--course">
…media + chips + title…
<div class="lsd-card__progress">
<i style="width:60%"></i>
</div>
</article>
Same base, domain-specific metadata. Cards for booksellers, photographers, dealerships, boatyards, and listings. The schema is the differentiator — markup stays consistent.
Portrait cover · title · author · rating · pages chip · Buy / Sample CTAs.
Plover Hexstrom
<article class="lsd-card lsd-card--book"> …badge + 3:4 cover… <span class="lsd-card__rating">★★★★★</span> <span class="lsd-chip">328 pp</span> </article>
Magazine-clipped landscape · photographer · EXIF chips · location + date.
Photo · Maren Søberg
<article class="lsd-card lsd-card--photography">
…magazine-clipped photo…
<div class="lsd-card__exif">
<span class="lsd-chip">Leica Q3</span>
<span class="lsd-chip">28mm</span>…
</div>
</article>
Cover · make/model/year · price · 4 metric chips · save star.
<article class="lsd-card lsd-card--vehicle"> …cover + save-btn… <div class="lsd-card__price-row">…</div> <div class="lsd-card__chiprow">…</div> </article>
Cover · model · price · length / sleeps / slides / generator chips · floorplan thumb.
<article class="lsd-card lsd-card--rv">
…cover + floorplan thumb…
<div class="lsd-card__chiprow">
<span>19'7"</span> <span>Sleeps 2</span>…
</div>
</article>
Cover · year/make/model · price · LOA / beam / draft / engine hours · viewing CTA.
<article class="lsd-card lsd-card--marine"> …cover + price + LOA/Beam/Draft chips… </article>
Hero · address · price · bed/bath/sqft · agent footer with avatar + brokerage.
Oak Park, IL 60302
<article class="lsd-card lsd-card--realestate"> …cover + save… <h4>428 Linden Ave</h4> <div class="lsd-card__agent">…</div> </article>
Eleven more verticals. Same base, real metadata shapes — events, calendars, jobs,
rentals, movies, albums, podcast episodes, recipes, tutorials, workshops, and tickets.
Each composes .lsd-card; only the schema and structural arrangement change.
Cover · title · date/time chips · location · attendees · RSVP CTA.
Yerba Buena Center · San Francisco, CA
<article class="lsd-card lsd-card--event"> …cover + title + date chips… <span class="lsd-card__attendees">2,418 going</span> </article>
Date block · title · duration · attendees stack — a tile in a schedule grid.
2:30 PM · 45 min
<article class="lsd-card lsd-card--calendar"> <div class="lsd-card__date-block">May · 13</div> …title + duration + attendee stack… </article>
Company logo · title · location · tag chips · apply CTA.
Helix · Engineering
<article class="lsd-card lsd-card--job"> …logo + title + tags + apply… </article>
Rent or lease chip · bed/bath/sqft · per-month price.
Mission District · San Francisco, CA
<article class="lsd-card lsd-card--property"> …rent chip + price + bed/bath/sqft… </article>
3:4 poster · title · year/runtime · IMDb rating · genre tags · trailer CTA.
<article class="lsd-card lsd-card--movie"> …3:4 poster + rating + genre tags… </article>
1:1 cover with hover play · artist + title · track count + duration.
Whitelight
<article class="lsd-card lsd-card--album"> …1:1 cover + hover play button… <p>Whitelight</p> · 14 tracks · 47 min </article>
Square cover · title · show name + duration · play button — list row by default.
The Quiet Stack
<article class="lsd-card lsd-card--podcast-episode"> …square cover + title + show + play… </article>
Image · title · cook time / difficulty / servings · save heart.
A patient bread for a slow Sunday.
<article class="lsd-card lsd-card--recipe"> …image + title + time-row + save… </article>
Cover · title · difficulty + duration · progress bar · resume CTA.
<article class="lsd-card lsd-card--tutorial"> …cover + difficulty + duration… <div class="lsd-card__progress">…</div> </article>
Cover · title · instructor · date · seats remaining · register CTA.
A 3-day intensive · in-person, NYC
<article class="lsd-card lsd-card--workshop"> …cover + instructor + date + seats… </article>
Stub layout · perforated divider · event/date/seat + barcode panel.
Yerba Buena Center · SF
<article class="lsd-card lsd-card--ticket"> <div class="lsd-card__ticket-main">…</div> <div class="lsd-card__ticket-stub">…barcode…</div> </article>
Animations are independent modifier classes. Stack .lsd-fx--lift,
.lsd-fx--shimmer, .lsd-fx--tilt, .lsd-fx--glow-pulse,
.lsd-fx--scale-in, .lsd-fx--ink-drop onto any card.
Same universal vocabulary as buttons, inputs, chips.
Lifts on hover, light stripe sweeps across. Catalog tile polish.
Brass · 2700K
$184JS reads pointer offset, writes --rx/--ry. Card tilts in 3D space.
Scales in on load, continuous shadow pulse afterward. Reduced-motion safe.
99.8%
Uptime · 30 day
Click anywhere on the card — accent floods from the click point. JS injects a span.
Watch the accent flood from your cursor.
The card responds to its container, not the viewport. Resize the wrapper
below — at narrow widths the article stacks image-top; at wider widths it switches
to image-side. Zero @media queries; one @container rule.
No viewport math, no breakpoints — the card just listens to the size of its parent. Drop it in a sidebar at 280px and it stacks. Drop it in a main column at 720px and it splits.