control/uialpha

An opinionated, customizable superset of shadcn/ui

Create app
PrimitivesAIUse casesSkills
Guides
  • Overview
  • Get started
  • Create a skin
  • Shadcn compatibility
  • Architecture
  • Agent surface
  • Lock-in
  • Theme accessibility
  • Theme AI builder
  • Control UI vs shadcn/ui
  • Best React component libraries for AI interfaces
Skins
  • Skinning Control UI
Agents
  • Action Bar
  • Activity
  • Audio Recorder
  • Audio VisualizerBetaBeta — the props contract is close to final, but small breaking changes can still land.
  • Chat Composer
  • Chat Composer Attachment
  • Chat Layout
  • Chat Message
  • Code Block Editor
  • ContextBetaBeta — the props contract is close to final, but small breaking changes can still land.
  • Dynamic NotificationExpExperimental — the contract and the rendering can change without notice. Own the installed copy before shipping it.
  • Environment VariablesExpExperimental — the contract and the rendering can change without notice. Own the installed copy before shipping it.
  • Inline AttachmentBetaBeta — the props contract is close to final, but small breaking changes can still land.
  • Inline CitationBetaBeta — the props contract is close to final, but small breaking changes can still land.
  • Markdown Block
  • Source Badge
  • Task List
  • Thread Rail
  • Transcript Divider
  • User Ask
  • GitHub11

by Damien Schneider

Guide

Architecture

Runtime ownership, skin layering, customization paths, and registry derivation.

Runtime and source ownership

The host application owns model calls, transport, streaming, persistence, branching, and tool execution. Control UI owns the installed component behavior, markup, local UI state, and stable anatomy. Provider-specific usage examples compose native runtime messages directly at that boundary without introducing a normalized Control UI message model.

Interactive previews are host-app integration surfaces, so they can mount a provider's official client and a server-side mock runtime. They render the provider's native messages directly; they do not add a Control UI message format or convert one provider's shape into another. Provider code never enters installable components, blocks, hooks, or utilities.

Ownership mapRuntime outside; installable source inside
Host app runtime
streaming · transport · persistence · tools
↓
Usage composition
native provider parts rendered directly
→↓
installed source
Blocks
complete recipes composed from public surfaces
Components
behavior · markup · stable anatomy
Hooks
reusable local UI behavior
Skin datatheme.css · skin.css · skin.config.tsx
tsx
import {
ChatMessage,
ChatMessageAvatar,
ChatMessageBody,
ChatMessageContent,
ChatMessageHeader,
ChatMessageRow,
} from "@/components/control-ui/chat-message";
export function AssistantMessage({ children }: { children: ReactNode }) {
return (
<ChatMessage from="assistant">
<ChatMessageRow>
<ChatMessageAvatar>AI</ChatMessageAvatar>
<ChatMessageBody>
<ChatMessageHeader>Assistant</ChatMessageHeader>
<ChatMessageContent>{children}</ChatMessageContent>
</ChatMessageBody>
</ChatMessageRow>
</ChatMessage>
);
}

Skins over one component tree

Every skin owns the same three files over one component source. Its theme.css explicitly resolves the complete token contract for light and dark modes; it never inherits another skin's values. Component recipes declare registered, typed custom-property knobs for every visual decision. Scoped skin.css re-values those knobs and owns CSS-only work: pseudo-elements, keyframes, native chrome, relational selectors, and uniform semantic families. skin.config.tsx contains only typed design-system behavior choices and optional adornments. Resolution order is component recipe, skin knob values, CSS-only skin rules, then caller className.

One skin packSame three files; advanced packs use more of them
  1. skin.config.tsx
    typed slots · DS choices · adornments
  2. skin.css
    pseudo-elements · keyframes · descendant families
  3. theme.css
    token values scoped by data-skin
→↓
UI
One component tree
never a skin-specific fork
Render-time resolutionStatic config, plain functions, caller last
skin.config.tsx
→
skin.ts resolver
→
component render
library recipe+skin slot override+caller className wins
Refined config: { id: "refined" }. Every installed pack supplies this file; no provider or wrapper is required.

The knob cascade

The whole styling system rests on four CSS rules, each verifiable in the shipped files.

