Live Style Designer

Designing systems, not screens.

Tweak a single base color, type scale, or spacing unit and watch every surface, every component, every proportion respond in real time. Export to your framework of choice.

Secondary surface

Context flows automatically.

This whole section sits on .surface-secondary. Headings, body copy, links, and button labels auto-pick the right tokens through the cascade — no per-element overrides required.

Surfaces — context-aware colors

Every surface in LSD carries its own background color. When you place content on a surface, text/heading/link/border colors automatically re-resolve to ensure contrast passes. Watch the colors shift as you scroll.

Toggle the theme in the topbar — watch the neutrals re-anchor while role tokens stay bound.
<body class="surface-bg"> <section class="surface-primary"> <article class="card surface-elevated"> <div class="card surface-primary"> (nested) --text--current resolves from --text--on-bg --text--current = --text--on-primary --text--current = --text--on-elevated --text--current = --text--on-primary (nested)

Nested cascade — a card within a card

The outer surface is primary; the inner surface is elevated. Each level re-resolves its own --*--current tokens, so heading, body, link, and border colors shift with the nesting — no per-element overrides.

.surface-primary (outer)

Outer card on primary

Every descendant picks its --*--on-primary variant automatically…

.surface-elevated (nested)

Nested card on elevated

…until you drop into a nested surface. Then the cascade re-resolves again: text, heading, and link colors all pick their --*--on-elevated variants. Nest as deep as you like.

Mix & match — tiers don't need a shared lineage.

A ladder is a convenient seed, not a constraint. Any tier's bg / text / border / link / button can pull from a different token, a different rule, or a freeform hex. Three compositions below — each coordinates colors that come from three different sources.

brand · cross-source

Accent call-out

bg: token:primary · text: contrast:AAA vs bg · border: rule:complement(primary)

elevated · multi-token

Dashboard card

bg inherits from .surface-elevated, link reads token:secondary, the callout border uses token:warning. No single "theme" owns this card.

View details →
hex + token · terminal

Code surface

bg: freeform hex #0a0e1a · text: #c9d1e0 · link: token:primary. The ladder stays in OKLCH-material-mode globally; this one surface opts out because a code block needs near-black.

The takeaway: a surface is a collection of independent tiers. Each tier's role layers can come from anywhere. The ladder's stepL / strategy just seeds sensible defaults — override any role on any tier to mix sources.

Just HTML, no classes — surfaces reach in.

A surface paints itself and a narrow set of structural descendants. Drop plain HTML into .surface-primary (or any colored factory) and the structural markup picks up treatment — blockquote rails, pre/code pills, hr separators. No wrapper classes, no inline styles, no authored CSS. The rules live in the surface's descendantRules config, seeded by the factory defaults.

Single class — minimal

Headline on primary

One class on the wrapper. The heading, body copy, and inline code pick up their paint from the surface alone.

<div class="surface-primary"> <h3>Headline on primary</h3> <p>One class on the wrapper…<code>inline code</code></p> </div>

No authored CSS. Only the factory surface defaults are in play.

Markdown-style on primary

Release notes — v2026.4

Drop a Markdown render in. No wrapper classes on the children.

Surfaces don't need the markup to be polite. Pasted documents still pick up the paint.
$ lsd export --target css
wrote: dist/surfaces.css
ready.
<div class="surface-primary"> <h3>Release notes — v2026.4</h3> <p>Drop a Markdown render in…</p> <blockquote>Surfaces don't need the markup to be polite…</blockquote> <pre><code>$ lsd export --target css…</code></pre> </div>

Blockquote rail, pre well, and code pill all come from surface-primary's seeded descendantRules.

Definition list on success

Glossary

Surface
A painted region with its own cascade.
Tier
One rung on a surface's elevation ladder.
Role
A semantic slot (bg, text, link) that a tier fills.
<div class="surface-success"> <h3>Glossary</h3> <dl> <dt>Surface</dt><dd>A painted region…</dd> <dt>Tier</dt><dd>One rung…</dd> </dl> </div>

Same markup on any colored surface picks up the correct palette tint.

Callout on danger

Deprecation notice

The surfaceLegacy API is scheduled for removal in v2027.1.

  • Switch to defaultSurfaceStacks()
  • Remove any direct emitLegacySurface() imports
  • Run lsd migrate --surfaces to rewrite references

See the migration guide for full details.

<div class="surface-danger"> <h3>Deprecation notice</h3> <p>The <code>surfaceLegacy</code> API…</p> <ul><li>Switch to <code>defaultSurfaceStacks()</code></li>…</ul> <hr> <p>See the migration guide for full details.</p> </div>

Inline code, list markers, and the <hr> separator all follow the danger palette.

