The Component Model
A page's components array is a tree. Every entry has a type — one of 90 built-in component types — and a set of properties. Components do not each invent their own vocabulary: they compose from a small set of shared modules, so the same cross-cutting properties mean the same thing everywhere they appear.
components:
- type: container
props: { className: 'max-w-4xl mx-auto' }
children:
- { type: text, element: h1, content: 'Tasks' }
- type: data-table
dataSource: { table: tasks }Shared Modules
| Module | Present on | What it does |
|---|---|---|
props |
Every component | Key-value bag rendered as HTML attributes — className, variant, and component-specific keys. |
children |
Every component | Nested component definitions, or plain strings. Arbitrary depth. |
content |
Content and layout | Inline text or markdown, with reference substitution. |
dataSource |
Data-bound components | Binds to a table or a system endpoint. See Data Binding. |
visibility |
Most components | Conditional display based on auth state. |
responsive |
Most components | Per-breakpoint property overrides. |
interactions |
Interactive components | Click, hover, scroll and entrance behavior. See Interactions. |
action |
Form and button components | What running the component does — crud, auth, navigate, automation. |
i18n |
Content components | Per-language content variants. |
props and children are universal. The rest are opt-in per type: a divider carries props and children and nothing else, while a hero adds content, interactions, responsive, visibility and i18n. Each reference page states what its components actually accept.
Unknown keys are dropped, not rejected. A misspelled module name — onClick instead of interactions.click, inline instead of inlineScripts — passes validation and then does nothing. When a declared behavior silently fails to appear, check the key against the reference page before checking the runtime.
Reference Substitution
content and props values resolve four reference families at render time:
$record.<field> (the bound record), $vars.<key> (page variables), $currentUser.<path> (session context), and $t:<key> (translations). A page rendered from markdown adds $frontmatter.*. See Data Binding for what each resolves to.
Categories
The 90 types are documented by category, each on its own page.
| Category | Types |
|---|---|
| Layout | hero, container, flex, grid, responsive-grid, card, sidebar, modal, split-pane, tab-panel |
| Structural | divider, spacer |
| Content | text, code, icon, toc, pageSearch, searchInput |
| Media | image, video, audio, iframe, qr-code |
| Display | accordion, empty-state, list-item, record-field, scroll-area, speech-bubble, static-table, tabs, timeline |
| Navigation | navigation-menu, dropdown-menu, context-menu, menubar, breadcrumb, pagination |
| Overlays | dialog, alert-dialog, drawer, record-drawer, popover, hover-card, tooltip, toast |
| Feedback | progress, spinner, skeleton |
| Interactive | button, button-group, link, alert, badge, theme-toggle |
| Data | data-table, list, gallery, kanban, calendar, chart, kpi, data-timeline, data-form, form |
| Form Controls | input, textarea, select, checkbox, radio-group, switch, toggle, toggle-group, field |
| Advanced Controls | slider, date-picker, time-picker, number-input, file-upload |
| Specialty | reorderable-list, language-switcher |
| Social | comments, commentCount, ai-chat |
| Custom | customHTML |
Related Pages
- Reusable Components — defining a template once and instantiating it with
$ref. - Pages Overview — where the
componentsarray lives. - Data Binding — the
dataSourcemodule. - Interactions — the
interactionsandactionmodules. - Responsive Design — the
responsivemodule. - Theme — the tokens component styling consumes.
Last updated September 1, 2026
This documentation was written with AI, so errors or outdated content are possible. Sovrium is in beta. Contributions and corrections are welcome.