Proof
This page exposes the internals of the site you are reading. Every value below is read from the page after it loads or from a measurement file committed in the repository; nothing is typed in.
Primitives on this page
One of each of the first eleven primitives, rendered with @svelte-lean/styles;
the rest of the catalog is on its own pages and in the gallery on Primitives. The seven native ones here work with page JavaScript
disabled wherever the platform features in the last section are supported; the four behaviors
and the panels that read the runtime need JavaScript.
Anchored to its invoker with CSS anchor positioning where supported.
Disclosure
- Listbox
- Second option
- First option
- Second option
- Runtime
- Read from the page after it loads; requires JavaScript.
Instances versus listeners
Mount more tabs roots and read the listener table again. A Tier 1 behavior installs one listener per event type on the document runtime, so the count is the same for one root and for a thousand (ADR 0004; the release gate in listeners.spec.ts).
| Roots | Runtime account | Independent count | Router listeners on elements |
|---|---|---|---|
| Readings appear after the page loads. | |||
Runtime tiers
| Primitive | Tier | Shared listeners | Module | Behavior JS (brotli) |
|---|---|---|---|---|
| button | 0 | none | none (native) | 0 B |
| dialog | 0 | none | none (native) | 0 B |
| popover | 0 | none | none (native) | 0 B |
| disclosure | 0 | none | none (native) | 0 B |
| checkbox | 0 | none | none (native) | 0 B |
| switch | 0 | none | none (native) | 0 B |
| radio-group | 0 | none | none (native) | 0 B |
| tabs | 1 | click, keydown | @svelte-lean/primitives/tabs/register | 1521 B |
| menu | 1 | click, keydown, toggle | @svelte-lean/primitives/menu/register | 1932 B |
| listbox | 1 | click, keydown | @svelte-lean/primitives/listbox/register | 1838 B |
| combobox | 2 | click, keydown, input, pointerdown, pointerover, focusout, toggle | @svelte-lean/primitives/combobox/register | 2564 B |
| date-field | 0 | none | none (native) | 0 B |
| calendar | 1 | click, keydown, pointerover, pointerout | @svelte-lean/primitives/calendar/register | 3925 B |
| date-picker | 2 | click, keydown, input, change, pointerdown, focusout, toggle | @svelte-lean/primitives/date-picker/register | 4912 B |
| input | 0 | none | none (native) | 0 B |
| field | 0 | none | none (native) | 0 B |
| select | 2 | click, keydown, pointerdown, pointerover, focusout, change, toggle | @svelte-lean/primitives/select/register | 3362 B |
| segmented | 0 | none | none (native) | 0 B |
| rating | 0 | none | none (native) | 0 B |
| slider | 0 | none | none (native) | 0 B |
| otp-field | 0 | none | none (native) | 0 B |
| file-field | 0 | none | none (native) | 0 B |
| color-field | 0 | none | none (native) | 0 B |
| autocomplete | 0 | none | none (native) | 0 B |
| alert-dialog | 0 | none | none (native) | 0 B |
| drawer | 0 | none | none (native) | 0 B |
| accordion | 0 | none | none (native) | 0 B |
| card | 0 | none | none (native) | 0 B |
| separator | 0 | none | none (native) | 0 B |
| avatar | 0 | none | none (native) | 0 B |
| badge | 0 | none | none (native) | 0 B |
| tag | 0 | none | none (native) | 0 B |
| kbd | 0 | none | none (native) | 0 B |
| carousel | 0 | none | none (native) | 0 B |
| alert | 0 | none | none (native) | 0 B |
| progress | 0 | none | none (native) | 0 B |
| meter | 0 | none | none (native) | 0 B |
| spinner | 0 | none | none (native) | 0 B |
| skeleton | 0 | none | none (native) | 0 B |
| breadcrumb | 0 | none | none (native) | 0 B |
| pagination | 0 | none | none (native) | 0 B |
| steps | 0 | none | none (native) | 0 B |
| toggle | 1 | click | @svelte-lean/primitives/toggle/register | 888 B |
| toggle-group | 1 | click, keydown | @svelte-lean/primitives/toggle-group/register | 1569 B |
| toolbar | 1 | keydown, focusin | @svelte-lean/primitives/toolbar/register | 1494 B |
| range-slider | 1 | input | @svelte-lean/primitives/range-slider/register | 1291 B |
| number-field | 1 | click | @svelte-lean/primitives/number-field/register | 1082 B |
| tree | 1 | click, keydown | @svelte-lean/primitives/tree/register | 1919 B |
| tooltip | 1 | pointerover, pointerout, focusin, focusout, keydown | @svelte-lean/primitives/tooltip/register | 1297 B |
| toast | 2 | click, pointerover, pointerout, focusin, focusout | @svelte-lean/primitives/toast/register | 1396 B |
| button-group | 0 | none | none (native) | 0 B |
| scroll-area | 0 | none | none (native) | 0 B |
| descriptions | 0 | none | none (native) | 0 B |
| timeline | 0 | none | none (native) | 0 B |
| empty | 0 | none | none (native) | 0 B |
| splitter | 2 | keydown, pointerdown | @svelte-lean/primitives/splitter/register | 1683 B |
| context-menu | 1 | contextmenu | @svelte-lean/primitives/context-menu/register | 1409 B |
| file-drop | 1 | dragenter, dragleave, drop, change | @svelte-lean/primitives/file-drop/register | 1107 B |
| hover-card | 1 | pointerover, pointerout, focusin, focusout, keydown | @svelte-lean/primitives/hover-card/register | 1353 B |
| menubar | 1 | keydown, focusin, pointerover | @svelte-lean/primitives/menubar/register | 1457 B |
Loaded behavior modules
@svelte-lean/vite scans this site's Svelte files for static data-slean markers and writes a manifest next to the build. This is what it recorded
for the build you are looking at.
| Behavior | Registration module | Files |
|---|---|---|
| accordion | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/accordion/+page.svelte |
| alert | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/alert/+page.svelte |
| alert-dialog | none (native) | src/routes/primitives/alert-dialog/+page.svelte |
| autocomplete | none (native) | src/routes/primitives/autocomplete/+page.svelte |
| avatar | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/avatar/+page.svelte |
| badge | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/badge/+page.svelte |
| breadcrumb | none (native) | src/routes/primitives/breadcrumb/+page.svelte |
| button | none (native) | src/lib/components/CopyButton.svelte, src/lib/components/ThemeToggle.svelte, src/lib/components/TopNav.svelte, src/lib/home/ListenerLab.svelte, src/lib/home/Stage.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/docs/architecture/native-first/+page.svelte, src/routes/performance/results/+page.svelte, src/routes/performance/results/RowsSpecimen.svelte, src/routes/primitives/alert-dialog/+page.svelte, src/routes/primitives/alert/+page.svelte, src/routes/primitives/badge/+page.svelte, src/routes/primitives/button-group/+page.svelte, src/routes/primitives/button/+page.svelte, src/routes/primitives/card/+page.svelte, src/routes/primitives/combobox/+page.svelte, src/routes/primitives/dialog/+page.svelte, src/routes/primitives/drawer/+page.svelte, src/routes/primitives/empty/+page.svelte, src/routes/primitives/kbd/+page.svelte, src/routes/primitives/listbox/+page.svelte, src/routes/primitives/menu/+page.svelte, src/routes/primitives/popover/+page.svelte, src/routes/primitives/spinner/+page.svelte, src/routes/primitives/toast/+page.svelte, src/routes/primitives/toolbar/+page.svelte, src/routes/primitives/tooltip/+page.svelte, src/routes/proof/+page.svelte, src/routes/styling/themes/+page.svelte, src/routes/styling/variants/+page.svelte, src/routes/table/clipboard-export/CsvExport.svelte, src/routes/table/clipboard-export/RangeClipboard.svelte, src/routes/table/columns/Visibility.svelte, src/routes/table/editing/Editing.svelte, src/routes/table/pagination/Pagination.svelte, src/routes/table/rows/NestedTable.svelte, src/routes/table/rows/RowAnimation.svelte, src/routes/table/rows/RowEvents.svelte, src/routes/table/selection/Selection.svelte, src/routes/table/server-data/EmptyStates.svelte, src/routes/table/server-data/LoadingEmpty.svelte, src/routes/table/server-data/ServerData.svelte, src/routes/table/state-persistence/PersistedState.svelte |
| button-group | none (native) | src/routes/primitives/button-group/+page.svelte |
| calendar | @svelte-lean/primitives/calendar/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/calendar/+page.svelte, src/routes/primitives/date-picker/+page.svelte |
| card | none (native) | src/routes/primitives/card/+page.svelte |
| carousel | none (native) | src/routes/primitives/carousel/+page.svelte |
| checkbox | none (native) | /vercel/path0/packages/table/dist/table/data-table.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/primitives/checkbox/+page.svelte, src/routes/primitives/dialog/+page.svelte, src/routes/primitives/drawer/+page.svelte, src/routes/proof/+page.svelte, src/routes/table/layout/DensityBorders.svelte, src/routes/table/server-data/LoadingEmpty.svelte |
| color-field | none (native) | src/routes/primitives/color-field/+page.svelte |
| combobox | @svelte-lean/primitives/combobox/register | src/lib/home/Stage.svelte, src/lib/primitives/Gallery.svelte, src/routes/docs/architecture/runtime-tiers/+page.svelte, src/routes/primitives/combobox/+page.svelte, src/routes/proof/+page.svelte |
| context-menu | @svelte-lean/primitives/context-menu/register | src/routes/primitives/context-menu/+page.svelte |
| date-field | none (native) | src/routes/primitives/date-field/+page.svelte |
| date-picker | @svelte-lean/primitives/date-picker/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/date-picker/+page.svelte |
| descriptions | none (native) | src/routes/primitives/descriptions/+page.svelte |
| dialog | none (native) | src/lib/home/Stage.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/docs/architecture/native-first/+page.svelte, src/routes/primitives/combobox/+page.svelte, src/routes/primitives/dialog/+page.svelte, src/routes/proof/+page.svelte, src/routes/styling/variants/+page.svelte |
| disclosure | none (native) | src/lib/home/Stage.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/primitives/disclosure/+page.svelte, src/routes/proof/+page.svelte |
| drawer | none (native) | src/routes/primitives/drawer/+page.svelte |
| empty | none (native) | src/routes/primitives/empty/+page.svelte |
| field | none (native) | src/routes/primitives/field/+page.svelte, src/routes/primitives/input/+page.svelte |
| file-drop | @svelte-lean/primitives/file-drop/register | src/routes/primitives/file-drop/+page.svelte |
| file-field | none (native) | src/routes/primitives/file-field/+page.svelte |
| hover-card | @svelte-lean/primitives/hover-card/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/hover-card/+page.svelte |
| input | none (native) | src/routes/primitives/field/+page.svelte, src/routes/primitives/input/+page.svelte, src/routes/styling/themes/+page.svelte, src/routes/table/server-data/EmptyStates.svelte |
| kbd | none (native) | src/routes/primitives/kbd/+page.svelte |
| listbox | @svelte-lean/primitives/listbox/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/listbox/+page.svelte, src/routes/proof/+page.svelte |
| menu | @svelte-lean/primitives/menu/register | src/lib/home/Stage.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/primitives/button-group/+page.svelte, src/routes/primitives/context-menu/+page.svelte, src/routes/primitives/menu/+page.svelte, src/routes/primitives/menubar/+page.svelte, src/routes/proof/+page.svelte, src/routes/table/columns/Visibility.svelte |
| menubar | @svelte-lean/primitives/menubar/register | src/routes/primitives/menubar/+page.svelte |
| meter | none (native) | src/routes/primitives/meter/+page.svelte |
| number-field | @svelte-lean/primitives/number-field/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/number-field/+page.svelte |
| otp-field | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/otp-field/+page.svelte |
| pagination | none (native) | src/routes/primitives/pagination/+page.svelte |
| popover | none (native) | src/lib/home/Stage.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/docs/architecture/native-first/+page.svelte, src/routes/primitives/listbox/+page.svelte, src/routes/primitives/popover/+page.svelte, src/routes/proof/+page.svelte, src/routes/styling/variants/+page.svelte, src/routes/table/sorting/HeaderSort.svelte |
| progress | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/progress/+page.svelte |
| radio-group | none (native) | src/lib/home/TableLab.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/primitives/radio-group/+page.svelte, src/routes/proof/+page.svelte, src/routes/table/layout/DensityBorders.svelte, src/routes/table/localization-rtl/Messages.svelte, src/routes/table/selection/Selection.svelte |
| range-slider | @svelte-lean/primitives/range-slider/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/range-slider/+page.svelte |
| rating | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/rating/+page.svelte |
| scroll-area | none (native) | src/routes/primitives/scroll-area/+page.svelte |
| segmented | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/field/+page.svelte, src/routes/primitives/segmented/+page.svelte |
| select | @svelte-lean/primitives/select/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/select/+page.svelte |
| separator | none (native) | src/routes/primitives/separator/+page.svelte |
| skeleton | none (native) | src/routes/primitives/skeleton/+page.svelte |
| slider | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/slider/+page.svelte |
| spinner | none (native) | src/routes/primitives/skeleton/+page.svelte, src/routes/primitives/spinner/+page.svelte |
| splitter | @svelte-lean/primitives/splitter/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/splitter/+page.svelte |
| steps | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/steps/+page.svelte |
| switch | none (native) | src/lib/home/Stage.svelte, src/lib/home/TableLab.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/primitives/switch/+page.svelte, src/routes/proof/+page.svelte |
| tabs | @svelte-lean/primitives/tabs/register | src/lib/components/ExampleFrame.svelte, src/lib/components/InstallBlock.svelte, src/lib/components/TabsRoots.svelte, src/lib/home/Compare.svelte, src/lib/home/Stage.svelte, src/lib/primitives/Gallery.svelte, src/routes/demos/settings/SettingsApp.svelte, src/routes/docs/architecture/dom-protocol/+page.svelte, src/routes/docs/architecture/runtime-tiers/+page.svelte, src/routes/primitives/tabs/+page.svelte, src/routes/proof/+page.svelte, src/routes/styling/variants/+page.svelte |
| tag | none (native) | src/lib/primitives/Gallery.svelte, src/routes/primitives/tag/+page.svelte |
| timeline | none (native) | src/routes/primitives/timeline/+page.svelte |
| toast | @svelte-lean/primitives/toast/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/toast/+page.svelte |
| toggle | @svelte-lean/primitives/toggle/register | src/routes/primitives/toggle/+page.svelte, src/routes/primitives/toolbar/+page.svelte |
| toggle-group | @svelte-lean/primitives/toggle-group/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/toggle-group/+page.svelte, src/routes/primitives/toolbar/+page.svelte |
| toolbar | @svelte-lean/primitives/toolbar/register | src/routes/primitives/toolbar/+page.svelte |
| tooltip | @svelte-lean/primitives/tooltip/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/tooltip/+page.svelte |
| tree | @svelte-lean/primitives/tree/register | src/lib/primitives/Gallery.svelte, src/routes/primitives/tree/+page.svelte |
Controllers
Tier 2 behaviors create a scoped controller on first interaction and count it in development
builds. The combobox above is the one Tier 2 behavior: nothing exists for it until you type or
press ArrowDown in it; while its popup is open one document listener is scoped to that
session, and the count returns to zero when it closes. Shipping invariant D of ADR 0005 is
asserted with a hundred roots in lazy.spec.ts. This is a production build, where the diagnostics are stripped. To read the live count and
the runtime report, run yarn workspace @svelte-lean/docs dev, open this page
and evaluate window.__SLEAN_DEBUG__.report() in the console.
Bundle sizes
What a consumer application ships, from the fixtures in fixtures/: each is a Vite application built in production
mode with every @svelte-lean/* module isolated into one chunk.
| Fixture | Uses | brotli | gzip | raw | Assertions |
|---|---|---|---|---|---|
| combobox-only | combobox markup, discovered by the plugin | 2564 B | 2849 B | 6855 B | 48 passed |
| date-picker-only | date picker and range picker markup, discovered by the plugin | 5446 B | 5935 B | 15676 B | 53 passed |
| listbox-only | listbox markup, discovered by the plugin | 1838 B | 2030 B | 4268 B | 46 passed |
| manual-registration | tabs markup, register module imported by hand | 1521 B | 1693 B | 3639 B | 42 passed |
| native-only | button, dialog, popover markup and styles | 0 B | 0 B | 0 B | 31 passed |
| select-only | owned select markup, discovered by the plugin | 3362 B | 3731 B | 9526 B | 48 passed |
| table-basic | <DataTable /> and its stylesheet | 16829 B | 18900 B | 52658 B | 46 passed |
| tabs-and-menu | tabs and menu markup | 2351 B | 2611 B | 6209 B | 43 passed |
| tabs-only | tabs markup, discovered by the plugin | 1521 B | 1693 B | 3639 B | 43 passed |
Production `vite build` per fixture with Vite defaults (esbuild minify, modulepreload polyfill). Sizes are the emitted JavaScript and CSS files: raw bytes, gzip level 9, brotli quality 11 (node:zlib). "svelteLean" is the svelte-lean chunk that the fixture plugin isolates for every @svelte-lean/* module and "svelteRuntime" the svelte-runtime chunk for Svelte's runtime (both include chunk import/export bindings); 0 B means no such chunk was emitted. "modules.svelteLean" lists rendered @svelte-lean/* modules with their pre-minification rendered length. Environment: Node v22.23.3, Vite 7.3.6, Svelte 5.57.1.
Browser capabilities
Feature detection in the browser you are using, for the platform features the native paths depend on. The contracts list each feature's Baseline status and the behavior outside the target.
| Feature | Used by | This browser |
|---|---|---|
| Detection runs in the browser and requires JavaScript. | ||
Without JavaScript
With scripting disabled, the button, dialog, popover, disclosure, checkbox, switch and radio
group above keep working wherever the browser supports the features listed; the dialog and
popover invokers depend on invoker commands and the Popover API. The tabs root keeps its
authored state (the first panel visible, switching impossible), the menu opens as a plain
popover, the listbox keeps its authored selection, the combobox is a plain text field with a
closed popup, and the panels that read the runtime show their static text. The playground
suite runs the native contracts with page JavaScript disabled (javaScriptEnabled: false).