A small release note
Published
The browser keeps the document meaning while Semanticwind supplies the baseline.
A style reference, guidance for choosing the right element, and browser-native alternatives to common components.
The native elements where Semanticwind supplies a visible baseline.
The surrounding documentation shell owns its page layout. Specimens below remain classless so their content styling comes from Semanticwind itself.
Document rhythm, typography, lists, code, and quotations.
Structure receives readable rhythm without becoming a product component.
Published
The browser keeps the document meaning while Semanticwind supplies the baseline.
Balanced sizes establish hierarchy without requiring utility classes.
A heading and its supporting line.
Select this text and interact with the links to exercise native states.
A paragraph can contain a normal link, an active link, strong importance, visual attention, highlighted text, and small print.
HTML can show removed copy, inserted copy, H2O, x2, a defined term, version 0.1.0, and element.
Nested and descriptive lists retain useful spacing and hierarchy.
Inline and block code remain readable without a syntax-highlighting dependency.
Run npm run build, press ⌘ + K, and expect Done in 48ms.
@import "tailwindcss";
@import "semanticwind";
Would this style make sense for almost every correct use of this element?
Semanticwind’s boundary test
A figure can caption code, quotations, or data—not only images.
Before the thematic break.
<button>Publish</button>One complete specimen covers the table baseline and its responsive overflow.
A caption names the table and scope connects its headers. Keep the structure simple; if an app adds a separate scroll region, give that region an accessible name.
| Check | Result | Duration |
|---|---|---|
| Build | Passed | 48 ms |
| Browser | Passed | 1.2 s |
| Package | Passed | 320 ms |
| Total | 3 passed | 1.568 s |
Classless flow, native controls, states, choices, and actions.
A form without a class gets useful prototype spacing and full-width controls.
Common text inputs share one neutral, focusable baseline.
Text areas and native selection remain browser-owned and responsive.
Checked, unchecked, focused, and disabled states remain native.
State colors reinforce behavior without replacing labels or help text.
Native buttons share clear targets, focus, active, and disabled states.
Disclosure, top-layer surfaces, progress, measurement, and commands.
Open and closed states remain understandable without scripting.
This content appears when the summary is activated.
The browser owns activation, keyboard handling, and state.
A non-modal top-layer surface whose behavior stays browser-owned and whose placement stays application-owned.
The browser owns light dismissal and Escape.
Modal dialogs receive a strong backdrop and constrained surface.
Progress shows completion; meter evaluates a value within a known range.
Choose HTML by its meaning and relationships, not its default appearance.
Start in standards mode, declare the language and encoding, allow responsive rendering and zoom, give every page a useful title, and keep one main landmark with a real heading hierarchy.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Unique page title</title>
</head>
<body>
<main>
<h1>Unique page heading</h1>
</main>
</body>
</html>Use an article for content that can stand on its own; use an aside only when its meaning depends on nearby content.
Version 0.1.0
Semanticwind now styles native progress and meter elements.
<article>
<header><h2>Release notes</h2></header>
<p>Standalone content.</p>
<footer>Publication details.</footer>
</article>Use captions when content needs a name or explanation that remains attached to it.
Start with the platform.
<figure>
<blockquote>Start with the platform.</blockquote>
<figcaption>Source and context.</figcaption>
</figure>Let the browser choose an appropriate source. Intrinsic dimensions reserve space; meaningful alternative text explains purpose; lazy loading belongs only on images below the fold.
<img
src="report-800.webp"
srcset="report-400.webp 400w, report-800.webp 800w"
sizes="(max-width: 40rem) 100vw, 40rem"
width="800"
height="500"
alt="Quarterly revenue by region"
loading="lazy"
>Use alt="" for a decorative image. Use <picture> only for alternate formats or art direction, with a fallback <img>.
Prefer machine-readable values when a date, identifier, or definition has meaning beyond its display text.
<dl>
<div><dt>Released</dt><dd><time datetime="2026-08-28">August 28</time></dd></div>
</dl>Labels name individual controls; a fieldset and legend name the relationship between them.
<fieldset>
<legend>Delivery speed</legend>
<label><input type="radio" name="delivery"> Standard</label>
</fieldset>A label names the control, name identifies submitted data, type and autocomplete unlock browser behavior, and visible help stays connected. A placeholder is never the label.
<label for="email">Email address</label>
<input
id="email"
name="email"
type="email"
autocomplete="email"
aria-describedby="email-help"
>
<small id="email-help">We will send the receipt here.</small>Read-only values remain focusable and submitted; disabled values do neither. Explain invalid input in visible text.
<input name="account-id" value="SW-1042" readonly>
<input name="legacy-id" value="Unavailable" disabled>
<input type="email" required aria-invalid="true" aria-describedby="email-error">
<small id="email-error">Error: Enter a complete email address.</small>Progress reports task completion. Meter evaluates a scalar value against a known range.
<progress value="65" max="100">65%</progress>
<meter min="0" max="100" low="50" high="85" value="65">65%</meter>Native HTML removes work, but authors still need to test their content and composition.
tabindex.lang, test dir="rtl", and allow translated labels to grow.Before installing a dependency, use browser-owned semantics and behavior. Add custom UI only when a proven requirement outgrows native capability, support, or control.
Keep instructions visible when people need them to finish the task. Use a user-invoked popover only when the detail is genuinely optional.
<label for="release-name">Release name</label>
<input id="release-name" aria-describedby="release-name-help">
<small id="release-name-help">Visible instructions.</small>Newer support · Can I Use
Use a shared name when only one answer should stay open. Older supported browsers keep both disclosures independently usable. Add a component when routing, controlled state, or custom animation is required.
Native HTML elements with broadly useful defaults.
When repeated product meaning or custom behavior appears.
<details name="faq" open>...</details>
<details name="faq">...</details>Broad support · Can I Use
Use a regular popover for optional information people deliberately request; the browser owns activation, the top layer, light dismissal, and Escape, while the application owns placement. Use a dialog when the user must respond.
<button popovertarget="shortcut-help">Keyboard shortcut</button>
<div id="shortcut-help" popover>Press ⌘ + Enter to publish.</div>Broad support: dialog · Newer support: commands
Use a modal dialog when the user must respond before returning to the page; the browser manages focus and the inert background.
<button commandfor="confirm" command="show-modal">Open</button>
<dialog id="confirm">
<h4>Publish release?</h4>
<form method="dialog">
<button value="cancel">Cancel</button>
<button value="publish">Publish</button>
</form>
</dialog>Mixed support · Date and time · Color · Range
Use platform pickers when native appearance and graceful fallback are acceptable. Go custom only when a required interaction is unavailable.
<input type="date">
<input type="color">
<input id="confidence" type="range">
<output for="confidence">72</output>Limited support · Can I Use
Use datalist for lightweight suggestions that still allow free text. Choose a custom combobox for large data, reliable styling, or stronger assistive behavior.
<input list="projects">
<datalist id="projects">
<option value="Customer portal">
</datalist>