Page
Page protocol schemas
Page Region Schema
A named region in the template where components are dropped.
Source: packages/spec/src/ui/page.zod.ts
import { BlankPageLayout, BlankPageLayoutItem, ElementDataSource, InterfacePageConfig, Page, PageComponent, PageComponentType, PageRegion, PageType, PageVariable, RecordReviewConfig } from '@objectstack/spec/ui';
import type { BlankPageLayout, BlankPageLayoutItem, ElementDataSource, InterfacePageConfig, Page, PageComponent, PageComponentType, PageRegion, PageType, PageVariable, RecordReviewConfig } from '@objectstack/spec/ui';
// Validate data
const result = BlankPageLayout.parse(data);
| Property | Type | Required | Description |
|---|
| columns | integer | ✅ | Number of grid columns |
| rowHeight | integer | ✅ | Height of each grid row in pixels |
| gap | integer | ✅ | Gap between grid items in pixels |
| items | Object[] | ✅ | Positioned components on the canvas |
| Property | Type | Required | Description |
|---|
| componentId | string | ✅ | Reference to a PageComponent.id in the page |
| x | integer | ✅ | Grid column position (0-based) |
| y | integer | ✅ | Grid row position (0-based) |
| width | integer | ✅ | Width in grid columns |
| height | integer | ✅ | Height in grid rows |
| Property | Type | Required | Description |
|---|
| object | string | ✅ | Object to query |
| view | string | optional | Named view to apply |
| filter | [__schema0](./__schema0) | optional | Additional filter criteria |
| sort | Object[] | optional | Sort order |
| limit | integer | optional | Max records to display |
Interface-level page configuration (Airtable parity)
| Property | Type | Required | Description |
|---|
| source | string | optional | Source object name for the page |
| levels | integer | optional | Number of hierarchy levels to display |
| filterBy | Object[] | optional | Page-level filter criteria |
| appearance | Object | optional | Appearance and visualization configuration |
| userFilters | Object | optional | User filter configuration |
| userActions | Object | optional | User action toggles |
| addRecord | Object | optional | Add record entry point configuration |
| showRecordCount | boolean | optional | Show record count at page bottom |
| allowPrinting | boolean | optional | Allow users to print the page |
| Property | Type | Required | Description |
|---|
| name | string | ✅ | Page unique name (lowercase snake_case) |
| label | string | Object | ✅ | Display label: plain string or i18n translation object |
| description | string | Object | optional | Display label: plain string or i18n translation object |
| icon | string | optional | Page icon name |
| type | Enum<'record' | 'home' | 'app' | 'utility' | 'dashboard' | 'grid' | 'list' | 'gallery' | 'kanban' | 'calendar' | 'timeline' | 'form' | 'record_detail' | 'record_review' | 'overview' | 'blank'> | ✅ | Page type |
| variables | Object[] | optional | Local page state variables |
| object | string | optional | Bound object (for Record pages) |
| recordReview | Object | optional | Record review configuration (required when type is "record_review") |
| blankLayout | Object | optional | Free-form grid layout for blank pages (used when type is "blank") |
| template | string | ✅ | Layout template name (e.g. "header-sidebar-main") |
| regions | Object[] | ✅ | Defined regions with components |
| isDefault | boolean | ✅ | |
| assignedProfiles | string[] | optional | |
| interfaceConfig | Object | optional | Interface-level page configuration (for Airtable-style interface pages) |
| aria | Object | optional | ARIA accessibility attributes |
| Property | Type | Required | Description |
|---|
| type | Enum<'page:header' | 'page:footer' | 'page:sidebar' | 'page:tabs' | 'page:accordion' | 'page:card' | 'page:section' | 'record:details' | 'record:highlights' | 'record:related_list' | 'record:activity' | 'record:chatter' | 'record:path' | 'app:launcher' | 'nav:menu' | 'nav:breadcrumb' | 'global:search' | 'global:notifications' | 'user:profile' | 'ai:chat_window' | 'ai:suggestion' | 'element:text' | 'element:number' | 'element:image' | 'element:divider' | 'element:button' | 'element:filter' | 'element:form' | 'element:record_picker'> | string | ✅ | Component Type (Standard enum or custom string) |
| id | string | optional | Unique instance ID |
| label | string | Object | optional | Display label: plain string or i18n translation object |
| properties | Record<string, any> | ✅ | Component props passed to the widget. See component.zod.ts for schemas. |
| events | Record<string, string> | optional | Event handlers map |
| style | Record<string, string> | optional | Inline styles or utility classes |
| className | string | optional | CSS class names |
| visibility | string | optional | Visibility filter/formula |
| dataSource | Object | optional | Per-element data binding for multi-object pages |
| responsive | Object | optional | Responsive layout configuration |
| aria | Object | optional | ARIA accessibility attributes |
page:header
page:footer
page:sidebar
page:tabs
page:accordion
page:card
page:section
record:details
record:highlights
record:related_list
record:activity
record:chatter
record:path
app:launcher
nav:menu
nav:breadcrumb
global:search
global:notifications
user:profile
ai:chat_window
ai:suggestion
element:text
element:number
element:image
element:divider
element:button
element:filter
element:form
element:record_picker
| Property | Type | Required | Description |
|---|
| name | string | ✅ | Region name (e.g. "sidebar", "main", "header") |
| width | Enum<'small' | 'medium' | 'large' | 'full'> | optional | |
| components | Object[] | ✅ | Components in this region |
Page type — platform or interface page types
record
home
app
utility
dashboard
grid
list
gallery
kanban
calendar
timeline
form
record_detail
record_review
overview
blank
| Property | Type | Required | Description |
|---|
| name | string | ✅ | Variable name |
| type | Enum<'string' | 'number' | 'boolean' | 'object' | 'array' | 'record_id'> | ✅ | |
| defaultValue | any | optional | |
| source | string | optional | Component ID that writes to this variable |
| Property | Type | Required | Description |
|---|
| object | string | ✅ | Target object for review |
| filter | [__schema0](./__schema0) | optional | Filter criteria for review queue |
| sort | Object[] | optional | Sort order for review queue |
| displayFields | string[] | optional | Fields to display on the review page |
| actions | Object[] | ✅ | Review actions |
| navigation | Enum<'sequential' | 'random' | 'filtered'> | ✅ | Record navigation mode |
| showProgress | boolean | ✅ | Show review progress indicator |