eui-core 0.8.0

Exponential UI core: the A2UI reducer (core + basic catalog, macros, extensions), runtime themes with recipe resolution, taffy layout with batched measurement, overlay layers and windowed lists — the engine behind the SwiftUI, Compose and gpui painters.
Documentation
1
2
3
4
5
6
// AUTO-GENERATED by packages/exponential-ui/scripts/generate.ts — do not edit.
// Source of truth: packages/exponential-ui/catalog/core.catalog.json (+ tokens.json, style.json, basic-map.json, strings.json, locale.json, code.json, a11y.json, layout.json).
// VAPP-106: the model-facing descriptions and examples of the catalog (generated/core.descriptions.json), keyed like the
// catalog; the runtime catalog (CORE_CATALOG_JSON) carries none. Embedded only with the `descriptions` feature.

pub const CORE_CATALOG_DESCRIPTIONS_JSON: &str = r####"{"components":{"Box":{"props":{"style":{"description":"Layout and visual properties from the Box whitelist (flex, grid, sizes, spacing, colours)."},"pressable":{"description":"Makes the box a press target that fires `press`."}},"description":"A styled container laid out by the whitelisted style object; what every macro expands into.","example":{"style":{"display":"flex","flexDirection":"column","gap":"$spacing.md","padding":"$spacing.lg"}}},"Stack":{"props":{"direction":{"description":"A row or a column (`{base: \"vertical\", md: \"horizontal\"}`)."},"gap":{"description":"The space between children."},"align":{"description":"Unset: `center` in a row, `stretch` in a column."},"justify":{"description":"Main-axis distribution."},"wrap":{"description":"Lets children wrap onto new lines."},"style":{"description":"Extra Box styles merged over the stack's own."}},"description":"A flex container that lays its children out in one direction with a gap.","example":{"direction":"horizontal","gap":"sm"}},"Grid":{"props":{"columns":{"description":"Equal columns 1–6 (`{base: 1, md: 2, lg: 3}`)."},"gap":{"description":"The space between cells."},"style":{"description":"Extra Box styles merged over the grid's own."}},"description":"An equal-column grid for cards and tiles.","example":{"columns":3,"gap":"md"}},"Card":{"props":{"title":{"description":"The card heading."},"description":{"description":"A muted line under the heading."},"padded":{"description":"Pads the body; off for edge-to-edge rows."},"style":{"description":"Extra Box styles merged over the card's own."}},"description":"A bordered card with an optional title and description, for grouped content, not page headers.","example":{"title":"Overview","description":"Your account summary"}},"Separator":{"props":{"orientation":{"description":"A horizontal rule or a vertical bar."}},"description":"A hairline that divides content.","example":{"orientation":"horizontal"}},"List":{"props":{"direction":{"description":"Scroll axis."},"gap":{"description":"The space between items."},"divided":{"description":"Draws a hairline between items."},"sectionBy":{"description":"Groups consecutive items by this field; slot `section` = each header ({value, count})."},"stickyHeaders":{"description":"Pins the current section header."},"style":{"description":"Extra Box styles for the list frame."}},"description":"A windowed scrolling list for anything longer than a screen; children may come from a data template.","example":{"direction":"vertical","divided":true}},"Resizable":{"props":{"direction":{"description":"Side by side or stacked."},"sizes":{"description":"Percent per panel; bind it."},"panels":{"description":"Per-panel limits, by index."},"handle":{"description":"Draws a grip on each handle."},"style":{"description":"Extra Box styles for the group box (give it a height)."}},"description":"Panels split by draggable handles; each child is one panel.","example":{"direction":"horizontal","sizes":[30,70],"handle":true}},"ScrollArea":{"props":{"direction":{"description":"Which axis scrolls."},"maxHeight":{"description":"Px it scrolls within; omit to fill the parent."},"style":{"description":"Extra Box styles merged over the region's own."}},"description":"A scrolling region of bounded height or width.","example":{"direction":"vertical","maxHeight":240}},"Sidebar":{"props":{"side":{"description":"Which edge the column sits on."},"width":{"description":"The column width in px."},"collapseBelow":{"description":"Hides the column below this breakpoint."},"collapsed":{"description":"Hides the column at any width; bind it to a toggle."}},"description":"A two-column shell: a navigation column (`sidebar` slot) beside the children, hidden narrow or `collapsed`.","example":{"side":"left","width":240,"collapseBelow":"md"}},"SplitView":{"props":{"open":{"description":"On phones, the detail shows instead of the list; bind it to the open item."},"width":{"description":"The list column width in px."}},"description":"List (`list` slot) + detail (children); phones show one at a time, the detail with a back button.","example":{"open":true,"width":320}},"AppBar":{"props":{"title":{"description":"The screen title."},"subtitle":{"description":"A muted line under the title."},"back":{"description":"Shows a back button that fires `back`."}},"description":"A top bar: title, optional subtitle and back button, `leading`/`trailing` slots.","example":{"title":"Settings","back":true}},"Page":{"props":{"title":{"description":"The screen title."},"subtitle":{"description":"A muted line under the title."},"back":{"description":"Shows a back button that fires `back`."},"padded":{"description":"Pads the body; off for edge-to-edge lists."}},"description":"A screen: an AppBar row (back, title, trailing actions) over a padded scrolling body.","example":{"title":"Settings","back":true}},"Toolbar":{"props":{"gap":{"description":"The space between controls."}},"description":"Controls in one row, bottoms aligned, wrapping on phones; `trailing` = the end action.","example":{"gap":"sm"}},"Section":{"props":{"title":{"description":"The band's label; omit it for a bare run of rows."},"caption":{"description":"Muted text after the title."},"count":{"description":"A count after the title; off unless given."},"icon":{"description":"A glyph before the title (the `leading` slot replaces it)."},"collapsible":{"description":"The header folds the rows (chevron, press)."},"open":{"description":"Whether the rows show; bind it."},"tint":{"description":"The band's colour tone."},"tree":{"description":"The rows form a tree: each `Row.depth` indents and draws its guides."},"loading":{"description":"A refetch is running: a small spinner before the count. The first load is a Skeleton instead."},"style":{"description":"Extra Box styles for the frame."}},"description":"A band header over hairline-divided rows: title, caption, count and glyph, foldable, tinted; no title = just the rows.","example":{"title":"In progress","icon":"nav-issues"}},"Group":{"props":{"title":{"description":"A caption above the group."},"footer":{"description":"A muted note under the group."}},"description":"A form-field container: a rounded group of rows with an optional title and footnote.","example":{"title":"Notifications"}},"Text":{"props":{"text":{"description":"The text to show."},"variant":{"description":"The type style."},"align":{"description":"Horizontal alignment inside its box."},"lines":{"description":"Truncates to this many lines with an ellipsis."},"tone":{"description":"A colour tone instead of the default foreground."},"shimmer":{"description":"Animates a highlight across the text while work runs."},"live":{"description":"Announces changes (`assertive` interrupts)."},"style":{"description":"Extra Box styles for the text box."}},"description":"A run of text in one of the type styles; prefer dedicated components over inline markdown.","example":{"text":"Hello, world!","variant":"body"}},"Heading":{"props":{"text":{"description":"The heading text."},"level":{"description":"h1 is the page title, h4 the smallest."}},"description":"A section or page heading at one of four levels.","example":{"text":"Welcome","level":"h1"}},"Markdown":{"props":{"text":{"description":"The GFM source."},"lines":{"description":"Truncates the rendered body to this many lines with an ellipsis."},"style":{"description":"Extra Box styles for the markdown box."}},"description":"Rendered GitHub-flavoured markdown, for prose.","example":{"text":"**Bold** and a list:\n\n- one\n- two"}},"CodeBlock":{"props":{"code":{"description":"The source text."},"language":{"description":"The syntax colouring."},"title":{"description":"A header line (a file name)."},"lineNumbers":{"description":"Shows a line-number gutter."},"wrap":{"description":"Wraps long lines instead of scrolling sideways."},"copyable":{"description":"Shows the copy-to-clipboard button."},"highlight":{"description":"1-based line numbers to emphasise."},"maxLines":{"description":"Lines shown before the block scrolls."},"variant":{"description":"destructive = failed output."},"size":{"description":"sm = compact."}},"description":"Source code in a mono block: syntax colouring, optional line numbers, a copy button.","example":{"code":"const answer = 42 // the answer","language":"ts","lineNumbers":true}},"Kbd":{"props":{"keys":{"description":"The shortcut text (`⌘K`, `Ctrl+Shift+P`)."}},"description":"A keyboard shortcut drawn as a key cap.","example":{"keys":"⌘K"}},"Label":{"props":{"text":{"description":"The caption."},"for":{"description":"The id of the control it labels."},"required":{"description":"Adds the required mark."}},"description":"A caption for a control that has no label of its own, with an optional required mark.","example":{"text":"Visibility","for":"visibility"}},"Image":{"props":{"src":{"description":"The image URL; omit for a placeholder."},"alt":{"description":"The accessibility description."},"fit":{"description":"How the picture fills its box."},"width":{"description":"Fixed width in px; otherwise the box decides."},"height":{"description":"Fixed height in px."},"aspectRatio":{"description":"Width over height (16:9 when unset and no height); the box never waits for the picture."},"fallback":{"description":"An icon shown when the picture fails or is missing."},"loading":{"description":"Defer loading until near the viewport, or load at once."},"focalX":{"description":"Horizontal focal point 0..1 kept when cropped (0.5)."},"focalY":{"description":"Vertical focal point 0..1 kept when cropped (0.5)."},"style":{"description":"Extra Box styles for the image box."}},"description":"A picture from a URL, or a placeholder box when it has none.","example":{"src":"https://example.com/cover.jpg","alt":"Cover","fit":"cover","aspectRatio":1.7777778}},"ZoomableImage":{"props":{"src":{"description":"The image URL."},"alt":{"description":"The accessibility description."},"naturalWidth":{"description":"Pixel width."},"naturalHeight":{"description":"Pixel height."},"initial":{"description":"auto = fitWidth when tall."},"maxScale":{"description":"Largest zoom."},"controls":{"description":"The zoom pill."},"scale":{"description":"1 = 100%."},"style":{"description":"Extra Box styles for the viewport."}},"description":"A picture that zooms (pinch, ⌘-wheel, double-tap) and pans.","example":{"src":"https://example.com/screenshot.png","alt":"Screenshot","naturalWidth":1440,"naturalHeight":900}},"Icon":{"props":{"name":{"description":"The icon name (an icons.json concept or Lucide name)."},"size":{"description":"Glyph size."},"tone":{"description":"A colour tone instead of the current text colour."},"label":{"description":"An accessibility label when the icon stands alone."}},"description":"One icon from the shared Lucide registry, by name.","example":{"name":"ui-check","size":"default"}},"Video":{"props":{"src":{"description":"The video URL (H.264 + AAC MP4 plays everywhere)."},"poster":{"description":"A still shown before playback."},"durationMs":{"description":"Known length for the scrubber."},"autoplay":{"description":"Starts muted playback on appear."},"aspectRatio":{"description":"Width over height of the player box."},"style":{"description":"Extra Box styles for the player box."}},"description":"A video player: the poster until play, then the platform player with its controls.","example":{"src":"https://example.com/clip.mp4","durationMs":12000}},"AudioPlayer":{"props":{"src":{"description":"The audio URL."},"title":{"description":"What is playing."},"durationMs":{"description":"Known length for the scrubber."}},"description":"An audio player with a title and a play control.","example":{"src":"https://example.com/track.mp3","title":"Episode 12"}},"Avatar":{"props":{"name":{"description":"The person's name; initials come from it."},"src":{"description":"The picture URL."},"size":{"description":"Diameter class."},"seed":{"description":"Hashes the fallback hue; defaults to the name."}},"description":"A round user picture that falls back to initials on a stable hue.","example":{"name":"Jane Doe","size":"default"}},"QrCode":{"props":{"value":{"description":"The text to encode."},"size":{"description":"Edge in px."},"level":{"description":"Error correction."},"label":{"description":"A caption under it and its accessibility label."}},"description":"A QR code of a value, dark on a light plate.","example":{"value":"https://exponential.at","label":"Scan to pair"}},"Carousel":{"props":{"page":{"description":"The active page index."},"loop":{"description":"Wraps from the last page to the first."},"indicators":{"description":"Shows the page dots."},"counter":{"description":"Shows `i / n`."},"thumbnails":{"description":"A thumbnail URL per page."}},"description":"A horizontally paging scroller; each child is one page.","example":{"page":0,"indicators":true}},"Mosaic":{"props":{"pictures":{"description":"The pictures in order."},"label":{"description":"The a11y label."}},"description":"Pictures: halves, or one large + two small with `+N`; press fires `select {index}`.","example":{"pictures":[{"src":"https://example.com/editor.png","alt":"Editor"},{"src":"https://example.com/preview.png","alt":"Preview"},{"src":"https://example.com/data.png","alt":"Data"},{"src":"https://example.com/versions.png","alt":"Versions"}]}},"Tabs":{"props":{"tabs":{"description":"The tab headers in order."},"value":{"description":"The active tab's value; bind it for two-way state."},"fill":{"description":"Stretches the headers across the width."},"closable":{"description":"Close glyphs firing `close`; `hover` = on hover."},"addable":{"description":"A + button firing `new`."}},"description":"Tab navigation; the child at index i is the panel of tab i.","example":{"tabs":[{"label":"Issue","value":"issue"},{"label":"Session","value":"session"}],"value":"issue"}},"Segmented":{"props":{"items":{"description":"The segments in order."},"type":{"description":"One active value or several."},"value":{"description":"The selected value (comma-joined when multiple); bind it."},"variant":{"description":"Pill track, bare toggles, joined outline buttons, or a full-width icon `bar`."},"size":{"description":"Control height class."},"fill":{"description":"Stretches the segments across the width (a `bar` always does)."},"orientation":{"description":"vertical bar = a rail."}},"description":"ONE row or column of segments: a pill track, toggles, joined outline buttons, a bottom bar or a rail.","example":{"items":[{"label":"List","value":"list"},{"label":"Board","value":"board"}],"value":"list"}},"Accordion":{"props":{"items":{"description":"The section headers in order."},"type":{"description":"One section open at a time, or any number."},"value":{"description":"The open section's value (comma-joined when multiple); bind it."}},"description":"Collapsible sections; the child at index i is the body of item i.","example":{"items":[{"title":"Details","value":"details"}],"type":"single","value":"details"}},"Collapsible":{"props":{"title":{"description":"The header text."},"open":{"description":"Whether the body shows; bind it."},"count":{"description":"A count shown in the header."}},"description":"One disclosure section with a title row that shows or hides its children.","example":{"title":"Advanced","open":false}},"Trace":{"props":{"size":{"description":"Line spacing; match the items."}},"description":"A column of TraceItem lines (an agent's steps).","example":{"size":"default"}},"TraceItem":{"props":{"title":{"description":"What happened."},"icon":{"description":"The lead glyph."},"description":{"description":"A muted detail (a duration)."},"status":{"description":"running shimmers, error tints, pending dims, done ticks, skipped strikes."},"size":{"description":"sm = compact."},"collapsible":{"description":"The line toggles its children."},"open":{"description":"Whether the children show; bind it."}},"description":"One step line: icon, title, muted detail; may expand to show its children.","example":{"title":"Ran bun test","icon":"trace-terminal","description":"4s","collapsible":true,"open":true}},"Plan":{"props":{"title":{"description":"The plan's heading."},"description":{"description":"A muted line under it."},"steps":{"description":"The steps."},"state":{"description":"proposed asks, running shows progress."},"progress":{"description":"0 to 1."},"approveLabel":{"description":"Button text."},"declineLabel":{"description":"Button text."},"stopLabel":{"description":"Button text."}},"description":"A plan card: steps to approve, then progress and Stop.","example":{"title":"Here's my plan","description":"About two minutes.","steps":[{"title":"Open the site","icon":"globe"},{"title":"Reserve a table","icon":"pencil"},{"title":"Add it to your calendar","icon":"calendar"}]}},"Pagination":{"props":{"totalPages":{"description":"How many pages there are."},"page":{"description":"The current 1-based page; bind it."}},"description":"Previous, next and the current page out of a total.","example":{"totalPages":5,"page":2}},"Breadcrumb":{"props":{"items":{"description":"The path from the root to the current page."}},"description":"The path to the current page; every item but the last is a link firing `select`.","example":{"items":[{"label":"Boards","value":"boards"},{"label":"Sprint 12","value":"sprint-12"},{"label":"EXP-42","value":"exp-42"}]}},"Outline":{"props":{"items":{"description":"The rows in order."},"value":{"description":"The active row id."},"caption":{"description":"The heading."}},"description":"Anchor rows under a caption, one active; press fires `select {id}`.","example":{"caption":"Outline","value":"part-a","items":[{"id":"current","title":"Current state"},{"id":"part-a","title":"Part A: editor-first creation","count":5},{"id":"part-b","title":"Part B: MCP for eApps","count":2}]}},"Stepper":{"props":{"steps":{"description":"The steps in order."},"current":{"description":"The 0-based index of the active step."},"orientation":{"description":"In a row or stacked."}},"description":"Wizard progress: numbered steps, finished ones ticked.","example":{"steps":[{"label":"Account"},{"label":"Team"},{"label":"Done"}],"current":1}},"Dialog":{"props":{"title":{"description":"The dialog heading."},"description":{"description":"A muted line under the heading."},"open":{"description":"Whether it shows; bind it to a boolean path."},"dismissible":{"description":"Closes on the backdrop or Escape."}},"description":"A centred modal over the surface, opened by its trigger slot or by binding `open`.","example":{"title":"Delete board?","description":"This cannot be undone.","open":false}},"Drawer":{"props":{"title":{"description":"The drawer heading."},"description":{"description":"A muted line under the heading."},"open":{"description":"Whether it shows; bind it to a boolean path."},"side":{"description":"The edge it slides from; `{base: \"bottom\", md: \"right\"}` turns the phone sheet into a side panel on wide surfaces."},"dismissible":{"description":"Closes on the backdrop or Escape."},"dragToDismiss":{"description":"Lets a swipe toward its edge close it."}},"description":"A panel sliding in from an edge (a bottom sheet on phones).","example":{"title":"Filters","side":"bottom","open":false}},"DockCard":{"props":{"label":{"description":"The tinted header word."},"title":{"description":"The one line under the header."},"caption":{"description":"Muted text after the label."},"meta":{"description":"Muted text at the header's end."},"icon":{"description":"The glyph before the label."},"tone":{"description":"The glyph's and the label's tone."},"open":{"description":"Whether the sheet shows; bind it."}},"description":"A floating one-row card whose children open in a bottom sheet with a pinned footer.","example":{"label":"Plan ready","caption":"Ask dock","meta":"3 questions","title":"Fold the composer into the Dock","icon":"coding-plan","tone":"primary"}},"AlertDialog":{"props":{"title":{"description":"The question."},"description":{"description":"What will happen."},"confirmLabel":{"description":"The confirming button's text."},"cancelLabel":{"description":"The cancelling button's text."},"destructive":{"description":"Styles the confirming button as dangerous."},"open":{"description":"Whether it shows; bind it."}},"description":"A modal that asks for a confirmation and ignores clicks outside; fires `confirm` or `cancel`.","example":{"title":"Delete board?","description":"This cannot be undone.","destructive":true}},"Popover":{"props":{"open":{"description":"Whether it shows; bind it."},"side":{"description":"Preferred side of the trigger."},"openOn":{"description":"Press, or hover over the trigger (press on touch)."}},"description":"A small panel anchored to its trigger, opened on press.","example":{"side":"bottom"}},"Tooltip":{"props":{"content":{"description":"The hint text."},"side":{"description":"Preferred side of the anchor."}},"description":"A short hint shown on hover or long-press over its children.","example":{"content":"Copy link"}},"Menu":{"props":{"label":{"description":"The default trigger's text when no child is given."},"icon":{"description":"The default trigger's icon."},"items":{"description":"The entries in order."},"openOn":{"description":"A press on the child, or the context gesture over it."}},"description":"A menu of actions, checkboxes, groups and submenus, opened by pressing its child or right-click / long-press.","example":{"label":"More","items":[{"label":"Rename","value":"rename"},{"label":"Delete","value":"delete","destructive":true}]}},"Toast":{"props":{"title":{"description":"The notice."},"description":{"description":"Detail under the notice."},"type":{"description":"Severity: icon and tone (`error` interrupts readers)."},"open":{"description":"Whether it shows; bind it so the host learns of a dismissal."},"duration":{"description":"Ms until it dismisses itself; 0 = never."},"actionLabel":{"description":"A button label; pressing it fires `action`."},"dismissible":{"description":"Shows the close control."}},"description":"A transient notice in the toast layer; render one per notice with `open` bound.","example":{"title":"Couldn't save the board","description":"The server did not answer.","type":"error","actionLabel":"Retry"}},"Badge":{"props":{"text":{"description":"The label or number."},"variant":{"description":"Filled, secondary, outlined or destructive."},"icon":{"description":"An icon before the text."}},"description":"A small count or status label.","example":{"text":"Active","variant":"default"}},"Alert":{"props":{"title":{"description":"The banner heading."},"message":{"description":"The detail under the heading."},"type":{"description":"The severity, which picks the icon and tone."}},"description":"An inline banner with an icon, a title and a message.","example":{"title":"Saved","message":"Your changes have been saved.","type":"success"}},"Chip":{"props":{"label":{"description":"The chip text."},"shape":{"description":"A rounded pill or a squarer entity chip."},"selected":{"description":"Draws it as the active choice."},"tone":{"description":"Colour tone of the chip."},"dot":{"description":"A colour dot before the text (a label chip)."},"icon":{"description":"An icon before the text."},"image":{"description":"A round picture instead of the icon."},"detail":{"description":"Muted text after the label."},"removable":{"description":"Shows a remove control that fires `remove`."},"pressable":{"description":"Makes it a press target that fires `press`."}},"description":"A small token: a pill (filter, label, state) or a rect naming an entity with a glyph or image; removable.","example":{"label":"Drafts","selected":true}},"EmptyState":{"props":{"icon":{"description":"The glyph: in the disc on `page`, bare on `list`."},"title":{"description":"What is empty."},"description":{"description":"The next step, `page` only."},"actionLabel":{"description":"A button label, `page` only; pressing it fires `press`."},"size":{"description":"page = a whole screen's empty state with disc, sentence and action; list = one muted line under a bare glyph, no description, no action."}},"description":"What an empty screen or list says: a short title; `page` adds the icon disc, a sentence and an action, `list` one muted line.","example":{"icon":"nav-inbox","title":"No notifications","description":"You are all caught up."}},"Progress":{"props":{"value":{"description":"The current amount, 0 to max."},"max":{"description":"The full amount."},"label":{"description":"A caption above the bar."},"tone":{"description":"The fill colour tone."}},"description":"A horizontal progress bar with an optional label.","example":{"value":65,"max":100,"label":"Upload"}},"Meter":{"props":{"segments":{"description":"The slices in order."},"max":{"description":"The full amount."},"label":{"description":"A caption before the track."},"value":{"description":"A formatted value after the track."}},"description":"A usage track: a bar of coloured segments against a maximum, with a caption and a value.","example":{"segments":[{"value":40,"tone":"primary"},{"value":25,"tone":"warning"}],"max":100,"label":"Storage","value":"650 MB of 1 GB"}},"Ring":{"props":{"value":{"description":"The fraction 0 to 1."},"size":{"description":"Diameter class."},"tone":{"description":"The arc colour tone."},"label":{"description":"An accessibility label."}},"description":"A circular progress ring for a fraction, sized like an icon.","example":{"value":0.62,"tone":"primary"}},"Spinner":{"props":{"size":{"description":"Diameter class; `xs` = inline in a header."},"label":{"description":"A caption or accessibility label."}},"description":"An indeterminate activity indicator.","example":{"size":"default"}},"Skeleton":{"props":{"width":{"description":"A length (px or %); defaults to the full width."},"height":{"description":"A length (px); defaults to one text line."},"rounded":{"description":"A circle instead of a bar."},"rows":{"description":"Rows instead of a block."},"rowHeight":{"description":"A row's height in px."},"dot":{"description":"A dot per row."}},"description":"A pulsing placeholder: a block, or `rows` rows.","example":{"width":"60%","height":"16px"}},"VoiceWave":{"props":{"activity":{"description":"What the voice is doing."},"variant":{"description":"bars = a level meter."},"level":{"description":"Loudness 0 to 1."},"bands":{"description":"Up to 8 band levels 0 to 1."},"size":{"description":"Edge class; sm hides the child."},"label":{"description":"An accessibility label."}},"description":"A live voice level: three waves around an optional decorative child.","example":{"activity":"listening","level":0.6,"bands":[0.9,0.6,1,0.5],"size":"lg"}},"CallSurface":{"props":{"name":{"description":"Who is on the call."},"avatar":{"description":"Picture URL."},"state":{"description":"ringing: Cancel only."},"activity":{"description":"The wave when talking."},"level":{"description":"Level 0 to 1."},"bands":{"description":"Band levels."},"status":{"description":"Calling… or a timer."},"caption":{"description":"The live line."},"muted":{"description":"Mic off; bind it."},"speaker":{"description":"Shows the speaker toggle."}},"description":"A voice call screen: wave, avatar, name, status, caption, call buttons.","example":{"name":"Assistant","state":"talking","activity":"speaking","level":0.6,"status":"01:24","caption":"Sure, Friday at eight works."}},"Table":{"props":{"columns":{"description":"The columns in order."},"rows":{"description":"One object per row keyed by column key; bind it for live data."},"rowKey":{"description":"The row field that identifies a row."},"sort":{"description":"The active sort; bound = you order `rows`, unbound = sorted locally."},"selectable":{"description":"Row selection (many = a checkbox column)."},"selected":{"description":"The selected row keys; bind them."},"caption":{"description":"A caption under the table."},"emptyText":{"description":"Shown when there are no rows."},"striped":{"description":"Alternates row fills."},"density":{"description":"Row height class."},"stickyHeader":{"description":"Pins the header while rows scroll."}},"description":"A table of typed columns: sorting, selection, widths, alignment, windowed; `slot` columns render components.","example":{"columns":[{"key":"name","label":"Name"},{"key":"role","label":"Role"},{"key":"runs","label":"Runs","type":"number","sortable":true,"align":"end"}],"rows":[{"id":"a","name":"Alice","role":"Owner","runs":12},{"id":"b","name":"Bob","role":"Member","runs":3}]}},"Chart":{"props":{"kind":{"description":"The chart form."},"categories":{"description":"The x-axis labels, or the pie slices; omit for a sparkline."},"series":{"description":"One per line, bar group or pie ring."},"title":{"description":"A title above the chart."},"height":{"description":"The whole chart's height in px (title, legend, axes inside); the width is the box's."},"xLabel":{"description":"A caption under the x axis."},"yLabel":{"description":"A caption beside the y axis."},"min":{"description":"The y-axis floor; defaults to 0."},"max":{"description":"The y-axis ceiling; defaults to the largest value."},"showAxes":{"description":"Draws the axes with tick labels."},"showGrid":{"description":"Draws horizontal grid lines at the ticks."},"showLegend":{"description":"Draws the legend (2+ series or slices)."},"showValues":{"description":"Writes each value on its bar, point or slice."}},"description":"A bar, stacked-bar, line, area, pie, donut or sparkline chart with axes, legend and tooltip.","example":{"kind":"bar","categories":["Mon","Tue"],"series":[{"name":"Runs","values":[3,5]}]}},"Sparkline":{"props":{"values":{"description":"The points, oldest first."},"tone":{"description":"The line colour tone."},"height":{"description":"The height in px."}},"description":"A tiny inline trend line of recent values, no axes or legend.","example":{"values":[1,3,2,5,4]}},"StatTile":{"props":{"label":{"description":"What is measured."},"value":{"description":"The formatted value."},"delta":{"description":"The change (`+12 %`)."},"tone":{"description":"The change's tone."},"trend":{"description":"Recent values (sparkline)."}},"description":"A dashboard tile: label, big value, toned change, trend sparkline.","example":{"label":"Active users","value":"1,284","delta":"+12 %","tone":"success","trend":[3,4,3,5,6,8]}},"Button":{"props":{"label":{"description":"The button text (omit for an icon-only button)."},"icon":{"description":"An icon before the label, or alone with size `icon`."},"variant":{"description":"`default` = the primary action, `destructive` = dangerous, `ghost`/`link` = quiet."},"size":{"description":"Control height class; `icon` is a square icon-only button."},"disabled":{"description":"Shows it inert."},"loading":{"description":"Pending: refuses presses, then shows a spinner."},"pendingLabel":{"description":"Label while loading."},"submit":{"description":"Submits the enclosing Form on press."},"hold":{"description":"holdStart/holdEnd/holdCancel, no press."},"holdingLabel":{"description":"Label while held."}},"description":"A press target with a label and optional icon (or one custom child).","example":{"label":"Submit","variant":"default"}},"Link":{"props":{"label":{"description":"The link text."},"href":{"description":"The URL to open; omit to handle `press` yourself."},"external":{"description":"Marks it as leaving the app."}},"description":"Inline link text that opens a URL or fires `press`.","example":{"label":"Open docs","href":"https://ui.exponential.at"}},"Toggle":{"props":{"label":{"description":"The button text or accessibility label."},"icon":{"description":"An icon before or instead of the label."},"pressed":{"description":"The state; bind it."},"variant":{"description":"Plain or outlined."},"size":{"description":"Control height class."}},"description":"A two-state button that stays pressed.","example":{"label":"Bold","icon":"editor-bold","pressed":false}},"Form":{"props":{"name":{"description":"The form's key in the submit payload."},"disabled":{"description":"Makes every field inert."},"busy":{"description":"Shows the submit pending and refuses another submit."},"summary":{"description":"Also lists every failed check above the fields."}},"description":"Collects its fields by `name` and fires `submit` with their values once every check passes.","example":{"name":"profile"}},"FieldGroup":{"props":{"columns":{"description":"Columns from md up (1-4)."}},"description":"Fields side by side (Starts / Ends) that stack on phones.","example":{"columns":2}},"FormActions":{"props":{"submit":{"description":"The submit label."},"cancel":{"description":"An outline Cancel firing `cancel`."},"destructive":{"description":"A dangerous submit."}},"description":"The end-aligned button row: children, Cancel, then THE submit (the one primary).","example":{"submit":"Save","cancel":true}},"Input":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data."},"type":{"description":"The keyboard and masking kind."},"placeholder":{"description":"Hint text while empty."},"value":{"description":"The text; bind it to a data path."},"disabled":{"description":"Shows it inert."},"checks":{"description":"Validation rules (required, email, length, regex, numeric)."},"validateOn":{"description":"When the checks run."}},"description":"A single-line text field.","example":{"label":"Email","name":"email","type":"email","placeholder":"you@example.com"}},"Textarea":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data."},"placeholder":{"description":"Hint text while empty."},"rows":{"description":"Visible lines (the minimum when autosizing)."},"autosize":{"description":"Grows with the text from `rows` up to `maxRows`."},"maxRows":{"description":"Autosize stops growing here and scrolls."},"value":{"description":"The text; bind it to a data path."},"disabled":{"description":"Shows it inert."},"checks":{"description":"Validation rules."},"validateOn":{"description":"When the checks run."}},"description":"A multi-line text field.","example":{"label":"Notes","name":"notes","rows":4}},"NumberField":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data."},"value":{"description":"The number; bind it."},"min":{"description":"The lowest value."},"max":{"description":"The highest value."},"step":{"description":"What the steppers and arrow keys add; Shift multiplies by 10."},"precision":{"description":"Decimal places shown; defaults to the step's."},"unit":{"description":"A suffix after the number (`kg`, `%`)."},"placeholder":{"description":"Hint text while empty."},"disabled":{"description":"Shows it inert."},"checks":{"description":"Validation rules."},"validateOn":{"description":"When the checks run."}},"description":"A numeric field with steppers, min/max/step clamping and locale formatting.","example":{"label":"Seats","name":"seats","value":3,"min":1,"max":50}},"Checkbox":{"props":{"label":{"description":"The text beside the box."},"name":{"description":"The field's key in the submitted data."},"checked":{"description":"The state; bind it."},"disabled":{"description":"Shows it inert."},"checks":{"description":"Validation rules."}},"description":"A labelled checkbox; bind `checked`.","example":{"label":"I agree","name":"agree","checked":false}},"Radio":{"props":{"label":{"description":"The group label."},"name":{"description":"The field's key in the submitted data."},"options":{"description":"The choices in order."},"value":{"description":"The chosen value; bind it."},"orientation":{"description":"Stacked or in a row."},"checks":{"description":"Validation rules."}},"description":"A labelled group of radio options choosing one value; bind `value`.","example":{"label":"Plan","name":"plan","options":[{"label":"Free","value":"free"},{"label":"Team","value":"team"}],"value":"free"}},"ChoiceTiles":{"props":{"name":{"description":"The field's key in the submitted data."},"options":{"description":"The choices in order."},"type":{"description":"One pick or several."},"value":{"description":"The pick (comma-joined when multiple); bind it."},"columns":{"description":"Tiles per row."},"disabled":{"description":"Inert."},"checks":{"description":"Validation rules."}},"description":"Picture tiles picking one or many values; options show `image` and `description`.","example":{"name":"design","options":[{"label":"Two columns","value":"two","description":"Pictures beside the text","image":"https://example.com/two.png"},{"label":"One column","value":"one","description":"Pictures under the text","image":"https://example.com/one.png"}],"value":"two"}},"Switch":{"props":{"label":{"description":"The text beside the switch."},"name":{"description":"The field's key in the submitted data."},"checked":{"description":"The state; bind it."},"description":{"description":"A muted line under the label."},"disabled":{"description":"Shows it inert."}},"description":"A labelled on/off switch; bind `checked`.","example":{"label":"Auto-scan","name":"autoScan","checked":true}},"Slider":{"props":{"label":{"description":"The field label."},"min":{"description":"The lowest value."},"max":{"description":"The highest value."},"step":{"description":"The increment."},"value":{"description":"The current value; bind it."}},"description":"A range slider between min and max; bind `value`.","example":{"label":"Volume","min":0,"max":100,"value":40}},"Rating":{"props":{"value":{"description":"The score, 0 to max."},"max":{"description":"How many stars (1 to 100)."},"readOnly":{"description":"Display only; no presses."},"size":{"description":"Star size."}},"description":"A row of stars scoring out of `max`; `readOnly` only displays.","example":{"value":3,"max":5}},"Select":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data."},"options":{"description":"Inline choices, or a path the host refills on `search`; omit with `source`."},"source":{"description":"A host list id (e.g. `exp:statuses`) that supplies the options."},"placeholder":{"description":"Shown while nothing is chosen."},"value":{"description":"The chosen value (comma-joined when multiple); bind it."},"multiple":{"description":"Allows several values."},"searchable":{"description":"Adds a filter field; typing fires `search`."},"emptyText":{"description":"Shown when the search matches nothing."},"disabled":{"description":"Shows it inert."},"checks":{"description":"Validation rules."},"validateOn":{"description":"When the checks run."}},"description":"A dropdown picker of one or many options; `searchable` = a filtering combobox, `source` = a host list.","example":{"label":"Board","name":"board","options":[{"label":"Backlog","value":"backlog"},{"label":"Sprint","value":"sprint"}],"value":"sprint"}},"SearchList":{"props":{"items":{"description":"The rows; refill on `search`."},"query":{"description":"The input text."},"placeholder":{"description":"The placeholder."},"value":{"description":"The picked value (a check)."},"emptyText":{"description":"Shown on no match."},"maxRows":{"description":"Rows before it scrolls."},"showCount":{"description":"A count while typing."}},"description":"A search field over rows: typing filters, arrows move, Enter picks.","example":{"placeholder":"Search issues","items":[{"label":"Ship the search list","value":"exp-12","identifier":"EXP-12","icon":"status-in-progress"},{"label":"Close tabs on hover","value":"exp-15","identifier":"EXP-15","icon":"status-done"}]}},"ChipInput":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data."},"values":{"description":"The entries; bind them."},"suggestions":{"description":"Completions offered while typing."},"placeholder":{"description":"Hint text while empty."},"max":{"description":"The most entries allowed."},"disabled":{"description":"Shows it inert."},"checks":{"description":"Validation rules."}},"description":"A multi-value field of removable chips (Enter or comma adds); bind `values`.","example":{"label":"Labels","name":"labels","values":["bug","ios"]}},"DatePicker":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data."},"value":{"description":"The chosen day as yyyy-mm-dd, or empty."},"min":{"description":"The earliest allowed day."},"max":{"description":"The latest allowed day."},"placeholder":{"description":"Shown while empty."},"firstDayOfWeek":{"description":"0 (Sunday) to 6; else the locale's."}},"description":"A calendar date field (ISO yyyy-mm-dd).","example":{"label":"Due","name":"due","value":"2026-10-14"}},"DateRangePicker":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data (`{start, end}`)."},"start":{"description":"The first day as yyyy-mm-dd, or empty."},"end":{"description":"The last day as yyyy-mm-dd, or empty."},"min":{"description":"The earliest allowed day."},"max":{"description":"The latest allowed day."},"placeholder":{"description":"Shown while empty."},"firstDayOfWeek":{"description":"0 (Sunday) to 6; else the locale's."}},"description":"A two-date range field with one calendar (ISO dates).","example":{"label":"Sprint","name":"sprint","start":"2026-10-07","end":"2026-10-21"}},"TimePicker":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data."},"value":{"description":"The time as `HH:mm`, or empty."},"min":{"description":"The earliest time, `HH:mm`."},"max":{"description":"The latest time, `HH:mm`."},"step":{"description":"Minutes between list entries."},"placeholder":{"description":"Shown while empty."},"disabled":{"description":"Shows it inert."}},"description":"A time-of-day field (`HH:mm`) picked from a list every `step` minutes, or typed.","example":{"label":"Starts","name":"startsAt","value":"09:30"}},"FileUpload":{"props":{"label":{"description":"The field label."},"name":{"description":"The field's key in the submitted data."},"accept":{"description":"Accepted types, comma-separated (`image/*,.pdf`)."},"multiple":{"description":"Allows more than one file."},"maxSize":{"description":"Max bytes per file; bigger ones are refused."},"files":{"description":"The attached files, each removable."},"hint":{"description":"Text under the drop zone's title."},"disabled":{"description":"Shows it inert."}},"description":"A drop zone with a browse button; files reach the host via `upload`, listed back in `files`.","example":{"label":"Attachments","name":"attachments","accept":"image/*","multiple":true}},"QrScanner":{"props":{"hint":{"description":"Muted line below."},"formats":{"description":"Code formats."},"label":{"description":"An accessibility label."},"disabled":{"description":"Stops scanning."}},"description":"A QR scanner viewfinder; the host camera fires `scanned {value}`.","example":{"hint":"Point at the code on your computer"}},"Composer":{"props":{"placeholder":{"description":"Hint text while empty."},"value":{"description":"The draft text; bind it."},"submitLabel":{"description":"The submit button's accessibility label."},"attachments":{"description":"Shows the attach control."},"busy":{"description":"Turns submit into a stop while a reply streams."}},"description":"The chat input box: a growing text field with a submit button and optional attachments.","example":{"placeholder":"Ask anything"}},"Row":{"props":{"title":{"description":"The main text."},"identifier":{"description":"A mono identifier before the title (`EXP-12`)."},"subtitle":{"description":"A muted second line."},"meta":{"description":"Trailing muted text (a count, a time)."},"value":{"description":"A trailing readable value (a property, a pick)."},"placeholder":{"description":"Muted trailing text while `value` is empty."},"icon":{"description":"The lead glyph (the `leading` slot replaces it)."},"chevron":{"description":"Trailing disclosure or picker glyph."},"selected":{"description":"Draws it as the active row."},"density":{"description":"Row height class."},"surface":{"description":"A flat row, or a padded card with its own fill and border."},"pressable":{"description":"Makes it a press target that fires `press` (an `on.press` implies it)."},"depth":{"description":"Depth under a tree Section (0 = root)."}},"description":"THE list row: a lead glyph or slot, a mono identifier, title and subtitle, trailing meta or value, a slot and a chevron; flat or card, nestable.","example":{"title":"r/selfhosted","meta":"312 posts","pressable":true}},"MessageBubble":{"props":{"text":{"description":"The message."},"side":{"description":"out = the viewer's."},"time":{"description":"Under the text."},"status":{"description":"Delivery, out only."},"author":{"description":"Caption above, in only."}},"description":"A chat message bubble, in (left) or out (right).","example":{"text":"Is the printer fixed?","side":"out","time":"18:00","status":"read"}},"TreeGuides":{"props":{"depth":{"description":"The row's nesting depth (0 = root)."},"elbowAt":{"description":"The gutter index that draws the elbow into this row; omit for a root."},"tee":{"description":"Continues the line past this row to a later sibling."},"passThrough":{"description":"Gutter indexes whose ancestor line continues straight through."}},"description":"The tree gutter a nested Row draws (filled by the core); never authored directly.","example":{"depth":1,"elbowAt":0,"tee":true,"passThrough":[]}},"Unknown":{"props":{"component":{"description":"The unmapped component's name."},"catalogId":{"description":"The catalog the component was authored against."}},"description":"A renderer's placeholder for an undefined component; never authored directly.","example":{"component":"Gauge"}},"Motion":{"props":{"layers":{"description":"The animation, top layer first, in the composition's px (origin top-left). Layer: {type: shape|solid|null|precomp|text, id?, parent?: id, in?/out? ms, transform?: {anchor, position [x,y], scale [100,100] %, rotation deg clockwise, opacity 0–100}, shapes: […], matte?: {source: id, mode: alpha|luma}, masks?: [{path, mode: add|subtract|intersect}]}. Shapes draw top first; a style paints every shape before it in its group: rect {position (centre), size, radius}, ellipse {position, size}, star|polygon {points, outerRadius, innerRadius}, path {d: SVG path data}; fill {color}, stroke {color, width, cap, join, dash: [len, gap]}, gradient-fill {kind: linear|radial, start, end, stops: [[0, colour], [1, colour]]}; trim {start, end, offset} (percent, draw-on lines), repeater {copies, transform}, round-corners {radius}; group {shapes, transform}. Colours: $color.* tokens (follow light/dark), #hex, or {light, dark}. Animate any value: {keys: [{t: ms, v: value, ease: linear|ease-in|ease-out|ease-in-out|hold|[x1,y1,x2,y2]}, …]}; tokens cannot animate. Keep it small; loops end on their first pose. No expressions."},"size":{"description":"The composition [width, height] px (with layers)."},"duration":{"description":"Length in ms (with layers)."},"fps":{"description":"Frames per second."},"assets":{"description":"Precomps {id: {layers}}."},"markers":{"description":"Named segments [{name, time, duration}] ms."},"lottie":{"description":"Lottie JSON instead of layers (no expressions)."},"src":{"description":"An attached .json or .lottie instead of layers."},"autoplay":{"description":"Plays when visible; false shows the poster."},"loop":{"description":"Repeats; false plays once and holds."},"plays":{"description":"Plays this many times (overrides loop)."},"direction":{"description":"Forward, reverse, or back and forth."},"speed":{"description":"Speed multiplier."},"segment":{"description":"Plays only [from, to] ms."},"marker":{"description":"Plays only this marker."},"progress":{"description":"Scrubs (0–1) instead of playing."},"play":{"description":"Pauses while false."},"poster":{"description":"The still frame (ms) for reduced motion and before play."},"fit":{"description":"How it fills the box."},"slots":{"description":"Lottie slot overrides {slotId: value}."},"stateMachine":{"description":"A dotLottie state machine driving playback (a .lottie src brings its own)."},"inputs":{"description":"State-machine inputs {name: value}; bind to drive states from data."},"label":{"description":"What it shows, for screen readers."},"style":{"description":"Extra Box styles for the box."}},"description":"A vector animation (Lottie-compatible) drawn identically everywhere: loaders, success states, illustrated empty states, small explainers.","example":{"size":[48,48],"duration":1000,"layers":[{"type":"shape","transform":{"position":[24,24],"rotation":{"keys":[{"t":0,"v":0},{"t":1000,"v":360}]}},"shapes":[{"type":"ellipse","size":[36,36]},{"type":"trim","end":70},{"type":"stroke","color":"$color.primary","width":4}]}]}}},"defs":{"option":{"properties":{"label":{"description":"The text shown for the option."},"value":{"description":"The stable value the selection reports."},"icon":{"description":"An icon shown before the label."},"disabled":{"description":"Shows the option but refuses it."},"description":{"description":"A second line."},"image":{"description":"A tile picture."},"count":{"description":"A badge on a bar item."}},"description":"One selectable option."},"check":{"properties":{"condition":{"description":"A function call or binding that must be true for the input to be valid."},"message":{"description":"The error shown when the condition is false."}},"description":"A client-side validation rule."},"tab":{"properties":{"label":{"description":"The tab title."},"value":{"description":"The value reported when the tab is active."},"icon":{"description":"An icon before the title."},"count":{"description":"A count badge after the title."}},"description":"One tab header."},"menuItem":{"properties":{"label":{"description":"The entry text (a separator has none)."},"value":{"description":"The value reported on select (actions and checkboxes)."},"kind":{"description":"What the entry is."},"icon":{"description":"An icon before the text."},"shortcut":{"description":"A key-cap hint after the text (`⌘K`)."},"checked":{"description":"A checkbox entry's state; bind it."},"destructive":{"description":"Styles the entry as a destructive action."},"disabled":{"description":"Shows the entry greyed and inert."},"items":{"description":"A submenu's entries (one level deep); bind it to rows a host source feeds (statuses, members, labels)."},"searchable":{"description":"Filters the submenu in a search list."},"placeholder":{"description":"A searchable submenu's placeholder."}},"description":"One menu entry: an action, a checkbox, a separator, a group label or a submenu."},"searchItem":{"properties":{"label":{"description":"The row title."},"value":{"description":"The value a pick reports."},"icon":{"description":"A leading glyph."},"identifier":{"description":"A mono id before the title (`EXP-12`)."},"disabled":{"description":"Refuses the row."}},"description":"One row of a search list."},"accordionItem":{"properties":{"title":{"description":"The section title."},"value":{"description":"The value reported when the section is open."},"count":{"description":"A count shown in the header."}},"description":"One collapsible section header; its body is the child at the same index."},"segment":{"properties":{"value":{"description":"The slice's share of max."},"tone":{"description":"The slice's colour tone."},"label":{"description":"What the slice stands for."}},"description":"One slice of a meter."},"series":{"properties":{"name":{"description":"The legend label."},"values":{"description":"One number per category."},"tone":{"description":"The series' colour tone; charts default to the chart hues in order."}},"description":"One chart series."},"pageItem":{"properties":{"title":{"description":"A caption over the page."}},"description":"One page of a carousel."},"step":{"properties":{"label":{"description":"The step name."},"description":{"description":"A muted line under the name."}},"description":"One wizard step."},"column":{"properties":{"key":{"description":"The row field it shows."},"label":{"description":"The header text."},"type":{"description":"How cells render: text, a locale number/currency/percent, a date, a relative time, a tick, a badge, or the named slot's component once per row."},"slot":{"description":"For `type: slot`: the Table slot whose component renders each cell with the row as its data scope."},"width":{"description":"A fixed width in px; otherwise columns share the width, never under 120 (a wider table scrolls)."},"align":{"description":"Cell alignment (numbers read best at `end`)."},"sortable":{"description":"Lets the header toggle the sort."},"currency":{"description":"ISO 4217 code of a currency column (USD)."},"decimals":{"description":"Fixed fraction digits of a number, currency or percent column."},"truncate":{"description":"One line with an ellipsis; cells wrap otherwise."}},"description":"One table column."},"sort":{"properties":{"key":{"description":"The sorted column's key."},"direction":{"description":"Ascending or descending."}},"description":"A table sort."},"panel":{"properties":{"min":{"description":"Smallest size (10)."},"max":{"description":"Largest size (100)."},"collapsible":{"description":"Drags to 0 below half its min; Enter on the handle toggles."}},"description":"One Resizable panel's limits, percent of the group."},"file":{"properties":{"name":{"description":"The file name."},"size":{"description":"Bytes."},"type":{"description":"The MIME type."},"url":{"description":"Where it was stored, for a preview link."}},"description":"One attached file."},"planStep":{"properties":{"title":{"description":"What the step does."},"detail":{"description":"A muted detail."},"icon":{"description":"The lead glyph."},"status":{"description":"The step's state."}},"description":"One step of a Plan."},"outlineItem":{"properties":{"id":{"description":"Reported by `select`."},"title":{"description":"The row text."},"count":{"description":"A muted count."}},"description":"One Outline row."},"picture":{"properties":{"src":{"description":"The image URL."},"alt":{"description":"The accessibility description."}},"description":"One picture of a Mosaic."}},"functions":{"core":{"percent":"The share of max as \"N%\", clamped to 0..100, two decimals; 0% when max is not positive.","add":"a + b; non-numbers count as 0.","sub":"a - b; non-numbers count as 0.","eq":"Strict equality of two values, except that a number equals a string spelling it (5 and \"5\"); nothing else coerces.","lt":"a < b as numbers.","clamp":"value as a number held inside [min, max]; a missing bound does not clamp; min wins when max < min.","cond":"`then` when `if` is truthy, else `else`.","fallback":"value unless it is missing (undefined or null), else default; a template's `{x|default}` over a bound x.","concat":"The values joined into one string (undefined and null as empty).","coalesce":"The first truthy value.","text":"The value as a string; no value when it is missing.","map":"cases[String(value)] when that case exists, else default.","len":"An array's or a string's length, else 0.","fill":"template with its {name} placeholders filled from params (unknown ones stay); a `$string.<id>` template resolves through the surface's string table first.","set":"Action only: writes value into the data model at path (a JSON pointer, relative to the node's data scope like a binding).","formatPercent":"A ratio as a locale percent through the surface Formatter (0.256 → 26%); decimals = fixed fraction digits.","formatRelativeTime":"A date (yyyy-mm-dd, ISO date-time or epoch ms) relative to now (epoch ms or a date; default the clock) through the surface Formatter: 3 minutes ago, yesterday, in 2 hours.","filter":"The items that match, in order: every `where` field equals its value (an empty value matches all) and `query` is a case-insensitive substring of one of `fields` (default every text field); bind a List or Table to it.","bind":"Action only (VAPP-122): re-follows path from source with params appended as its query (sourceWithParams); the package's sources allowlist applies and the earlier subscription at that path is cancelled.","mul":"a * b; numbers only (else no value).","div":"a / b; no value when b is 0.","mod":"a % b (sign of a); no value when b is 0.","round":"Half away from zero, to digits (0..10, default 0).","floor":"Rounded down.","ceil":"Rounded up.","abs":"The absolute value.","min":"The smallest of values.","max":"The largest of values.","today":"Today (YYYY-MM-DD) in the team time zone.","now":"Now as an ISO instant.","dateAdd":"date (YYYY-MM-DD or ISO instant) plus n whole units (second minute hour day week month quarter year; a day keeps the local time; month ends clamp).","dateDiff":"Whole units from a to b (b - a, truncated).","startOf":"The first day (or instant) of date's day, week (Monday), month, quarter or year.","endOf":"The last day (or instant) of that unit.","weekday":"1 = Monday … 7 = Sunday.","isoWeek":"The ISO week number.","hours":"minutes / 60.","formatDuration":"Hours as h:mm or hh:mm (7.5 → 7:30).","orElse":"The value, or default when it is missing (null): narrows an optional value.","expr":"Evaluates a CEL expression string (docs/package-format.md Expressions) over vars (name → value or binding): \"round(entries.sum / 60, 1)\"; default is shown when it fails (required in a package)."},"basic":{}}}"####;