The working set
Every component the system ships, in the live stock. Real icons fetched at runtime, real keyboard behavior, and the markup to paste. Switch the stock in the header and the whole page re-themes. Toggle focus rings to audit every control.
Fetched, then sharpened
The system ships no icon paths. These are pulled live from the Iconify API and sharpened in code to Lokta's edge: a 24 grid, 2px stroke, square caps, miter joins, and currentColor so each glyph inherits its text role. Click any tile to copy its sharpened SVG.
Seed set and search
tabler · mynauiIn real components
Sharpen recipe
<svg viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2">
<!-- Iconify body -->
</svg>
/* CSS forces the edge */
svg.lk-icon * {
stroke-linecap: square;
stroke-linejoin: miter;
}Every class the system ships
Each component below uses the real Lokta classes, unrestyled, on the current stock. Interactive ones are genuinely keyboard operable, with an accessibility spec beside them. Markup blocks include the ARIA you need.
Tag
lk-tag
metadataWhen to use
Short, non-interactive metadata: a status word, a version, a category. Keep to one or two words, uppercase.
When not
Not for actions (use a button) and not for live status that pairs colour with meaning (use Status).
<span class="lk-tag">OUTLINE</span>
<span class="lk-tag lk-tag-filled">FILLED</span>
<span class="lk-tag lk-tag-pigment">PIGMENT</span>Input
lk-input
formStates
Anatomy
Accessibility
Pair every field with a visible <label for>. Placeholders disappear on input, so never use them as the only label. Error state needs text, not colour alone.
<label class="lk-label" for="q">Search the index</label>
<input id="q" class="lk-input" placeholder="Type to filter…"
aria-describedby="q-err" />
<p id="q-err" class="lk-label">Enter at least 2 characters</p>Checkbox and radio
lk-choice
form<label class="lk-choice">
<input type="checkbox" checked>
<span class="lk-box">✔</span><span>Email receipts</span>
</label>
<label class="lk-choice">
<input type="radio" name="bill">
<span class="lk-dot"></span><span>Annual</span>
</label>Select
lk-select
formWhen to use
For one choice from a known, short list. Past roughly seven options or when search helps, reach for a combobox instead.
<div class="lk-select">
<select aria-label="Date range">
<option>Last 12 weeks</option>
</select>
<span class="lk-select-chev" aria-hidden="true">▾</span>
</div>Slider
lk-slider
form<input class="lk-slider" type="range" min="0" max="100"
value="42" aria-label="Opacity" />Tabs
lk-tabs
navigation · a11yA measured grid keeps every tab calm and legible.
Three tiers: Starter, Team, Enterprise.
v2.4.0 added margin annotations.
Anatomy
When to use
Peer views of one object. Keep labels to a word. Not for sequential steps; use a wizard.
<div class="lk-tabs" role="tablist" aria-label="Plan details">
<button class="lk-tab" role="tab" id="t1"
aria-controls="p1" aria-selected="true">Overview</button>
</div>
<div id="p1" role="tabpanel" aria-labelledby="t1">…</div>Content switcher
lk-switcher
navigationWhen to use
Two or three mutually exclusive views of the same data, where the switch is a control rather than page navigation.
<div class="lk-switcher" role="tablist">
<button role="tab" aria-selected="true">Chart</button>
<button role="tab" aria-selected="false">Table</button>
</div>Pagination
lk-pager
navigation<nav class="lk-pager" aria-label="Pagination">
<button aria-label="Previous page">‹</button>
<button aria-current="true" aria-label="Page 1">1</button>
</nav>Accordion
lk-accordion
disclosure · a11yWhen not
Don't hide primary content or form steps people must complete. Accordions are for secondary detail.
<div class="lk-acc-item">
<button class="lk-acc-head" aria-expanded="true"
aria-controls="ac1">Question<span class="lk-acc-chev">▾</span></button>
<div class="lk-acc-body" id="ac1" role="region">Answer</div>
</div>Dialog
lk-modal
overlay · a11yAnatomy
Note
The modal is the single place the flat system allows a shadow: one hard offset, never a blur.
<div class="lk-modal-backdrop" role="dialog" aria-modal="true"
aria-labelledby="dlg-t">
<div class="lk-modal">
<div class="lk-modal-head"><span class="t" id="dlg-t">Cancel plan?</span></div>
<div class="lk-modal-body">…</div>
</div>
</div>Tooltip
lk-tip
overlay · a11yInline notification
lk-note-box
feedbackAccessibility
The left bar carries colour, but the icon and title carry the meaning, so the variant never relies on hue alone. Add role="status" for live, non-critical messages.
<div class="lk-note-box lk-note-success" role="status">
<span class="lk-note-ico" aria-hidden="true">✔</span>
<div><div class="lk-note-title">Saved</div>
<div class="lk-note-msg">Billing details updated.</div></div>
</div>Status
lk-status
feedback · a11yPair every status with its glyph (✔ ⚠ ○) so meaning survives for colour-blind readers and in greyscale print.
Signal state with a bare coloured dot. That fails WCAG 1.4.1, use of colour.
<span class="lk-status lk-status-done">DONE</span>
<span class="lk-status lk-status-alert">DELAYED</span>
<span class="lk-status lk-status-pending">QUEUED</span>
<!-- glyph is a ::before, paired with colour -->Progress
lk-progress
feedback<div class="lk-progress" role="progressbar" aria-label="Progress"
aria-valuenow="68" aria-valuemin="0" aria-valuemax="100">
<span style="right:32%"></span>
</div>Data table
lk-table
data · sortable| Experiment | Owner | Lift | Status |
|---|---|---|---|
| Onboarding checklist v3 | M. Reyes | +4.2 | DONE |
| Pricing page annual toggle | K. Adeyemi | +1.1 | RUN |
| Empty-state nudge | S. Park | -0.3 | HALT |
| Referral banner placement | J. Okafor | +2.8 | DONE |
Accessibility
Sortable headers are focusable and toggle aria-sort between ascending and descending. Click or press Enter on a header. Numerals are tabular and right-aligned.
interactive grid
ARIA grid · keyboard| Cohort | Users | Retained |
|---|---|---|
| Week 1 | 1,204 | 68% |
| Week 2 | 980 | 54% |
| Week 3 | 812 | 47% |
Keyboard
Arrow keys move the focused cell, Home/End jump to the row ends (Ctrl for the grid ends). Only one cell is in the tab order (roving tabindex), per the ARIA Grid pattern.
Code
lk-code
contentInline code reads as --surface-page within a sentence.
Page furniture
lk-measure · lk-endmark
dividerWhat it is
The system's signature divider: a rule that stops short of the margin and closes with a hatched end-mark, so a section ends with breath rather than a hard cut.
lk-running-head · lk-colophon · lk-folio
editorialWhen to use
In document and reading layouts, not dense app chrome. The running head names the section, the folio numbers the page, the colophon signs it.
Motion and Datatype
dt · dt-bars · dt-spark · dt-pie
Datatype · ligaWeekly actives climbed {l:20,45,60,55,80,95} through the quarter, error rate held flat {l:8,6,7,5,6,4}, and the region split {b:62,24,14} stayed steady. Conversion sits at {p:62} of target.
What it is
A variable OpenType data font (SIL OFL). Ligature substitution turns {b:…} bars, {l:…} sparklines, and {p:…} pie into inline charts, no SVG, no script. A chart made of text is still text: each is role="img" with an aria-label that states the trend in words. lokta-chart.js emits the source and the label together so they cannot drift.
lk-rule-in · lk-set-in · lk-stamp · lk-leaf
motion · flatFive flat primitives
rule-in (a line drawn via scaleX, the end-mark drawn last), set-in (a keyline frame rules in, content set at once), stamp (a stepped confirmation fill), leaf-turn (a clip wipe with a hatched edge), and write-in. No opacity fade, no blur, no scale-bloom. Reduced motion is the floor: each shows its final state at once, and the toggle persists.
lk-stream · write-in
streaming · a11yWritten in, not faded in.
Streaming, done right for screen readers
A chunked delivery pattern, not a typewriter: chunks append in stable blocks in the visible (aria-hidden) layer, and the complete message is announced once via a polite role="log" region that exists on load and starts empty. A visible Stop control (WCAG 2.2.2). Write-in stays a Tier-2 flourish for short one-shot moments, the animating node aria-hidden, the full string on the parent's aria-label.
lk-kolam
ornament · generatedWhat it is
A sikku kolam: one continuous line woven around a grid of pulli (dots), the alpana tradition behind the Bengali cookbook lineage. Generated deterministically by lokta-kolam.js as pure SVG, so it renders the same in a page, a slide, and a Typst PDF, and themes through currentColor. The stroke weight binds to the rule scale (fine, default, bold above); it is a per-instance parameter, not a dial. The divider band carries data-draw, so the line writes itself in via draw() and honours reduced motion. Every kolam is role="img" with an aria-label.