` container is still owned by Select for ARIA correctness — the snippet renders the option's visible contents. Positional args: `(option, isSelected, toggle)`. |
| customTrigger | `Snippet<[SelectOption
[], boolean, () => void]>` | no | | Replace the entire trigger button (chevron, label, clear control) with a custom element. Receives the selected options, current open state, and a `clear` callback. Use this for icon-only triggers, badge-counter triggers, or any non-standard chrome — the Select still owns open/close + selection state via the returned callbacks. Positional args: `(selected, open, clear)`. |
| customTriggerContent | `Snippet<[SelectOption[]]>` | no | | Replace only the trigger's text/label area (chevron and clear button stay intact). Receives the selected options. Useful for showing icons next to the label, badges with counts, or formatted multi-select summaries while keeping the standard outlined-Select chrome. Positional args: `(selected)`. |
| disabled | `boolean` | no | false | Whether the Select is disabled and non-interactive |
| error | `string` | no | | Error message below the select. Overrides `helper` and forces danger styling. |
| groups | `SelectGroup[]` | no | | Grouped options with section labels. Takes precedence over `options`. |
| helper | `string` | no | | Helper text below the select. Hidden when `error` is set. |
| id | `string` | no | | Explicit `id` for the component. Auto-generated if omitted. |
| label | `string` | no | | Label text displayed above the select, auto-linked via `id`. |
| mint | `MintProp` | no | 'none' | Micro-interaction preset. |
| multiPlaceholder | `string | ((selected: SelectOption[]) => string)` | no | | Placeholder shown when one or more values are picked. Pass a string for a static label ("3 selected") or a function that receives the currently selected options and returns a custom string. When unset, the trigger lists the selected labels comma-separated. |
| multiple | `'false' | 'true'` | no | | Single-select mode (the default). Omit or set to `false` explicitly. |
| name | `string` | no | | Shared `name` for a hidden input for native form submission. |
| nullOption | `string | NullOptionConfig` | no | | Render an explicit "no value" option as the first row of the listbox. Selecting it sets the bound value to `null`. When `value` is `null`, the trigger displays this label instead of the placeholder. Pass a string to use it as the label, or a `NullOptionConfig` for more control. Ignored when `groups` is set — group structures own their option list. |
| onClickOutside | `() => void` | no | | Fires after an outside click closes the listbox. Use for analytics or side-effects on dismiss. Does NOT control whether the listbox closes — that is governed by `closeOnClickOutside`. |
| onEscape | `() => void` | no | | Fires after Escape closes the listbox. Use for analytics or to clear ephemeral state on dismiss. Does NOT control whether the listbox closes — that is governed by `closeOnEscape`. |
| onValueChange | `(value: T | null) => void` | no | | Fires after the selected value changes. Receives the new value or `null` on clear. |
| open | `boolean` | no | false | Controls whether the listbox is open. Supports `bind:open` for parents that need to coordinate open/close (e.g. attaching a custom trigger button outside the Select wrapper). |
| options | `SelectOption[]` | no | | Flat list of selectable options. |
| placeholder | `string` | no | 'Select...' | Text shown when no value is selected. |
| preset | `string` | no | | Apply a named preset registered via ``. Prefer this over `class` overrides when the requested look falls outside the semantic intent palette — presets keep hover/active/dark-mode logic coherent and make the custom look reusable across the project. |
| required | `boolean` | no | false | Adds a required asterisk to the label. |
| selectionIndicator | `'checkmark' | 'none'` | no | | Selection indicator rendered next to each option. - `'checkmark'` — trailing check icon (default) - `'none'` — no indicator (typical when using `customItem`) |
| slotClasses | `Partial>` | no | | Per-slot class overrides merged with tv() styles. Slots: wrapper (root — what `class` also targets) | base | trigger | triggerText | placeholder | chevron | clear | listbox | option | optionLabel | optionCheck | optionCheckbox | group | groupLabel | label | message. |
| syncWidth | `boolean` | no | true | Whether the listbox matches the trigger's width. Set `false` for icon-only or compact triggers where the listbox should size to its content instead. |
| unstyled | `boolean` | no | | Remove all default tv() classes. |
| usePortal | `boolean` | no | true | When true, the listbox is rendered into the browser top layer via the native `popover` API, so it cannot be clipped by `overflow: auto` ancestors. When false, the listbox stays in the regular DOM flow — useful inside other popovers/portals to avoid double-portaling. |
| value | `T[]` | no | [] | Currently selected values. Supports `bind:value`. |
| variant | `SelectVariants['variant']` | no | 'outlined' | Visual style. - `outlined` (default) — visible border, surface-base background - `filled` — surface-interactive fill, no border (compact toolbars) - `ghost` — transparent until hover/focus (dense menus, inline editors) - `underline` — bottom-line only, no border-box (editorial knob-strips, docs playgrounds) |
| size | `'lg' | 'md' | 'sm'` | no | md | Controls the dimensions, padding, and text size of the Select. Affects the component's physical footprint. Available options: lg, md, sm. |
| messageType | `'error' | 'helper'` | no | helper | Controls the messageType behavior and appearance of the Select component. Available options: error, helper. |
| selected | `'true'` | no | false | Controls the selected behavior and appearance of the Select component. Available options: true. |
| tier | `'commit' | 'modify'` | no | modify | Controls the tier behavior and appearance of the Select component. Available options: commit, modify. |
---
## Separator
Visual divider for separating content sections. Supports horizontal and
vertical orientations with proper ARIA semantics.
**Import:** `import { Separator } from '@urbicon-ui/blocks';`
### Examples
```svelte
```
```svelte
Item A
Item B
```
### Variants
- size: lg, md, sm (default: md)
- orientation: horizontal, vertical (default: horizontal)
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| ...HTMLAttributes | `HTMLAttributes` | no | | HTML attributes (excluding: 'children' | 'class') |
| ...SeparatorVariants | `VariantProps` | no | | Styling variants from SeparatorVariants |
| class | `string` | no | | Additional CSS class merged onto the root element. |
| decorative | `boolean` | no | | When true, the separator is purely visual (role="none"); when false, it uses role="separator" with aria-orientation. |
| orientation | `'horizontal' | 'vertical'` | no | | Horizontal renders a full-width line; vertical renders a full-height line (e.g. inside flex rows). |
| preset | `string` | no | | Apply a named preset registered via ``. Prefer this over `class` overrides when the requested look falls outside the semantic intent palette — presets keep hover/active/dark-mode logic coherent and make the custom look reusable across the project. |
| size | `'sm' | 'md' | 'lg'` | no | | Controls margin around the line — sm (0.5 rem), md (1 rem), lg (1.5 rem). |
| slotClasses | `Partial>` | no | | Per-slot class overrides. |
| unstyled | `boolean` | no | | Strip all default styles; combine with slotClasses to rebuild from scratch. |
Inherited from:
- SeparatorVariants (external)
- Omit, 'children' | 'class'> (omit-pattern)
### Slots (slotClasses keys)
`base`
---
## SessionManager
Lists the user's active sessions (refresh-token families) with a
device label, last-active time and a "this device" badge, and lets them sign
out an individual session or all other devices. Requires refresh-token
rotation on the server (`config.refreshToken`); without it the list reports
itself unavailable. Pair with `createListSessionsHandler` (GET `basePath`),
`createRevokeSessionHandler` (POST `basePath/revoke`) and
`createRevokeOtherSessionsHandler` (POST `basePath/revoke-others`).
**Import:** `import { SessionManager } from '@urbicon-ui/auth';`
### Examples
```svelte
```
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| basePath | `string` | no | '/api/auth/sessions' | API base path for the session endpoints. |
| class | `string` | no | | Extra classes on the root element. |
| csrf | `CsrfClientOptions` | no | | CSRF cookie/header names — only needed when the server overrides the defaults via `config.csrf`. Mutating requests echo the token automatically. |
| fetcher | `typeof globalThis.fetch` | no | | Custom fetch implementation for all API calls. Defaults to the global `fetch`. Useful for mock backends in demos/tests or custom retry/auth layers. |
| slotClasses | `Partial>` | no | | Per-slot class overrides. |
| t | `AuthLocale` | no | | Locale bundle. Auto-detected from i18n context when omitted. |
| unstyled | `boolean` | no | | Strip all default styling. |
### Slots (slotClasses keys)
`root`, `title`, `list`, `item`, `empty`, `badge`
---
## Sidebar
Sidebar primitive — fixed-position panel that is permanent on
desktop (≥1024px) and slides in as a backdropped overlay on mobile. Use
this directly for right-side detail panels or custom shells. For the
standard "permanent left rail + mobile hamburger" application chrome,
prefer the higher-level `` component, which handles main
content offset and the mobile header for you.
The component exposes `--sidebar-width` and `--sidebar-effective-width`
(0px when collapsed) as CSS variables on its `` element. CSS
custom properties only inherit to descendants, so these variables are
available **inside** the sidebar's subtree but not on its siblings — that
is precisely why `` exists for app-shell layouts.
**Import:** `import { Sidebar } from '@urbicon-ui/blocks';`
### Examples
```svelte
(detailOpen = true)}>Show details
{#snippet header()}
Item details
(detailOpen = false)}>
{/snippet}
Status
Active
```
```svelte
{#snippet header()}App {/snippet}
```
### Variants
- mode: collapsible, responsive (default: responsive)
- side: left, right (default: left)
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| ...HTMLAttributes | `HTMLAttributes` | no | | HTML attributes (excluding: 'children') |
| children | `Snippet` | no | | Main scrollable content of the sidebar. |
| class | `string` | no | | Additional CSS classes applied to the sidebar panel. |
| closeOnBackdropClick | `boolean` | no | true | Close the mobile overlay when clicking the backdrop. |
| closeOnEscape | `boolean` | no | true | Close the mobile overlay when pressing Escape. |
| footer | `Snippet` | no | | Content rendered in the sidebar footer (below the scrollable area). |
| header | `Snippet` | no | | Content rendered in the sidebar header (above the scrollable area). |
| mode | `SidebarVariants['mode']` | no | 'responsive' | Controls sidebar behavior across viewports. - `responsive` (default): permanently visible on desktop (≥1024px), slide-in overlay on mobile. - `collapsible`: toggleable via `open` at all viewports — width animation on desktop, overlay on mobile. |
| onOpenChange | `(open: boolean) => void` | no | | Fires when the open state changes (mobile overlay dismissed, or collapsible toggled). |
| open | `boolean` | no | | Controls sidebar visibility. In `responsive` mode (default) this only affects the mobile overlay — on desktop the sidebar is always visible. In `collapsible` mode this controls visibility at all viewports. Supports bind:open. |
| preset | `string` | no | | Apply a named preset registered via ``. Prefer this over `class` overrides when the requested look falls outside the semantic intent palette — presets keep hover/active/dark-mode logic coherent and make the custom look reusable across the project. |
| side | `SidebarVariants['side']` | no | 'left' | Which edge the sidebar attaches to. |
| slotClasses | `Partial>` | no | | Per-slot class overrides merged with variant styles. |
| unstyled | `boolean` | no | | Strip all default styles. Combine with slotClasses for custom appearance. |
| width | `string` | no | '16rem' | CSS width of the sidebar panel. Also exposed as `--sidebar-width` (constant) and `--sidebar-effective-width` (0px when collapsed) CSS variables on the ``. These inherit only inside the sidebar's own subtree — for the main content offset use ``. |
Inherited from:
- Omit, 'children'> (omit-pattern)
---
## SidebarLayout
App-shell layout that wires a `` to a main content
region and an optional mobile header. Use this whenever you want a
permanent sidebar on desktop with a hamburger overlay on mobile — it
resolves the CSS-variable scoping so the main content offset works without
boilerplate.
The component renders the sidebar internally; consumers configure it via
`sidebarHeader`, `sidebar`, and `sidebarFooter` snippets and bind `open`
for the mobile overlay (or for collapsible mode at all viewports).
For non-shell sidebars (right-side detail panels, drawers inside a page),
keep using the `` primitive directly.
**Import:** `import { SidebarLayout } from '@urbicon-ui/blocks';`
### Examples
```svelte
{#snippet sidebarHeader()}
My App
{/snippet}
{#snippet sidebar()}
Dashboard
Settings
{/snippet}
{#snippet mobileHeader({ openSidebar })}
My App
{/snippet}
Page content
```
```svelte
{#snippet sidebarHeader()}App {/snippet}
{#snippet sidebar()} {/snippet}
(sidebarOpen = !sidebarOpen)}>Toggle
```
### Variants
- contentMaxWidth: 2xl, lg, md, none, sm, xl (default: xl)
- side: left, right (default: left)
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| ...HTMLAttributes | `HTMLAttributes` | no | | HTML attributes (excluding: 'children') |
| children | `Snippet` | no | | Page content rendered inside the centered main column. |
| class | `string` | no | | Additional CSS classes applied to the root wrapper. |
| closeOnBackdropClick | `boolean` | no | true | Close the mobile sidebar overlay when clicking the backdrop. |
| closeOnEscape | `boolean` | no | true | Close the mobile sidebar overlay when pressing Escape. |
| contentMaxWidth | `SidebarLayoutVariants['contentMaxWidth']` | no | 'xl' | Maximum width of the centered content column. |
| mobileHeader | `Snippet<[MobileHeaderContext]>` | no | | Mobile header bar, hidden on desktop in `responsive` mode. Receives a helper to open the sidebar so a hamburger button needs no extra wiring. If omitted, no mobile header is rendered. |
| mode | `'responsive' | 'collapsible'` | no | 'responsive' | Sidebar mode. - `responsive` (default): permanent on desktop (≥1024px), slide-in overlay on mobile. - `collapsible`: toggleable at all viewports — width animation on desktop, overlay on mobile. |
| onOpenChange | `(open: boolean) => void` | no | | Fires when the sidebar open state changes. |
| open | `boolean` | no | false | Sidebar visibility. In `responsive` mode this only affects the mobile overlay. In `collapsible` mode it controls visibility at all viewports. Supports `bind:open`. |
| preset | `string` | no | | Apply a named preset registered via ``. Use this to share a branded shell look across the app instead of repeating class overrides. |
| side | `SidebarLayoutVariants['side']` | no | 'left' | Which edge the sidebar attaches to. |
| sidebar | `Snippet` | no | | Sidebar main content — typically a ``. |
| sidebarFooter | `Snippet` | no | | Sidebar footer (below the scrollable nav). |
| sidebarHeader | `Snippet` | no | | Sidebar header (above the scrollable nav). |
| sidebarWidth | `string` | no | '16rem' | Sidebar panel width. Single source of truth — the layout exposes it as `--sidebar-width` (constant) and `--sidebar-effective-width` (animates to `0` when collapsed) on the layout root, so the main content offset stays in sync automatically. |
| slotClasses | `Partial>` | no | | Per-slot class overrides. `sidebar*` slots are forwarded to the embedded `` component (mapped to its `slotClasses.panel`/`header`/...). |
| unstyled | `boolean` | no | | Strip all default styles. Combine with `slotClasses` for a custom layout. |
Inherited from:
- Omit, 'children'> (omit-pattern)
---
## Skeleton
Placeholder loading animation that mimics content layout.
Use to reduce perceived loading time and prevent layout shift.
**Import:** `import { Skeleton } from '@urbicon-ui/blocks';`
### Examples
```svelte
```
```svelte
```
### Variants
- variant: circular, rectangular, rounded, text (default: text)
- size: lg, md, sm, xl, xs (default: md)
- animation: none, pulse, wave (default: pulse)
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| ...ElementAttributes | `HTMLAttributes` | no | | All standard HTML element attributes |
| ...SkeletonVariants | `VariantProps` | no | | Styling variants from SkeletonVariants |
| animation | `SkeletonVariants['animation']` | no | | Animation style. `pulse` fades opacity, `wave` sweeps a shimmer gradient, `none` renders a static placeholder. All animations respect `prefers-reduced-motion`. |
| class | `string` | no | | Extra classes merged onto the root element (or wrapper when `count > 1`). |
| count | `number` | no | | Number of skeleton lines to render. Wraps items in a flex-column container when > 1. |
| gap | `string` | no | | Tailwind gap class between repeated lines (e.g. `"gap-2"`, `"gap-4"`). Only applies when `count > 1`. |
| height | `string` | no | | Custom height (CSS value, e.g. `"48px"`). Overrides the size preset height. |
| preset | `string` | no | | Apply a named preset registered via ``. Prefer this over `class` overrides when the requested look falls outside the semantic intent palette — presets keep hover/active/dark-mode logic coherent and make the custom look reusable across the project. |
| size | `SkeletonVariants['size']` | no | | Physical dimensions following the Standard size scale (xs–xl). Dimensions vary per variant — text heights range from h-3 (xs) to h-6 (xl), circular from 24 px to 64 px. |
| slotClasses | `Partial>` | no | | Per-slot class overrides merged with (or replacing, when `unstyled`) tv() output. Slots: base | wrapper |
| unstyled | `boolean` | no | | Strip all default tv() classes. Combine with `slotClasses` for full control. |
| variant | `SkeletonVariants['variant']` | no | | Shape preset. `text` is a slim bar, `circular` for avatars/icons, `rectangular` for images/cards, `rounded` like rectangular with softer corners. |
| width | `string` | no | | Custom width (CSS value, e.g. `"200px"` or `"100%"`). Overrides the size preset width. |
Inherited from:
- SkeletonVariants (external)
- HTMLAttributes (html-attributes)
---
## Slider
Slider for selecting a numeric value or range within min/max bounds.
Supports single and range modes, step snapping, tick marks, and labels.
Optional `validRange` and `recommendedRange` paint the track as a three-zone
gradient (red/yellow/green) and show a live status text that is also announced
via an ARIA live region. Both props are optional and additive — a slider
without `validRange`/`recommendedRange` behaves exactly as before.
**Import:** `import { Slider } from '@urbicon-ui/blocks';`
### Examples
```svelte
```
```svelte
```
```svelte
`${v} %`}
/>
```
### Variants
- intent: danger, neutral, primary, secondary, success, warning (default: primary)
- size: lg, md, sm (default: md)
- appearance: default, rail (default: default)
- disabled: true (default: false)
- messageType: error, helper (default: helper)
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| ...HTMLAttributes | `HTMLAttributes` | no | | HTML attributes (excluding: 'children' | 'class') |
| ...SliderVariants | `VariantProps` | no | | Styling variants from SliderVariants |
| class | `string` | no | | Extra classes merged onto the root wrapper. |
| disabled | `boolean` | no | false | Whether the Slider is disabled and non-interactive |
| error | `string` | no | | Error message below the slider. Overrides `helper`. |
| formatValue | `(value: number | [number, number]) => string` | no | | Format function for the displayed value. |
| helper | `string` | no | | Helper text below the slider. Hidden when `error` is set. |
| label | `string` | no | | Text label displayed above the slider. |
| marks | `SliderMark[]` | no | | Tick marks along the track. |
| max | `number` | no | 100 | Maximum allowed value. |
| min | `number` | no | 0 | Minimum allowed value. |
| mint | `MintProp` | no | 'none' | Micro-interaction preset. |
| name | `string` | no | | Shared `name` for hidden inputs for form submission. |
| onValueChange | `(value: number | [number, number]) => void` | no | | Fires after the value changes. Receives the new value. |
| outOfValidRangeIntent | `'danger' | 'warning'` | no | 'danger' | Intent applied outside the `validRange`. `'warning'` for softer limits (recommendation, not a violation), `'danger'` for hard limits. |
| preset | `string` | no | | Apply a named preset registered via ``. Prefer this over `class` overrides when the requested look falls outside the semantic intent palette — presets keep hover/active/dark-mode logic coherent and make the custom look reusable across the project. |
| range | `boolean` | no | false | Enable range mode with two thumbs. |
| rangeStatusText | `SliderRangeStatusText` | no | | Custom status texts for the three zones. Defaults to the UIB i18n localization (`bt('slider.rangeStatus.*')`). |
| recommendedRange | `[number, number]` | no | | Recommended value range (UX recommendation, softer than `validRange`). Values inside appear green, values outside yellow (warning). Typically `recommendedRange ⊂ validRange`, but this is not enforced. |
| showValue | `boolean` | no | false | Show the current value next to the label. |
| slotClasses | `Partial>` | no | | Per-slot class overrides merged with tv() styles. Slots: wrapper (root — what `class` also targets) | header | label | valueText | base (the interactive track container) | track | range | thumb | mark | boundaryTick | rangeStatus | rangeStatusIcon | message. |
| step | `number` | no | 1 | Snap to increments of this value. |
| unstyled | `boolean` | no | | Remove all default tv() classes. |
| validRange | `[number, number]` | no | | Valid value range (e.g. a legal limit). Values outside it style track and thumb in the `outOfValidRangeIntent` color (default: `danger`). Status changes are announced via an ARIA live region. If the range lies outside `[min, max]`, a console warning is emitted — the visible `min`/`max` are NOT shifted automatically. |
| value | `number | [number, number]` | no | | Current value. Number for single, [min, max] tuple for range. Supports `bind:value`. |
| intent | `'danger' | 'neutral' | 'primary' | 'secondary' | 'success' | 'warning'` | no | primary | Controls the color theme and semantic meaning of the Slider. Affects the overall appearance and user perception. Available options: danger, neutral, primary, and 3 more. |
| size | `'lg' | 'md' | 'sm'` | no | md | Controls the dimensions, padding, and text size of the Slider. Affects the component's physical footprint. Available options: lg, md, sm. |
| appearance | `'default' | 'rail'` | no | default | Controls the appearance behavior and appearance of the Slider component. Available options: default, rail. |
| messageType | `'error' | 'helper'` | no | helper | Controls the messageType behavior and appearance of the Slider component. Available options: error, helper. |
Inherited from:
- Omit (omit-pattern)
- Omit, 'children' | 'class'> (omit-pattern)
---
## Sparkline
Tiny inline trend line — no axes, no labels — sized to flow in
table cells, cards, or running text. Zero-dependency SVG, optional area fill
and end-point dot. Aria-hidden by default with an optional `ariaLabel`.
**Import:** `import { Sparkline } from '@urbicon-ui/blocks';`
### Examples
```svelte
```
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| data | `number[]` | yes | | Sequence of values plotted left → right. |
| ...HTMLAttributes | `HTMLAttributes` | no | | HTML attributes (excluding: 'children') |
| area | `boolean` | no | false | Fill the area under the line. |
| ariaLabel | `string` | no | | Accessible label; when omitted the sparkline is aria-hidden. |
| class | `string` | no | | Extra classes merged onto the wrapper. |
| color | `string` | no | var(--color-chart-1) | Color property for the Sparkline component |
| height | `number` | no | 24 | Height property for the Sparkline component |
| showEndPoint | `boolean` | no | false | Mark the last point with a dot. |
| slotClasses | `SparklineSlotClasses` | no | | Per-slot class overrides. |
| strokeWidth | `number` | no | 1.5 | StrokeWidth property for the Sparkline component |
| unstyled | `boolean` | no | | Remove all default classes. |
| width | `number` | no | 96 | Width property for the Sparkline component |
Inherited from:
- Omit, 'children'> (omit-pattern)
---
## Spinner
Animated loading indicator with multiple animation styles and semantic intents.
**Import:** `import { Spinner } from '@urbicon-ui/blocks';`
### Examples
```svelte
```
```svelte
```
### Variants
- intent: current, danger, neutral, primary, secondary, success, warning (default: primary)
- variant: bars, default, dots, pulse, ring (default: default)
- size: lg, md, sm, xl, xs (default: md)
- speed: fast, normal, slow (default: normal)
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| ...HTMLAttributes | `HTMLAttributes` | no | | HTML attributes (excluding: 'children') |
| ...SpinnerVariants | `VariantProps` | no | | Styling variants from SpinnerVariants |
| children | `Snippet` | no | | Optional content rendered beside the spinner (e.g. loading text). |
| class | `string` | no | | Extra classes merged onto the root element. |
| intent | `SpinnerVariants['intent']` | no | | Semantic color applied via `text-*` token. |
| label | `string` | no | | Accessible label announced by screen readers. Defaults to "Loading...". |
| preset | `string` | no | | Apply a named preset registered via ``. Prefer this over `class` overrides when the requested look falls outside the semantic intent palette — presets keep hover/active/dark-mode logic coherent and make the custom look reusable across the project. |
| size | `SpinnerVariants['size']` | no | | Physical dimensions from `xs` (16 px) to `xl` (40 px). |
| slotClasses | `Partial>` | no | | Per-slot class overrides merged with (or replacing, when `unstyled`) tv() output. Slots: base | svg | svgCircle | svgPath | dots | dot | pulse | pulseCenter | pulseRing | ring | ringElement | bars | bar | content | srOnly |
| speed | `SpinnerVariants['speed']` | no | | Animation speed — controls `--spinner-speed` custom property. |
| unstyled | `boolean` | no | | Strip all default tv() classes. Combine with `slotClasses` for full control. |
| variant | `SpinnerVariants['variant']` | no | | Animation style. `default` is an SVG arc, `dots` bounces three dots, `pulse` radiates a sonar ping, `ring` spins cascading borders, `bars` animates vertical equalizer bars. |
| visible | `boolean` | no | | When false the spinner is removed from the DOM. |
Inherited from:
- SpinnerVariants (external)
- Omit, 'children'> (omit-pattern)
---
## Stepper
Multi-step progress indicator with horizontal/vertical layout,
clickable navigation, and per-step state overrides (error, warning).
**Import:** `import { Stepper } from '@urbicon-ui/blocks';`
### Examples
```svelte
```
```svelte
Form content here...
```
### Variants
- variant: default, minimal, outlined (default: default)
- size: lg, md, sm (default: md)
- orientation: horizontal, vertical (default: horizontal)
- tier: commit, modify (default: commit)
### Api
| Prop | Type | Required | Default | Description |
| --- | --- | :---: | --- | --- |
| children | `Snippet` | yes | | StepperStep children. |
| ...HTMLAttributes | `HTMLAttributes` | no | | HTML attributes (excluding: 'children') |
| ...StepperVariants | `VariantProps` | no | | Styling variants from StepperVariants |
| activeStep | `number` | no | 0 | Current active step index (0-based). Supports bind:activeStep. |
| class | `string` | no | | Extra classes merged onto the root element. |
| clickable | `boolean` | no | false | Allow clicking step indicators to navigate between steps. |
| disabled | `boolean` | no | false | Disable all steps and prevent navigation. |
| linear | `boolean` | no | false | Restrict navigation to sequential order — only completed steps and the next step are clickable. |
| onStepChange | `(step: number) => void` | no | | Fires when a step is activated via click. Passes the new step index. |
| orientation | `'horizontal' | 'vertical'` | no | 'horizontal' | Orientation property for the Stepper component |
| preset | `string` | no | | Apply a named preset registered via ``. Prefer this over `class` overrides when the requested look falls outside the semantic intent palette — presets keep hover/active/dark-mode logic coherent and make the custom look reusable across the project. |
| responsive | `boolean | { breakpoint?: number }` | no | false | Container-responsive mode: when the Stepper's container is narrower than `breakpoint`, automatically switch to `orientation="vertical"` and `variant="minimal"` so the steps stay readable. - `false` (default): never auto-switch. - `true`: switch below 640 px container width. - `{ breakpoint: 480 }`: switch below 480 px. Uses `ResizeObserver` on the root element — works inside Drawers, Cards, or split layouts where viewport-based media queries miss the actual available width. |
| size | `'sm' | 'md' | 'lg'` | no | 'md' | Size variant that controls dimensions and spacing of the Stepper |
| slotClasses | `Partial>` | no | | Per-slot class overrides. Slots: base | stepItem | step | indicatorColumn | indicator | labelGroup | label | description | separator | content |
| tier | `InteractiveTier` | no | 'commit' | Semantic radius tier propagated to every StepperStep. Default `commit` — step indicators read as identity circles. Set to `modify` (or inherit via TierContext from a wrapping `