The overview panel — each tab is a named slot keyed by the option value.
XForm — the form engine
Bare controls auto-bind through XFormField names (labels derive from them too). Live validation after the first attempt; an email containing 'taken' triggers a server-shaped error.
…from OUTSIDE the form — the native form attribute (the slideover-footer fix).
XForm — entity mode
no row = insert (Create) · a row with an id = update (Save)
The fields derive from the baked forms.json — controls, labels, required marks and the status/type enum options all come off the bake (checklist plumbing skipped). The database is injected (no DB here): a name containing 'taken' answers a server-shaped 400. The title field shows a per-field slot override. File Id is the x.file() control (batch 4): XUpload → the file row id (the transport is injected here; wired for real it POSTs /api/v1/files/upload).
XSpinner
Wave 4 — data components
Name
Email
Status
Logins
Ada Lovelace
ada@example.com
active
42
Grace Hopper
grace@example.com
pending
17
Edsger Dijkstra
edsger@example.com
archived
5
Margaret Hamilton
margaret@example.com
active
88
XList: one rows contract, `is` swaps the semantic rendering.
Ada Lovelace
Grace Hopper
Edsger Dijkstra
Margaret Hamilton
page 1 of 7 — speaks the API envelope ({ total, page, pages, limit }).
XIcon — any of the Iconify catalogue via @nuxt/icon.
mask: ##-##-##
mm
/
dd
/
yyyy
multiple
XAttribute
key + operator + value rows → the XWhere DSL, live.
{}
Wave 5 batch 3 — the editor cluster (lazy chunks, SSR shells)
export function greet(name: string) {
// a comment
return `Hello ${name}`
}
CodeMirror 6, theme from the tokens, grammar by name.
Rendered ⇆ code toggle; the code view is an XCode.
Sanitised in and out; the element itself is editable.
The tiptap editor — try selecting and typing. v-model is HTML.
tiptap + StarterKit; mode=inline drops the chrome.
Wave 5 batch 4 — XUpload (useXUploader)
The default transport POSTs the live /api/v1/files/upload route and resolves the inserted file row — this demo injects a ticking fake (no server needed).
Drop files here or click to browseimage/*,.pdf · up to 5.0 MB
A file-entity row's id derives the download link (/api/v1/files/:id/download) — same bridge on XImage :file (a row or a row id → src).
Wave 5 batch 4 stretch — XCropper (cropperjs v2)
SSR paints the plain image (no CLS); cropperjs mounts into its own chunk. The v-model is the crop box in natural image px — the file row's cropX/cropY/cropWidth/cropHeight columns, spoken bare. @crop fires on commit; Save PATCHes the file row through useXDatabase('file') — the database is injected here (no DB), answering the patched row back.
crop box: —
Wave 5 batch 5 — showcase chrome + css-as-data
xcookbook — gates
$npm run gates
typecheck · lint · 368 tests · bake · smoke
smoke green — the module boots, serves its pages
$git commit
$
localhost:3210/x/components
Components
56▲ 8this session
This paragraph is styled by an XCss block — css-as-data rendered into a live style tag.
…and this one by XStyle — style-as-data on the element itself.
XChallenge — one control, four guards (slide · pin · code · hold)
The v-model is the resolved boolean — set it false to rearm. pass/fail report verdicts; a pin without expected hands the entry to the parent via @code. The code type's verifier is injected here (no backend) — the default posts the live 2FA endpoint.
slide — slide to unlock (drag, or arrow keys / End)
Slide to confirm
→
hold — press and hold (the delete-guard pattern)
pin — local verify (the pin is 2468; a wrong entry fails + clears)
code — authenticator (injected verifier; 246810 passes after a beat)
Enter the 6-digit code
XColorMode — the dark-mode toggle
One control over useXColorMode(): light / dark / system, persisted in the x-color-mode cookie so the server renders <html class="dark"> in the initial payload (no flash). The baked theme's .dark { --x-* } scope and Tailwind's dark: variant both ride the one class; system follows the OS live.
mode system → resolved light
XChart · KPI stats · XFacets · XShare — the Lane G batch
XChart lazy-chunks Chart.js behind an SSR shell; the palette and text/grid colours read off the live --x-* tokens at mount (authored dataset colours win). The SAME config object becomes an email-embeddable image via quickChartUrlOf. XStat's chart prop is the KPI sparkline; XFacets rides the facets crud op (here an injected fetcher) and speaks XWhere; XShare is the native sheet with a clipboard + toast fallback.
No data yet
the same config as a QuickChart image URL: https://quickchart.io/chart?c=%7B%22type%22%3A%22line%22%2C%22data%22%3A%7B%22labels%22%3A%5B%22Jan%22%2C%22Feb%22%2C%22Mar%22%2C%22Apr%22%2C%22May%22%2C%22Jun%22%5D%2C%22datasets%22%3A%5B%7B%22label%22%3A%22Signups%22%2C%22data%22%3A%5B12%2C19%2C14%2C27%2C32%2C41%5D%7D%2C%7B%22label%22%3A%22Churn%22%2C%22data%22%3A%5B3%2C5%2C2%2C6%2C4%2C5%5D%7D%5D%7D%7D&w=600&h=300&bkg=white
Canva/Polotno posture: pages of elements on a Konva stage — drag with smart guides, transform, marquee/multi-select, align, z-order, undo/redo, inline text editing, page presets — exporting to PNG, multi-page PDF, webm video and the document JSON (which IS the v-model).
Empty page — add elements from the toolbar.
Document
Preset
W / H
Page
Name
Fill
Seconds
Reference — every registered component
Generated from the baked kitchen manifest (the same nodes the Studio and the form layer read) — 75 components. Props marked “model” are the v-model; “content” props take a string or an XBlock tree.