| title |
View |
| description |
View protocol schemas |
{/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */}
HTTP Method Enum & HTTP Request Schema
Migrated to shared/http.zod.ts. Re-exported here for backward compatibility.
**Source:** `packages/spec/src/ui/view.zod.ts`
import { AddRecordConfig, AppearanceConfig, CalendarConfig, ColumnSummary, FormButtonConfig, FormField, FormSection, FormView, GalleryConfig, GanttConfig, GanttQuickFilter, GroupingConfig, GroupingField, KanbanConfig, ListChartConfig, ListColumn, ListView, NavigationConfig, NavigationMode, ObjectListView, ObjectUserFilters, PaginationConfig, RowColorConfig, RowHeight, SelectionConfig, TimelineConfig, TreeConfig, UserActionsConfig, UserFilterField, UserFilters, View, ViewData, ViewFilterRule, ViewItem, ViewItemName, ViewKind, ViewScope, ViewSharing, ViewTab, VisualizationType } from '@objectstack/spec/ui';
import type { AddRecordConfig, AppearanceConfig, CalendarConfig, ColumnSummary, FormButtonConfig, FormField, FormSection, FormView, GalleryConfig, GanttConfig, GanttQuickFilter, GroupingConfig, GroupingField, KanbanConfig, ListChartConfig, ListColumn, ListView, NavigationConfig, NavigationMode, ObjectListView, ObjectUserFilters, PaginationConfig, RowColorConfig, RowHeight, SelectionConfig, TimelineConfig, TreeConfig, UserActionsConfig, UserFilterField, UserFilters, View, ViewData, ViewFilterRule, ViewItem, ViewItemName, ViewKind, ViewScope, ViewSharing, ViewTab, VisualizationType } from '@objectstack/spec/ui';
// Validate data
const result = AddRecordConfig.parse(data);
Add record entry point configuration
| Property |
Type |
Required |
Description |
| enabled |
boolean |
✅ |
Show the add record entry point |
| position |
Enum<'top' | 'bottom' | 'both'> |
✅ |
Position of the add record button |
| mode |
Enum<'inline' | 'form' | 'modal'> |
✅ |
How to add a new record |
| formView |
string |
optional |
Named form view to use when mode is "form" or "modal" |
Appearance and visualization configuration
| Property |
Type |
Required |
Description |
| showDescription |
boolean |
✅ |
Show the view description text |
| allowedVisualizations |
Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'>[] |
optional |
Whitelist of visualization types users can switch between (e.g. ["grid", "gallery", "kanban"]) |
| Property |
Type |
Required |
Description |
| startDateField |
string |
✅ |
Field providing the event start date/time |
| endDateField |
string |
optional |
Field providing the event end date/time (defaults to a single-day event) |
| titleField |
string |
✅ |
Field displayed as the event title |
| colorField |
string |
optional |
Field whose value determines the event color |
Aggregation function for column footer summary
none
count
count_empty
count_filled
count_unique
percent_empty
percent_filled
sum
avg
min
max
| Property |
Type |
Required |
Description |
| show |
boolean |
optional |
Whether the button is rendered (renderer default applies when omitted) |
| label |
string |
optional |
Button label (i18n-capable; renderer default when omitted) |
| Property |
Type |
Required |
Description |
| field |
string |
✅ |
Field name (snake_case) |
| type |
Enum<'text' | 'textarea' | 'email' | 'url' | 'phone' | 'password' | 'secret' | 'markdown' | 'html' | 'richtext' | 'number' | 'currency' | 'percent' | 'date' | 'datetime' | 'time' | 'boolean' | 'toggle' | 'select' | 'multiselect' | 'radio' | 'checkboxes' | 'lookup' | 'master_detail' | 'tree' | 'user' | 'image' | 'file' | 'avatar' | 'video' | 'audio' | 'formula' | 'summary' | 'autonumber' | 'composite' | 'repeater' | 'record' | 'location' | 'address' | 'code' | 'json' | 'color' | 'rating' | 'slider' | 'signature' | 'qrcode' | 'progress' | 'tags' | 'vector'> |
optional |
Field type (auto-infers widget if omitted) |
| options |
{ label: string; value: string; color?: string; default?: boolean; … }[] |
optional |
Options for select/multiselect/radio/checkboxes fields |
| reference |
string |
optional |
Target object name for lookup/master_detail fields |
| maxLength |
number |
optional |
Maximum character length (for text/textarea/email/url/phone) |
| minLength |
number |
optional |
Minimum character length |
| min |
number |
optional |
Minimum value (for number/currency/percent/slider) |
| max |
number |
optional |
Maximum value |
| precision |
number |
optional |
Total digits (for number/currency) |
| scale |
number |
optional |
Decimal places |
| multiple |
boolean |
optional |
Allow multiple values (for select/lookup/file/image) |
| label |
string |
optional |
Display label override |
| placeholder |
string |
optional |
Placeholder text |
| helpText |
string |
optional |
Help/hint text |
| readonly |
boolean |
optional |
Read-only override |
| immutable |
boolean |
optional |
Editable on create, locked once the record exists (e.g. machine names). |
| required |
boolean |
optional |
Required override |
| hidden |
boolean |
optional |
Hidden override |
| colSpan |
integer |
optional |
[legacy — prefer span] Absolute column span (1-4). Fragile when the column count is derived per surface (mobile 1 / modal 2 / page 3-4): a fixed span only lines up at the width the author imagined. The renderer clamps it to the current column count. Prefer span. |
| span |
Enum<'auto' | 'full'> |
optional |
Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count (wide widgets like textarea/richtext/json/file/subform take the whole row). 'full': whole row at any column count. Prefer this over the absolute colSpan. |
| widget |
string |
optional |
Custom widget/component name (overrides type-based inference) |
| language |
string |
optional |
Code editor language (for type=code) |
| fields |
[FormField](#formfield)[] |
optional |
Sub-fields for composite/repeater/record types |
| keyField |
{ field?: string; label?: string; placeholder?: string; helpText?: string; … } |
optional |
Key column config for record-typed fields |
| dependsOn |
string |
optional |
Parent field name for cascading |
| visibleWhen |
string | { dialect: Enum<'cel' | 'cron' | 'template'>; source?: string; ast?: any; meta?: object } |
optional |
Visibility predicate (CEL) — field shown only when TRUE. Root: record+current_user (runtime forms) or data (metadata forms). e.g. Precord.priority == 'urgent' |
| visibleOn |
string | { dialect: Enum<'cel' | 'cron' | 'template'>; source?: string; ast?: any; meta?: object } |
optional |
[DEPRECATED → visibleWhen] Visibility predicate (CEL). Normalized to visibleWhen at parse. |
| disclosure |
Enum<'inline' | 'popover'> |
optional |
Composite rendering: inline bordered box (default) or a summary line + gear popover (progressive disclosure). |
| Property |
Type |
Required |
Description |
| name |
string |
optional |
Stable section identifier for i18n lookup (snake_case) |
| label |
string |
optional |
Display label (plain string; i18n keys are auto-generated by the framework) |
| description |
string |
optional |
Optional description rendered under the section header. |
| collapsible |
boolean |
optional |
|
| collapsed |
boolean |
optional |
|
| visibleWhen |
string | { dialect: Enum<'cel' | 'cron' | 'template'>; source?: string; ast?: any; meta?: object } |
optional |
Visibility predicate (CEL) — section shown only when TRUE. Root: record+current_user (runtime forms) or data (metadata forms). |
| visibleOn |
string | { dialect: Enum<'cel' | 'cron' | 'template'>; source?: string; ast?: any; meta?: object } |
optional |
[DEPRECATED → visibleWhen] Visibility predicate (CEL). Hides the whole section when false. Normalized to visibleWhen at parse. |
| columns |
Enum<'1' | '2' | '3' | '4'> | '1' | '2' | '3' | '4' |
optional |
|
| fields |
string | { field: string; type?: Enum<'text' | 'textarea' | 'email' | 'url' | 'phone' | 'password' | 'secret' | 'markdown' | 'html' | 'richtext' | 'number' | 'currency' | 'percent' | 'date' | 'datetime' | 'time' | 'boolean' | 'toggle' | 'select' | 'multiselect' | 'radio' | 'checkboxes' | 'lookup' | 'master_detail' | 'tree' | 'user' | 'image' | 'file' | 'avatar' | 'video' | 'audio' | 'formula' | 'summary' | 'autonumber' | 'composite' | 'repeater' | 'record' | 'location' | 'address' | 'code' | 'json' | 'color' | 'rating' | 'slider' | 'signature' | 'qrcode' | 'progress' | 'tags' | 'vector'>; options?: { label: string; value: string; color?: string; default?: boolean; … }[]; reference?: string; … }[] |
✅ |
|
| Property |
Type |
Required |
Description |
| type |
Enum<'simple' | 'tabbed' | 'wizard' | 'split' | 'drawer' | 'modal'> |
optional |
|
| layout |
Enum<'vertical' | 'horizontal' | 'inline' | 'grid'> |
optional |
Field layout direction |
| columns |
integer |
optional |
Number of columns for the form body |
| title |
string |
optional |
Form title |
| description |
string |
optional |
Form description |
| defaultTab |
string |
optional |
Initially active tab (tabbed forms) |
| tabPosition |
Enum<'top' | 'bottom' | 'left' | 'right'> |
optional |
Tab strip position (tabbed forms) |
| allowSkip |
boolean |
optional |
Allow skipping steps (wizard forms) |
| showStepIndicator |
boolean |
optional |
Show the step indicator (wizard forms) |
| splitDirection |
Enum<'horizontal' | 'vertical'> |
optional |
Split orientation (split forms) |
| splitSize |
number |
optional |
Primary split panel size, % (split forms) |
| splitResizable |
boolean |
optional |
Whether the split is resizable (split forms) |
| drawerSide |
Enum<'top' | 'bottom' | 'left' | 'right'> |
optional |
Drawer side (drawer forms) |
| drawerWidth |
string |
optional |
[DEPRECATED → size buckets] Drawer width, e.g. "480px". A pixel width cannot be chosen without knowing the client viewport — the renderer derives it. |
| modalSize |
Enum<'sm' | 'default' | 'lg' | 'xl' | 'full'> |
optional |
Modal size (modal forms) |
| data |
{ provider: 'object'; object: string } | { provider: 'api'; read?: object; write?: object } | { provider: 'value'; items: any[] } | { provider: 'schema'; schemaId: string; schema?: Record<string, any> } |
optional |
Data source configuration (defaults to "object" provider) |
| sections |
{ name?: string; label?: string; description?: string; collapsible?: boolean; … }[] |
optional |
|
| groups |
{ name?: string; label?: string; description?: string; collapsible?: boolean; … }[] |
optional |
|
| subforms |
{ childObject: string; relationshipField?: string; columns?: any[]; amountField?: string; … }[] |
optional |
Inline master-detail child collections |
| defaultSort |
{ field: string; order?: Enum<'asc' | 'desc'> }[] |
optional |
Default sort order for related list views within this form |
| sharing |
{ enabled?: boolean; publicLink?: string; password?: string; allowedDomains?: string[]; … } |
optional |
Public sharing configuration for this form |
| submitBehavior |
{ kind: 'thank-you'; title?: string; message?: string } | { kind: 'redirect'; url: string; delayMs?: integer } | { kind: 'continue' } | { kind: 'next-record' } |
optional |
Post-submit behavior |
| buttons |
{ submit?: object; cancel?: object; reset?: object } |
optional |
[EXPERIMENTAL — NOT ENFORCED, #2998] Form action-button visibility & labels. Renderer wiring pending in ObjectUI (objectui#2545). |
| defaults |
Record<string, any> |
optional |
[EXPERIMENTAL — NOT ENFORCED, #2998] Initial field values for create-mode forms (spec home for ObjectUI initialValues). Renderer wiring pending (objectui#2545). |
| aria |
{ ariaLabel?: string; ariaDescribedBy?: string; role?: string } |
optional |
ARIA accessibility attributes for the form view |
Gallery/card view configuration
| Property |
Type |
Required |
Description |
| coverField |
string |
optional |
Attachment/image field to display as card cover |
| coverFit |
Enum<'cover' | 'contain'> |
✅ |
Image fit mode for card cover |
| cardSize |
Enum<'small' | 'medium' | 'large'> |
✅ |
Card size in gallery view |
| titleField |
string |
optional |
Field to display as card title |
| visibleFields |
string[] |
optional |
Fields to display on card body |
| Property |
Type |
Required |
Description |
| startDateField |
string |
✅ |
Field providing the task start date |
| endDateField |
string |
✅ |
Field providing the task end date |
| titleField |
string |
✅ |
Field displayed as the task title |
| progressField |
string |
optional |
Field providing the task completion percentage |
| dependenciesField |
string |
optional |
Field listing the task's predecessor (dependency) record ids |
| colorField |
string |
optional |
Field that drives the bar color |
| parentField |
string |
optional |
Field holding the parent task id (builds the summary → step tree) |
| typeField |
string |
optional |
Field whose value maps to task/summary/milestone |
| baselineStartField |
string |
optional |
Baseline (planned) start field |
| baselineEndField |
string |
optional |
Baseline (planned) end field |
| groupByField |
string |
optional |
Field to group leaf tasks by (synthesized summary rows) |
| resourceView |
boolean |
optional |
Render a per-resource workload histogram instead of the timeline |
| assigneeField |
string |
optional |
Resource field to bucket load by (resource view) |
| effortField |
string |
optional |
Per-task load units (resource view; default 1) |
| capacity |
number |
optional |
Per-resource capacity ceiling; loads above this flag overload |
| tooltipFields |
string | { field: string; label?: string }[] |
optional |
Fields to surface in the hover tooltip, in display order |
| quickFilters |
{ field: string; label?: string; options?: string | { value: string | number; label?: string }[] }[] |
optional |
Multi-select filter dropdowns rendered above the chart |
| autoZoomToFilter |
boolean |
optional |
When true (default), filtering zooms the range to the filtered tasks |
| Property |
Type |
Required |
Description |
| field |
string |
✅ |
Record field / dot-path the dimension filters on |
| label |
string |
optional |
Trigger label (falls back to the field label) |
| options |
string | { value: string | number; label?: string }[] |
optional |
Explicit option override for fixed enums |
Record grouping configuration
| Property |
Type |
Required |
Description |
| fields |
{ field: string; order: Enum<'asc' | 'desc'>; collapsed: boolean }[] |
✅ |
Fields to group by (supports up to 3 levels) |
| Property |
Type |
Required |
Description |
| field |
string |
✅ |
Field name to group by |
| order |
Enum<'asc' | 'desc'> |
✅ |
Group sort order |
| collapsed |
boolean |
✅ |
Collapse groups by default |
| Property |
Type |
Required |
Description |
| groupByField |
string |
✅ |
Field to group columns by (usually status/select) |
| summarizeField |
string |
optional |
Field to sum at top of column (e.g. amount) |
| columns |
string[] |
✅ |
Fields to show on cards |
List chart view configuration
| Property |
Type |
Required |
Description |
| chartType |
Enum<'bar' | 'line' | 'pie' | 'area' | 'scatter'> |
✅ |
Chart visualisation type |
| dataset |
string |
✅ |
Dataset name to bind (ADR-0021) |
| dimensions |
string[] |
optional |
Dimension names — X/group/split |
| values |
string[] |
✅ |
Measure names — Y (at least one) |
| Property |
Type |
Required |
Description |
| field |
string |
✅ |
Field name (snake_case) |
| label |
string |
optional |
Display label override |
| width |
number |
optional |
Column width in pixels |
| align |
Enum<'left' | 'center' | 'right'> |
optional |
Text alignment |
| hidden |
boolean |
optional |
Hide column by default |
| sortable |
boolean |
optional |
Allow sorting by this column |
| resizable |
boolean |
optional |
Allow resizing this column |
| wrap |
boolean |
optional |
Allow text wrapping |
| type |
string |
optional |
Renderer type override (e.g., "currency", "date") |
| pinned |
Enum<'left' | 'right'> |
optional |
Pin/freeze column to left or right side |
| summary |
Enum<'none' | 'count' | 'count_empty' | 'count_filled' | 'count_unique' | 'percent_empty' | 'percent_filled' | 'sum' | 'avg' | 'min' | 'max'> |
optional |
Footer aggregation function for this column |
| link |
boolean |
optional |
Functions as the primary navigation link (triggers View navigation) |
| action |
string |
optional |
Registered Action ID to execute when clicked |
| Property |
Type |
Required |
Description |
| name |
string |
optional |
Internal view name (lowercase snake_case) |
| label |
string |
optional |
Display label (plain string; i18n keys are auto-generated by the framework) |
| type |
Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'> |
optional |
|
| data |
{ provider: 'object'; object: string } | { provider: 'api'; read?: object; write?: object } | { provider: 'value'; items: any[] } | { provider: 'schema'; schemaId: string; schema?: Record<string, any> } |
optional |
Data source configuration (defaults to "object" provider) |
| columns |
string[] | { field: string; label?: string; width?: number; align?: Enum<'left' | 'center' | 'right'>; … }[] |
✅ |
Fields to display as columns |
| filter |
{ field: string; operator?: Enum<'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'greater_than' | 'less_than' | 'greater_than_or_equal' | 'less_than_or_equal' | 'in' | 'not_in' | 'is_empty' | 'is_not_empty' | 'is_null' | 'is_not_null' | 'before' | 'after' | 'between'>; value?: string | number | boolean | null | string | number[] }[] |
optional |
Filter criteria (JSON Rules) |
| sort |
string | { field: string; order: Enum<'asc' | 'desc'> }[] |
optional |
|
| searchableFields |
string[] |
optional |
Fields enabled for search |
| filterableFields |
string[] |
optional |
Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
| userFilters |
{ element?: Enum<'dropdown' | 'tabs' | 'toggle'>; fields?: { field: string; label?: string; type?: Enum<'select' | 'multi-select' | 'boolean' | 'date-range' | 'text'>; options?: { value: string | number | boolean; label: string; color?: string }[]; … }[]; tabs?: { name: string; label?: string; icon?: string; view?: string; … }[]; showAllRecords?: boolean } |
optional |
End-user quick-filter bar: dropdown/toggle fields or tab presets. Omit to let the renderer derive filters from select/boolean fields |
| resizable |
boolean |
optional |
Enable column resizing |
| striped |
boolean |
optional |
Striped row styling |
| bordered |
boolean |
optional |
Show borders |
| compactToolbar |
boolean |
optional |
Collapse Group/Color/Density/Hide-fields into a single View settings popover |
| selection |
{ type?: Enum<'none' | 'single' | 'multiple'> } |
optional |
Row selection configuration |
| navigation |
{ mode?: Enum<'page' | 'drawer' | 'modal' | 'split' | 'popover' | 'new_window' | 'none'>; view?: string; preventNavigation?: boolean; openNewTab?: boolean; … } |
optional |
Configuration for item click navigation (page, drawer, modal, etc.) |
| pagination |
{ pageSize?: integer; pageSizeOptions?: integer[] } |
optional |
Pagination configuration |
| kanban |
{ groupByField: string; summarizeField?: string; columns: string[] } |
optional |
Kanban-board configuration — applies when the view renders as a kanban layout |
| calendar |
{ startDateField: string; endDateField?: string; titleField: string; colorField?: string } |
optional |
Calendar configuration — applies when the view renders as a calendar layout |
| gantt |
Record<string, any> |
optional |
Gantt-timeline configuration — applies when the view renders as a gantt layout |
| gallery |
{ coverField?: string; coverFit?: Enum<'cover' | 'contain'>; cardSize?: Enum<'small' | 'medium' | 'large'>; titleField?: string; … } |
optional |
Gallery/card view configuration |
| timeline |
{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … } |
optional |
Timeline view configuration |
| chart |
{ chartType?: Enum<'bar' | 'line' | 'pie' | 'area' | 'scatter'>; dataset: string; dimensions?: string[]; values: string[] } |
optional |
List chart view configuration |
| tree |
Record<string, any> |
optional |
Tree/hierarchy configuration — applies when the view renders as a tree layout |
| description |
string |
optional |
View description for documentation/tooltips |
| sharing |
{ type?: Enum<'personal' | 'collaborative'>; lockedBy?: string } |
optional |
View sharing and access configuration |
| rowHeight |
Enum<'compact' | 'short' | 'medium' | 'tall' | 'extra_tall'> |
optional |
Row height / density setting |
| grouping |
{ fields: { field: string; order?: Enum<'asc' | 'desc'>; collapsed?: boolean }[] } |
optional |
Group records by one or more fields |
| rowColor |
{ field: string; colors?: Record<string, string> } |
optional |
Color rows based on field value |
| hiddenFields |
string[] |
optional |
Fields to hide in this specific view |
| fieldOrder |
string[] |
optional |
Explicit field display order for this view |
| rowActions |
string[] |
optional |
Actions available for individual row items |
| bulkActions |
string[] |
optional |
Actions available when multiple rows are selected |
| bulkActionDefs |
Record<string, any>[] |
optional |
Rich bulk action definitions (schema-driven, executed via BulkActionDialog) |
| virtualScroll |
boolean |
optional |
Enable virtual scrolling for large datasets |
| conditionalFormatting |
{ condition: string | { dialect: Enum<'cel' | 'cron' | 'template'>; source?: string; ast?: any; meta?: object }; style: Record<string, string> }[] |
optional |
Conditional formatting rules for list rows |
| inlineEdit |
boolean |
optional |
Allow inline editing of records directly in the list view |
| exportOptions |
Enum<'csv' | 'xlsx' | 'pdf' | 'json'>[] |
optional |
Available export format options |
| userActions |
{ sort?: boolean; search?: boolean; filter?: boolean; refresh?: boolean; … } |
optional |
User action toggles for the view toolbar |
| appearance |
{ showDescription?: boolean; allowedVisualizations?: Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'>[] } |
optional |
Appearance and visualization configuration |
| tabs |
{ name: string; label?: string; icon?: string; view?: string; … }[] |
optional |
Tab definitions for multi-tab view interface |
| addRecord |
{ enabled?: boolean; position?: Enum<'top' | 'bottom' | 'both'>; mode?: Enum<'inline' | 'form' | 'modal'>; formView?: string } |
optional |
Add record entry point configuration |
| showRecordCount |
boolean |
optional |
Show record count at the bottom of the list |
| allowPrinting |
boolean |
optional |
Allow users to print the view |
| emptyState |
{ title?: string; message?: string; icon?: string } |
optional |
Empty state configuration when no records found |
| aria |
{ ariaLabel?: string; ariaDescribedBy?: string; role?: string } |
optional |
ARIA accessibility attributes for the list view |
| responsive |
{ breakpoint?: Enum<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>; hiddenOn?: Enum<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>[]; columns?: object; order?: object } |
optional |
Responsive layout configuration |
| performance |
{ lazyLoad?: boolean; virtualScroll?: object; cacheStrategy?: Enum<'none' | 'cache-first' | 'network-first' | 'stale-while-revalidate'>; prefetch?: boolean; … } |
optional |
Performance optimization settings |
| Property |
Type |
Required |
Description |
| mode |
Enum<'page' | 'drawer' | 'modal' | 'split' | 'popover' | 'new_window' | 'none'> |
✅ |
|
| view |
string |
optional |
Name of the form view to use for details (e.g. "summary_view", "edit_form") |
| preventNavigation |
boolean |
✅ |
Disable standard navigation entirely |
| openNewTab |
boolean |
✅ |
Force open in new tab (applies to page mode) |
| size |
Enum<'auto' | 'sm' | 'md' | 'lg' | 'xl' | 'full'> |
✅ |
[#2578] Overlay size bucket for drawer/modal detail: 'auto' (default — renderer derives from field count + viewport; AI writes nothing) or a coarse override sm/md/lg/xl/full. Prefer this over the pixel width; page mode ignores it. |
| width |
string | number |
optional |
[DEPRECATED → size] Pixel/percent width of the drawer/modal (e.g. "600px"). A pixel width cannot be chosen at authoring time without knowing the client viewport — use the size bucket. |
page
drawer
modal
split
popover
new_window
none
| Property |
Type |
Required |
Description |
| name |
string |
optional |
Internal view name (lowercase snake_case) |
| label |
string |
optional |
Display label (plain string; i18n keys are auto-generated by the framework) |
| type |
Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'> |
optional |
|
| data |
{ provider: 'object'; object: string } | { provider: 'api'; read?: object; write?: object } | { provider: 'value'; items: any[] } | { provider: 'schema'; schemaId: string; schema?: Record<string, any> } |
optional |
Data source configuration (defaults to "object" provider) |
| columns |
string[] | { field: string; label?: string; width?: number; align?: Enum<'left' | 'center' | 'right'>; … }[] |
✅ |
Fields to display as columns |
| filter |
{ field: string; operator?: Enum<'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'greater_than' | 'less_than' | 'greater_than_or_equal' | 'less_than_or_equal' | 'in' | 'not_in' | 'is_empty' | 'is_not_empty' | 'is_null' | 'is_not_null' | 'before' | 'after' | 'between'>; value?: string | number | boolean | null | string | number[] }[] |
optional |
Filter criteria (JSON Rules) |
| sort |
string | { field: string; order: Enum<'asc' | 'desc'> }[] |
optional |
|
| searchableFields |
string[] |
optional |
Fields enabled for search |
| filterableFields |
string[] |
optional |
Legacy shorthand for userFilters.fields — bare field names enabled for end-user filtering. Prefer userFilters |
| resizable |
boolean |
optional |
Enable column resizing |
| striped |
boolean |
optional |
Striped row styling |
| bordered |
boolean |
optional |
Show borders |
| compactToolbar |
boolean |
optional |
Collapse Group/Color/Density/Hide-fields into a single View settings popover |
| selection |
{ type?: Enum<'none' | 'single' | 'multiple'> } |
optional |
Row selection configuration |
| navigation |
{ mode?: Enum<'page' | 'drawer' | 'modal' | 'split' | 'popover' | 'new_window' | 'none'>; view?: string; preventNavigation?: boolean; openNewTab?: boolean; … } |
optional |
Configuration for item click navigation (page, drawer, modal, etc.) |
| pagination |
{ pageSize?: integer; pageSizeOptions?: integer[] } |
optional |
Pagination configuration |
| kanban |
{ groupByField: string; summarizeField?: string; columns: string[] } |
optional |
Kanban-board configuration — applies when the view renders as a kanban layout |
| calendar |
{ startDateField: string; endDateField?: string; titleField: string; colorField?: string } |
optional |
Calendar configuration — applies when the view renders as a calendar layout |
| gantt |
Record<string, any> |
optional |
Gantt-timeline configuration — applies when the view renders as a gantt layout |
| gallery |
{ coverField?: string; coverFit?: Enum<'cover' | 'contain'>; cardSize?: Enum<'small' | 'medium' | 'large'>; titleField?: string; … } |
optional |
Gallery/card view configuration |
| timeline |
{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … } |
optional |
Timeline view configuration |
| chart |
{ chartType?: Enum<'bar' | 'line' | 'pie' | 'area' | 'scatter'>; dataset: string; dimensions?: string[]; values: string[] } |
optional |
List chart view configuration |
| tree |
Record<string, any> |
optional |
Tree/hierarchy configuration — applies when the view renders as a tree layout |
| description |
string |
optional |
View description for documentation/tooltips |
| sharing |
{ type?: Enum<'personal' | 'collaborative'>; lockedBy?: string } |
optional |
View sharing and access configuration |
| rowHeight |
Enum<'compact' | 'short' | 'medium' | 'tall' | 'extra_tall'> |
optional |
Row height / density setting |
| grouping |
{ fields: { field: string; order?: Enum<'asc' | 'desc'>; collapsed?: boolean }[] } |
optional |
Group records by one or more fields |
| rowColor |
{ field: string; colors?: Record<string, string> } |
optional |
Color rows based on field value |
| hiddenFields |
string[] |
optional |
Fields to hide in this specific view |
| fieldOrder |
string[] |
optional |
Explicit field display order for this view |
| rowActions |
string[] |
optional |
Actions available for individual row items |
| bulkActions |
string[] |
optional |
Actions available when multiple rows are selected |
| bulkActionDefs |
Record<string, any>[] |
optional |
Rich bulk action definitions (schema-driven, executed via BulkActionDialog) |
| virtualScroll |
boolean |
optional |
Enable virtual scrolling for large datasets |
| conditionalFormatting |
{ condition: string | { dialect: Enum<'cel' | 'cron' | 'template'>; source?: string; ast?: any; meta?: object }; style: Record<string, string> }[] |
optional |
Conditional formatting rules for list rows |
| inlineEdit |
boolean |
optional |
Allow inline editing of records directly in the list view |
| exportOptions |
Enum<'csv' | 'xlsx' | 'pdf' | 'json'>[] |
optional |
Available export format options |
| userActions |
{ sort?: boolean; search?: boolean; filter?: boolean; refresh?: boolean; … } |
optional |
User action toggles for the view toolbar |
| appearance |
{ showDescription?: boolean; allowedVisualizations?: Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'>[] } |
optional |
Appearance and visualization configuration |
| tabs |
{ name: string; label?: string; icon?: string; view?: string; … }[] |
optional |
Tab definitions for multi-tab view interface |
| addRecord |
{ enabled?: boolean; position?: Enum<'top' | 'bottom' | 'both'>; mode?: Enum<'inline' | 'form' | 'modal'>; formView?: string } |
optional |
Add record entry point configuration |
| showRecordCount |
boolean |
optional |
Show record count at the bottom of the list |
| allowPrinting |
boolean |
optional |
Allow users to print the view |
| emptyState |
{ title?: string; message?: string; icon?: string } |
optional |
Empty state configuration when no records found |
| aria |
{ ariaLabel?: string; ariaDescribedBy?: string; role?: string } |
optional |
ARIA accessibility attributes for the list view |
| responsive |
{ breakpoint?: Enum<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>; hiddenOn?: Enum<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>[]; columns?: object; order?: object } |
optional |
Responsive layout configuration |
| performance |
{ lazyLoad?: boolean; virtualScroll?: object; cacheStrategy?: Enum<'none' | 'cache-first' | 'network-first' | 'stale-while-revalidate'>; prefetch?: boolean; … } |
optional |
Performance optimization settings |
| userFilters |
{ element?: Enum<'dropdown' | 'toggle'>; fields?: { field: string; label?: string; type?: Enum<'select' | 'multi-select' | 'boolean' | 'date-range' | 'text'>; options?: { value: string | number | boolean; label: string; color?: string }[]; … }[] } |
optional |
|
| Property |
Type |
Required |
Description |
| element |
Enum<'dropdown' | 'toggle'> |
✅ |
Filter control style on object views: "dropdown" (per-field value chips). "toggle" is deprecated. "tabs" is page-only — use listViews for named presets. |
| fields |
{ field: string; label?: string; type?: Enum<'select' | 'multi-select' | 'boolean' | 'date-range' | 'text'>; options?: { value: string | number | boolean; label: string; color?: string }[]; … }[] |
optional |
Fields exposed as quick filters (dropdown/toggle elements) |
PaginationConfig
| Property |
Type |
Required |
Description |
| pageSize |
integer |
✅ |
Number of records per page |
| pageSizeOptions |
integer[] |
optional |
Available page size options |
Row color configuration based on field values
| Property |
Type |
Required |
Description |
| field |
string |
✅ |
Field to derive color from (typically a select/status field) |
| colors |
Record<string, string> |
optional |
Map of field value to color (hex/token) |
Row height / density setting for list view
compact
short
medium
tall
extra_tall
| Property |
Type |
Required |
Description |
| type |
Enum<'none' | 'single' | 'multiple'> |
✅ |
Selection mode |
Timeline view configuration
| Property |
Type |
Required |
Description |
| startDateField |
string |
✅ |
Field for timeline item start date |
| endDateField |
string |
optional |
Field for timeline item end date |
| titleField |
string |
✅ |
Field to display as timeline item title |
| groupByField |
string |
optional |
Field to group timeline rows |
| colorField |
string |
optional |
Field to determine item color |
| scale |
Enum<'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year'> |
✅ |
Default timeline scale |
| Property |
Type |
Required |
Description |
| parentField |
string |
optional |
Single-parent pointer field (auto-detected from the object schema when omitted) |
| labelField |
string |
optional |
Field rendered indented in the first column (defaults to "name") |
| fields |
string[] |
optional |
Additional fields rendered as flat columns alongside the label |
| defaultExpandedDepth |
integer |
optional |
Initial expansion depth (0 = roots only; omit = expand all) |
User action toggles for the view toolbar
| Property |
Type |
Required |
Description |
| sort |
boolean |
✅ |
Allow users to sort records |
| search |
boolean |
✅ |
Allow users to search records |
| filter |
boolean |
✅ |
Allow users to filter records |
| refresh |
boolean |
✅ |
Allow users to reload the view data from the backend without a full page reload |
| rowHeight |
boolean |
✅ |
Allow users to toggle row height/density |
| addRecordForm |
boolean |
✅ |
Add records through a form instead of inline |
| editInline |
boolean |
✅ |
Allow users to edit records inline — click a cell to edit it with the field's type-aware widget (the same control the form uses). Off by default: the list is read-only unless the author opts in. |
| buttons |
string[] |
optional |
Custom action button IDs to show in the toolbar |
Quick-filter field configuration
| Property |
Type |
Required |
Description |
| field |
string |
✅ |
Field name on the source object (must exist — checked by reference diagnostics) |
| label |
string |
optional |
Display label override (defaults to the field label) |
| type |
Enum<'select' | 'multi-select' | 'boolean' | 'date-range' | 'text'> |
optional |
Filter control type. Omit to infer from the field definition |
| options |
{ value: string | number | boolean; label: string; color?: string }[] |
optional |
Static options. Omit to derive from the field definition (select options / lookup records) |
| showCount |
boolean |
optional |
Show per-option record counts |
| defaultValues |
string | number | boolean[] |
optional |
Pre-selected values when the view loads |
End-user quick-filter configuration (Airtable "User filters" parity)
| Property |
Type |
Required |
Description |
| element |
Enum<'dropdown' | 'tabs' | 'toggle'> |
✅ |
Filter control style: "dropdown" (per-field value selectors) or "tabs" (named presets). "toggle" is deprecated. |
| fields |
{ field: string; label?: string; type?: Enum<'select' | 'multi-select' | 'boolean' | 'date-range' | 'text'>; options?: { value: string | number | boolean; label: string; color?: string }[]; … }[] |
optional |
Fields exposed as quick filters (dropdown/toggle elements) |
| tabs |
{ name: string; label?: string; icon?: string; view?: string; … }[] |
optional |
Named filter presets rendered as tabs (tabs element). Reuses ViewTabSchema |
| showAllRecords |
boolean |
optional |
Show an "All records" tab before the presets (tabs element) |
| Property |
Type |
Required |
Description |
| list |
{ name?: string; label?: string; type?: Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'>; data?: { provider: 'object'; object: string } | { provider: 'api'; read?: object; write?: object } | { provider: 'value'; items: any[] } | { provider: 'schema'; schemaId: string; schema?: Record<string, any> }; … } |
optional |
|
| form |
{ type?: Enum<'simple' | 'tabbed' | 'wizard' | 'split' | 'drawer' | 'modal'>; layout?: Enum<'vertical' | 'horizontal' | 'inline' | 'grid'>; columns?: integer; title?: string; … } |
optional |
|
| listViews |
Record<string, { name?: string; label?: string; type?: Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'>; data?: { provider: 'object'; object: string } | { provider: 'api'; read?: object; write?: object } | { provider: 'value'; items: any[] } | { provider: 'schema'; schemaId: string; schema?: Record<string, any> }; … }> |
optional |
Additional named list views (views mode — dropdown userFilters allowed, no tabs; ADR-0047) |
| formViews |
Record<string, { type?: Enum<'simple' | 'tabbed' | 'wizard' | 'split' | 'drawer' | 'modal'>; layout?: Enum<'vertical' | 'horizontal' | 'inline' | 'grid'>; columns?: integer; title?: string; … }> |
optional |
Additional named form views |
| protection |
{ lock: Enum<'none' | 'no-overlay' | 'no-delete' | 'full'>; reason: string; docsUrl?: string } |
optional |
Package author protection block — lock policy for this view. |
| _lock |
Enum<'none' | 'no-overlay' | 'no-delete' | 'full'> |
optional |
Item-level lock — controls overlay & delete (ADR-0010). |
| _lockReason |
string |
optional |
Human-readable reason shown when a write is refused by _lock. |
| _lockSource |
Enum<'artifact' | 'package' | 'env-forced'> |
optional |
Layer that set _lock (artifact | package | env-forced). |
| _provenance |
Enum<'package' | 'org' | 'env-forced'> |
optional |
Origin of the item (package | org | env-forced). |
| _packageId |
string |
optional |
Owning package machine id. |
| _packageVersion |
string |
optional |
Owning package version. |
| _lockDocsUrl |
string |
optional |
Optional documentation link surfaced next to _lockReason. |
This schema accepts one of the following structures:
| Property |
Type |
Required |
Description |
| provider |
'object' |
✅ |
|
| object |
string |
✅ |
Target object name |
| Property |
Type |
Required |
Description |
| provider |
'api' |
✅ |
|
| read |
{ url: string; method: Enum<'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'>; headers?: Record<string, string>; params?: Record<string, any>; … } |
optional |
Configuration for fetching data |
| write |
{ url: string; method: Enum<'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'>; headers?: Record<string, string>; params?: Record<string, any>; … } |
optional |
Configuration for submitting data (for forms/editable tables) |
| Property |
Type |
Required |
Description |
| provider |
'value' |
✅ |
|
| items |
any[] |
✅ |
Static data array |
| Property |
Type |
Required |
Description |
| provider |
'schema' |
✅ |
|
| schemaId |
string |
✅ |
Schema identifier — typically the metadata type name |
| schema |
Record<string, any> |
optional |
Inline JSON Schema (Draft 2020-12). Optional when schemaId is resolvable. |
View filter rule
| Property |
Type |
Required |
Description |
| field |
string |
✅ |
Field name to filter on |
| operator |
Enum<'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'greater_than' | 'less_than' | 'greater_than_or_equal' | 'less_than_or_equal' | 'in' | 'not_in' | 'is_empty' | 'is_not_empty' | 'is_null' | 'is_not_null' | 'before' | 'after' | 'between'> |
✅ |
Filter operator |
| value |
string | number | boolean | null | string | number[] |
optional |
Filter value |
This schema accepts one of the following structures:
| Property |
Type |
Required |
Description |
| viewKind |
'list' |
✅ |
|
| config |
{ name?: string; label?: string; type?: Enum<'grid' | 'kanban' | 'gallery' | 'calendar' | 'timeline' | 'gantt' | 'map' | 'chart' | 'tree'>; data?: { provider: 'object'; object: string } | { provider: 'api'; read?: object; write?: object } | { provider: 'value'; items: any[] } | { provider: 'schema'; schemaId: string; schema?: Record<string, any> }; … } |
✅ |
List-family view configuration. |
| name |
string |
✅ |
Globally-unique view id, <object>.<viewKey>. |
| object |
string |
✅ |
Bound object name — the foreign key used to aggregate views. |
| label |
string |
optional |
Display label (supports i18n). |
| isDefault |
boolean |
optional |
Whether this is the object's default view in the switcher. |
| order |
integer |
optional |
Sort order within the object's view switcher / left rail. |
| scope |
Enum<'package' | 'shared' | 'personal'> |
optional |
Identity layer (defaults to package for source-loaded views). |
| owner |
string |
optional |
Owner user id — set when scope is personal. |
| hidden |
boolean |
optional |
Hidden from the switcher (per-user / per-org declutter). |
| protection |
{ lock: Enum<'none' | 'no-overlay' | 'no-delete' | 'full'>; reason: string; docsUrl?: string } |
optional |
Package author protection block — lock policy for this view. |
| _lock |
Enum<'none' | 'no-overlay' | 'no-delete' | 'full'> |
optional |
Item-level lock — controls overlay & delete (ADR-0010). |
| _lockReason |
string |
optional |
Human-readable reason shown when a write is refused by _lock. |
| _lockSource |
Enum<'artifact' | 'package' | 'env-forced'> |
optional |
Layer that set _lock (artifact | package | env-forced). |
| _provenance |
Enum<'package' | 'org' | 'env-forced'> |
optional |
Origin of the item (package | org | env-forced). |
| _packageId |
string |
optional |
Owning package machine id. |
| _packageVersion |
string |
optional |
Owning package version. |
| _lockDocsUrl |
string |
optional |
Optional documentation link surfaced next to _lockReason. |
| Property |
Type |
Required |
Description |
| viewKind |
'form' |
✅ |
|
| config |
{ type?: Enum<'simple' | 'tabbed' | 'wizard' | 'split' | 'drawer' | 'modal'>; layout?: Enum<'vertical' | 'horizontal' | 'inline' | 'grid'>; columns?: integer; title?: string; … } |
✅ |
Form view configuration. |
| name |
string |
✅ |
Globally-unique view id, <object>.<viewKey>. |
| object |
string |
✅ |
Bound object name — the foreign key used to aggregate views. |
| label |
string |
optional |
Display label (supports i18n). |
| isDefault |
boolean |
optional |
Whether this is the object's default view in the switcher. |
| order |
integer |
optional |
Sort order within the object's view switcher / left rail. |
| scope |
Enum<'package' | 'shared' | 'personal'> |
optional |
Identity layer (defaults to package for source-loaded views). |
| owner |
string |
optional |
Owner user id — set when scope is personal. |
| hidden |
boolean |
optional |
Hidden from the switcher (per-user / per-org declutter). |
| protection |
{ lock: Enum<'none' | 'no-overlay' | 'no-delete' | 'full'>; reason: string; docsUrl?: string } |
optional |
Package author protection block — lock policy for this view. |
| _lock |
Enum<'none' | 'no-overlay' | 'no-delete' | 'full'> |
optional |
Item-level lock — controls overlay & delete (ADR-0010). |
| _lockReason |
string |
optional |
Human-readable reason shown when a write is refused by _lock. |
| _lockSource |
Enum<'artifact' | 'package' | 'env-forced'> |
optional |
Layer that set _lock (artifact | package | env-forced). |
| _provenance |
Enum<'package' | 'org' | 'env-forced'> |
optional |
Origin of the item (package | org | env-forced). |
| _packageId |
string |
optional |
Owning package machine id. |
| _packageVersion |
string |
optional |
Owning package version. |
| _lockDocsUrl |
string |
optional |
Optional documentation link surfaced next to _lockReason. |
Whether config is a ListView (list family) or a FormView.
View identity layer: package | shared | personal.
View sharing and access configuration
| Property |
Type |
Required |
Description |
| type |
Enum<'personal' | 'collaborative'> |
✅ |
View ownership type |
| lockedBy |
string |
optional |
User who locked the view configuration |
Tab configuration for multi-tab view interface
| Property |
Type |
Required |
Description |
| name |
string |
✅ |
Tab identifier (snake_case) |
| label |
string |
optional |
Display label |
| icon |
string |
optional |
Tab icon name |
| view |
string |
optional |
Referenced list view name from listViews |
| filter |
{ field: string; operator: Enum<'equals' | 'not_equals' | 'contains' | 'not_contains' | 'starts_with' | 'ends_with' | 'greater_than' | 'less_than' | 'greater_than_or_equal' | 'less_than_or_equal' | 'in' | 'not_in' | 'is_empty' | 'is_not_empty' | 'is_null' | 'is_not_null' | 'before' | 'after' | 'between'>; value?: string | number | boolean | null | string | number[] }[] |
optional |
Tab-specific filter criteria |
| order |
integer |
optional |
Tab display order |
| pinned |
boolean |
✅ |
Pin tab (cannot be removed by users) |
| isDefault |
boolean |
✅ |
Set as the default active tab |
| visible |
boolean |
✅ |
Tab visibility |
Visualization type that users can switch to
grid
kanban
gallery
calendar
timeline
gantt
map
chart
tree