Appbricx
Docs
FeaturesPricingStart free

Get started

OverviewWhat Appbricx isQuickstart with a coding agentQuickstart with the builderCore concepts

Guides

Data and tablesAccess and rolesBusiness rulesSign-inCustom screensRealtime and topicsWorkflows, schedules and webhooksServer functionsAI in your appPaymentsFilesMessagesIntegrationsVerifyPublishing, domains and rollbackOperating your appExport and self-hostSelf-host install

Tutorials

Build a booking app with Claude CodeMulti-user todo listClient portalSlack on new sign-upTemplates

Reference

Reference homeFrontend SDKHTTP APIMCP toolsCLIIntegrations catalogContract formatAI key resolutionRun Appbricx locally

Primitives

The presentational building blocks compositions and custom components are made of: layout, content, data display, charts, feedback, navigation, media, inputs, motion and decor. Each has a closed prop contract, generated here from the manifest.

178 primitivesSDK referenceGuide: Add your own screens and brand

On this page
  1. Layout
  2. Stack
  3. Row
  4. Grid
  5. Box
  6. Center
  7. Spacer
  8. Split
  9. Card
  10. Section
  11. Separator
  12. AspectRatio
  13. ScrollArea
  14. Collapsible
  15. Accordion
  16. Tabs
  17. Container
  18. Resizable
  19. Content
  20. Heading
  21. Text
  22. Display
  23. Lead
  24. Eyebrow
  25. Meta
  26. Value
  27. Code
  28. Kbd
  29. Badge
  30. Marker
  31. FieldLabel
  32. Quote
  33. BulletList
  34. Message
  35. ChatBubble
  36. Markdown
  37. Data display
  38. Stat
  39. StatGroup
  40. MetricCard
  41. Progress
  42. ProgressRing
  43. AnimatedNumber
  44. Avatar
  45. AvatarGroup
  46. Persona
  47. DataTable
  48. KeyValueList
  49. Timeline
  50. ActivityFeed
  51. MilestonePath
  52. Steps
  53. Rating
  54. PriceTag
  55. ListItem
  56. ItemList
  57. StructuredList
  58. Attachment
  59. EmptyState
  60. Skeleton
  61. Spinner
  62. QrCode
  63. IconBadge
  64. Charts
  65. AreaChart
  66. BarChart
  67. LineChart
  68. PieChart
  69. RadarChart
  70. RadialChart
  71. CalendarHeatmap
  72. ActivityHeatmap
  73. Sparkline
  74. BarStrip
  75. BarList
  76. Feedback
  77. Alert
  78. Banner
  79. Tooltip
  80. HoverCard
  81. Popover
  82. Dialog
  83. Sheet
  84. Drawer
  85. Navigation
  86. Button
  87. IconButton
  88. HeroButton
  89. TextLink
  90. Breadcrumb
  91. ButtonGroup
  92. DropdownMenu
  93. Dock
  94. Pagination
  95. Media and maps
  96. MapView
  97. Embed
  98. Image
  99. Icon
  100. IconDisk
  101. Carousel
  102. ImageMask
  103. BeforeAfter
  104. LogoStrip
  105. VideoPlayer
  106. SeedArt
  107. ShapeMark
  108. Inputs
  109. TextInput
  110. TextArea
  111. SearchInput
  112. PasswordInput
  113. NumberInput
  114. QuantityStepper
  115. Checkbox
  116. Switch
  117. Slider
  118. RadioGroup
  119. Select
  120. NativeSelect
  121. Combobox
  122. MultiSelect
  123. TagsInput
  124. Toggle
  125. ToggleGroup
  126. OptionWheel
  127. DatePicker
  128. Calendar
  129. OtpInput
  130. ColorPicker
  131. FileDrop
  132. Field
  133. RichTextEditor
  134. Motion
  135. TextReveal
  136. Marquee
  137. FadeIn
  138. Typewriter
  139. GradientHeading
  140. WordRelay
  141. WarpText
  142. ZoomWords
  143. WordStream
  144. FallingText
  145. ParticleText
  146. TextRibbon
  147. TypographyVortex
  148. VariableProximity
  149. ScrollReveal
  150. CaretSwap
  151. WritingCaret
  152. ScrollExpand
  153. FloatLayer
  154. Parallax
  155. ImageSwap
  156. Decor
  157. DotsBackground
  158. GridBackground
  159. PatternBackground
  160. ContoursBackground
  161. FoldsBackground
  162. PebblesBackground
  163. SproutsBackground
  164. SunwashBackground
  165. WeaveBackground
  166. AmbientBackground
  167. DepthBackground
  168. ContourField
  169. PigmentField
  170. PortalField
  171. ElasticMesh
  172. MetaBalls
  173. MagicRings
  174. Strands
  175. RippleDistortion
  176. ClickSpark
  177. GhostCursor
  178. SwarmCursor
  179. TargetCursor
  180. ImageTrail
  181. ShapeArtwork
  182. InfiniteSpiral
  183. OrbitImages
  184. DotMatrix
  185. GradientWash
  186. NoiseTexture
  187. AnimatedGradient
  188. ShaderGlow

Primitives receive values; they never fetch. In a JSON composition you bind props with $field, $agg, $each and $route; in a code component you import them from @app/kit/primitives and pass values from app.query or app.rows.