Grammar is narrow by design: single tags, tag-lists (h1, h2, h3), :first-of-type positions, and > :nth-child(n) direct-child indexes. No *, no attribute selectors, no descendant combinators — enough reach for structural markup, not enough to make a mess.

Tiers are selectors — target them by ID for one-offs.

Every active surface emits .surface-<id>-t<n> classes for each tier. Give an element an id and hook the tier class in a selector — that's the whole story. Each example below shows the exact markup and the exact CSS that produced it. Copy either verbatim.

Promo — warning link + dashed nested tier

Tier-2 promo — local link override

Sits on .surface-primary-t2. The local rule lifts only this anchortry the beta →. Tier emission is untouched.

Nested tier-3 callout — dashed border applied via a second ID-scoped rule.
HTML <article id="ex-promo" class="surface-primary surface-primary-t2"> <h3>Tier-2 promo — local link override</h3> <p>…<a href="#">try the beta →</a>…</p> <div class="surface-primary-t3"> <strong>Nested tier-3 callout</strong>… </div> </article>
CSS #ex-promo.surface-primary-t2 a { color: var(--color-warning); text-decoration: underline wavy; } #ex-promo .surface-primary-t3 { border: 2px dashed var(--color-warning); }
Hero metric — inset glow on tier 1

Hero metric

One-off glow on .surface-secondary-t1. Every other tier-1 block on the page stays flat.

98.4%

uptime across the last 90 days

HTML <article id="ex-hero-stat" class="surface-secondary surface-secondary-t1"> <h3>Hero metric</h3> <div class="big-number">98.4<small>%</small></div> </article>
CSS #ex-hero-stat.surface-secondary-t1 { box-shadow: inset 0 0 0 1px color-mix(in oklch, var(--text--on-secondary) 25%, transparent), 0 18px 40px -18px color-mix(in oklch, var(--color-secondary) 80%, transparent); } #ex-hero-stat .big-number { font-size: clamp(48px, 9vw, 96px); line-height: 0.9; }
Pricing — ring + lift on tier 2
Recommended

Team — $24/mo

A single pricing card lifts and rings by targeting its tier. No variant class, no duplicated surface.

  • Unlimited projects
  • AI-assisted exports
  • Shared brand packs
HTML <article id="ex-pricing" class="surface-success surface-success-t2"> <span class="pill">Recommended</span> <h3>Team — $24/mo</h3> <ul><li>Unlimited projects</li>…</ul> </article>
CSS #ex-pricing.surface-success-t2 { outline: 2px solid var(--color-success); outline-offset: 3px; transform: translateY(-6px); } #ex-pricing .pill { background: var(--color-success); color: var(--text--on-success); padding: 3px 10px; border-radius: 999px; }
Docs callout — accent rail on tier 3

Docs sidebar note

Authored rail on the inline-start edge, scoped to #ex-doc. The tier carries the fill; the ID adds the accent strip.

Reuse pattern: give callouts their own IDs and paint them against the same tier — one rule per flavor.

HTML <article id="ex-doc" class="surface-info surface-info-t3"> <h3>Docs sidebar note</h3> <p>Authored rail on the inline-start edge…</p> </article>
CSS #ex-doc.surface-info-t3 { background-image: linear-gradient( 90deg, var(--color-info) 0 4px, transparent 4px ); padding-inline-start: calc(var(--space-lg) + 4px); }

When one element needs to bend the rules, you don't need a new token or a new surface — just an id and a selector. The emitted tier classes become anchor points for authored CSS.

Typography Scale

Fluid type using clamp(). Resize the preview to watch it breathe.

Heading 1 — The quick brown fox

Heading 2 — jumps over the lazy dog

Heading 3 — pack my box with

Heading 4 — five dozen liquor jugs

Heading 5 — sphinx of black quartz

Body text — Design tokens are the single source of truth for your visual language. They describe colors, typography, spacing, and elevation in a way that can be shared across platforms and frameworks. When the tokens change, the entire interface adapts in a single, coherent motion.

Components

Buttons, badges, and cards share the token language.

Primary Success Warning Danger Info

Color

Every brand starts with color. Your palette propagates automatically to every surface.

Type

Fluid scales keep your hierarchy responsive across devices without media-query gymnastics.

Space

A unified spacing scale enforces rhythm across components and layouts.

Cards on colored surfaces

The same .card markup, placed inside different surface contexts. Headings, body text, and buttons auto-select the right role tokens through the cascade.

on-primary

Card on primary

This card sits on a primary background. All text, headings, and button labels pick their on-primary variants automatically.

on-secondary

Card on secondary

Same markup, different context. The secondary surface cascade remaps every role token — no per-element overrides.

on-surface

Card on surface

The default: sits on the neutral surface token. Shown here side-by-side so you can compare all three contexts on the same card component.

