No JavaScript opened this. Click outside or press Esc to dismiss.
popover popovertarget
The invoker is the anchor — light dismiss, Esc and focus return are native.
js_loaded = 0 B
## a copy-paste ui kit for the 2026 web platform
Popovers, dialogs, tabs, toasts and carousels built from HTML + CSS only. The browser does the modality, the focus, the keyboard — nothing to download, parse, or break.
$ npx nojsui add 01 — proof
This page — live demos included — loads zero. Every demo runs on native HTML invoked the 2026 way: Popover API, anchor positioning, invoker commands, scroll-driven animations.
network → filter: JS
namesize
no requests match the filter.
0 requests0 B transferred
02 — the kit
No JavaScript opened this. Click outside or press Esc to dismiss.
popovertarget The invoker is the anchor — light dismiss, Esc and focus return are native.
commandfor Invoker Commands: modality, focus containment and return come from <dialog> itself.
Less to download, parse and break. The browser already knows how to do this.
Native semantics mean the keyboard and screen-reader behaviour come from the browser, not a reimplementation.
details[name] The browser enforces that opening one closes the others.
dialog The same <dialog>, pinned to a viewport edge with logical margins.
aria-describedby Announced by screen readers whether or not the bubble is visible.
appearance A real <select> with a styleable picker. Arrow keys and form data are native.
Saved to your library
@starting-style Appears, announced politely, removes itself on a timer — no script.
radio group One tab stop and arrow-key selection come from the browser.
dialog + radio A modal list filtered by category — deliberately not a palette.
typed attr() The bar is computed from data-step, so the number and the bar cannot disagree.
this card rose into place
on a view() timeline
animation-timeline Content rises into place on a view() timeline — visible without it.
::scroll-marker Scroll-snap everywhere; arrows and dots generated by CSS.
Type something that is not an address, then click away.
:placeholder-shown The label floats when the field has content, driven by the input's own state.
accent-color Three native controls, one look — the switch is a checkbox, so forms and keyboards work.
<datalist> A native slider with tick marks; a live value readout needs script, so it ships without one.
The backdrop lags the page on a view() timeline.
animation-timeline Depth from a scroll() timeline, off entirely under reduced motion.
the bar across the top of this page
is this component, reading
scroll()
<progress> Styled native <progress> — the value comes from markup, never from script.
navigate anywhere on this site —
the header holds its place
across the load
@view-transition Cross-document view transitions: real navigations that animate, with no router.
Narrow column
The card asks how much room it has.
Wide column — same markup
Past its threshold the media takes a column and the body takes the rest. Nothing here knows which zone it is in.
@container Lays itself out from the space it is given, not the width of the window.
inline-grid One button on a native <button> or <a>; the fill can be any color or image.
Enter an email address we can reply to.
@starting-style A message that stays until you remove it — the counterpart to toast.
scroll() Site chrome that condenses as the page moves, on a scroll timeline.
A base band.
A raised band.
max-inline-size Page rhythm, alternating surfaces and a centred measure — the page shell.
What we do
The one-sentence version, set larger and quieter.
max-inline-size Eyebrow, heading, lede and body copy at a reading measure.
Zero JavaScript
animation-fill-mode Content arrives on load — the one moment a scroll timeline cannot reach.
color-mix() A fixed decorative backdrop that inverts with the theme on its own.
flex-wrap Brand, link groups and a legal bar — responsive without a media query.
clip-path The first tab stop on the page, hidden until it is focused.
03 — why zero
/01
Nothing to download, parse, or crash. The browser already knows how to open a dialog and trap focus.
/02
Native semantics mean keyboard and screen-reader behaviour come from the browser, not a reimplementation.
/03
Every component documents its fallback tier — usable all the way down to plain HTML.
Ship the platform, not a framework.
browse the components →