Recipes paint at zero specificity: every rule lives in @layer components behind :where(), so any selector you write anywhere outranks the library's paint.
Every knob is registered with @property { inherits: true }, and each family declares its defaults only at its root parts. Re-value a knob on any ancestor — the skin root, a data-skin boundary, a free data-* attribute, an inline style — and every part beneath inherits it.
The trade: a knob declared directly on a part beats every inherited re-value, whatever its specificity. Shipped skins therefore re-value at family roots; the moment a rule targets an inner part, callers can no longer override that knob from above.
The trap: because recipes sit in @layer components, any unlayered stylesheet wins against them even at zero specificity. That is the deliberate exit for overrides — and it means a broad unlayered reset in your app silently repaints Control UI parts too. Keep global resets in a layer.

The compiled styles set the browser floor: registered custom properties and relative color syntax — 274 oklch(from …) declarations across the recipes — require Safari 16.4, Chrome 119, and Firefox 128. One rich-tooltip highlight uses currentColor inside relative color, which resolves only from Chrome 131, Safari 18, and Firefox 133; below that the highlight declaration drops and the tooltip renders without it.

Stable anatomy without runtime metadata

Every public part emits three attributes, and only one of them is the selector key. data-control-family names the family whose knobs paint the part — key on it. data-slot names the part inside its component. data-control-ui names the component itself, for devtools, adornments and root extensions. Families that several components share add data-<family>-kind to say which member a rule means, and data-<family>-part to name the part's role in the family. data-skin belongs on the skin boundary, including portal positioners. It is not repeated on every component.

css
/* One exact part in one skin. */
[data-skin="rig"] :where([data-slot="root"][data-control-family="chat-composer"]) { ... }
/* One member of a shared family: toasts, not every popup. */
[data-skin="rig"] :where([data-slot="root"][data-popup-kind="toast"][data-control-family="popup"]) { ... }
/* Every interactive Control UI root, without touching host application controls. */
[data-skin="rig"] [data-control="true"][data-control-family] { ... }

The generated skin-contract.json is the equivalent of a defineAnatomy catalog, but it is built from the component source instead of becoming a browser-side object. It lists scopes, parts, states, adornments, semantic families, and registry ownership in one agent-readable artifact. Item API responses separate ownScopes from installedScopes, so an agent sees both the requested component and the anatomy brought by its dependency closure.

Keep the active skin sparse

skin.config.tsx is one shared ES module containing only behavior choices and optional adornments. Component rendering performs no runtime class lookup: recipes read registered custom properties directly from CSS. Visual breadth therefore adds no active JavaScript, and unused component recipes remain outside an install unless the component manifest declares them.

Bundle tests cap every shipped config at 4 kB gzip. Refined and Flat remain nearly empty; richer packs pay only for their behavior and adornment config, not once per rendered component.

Choose the smallest customization surface

Start at the top and stop at the first rung that expresses the change. Each step downward owns more behavior and is harder to undo.

Escalation ladderStart at 1. Stop as soon as the change fits.
cheaper and easier to undo → deeper ownership
  1. 1Tokentheme.cssChange a named value
  2. 2VariantpropTwo values coexist in one app
  3. 3DS choiceControlUiSkinOne decision for the design system
  4. 4Slotskin.configReact to existing variants
  5. 5Pack CSSskin.cssPseudo-elements, keyframes, families
  6. 6Global utilityeffects.cssReusable token-driven effect
  7. 7Extensionoptional itemInstallable behavior or anchored effect
  8. 8Edit sourceowned fileRestructure the installed anatomy
Change a token when the contract already names the value.
Use a prop when alternatives coexist at different call sites; use a skin-level choice when one decision applies across the design system.
Use component knobs, scoped skin CSS, utilities, or an optional extension only when the shallower surfaces cannot express the result.
Edit the installed component source when the anatomy itself must change.

Typed vocabularies stay closed. variant, tone, and every other union name what the library paints, not what one brand needs. A look the vocabulary does not name is stamped at the call site as a free data-* attribute — every part forwards unknown props to the DOM — and painted by re-valuing knobs under it, without a new union member or a forked component source. Shipped skin packs key only on emitted anatomy, so the free attribute belongs in the application's own CSS, which already outranks both the zero-specificity recipe and the skin.

css
/* Application CSS. The call site renders <Button data-campaign="launch" />. */
[data-slot="root"][data-control-family="button"][data-campaign="launch"] {
--cui-button-bg: var(--brand-launch);
--cui-button-hover-bg: var(--brand-launch-hover);
}

Registry source of truth

