A single-file CSS library for semantic HTML with an old desktop feel: platinum surfaces, visible bevels, sunken inputs, and page layouts that work without a build step.
On narrow screens, topbar and sidebar layouts collapse into vertical flow. With classic.enhance.js loaded, header navigation collapses behind a hamburger toggle.
Buttons
Automatic on button, button-like inputs, [role="button"], and .button.
field-row: groups fields; behaves as contents so rows align with the form table.
check: checkbox/radio label row.
switch: custom switch row.
Validation
Both ARIA and native HTML validity are styled. Native constraints (required, pattern) show the invalid border via :user-invalid once the user has interacted. Pair the border with a message so the state is never color-only:
Bare form text before a control is visually placed in the label column. For real click-to-focus behavior, use actual labels or load classic.enhance.js, which upgrades the text into labels. Opt out per form with data-classic-no-autolabels.
<form>
Name
<input name="name">
</form>
Components
Opt-in classes for app-oriented pieces. Variants use data-variant="info|success|warning|danger".
Notices
Neutral notice.
Informational notice.
The update completed.
Check the required fields.
Unable to save.
<div class="notice" data-variant="warning">Check the required fields.</div>
dialog-preview: displays a dialog inline for demos.
Tabs: no classes - use role="tablist", role="tab" with aria-selected, and role="tabpanel"; a paired script must drive selection and arrow keys. Tabs must fit their container: keep counts modest and labels short; reach for a select when the list grows.
Layout Helpers
Small composition classes for arranging content.
grid / grid-tight
Responsive card grid; tight variant reduces the gap.
stack / stack-sm
Vertical flow with consistent spacing.
cluster
Horizontal wrapping group.
split
Two-sided row that wraps on small screens.
with-sidebar
Local two-column content/sidebar layout.
surface
Bordered raised panel.
A split inside a surfaceLive example
Text Utilities
lead
Larger introductory paragraph.
muted
Subdued text.
compact
Reduce bottom margin.
text-center
Center text.
nowrap
Prevent wrapping.
visually-hidden
Accessible hidden text.
classic.enhance.js
Optional markup repair. The CSS is useful without it.
Converts bare form text before controls into real labels, with matching input ids.
Adds a hamburger toggle to layout header navigation on narrow screens.
Disable auto-labels per form with data-classic-no-autolabels.
<form data-classic-no-autolabels>
Name
<input name="name">
</form>
Command Palette
Try it now: press Ctrl + K or Cmd + K.
Type commands like nav, main, forms, search, footer, or top to jump to semantic landmarks. Mark extra destinations with data-jumpable: