Skip to content

Components

The platform ships parallel component libraries, intentionally shaped so a control’s API is recognisable across stacks:

  • Web — bits-ui (headless primitives) + custom wrappers under apps/svelte-web/src/lib/components/ui/. ~49 directories, ~213 .svelte files.
  • Native mobile — each app (apps/ios-user + apps/android/app-user, and the agent apps) ships a hand-built, lockstep primitive library so feature code never re-rolls UI. The authoritative list lives on Conventions → Mobile (Native).

For framework rules — kebab-case filenames (web) vs PascalCase (native), no hand-rolled buttons, generated design tokens over hardcoded color — see Conventions → Web and Conventions → Mobile (Native).

Organized by tier (per the team’s internal style guide). All bits-ui wrappers live under apps/svelte-web/src/lib/components/ui/{name}/; higher-level domain compositions live under apps/svelte-web/src/lib/components/{feature}/.

ComponentSource dirPurpose
Buttonui/button/bits-ui Button + size / variant slots
Inputui/input/Text input wrapper with focus ring tokens
Labelui/label/Form label with required / optional indicator slots
Cardui/card/Card container with Header / Title / Description / Content / Footer subparts
Dialogui/dialog/Modal overlay; the “destructive confirm” pattern lives here
Sheetui/sheet/Side-anchored panel (left / right / top / bottom)
Drawerui/drawer/Vaul-svelte mobile-first sheet with snap points
Tabsui/tabs/Tabbed pages; tab list + tab triggers + tab panels
Accordionui/accordion/Collapsible disclosure groups
Selectui/select/Single-select dropdown (Combobox for filtering)
Comboboxui/combobox/Filtered Select with text search
Switchui/switch/Boolean toggle
Toggleui/toggle/Stateful pressed button
Checkboxui/checkbox/Tri-state checkbox
RadioGroupui/radio-group/Single-pick radios
DatePicker / Calendarui/date-picker/ + ui/calendar/Date input + month grid
Popoverui/popover/Anchored floating panel
Tooltipui/tooltip/Hover-triggered label
DropdownMenuui/dropdown-menu/Menu with submenus, separators, checkboxes
Separatorui/separator/Horizontal or vertical rule
ScrollAreaui/scroll-area/Custom scrollbar wrapping native overflow
Commandui/command/Cmdk-style palette (used in headers + admin tools)
NavigationMenuui/navigation-menu/Top-level nav primitive
ComponentSource dirPurpose
Fieldui/field/Label + Input + error container (standalone — no Formsnap dep)
Formvia Formsnapsuperforms + Zod integration; emit <Form.Field> per input
InputGroupui/input-group/Prefix / suffix slots around an Input (currency symbol, unit)
InputOTPui/input-otp/6-digit code split inputs with auto-advance
Textareaui/textarea/Multi-line input
NumberStepperui/number-stepper/+/− buttons around a numeric value
NumericInputui/numeric-input/Numeric-only Input with comma thousands formatting
PhoneInputui/phone-input/MX-default international phone field
TimeRangeFieldui/time-range-field/Start + end time picker, used in tour scheduling
ComponentSource dirPurpose
Tableui/table/Header / body / row primitives
DataTablevia TanStack Svelte TableColumn defs + filtering + pagination
Carouselui/carousel/Embla-svelte image carousel (property galleries)
Alertui/alert/Inline info / warning / error banner
Progressui/progress/Linear progress bar
Badgeui/badge/Status pill (uses status-* tokens)
ComponentSource dirPurpose
Spinnerui/spinner/Loading indicator
Skeletonui/skeleton/Placeholder rectangles
Toaster / Toastvia svelte-sonnerBottom-anchored toast; integrate via <Toaster /> at root
EmptyStateui/empty-state/Icon + heading + body + CTA (used across dashboard / portal / mobile)
StatCardui/stat-card/KPI tile with label + value + delta
ComponentSource dirPurpose
LaunchpadTileui/launchpad-tile/7 variants — Counter, Link, KPI, Status, Shortcut, Grouped, default. Shared base styles; used for hub / dashboard navigation.
ButtonGroupui/button-group/Joined buttons (segmented controls)
Command paletteui/command/Global search palette (⌘K)

Each native app ships its own hand-built primitive library (matching API + visuals on iOS and Android) rather than a shared package. Colors come from the generated token files via @Environment(\.tokens) (iOS) / LocalTokens.current (Android) — never hardcoded hex — and the rule is no hand-rolled buttons.

The shared set includes: PrimaryButton / SecondaryButton, ListRow, SwitchRow, CheckboxRow, SegmentedControl (single + multi select), SelectablePill / DismissibleChip, Avatar, StatusBadge, Toast (via ToastCenter), EmptyState, Skeleton, text Inputs, and PickerSheet. Property cards compose platform-native card/image/specs views with the favorite heart, multi-unit pills, and price-drop badge.

The authoritative list — and the mobile-ui-audit skill that flags violations — lives on Conventions → Mobile (Native).

For the runtime rules that govern how these components are used:

  • Conventions → Web — form-action template, Formsnap integration, auth gates, error handling.
  • Conventions → Mobile (Native) — PascalCase filenames, generated design tokens (no hardcoded color), cookie auth, the shared primitive list.
  • Design → Tokens — the color, typography, spacing, radius, and shadow values these components consume.
  • Design → Principles — the design intent (property-first hierarchy, status taxonomy, dark mode strategy).