Card Hover Effects

Card hover patterns — headline visible by default, description revealed on hover.

Innovation

Fade Variant

Description fades into view with a subtle gradient backdrop when the card is hovered.

Analytics

Slide-up Variant

Description slides upward from the footer as the headline nudges up to make room.

Technology

Overlay Variant

Dark gradient intensifies on hover, revealing fuller description copy over the image.

Collaboration

Team Collaboration

Connecting cross-functional teams through clear systems and shared design tokens.

Development

Software Development

Product work built on composable primitives, not one-off screens.

Design

UX Design

Interfaces that stay calm at rest and reward curiosity with motion on demand.

Aspect Ratios

Media containers at proportions derived from --aspect-* tokens.

Layout theatre

Drag the right edge of any stage — or tap a preset — and watch the component reflow via @container queries. Presets are pulled live from the canvasWidths tokens. Add a new width token in the Tokens tab and its preset button shows up here automatically.

Author block

.lt-author · @container lt (min-width: 520px)

Léa Sorensen

Design engineer · Berlin

Writes CSS by day, tunes synthesizers by night. Believes every container should know its own width. Currently obsessed with subgrid and color-mix().

@iggh

CTA

.lt-cta · split at 560px

v0.6 · ship-ready

Design once. Ship everywhere.

Export tokens to CSS, Tailwind, or any framework you already use.

Image block

.lt-img · media+caption → overlay

Field report · 2026-04-20

A single figure that reflows from beside-caption to below-caption to overlay, driven purely by its own container width.

Bento box

.lt-bento · 1 → 2 → 4 cols
Hero
Tile A
Tile B
Tile C
Tile D

Carousel / slider

.lsd-slideshow · 1 → 2 → 3 visible via container query · dogfooded block
per-view
01
02
03
04
05

Slideshow

CSS-first .lsd-slideshow block — scroll-snap + anchor navigation work without JS. The lsd-slideshow.js enhancer layers autoplay, looping, and active-dot sync on top.

Design tokens, live.

Every color, space, and radius in this slide is a framework variable. Change the palette — this slide follows.

One block, every width.

Container queries mean the slideshow morphs from its own width, not the viewport — drop it in a sidebar and it still works.

Built on scroll-snap.

No virtual DOM, no layout thrash. Native scroll, native snap, anchor-link navigation — JS is the icing.

Surface-aware.

Slides read --role--current. Wrap the show in any surface tier and the content repaints.

Scroll Animations

Viewport-triggered entrance animations. Scroll back up to retrigger where supported.

Fade up

Default entrance — element rises and fades in as it enters the viewport.

Slide from left

Use to lead the eye toward the next block of content.

Slide from right

Pairs with slide-from-left for balanced two-column reveals.

Scale in

Gentle zoom-in for hero callouts and key statistics.

Fade only

Quiet option — opacity without movement, for dense content.

Staggered

Combine with delay utilities to cascade multiple tiles.

Motion

Animation library

Every preset is transition-driven or keyframed CSS — drop a class on any element. Copy the chain, the data-lsd-fx attribute, or the raw CSS for any build stack.

Fade in

Opacity 0 → 1. The quietest entrance.

<div class="lsd-fx--fade-in">…</div>

Slide up

Rises 32px while fading in.

<div class="lsd-fx--slide-up">…</div>

Slide down

Drops in from above.

<div class="lsd-fx--slide-down">…</div>

Slide left

Enters from the right.

<div class="lsd-fx--slide-left">…</div>

Slide right

Enters from the left.

<div class="lsd-fx--slide-right">…</div>

Zoom in

Scales from 92% to 100%.

<div class="lsd-fx--zoom-in">…</div>

Zoom out

Scales from 108% down to 100%.

<div class="lsd-fx--zoom-out">…</div>

Blur in

Focus-pull entrance via CSS filter.

<div class="lsd-fx--blur-in">…</div>

Bounce in

Overshoots 105%, settles to 100%.

<div class="lsd-fx--anim-bounce-in">…</div>

Elastic in

Rubber-band ease with multiple settles.

<div class="lsd-fx--anim-elastic-in">…</div>

Shake

Short horizontal wobble — attention grabber.

<div class="lsd-fx--anim-shake">…</div>

Glitch

Small 2-axis wobble.

<div class="lsd-fx--anim-glitch">…</div>

Pulse

Subtle breathing scale. Loops.

<div class="lsd-fx--anim-pulse lsd-fx--anim-loop">…</div>

Float

Gently rises and falls. Loops.

<div class="lsd-fx--anim-float">…</div>

Drift

Slow atmospheric circle. Loops.

<div class="lsd-fx--anim-drift">…</div>

Spin

Continuous 360° rotation. Loops.

