Page primitives
The pieces every real page rebuilt on its own in Round 4, now one shared set: the overlay layer, tabs, sticky save and action bars, the record header, key/value asides, list rows and two more status chips.
Kit v2. Same values the approved pages already use, so switching a page to these is pixel-neutral.
Sticky-safe shell
The frame, main column and phone frame clip instead of hiding overflow, so a sticky top bar, toolbar or save bar sticks on a real page.
Nothing to see changes: overflow:clip clips exactly like hidden but is not a scroll container, so position:sticky children stick to the page scroll.
.frame{overflow:clip}.main{overflow:clip}.phone{overflow:clip}Overlay layer
Full-viewport layer for sheets, dialogs, guards and the help drawer on a real page.
A page puts its sheets, dialogs and help drawer in a fixed layer, so they cover the viewport and not the frame. .below-bar keeps the help drawer under the top bar and beside the sidebar.
.k-layer.k-layer.below-bar.k-sheet-b[data-k-toggle]Tab strip
Page and section navigation. A segmented control is a value; tabs move you between views.
.tabs.tab[role=tab]aria-controls--tab-hRecord header
Detail pages: who it is, its state, the facts, and the ranked actions.
James Whitfield
ActiveVIP.k-rec.k-rec-t.k-rec-m.k-rec-a.avatarKey/value aside
Facts in a side column. Long ids wrap instead of pushing the column wide.
- Order
- RJ-24117
- Envelope id
- env_01J9ZQ4X8T6K3M2W7RBN5HCY0D
- ERP
- In sync
- Placed
- 9 Oct 2026, 14:22
- Total
- £1,890.00 · GBP
.k-kv--kv-labelSticky save bar
A whole-page form keeps Save in view. Type in the field to see the dirty state.
.k-savebar.k-saved.k-dirty.k-err[data-k-form][data-k-discard]List row without a thumbnail
Campaigns, rules, tickets and releases on a phone: title, one line, chips, and a trailing figure.
Phone action bar
One primary in thumb reach above the tab bar. Select swaps it to a selection bar.
.k-actbar.k-actbar.sel.k-selmsg[data-k-when]Switch
kit.js flips a switch on click. A page that flips it itself, or opens a confirm, is left alone.
.switch[role=switch]aria-checked.switch.lockTwo more states
A campaign that ran its course, and a column no backend stage feeds yet.
.chip.ended.chip.unmapped.k-unmapped.dot.neutralLink buttons
Scoped link reset.
These sit inside a block that resets a{color:inherit}. The filled link buttons keep their own text colour.
a.btna.btn.btn-primarya.btn.btn-danger