The docs catalog and real source imports define file ownership, dependencies, and each transitive install closure. Source manifests, public payloads, previews, API metadata, and agent documentation are generated views; validation rejects drift between them.

Derived registry pipelineValidation rejects every drifted view
docs catalog
real import graph
→
Registry model
ownership · deps · install closure
→
source manifestspublic payloadslive previewsAPI + indexagent docs

The current anatomy contract is version 7. Version 6 removed runtime class and paint maps: component visuals now flow through registered CSS knob contracts, while skin config retains only behavior and adornments. Version 7 publishes every registered --cui-* knob (syntax and recipe default included) in the generated contract. This pre-release registry uses a clean contract cutover: reinstall core, affected components or blocks, and the selected skin together.

On this page

  • Runtime and source ownership
  • Skins over one component tree
  • The knob cascade
  • Stable anatomy without runtime metadata
  • Keep the active skin sparse
  • Choose the smallest customization surface
  • Registry source of truth
No results found.
Guides
Create app
Scaffold a Next.js app with every Control UI component installed as source you own, or hand the whole install to the coding agent already open in your project.
Guide
Overview
An owned-source registry of primitives, agent surfaces, complete blocks, and swappable skins.
Guide
Get started
Choose a skin, install a component or complete block, wire its CSS, and compose your application runtime.
Guide
Create a skin
Re-value the token contract over an installed pack, or own a full pack of three files, then reach the component knobs beneath.
Guide
shadcn compatibility
shadcn registry, token, and ownership conventions without writing to components/ui.
Guide
Architecture
Runtime ownership, skin layering, customization paths, and registry derivation.
Guide
Agent surface
Inspect and install registry items through HTTP, shadcn manifests, static metadata, and machine-readable docs.
Guide
Lock-in
What you own at each layer, what stays proprietary, and what leaving costs — measured, not promised.
Guide
Theme accessibility
Audit canonical theme colors plus rendered popup, badge, and active-tab states, then run the same checks from the CLI.
Guide
Theme AI builder
Create a Control UI theme with Claude Code, Codex, or Mastra Code, then import and test it live.
Guide
Control UI vs shadcn/ui
Both ship open-source React source through the shadcn CLI. The difference starts after install: a typed knob contract, skins that re-value it wholesale, and 16 skin modes audited against WCAG AA on every commit.
Guide
Best React component libraries for AI interfaces
Six production options compared by ownership model, theming system, and agent-specific surfaces — from shadcn/ui to MUI to Control UI.
Guide
Skins
Skinning Control UI
Author complete token-driven Control UI skins with slots, adornments, motion controls, and one shared component source.
Skin
Refined
Compact, calm starting skin with a complete Control UI token contract.
Skin
Windows XP
Windows XP-inspired Luna tokens, bevels, and titlebar details.
Skin
Liquid metal
Polished metal skin with a WebGL shader control surface.
Skin
Rig
Brutalist skin with coral accents, squared corners, and dense typography.
Skin
Flat
Neutral reset skin with square corners, no shadows, and the stock motion tempo.
Skin
Modern Apple
Apple-inspired Liquid Glass skin: WebGL-refraction on floating surfaces, precise directional rims, transparent inputs, and continuous corners.
Skin
Cuicui
Cuicui-inspired shell skin with fixed grain, a docked w-80 sidebar, a neutral main container, and the send-aurora anchored extension on ChatComposer (skin.config fills the chat-composer:send-layer anchor).
Skin
Linear
Linear-inspired skin: indigo brand on a cool neutral ramp, a flat 13px chrome band, 4px radius, hairline borders instead of elevation, and pill-shaped filled actions.
Skin
Skills
CSS-first interactivity
Model UI reactions with relational selectors, container/style queries, and native platform elements before adding React state, effects, or event handlers.
Skill
CSS-first motion & sizing
Drive sizing, enter/exit motion, and scroll effects from CSS and native attributes — token-driven and progressively enhanced — instead of measuring and animating values in JavaScript.
Skill
Derive, do not duplicate
Avoid second sources of truth in component props, hook parameters, and local state.
Skill
Remount state boundaries
Reset state by changing component identity or loading boundaries, not by syncing with effects.
Skill
Explicit names instead of comments
Encode intent in identifiers and extracted units so the code needs no explanatory comments, and keep the rare justified one telegraphic.
Skill
One responsibility per file
Split domain components and hooks before fetching, filtering, selection, and form state become entangled.
Skill
Keep input and output APIs narrow
Split oversized prop, argument, and return-value APIs into cohesive responsibilities.
Skill
Keep context necessary, narrow, and stable
Use context only across real composition boundaries, with the smallest stable semantic value consumers need.
Skill
Do not query the DOM in React
Keep element identity and collections in React instead of searching rendered markup.
Skill
Real stack tests
Prefer tests that drive production hooks, clients, routing, and cache behavior with only the network mocked.
Skill
Test rendered output, not class names
Prove visual behavior through computed styles, geometry, or browser output instead of Tailwind class strings.
Skill
Cohesive folders
Keep every folder a short, readable table of contents by grouping loose files into named responsibilities.
Skill
Single source of truth
Prevent shared facts from drifting by assigning each one a canonical owner.
Skill
Use existing components first
Start from the local design system or registry primitive before creating a new styled element.
Skill
Token discipline
Use established design tokens and local CSS variables before reaching for one-off values.
Skill
ClassName boundaries
Use component APIs for intended variation instead of overriding design-system internals with className.
Skill
Tailwind v4 CSS configuration
Configure Tailwind through CSS directives and tokens instead of adding new JavaScript config.
Skill
Tailwind v4 migration syntax
Use v4 names and modifiers when replacing or reviewing v3-era Tailwind classes.
Skill
First-class utilities before custom CSS
Prefer Tailwind v4's first-class utility families before arbitrary properties or handwritten CSS.
Skill
Variant-first styling
Check Tailwind variants before adding handwritten selectors, style props, or React state for styling.
Skill
Tailwind v4 capabilities
Reach for new v4 utilities before layout hacks, user-agent checks, or JavaScript measurement.
Skill
Tailwind v4 behavior & motion
Account for v4 behavior changes around transforms, hover, default colors, variant order, spacing, and motion.
Skill
State continuity
Show loading, empty, partial, success, and failure states in the same product language.
Skill
Provenance without noise
Surface source, runtime, and ownership cues only where they help the user trust or act.
Skill
Dense but scannable
Favor compact surfaces that support repeated work without flattening hierarchy.
Skill
Say it once
Cut redundant AI-slop copy so labels, controls, and state carry the obvious meaning.
Skill
Skin authoring
Author a skin as three files with strict roles — theme.css owns shared tokens, skin.css re-values registered component knobs, and skin.config declares behavior and adornments.
Skill
Extension authoring
Author an extension as an optional installable layered on the library — root-mounted for cross-cutting anatomy-attached behavior, anchored for component-scoped fx activated from skin.config.
Skill
Registry-first DX
Keep the registry manifest and installed source as the contract users can inspect.
Skill
Skin completeness
Treat a skin as a complete source recipe, not a partial class override layer.
Skill
Control UI composition
Keep blocks readable by composing public agent components, hooks, and slots explicitly.
Skill
Runtime-agnostic UI
Keep core visual surfaces independent from model runners, stores, and transport lifecycles.
Skill
Compound components DX
Expose named anatomy parts when users need to customize layout or actions.
Skill
Context vs props
Reach for a compound-component context only when props cannot reach the part, and store intent in it, not styling.
Skill
AI
AI components
Explore composable surfaces for messages, input, activity, media, and agent workflows.
Agent
ChatMessage
Composable chat message with typed role, density, and lifecycle state.
Agent
ChatComposer
Prompt composer with controlled text, submit state, and trigger-menu support.
Agent
ChatComposerAttachment
Composer attachment rail with file previews, upload progress, and removal.
Agent
UserAsk
Keyboard-first agent question panel that temporarily replaces the chat composer inside its container.
Agent
TaskList
Floating agent task progress pill above the composer that expands into the full task list.
Agent
AudioRecorder
Voice recorder with realtime waveform, duration, cancel, and submit controls.
Agent
AudioVisualizer
Levels-driven realtime audio visualizer offered in two usage versions - bars and line - sharing one export and one props contract.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Agent
DynamicNotification
Dynamic Island-style AI notification pill with a thinking state that morphs into a reply bubble — token-driven surface, WebGL-enhanced backdrop blur, or real refractive liquid glass.
ExpExperimental — the contract and the rendering can change without notice. Own the installed copy before shipping it.Agent
EnvironmentVariables
Composable environment variable editor with .env upload, bulk paste, reveal controls, and submit helpers.
ExpExperimental — the contract and the rendering can change without notice. Own the installed copy before shipping it.Agent
Activity
Shared static and collapsible activity anatomy with bounded, scrollable detail content.
Agent
TranscriptDivider
Toned run-boundary separator for transcripts: steering, interruptions, and condensed context.
Agent
Context
Compact context-window usage with an automatically derived token graph and anchored detail inspector.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Agent
InlineCitation
Inline multi-source citation with a keyboard-accessible preview and source navigation.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Agent
SourceBadge
Linked source badge with an automatic same-origin favicon, derived hostname, and resilient fallback.
Agent
ActionBar
Reusable hover actions for message and response controls.
Agent
InlineAttachment
Inline file and media previews for chat turns.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Agent
MarkdownBlock
Assistant markdown output rendered to prose, with a header and copy-source action.
Agent
CodeBlockEditor
Editable code surface with Shiki highlighting and token-based light/dark themes.
Agent
ChatLayout
Layout primitives for full chat threads, turns, and thoughts.
Agent
ThreadRail
Conversation minimap for scanning and jumping between chat turns.
Agent
Primitives
Primitives
Browse every Control UI primitive through the same live examples used in its documentation.
Primitive
Button
Accessible action button with size, variant, and semantic tone support.
Primitive
Collapsible
Accessible disclosure primitive with measured open and close motion.
Primitive
Tabs
Segmented and browser-style navigation with a stable active indicator.
Primitive
Sidebar
Responsive app sidebar with collapse, mobile sheet, and keyboard toggle support.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Scroll area
Scroll container with overlay scrollbars and edge fades.
Primitive
Table of contents
Sticky in-page navigation with scroll-spy range highlighting.
Primitive
Timeline
Static chronological events with independent status, connectors, descriptions, and metadata.
Primitive
Stepper
Static and interactive workflow steps with horizontal and vertical layouts.
Primitive
Skeleton
Loading placeholder with a token-driven shimmer.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Slider
Single-value range control with branded and plain treatments.
Primitive
Select
Single-choice picker with a token-matched trigger and floating list.
Primitive
DropdownMenu
Dropdown menu for actions, resources, labels, separators, and submenus.
Primitive
Context Menu
Pointer-positioned right-click and long-press menu with nested actions and selection controls.
Primitive
Toggle
Pressed-state button and toggle group built on the Button surface.
Primitive
Switch
On/off control with token-driven track, thumb, and press motion.
Primitive
Dialog
Modal dialog for focused tasks, confirmations, and custom panels.
Primitive
Popover
Anchored floating panel for inline settings and contextual content.
Primitive
Tooltip
Hover or focus hint popup with Base UI positioning and Control UI tokens.
Primitive
Rich tooltip
Persistent anchored tip for onboarding tours, walkthroughs, and new-feature announcements — dismissible, with optional media and step counter.
Primitive
Drawer
Swipeable edge panel for mobile sheets and off-canvas surfaces.
Primitive
Responsive dialog
Modal dialog on desktop that becomes a swipeable bottom drawer on mobile.
Primitive
Toast
Transient notifications with a callable toast API and single Toaster mount.
Primitive
Input
Text field primitive sized and styled to match other controls.
Primitive
Input group
Joined input wrapper for addons, icons, and focus-within rings.
Primitive
Dropzone
Composable file intake with validation, managed selection, and drag-activated overlays.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Phone input
International phone field with country search, E.164 values, and Zod validation helpers.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Command
Command palette with token-matched dialog, input, and result rows.
Primitive
Kbd
Keyboard shortcut chip and chord group.
Primitive
Checkbox
Single checkbox control with checked and indeterminate states.
Primitive
Radio group
Single-choice radio set for plans, filters, and option lists.
Primitive
Accordion
Stacked disclosure rows with measured panel animation.
Primitive
Avatar
Profile image with initials fallback and composable overlapping groups.
Primitive
Progress
Determinate task progress with optional label and value rows.
Primitive
Hover card
Hover or focus preview panel for profiles, links, and contextual details.
Primitive
Alert dialog
Modal confirmation dialog for destructive or blocking decisions.
Primitive
Menubar
Desktop command bar with nested menus, shortcuts, and separators.
Primitive
Navigation menu
Site navigation menu with a shared animated viewport.
Primitive
Field
Form field wrapper for labels, descriptions, errors, and validity state.
Primitive
Form
Form wrapper that coordinates field validation and returned errors.
Primitive
Native select
Native select control styled to match the Control UI control family.
Primitive
Textarea
Multiline text field with CSS-first auto-growth.
Primitive
Input OTP
One-time-code field with grouped, focus-aware slots.
Primitive
Combobox
Searchable single-select with input and floating option list.
Primitive
Alert
Inline status panel for callouts, errors, and notices.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Badge
Compact status, label, or count chip.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Card
Content surface for panels, tiles, and settings groups.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Table
Responsive data table for lists, comparisons, and structured records.
Primitive
Aspect ratio
CSS aspect-ratio wrapper for media and previews.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Button group
Joined button group for toolbars, split actions, and segmented controls.
Primitive
Empty
Empty-state layout for blank lists, zero results, and new workspaces.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Item
List row with media, content, and trailing actions.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Pagination
Page navigation for long lists and result sets.
Primitive
Spinner
Accessible loading indicator for pending buttons, panels, and inline waits.
Primitive
Meter
Static range meter for quota, storage, score, or usage values.
Primitive
Tree
Accessible tree view with roving keyboard navigation, single/multi selection, and animated disclosure.
Primitive
Checkbox Group
Multi-select checkbox set with shared state and select-all support.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Autocomplete
Free-text input with search-as-you-type suggestions.
Primitive
Number Field
Numeric input with stepper buttons and optional drag-to-change behavior.
Primitive
Trigger Menu
Caret-anchored command or mention menu for text editors.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Toolbar
Roving-focus toolbar for editor controls and compact actions.
Primitive
Dockable Panel
Non-modal workspace panel that moves between two explicit edge slots with a mobile Drawer fallback.
ExpExperimental — the contract and the rendering can change without notice. Own the installed copy before shipping it.Primitive
Infinite Canvas
Pan-and-zoom spatial workspace for arranging content without fixed bounds.
ExpExperimental — the contract and the rendering can change without notice. Own the installed copy before shipping it.Primitive
Morphing Panel
Accessible disclosure surface that morphs between explicit collapsed and expanded dimensions.
ExpExperimental — the contract and the rendering can change without notice. Own the installed copy before shipping it.Primitive
Color Picker
Color input with picker UI, formats, presets, and contrast helpers.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Gradient Editor
CSS gradient editor with draggable stops and live preview.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Resizable
Accessible resizable panel groups and split layouts with keyboard support.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Calendar
Date selection grid built on react-day-picker and themed through tokens.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Primitive
Typography
The token-driven type scale — one --text-* rung per size, named by role. Publish the utilities, not a component.
Primitive
Code
Shared code surface: Shiki-highlighted lines, gutter, clean copy, and virtualization for large files.
Primitive
Code Diff
Unified or split diff from a git patch or a before/after pair, with word-level intra-line highlighting.
Primitive
Markdown
Rendered agent markdown (GFM) whose code fences compose Code, and diff fences compose CodeDiff.
Primitive
Support files
useChatMessage
Typed role, density, and lifecycle state for ChatMessage.
Hook
useChatComposer
Controlled composer text and submit state.
Hook
useUserAsk
Question/option registration, selection, freeform text, and keyboard flow for UserAsk.
Hook
useAudioRecorder
Browser microphone recording state, waveform levels, and Blob completion.
Hook
useEnvironmentVariables
Editable environment variable rows with .env parsing, upload, duplicate detection, and submit helpers.
Hook
useCopyToClipboard
Copy-to-clipboard behavior with success state and fallback support.
Hook
cn
Tailwind class-name merge helper.
Util
skin
Skin slot and adornment resolvers for the Control UI library.
Util
serialize
Bridge a rich editor doc to plain text (and structured mentions) and back — independent of any one component.
Util
Use cases
Use cases
Start from complete workspace templates or focused interaction patterns, then own and adapt the installed source.
Use case
Chat
Controlled chat shell that composes rendered turns and a provider-owned composer.
Use case
Theme toggle
Controlled theme controls with a three-value switch, binary switch, cycle button, and dropdown.
Use case
Coding agent
Desktop coding workspace with project tasks, a focused conversation, and a persistent controlled composer.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Use case
Settings
Searchable multi-page settings shell with responsive navigation and accessible control groups.
Use case
File explorer
Finder-inspired file browser with locations, search, resizable columns, breadcrumbs, and an item preview.
BetaBeta — the props contract is close to final, but small breaking changes can still land.Use case