An invalid prop in a composition is dropped by the normalizer (with a note in the check report's fixes) rather than failing the build. Primitives marked leaf-only (stateful inputs) work only inside code components.

Code components may also import recharts, motion/react and qrcode.react directly, next to react, lucide-react and @app/kit/primitives.

Embed frames only these hosts: https://www.youtube-nocookie.comhttps://player.vimeo.comhttps://www.google.comhttps://www.loom.comhttps://www.figma.comhttps://calendly.comhttps://open.spotify.comhttps://form.typeform.comhttps://docs.google.comhttps://codepen.io

Layout

Stackapplandingauthleaf

Vertical flow of children.

PropTypeDescription
gapoptional"none" | "xs" | "sm" | "md" | "lg" | "xl"Space between children (default md).
alignoptional"stretch" | "start" | "center" | "end"

Slots: children

Example (code component)
import { Stack } from "@app/kit/primitives";

<Stack gap="sm" children={["One","Two"]} />
Composition node (tree)
{
  "Stack": {
    "gap": "sm",
    "children": [
      "One",
      "Two"
    ]
  }
}

Wraps kit

Rowapplandingauthleaf

Horizontal flow of children; wraps on small screens when wrap is true.

PropTypeDescription
gapoptional"none" | "xs" | "sm" | "md" | "lg" | "xl"Space between children (default md).
alignoptional"start" | "center" | "end" | "baseline" | "stretch"
justifyoptional"start" | "center" | "end" | "between"
wrapoptionalboolean

Slots: children

Example (code component)
import { Row } from "@app/kit/primitives";

<Row gap="sm" justify="between" children={["Left","Right"]} />
Composition node (tree)
{
  "Row": {
    "gap": "sm",
    "justify": "between",
    "children": [
      "Left",
      "Right"
    ]
  }
}

Wraps kit

Gridapplandingauthleaf

Responsive grid: `columns` at full width, clamped to the space it has (1 on phones, ≤2 in narrow panes).

PropTypeDescription
columnsoptionalnumber (1 to 12)Columns at full width (default 3).
gapoptional"none" | "xs" | "sm" | "md" | "lg" | "xl"Space between children (default md).

Slots: children

Example (code component)
import { Grid } from "@app/kit/primitives";

<Grid columns={2} children={["A","B","C"]} />
Composition node (tree)
{
  "Grid": {
    "columns": 2,
    "children": [
      "A",
      "B",
      "C"
    ]
  }
}

Wraps kit

Boxapplandingauthleaf

A padded region, optionally tinted/bordered — groups related content without a card's weight.

PropTypeDescription
paddingoptional"none" | "sm" | "md" | "lg"
toneoptional"none" | "muted" | "accent" | "info" | "positive" | "warning" | "danger"
borderoptionalboolean

Slots: children

Example (code component)
import { Box } from "@app/kit/primitives";

<Box padding="md" tone="muted" children={["Inside a box"]} />
Composition node (tree)
{
  "Box": {
    "padding": "md",
    "tone": "muted",
    "children": [
      "Inside a box"
    ]
  }
}

Wraps kit

Centerapplandingauthleaf

Centers its children both ways (hero moments, empty panels).

PropTypeDescription
minHeightoptionalnumber (0 to 1200)Minimum height in px.

Slots: children

Example (code component)
import { Center } from "@app/kit/primitives";

<Center minHeight={120} children={["Centered"]} />
Composition node (tree)
{
  "Center": {
    "minHeight": 120,
    "children": [
      "Centered"
    ]
  }
}

Wraps kit

Spacerapplandingauthleaf

Fixed vertical breathing room.

PropTypeDescription
sizeoptional"sm" | "md" | "lg" | "xl"
Example (code component)
import { Spacer } from "@app/kit/primitives";

<Spacer size="md" />
Composition node (tree)
{
  "Spacer": {
    "size": "md"
  }
}

Wraps kit

Splitapplandingauthleaf

Two columns side by side from lg up (main + aside).

PropTypeDescription
ratiooptional"1:1" | "2:1" | "1:2" | "3:1"
gapoptional"none" | "xs" | "sm" | "md" | "lg" | "xl"Space between children (default md).

Slots: children

Example (code component)
import { Split } from "@app/kit/primitives";

<Split ratio="2:1" children={["Main","Aside"]} />
Composition node (tree)
{
  "Split": {
    "ratio": "2:1",
    "children": [
      "Main",
      "Aside"
    ]
  }
}

Wraps kit

Cardapplandingauthleaf

The standard content surface: optional title/description header, body children, footer text.

PropTypeDescription
titleoptionalstring
descriptionoptionalstring
footeroptionalstring
variantoptional"default" | "featured" | "panel" | "tinted" | "ink"
toneoptional"neutral" | "pink" | "yellow" | "olive" | "blue"Paint for variant tinted.
sizeoptional"default" | "sm"
tooptionalapp routeMakes the whole card a link.

Slots: children

Example (code component)
import { Card } from "@app/kit/primitives";

<Card title="Morning flow" description="Mon · 7:00" children={["Body copy"]} />
Composition node (tree)
{
  "Card": {
    "title": "Morning flow",
    "description": "Mon · 7:00",
    "children": [
      "Body copy"
    ]
  }
}

Wraps o00h:card

Sectionapplandingauthleaf

A titled page section: eyebrow + section title + optional lead, then children.

PropTypeDescription
titlerequiredstring
eyebrowoptionalstring
descriptionoptionalstring

Slots: children

Example (code component)
import { Section } from "@app/kit/primitives";

<Section title="This week" eyebrow="Schedule" children={["…"]} />
Composition node (tree)
{
  "Section": {
    "title": "This week",
    "eyebrow": "Schedule",
    "children": [
      "…"
    ]
  }
}

Wraps o00h:typography, kit

Separatorapplandingauthleaf

A hairline divider.

PropTypeDescription
orientationoptional"horizontal" | "vertical"
Example (code component)
import { Separator } from "@app/kit/primitives";

<Separator />
Composition node (tree)
{
  "Separator": {}
}

Wraps o00h:separator

AspectRatioapplandingauthleaf

Holds children at a fixed ratio (media frames).

PropTypeDescription
ratiooptional"1:1" | "4:3" | "3:2" | "16:9" | "21:9" | "3:4"

Slots: children

Example (code component)
import { AspectRatio } from "@app/kit/primitives";

<AspectRatio ratio="16:9" children={["media"]} />
Composition node (tree)
{
  "AspectRatio": {
    "ratio": "16:9",
    "children": [
      "media"
    ]
  }
}

Wraps o00h:aspect-ratio

ScrollAreaapplandingauthleaf

A bounded scroll region with the kit's organic scrollbar.

PropTypeDescription
maxHeightoptionalnumber (80 to 1200)Max height in px (default 320).

Slots: children

Example (code component)
import { ScrollArea } from "@app/kit/primitives";

<ScrollArea maxHeight={120} children={["Row 1","Row 2"]} />
Composition node (tree)
{
  "ScrollArea": {
    "maxHeight": 120,
    "children": [
      "Row 1",
      "Row 2"
    ]
  }
}

Wraps o00h:scroll-area

Collapsibleapplandingauthleaf

A titled section the viewer can fold away.

PropTypeDescription
titlerequiredstring
defaultOpenoptionalboolean

Slots: children

Example (code component)
import { Collapsible } from "@app/kit/primitives";

<Collapsible title="Details" defaultOpen={true} children={["Hidden detail"]} />
Composition node (tree)
{
  "Collapsible": {
    "title": "Details",
    "defaultOpen": true,
    "children": [
      "Hidden detail"
    ]
  }
}

Wraps o00h:collapsible

Accordionapplandingauthleaf

Question/answer style disclosure list (FAQ, care notes).

PropTypeDescription
itemsrequiredArray<{ title: string; body: string }>
multipleoptionalbooleanAllow several open at once.
Example (code component)
import { Accordion } from "@app/kit/primitives";

<Accordion
  items={[{"title":"How often?","body":"Weekly."},{"title":"Where?","body":"Studio B."}]}
/>
Composition node (tree)
{
  "Accordion": {
    "items": [
      {
        "title": "How often?",
        "body": "Weekly."
      },
      {
        "title": "Where?",
        "body": "Studio B."
      }
    ]
  }
}

Wraps o00h:accordion

Tabsapplandingauthleaf

Switch between child panels; one label per child, in order.

PropTypeDescription
labelsrequiredstring[]
variantoptional"default" | "pills" | "underline" | "lenses" | "notebook"

Slots: children

Example (code component)
import { Tabs } from "@app/kit/primitives";

<Tabs labels={["Today","Week"]} children={["Today panel","Week panel"]} />
Composition node (tree)
{
  "Tabs": {
    "labels": [
      "Today",
      "Week"
    ],
    "children": [
      "Today panel",
      "Week panel"
    ]
  }
}

Wraps o00h:tabs

Containerapplandingauthleaf

Caps content width and centers it (landing sections, reading pages).

PropTypeDescription
sizeoptional"sm" | "md" | "lg" | "xl"

Slots: children

Example (code component)
import { Container } from "@app/kit/primitives";

<Container size="md" children={["Narrow column"]} />
Composition node (tree)
{
  "Container": {
    "size": "md",
    "children": [
      "Narrow column"
    ]
  }
}

Wraps otf:layouts/container

Resizableappleaf

Two panes with a draggable divider (editors, compare views).

PropTypeDescription
directionoptional"horizontal" | "vertical"

Slots: children

Example (code component)
import { Resizable } from "@app/kit/primitives";

<Resizable children={["Left pane","Right pane"]} />
Composition node (tree)
{
  "Resizable": {
    "children": [
      "Left pane",
      "Right pane"
    ]
  }
}

Wraps o00h:resizable

Content

Headingapplandingauthleaf

A heading at level 1-4 (1 = display, 2 = section, 3 = title, 4 = small).

PropTypeDescription
textrequiredstring
leveloptionalnumber (1 to 4)
alignoptional"start" | "center"
Example (code component)
import { Heading } from "@app/kit/primitives";

<Heading text="Your plants today" level={2} />
Composition node (tree)
{
  "Heading": {
    "text": "Your plants today",
    "level": 2
  }
}

Wraps o00h:typography

Textapplandingauthleaf

Body copy. tone=muted for secondary text; size sm/md/lg.

PropTypeDescription
textrequiredstring
toneoptional"default" | "muted" | "accent" | "positive" | "warning" | "danger"
sizeoptional"xs" | "sm" | "md" | "lg"
weightoptional"regular" | "medium" | "semibold" | "bold"
alignoptional"start" | "center" | "end"
truncateoptionalboolean
Example (code component)
import { Text } from "@app/kit/primitives";

<Text text="Water when the top inch is dry." tone="muted" />
Composition node (tree)
{
  "Text": {
    "text": "Water when the top inch is dry.",
    "tone": "muted"
  }
}

Wraps o00h:typography

Displaylandingauthleafapp

Oversized display headline (landing heroes).

PropTypeDescription
textrequiredstring
alignoptional"start" | "center"
Example (code component)
import { Display } from "@app/kit/primitives";

<Display text="Grow on schedule." />
Composition node (tree)
{
  "Display": {
    "text": "Grow on schedule."
  }
}

Wraps o00h:typography

Leadapplandingauthleaf

An intro paragraph under a heading.

PropTypeDescription
textrequiredstring
alignoptional"start" | "center"
Example (code component)
import { Lead } from "@app/kit/primitives";

<Lead text="Every class this week, at a glance." />
Composition node (tree)
{
  "Lead": {
    "text": "Every class this week, at a glance."
  }
}

Wraps o00h:typography

Eyebrowapplandingauthleaf

Small uppercase kicker above a heading.

PropTypeDescription
textrequiredstring
Example (code component)
import { Eyebrow } from "@app/kit/primitives";

<Eyebrow text="This week" />
Composition node (tree)
{
  "Eyebrow": {
    "text": "This week"
  }
}

Wraps o00h:typography

Metaapplandingauthleaf

Tiny secondary metadata (timestamps, counts).

PropTypeDescription
textrequiredstring
iconoptionalicon name
Example (code component)
import { Meta } from "@app/kit/primitives";

<Meta text="Updated 5 min ago" icon="Clock" />
Composition node (tree)
{
  "Meta": {
    "text": "Updated 5 min ago",
    "icon": "Clock"
  }
}

Wraps o00h:typography

Valueapplandingauthleaf

A tabular-number value inline (prices, measurements).

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "md" | "lg" | "xl"
Example (code component)
import { Value } from "@app/kit/primitives";

<Value text="$1,240" size="lg" />
Composition node (tree)
{
  "Value": {
    "text": "$1,240",
    "size": "lg"
  }
}

Wraps o00h:typography

Codeapplandingauthleaf

An inline identifier or code token.

PropTypeDescription
textrequiredstring
Example (code component)
import { Code } from "@app/kit/primitives";

<Code text="INV-2041" />
Composition node (tree)
{
  "Code": {
    "text": "INV-2041"
  }
}

Wraps o00h:typography

Kbdapplandingauthleaf

A keyboard key hint.

PropTypeDescription
textrequiredstring
Example (code component)
import { Kbd } from "@app/kit/primitives";

<Kbd text="⌘K" />
Composition node (tree)
{
  "Kbd": {
    "text": "⌘K"
  }
}

Wraps o00h:kbd

Badgeapplandingauthleaf

A small status/label pill. Bind text to an enum field for status.

PropTypeDescription
textrequiredstring
toneoptional"neutral" | "accent" | "info" | "positive" | "warning" | "danger"
appearanceoptional"pill" | "stamp" | "tag" | "counter"
iconoptionalicon name
Example (code component)
import { Badge } from "@app/kit/primitives";

<Badge text="Operational" tone="positive" />
Composition node (tree)
{
  "Badge": {
    "text": "Operational",
    "tone": "positive"
  }
}

Wraps o00h:badge

Markerapplandingauthleaf

A dot + label status marker (ok / danger / neutral).

PropTypeDescription
textrequiredstring
toneoptional"neutral" | "positive" | "danger"
Example (code component)
import { Marker } from "@app/kit/primitives";

<Marker text="Live" tone="positive" />
Composition node (tree)
{
  "Marker": {
    "text": "Live",
    "tone": "positive"
  }
}

Wraps o00h:marker

FieldLabelapplandingauthleaf

A small label paired with a value (key: value rows).

PropTypeDescription
textrequiredstring
Example (code component)
import { FieldLabel } from "@app/kit/primitives";

<FieldLabel text="Next watering" />
Composition node (tree)
{
  "FieldLabel": {
    "text": "Next watering"
  }
}

Wraps o00h:label

Quoteapplandingauthleaf

A pull quote / testimonial line with attribution.

PropTypeDescription
textrequiredstring
citeoptionalstring
Example (code component)
import { Quote } from "@app/kit/primitives";

<Quote text="Best class schedule in town." cite="Maya, member" />
Composition node (tree)
{
  "Quote": {
    "text": "Best class schedule in town.",
    "cite": "Maya, member"
  }
}

Wraps kit

BulletListapplandingauthleaf

A short bulleted or checked list of strings.

PropTypeDescription
itemsrequiredstring[]
markeroptional"dot" | "check" | "number"
Example (code component)
import { BulletList } from "@app/kit/primitives";

<BulletList items={["Bright, indirect light","Water weekly"]} marker="check" />
Composition node (tree)
{
  "BulletList": {
    "items": [
      "Bright, indirect light",
      "Water weekly"
    ],
    "marker": "check"
  }
}

Wraps kit

Messageapplandingauthleaf

A notice-style message row with title and description.

PropTypeDescription
titlerequiredstring
textoptionalstring
mineoptionalboolean
Example (code component)
import { Message } from "@app/kit/primitives";

<Message title="Coach Dana" text="Bring a mat tomorrow." />
Composition node (tree)
{
  "Message": {
    "title": "Coach Dana",
    "text": "Bring a mat tomorrow."
  }
}

Wraps o00h:message

ChatBubbleapplandingauthleaf

A chat bubble; mine=true aligns right in the accent colour.

PropTypeDescription
textrequiredstring
mineoptionalboolean
timeoptionalstring
Example (code component)
import { ChatBubble } from "@app/kit/primitives";

<ChatBubble text="See you at 7!" mine={true} time="6:42" />
Composition node (tree)
{
  "ChatBubble": {
    "text": "See you at 7!",
    "mine": true,
    "time": "6:42"
  }
}

Wraps o00h:bubble

Markdownapplandingauthleaf

Renders markdown text safely (headings, bold/italic, lists, task lists, quotes, code, links, https images) — raw HTML shows as text, unsafe link schemes are dropped. Pair with RichTextEditor; store the markdown as a text field.

PropTypeDescription
textrequiredstringMarkdown source.
sizeoptional"sm" | "md"
Example (code component)
import { Markdown } from "@app/kit/primitives";

<Markdown
  text="## Care notes\n\nWater **weekly**; mist in *summer*.\n\n- Bright, indirect light\n- [x] Repotted\n\n[Guide](https://example.com/monstera)"
/>
Composition node (tree)
{
  "Markdown": {
    "text": "## Care notes\n\nWater **weekly**; mist in *summer*.\n\n- Bright, indirect light\n- [x] Repotted\n\n[Guide](https://example.com/monstera)"
  }
}

Wraps kit

Data display

Statapplandingauthleaf

One labelled number (bind value to a $field or $agg; set format there).

PropTypeDescription
labelrequiredstring
valuerequiredstringAlready formatted — use the binding's format.
hintoptionalstringSmall line under the value.
iconoptionalicon name
trendoptional"none" | "up" | "down"
emphasisoptional"default" | "underline"
Example (code component)
import { Stat } from "@app/kit/primitives";

<Stat label="Classes this week" value="42" hint="+6 vs last week" trend="up" />
Composition node (tree)
{
  "Stat": {
    "label": "Classes this week",
    "value": "42",
    "hint": "+6 vs last week",
    "trend": "up"
  }
}

Wraps o00h:label

StatGroupapplandingauthleaf

A wrapping row of Stat children.

No props.

Slots: children

Example (code component)
import { StatGroup } from "@app/kit/primitives";

<StatGroup children={["stat A","stat B"]} />
Composition node (tree)
{
  "StatGroup": {
    "children": [
      "stat A",
      "stat B"
    ]
  }
}

Wraps o00h:label

MetricCardapplandingauthleaf

A KPI card: label, big value, change chip, optional icon.

PropTypeDescription
labelrequiredstring
valuerequiredstring
changeoptionalstring
trendoptional"up" | "down"
iconoptionalicon name
Example (code component)
import { MetricCard } from "@app/kit/primitives";

<MetricCard
  label="Uptime (30d)"
  value="99.98%"
  change="+0.02%"
  trend="up"
  icon="Activity"
/>
Composition node (tree)
{
  "MetricCard": {
    "label": "Uptime (30d)",
    "value": "99.98%",
    "change": "+0.02%",
    "trend": "up",
    "icon": "Activity"
  }
}

Wraps otf:blocks/metric-card

Progressapplandingauthleaf

A progress bar (value of max).

PropTypeDescription
valuerequirednumber
maxoptionalnumber
labeloptionalstring
appearanceoptional"organic" | "line" | "segmented" | "orbit"
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { Progress } from "@app/kit/primitives";

<Progress value={7} max={10} label="7 of 10 plants watered" />
Composition node (tree)
{
  "Progress": {
    "value": 7,
    "max": 10,
    "label": "7 of 10 plants watered"
  }
}

Wraps o00h:progress

ProgressRingapplandingauthleaf

A circular progress ring with a centre label — streaks, goals, completion.

PropTypeDescription
valuerequirednumber
maxoptionalnumber
labeloptionalstringCentre text (defaults to the percentage).
captionoptionalstringLine under the ring.
sizeoptional"sm" | "md" | "lg"
toneoptional"neutral" | "accent" | "info" | "positive" | "warning" | "danger"
Example (code component)
import { ProgressRing } from "@app/kit/primitives";

<ProgressRing value={5} max={7} label="5d" caption="Watering streak" tone="positive" />
Composition node (tree)
{
  "ProgressRing": {
    "value": 5,
    "max": 7,
    "label": "5d",
    "caption": "Watering streak",
    "tone": "positive"
  }
}

Wraps kit

AnimatedNumberapplandingauthleaf

A number that counts up to its value (hero stats).

PropTypeDescription
valuerequirednumber
formatoptional"number" | "currency" | "percent"
treatmentoptional"count" | "roll" | "steps"
Example (code component)
import { AnimatedNumber } from "@app/kit/primitives";

<AnimatedNumber value={1287} format="number" />
Composition node (tree)
{
  "AnimatedNumber": {
    "value": 1287,
    "format": "number"
  }
}

Wraps o00h:animated-number

Avatarapplandingauthleaf

A person's picture, or their initials when there is no image.

PropTypeDescription
namerequiredstring
imageoptionalstring (image URL)
sizeoptional"sm" | "default" | "lg"
shapeoptional"circle" | "rounded" | "pebble"
Example (code component)
import { Avatar } from "@app/kit/primitives";

<Avatar name="Dana Ruiz" size="default" />
Composition node (tree)
{
  "Avatar": {
    "name": "Dana Ruiz",
    "size": "default"
  }
}

Wraps o00h:avatar

AvatarGroupapplandingauthleaf

Overlapping initials for a few people, with +N overflow.

PropTypeDescription
namesrequiredstring[]
maxoptionalnumber (1 to 8)
Example (code component)
import { AvatarGroup } from "@app/kit/primitives";

<AvatarGroup names={["Ana Li","Bo Kim","Cy Ng","Di Ho"]} max={3} />
Composition node (tree)
{
  "AvatarGroup": {
    "names": [
      "Ana Li",
      "Bo Kim",
      "Cy Ng",
      "Di Ho"
    ],
    "max": 3
  }
}

Wraps o00h:avatar

Personaapplandingauthleaf

Avatar + name + subtitle (who owns / who did it).

PropTypeDescription
namerequiredstring
subtitleoptionalstring
imageoptionalstring (image URL)
sizeoptional"sm" | "md" | "lg"
Example (code component)
import { Persona } from "@app/kit/primitives";

<Persona name="Coach Dana" subtitle="Yoga · Studio B" />
Composition node (tree)
{
  "Persona": {
    "name": "Coach Dana",
    "subtitle": "Yoga · Studio B"
  }
}

Wraps otf:components/persona

DataTableapplandingauthleaf

A plain read-only table over rows (use an EntityList BLOCK for real record lists).

PropTypeDescription
columnsrequiredstring[]Row keys to show, in order.
headersoptionalstring[]Header copy per column (defaults to the key).
rowsrequiredArray<{ *: string }>
appearanceoptional"ledger" | "rich" | "comparison"
Example (code component)
import { DataTable } from "@app/kit/primitives";

<DataTable
  columns={["name","status"]}
  headers={["Service","Status"]}
  rows={[{"name":"API","status":"Up"},{"name":"Web","status":"Up"}]}
/>
Composition node (tree)
{
  "DataTable": {
    "columns": [
      "name",
      "status"
    ],
    "headers": [
      "Service",
      "Status"
    ],
    "rows": [
      {
        "name": "API",
        "status": "Up"
      },
      {
        "name": "Web",
        "status": "Up"
      }
    ]
  }
}

Wraps o00h:table

KeyValueListapplandingauthleaf

Label/value pairs (a record's facts).

PropTypeDescription
itemsrequiredArray<{ label: string; value: string }>
orientationoptional"horizontal" | "vertical"
Example (code component)
import { KeyValueList } from "@app/kit/primitives";

<KeyValueList
  items={[{"label":"Light","value":"Bright, indirect"},{"label":"Water","value":"Weekly"}]}
/>
Composition node (tree)
{
  "KeyValueList": {
    "items": [
      {
        "label": "Light",
        "value": "Bright, indirect"
      },
      {
        "label": "Water",
        "value": "Weekly"
      }
    ]
  }
}

Wraps otf:components/property-list

Timelineapplandingauthleaf

A vertical sequence of dated events.

PropTypeDescription
itemsrequiredArray<{ title: string; description: string; time: string; tone: string }>
Example (code component)
import { Timeline } from "@app/kit/primitives";

<Timeline
  items={[{"title":"Repotted","time":"Mar 2"},{"title":"Fertilised","time":"Mar 9"}]}
/>
Composition node (tree)
{
  "Timeline": {
    "items": [
      {
        "title": "Repotted",
        "time": "Mar 2"
      },
      {
        "title": "Fertilised",
        "time": "Mar 9"
      }
    ]
  }
}

Wraps otf:components/timeline

ActivityFeedapplandingauthleaf

Who-did-what feed with actors and timestamps.

PropTypeDescription
titleoptionalstring
entriesrequiredArray<{ title: string; description: string; actor: string; time: string; badge: string }>
emptyoptionalstring
Example (code component)
import { ActivityFeed } from "@app/kit/primitives";

<ActivityFeed
  title="Recent"
  entries={[{"title":"Booked Spin 7am","actor":"Maya","time":"2h ago"}]}
/>
Composition node (tree)
{
  "ActivityFeed": {
    "title": "Recent",
    "entries": [
      {
        "title": "Booked Spin 7am",
        "actor": "Maya",
        "time": "2h ago"
      }
    ]
  }
}

Wraps o00h:activity-feed

MilestonePathapplandingauthleaf

An ordered journey with complete / current / upcoming milestones.

PropTypeDescription
titleoptionalstring
itemsrequiredArray<{ title: string; description: string; state: string; meta: string }>
presentationoptional"journey" | "sequence" | "review"
Example (code component)
import { MilestonePath } from "@app/kit/primitives";

<MilestonePath
  items={[{"title":"Sprout","state":"complete"},{"title":"First leaf","state":"current"},{"title":"Bloom","state":"upcoming"}]}
/>
Composition node (tree)
{
  "MilestonePath": {
    "items": [
      {
        "title": "Sprout",
        "state": "complete"
      },
      {
        "title": "First leaf",
        "state": "current"
      },
      {
        "title": "Bloom",
        "state": "upcoming"
      }
    ]
  }
}

Wraps o00h:milestone-path

Stepsapplandingauthleaf

A numbered step indicator (where the viewer is in a process).

PropTypeDescription
labelsrequiredstring[]
currentoptionalnumber (1 to …)
presentationoptional"rail" | "ledger" | "compact"
Example (code component)
import { Steps } from "@app/kit/primitives";

<Steps labels={["Pick class","Confirm","Done"]} current={2} />
Composition node (tree)
{
  "Steps": {
    "labels": [
      "Pick class",
      "Confirm",
      "Done"
    ],
    "current": 2
  }
}

Wraps o00h:stepper

Ratingapplandingauthleaf

Read-only star rating.

PropTypeDescription
valuerequirednumber
maxoptionalnumber (1 to 10)
sizeoptional"sm" | "md" | "lg"
Example (code component)
import { Rating } from "@app/kit/primitives";

<Rating value={4.5} max={5} />
Composition node (tree)
{
  "Rating": {
    "value": 4.5,
    "max": 5
  }
}

Wraps otf:primitives/rating

PriceTagapplandingauthleaf

A price, optionally with a struck compare-at price and discount chip.

PropTypeDescription
amountrequirednumber
compareAtoptionalnumber
sizeoptional"sm" | "md" | "lg"
Example (code component)
import { PriceTag } from "@app/kit/primitives";

<PriceTag amount={24} compareAt={30} />
Composition node (tree)
{
  "PriceTag": {
    "amount": 24,
    "compareAt": 30
  }
}

Wraps otf:primitives/price-tag

ListItemapplandingauthleaf

A list row: icon, title, description, trailing meta; links when `to` is set.

PropTypeDescription
titlerequiredstring
descriptionoptionalstring
metaoptionalstring
iconoptionalicon name
imageoptionalstring (image URL)
tooptionalapp route
Example (code component)
import { ListItem } from "@app/kit/primitives";

<ListItem
  title="Fiddle-leaf fig"
  description="Living room"
  meta="in 2d"
  icon="Sparkles"
/>
Composition node (tree)
{
  "ListItem": {
    "title": "Fiddle-leaf fig",
    "description": "Living room",
    "meta": "in 2d",
    "icon": "Sparkles"
  }
}

Wraps o00h:item

ItemListapplandingauthleaf

Groups ListItem children into one bordered list.

No props.

Slots: children

Example (code component)
import { ItemList } from "@app/kit/primitives";

<ItemList children={["row 1","row 2"]} />
Composition node (tree)
{
  "ItemList": {
    "children": [
      "row 1",
      "row 2"
    ]
  }
}

Wraps o00h:item

StructuredListapplandingauthleaf

A titled settings-style list of rows with description and right-hand value.

PropTypeDescription
titleoptionalstring
itemsrequiredArray<{ title: string; description: string; value: string }>
Example (code component)
import { StructuredList } from "@app/kit/primitives";

<StructuredList
  title="Care"
  items={[{"title":"Light","value":"Indirect"},{"title":"Humidity","value":"60%"}]}
/>
Composition node (tree)
{
  "StructuredList": {
    "title": "Care",
    "items": [
      {
        "title": "Light",
        "value": "Indirect"
      },
      {
        "title": "Humidity",
        "value": "60%"
      }
    ]
  }
}

Wraps otf:components/structured-list

Attachmentapplandingauthleaf

A file chip: type, name, meta.

PropTypeDescription
namerequiredstring
typeoptionalstring
metaoptionalstring
Example (code component)
import { Attachment } from "@app/kit/primitives";

<Attachment name="invoice-0412.pdf" type="PDF" meta="120 KB" />
Composition node (tree)
{
  "Attachment": {
    "name": "invoice-0412.pdf",
    "type": "PDF",
    "meta": "120 KB"
  }
}

Wraps o00h:attachment

EmptyStateapplandingauthleaf

Nothing-here-yet panel with authored copy.

PropTypeDescription
titlerequiredstring
descriptionoptionalstring
variantoptional"default" | "partial" | "error" | "filtered"
iconoptionalicon name
Example (code component)
import { EmptyState } from "@app/kit/primitives";

<EmptyState title="No classes today" description="The studio is resting." />
Composition node (tree)
{
  "EmptyState": {
    "title": "No classes today",
    "description": "The studio is resting."
  }
}

Wraps o00h:empty

Skeletonapplandingauthleaf

Loading placeholder lines.

PropTypeDescription
linesoptionalnumber (1 to 8)
variantoptional"default" | "pill" | "card" | "disk" | "line"
Example (code component)
import { Skeleton } from "@app/kit/primitives";

<Skeleton lines={2} />
Composition node (tree)
{
  "Skeleton": {
    "lines": 2
  }
}

Wraps o00h:skeleton

Spinnerapplandingauthleaf

Busy indicator with optional label.

PropTypeDescription
labeloptionalstring
Example (code component)
import { Spinner } from "@app/kit/primitives";

<Spinner label="Loading" />
Composition node (tree)
{
  "Spinner": {
    "label": "Loading"
  }
}

Wraps o00h:spinner

QrCodeapplandingauthleaf

A QR code for a value (ticket codes, links).

PropTypeDescription
valuerequiredstring
sizeoptionalnumber (64 to 320)
Example (code component)
import { QrCode } from "@app/kit/primitives";

<QrCode value="TICKET-8812" size={96} />
Composition node (tree)
{
  "QrCode": {
    "value": "TICKET-8812",
    "size": 96
  }
}

Wraps otf:primitives/qr-code

IconBadgeapplandingauthleaf

An icon in a tinted square (feature/stat adornment).

PropTypeDescription
iconrequiredicon name
toneoptional"neutral" | "accent" | "positive" | "warning" | "danger"
sizeoptional"sm" | "md" | "lg"
Example (code component)
import { IconBadge } from "@app/kit/primitives";

<IconBadge icon="Dumbbell" tone="accent" />
Composition node (tree)
{
  "IconBadge": {
    "icon": "Dumbbell",
    "tone": "accent"
  }
}

Wraps otf:components/icon-badge

Charts

AreaChartapplandingauthleaf

Trend over an ordered axis, filled.

PropTypeDescription
datarequiredArray<{ label: string; value: number }>[{label, value}] points (value2 optional for a second series). Trends: {$agg: {entity, metric, groupBy: <date field>, bucket: day|week|month, range?: this_month|this_quarter|this_year…}} — grouped server-side over the whole table.
captionrequiredstringAccessible chart title.
seriesLabeloptionalstringLegend name of `value`.
series2LabeloptionalstringLegend name of `value2` when points carry one.
formatoptional"number" | "currency" | "percent"
variantoptional"linear" | "step" | "stacked"
Example (code component)
import { AreaChart } from "@app/kit/primitives";

<AreaChart
  caption="Bookings by day"
  data={[{"label":"Mon","value":12},{"label":"Tue","value":18},{"label":"Wed","value":9}]}
/>
Composition node (tree)
{
  "AreaChart": {
    "caption": "Bookings by day",
    "data": [
      {
        "label": "Mon",
        "value": 12
      },
      {
        "label": "Tue",
        "value": 18
      },
      {
        "label": "Wed",
        "value": 9
      }
    ]
  }
}

Wraps o00h:area-chart

BarChartapplandingauthleaf

Compare values across categories.

PropTypeDescription
datarequiredArray<{ label: string; value: number }>[{label, value}] points (value2 optional for a second series). Trends: {$agg: {entity, metric, groupBy: <date field>, bucket: day|week|month, range?: this_month|this_quarter|this_year…}} — grouped server-side over the whole table.
captionrequiredstringAccessible chart title.
seriesLabeloptionalstringLegend name of `value`.
series2LabeloptionalstringLegend name of `value2` when points carry one.
formatoptional"number" | "currency" | "percent"
variantoptional"grouped" | "stacked" | "horizontal"
Example (code component)
import { BarChart } from "@app/kit/primitives";

<BarChart
  caption="Bookings by day"
  data={[{"label":"Mon","value":12},{"label":"Tue","value":18},{"label":"Wed","value":9}]}
/>
Composition node (tree)
{
  "BarChart": {
    "caption": "Bookings by day",
    "data": [
      {
        "label": "Mon",
        "value": 12
      },
      {
        "label": "Tue",
        "value": 18
      },
      {
        "label": "Wed",
        "value": 9
      }
    ]
  }
}

Wraps o00h:bar-chart

LineChartapplandingauthleaf

Trend line(s) over time.

PropTypeDescription
datarequiredArray<{ label: string; value: number }>[{label, value}] points (value2 optional for a second series). Trends: {$agg: {entity, metric, groupBy: <date field>, bucket: day|week|month, range?: this_month|this_quarter|this_year…}} — grouped server-side over the whole table.
captionrequiredstringAccessible chart title.
seriesLabeloptionalstringLegend name of `value`.
series2LabeloptionalstringLegend name of `value2` when points carry one.
formatoptional"number" | "currency" | "percent"
variantoptional"linear" | "smooth" | "step"
Example (code component)
import { LineChart } from "@app/kit/primitives";

<LineChart
  caption="Bookings by day"
  data={[{"label":"Mon","value":12},{"label":"Tue","value":18},{"label":"Wed","value":9}]}
/>
Composition node (tree)
{
  "LineChart": {
    "caption": "Bookings by day",
    "data": [
      {
        "label": "Mon",
        "value": 12
      },
      {
        "label": "Tue",
        "value": 18
      },
      {
        "label": "Wed",
        "value": 9
      }
    ]
  }
}

Wraps o00h:line-chart

PieChartapplandingauthleaf

Share of a whole (≤6 slices).

PropTypeDescription
datarequiredArray<{ label: string; value: number }>[{label, value}] points (value2 optional for a second series). Trends: {$agg: {entity, metric, groupBy: <date field>, bucket: day|week|month, range?: this_month|this_quarter|this_year…}} — grouped server-side over the whole table.
captionrequiredstringAccessible chart title.
variantoptional"pie" | "donut"
formatoptional"number" | "currency" | "percent"
Example (code component)
import { PieChart } from "@app/kit/primitives";

<PieChart
  caption="Plants by room"
  data={[{"label":"Kitchen","value":3},{"label":"Bedroom","value":5}]}
/>
Composition node (tree)
{
  "PieChart": {
    "caption": "Plants by room",
    "data": [
      {
        "label": "Kitchen",
        "value": 3
      },
      {
        "label": "Bedroom",
        "value": 5
      }
    ]
  }
}

Wraps o00h:pie-chart

RadarChartapplandingauthleaf

Profile across 3-8 dimensions.

PropTypeDescription
datarequiredArray<{ label: string; value: number }>[{label, value}] points (value2 optional for a second series). Trends: {$agg: {entity, metric, groupBy: <date field>, bucket: day|week|month, range?: this_month|this_quarter|this_year…}} — grouped server-side over the whole table.
captionrequiredstringAccessible chart title.
seriesLabeloptionalstringLegend name of `value`.
maxoptionalnumber
variantoptional"polygon" | "rounded" | "grid"
Example (code component)
import { RadarChart } from "@app/kit/primitives";

<RadarChart
  caption="Fitness profile"
  data={[{"label":"Cardio","value":7},{"label":"Strength","value":5},{"label":"Mobility","value":8}]}
/>
Composition node (tree)
{
  "RadarChart": {
    "caption": "Fitness profile",
    "data": [
      {
        "label": "Cardio",
        "value": 7
      },
      {
        "label": "Strength",
        "value": 5
      },
      {
        "label": "Mobility",
        "value": 8
      }
    ]
  }
}

Wraps o00h:radar-chart

RadialChartapplandingauthleaf

Progress rings against a max (goal completion per item).

PropTypeDescription
datarequiredArray<{ label: string; value: number }>[{label, value}] points (value2 optional for a second series). Trends: {$agg: {entity, metric, groupBy: <date field>, bucket: day|week|month, range?: this_month|this_quarter|this_year…}} — grouped server-side over the whole table.
captionrequiredstringAccessible chart title.
maxoptionalnumber
variantoptional"full" | "semicircle"
Example (code component)
import { RadialChart } from "@app/kit/primitives";

<RadialChart
  caption="Weekly goals"
  max={100}
  data={[{"label":"Water","value":80},{"label":"Feed","value":40}]}
/>
Composition node (tree)
{
  "RadialChart": {
    "caption": "Weekly goals",
    "max": 100,
    "data": [
      {
        "label": "Water",
        "value": 80
      },
      {
        "label": "Feed",
        "value": 40
      }
    ]
  }
}

Wraps o00h:radial-chart

CalendarHeatmapapplandingauthleaf

GitHub-style day grid over recent weeks (activity per date).

PropTypeDescription
datarequiredArray<{ date: string; value: number }>[{date: YYYY-MM-DD, value}]
weeksoptionalnumber (4 to 53)
showLegendoptionalboolean
Example (code component)
import { CalendarHeatmap } from "@app/kit/primitives";

<CalendarHeatmap
  weeks={8}
  data={[{"date":"2026-09-01","value":2},{"date":"2026-09-02","value":5}]}
/>
Composition node (tree)
{
  "CalendarHeatmap": {
    "weeks": 8,
    "data": [
      {
        "date": "2026-09-01",
        "value": 2
      },
      {
        "date": "2026-09-02",
        "value": 5
      }
    ]
  }
}

Wraps otf:charts/heatmap

ActivityHeatmapapplandingauthleaf

A captioned calendar heatmap card with a headline total.

PropTypeDescription
totalrequiredstring
captionoptionalstring
datarequiredArray<{ date: string; value: number }>
weeksoptionalnumber (4 to 53)
Example (code component)
import { ActivityHeatmap } from "@app/kit/primitives";

<ActivityHeatmap
  total="128"
  caption="check-ins this season"
  weeks={8}
  data={[{"date":"2026-09-01","value":3}]}
/>
Composition node (tree)
{
  "ActivityHeatmap": {
    "total": "128",
    "caption": "check-ins this season",
    "weeks": 8,
    "data": [
      {
        "date": "2026-09-01",
        "value": 3
      }
    ]
  }
}

Wraps otf:blocks/activity-heatmap

Sparklineapplandingauthleaf

A tiny inline trend (inside stats and list rows).

PropTypeDescription
datarequiredArray<{ label: string; value: number }>[{label, value}] points (value2 optional for a second series). Trends: {$agg: {entity, metric, groupBy: <date field>, bucket: day|week|month, range?: this_month|this_quarter|this_year…}} — grouped server-side over the whole table.
typeoptional"line" | "area"
heightoptionalnumber (16 to 120)
Example (code component)
import { Sparkline } from "@app/kit/primitives";

<Sparkline
  data={[{"label":"1","value":3},{"label":"2","value":6},{"label":"3","value":4}]}
/>
Composition node (tree)
{
  "Sparkline": {
    "data": [
      {
        "label": "1",
        "value": 3
      },
      {
        "label": "2",
        "value": 6
      },
      {
        "label": "3",
        "value": 4
      }
    ]
  }
}

Wraps otf:charts/sparkline

BarStripapplandingauthleaf

A strip of N small colored cells, oldest → newest: uptime history, daily check-ins, one heatmap row. Values are numbers (colored by thresholds or intensity) or tone words (up/degraded/down, done/missed, positive/warning/danger).

PropTypeDescription
datarequiredArray<{ label: string; value: string }>[{label, value}] one cell per point — bind with $each + map (value: {$field, map: {down: "danger"}}) or $agg groupBy with bucket.
captionrequiredstringWhat the strip shows (accessible name, shown above).
cellsoptionalnumber (1 to 120)Show the LAST n points (default 90).
goodAboveoptionalnumberNumeric values ≥ this are positive (e.g. 99.9 for uptime %).
warnAboveoptionalnumberNumeric values ≥ this (and < goodAbove) are warning; lower is danger.
summaryoptionalstringRight-aligned headline ("99.95% uptime").
showRangeoptionalbooleanFirst/last labels under the strip (default true).
Example (code component)
import { BarStrip } from "@app/kit/primitives";

<BarStrip
  caption="API uptime"
  summary="99.9% uptime"
  goodAbove={99.9}
  warnAbove={99}
  data={[{"label":"Sep 1","value":100},{"label":"Sep 2","value":99.95},{"label":"Sep 3","value":98.2},{"label":"Sep 4","value":"degraded"},{"label":"Sep 5","value":"up"}]}
/>
Composition node (tree)
{
  "BarStrip": {
    "caption": "API uptime",
    "summary": "99.9% uptime",
    "goodAbove": 99.9,
    "warnAbove": 99,
    "data": [
      {
        "label": "Sep 1",
        "value": 100
      },
      {
        "label": "Sep 2",
        "value": 99.95
      },
      {
        "label": "Sep 3",
        "value": 98.2
      },
      {
        "label": "Sep 4",
        "value": "degraded"
      },
      {
        "label": "Sep 5",
        "value": "up"
      }
    ]
  }
}

Wraps kit

BarListapplandingauthleaf

Ranked horizontal bars with labels (top-N lists).

PropTypeDescription
datarequiredArray<{ label: string; value: number }>[{label, value}] points (value2 optional for a second series). Trends: {$agg: {entity, metric, groupBy: <date field>, bucket: day|week|month, range?: this_month|this_quarter|this_year…}} — grouped server-side over the whole table.
formatoptional"number" | "currency" | "percent"
emptyMessageoptionalstring
Example (code component)
import { BarList } from "@app/kit/primitives";

<BarList data={[{"label":"Spin","value":32},{"label":"Yoga","value":21}]} />
Composition node (tree)
{
  "BarList": {
    "data": [
      {
        "label": "Spin",
        "value": 32
      },
      {
        "label": "Yoga",
        "value": 21
      }
    ]
  }
}

Wraps otf:blocks/bar-list

Feedback

Alertapplandingauthleaf

An inline notice with title + description in a status tone.

PropTypeDescription
titlerequiredstring
descriptionoptionalstring
toneoptional"neutral" | "info" | "positive" | "warning" | "danger" | "accent"
presentationoptional"note" | "banner" | "dispatch"
iconoptionalicon name
Example (code component)
import { Alert } from "@app/kit/primitives";

<Alert
  title="Degraded performance"
  description="API latency is elevated."
  tone="warning"
/>
Composition node (tree)
{
  "Alert": {
    "title": "Degraded performance",
    "description": "API latency is elevated.",
    "tone": "warning"
  }
}

Wraps o00h:alert

Bannerapplandingauthleaf

A full-width announcement strip.

PropTypeDescription
titlerequiredstring
descriptionoptionalstring
toneoptional"info" | "positive" | "warning" | "danger" | "neutral"
Example (code component)
import { Banner } from "@app/kit/primitives";

<Banner
  title="Holiday hours"
  description="The studio closes at 4pm Friday."
  tone="info"
/>
Composition node (tree)
{
  "Banner": {
    "title": "Holiday hours",
    "description": "The studio closes at 4pm Friday.",
    "tone": "info"
  }
}

Wraps otf:components/banner

Tooltipapplandingauthleaf

Hover hint on its children.

PropTypeDescription
textrequiredstring

Slots: children

Example (code component)
import { Tooltip } from "@app/kit/primitives";

<Tooltip text="Last checked 2 min ago" children={["hover me"]} />
Composition node (tree)
{
  "Tooltip": {
    "text": "Last checked 2 min ago",
    "children": [
      "hover me"
    ]
  }
}

Wraps o00h:tooltip

HoverCardapplandingauthleaf

Richer hover preview (title + text) on its children.

PropTypeDescription
titlerequiredstring
textoptionalstring

Slots: children

Example (code component)
import { HoverCard } from "@app/kit/primitives";

<HoverCard title="Studio B" text="Heated floor, 20 mats." children={["Studio B"]} />
Composition node (tree)
{
  "HoverCard": {
    "title": "Studio B",
    "text": "Heated floor, 20 mats.",
    "children": [
      "Studio B"
    ]
  }
}

Wraps o00h:hover-card

Popoverapplandingauthleaf

A click-to-open floating panel holding its children.

PropTypeDescription
triggerrequiredstringLabel of the button that opens it.

Slots: children

Example (code component)
import { Popover } from "@app/kit/primitives";

<Popover trigger="Details" children={["More detail"]} />
Composition node (tree)
{
  "Popover": {
    "trigger": "Details",
    "children": [
      "More detail"
    ]
  }
}

Wraps o00h:popover

Dialogapplandingauthleaf

A modal opened from a button; children are its body.

PropTypeDescription
triggerrequiredstringLabel of the button that opens it.
titlerequiredstring
descriptionoptionalstring

Slots: children

Example (code component)
import { Dialog } from "@app/kit/primitives";

<Dialog
  trigger="View policy"
  title="Cancellation policy"
  children={["Cancel up to 2h before class."]}
/>
Composition node (tree)
{
  "Dialog": {
    "trigger": "View policy",
    "title": "Cancellation policy",
    "children": [
      "Cancel up to 2h before class."
    ]
  }
}

Wraps o00h:dialog

Sheetapplandingauthleaf

A side panel opened from a button.

PropTypeDescription
triggerrequiredstringLabel of the button that opens it.
titlerequiredstring
sideoptional"start" | "end"

Slots: children

Example (code component)
import { Sheet } from "@app/kit/primitives";

<Sheet trigger="Filters" title="Filters" children={["…"]} />
Composition node (tree)
{
  "Sheet": {
    "trigger": "Filters",
    "title": "Filters",
    "children": [
      "…"
    ]
  }
}

Wraps o00h:sheet

Drawerapplandingauthleaf

A bottom drawer opened from a button (mobile-friendly detail).

PropTypeDescription
triggerrequiredstringLabel of the button that opens it.
titlerequiredstring

Slots: children

Example (code component)
import { Drawer } from "@app/kit/primitives";

<Drawer trigger="Open" title="Care guide" children={["Water weekly."]} />
Composition node (tree)
{
  "Drawer": {
    "trigger": "Open",
    "title": "Care guide",
    "children": [
      "Water weekly."
    ]
  }
}

Wraps o00h:drawer

Navigation

Buttonapplandingauthleaf

A button that navigates to a route (in a code leaf: calls onClick).

PropTypeDescription
labelrequiredstring
tooptionalapp route
variantoptional"default" | "accent" | "secondary" | "outline" | "ghost" | "danger"
sizeoptional"sm" | "default" | "lg"
iconoptionalicon name
fullWidthoptionalboolean
onClickoptionalfunction (leaf only)
Example (code component)
import { Button } from "@app/kit/primitives";

<Button label="Book this class" variant="default" icon="Calendar" />
Composition node (tree)
{
  "Button": {
    "label": "Book this class",
    "variant": "default",
    "icon": "Calendar"
  }
}

Wraps o00h:button

IconButtonapplandingauthleaf

A round icon-only button (label is its accessible name).

PropTypeDescription
iconrequiredicon name
labelrequiredstring
tooptionalapp route
onClickoptionalfunction (leaf only)
Example (code component)
import { IconButton } from "@app/kit/primitives";

<IconButton icon="Settings" label="Settings" />
Composition node (tree)
{
  "IconButton": {
    "icon": "Settings",
    "label": "Settings"
  }
}

Wraps o00h:icon

HeroButtonlandingauthleafapp

The big organic call-to-action for landing heroes.

PropTypeDescription
labelrequiredstring
tooptionalapp route
showArrowoptionalboolean
Example (code component)
import { HeroButton } from "@app/kit/primitives";

<HeroButton label="Start free" showArrow={true} />
Composition node (tree)
{
  "HeroButton": {
    "label": "Start free",
    "showArrow": true
  }
}

Wraps o00h:hero-button

TextLinkapplandingauthleaf

An inline animated text link to a route.

PropTypeDescription
labelrequiredstring
torequiredapp route
treatmentoptional"underline-start" | "underline-center" | "wash-up" | "contour"
Example (code component)
import { TextLink } from "@app/kit/primitives";

<TextLink label="See all plants" to="/" />
Composition node (tree)
{
  "TextLink": {
    "label": "See all plants",
    "to": "/"
  }
}

Wraps o00h:living-link

Breadcrumbapplandingauthleaf

Where-am-I trail; the last item is the current page.

PropTypeDescription
itemsrequiredArray<{ label: string; to: string }>
Example (code component)
import { Breadcrumb } from "@app/kit/primitives";

<Breadcrumb items={[{"label":"Plants","to":"/"},{"label":"Monstera"}]} />
Composition node (tree)
{
  "Breadcrumb": {
    "items": [
      {
        "label": "Plants",
        "to": "/"
      },
      {
        "label": "Monstera"
      }
    ]
  }
}

Wraps o00h:breadcrumb

ButtonGroupapplandingauthleaf

A segmented row of route buttons (views of the same thing).

PropTypeDescription
itemsrequiredArray<{ label: string; to: string }>
activeoptionalstringLabel of the selected item.
Example (code component)
import { ButtonGroup } from "@app/kit/primitives";

<ButtonGroup items={[{"label":"Day","to":"/"},{"label":"Week","to":"/"}]} active="Day" />
Composition node (tree)
{
  "ButtonGroup": {
    "items": [
      {
        "label": "Day",
        "to": "/"
      },
      {
        "label": "Week",
        "to": "/"
      }
    ],
    "active": "Day"
  }
}

Wraps o00h:button-group

DropdownMenuapplandingauthleaf

A button opening a short menu of route links.

PropTypeDescription
labelrequiredstring
itemsrequiredArray<{ label: string; to: string }>
Example (code component)
import { DropdownMenu } from "@app/kit/primitives";

<DropdownMenu label="More" items={[{"label":"History","to":"/"}]} />
Composition node (tree)
{
  "DropdownMenu": {
    "label": "More",
    "items": [
      {
        "label": "History",
        "to": "/"
      }
    ]
  }
}

Wraps o00h:dropdown-menu

Docklandingauthleafapp

A magnifying icon dock of shortcuts (landing/showcase flourish).

PropTypeDescription
itemsrequiredArray<{ label: string; icon: string; to: string }>
variantoptional"glass" | "shelf" | "rail"
Example (code component)
import { Dock } from "@app/kit/primitives";

<Dock
  items={[{"label":"Home","icon":"Home","to":"/"},{"label":"Plants","icon":"Sparkles","to":"/"}]}
/>
Composition node (tree)
{
  "Dock": {
    "items": [
      {
        "label": "Home",
        "icon": "Home",
        "to": "/"
      },
      {
        "label": "Plants",
        "icon": "Sparkles",
        "to": "/"
      }
    ]
  }
}

Wraps o00h:dock

Paginationleaf

Page switcher — leaf-only (a leaf owns the page state).

PropTypeDescription
pagerequirednumber
totalPagesrequirednumber
onPageChangeoptionalfunction (leaf only)
Example (code component)
import { Pagination } from "@app/kit/primitives";

<Pagination page={2} totalPages={5} />

Wraps o00h:pagination

Media and maps

MapViewapplandingauthleaf

An interactive map (OpenStreetMap tiles, lazy-loaded) with one marker per record that has coordinates; popups open the record; > 50 markers cluster. Bind markers with $each over an entity with lat/lng fields.

PropTypeDescription
markersrequiredArray<{ lat: number; lng: number; label: string; href: string }>[{lat, lng, label, href}] — {"$each": {"entity": "place", "limit": 400}, "map": {"lat": {"$field": "lat"}, "lng": {"$field": "lng"}, "label": {"$field": "name"}, "href": {"$route": "/places/:id"}}}
heightoptional"sm" | "md" | "lg"
captionoptionalstring
zoomoptionalnumber (1 to 18)Fixed zoom; omit to fit every marker.
Example (code component)
import { MapView } from "@app/kit/primitives";

<MapView
  caption="Our three shops"
  markers={[{"lat":52.5208,"lng":13.4095,"label":"Mitte"},{"lat":52.4996,"lng":13.418,"label":"Kreuzberg"},{"lat":52.539,"lng":13.424,"label":"Prenzlauer Berg"}]}
/>
Composition node (tree)
{
  "MapView": {
    "caption": "Our three shops",
    "markers": [
      {
        "lat": 52.5208,
        "lng": 13.4095,
        "label": "Mitte"
      },
      {
        "lat": 52.4996,
        "lng": 13.418,
        "label": "Kreuzberg"
      },
      {
        "lat": 52.539,
        "lng": 13.424,
        "label": "Prenzlauer Berg"
      }
    ]
  }
}

Wraps kit

Embedapplandingauthleaf

Embeds a video, map, design, booking page, playlist, form or pen in a sandboxed frame — YouTube, Vimeo, Google Maps, Loom, Figma, Calendly, Spotify, Typeform, Google Forms, CodePen (paste the normal share URL; it is normalized to the official embed URL). Any other URL renders a link card.

PropTypeDescription
urlrequiredstringShare URL, e.g. https://youtu.be/<id>, https://open.spotify.com/playlist/<id>, https://calendly.com/<user>/<event>.
titlerequiredstringAccessible title of the frame (and the link card).
aspectoptional"16:9" | "4:3" | "1:1" | "9:16" | "3:4" | "tall" | "compact"Frame shape; omit for the provider's natural shape.
captionoptionalstring
Example (code component)
import { Embed } from "@app/kit/primitives";

<Embed url="https://www.youtube.com/watch?v=dQw4w9WgXcQ" title="Studio tour" />
Composition node (tree)
{
  "Embed": {
    "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "title": "Studio tour"
  }
}

Wraps kit

Imageapplandingauthleaf

A framed image at a fixed ratio; falls back to generated art when empty.

PropTypeDescription
srcoptionalstring (image URL)
altrequiredstring
ratiooptional"1:1" | "4:3" | "3:2" | "16:9" | "3:4" | "auto"
fitoptional"cover" | "contain"
roundedoptional"none" | "md" | "lg" | "full"
Example (code component)
import { Image } from "@app/kit/primitives";

<Image alt="Monstera deliciosa" ratio="4:3" />
Composition node (tree)
{
  "Image": {
    "alt": "Monstera deliciosa",
    "ratio": "4:3"
  }
}

Wraps kit

Iconapplandingauthleaf

A lucide icon from the closed icon set.

PropTypeDescription
namerequiredicon name
sizeoptional"sm" | "md" | "lg" | "xl"
toneoptional"default" | "muted" | "accent" | "positive" | "warning" | "danger"
Example (code component)
import { Icon } from "@app/kit/primitives";

<Icon name="Sparkles" size="lg" tone="accent" />
Composition node (tree)
{
  "Icon": {
    "name": "Sparkles",
    "size": "lg",
    "tone": "accent"
  }
}

Wraps kit

IconDiskapplandingauthleaf

An icon on a soft coloured disk (feature bullets).

PropTypeDescription
iconrequiredicon name
toneoptional"default" | "pink" | "yellow" | "olive" | "blue" | "ink" | "cream"
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { IconDisk } from "@app/kit/primitives";

<IconDisk icon="Heart" tone="pink" />
Composition node (tree)
{
  "IconDisk": {
    "icon": "Heart",
    "tone": "pink"
  }
}

Wraps o00h:icon

Carouselapplandingauthleaf

Horizontally swipeable slides — one per child.

PropTypeDescription
presentationoptional"shelf" | "story" | "index"

Slots: children

Example (code component)
import { Carousel } from "@app/kit/primitives";

<Carousel children={["Slide 1","Slide 2","Slide 3"]} />
Composition node (tree)
{
  "Carousel": {
    "children": [
      "Slide 1",
      "Slide 2",
      "Slide 3"
    ]
  }
}

Wraps o00h:carousel

ImageMaskapplandingauthleaf

An image clipped to an organic signature shape.

PropTypeDescription
srcrequiredstring (image URL)
altrequiredstring
shapeoptional"daisy-12" | "petal-7" | "aster-9" | "sunburst-24" | "clover-soft" | "cloud-3" | "pebble-soft" | "pebble-tall" | "ribbon-soft" | "scalloped-square" | "cushion" | "seed-wing"
captionoptionalstring
Example (code component)
import { ImageMask } from "@app/kit/primitives";

<ImageMask src="" alt="Studio" shape="clover-soft" />
Composition node (tree)
{
  "ImageMask": {
    "src": "",
    "alt": "Studio",
    "shape": "clover-soft"
  }
}

Wraps o00h:image-masking

BeforeAfterapplandingauthleaf

Drag-to-compare two images (before / after).

PropTypeDescription
beforerequiredstring (image URL)
afterrequiredstring (image URL)
beforeLabeloptionalstring
afterLabeloptionalstring
Example (code component)
import { BeforeAfter } from "@app/kit/primitives";

<BeforeAfter before="" after="" beforeLabel="Before" afterLabel="After" />
Composition node (tree)
{
  "BeforeAfter": {
    "before": "",
    "after": "",
    "beforeLabel": "Before",
    "afterLabel": "After"
  }
}

Wraps otf:primitives/comparison

LogoStriplandingauthleafapp

A scrolling strip of partner/customer names (landing social proof).

PropTypeDescription
namesrequiredstring[]
Example (code component)
import { LogoStrip } from "@app/kit/primitives";

<LogoStrip names={["Acme","Globex","Initech"]} />
Composition node (tree)
{
  "LogoStrip": {
    "names": [
      "Acme",
      "Globex",
      "Initech"
    ]
  }
}

Wraps otf:primitives/logo-carousel

VideoPlayerapplandingauthleaf

An HTML5 video with the kit's controls.

PropTypeDescription
srcrequiredstring (image URL)Video URL.
posteroptionalstring (image URL)
Example (code component)
import { VideoPlayer } from "@app/kit/primitives";

<VideoPlayer src="data:video/mp4;base64," poster="" />
Composition node (tree)
{
  "VideoPlayer": {
    "src": "data:video/mp4;base64,",
    "poster": ""
  }
}

Wraps otf:data/VideoPlayer

SeedArtapplandingauthleaf

Deterministic generated artwork from a seed string (no-image placeholder).

PropTypeDescription
seedrequiredstring
labelrequiredstring
Example (code component)
import { SeedArt } from "@app/kit/primitives";

<SeedArt seed="monstera" label="Monstera" />
Composition node (tree)
{
  "SeedArt": {
    "seed": "monstera",
    "label": "Monstera"
  }
}

Wraps shadcn:seed-art

ShapeMarkapplandingauthleaf

A signature organic shape as an ornament.

PropTypeDescription
shapeoptional"daisy-12" | "petal-7" | "aster-9" | "sunburst-24" | "clover-soft" | "cloud-3" | "pebble-soft" | "pebble-tall" | "ribbon-soft" | "scalloped-square" | "cushion" | "seed-wing"
variantoptional"fill" | "outline"
sizeoptionalnumber (16 to 320)
Example (code component)
import { ShapeMark } from "@app/kit/primitives";

<ShapeMark shape="daisy-12" size={48} />
Composition node (tree)
{
  "ShapeMark": {
    "shape": "daisy-12",
    "size": 48
  }
}

Wraps o00h:shape

Inputs

TextInputleaf

Single-line text.

PropTypeDescription
labeloptionalstringVisible label.
valueoptionalstring
placeholderoptionalstring
typeoptional"text" | "email" | "url" | "tel"
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { TextInput } from "@app/kit/primitives";

<TextInput label="Name" value="Monstera" />

Wraps o00h:input

TextArealeaf

Multi-line text.

PropTypeDescription
labeloptionalstringVisible label.
valueoptionalstring
placeholderoptionalstring
rowsoptionalnumber (2 to 20)
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { TextArea } from "@app/kit/primitives";

<TextArea label="Notes" value="Likes humidity" />

Wraps o00h:textarea

SearchInputleaf

Search box with clear + shortcut hint.

PropTypeDescription
valueoptionalstring
placeholderoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { SearchInput } from "@app/kit/primitives";

<SearchInput placeholder="Search plants" />

Wraps otf:forms/search-input

PasswordInputleaf

Password with reveal + strength meter.

PropTypeDescription
labeloptionalstringVisible label.
valueoptionalstring
strengthoptionalboolean
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { PasswordInput } from "@app/kit/primitives";

<PasswordInput label="Password" strength={true} />

Wraps otf:forms/password-input

NumberInputleaf

Number with steppers.

PropTypeDescription
labeloptionalstringVisible label.
valueoptionalnumber
minoptionalnumber
maxoptionalnumber
stepoptionalnumber
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { NumberInput } from "@app/kit/primitives";

<NumberInput label="Reps" value={12} min={0} max={50} />

Wraps o00h:number-input

QuantityStepperleaf

Compact −/+ quantity control.

PropTypeDescription
valueoptionalnumber
minoptionalnumber
maxoptionalnumber
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { QuantityStepper } from "@app/kit/primitives";

<QuantityStepper value={2} min={1} max={9} />

Wraps otf:primitives/quantity-stepper

Checkboxleaf

A labelled checkbox.

PropTypeDescription
labelrequiredstring
checkedoptionalboolean
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { Checkbox } from "@app/kit/primitives";

<Checkbox label="Watered" checked={true} />

Wraps o00h:checkbox

Switchleaf

An on/off setting.

PropTypeDescription
labelrequiredstring
checkedoptionalboolean
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { Switch } from "@app/kit/primitives";

<Switch label="Reminders" checked={true} />

Wraps o00h:switch

Sliderleaf

Pick a number on a range.

PropTypeDescription
labeloptionalstringVisible label.
valueoptionalnumber
minoptionalnumber
maxoptionalnumber
stepoptionalnumber
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { Slider } from "@app/kit/primitives";

<Slider label="Intensity" value={40} min={0} max={100} />

Wraps o00h:slider

RadioGroupleaf

Choose one of a few options.

PropTypeDescription
labeloptionalstringVisible label.
optionsrequiredstring[]Option labels (also their values).
valueoptionalstring
appearanceoptional"row" | "card" | "chip"
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { RadioGroup } from "@app/kit/primitives";

<RadioGroup label="Level" options={["Easy","Medium","Hard"]} value="Medium" />

Wraps o00h:radio-group

Selectleaf

Choose one from a dropdown.

PropTypeDescription
labeloptionalstringVisible label.
optionsrequiredstring[]Option labels (also their values).
valueoptionalstring
placeholderoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { Select } from "@app/kit/primitives";

<Select label="Room" options={["Kitchen","Bedroom"]} value="Kitchen" />

Wraps o00h:select

NativeSelectleaf

A plain native dropdown (long option lists, mobile).

PropTypeDescription
labeloptionalstringVisible label.
optionsrequiredstring[]Option labels (also their values).
valueoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { NativeSelect } from "@app/kit/primitives";

<NativeSelect label="Month" options={["Jan","Feb"]} value="Jan" />

Wraps o00h:native-select

Comboboxleaf

Type-to-filter single choice.

PropTypeDescription
optionsrequiredstring[]Option labels (also their values).
valueoptionalstring
placeholderoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { Combobox } from "@app/kit/primitives";

<Combobox options={["Aloe","Basil","Cactus"]} placeholder="Pick a plant" />

Wraps o00h:combobox

MultiSelectleaf

Choose several (tokens).

PropTypeDescription
labelrequiredstring
optionsrequiredstring[]Option labels (also their values).
valueoptionalstring[]
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { MultiSelect } from "@app/kit/primitives";

<MultiSelect label="Days" options={["Mon","Wed","Fri"]} value={["Mon"]} />

Wraps o00h:multi-select

TagsInputleaf

Free-form tag entry.

PropTypeDescription
valueoptionalstring[]
placeholderoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { TagsInput } from "@app/kit/primitives";

<TagsInput value={["indoor","low-light"]} />

Wraps otf:forms/tags

Toggleleaf

A pressed/unpressed tool button.

PropTypeDescription
labelrequiredstring
pressedoptionalboolean
iconoptionalicon name
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { Toggle } from "@app/kit/primitives";

<Toggle label="Favourite" pressed={true} icon="Star" />

Wraps o00h:toggle

ToggleGroupleaf

Segmented single choice.

PropTypeDescription
optionsrequiredstring[]Option labels (also their values).
valueoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { ToggleGroup } from "@app/kit/primitives";

<ToggleGroup options={["Day","Week","Month"]} value="Week" />

Wraps o00h:toggle-group

OptionWheelleaf

A rotary picker for a short list.

PropTypeDescription
optionsrequiredstring[]Option labels (also their values).
indexoptionalnumber
presentationoptional"arc" | "reel" | "compact"
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { OptionWheel } from "@app/kit/primitives";

<OptionWheel options={["S","M","L"]} index={1} />

Wraps o00h:option-wheel

DatePickerleaf

Pick a date from a popover calendar.

PropTypeDescription
valueoptionalstringYYYY-MM-DD
placeholderoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { DatePicker } from "@app/kit/primitives";

<DatePicker value="2026-10-01" />

Wraps o00h:date-picker

Calendarleafapp

An inline month calendar with a selected day.

PropTypeDescription
valueoptionalstringYYYY-MM-DD
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { Calendar } from "@app/kit/primitives";

<Calendar value="2026-10-01" />
Composition node (tree)
{
  "Calendar": {
    "value": "2026-10-01"
  }
}

Wraps o00h:calendar

OtpInputleaf

One-time code entry.

PropTypeDescription
lengthoptionalnumber (4 to 8)
valueoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { OtpInput } from "@app/kit/primitives";

<OtpInput length={6} />

Wraps o00h:input-otp

ColorPickerleaf

Pick a colour.

PropTypeDescription
valueoptionalstring
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { ColorPicker } from "@app/kit/primitives";

<ColorPicker value="#3b82f6" />

Wraps otf:forms/color-picker

FileDropleaf

Drag-and-drop file picker (files go to onChange).

PropTypeDescription
labeloptionalstringVisible label.
acceptoptionalstring
multipleoptionalboolean
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { FileDrop } from "@app/kit/primitives";

<FileDrop label="Drop a photo" accept="image/*" />

Wraps o00h:dropzone

Fieldleaf

Label + description + error around one input child.

PropTypeDescription
labelrequiredstring
descriptionoptionalstring
erroroptionalstring

Slots: children

Example (code component)
import { Field } from "@app/kit/primitives";

<Field label="Nickname" description="Shown on the leaderboard" children={["input"]} />

Wraps o00h:field

RichTextEditorleaf

Rich text as markdown: a textarea with a formatting toolbar (bold, italic, heading, lists, quote, code, link; ⌘B/⌘I/⌘K) and a Write/Preview toggle. onChange gets the markdown string — store it in a text field, show it with Markdown.

PropTypeDescription
labeloptionalstringVisible label.
valueoptionalstringMarkdown.
placeholderoptionalstring
rowsoptionalnumber (3 to 30)
onChangeoptionalfunction (leaf only)(value) => void
Example (code component)
import { RichTextEditor } from "@app/kit/primitives";

<RichTextEditor label="Description" value="**Bright** light, water *weekly*." />

Wraps kit

Motion

TextRevealapplandingauthleaf

Headline that reveals word by word on mount.

PropTypeDescription
textrequiredstring
asoptional"h1" | "h2" | "h3" | "p"
variantoptional"rise" | "fade" | "soften" | "fold" | "bloom" | "scale" | "settle"
Example (code component)
import { TextReveal } from "@app/kit/primitives";

<TextReveal text="Every class, one glance." as="h2" />
Composition node (tree)
{
  "TextReveal": {
    "text": "Every class, one glance.",
    "as": "h2"
  }
}

Wraps o00h:text-reveal, otf:text

Marqueeapplandingauthleaf

A slow endless ticker of its children (announcements, logos).

PropTypeDescription
directionoptional"left" | "right"
speedoptional"slow" | "normal" | "fast"
labeloptionalstringAccessible name.

Slots: children

Example (code component)
import { Marquee } from "@app/kit/primitives";

<Marquee label="News" children={["Open late Thursday","New spin bikes"]} />
Composition node (tree)
{
  "Marquee": {
    "label": "News",
    "children": [
      "Open late Thursday",
      "New spin bikes"
    ]
  }
}

Wraps o00h:marquee, otf:primitives/marquee

FadeInapplandingauthleaf

Fades/slides its children in on mount.

PropTypeDescription
directionoptional"none" | "up" | "down" | "left" | "right"
delayoptionalnumber (0 to 2)

Slots: children

Example (code component)
import { FadeIn } from "@app/kit/primitives";

<FadeIn direction="up" children={["Hello"]} />
Composition node (tree)
{
  "FadeIn": {
    "direction": "up",
    "children": [
      "Hello"
    ]
  }
}

Wraps otf:motion, o00h:presence

Typewriterlandingauthleaf

Types then deletes each word in turn (hero rotating noun).

PropTypeDescription
wordsrequiredstring[]
Example (code component)
import { Typewriter } from "@app/kit/primitives";

<Typewriter words={["yoga","spin","pilates"]} />
Composition node (tree)
{
  "Typewriter": {
    "words": [
      "yoga",
      "spin",
      "pilates"
    ]
  }
}

Wraps otf:text

GradientHeadinglandingauthleaf

A heading filled with a (optionally animated) gradient.

PropTypeDescription
textrequiredstring
presetoptional"primary" | "warm" | "cosmic" | "aurora" | "sunset"
animateoptionalboolean
Example (code component)
import { GradientHeading } from "@app/kit/primitives";

<GradientHeading text="Grow something" preset="primary" />
Composition node (tree)
{
  "GradientHeading": {
    "text": "Grow something",
    "preset": "primary"
  }
}

Wraps otf:text

WordRelaylandingauthleaf

Cycles through words in place.

PropTypeDescription
wordsrequiredstring[]
Example (code component)
import { WordRelay } from "@app/kit/primitives";

<WordRelay words={["Plan","Track","Grow"]} />
Composition node (tree)
{
  "WordRelay": {
    "words": [
      "Plan",
      "Track",
      "Grow"
    ]
  }
}

Wraps o00h:word-relay

WarpTextlandingauthleaf

Text that warps under the pointer.

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { WarpText } from "@app/kit/primitives";

<WarpText text="Warp" />
Composition node (tree)
{
  "WarpText": {
    "text": "Warp"
  }
}

Wraps o00h:warp-text

ZoomWordslandingauthleaf

Words zoom in one after another.

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { ZoomWords } from "@app/kit/primitives";

<ZoomWords text="Big bold words" />
Composition node (tree)
{
  "ZoomWords": {
    "text": "Big bold words"
  }
}

Wraps o00h:zoom-words

WordStreamlandingauthleaf

Words drift past in a stream.

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { WordStream } from "@app/kit/primitives";

<WordStream text="Stream of words" />
Composition node (tree)
{
  "WordStream": {
    "text": "Stream of words"
  }
}

Wraps o00h:word-stream

FallingTextlandingauthleaf

Letters fall and pile up with gravity.

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { FallingText } from "@app/kit/primitives";

<FallingText text="Gravity" />
Composition node (tree)
{
  "FallingText": {
    "text": "Gravity"
  }
}

Wraps o00h:falling-text

ParticleTextlandingauthleaf

Text made of particles that scatter from the pointer.

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { ParticleText } from "@app/kit/primitives";

<ParticleText text="Particles" />
Composition node (tree)
{
  "ParticleText": {
    "text": "Particles"
  }
}

Wraps o00h:particle-text

TextRibbonlandingauthleaf

Text flowing along a wavy ribbon.

PropTypeDescription
textrequiredstring
Example (code component)
import { TextRibbon } from "@app/kit/primitives";

<TextRibbon text="Along the ribbon" />
Composition node (tree)
{
  "TextRibbon": {
    "text": "Along the ribbon"
  }
}

Wraps o00h:text-ribbon

TypographyVortexlandingauthleaf

Text rings spiralling into a vortex.

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { TypographyVortex } from "@app/kit/primitives";

<TypographyVortex text="Vortex" />
Composition node (tree)
{
  "TypographyVortex": {
    "text": "Vortex"
  }
}

Wraps o00h:typography-vortex

VariableProximitylandingauthleaf

Font weight swells near the pointer.

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { VariableProximity } from "@app/kit/primitives";

<VariableProximity text="Hover me" />
Composition node (tree)
{
  "VariableProximity": {
    "text": "Hover me"
  }
}

Wraps o00h:variable-proximity

ScrollReveallandingauthleaf

A statement that sharpens as it scrolls into view.

PropTypeDescription
textrequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { ScrollReveal } from "@app/kit/primitives";

<ScrollReveal text="Scroll to read" />
Composition node (tree)
{
  "ScrollReveal": {
    "text": "Scroll to read"
  }
}

Wraps o00h:scroll-reveal

CaretSwaplandingauthleaf

Retypes one phrase into another.

PropTypeDescription
fromrequiredstring
torequiredstring
sizeoptional"sm" | "default" | "lg"
Example (code component)
import { CaretSwap } from "@app/kit/primitives";

<CaretSwap from="Chaos" to="Calm" />
Composition node (tree)
{
  "CaretSwap": {
    "from": "Chaos",
    "to": "Calm"
  }
}

Wraps o00h:caret-swap

WritingCaretlandingauthleaf

A blinking writing caret after a line of text.

PropTypeDescription
textrequiredstring
Example (code component)
import { WritingCaret } from "@app/kit/primitives";

<WritingCaret text="Start typing" />
Composition node (tree)
{
  "WritingCaret": {
    "text": "Start typing"
  }
}

Wraps o00h:writing-caret

ScrollExpandlandingauthleaf

Children grow to full width as they scroll in.

No props.

Slots: children

Example (code component)
import { ScrollExpand } from "@app/kit/primitives";

<ScrollExpand children={["Expanding"]} />
Composition node (tree)
{
  "ScrollExpand": {
    "children": [
      "Expanding"
    ]
  }
}

Wraps o00h:scroll-expand

FloatLayerlandingauthleaf

Children float gently with depth parallax.

PropTypeDescription
depthoptionalnumber (0 to 80)

Slots: children

Example (code component)
import { FloatLayer } from "@app/kit/primitives";

<FloatLayer children={["Floating"]} />
Composition node (tree)
{
  "FloatLayer": {
    "children": [
      "Floating"
    ]
  }
}

Wraps o00h:float-layer

Parallaxlandingauthleaf

Children move at a parallax offset while scrolling.

PropTypeDescription
offsetoptionalnumber (-200 to 200)

Slots: children

Example (code component)
import { Parallax } from "@app/kit/primitives";

<Parallax children={["Parallax"]} />
Composition node (tree)
{
  "Parallax": {
    "children": [
      "Parallax"
    ]
  }
}

Wraps otf:motion

ImageSwaplandingauthleaf

Two images; hovering transitions to the second (pixel / wave / grain / dither).

PropTypeDescription
firstrequiredstring (image URL)
secondrequiredstring (image URL)
altrequiredstring
effectoptional"pixel" | "wave" | "grain" | "dither"
Example (code component)
import { ImageSwap } from "@app/kit/primitives";

<ImageSwap first="" second="" alt="Before and after" effect="wave" />
Composition node (tree)
{
  "ImageSwap": {
    "first": "",
    "second": "",
    "alt": "Before and after",
    "effect": "wave"
  }
}

Wraps o00h:pixel-swap, o00h:wave-wipe, o00h:grain-dissolve, o00h:dither-dissolve

Decor

DotsBackgroundlandingauthleaf

Quiet dot-grid paper.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { DotsBackground } from "@app/kit/primitives";

<DotsBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "DotsBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:dots-background

GridBackgroundlandingauthleaf

Blueprint grid lines.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { GridBackground } from "@app/kit/primitives";

<GridBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "GridBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:grid-background

PatternBackgroundlandingauthleaf

One of the subtle vector patterns.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
variantoptional"dots" | "grid" | "contours" | "weave" | "pebbles" | "sunwash" | "folds" | "sprouts"

Slots: children

Example (code component)
import { PatternBackground } from "@app/kit/primitives";

<PatternBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "PatternBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:pattern-background

ContoursBackgroundlandingauthleaf

Topographic contour lines.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { ContoursBackground } from "@app/kit/primitives";

<ContoursBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "ContoursBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:contours-background

FoldsBackgroundlandingauthleaf

Folded-paper creases.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { FoldsBackground } from "@app/kit/primitives";

<FoldsBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "FoldsBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:folds-background

PebblesBackgroundlandingauthleaf

Scattered soft pebbles.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { PebblesBackground } from "@app/kit/primitives";

<PebblesBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "PebblesBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:pebbles-background

SproutsBackgroundlandingauthleaf

Tiny sprouting marks (garden, growth).

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { SproutsBackground } from "@app/kit/primitives";

<SproutsBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "SproutsBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:sprouts-background

SunwashBackgroundlandingauthleaf

Warm sun-wash light.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { SunwashBackground } from "@app/kit/primitives";

<SunwashBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "SunwashBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:sunwash-background

WeaveBackgroundlandingauthleaf

Woven textile texture.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { WeaveBackground } from "@app/kit/primitives";

<WeaveBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "WeaveBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:weave-background

AmbientBackgroundlandingauthleaf

Drifting ambient edge decoration.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
variantoptional"drift" | "orbit" | "contour"

Slots: children

Example (code component)
import { AmbientBackground } from "@app/kit/primitives";

<AmbientBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "AmbientBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:ambient-background

DepthBackgroundlandingauthleaf

Layered depth particles.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
variantoptional"pollen" | "contour" | "orbital"

Slots: children

Example (code component)
import { DepthBackground } from "@app/kit/primitives";

<DepthBackground height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "DepthBackground": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:depth-background

ContourFieldlandingauthleaf

Living WebGL contour shader.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"balanced" | "warm" | "cool"

Slots: children

Example (code component)
import { ContourField } from "@app/kit/primitives";

<ContourField height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "ContourField": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:contour-field

PigmentFieldlandingauthleaf

Living pigment wash shader.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"balanced" | "warm" | "cool"

Slots: children

Example (code component)
import { PigmentField } from "@app/kit/primitives";

<PigmentField height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "PigmentField": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:pigment-field

PortalFieldlandingauthleaf

Interactive portal glow.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"balanced" | "warm" | "cool"

Slots: children

Example (code component)
import { PortalField } from "@app/kit/primitives";

<PortalField height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "PortalField": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:portal-field

ElasticMeshlandingauthleaf

Elastic sheet that bends under the pointer.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { ElasticMesh } from "@app/kit/primitives";

<ElasticMesh height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "ElasticMesh": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:elastic-mesh

MetaBallslandingauthleaf

Merging liquid blobs.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { MetaBalls } from "@app/kit/primitives";

<MetaBalls height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "MetaBalls": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:meta-balls

MagicRingslandingauthleaf

Concentric rings that follow the pointer.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { MagicRings } from "@app/kit/primitives";

<MagicRings height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "MagicRings": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:magic-rings

Strandslandingauthleaf

Swaying fibre strands.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { Strands } from "@app/kit/primitives";

<Strands height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "Strands": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:strands

RippleDistortionlandingauthleaf

Water-ripple distortion.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { RippleDistortion } from "@app/kit/primitives";

<RippleDistortion height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "RippleDistortion": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:ripple-distortion

ClickSparklandingauthleaf

Sparks where the visitor clicks.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { ClickSpark } from "@app/kit/primitives";

<ClickSpark height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "ClickSpark": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:click-spark

GhostCursorlandingauthleaf

A trailing ghost cursor.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { GhostCursor } from "@app/kit/primitives";

<GhostCursor height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "GhostCursor": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:ghost-cursor

SwarmCursorlandingauthleaf

A swarm that follows the pointer.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { SwarmCursor } from "@app/kit/primitives";

<SwarmCursor height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "SwarmCursor": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:swarm-cursor

TargetCursorlandingauthleaf

A targeting reticle cursor.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { TargetCursor } from "@app/kit/primitives";

<TargetCursor height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "TargetCursor": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:target-cursor

ImageTraillandingauthleaf

Images trail the pointer.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { ImageTrail } from "@app/kit/primitives";

<ImageTrail height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "ImageTrail": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:image-trail

ShapeArtworklandingauthleaf

One large signature shape with a cast shadow.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
toneoptional"pink" | "olive" | "blue" | "yellow"

Slots: children

Example (code component)
import { ShapeArtwork } from "@app/kit/primitives";

<ShapeArtwork height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "ShapeArtwork": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:shape-artwork

InfiniteSpirallandingauthleaf

An endless spiral of images.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
imagesoptionalstring[]Image URLs.

Slots: children

Example (code component)
import { InfiniteSpiral } from "@app/kit/primitives";

<InfiniteSpiral height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "InfiniteSpiral": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:infinite-spiral

OrbitImageslandingauthleaf

Images orbiting the content.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
imagesoptionalstring[]Image URLs.

Slots: children

Example (code component)
import { OrbitImages } from "@app/kit/primitives";

<OrbitImages height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "OrbitImages": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps o00h:orbit-images

DotMatrixlandingauthleaf

Dotted matrix with vignette.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { DotMatrix } from "@app/kit/primitives";

<DotMatrix height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "DotMatrix": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps otf:backgrounds

GradientWashlandingauthleaf

Soft radial gradient wash.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
presetoptional"slate" | "warm" | "cosmic" | "aurora" | "subtle"

Slots: children

Example (code component)
import { GradientWash } from "@app/kit/primitives";

<GradientWash height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "GradientWash": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps otf:backgrounds

NoiseTexturelandingauthleaf

Film-grain noise texture.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { NoiseTexture } from "@app/kit/primitives";

<NoiseTexture height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "NoiseTexture": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps otf:backgrounds

AnimatedGradientlandingauthleaf

Slowly shifting mesh gradient.

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).
variantoptional"mesh" | "shift" | "pulse"

Slots: children

Example (code component)
import { AnimatedGradient } from "@app/kit/primitives";

<AnimatedGradient height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "AnimatedGradient": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps otf:backgrounds

ShaderGlowlandingauthleaf

Hero shader glow (WebGL).

PropTypeDescription
heightoptionalnumber (120 to 900)Region height in px (default 320).

Slots: children

Example (code component)
import { ShaderGlow } from "@app/kit/primitives";

<ShaderGlow height={160} children={["Headline on decor"]} />
Composition node (tree)
{
  "ShaderGlow": {
    "height": 160,
    "children": [
      "Headline on decor"
    ]
  }
}

Wraps otf:backgrounds

On this page

  1. Layout
  2. Stack
  3. Row
  4. Grid
  5. Box
  6. Center
  7. Spacer
  8. Split
  9. Card
  10. Section
  11. Separator
  12. AspectRatio
  13. ScrollArea
  14. Collapsible
  15. Accordion
  16. Tabs
  17. Container
  18. Resizable
  19. Content
  20. Heading
  21. Text
  22. Display
  23. Lead
  24. Eyebrow
  25. Meta
  26. Value
  27. Code
  28. Kbd
  29. Badge
  30. Marker
  31. FieldLabel
  32. Quote
  33. BulletList
  34. Message
  35. ChatBubble
  36. Markdown
  37. Data display
  38. Stat
  39. StatGroup
  40. MetricCard
  41. Progress
  42. ProgressRing
  43. AnimatedNumber
  44. Avatar
  45. AvatarGroup
  46. Persona
  47. DataTable
  48. KeyValueList
  49. Timeline
  50. ActivityFeed
  51. MilestonePath
  52. Steps
  53. Rating
  54. PriceTag
  55. ListItem
  56. ItemList
  57. StructuredList
  58. Attachment
  59. EmptyState
  60. Skeleton
  61. Spinner
  62. QrCode
  63. IconBadge
  64. Charts
  65. AreaChart
  66. BarChart
  67. LineChart
  68. PieChart
  69. RadarChart
  70. RadialChart
  71. CalendarHeatmap
  72. ActivityHeatmap
  73. Sparkline
  74. BarStrip
  75. BarList
  76. Feedback
  77. Alert
  78. Banner
  79. Tooltip
  80. HoverCard
  81. Popover
  82. Dialog
  83. Sheet
  84. Drawer
  85. Navigation
  86. Button
  87. IconButton
  88. HeroButton
  89. TextLink
  90. Breadcrumb
  91. ButtonGroup
  92. DropdownMenu
  93. Dock
  94. Pagination
  95. Media and maps
  96. MapView
  97. Embed
  98. Image
  99. Icon
  100. IconDisk
  101. Carousel
  102. ImageMask
  103. BeforeAfter
  104. LogoStrip
  105. VideoPlayer
  106. SeedArt
  107. ShapeMark
  108. Inputs
  109. TextInput
  110. TextArea
  111. SearchInput
  112. PasswordInput
  113. NumberInput
  114. QuantityStepper
  115. Checkbox
  116. Switch
  117. Slider
  118. RadioGroup
  119. Select
  120. NativeSelect
  121. Combobox
  122. MultiSelect
  123. TagsInput
  124. Toggle
  125. ToggleGroup
  126. OptionWheel
  127. DatePicker
  128. Calendar
  129. OtpInput
  130. ColorPicker
  131. FileDrop
  132. Field
  133. RichTextEditor
  134. Motion
  135. TextReveal
  136. Marquee
  137. FadeIn
  138. Typewriter
  139. GradientHeading
  140. WordRelay
  141. WarpText
  142. ZoomWords
  143. WordStream
  144. FallingText
  145. ParticleText
  146. TextRibbon
  147. TypographyVortex
  148. VariableProximity
  149. ScrollReveal
  150. CaretSwap
  151. WritingCaret
  152. ScrollExpand
  153. FloatLayer
  154. Parallax
  155. ImageSwap
  156. Decor
  157. DotsBackground
  158. GridBackground
  159. PatternBackground
  160. ContoursBackground
  161. FoldsBackground
  162. PebblesBackground
  163. SproutsBackground
  164. SunwashBackground
  165. WeaveBackground
  166. AmbientBackground
  167. DepthBackground
  168. ContourField
  169. PigmentField
  170. PortalField
  171. ElasticMesh
  172. MetaBalls
  173. MagicRings
  174. Strands
  175. RippleDistortion
  176. ClickSpark
  177. GhostCursor
  178. SwarmCursor
  179. TargetCursor
  180. ImageTrail
  181. ShapeArtwork
  182. InfiniteSpiral
  183. OrbitImages
  184. DotMatrix
  185. GradientWash
  186. NoiseTexture
  187. AnimatedGradient
  188. ShaderGlow
Appbricx

The backend, runtime and hosting for apps your coding agent builds. On our cloud, in yours, or on your own servers.

Features

Coding agents and MCPVerify testingBuilder consolePostgres databaseData APIRealtimeRow-level securitySign-in and authPaymentsWorkflows and jobsAI in your appIntegrationsBackups and rollbackHosting and domainsSelf-host and exportAll features

Product

ShowcasePricingFor coding agentsTemplatesPrivate cloudBring your own AI keyFAQ

Compare

Appbricx vs SupabaseLovable alternativeBolt alternativeFor freelancersFor agencies

Resources

DocumentationReferenceBlogSupportContact

© 2026 Appbricx. All rights reserved.

TermsPrivacyCookiesAcceptable Use