App block and action reference
Source-generated reference for every Grid 0.65.0 App Builder block, prop, binding, condition, action, and capability boundary.
App block and action reference
This is the exhaustive App Builder contract for Grid 0.65.0. It is generated from Grid's TypeScript catalog, inspector action schema, framework metadata, responsive CSS, and model-binding ABI. Do not edit this page or its companion JSON by hand. Run node scripts/generate-app-block-reference.mjs after changing the source contract.
For a task-oriented explanation, start with Build Grid apps. For a complete build, follow Build your first Grid app.
Coverage and provenance
| Family | Blocks |
|---|---|
| Layout | 12 |
| Display | 11 |
| Navigation | 4 |
| Input | 11 |
| Data | 5 |
The catalog contains 43 blocks, including 15 containers. The generator fails if the Button action catalog, inspector action-property map, and normalized action semantics stop agreeing.
| Grid source | SHA-256 prefix |
|---|---|
web/frontend/src/components/workbookSurfaces/appDocument.ts |
fe18025d8fa2e557 |
web/frontend/src/components/workbookSurfaces/appFramework.ts |
3aa0e51062e1de97 |
web/frontend/src/components/workbookSurfaces/AppNodeInspector.tsx |
f9776d615f7c9c0b |
web/frontend/src/components/workbookSurfaces/AppNodeRenderer.tsx |
9f51965497178808 |
web/frontend/src/styles.css |
ff8d0d16c8b36fea |
web/shared/modelBindingAbi.ts |
481a9ff02380d365 |
The full normalized fixture is committed at content/docs/build/app-block-contract.generated.json. Hashes cover source contents, not local paths or generation time, so repeated generation is deterministic.
How bindings become capabilities
Bindings declare symbol access; published packages translate that access into reviewable capabilities. Row-scope references such as @item.id resolve inside a Repeater and do not enter the global read/write allowlist.
| Binding direction | Meaning | Published capability request |
|---|---|---|
read |
Read one model symbol. | model.read |
write |
Write one allowlisted model symbol. | model.read + model.write |
readwrite |
Read and write the same model symbol. | model.read + model.write |
range |
Read a row/range source. | model.read |
Grid's App packaging path requests model.read whenever the document declares a read or a write, then adds model.write when it declares a write. The ABI still gates individual write verbs with model.write; the per-symbol bindings.writes allowlist is a separate enforcement boundary.
| ABI method | Kind | Required capability | Mutates | Symbol allowlist |
|---|---|---|---|---|
grid.capabilities |
handshake | None in ABI v1 | No | No |
model.manifest |
read | model.read |
No | No |
model.range |
read | model.read |
No | No |
model.symbols |
read | model.read |
No | No |
model.subscribe |
read | model.read |
No | No |
model.unsubscribe |
read | model.read |
No | No |
model.setInput |
write | model.write |
Yes | Yes |
model.setBatchInput |
write | model.write |
Yes | Yes |
model.setFormula |
write | model.write |
Yes | Yes |
app.location |
route | None in ABI v1 | No | No |
app.setPath |
route | None in ABI v1 | Yes | No |
job.run |
job | job.run |
Yes | No |
connector.call |
connector | connector.call |
Yes | No |
app.enterDevMode |
lifecycle | None in ABI v1 | No | No |
app.exitDevMode |
lifecycle | None in ABI v1 | No | No |
app.unload |
lifecycle | None in ABI v1 | No | No |
app.route is declared and reviewed for navigation. In ABI v1, app.location and app.setPath remain ungated for compatibility, while package metadata still requests app.route when an App action navigates.
Shared props on every block
Conditions
| Prop | Label | Type | Guidance |
|---|---|---|---|
visibleWhen |
Visible when | condition |
e.g. "Flag is true", "Qty > 0", or "Status == done". |
disabledWhen |
Disabled when | condition |
Same syntax; disables inputs/buttons in the subtree. |
Supported condition operators are ==, !=, >, >=, <, <=, isTrue, isFalse, isEmpty, isSet. Author-facing forms are SYMBOL is true, is false, is empty, is set, or SYMBOL ==|!=|>|>=|<|<= OPERAND. Quoted operands are accepted. A valid condition reads its symbol and therefore contributes model.read; disabledWhen disables the node or subtree, while visibleWhen removes it from display when false.
Responsive visibility
| Prop | Label | Type | Default |
|---|---|---|---|
hideOnMobile |
Hide on mobile | boolean |
false |
hideOnTablet |
Hide on tablet | boolean |
false |
hideOnDesktop |
Hide on desktop | boolean |
false |
The breakpoint bands are mobile at 640 px or below, tablet from 641–1024 px, and desktop at 1025 px or above. These props are presentational and do not affect binding or capability review.
Button actions
All Button actions use label, action, validation, and feedbackMessage. The table lists those common props plus the action-specific props active in the inspector. When validation fails, any action writes a non-empty feedback message to a bound feedback slot. Successful set, increment, decrement, formula, append-row, validate, job, and connector actions also write it; a successful route action does not. Binding feedback is still a declared write for every action and therefore adds the model read/write capability pair.
| Action | Target binding | Active inspector props | Effect | Capability conditions |
|---|---|---|---|---|
set |
Required | label, action, validation, feedbackMessage, value, successRoute |
Write value to the target symbol. |
model.read + model.write when target is bound; app.route when successRoute is set |
increment |
Required | label, action, validation, feedbackMessage, value, successRoute |
Read the target, add value, and write the result. |
model.read + model.write when target is bound; app.route when successRoute is set |
decrement |
Required | label, action, validation, feedbackMessage, value, successRoute |
Read the target, subtract value, and write the result. |
model.read + model.write when target is bound; app.route when successRoute is set |
formula |
Required | label, action, validation, feedbackMessage, formula, successRoute |
Set the target formula from formula. |
model.read + model.write when target is bound; app.route when successRoute is set |
appendRow |
Required range | label, action, validation, feedbackMessage, row, successRoute |
Append the parsed row fields to the target row source. |
model.read + model.write when target is bound; app.route when successRoute is set |
validate |
Not used | label, action, validation, feedbackMessage, successRoute |
Evaluate validation; continue to feedback or successRoute only when it passes. |
model.read when validation reads a model symbol; model.read + model.write when feedback is bound; app.route when successRoute is set |
route |
Only with writeValue | label, action, validation, feedbackMessage, value, writeValue |
Optionally write writeValue to target, then navigate to the path in value. |
app.route; model.read + model.write when target and writeValue are set; model.read + model.write when feedback is bound; model.read when validation reads a model symbol |
runJob |
Not used | label, action, validation, feedbackMessage, jobName, successRoute |
Run jobName after validation passes; normal inspector authoring sends an empty payload. |
job.run; model.read when validation reads a model symbol; model.read + model.write when feedback is bound; app.route when successRoute is set |
callConnector |
Not used | label, action, validation, feedbackMessage, connectorName, connectorPayload, successRoute |
Call connectorName with the optional JSON connectorPayload after validation passes. |
connector.call; model.read when validation reads a model symbol; model.read + model.write when feedback is bound; app.route when successRoute is set |
The Button catalog declares two binding slots: target (write, scalar, action-dependent) and feedback (optional write, text). For appendRow, target is validated as a range. A route target is required only when writeValue is non-empty.
Append rows use one field = value entry per row line. Values may be literals or Repeater scope references such as @item.id. Connector payloads must be valid JSON to be sent as structured data.
SubmitButton transaction
SubmitButton is a separate batch-transaction action rather than a Button action choice. Its writes prop accepts one entry per line:
Target = valuewrites a literal.Target = @currentreads the target's current value and writes it back.Target = @item.fieldresolves a Repeater row-scope value.Target = =FORMULA()sets a formula.
A non-empty transaction requests model.read and model.write; its optional route adds app.route. Its optional feedback binding is a text write. An empty writes list is not advertised as an executable transaction.
Block summary
| Type | Family | Container | Props | Bindings | Purpose |
|---|---|---|---|---|---|
Stack |
Layout | Yes | 3 | 0 | Vertical container. |
Row |
Layout | Yes | 3 | 0 | Horizontal container. |
Card |
Layout | Yes | 2 | 0 | Bordered container with optional title. |
Form |
Layout | Yes | 3 | 0 | Groups inputs and a submit action. |
Section |
Layout | Yes | 5 | 0 | Page section with title, subtitle, spacing, and surface treatment. |
Grid |
Layout | Yes | 4 | 0 | Responsive columns for dashboard cards, form groups, and repeated panels. |
SidebarLayout |
Layout | Yes | 3 | 0 | Two-region workspace with a sidebar child and main content that collapses on smaller screens. |
Modal |
Layout | Yes | 3 | 1 | An overlay dialog shown when a bound boolean cell is true; a button sets it to open. |
Drawer |
Layout | Yes | 4 | 1 | A side panel that slides in when a bound boolean cell is true. |
Menu |
Navigation | Yes | 2 | 1 | A dropdown: a trigger button reveals a panel of items when a bound boolean cell is true. |
Tabs |
Layout | Yes | 1 | 1 | A tab bar over swappable panels; the bound cell holds the active tab and each child is a panel. |
Accordion |
Layout | Yes | 1 | 1 | Stacked collapsible sections; the bound cell holds the open section and each child is a panel. |
Tooltip |
Layout | Yes | 2 | 1 | Wraps a child and shows a hint on hover. |
Progress |
Display | No | 2 | 1 | A progress bar read from a cell (0–max). |
Avatar |
Display | No | 2 | 2 | A circular avatar showing an image or initials. |
Image |
Display | No | 4 | 1 | An image from a URL prop or bound cell. |
Link |
Navigation | No | 3 | 2 | A hyperlink to an external URL (use a Button with the route action for app pages). |
Heading |
Display | No | 2 | 1 | Section heading. |
Text |
Display | No | 1 | 1 | Paragraph or label text. |
Metric |
Display | No | 2 | 1 | Labelled value read from a cell. |
Stats |
Display | Yes | 1 | 0 | Groups Stat items into a stats band (daisyUI stats). |
Stat |
Display | No | 3 | 2 | A single titled statistic read from a cell, with an optional description. |
Steps |
Navigation | No | 1 | 1 | A step progress indicator; the bound value marks the current step. |
Divider |
Display | No | 1 | 1 | A horizontal rule with an optional centered label. |
Badge |
Display | No | 2 | 1 | Compact status pill. |
Alert |
Display | No | 3 | 2 | Model-driven status, warning, or validation feedback. |
Nav |
Navigation | No | 2 | 0 | Page navigation generated from this app's pages. |
NumberInput |
Input | No | 4 | 1 | Numeric field bound to a cell. |
TextInput |
Input | No | 2 | 1 | Text field bound to a cell. |
TextArea |
Input | No | 3 | 1 | Multi-line text field bound to a cell. |
DateInput |
Input | No | 3 | 1 | Date field bound to a cell (ISO yyyy-mm-dd). |
FileInput |
Input | No | 2 | 1 | File picker; writes the chosen file to the bound cell as a data: URL (pair with an Image to preview). Files over 5 MB are rejected. |
Toggle |
Input | No | 1 | 1 | Boolean switch bound to a cell. |
Slider |
Input | No | 4 | 1 | Range slider bound to a cell. |
Select |
Input | No | 2 | 1 | Dropdown bound to a cell. |
SegmentedControl |
Input | No | 2 | 1 | Button group bound to a model state cell. |
Button |
Input | No | 12 | 2 | Writes a target cell or navigates an app route when clicked. |
SubmitButton |
Input | No | 4 | 1 | Writes a group of cells in one click. |
Table |
Data | No | 10 | 4 | Rows from a bound range. |
Detail |
Data | No | 4 | 2 | Shows fields from the currently selected row. |
BarChart |
Data | No | 6 | 1 | Bar, line, area, or pie chart from a bound row source. |
List |
Data | No | 5 | 2 | Renders one templated line per row of a range. |
Repeater |
Data | Yes | 5 | 2 | Renders its child template once per row of a range. Children bind to row fields via the item scope; leave it empty for an automatic labelled card. |
Layout blocks
Stack
Vertical container. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
gap |
Gap | number |
12 |
min 0; max 64; step 1 | — |
padding |
Padding | number |
0 |
min 0; max 64; step 1 | — |
align |
Align | select |
"stretch" |
stretch, start, center, end |
— |
Bindings:
This block has no binding slots.
Row
Horizontal container. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
gap |
Gap | number |
12 |
min 0; max 64; step 1 | — |
align |
Align | select |
"center" |
start, center, end, stretch |
— |
justify |
Justify | select |
"start" |
start, center, end, space-between |
— |
Bindings:
This block has no binding slots.
Card
Bordered container with optional title. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"" |
— | — |
padding |
Padding | number |
16 |
min 0; max 64; step 1 | — |
Bindings:
This block has no binding slots.
Form
Groups inputs and a submit action. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"Form" |
— | — |
gap |
Gap | number |
12 |
min 0; max 64; step 1 | — |
padding |
Padding | number |
16 |
min 0; max 64; step 1 | — |
Bindings:
This block has no binding slots.
Section
Page section with title, subtitle, spacing, and surface treatment. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"Section" |
— | — |
subtitle |
Subtitle | textarea |
"" |
— | — |
gap |
Gap | number |
16 |
min 0; max 64; step 1 | — |
padding |
Padding | number |
20 |
min 0; max 64; step 1 | — |
variant |
Style | select |
"plain" |
plain, surface, accent |
— |
Bindings:
This block has no binding slots.
Grid
Responsive columns for dashboard cards, form groups, and repeated panels. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
gap |
Gap | number |
12 |
min 0; max 64; step 1 | — |
columns |
Columns | select |
"auto" |
auto, 2, 3, 4 |
Auto uses the minimum column width and collapses naturally. |
minColumnWidth |
Min column width | number |
220 |
min 120; max 520; step 10 | — |
align |
Align | select |
"stretch" |
stretch, start, center, end |
— |
Bindings:
This block has no binding slots.
SidebarLayout
Two-region workspace with a sidebar child and main content that collapses on smaller screens. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
gap |
Gap | number |
16 |
min 0; max 64; step 1 | — |
sidebarWidth |
Sidebar width | number |
280 |
min 160; max 520; step 10 | — |
collapseAt |
Collapse below | select |
"768" |
640, 768, 960, never |
The packaged app stacks regions below this width. |
Bindings:
This block has no binding slots.
Modal
An overlay dialog shown when a bound boolean cell is true; a button sets it to open. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"Dialog" |
— | — |
gap |
Gap | number |
12 |
min 0; max 64; step 1 | — |
dismissible |
Close on backdrop click | boolean |
true |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
open |
Open when | readwrite |
boolean |
Required | model.read + model.write |
Drawer
A side panel that slides in when a bound boolean cell is true. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"Panel" |
— | — |
side |
Side | select |
"right" |
left, right |
— |
gap |
Gap | number |
12 |
min 0; max 64; step 1 | — |
dismissible |
Close on backdrop click | boolean |
true |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
open |
Open when | readwrite |
boolean |
Required | model.read + model.write |
Tabs
A tab bar over swappable panels; the bound cell holds the active tab and each child is a panel. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
tabs |
Tabs | options |
["Overview","Details"] |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Active tab | readwrite |
text |
Required | model.read + model.write |
Accordion
Stacked collapsible sections; the bound cell holds the open section and each child is a panel. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
sections |
Sections | options |
["Section 1","Section 2"] |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Open section | readwrite |
text |
Required | model.read + model.write |
Tooltip
Wraps a child and shows a hint on hover. Family: Layout. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
text |
Tip | text |
"Tooltip" |
— | — |
position |
Position | select |
"top" |
top, bottom, left, right |
— |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
text |
Tip from cell | read |
text |
Optional | model.read |
Display blocks
Progress
A progress bar read from a cell (0–max). Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
max |
Max | number |
100 |
min 1; step 1 | — |
variant |
Variant | select |
"default" |
default, success, warning, danger |
— |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | read |
number |
Required | model.read |
Avatar
A circular avatar showing an image or initials. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Name / initials | text |
"GR" |
— | — |
size |
Size | select |
"md" |
sm, md, lg |
— |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
src |
Image URL from cell | read |
text |
Optional | model.read |
label |
Name from cell | read |
text |
Optional | model.read |
Image
An image from a URL prop or bound cell. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
src |
Image URL | text |
"" |
— | — |
alt |
Alt text | text |
"" |
— | — |
fit |
Fit | select |
"cover" |
cover, contain |
— |
height |
Height | number |
160 |
min 24; max 720; step 8 | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
src |
Image URL from cell | read |
text |
Optional | model.read |
Heading
Section heading. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
text |
Text | text |
"Heading" |
— | — |
level |
Level | select |
"2" |
1, 2, 3 |
— |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
text |
Text from cell | read |
scalar |
Optional | model.read |
Text
Paragraph or label text. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
text |
Text | textarea |
"Text" |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
text |
Text from cell | read |
scalar |
Optional | model.read |
Metric
Labelled value read from a cell. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Metric" |
— | — |
format |
Format | select |
"number" |
number, currency, percent, text |
— |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | read |
scalar |
Required | model.read |
Stats
Groups Stat items into a stats band (daisyUI stats). Family: Display. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
gap |
Gap | number |
16 |
min 0; max 64; step 1 | — |
Bindings:
This block has no binding slots.
Stat
A single titled statistic read from a cell, with an optional description. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"Stat" |
— | — |
format |
Format | select |
"number" |
number, currency, percent, text |
— |
desc |
Description | text |
"" |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | read |
scalar |
Required | model.read |
desc |
Description from cell | read |
text |
Optional | model.read |
Divider
A horizontal rule with an optional centered label. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"" |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
label |
Label from cell | read |
text |
Optional | model.read |
Badge
Compact status pill. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
text |
Text | text |
"Badge" |
— | — |
variant |
Variant | select |
"default" |
default, success, warning, danger |
— |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
text |
Text from cell | read |
scalar |
Optional | model.read |
Alert
Model-driven status, warning, or validation feedback. Family: Display. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"Status" |
— | — |
message |
Message | textarea |
"Message" |
— | — |
variant |
Variant | select |
"info" |
info, success, warning, danger |
— |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
title |
Title from cell | read |
text |
Optional | model.read |
message |
Message from cell | read |
text |
Optional | model.read |
Navigation blocks
Menu
A dropdown: a trigger button reveals a panel of items when a bound boolean cell is true. Family: Navigation. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Trigger label | text |
"Menu" |
— | — |
align |
Align | select |
"left" |
left, right |
— |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
open |
Open when | readwrite |
boolean |
Required | model.read + model.write |
Link
A hyperlink to an external URL (use a Button with the route action for app pages). Family: Navigation. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
text |
Text | text |
"Link" |
— | — |
href |
URL | text |
"https://" |
— | — |
newTab |
Open in new tab | boolean |
true |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
text |
Text from cell | read |
text |
Optional | model.read |
href |
URL from cell | read |
text |
Optional | model.read |
Steps
A step progress indicator; the bound value marks the current step. Family: Navigation. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
options |
Steps | options |
["Step 1","Step 2","Step 3"] |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Current step | read |
number |
Optional | model.read |
Nav
Page navigation generated from this app's pages. Family: Navigation. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
variant |
Style | select |
"tabs" |
tabs, pills, list |
— |
includeHome |
Include home | boolean |
true |
— | Show the page marked as this app's home. |
Bindings:
This block has no binding slots.
Input blocks
NumberInput
Numeric field bound to a cell. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Number" |
— | — |
min |
Min | number |
— | — | — |
max |
Max | number |
— | — | — |
step |
Step | number |
1 |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
number |
Required | model.read + model.write |
TextInput
Text field bound to a cell. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Text" |
— | — |
placeholder |
Placeholder | text |
"" |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
text |
Required | model.read + model.write |
TextArea
Multi-line text field bound to a cell. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Notes" |
— | — |
placeholder |
Placeholder | text |
"" |
— | — |
rows |
Rows | number |
4 |
min 2; max 20; step 1 | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
text |
Required | model.read + model.write |
DateInput
Date field bound to a cell (ISO yyyy-mm-dd). Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Date" |
— | — |
min |
Min | text |
"" |
— | — |
max |
Max | text |
"" |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
text |
Required | model.read + model.write |
FileInput
File picker; writes the chosen file to the bound cell as a data: URL (pair with an Image to preview). Files over 5 MB are rejected. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"File" |
— | — |
accept |
Accept | text |
"" |
— | e.g. image/* — limits the picker. |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
text |
Required | model.read + model.write |
Toggle
Boolean switch bound to a cell. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Toggle" |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
boolean |
Required | model.read + model.write |
Slider
Range slider bound to a cell. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Slider" |
— | — |
min |
Min | number |
0 |
— | — |
max |
Max | number |
100 |
— | — |
step |
Step | number |
1 |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
number |
Required | model.read + model.write |
Select
Dropdown bound to a cell. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Select" |
— | — |
options |
Options | options |
["Option A","Option B"] |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
scalar |
Required | model.read + model.write |
SegmentedControl
Button group bound to a model state cell. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Mode" |
— | — |
options |
Options | options |
["Option A","Option B"] |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
value |
Value | readwrite |
scalar |
Required | model.read + model.write |
Button
Writes a target cell or navigates an app route when clicked. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Button" |
— | — |
action |
Action | select |
"increment" |
set, increment, decrement, formula, appendRow, validate, route, runJob, callConnector |
— |
value |
Value / amount / route | text |
"1" |
— | For route, enter a package-relative appPath such as "dist/customer/1". |
writeValue |
Write before route | text |
"" |
— | Optional for route actions: write this value to the target cell before navigating. |
row |
Append row | options |
[] |
— | For append row actions, one per line: field = value or field = @item.field. |
validation |
Validate | condition |
"" |
— | Optional action guard, e.g. "Approved is true" or "Amount > 0". |
successRoute |
Route after success | text |
"" |
— | Optional package-relative appPath after a successful write, append, or validation. |
feedbackMessage |
Feedback message | text |
"" |
— | — |
jobName |
Job | text |
"" |
— | — |
connectorName |
Connector | text |
"" |
— | — |
connectorPayload |
Connector payload | textarea |
"" |
— | Optional JSON payload for connector-call action planning. |
formula |
Formula | text |
"" |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
target |
Target cell | write |
scalar |
Action-dependent; see the Button action table | model.read + model.write |
feedback |
Feedback cell | write |
text |
Optional | model.read + model.write |
SubmitButton
Writes a group of cells in one click. Family: Input. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
label |
Label | text |
"Submit" |
— | — |
writes |
Writes | options |
[] |
— | One per line: Target = value, Target = @current, Target = @item.field, or Target = =FORMULA(). |
route |
Route after submit | text |
"" |
— | Optional package-relative appPath such as "dist/records". |
feedbackMessage |
Feedback message | text |
"" |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
feedback |
Feedback cell | write |
text |
Optional | model.read + model.write |
Data blocks
Table
Rows from a bound range. Family: Data. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
columns |
Columns (blank = all) | options |
[] |
— | One per line: column, or column:Label. |
rowLimit |
Max rows | number |
50 |
min 1; max 1000; step 1 | — |
striped |
Striped rows | boolean |
true |
— | — |
sortable |
Sortable columns | boolean |
true |
— | — |
pageSize |
Rows per page | number |
0 |
min 0; max 500; step 1 | 0 shows all rows (no pager). |
selectValue |
Select value column | text |
"" |
— | Optional column written to the selected binding when a row is clicked. Blank writes the 1-based row number. |
filterColumns |
Filter columns (blank = shown) | options |
[] |
— | Columns searched by the filter binding. Blank searches the shown columns. |
viewColumn |
View column | text |
"" |
— | Optional column matched exactly against the bound view value. |
viewAllValue |
All view value | text |
"All" |
— | A bound view value that disables the exact view-column filter. |
empty |
Empty message | text |
"No rows." |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
rows |
Rows | range |
range |
Required | model.read |
filter |
Filter text | read |
text |
Optional | model.read |
view |
View value | read |
scalar |
Optional | model.read |
selected |
Selected value | readwrite |
scalar |
Optional | model.read + model.write |
Detail
Shows fields from the currently selected row. Family: Data. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"Detail" |
— | — |
fields |
Fields (blank = all) | options |
[] |
— | One per line: column, or column:Label. |
selectValue |
Select value column | text |
"" |
— | Must match the Table's select value. Blank uses the 1-based row number. |
empty |
Empty message | text |
"Select a row." |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
rows |
Rows | range |
range |
Required | model.read |
selected |
Selected value | read |
scalar |
Required | model.read |
BarChart
Bar, line, area, or pie chart from a bound row source. Family: Data. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
title |
Title | text |
"Chart" |
— | — |
type |
Chart type | select |
"bar" |
bar, line, area, pie |
— |
labelColumn |
Label column | text |
"" |
— | Blank uses the first column. |
valueColumn |
Value column | text |
"" |
— | Blank uses the first numeric-looking column. |
maxBars |
Max bars | number |
8 |
min 1; max 50; step 1 | — |
empty |
Empty message | text |
"No chart data." |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
rows |
Rows | range |
range |
Required | model.read |
List
Renders one templated line per row of a range. Family: Data. Container: no.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
template |
Line template | text |
"{0}" |
— | Use {0}, {1}… for columns, or {Header} when the range has headers. |
ordered |
Numbered | boolean |
false |
— | — |
rowLimit |
Max rows | number |
50 |
min 1; max 1000; step 1 | — |
selectValue |
Select value column | text |
"" |
— | Optional column written to the selected binding. Blank writes the 1-based row number. |
empty |
Empty message | text |
"No items." |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
rows |
Rows | range |
range |
Required | model.read |
selected |
Selected value | readwrite |
scalar |
Optional | model.read + model.write |
Repeater
Renders its child template once per row of a range. Children bind to row fields via the item scope; leave it empty for an automatic labelled card. Family: Data. Container: yes.
Props:
| Key | Label | Type | Default | Choices / limits | Author guidance |
|---|---|---|---|---|---|
itemAlias |
Item name | text |
"item" |
— | Children reference this row's fields as @item.column. |
fields |
Fields (empty template only) | options |
[] |
— | One per line: column, or column:Label. Used only when the template is empty. |
filterColumns |
Filter columns (blank = fields/all) | options |
[] |
— | Columns searched by the filter binding. Blank searches declared fields or all row fields. |
rowLimit |
Max rows | number |
25 |
min 1; max 500; step 1 | — |
empty |
Empty message | text |
"No records." |
— | — |
Bindings:
| Slot | Label | Direction | Shape | Required | Published capability request |
|---|---|---|---|---|---|
rows |
Rows | range |
range |
Required | model.read |
filter |
Filter text | read |
text |
Optional | model.read |