Spry CSS

Cards

Padding comes with the card: a bare .card already looks right, and a card built from .card-header/-body/-footer drops the default so the sections run flush to the frame.

A bare card

No padding utilities, no structural children — the content sits comfortably inside the frame.

Structured card

header · body · footer

Each section carries its own padding, flush against the borders.

Flat card

.card-flat — same padding, no shadow. Opt out of any padding with .p-0 & friends.

Prose

Long-form content inside cards and dialogs uses .prose: the measure is capped and headings step down from page scale to document scale.

A document heading

Body text set at a comfortable measure, with inline code, Ctrl + S keys and highlighted passages. Themes restyle these rules without fighting the container — try Formal.

Second level

  • Lists keep the rhythm of the paragraph above
  • And return it to the paragraph below

A blockquote quotes something worth the vertical space.

Third level

Enough — the rest of the page carries on at component scale.

Buttons

Bare <button> already looks like a button; .btn-primary/danger/outline/ghost/link restyle it.

Forms

Fields stack label, control and hint; .is-invalid turns the hint red; choices, switches and selects inherit the theme.

Notifications
Verification code
–

Tables

Wrap wide tables in .table-wrap; modifiers striping, hover and density stack on the same element.

Themes shipped with Spry CSS
ThemeMoodRadiusDark mode
AiryWindows 7 Aero glasssoftyes
DwarfGNOME Adwaitasharpyes
FormalWedding stationerysoftlight-only
GlassyFrosted panesroundyes
H2OWater and tideroundyes
Living SkyAurora gradientssoftyes
ModernFlat neutralsoftyes
ClassEffect
.table-stripedZebra rows
.table-hoverRow hover background
.table-compactTighter cell padding

Alerts & badges

Both ride the semantic tokens, so themes and dark mode recolour them for free.

Heads up.

Info alert for neutral notices.

Saved.

Success confirms an action.

Careful.

Warnings flag risky ground.

Failed.

Dangers own the failure case.

.badge info success warning danger muted

Tabs are CSS-only: radios, labels and panels. No JavaScript, no ARIA wiring — the labels are clickable and the inputs focusable.

Every visual decision is a --spry-* custom property. Apps style themselves with the tokens, and themes plus dark mode follow along with zero extra rules.

Themes activate with <html data-theme="dwarf">, or the #spry-theme-* radio hooks this page uses — same sheet, no duplicates.

Expanders

Native <details> with styled summaries; .expander-group fuses siblings into one accordion-shaped block.

Why no JavaScript?

Everything on this page — menus, tabs, drawers, this expander — is HTML and CSS. The one exception is showModal() on the dialog button, which is the native API for the job.

How do I opt out of card padding?

.p-0 through .p-5 and the per-side variants override the default — the padding rules sit at zero specificity on purpose.

How do themes switch without JavaScript?

Each theme scopes itself to html:has(#spry-theme-slug:checked) as well as [data-theme]; the switcher in the topbar just checks those radios.

What about reduced motion?

The core collapses every animation and transition under prefers-reduced-motion, dialogs included.

Dialogs, popovers & drawers

All share one open/close animation driven by --spry-dialog-*. Pick Airy above to feel its Windows 7 glide-in: 180 ms, scale 0.92 to 1, opacity 0 to 1, cubic ease-out — anchored menus also rise from their trigger.

Sign out everywhere?

This ends every other session. You will stay signed in here.

A bare dialog

No titlebar, no .dialog-body — so the dialog pads itself with --spry-popover-padding and this text is not glued to the frame.

Popover window

Dialog-like windows need no JavaScript either: any element with the popover attribute opens from a popovertarget button and light-dismisses.

Project settings

Drawers dock to an edge and slide — docked panels, not windows, so they keep the core slide instead of the dialog zoom.

Hero, avatars & pagination

Spry 0.3

A CSS framework that respects your markup

Utilities and components over bare tags, tokens over hard-coded colour, and no JavaScript anywhere it is not native.

A TL SPR A B C +4

Progress, meters & spinners

Utilities

Layout primitives carry the page: this tour is a .container of .stacked sections, and the example below is a .with-sidebar with a .menu and a .grid.

.stack

Vertical rhythm with a gap

.cluster

Wrapping row of chips

.grid

Auto-fit columns

.with-sidebar

This layout, in fact

Text utilities: danger, success, bold, mono 0x1F, 1234.5.

Measure utilities cap the line length — this paragraph is .measure-sm (45ch), which keeps reference text readable inside wide containers.