components
Figma-sourced components built with CVA + semantic tokens. Each component mirrors its Figma variant structure exactly.
Button
A three-axis component: variant × intent × size — built from Figma compound variants and wired to semantic tokens.
| Prop | Type | Default | Figma |
|---|---|---|---|
| style | filled outline text | filled | Style=Filled / Outline / text button |
| type | primary success destructive warning information | primary | Type=primary / success / Destructive / Warning / Information |
| size | 40 36 32 | 40 | Size=40 / 36 / 32 — height in px, padding 10 / 10 / 8 |
| isLoading | boolean | false | State=loading — shows spinner, disables interaction |
| disabled | boolean | false | State=disable — muted bg (filled) or greyed border/text (outline/text) |
| asChild | boolean | false | Render as child element via Radix Slot (e.g. <a>) |
Input
A two-axis component: state × addonType — with optional label, help text, and error text. Built from Figma compound variants.
Help text will be shown here
Default
Active
Filled
Disable
Filled Disable
Error
Help text will be shown here
Help text will be shown here
Help text will be shown here
Help text will be shown here
Help text will be shown here
Help text will be shown here
| Prop | Type | Default | Description |
|---|---|---|---|
| state | InputState | default | Visual interaction state |
| addonType | InputAddonType | default | Addon slot placement |
| label | string | "Label" | Visible label above the field |
| helpText | string | "Help text..." | Helper copy below the field |
| errorText | string | "Required" | Error copy — shown when state="error" |
| addonText | string | "+1" | Text shown in text-first/last addon slot |
| showLabel | boolean | true | Show/hide the label element |
| showHelpText | boolean | false | Show help/error text below field |
| placeholder | string | "Placeholder" | Native input placeholder |
| disabled | boolean | — | Native disabled attribute |
| ref | Ref<HTMLInputElement> | — | Forwarded ref to inner input |
Tag / Chip
A two-component set: Tag for semantic labels (5 colors × 3 types) and Chip for status badges with light/dark modes.
| Prop | Type | Default | Description |
|---|---|---|---|
| color | 'grey' | 'blue' | 'green' | 'orange' | 'red' | 'grey' | Semantic color variant |
| variant | 'icon' | 'dot' | 'number' | 'icon' | Layout variant — icon=badge+close, dot=dot+label, number=date text |
| text | string | 'Badge' | Label text shown in icon + dot variants |
| numberText | string | 'Due Date: 20 Apr 2026' | Text shown in number variant |
| leadingIcon | boolean | true | Show leading info icon (icon + number variants) |
| trailingIcon | boolean | true | Show trailing close button (icon variant only) |
| onClose | () => void | — | Callback fired when × is clicked |
| Prop | Type | Default | Description |
|---|---|---|---|
| state | 'cashBuyout' | 'contingency' | 'undecided' | 'cashBuyout' | Status state — controls label + color |
| mode | 'light' | 'dark' | 'light' | Light or dark background mode |
Tooltip
Dark-surface popover with an optional directional arrow tip. Supports 8 arrow positions: bottom-left/centre/right, top-left/centre/right, left-centre, right-centre.
| Prop | Type | Default | Description |
|---|---|---|---|
| title | string | 'Heading' | Bold heading line |
| body | string | 'Tooltips are used to…' | Smaller body copy below the title |
| showBody | boolean | true | Toggle body text visibility |
| showClose | boolean | true | Show the × dismiss button |
| showArrow | boolean | true | Show the directional arrow tip |
| position | 'bottomLeft' | 'bottomCentre' | 'bottomRight' | 'topLeft' | 'topCentre' | 'topRight' | 'leftCentre' | 'rightCentre' | 'bottomLeft' | Arrow tip position |
| onClose | () => void | — | Callback fired when × is pressed |
Checkbox
Selection control for independent boolean choices. Supports checked, indeterminate, and disabled states.
| Prop | Type | Default | Description |
|---|---|---|---|
| label | string | — | Text shown beside the checkbox |
| checked | boolean | false | Controlled checked state |
| indeterminate | boolean | false | Shows minus icon — partial selection |
| disabled | boolean | false | Prevents interaction, reduces opacity |
| onChange | (checked: boolean) => void | — | Fires with new boolean value on change |
Radio Button
Single-selection control within a mutually exclusive group. One option active at a time.
Subscription plan
Notification frequency
| Prop | Type | Default | Description |
|---|---|---|---|
| label | string | — | Text shown beside the radio button |
| checked | boolean | false | Controlled selected state |
| disabled | boolean | false | Prevents interaction, reduces opacity |
| onChange | (checked: boolean) => void | — | Fires when radio is selected |
| name | string | — | Groups radios — only one can be active |
| value | string | — | The value passed on form submit |
Alert
Contextual feedback banners with four semantic variants — Info, Alert, Success, and Warning. Each supports heading, body copy, action links, and a dismiss button.
Heading
Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid pariatur, ipsum similique veniam.
Heading
Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid pariatur, ipsum similique veniam.
Heading
Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid pariatur, ipsum similique veniam.
Heading
Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid pariatur, ipsum similique veniam.
| Prop | Type | Default | Description |
|---|---|---|---|
| type | 'Info' | 'alert' | 'Success' | 'Warning' | 'Info' | Sets the colour scheme and icon |
| heading | string | 'Heading' | Bold heading text |
| paragraph | string | 'Lorem ipsum…' | Descriptive body copy below the heading |
| showBody | boolean | true | Toggle the paragraph body copy |
| showActions | boolean | true | Show "Learn more" and "View Changes" links |
| showClose | boolean | true | Show the × dismiss button |
| onClose | () => void | — | Callback fired when × is pressed |
Avatar
A circular identity component available in three types — Image, Icon, and Initials — across 4 sizes with optional status indicators, plus a ThumbnailsGroup for stacked layouts.
| Prop | Type | Default | Description |
|---|---|---|---|
| type | "Initials" | "Icon" | "Image" | Initials | Visual type of the avatar |
| size | "xs" | "sm" | "md" | "lg" | md | Controls diameter: 24 / 32 / 40 / 56px |
| status | "active" | "idle" | "offline" | "busy" | undefined | Shows a status dot at bottom-right. Omit to hide |
| initials | string | — | 1–2 character text shown when type is Initials |
| src | string | — | Image URL shown when type is Image |
| alt | string | — | Alt text for the photo — required for accessibility when type is Image |
Toggle
A binary on/off control — available in three sizes with an optional inline label. Maps to the checked boolean prop and fires an onChange handler.
| Prop | Type | Default | Description |
|---|---|---|---|
| checked | boolean | false | Controls the on/off state |
| onChange | (checked: boolean) => void | — | Callback fired when the user toggles |
| size | "sm" | "md" | "lg" | sm | 28×16 / 36×20 / 44×24px |
| label | string | — | Inline label text. When provided renders a Toggle with Text layout |
| disabled | boolean | false | Prevents interaction, reduces opacity to 40% |
Dropdown
A select trigger field with 7 states — Default, Focused, Filled, Disabled, Error, Filled-Disabled, and Filled-Error — paired with an open-menu panel that supports plain text items, checkboxes, and all-selected views.
| Prop | Type | Default | Description |
|---|---|---|---|
| label | string | — | Field label shown above the trigger |
| placeholder | string | "Placeholder" | Hint text when no value selected |
| value | string | — | Currently selected value (filled state) |
| state | default focused filled disabled error filled-disabled filled-error | default | Visual state of the trigger |
| options | string[] | — | Array of option labels for the menu |
| checkbox | boolean | false | Show checkboxes in menu items |
| badge | string | — | Badge label shown after value (e.g. "+4more") |
| helpText | string | — | Help / error message below the trigger |
| onChange | (v: string) => void | — | Callback when selection changes |
Tab
Horizontal underline tab bar. The active tab shows a brand-blue 2 px bottom border; inactive tabs remain flat. Fully controlled — swap .active to move selection.
| Prop | Type | Default | Description |
|---|---|---|---|
| items | string[] | — | Array of tab labels to render |
| activeIndex | number | 0 | Index of the currently active tab |
| onChange | (i: number) => void | — | Callback fired when a tab is clicked |
| className | string | — | Extra classes on the bar wrapper |
Switches
Pill-shaped segmented control. The active item lifts to a white surface with a soft shadow; all other items remain flat. Two sizes — lg (44 px) and md (36 px).
| Prop | Type | Default | Description |
|---|---|---|---|
| items | string[] | — | Array of option labels |
| activeIndex | number | 0 | Index of the selected item |
| size | "lg" "md" | "lg" | Height variant — 44 px or 36 px |
| onChange | (i: number) => void | — | Callback fired when selection changes |
Pagination
Navigate between pages of content. Supports numbered page buttons and text-only variants in both desktop (with text labels) and mobile (icon-only arrows) breakpoints.
| Prop | Type | Default | Description |
|---|---|---|---|
| currentPage | number | 1 | The currently active page |
| totalPages | number | — | Total number of pages |
| type | "numbers" "text" | "numbers" | Show page buttons or "Page X of Y" text |
| mobile | boolean | false | Icon-only arrow buttons for mobile breakpoint |
| onChange | (page: number) => void | — | Callback fired on page change |
Breadcrumbs
Show the user's location within a hierarchy. Links render in brand blue; the current (last) item is plain text. Up to four depth levels supported.
| Prop | Type | Default | Description |
|---|---|---|---|
| items | { label: string; href?: string }[] | — | Array of crumb objects. Last item renders as current page (no link) |
| separator | ReactNode | chevron | Custom separator element between items |
| onNavigate | (href: string) => void | — | Called when a link crumb is clicked |