Base
DefaultWhite surface, divider border, the small shadow. This is the card the feature triptych uses.
Seven components, rendered from tokens.css and components.css with no page styles of their own. The section patterns that arrange them into a landing page live in sections.css and are shown in the demo.
A surface with a divider border and the smallest shadow. The raised variant is the loudest elevation in the theme, which is why one per screen is the ceiling.
White surface, divider border, the small shadow. This is the card the feature triptych uses.
A recessed well rather than a raised surface, so it takes the muted ground and drops the shadow entirely.
The whole card is the target. Hover lifts it two pixels and steps the shadow up one place.
<article class="sl-card">
<div class="sl-card-header">
<h3 class="sl-card-title">Title</h3>
<span class="sl-badge sl-badge-neutral">Label</span>
</div>
<p class="sl-card-body">Body copy.</p>
<div class="sl-card-footer"><button class="sl-btn sl-btn-secondary sl-btn-sm">Action</button></div>
</article>
The border on a field is the control border rather than the divider border, which clears the 3:1 non-text floor against all three grounds. The category default of one light grey for every line leaves a form field between 1.2:1 and 1.5:1: Tailwind's gray-200 is 1.24:1 against white and its gray-300 is 1.47:1.
<div class="sl-field">
<label class="sl-label" for="work-email">Work email</label>
<input class="sl-input" id="work-email" type="email" />
<span class="sl-hint">We send the trial link here.</span>
</div>
Coloured text on a pale fill. Every pairing below is measured and recorded in tokens.css, and the lowest of them is 4.74:1.
<span class="sl-badge sl-badge-success">Renewed</span>
The billing period control, and a radio group rather than a switch. A switch announces as on or off and leaves a screen reader user to work out which price "on" means. Two radios with a legend announce the question and the answer, and the price swap they drive in sections.css is a CSS rule rather than a listener.
<fieldset class="sl-segmented">
<legend class="sl-visually-hidden">Billing period</legend>
<label class="sl-segmented-option">
<input type="radio" name="billing" id="billing-monthly" checked /> Monthly
</label>
<label class="sl-segmented-option">
<input type="radio" name="billing" id="billing-annual" /> Annual
</label>
</fieldset>
The wrapper is part of the component. A four column comparison does not fit a 390px viewport at a readable size, so the region scrolls and carries the tabindex that makes a scrollable area reachable without a pointer.
| Feature | Starter | Team | Enterprise |
|---|---|---|---|
| People included | Up to 10 | Up to 100 | No limit |
| SSO and directory sync | No | No | Yes |
<div class="sl-table-wrap" tabindex="0" role="region" aria-label="Comparison, scrollable">
<table class="sl-table">
<caption>What the table is for.</caption>
<thead><tr><th scope="col">Feature</th><th scope="col">Team</th></tr></thead>
<tbody><tr><th scope="row">Seats</th><td>Up to 100</td></tr></tbody>
</table>
</div>