<div class="lsd-fx--anim-spin">…</div>

Interactions

Mouseover, focus, and transition patterns — each demo is live. Hover the element, then click “Copy CSS” to take the snippet.

Feature Grid

Feature tiles pairing iconography with short copy.

Composable tokens

Every component reads from the same spacing, color, and type scale.

Framework swap

Flip between Tailwind, Bootstrap, Foundation, or pure CSS output.

Dark-mode aware

Neutral ramp auto-inverts with a single attribute flip.

Export-ready

Copy section HTML with or without resolved inline styles.

Spacing Rhythm

xxs
--space-xxs
xs
--space-xs
sm
--space-sm
md
--space-md
lg
--space-lg
xl
--space-xl
2xl
--space-2xl
3xl
--space-3xl
5xl
--space-5xl
7xl
--space-7xl

Form

Data Table

TokenCategoryPurpose
--color-primaryColorPrimary brand accent
--text-h1TypographyFluid heading level 1
--space-lgSpacingDefault vertical rhythm
--radius-mdShapeStandard component radius
--shadow-mdElevationRaised surface

Navbar

Pricing

Three tiers, one token system. The featured plan inherits the primary color.

Starter
$0 /mo
  • 1 project
  • Community support
  • Basic exporters
  • Local presets
Choose Starter
Enterprise
Custom
  • SSO & SAML
  • Dedicated CSM
  • Audit logs
  • Custom integrations
Contact sales

Testimonials

What teams say after wiring their design system to a single source of truth.

LSD collapsed three days of palette bikeshedding into a 20-minute working session. We left with tokens our engineers actually shipped.
Mira Okafor Design Lead, Northwind
Being able to swap frameworks live and watch the same showcase respond is the demo that finally got our director to greenlight the rebrand.
Daniel Reyes Front-end Architect, Helio Labs
The exporter output dropped straight into our Tailwind config. No translation layer, no design-to-code handoff doc.
Priya Shah Staff Engineer, Quill

Alerts & Code

Status messaging styled by semantic color tokens, plus a token-aware code surface.

Heads up

A new version of the exporter is available in the drawer.

Saved

Your preset “Brand v3” was written to local storage.

import { createStore, resolveTokens } from './state';

const store = createStore(defaultState);

store.subscribe((state) => {
  const tokens = resolveTokens(state);
  applyToIframe(tokens, state.framework);
});

store.patch({ tokens: { colors: { primary: '#7c5cff' } } });

Frequently asked

Answers to the questions we hear most often from teams evaluating LSD.

Can I use LSD with my existing design system?

Yes. Paste your existing CSS variables into the import panel and LSD will parse them into editable tokens. From there, every change re-exports cleanly back to your chosen framework.

Does it work with Tailwind, Bootstrap, and Foundation?

All three plus a framework-agnostic CSS variables mode. Swap the target from the drawer and the preview re-renders with the matching stylesheet loaded live.

How do I share presets with my team?

Presets can be saved locally for personal iteration, or pushed to the shared Bun server. Teams on the Pro plan get cloud sync so everyone stays on the same tokens.

Can I export to a format my build pipeline understands?

LSD ships exporters for CSS variables, SCSS, Tailwind config, Bootstrap overrides, and Foundation settings. Pick a target and copy the output straight into your repo.

Is there an AI-assisted mode?

The MCP server exposes your tokens and presets to Claude and other agents, so you can ask for "a fintech palette with tighter spacing" and let the agent draft a preset you can then refine by hand.

Product timeline

A snapshot of how the LSD showcase has evolved.

  1. 2026 · Q1
    Scaffold & palette engine

    Vite shell lands. The 26-template HSLA-difference palette engine is preserved verbatim from the legacy tool and wrapped in a typed ColorToken layer.

  2. 2026 · Q1
    Designer suite complete

    Token editors, six exporters, copy-HTML bridge, dark-mode variants, OKLCH contrast badges, and per-section copy ship together.

  3. 2026 · Q2
    Bun API & MCP server

    A local Bun HTTP server backs shared presets, and an MCP stdio server exposes the same surface to Claude and other AI agents.

  4. 2026 · Q3
    AI authoring

    Natural-language token generation and live HTML authoring land, letting designers describe a brand and watch the showcase converge on it.

By the numbers

A few vanity metrics to show how trend indicators and display type react to token changes.

Active users 0 ↑ 12% vs last month
Uptime 0.00% ↑ 0.02% vs last quarter
Avg. response 0ms ↓ 4% vs last week
Presets shared 0 ↑ 28% vs last month

Gradients

Live preview of each --gradient-* token. Click any swatch to copy its variable.

Variables & Design Tokens

Live reference of every CSS custom property emitted by LSD. Click any row to copy the var(...) expression.