@leta-io/components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +42 -0
  2. package/dist/assets/avatar-photo-1.png +0 -0
  3. package/dist/assets/avatar-photo-2.png +0 -0
  4. package/dist/assets/avatar-photo-3.png +0 -0
  5. package/dist/assets/error.png +0 -0
  6. package/dist/assets/error.webp +0 -0
  7. package/dist/assets/file-upload.png +0 -0
  8. package/dist/assets/file-upload.webp +0 -0
  9. package/dist/assets/image-upload.png +0 -0
  10. package/dist/assets/image-upload.webp +0 -0
  11. package/dist/assets/leta-loader.json +1 -0
  12. package/dist/assets/new-update.png +0 -0
  13. package/dist/assets/new-update.webp +0 -0
  14. package/dist/assets/no-broadcast-logs.png +0 -0
  15. package/dist/assets/no-broadcast-logs.webp +0 -0
  16. package/dist/assets/no-comments.png +0 -0
  17. package/dist/assets/no-comments.webp +0 -0
  18. package/dist/assets/no-data.png +0 -0
  19. package/dist/assets/no-data.webp +0 -0
  20. package/dist/assets/no-drivers.png +0 -0
  21. package/dist/assets/no-drivers.webp +0 -0
  22. package/dist/assets/no-items.png +0 -0
  23. package/dist/assets/no-items.webp +0 -0
  24. package/dist/assets/no-network.png +0 -0
  25. package/dist/assets/no-network.webp +0 -0
  26. package/dist/assets/no-notifications.png +0 -0
  27. package/dist/assets/no-notifications.webp +0 -0
  28. package/dist/assets/no-orders.png +0 -0
  29. package/dist/assets/no-orders.webp +0 -0
  30. package/dist/assets/no-results.png +0 -0
  31. package/dist/assets/no-results.webp +0 -0
  32. package/dist/assets/no-reviews.png +0 -0
  33. package/dist/assets/no-reviews.webp +0 -0
  34. package/dist/assets/no-suspensions.png +0 -0
  35. package/dist/assets/no-suspensions.webp +0 -0
  36. package/dist/assets/no-trips.png +0 -0
  37. package/dist/assets/no-trips.webp +0 -0
  38. package/dist/index.d.ts +4719 -0
  39. package/dist/index.js +12962 -0
  40. package/package.json +53 -0
@@ -0,0 +1,4719 @@
1
+ import * as React from 'react';
2
+ import { IconName } from '@leta-io/icons';
3
+ import { Map } from 'leaflet';
4
+ import * as react_jsx_runtime from 'react/jsx-runtime';
5
+
6
+ interface ToggleProps {
7
+ checked?: boolean;
8
+ defaultChecked?: boolean;
9
+ disabled?: boolean;
10
+ onChange?: (checked: boolean) => void;
11
+ 'aria-label'?: string;
12
+ 'aria-labelledby'?: string;
13
+ className?: string;
14
+ id?: string;
15
+ name?: string;
16
+ }
17
+ declare const Toggle: React.ForwardRefExoticComponent<ToggleProps & React.RefAttributes<HTMLButtonElement>>;
18
+
19
+ /**
20
+ * Toggle Button (Figma `10900:15545`) — a binary, icon-only switch that holds
21
+ * its on/off state until pressed again (unlike a standard action Button, which
22
+ * fires a one-shot command). Use it for isolated settings (Mute, Bookmark,
23
+ * Pin) and formatting toggles (Bold / Italic / Underline in a rich toolbar).
24
+ * Works on both desktop and mobile.
25
+ *
26
+ * The on/off state is exposed to assistive tech via **`aria-pressed`** ("Toggle
27
+ * Button, pressed" / "…, not pressed"). Same press/hover micro-animations as
28
+ * `Button` (150ms colour/shadow transitions + `scale(0.96)` on press).
29
+ *
30
+ * States (Figma): Idle (transparent) · Hover (neutral bg+border) · Pressed
31
+ * (mouse-down, darker neutral) · Selected (`aria-pressed`, secondary bg+border)
32
+ * · Focus (ring) · Disabled (dimmed icon).
33
+ */
34
+ interface ToggleButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {
35
+ /** The glyph (required — the button is icon-only). */
36
+ icon: IconName;
37
+ /** Render the outlined icon variant. */
38
+ outlined?: boolean;
39
+ /** Controlled on/off state (drives `aria-pressed`). Omit for uncontrolled. */
40
+ pressed?: boolean;
41
+ /** Initial on/off state when uncontrolled. Default `false`. */
42
+ defaultPressed?: boolean;
43
+ /** Fired with the new on/off state when toggled. */
44
+ onPressedChange?: (pressed: boolean) => void;
45
+ /** Accessible name — REQUIRED (the button has no text). */
46
+ 'aria-label': string;
47
+ }
48
+ declare const ToggleButton: React.ForwardRefExoticComponent<ToggleButtonProps & React.RefAttributes<HTMLButtonElement>>;
49
+
50
+ interface CheckboxProps {
51
+ checked?: boolean;
52
+ defaultChecked?: boolean;
53
+ indeterminate?: boolean;
54
+ disabled?: boolean;
55
+ onChange?: (checked: boolean) => void;
56
+ 'aria-label'?: string;
57
+ 'aria-labelledby'?: string;
58
+ className?: string;
59
+ id?: string;
60
+ name?: string;
61
+ value?: string;
62
+ }
63
+ declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
64
+
65
+ interface RadioButtonProps {
66
+ checked?: boolean;
67
+ defaultChecked?: boolean;
68
+ disabled?: boolean;
69
+ onChange?: (checked: boolean) => void;
70
+ 'aria-label'?: string;
71
+ 'aria-labelledby'?: string;
72
+ className?: string;
73
+ id?: string;
74
+ name?: string;
75
+ value?: string;
76
+ }
77
+ declare const RadioButton: React.ForwardRefExoticComponent<RadioButtonProps & React.RefAttributes<HTMLInputElement>>;
78
+
79
+ interface LetaLogoProps extends Omit<React.SVGProps<SVGSVGElement>, 'type'> {
80
+ type?: 'symbol' | 'wordmark';
81
+ size?: 'small' | 'medium' | 'large';
82
+ }
83
+ declare const LetaLogo: React.ForwardRefExoticComponent<Omit<LetaLogoProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
84
+
85
+ type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'ghost-error' | 'dashed' | 'destructive' | 'plain' | 'success';
86
+ type ButtonSize = 'extra-small' | 'small' | 'medium' | 'large' | 'fab';
87
+ type ButtonPlatform = 'desktop' | 'mobile';
88
+ interface ButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
89
+ /** Visual variant. Default: 'primary'. Mobile-only: 'success'. FAB-only: 'primary' / 'secondary'. */
90
+ variant?: ButtonVariant;
91
+ /** Size. Default: 'medium'. FAB has no Disabled state. */
92
+ size?: ButtonSize;
93
+ /** Platform token set. Default: 'desktop'. */
94
+ platform?: ButtonPlatform;
95
+ /** Leading icon (`IconName` from @leta-io/icons). With both iconLeft and iconRight + label, renders as Split Button. */
96
+ iconLeft?: IconName;
97
+ /** Trailing icon. */
98
+ iconRight?: IconName;
99
+ /** When set, button renders icon-only — `children` is ignored. `aria-label` is required. */
100
+ iconOnly?: IconName;
101
+ /** Desktop-only "Prominent Icon Only" treatment (medium size only). Larger icon, tighter padding. */
102
+ prominent?: boolean;
103
+ /** Render the button's icon(s) using their outlined glyph variant (Figma `Icon/*-Outline`). Default false. */
104
+ iconOutlined?: boolean;
105
+ /** For Plain variant: render the link underline. Default: true. */
106
+ showUnderline?: boolean;
107
+ /** Standard HTML button type attribute. */
108
+ type?: 'button' | 'submit' | 'reset';
109
+ /**
110
+ * When set, clicking cross-fades the button's icon to this icon for
111
+ * `copiedDuration` ms — the "copy → check" contextual animation.
112
+ * Works with `iconOnly`, `iconLeft`, and `iconRight`.
113
+ */
114
+ copyIcon?: IconName;
115
+ /** When provided and `copyIcon` is set, the label text swaps to this string while copied. */
116
+ copiedLabel?: string;
117
+ /** How long (ms) to show the copied state before resetting. Default 2000. */
118
+ copiedDuration?: number;
119
+ }
120
+ declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
121
+
122
+ type CollapsedSidebarLogoProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'children'> & {
123
+ /** Required for screen reader users. Suggested: "Expand sidebar". */
124
+ 'aria-label': string;
125
+ };
126
+ declare const CollapsedSidebarLogo: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "children" | "type"> & {
127
+ /** Required for screen reader users. Suggested: "Expand sidebar". */
128
+ 'aria-label': string;
129
+ } & React.RefAttributes<HTMLButtonElement>>;
130
+
131
+ type AvatarSize = 'xs' | 'small' | 'medium' | 'large';
132
+ type AvatarTone = 'teal' | 'warning' | 'yankee-blue';
133
+ interface AvatarProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
134
+ /** Required — used as the accessible name and as the source for derived initials. */
135
+ name: string;
136
+ size?: AvatarSize;
137
+ /** Photo URL. If it fails to load (onError), Avatar falls back to initials on the chosen tone. */
138
+ src?: string;
139
+ /** Tonal background for the initials render mode. Default: 'yankee-blue'. */
140
+ tone?: AvatarTone;
141
+ /** Override the derived initials (e.g. corporate accounts using "CO" instead of name-derived). */
142
+ initials?: string;
143
+ /** When nested inside an already-labeled interactive parent, set this to hide from SR. */
144
+ decorative?: boolean;
145
+ }
146
+ declare const Avatar: React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLSpanElement>>;
147
+
148
+ /** The Figma Avatar photo set: `[Photo 1, Photo 2, Photo 3]`. */
149
+ declare const AVATAR_PHOTOS: readonly [string, string, string];
150
+
151
+ type BadgeColor = 'caution' | 'warning' | 'error' | 'information' | 'success' | 'notice' | 'primary' | 'primary-alt' | 'neutral' | 'highlight' | 'secondary';
152
+ interface BadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
153
+ /** Badge label text. */
154
+ label: string;
155
+ /** Semantic color variant. Default: 'neutral'. */
156
+ color?: BadgeColor;
157
+ /** Icon rendered before the label (Figma "Leading Icon" type). */
158
+ leadingIcon?: IconName;
159
+ /** Icon rendered after the label (Figma "Trailing Icon" type). */
160
+ trailingIcon?: IconName;
161
+ /**
162
+ * Render the badge's icon(s) outlined rather than filled. Defaults to
163
+ * **filled**, matching Figma's Delivery Badges (`68:36703`), whose icon
164
+ * instances are all filled glyphs (`Icon/Return`, `Icon/Broadcast`,
165
+ * `Icon/Check-Circle` — never the `-Outline` siblings). Mirrors `Button`'s
166
+ * `iconOutlined`: without an explicit value the library-wide outlined default
167
+ * would silently flip these to the thinner outline glyph.
168
+ */
169
+ iconOutlined?: boolean;
170
+ /**
171
+ * Override the icon tint. Defaults to the badge colour's own icon token, which
172
+ * is right for a badge whose icon reinforces its semantic (a red Error glyph on
173
+ * an error badge). Set this when the glyph carries its own fixed meaning
174
+ * independent of the badge colour — e.g. the driver rating's gold star on a
175
+ * neutral badge (`--icons-caution-default`).
176
+ */
177
+ iconColor?: string;
178
+ }
179
+ /**
180
+ * Desktop Badge — a compact, non-interactive label that states a fact about the
181
+ * thing beside it: a status, a count, an outcome.
182
+ *
183
+ * **When to use:** naming state on a row, card or header.
184
+ * **When not to use:** anything the user can act on (Chip / Tag / Button).
185
+ *
186
+ * ## Badges do not normally carry a tooltip — the SLA badge is the exception
187
+ *
188
+ * A badge is already the short form of its own meaning, so hovering one usually
189
+ * has nothing left to reveal, and attaching a tip to every badge would put
190
+ * hover targets all over a table that reward the user with a restatement.
191
+ *
192
+ * An **SLA badge is the deliberate exception**: it is interactive when there is
193
+ * additional SLA information behind it, and hovering or focusing it reveals the
194
+ * relevant SLA tooltip — the state badge repeated as a heading, over a sentence
195
+ * naming what is late and against which configured target (Figma
196
+ * `2032:131435` … `2038:133959`). The extra information is real, and it is the
197
+ * only thing that turns "Delayed" into something a dispatcher can act on.
198
+ *
199
+ * The rule that follows from that (ruled 2026-09-04): **wherever the same order
200
+ * shows an SLA badge, it shows the same SLA tooltip** — the drawer's badge and
201
+ * the table row's status icon resolve one tooltip, never two copies. In this
202
+ * repo that single source is the playground's `lib/slaTip.tsx`.
203
+ */
204
+ declare const Badge: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>>;
205
+
206
+ interface TagProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
207
+ /** Tag label text. */
208
+ label: string;
209
+ /**
210
+ * When provided, renders a trailing Cancel icon as a <button>.
211
+ * Callback fires on button click.
212
+ */
213
+ onRemove?: (e: React.MouseEvent<HTMLButtonElement>) => void;
214
+ /** Accessible label for the remove button. Default: "Remove". */
215
+ removeLabel?: string;
216
+ }
217
+ declare const Tag: React.ForwardRefExoticComponent<TagProps & React.RefAttributes<HTMLSpanElement>>;
218
+
219
+ interface ChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
220
+ /** Chip label text. */
221
+ label: string;
222
+ /** Optional icon before the label. */
223
+ leadingIcon?: IconName;
224
+ /** Optional icon after the label. */
225
+ trailingIcon?: IconName;
226
+ /** When true the chip renders in the Active (selected) state. Caller-controlled. */
227
+ active?: boolean;
228
+ }
229
+ /**
230
+ * Desktop Chip — a compact, pill-shaped element that represents a specific
231
+ * piece of information, an attribute, or a discrete action. Chips help users
232
+ * filter content, make selections, or trigger context-specific tasks.
233
+ *
234
+ * **When to use:**
235
+ * - Above **stacked lists** to filter the items shown.
236
+ * - As toggleable attribute tags (e.g. category, status, type).
237
+ * - As compact triggers for a context-specific action tied to a list item.
238
+ *
239
+ * **When NOT to use:**
240
+ * - To filter **table** data — use the table's built-in column filters instead.
241
+ * - As a navigation element — use Tabs or Segments for that.
242
+ * - To replace a full-width button or a form control.
243
+ *
244
+ * 4 types (No Icon / Leading / Trailing / Leading + Trailing) × 5 states
245
+ * (Idle / Hover / Pressed / Active / Focus) = 20 Figma variants (`7139:53343`).
246
+ * Renders as a `<button>`; Active state is caller-controlled via the `active` prop.
247
+ */
248
+ declare const Chip: React.ForwardRefExoticComponent<ChipProps & React.RefAttributes<HTMLButtonElement>>;
249
+
250
+ interface FlagProps extends React.SVGProps<SVGSVGElement> {
251
+ /**
252
+ * ISO 3166-1 alpha-2 country code, e.g. "US", "DE", "GB".
253
+ * Subdivision codes from Figma (e.g. "GB-ENG", "BQ-BO") are also accepted.
254
+ */
255
+ code: string;
256
+ }
257
+ declare const Flag: React.ForwardRefExoticComponent<Omit<FlagProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
258
+
259
+ type FeaturedIconColor = 'information' | 'highlight' | 'error' | 'success' | 'neutral' | 'warning' | 'teal';
260
+ type FeaturedIconSize = 'medium' | 'large';
261
+ interface FeaturedIconProps extends React.HTMLAttributes<HTMLSpanElement> {
262
+ /** Any icon from @leta-io/icons. */
263
+ icon: IconName;
264
+ /**
265
+ * Semantic color variant — controls background tint and icon tint.
266
+ * Maps directly to Figma's "Property 1" variant property.
267
+ */
268
+ color: FeaturedIconColor;
269
+ /**
270
+ * Size variant.
271
+ * - medium: 32 × 32 px container, 16 px icon
272
+ * - large: 40 × 40 px container, 20 px icon
273
+ * @default 'medium'
274
+ */
275
+ size?: FeaturedIconSize;
276
+ /**
277
+ * Container shape.
278
+ * - `rounded`: rounded square (`--rounding-lg`) — the component default.
279
+ * - `circle`: fully round (`--rounding-round`) — matches Figma instances that
280
+ * override the corner radius (e.g. the Table Cell "API" type).
281
+ * @default 'rounded'
282
+ */
283
+ shape?: 'rounded' | 'circle';
284
+ /**
285
+ * Render the icon glyph outlined rather than filled. Defaults to filled so
286
+ * existing consumers are unchanged; pass `true` where the design uses the
287
+ * outlined glyph (e.g. Order Detail item cards use `Orders` outlined).
288
+ * @default false
289
+ */
290
+ outlined?: boolean;
291
+ }
292
+ /**
293
+ * Featured Icon — a rounded-square container with a centered icon, used as a
294
+ * visual anchor for card section titles. Non-interactive, purely presentational.
295
+ */
296
+ declare const FeaturedIcon: React.ForwardRefExoticComponent<FeaturedIconProps & React.RefAttributes<HTMLSpanElement>>;
297
+
298
+ interface ViewSwitcherTabProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
299
+ /** Tab label text. */
300
+ label: string;
301
+ /** Optional icon before the label. */
302
+ leadingIcon?: IconName;
303
+ /** When true the tab renders in the Active (selected) state. Caller-controlled. */
304
+ active?: boolean;
305
+ }
306
+ /**
307
+ * View Switcher Tab — compact tab for switching content layout (e.g. Grid vs
308
+ * List). Base component for the View Switcher molecule.
309
+ *
310
+ * 3 visual states: Default, Hover, Active (selected).
311
+ * Active state is caller-controlled via the `active` prop.
312
+ */
313
+ declare const ViewSwitcherTab: React.ForwardRefExoticComponent<ViewSwitcherTabProps & React.RefAttributes<HTMLButtonElement>>;
314
+
315
+ interface SegmentSwitcherTabProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
316
+ /** Tab label text. */
317
+ label: string;
318
+ /** Optional icon before the label. */
319
+ leadingIcon?: IconName;
320
+ /** When true the tab renders in the Active (selected) state. Caller-controlled. */
321
+ active?: boolean;
322
+ }
323
+ /**
324
+ * Segment Switcher Tab — prominent tab for high-level navigation within a
325
+ * container. Base component for the Segment Switcher molecule.
326
+ *
327
+ * Larger than View Switcher Tab: 40px height, Label/L/SemiBold text, 20–24px icon.
328
+ * 3 visual states: Default, Hover, Active (selected).
329
+ */
330
+ declare const SegmentSwitcherTab: React.ForwardRefExoticComponent<SegmentSwitcherTabProps & React.RefAttributes<HTMLButtonElement>>;
331
+
332
+ interface PageTabProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
333
+ /** Tab label text. */
334
+ label: string;
335
+ /** When true the tab renders in the Active (selected) state with underline indicator. */
336
+ active?: boolean;
337
+ }
338
+ /**
339
+ * Page Tab — standard page-level tab with bottom underline indicator.
340
+ *
341
+ * 4 visual states: Idle, Hover, Pressed, Active.
342
+ * Active state includes a 2px bottom indicator bar.
343
+ */
344
+ declare const PageTab: React.ForwardRefExoticComponent<PageTabProps & React.RefAttributes<HTMLButtonElement>>;
345
+
346
+ interface WizardTabProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
347
+ /**
348
+ * The step's name **without its number** — "Select Driver", not
349
+ * "1. Select Driver". The number is prepended from {@link step}, so it cannot
350
+ * drift from the tab's position.
351
+ */
352
+ label: string;
353
+ /** Step number, rendered as the `"{step}. "` prefix on the label. */
354
+ step: string | number;
355
+ /** When true the tab renders in the Active (selected) state with underline indicator. */
356
+ active?: boolean;
357
+ /**
358
+ * When true the tab renders at 60% opacity AND is fully non-interactive:
359
+ * no hover/pressed visual, not focusable (`tabIndex=-1`), not clickable,
360
+ * `aria-disabled`. Used for future/unreached steps in a wizard flow — the user
361
+ * hasn't completed the current step yet, so they can't jump ahead. Completed
362
+ * steps stay in the Idle state (hoverable + clickable to go back).
363
+ */
364
+ inactive?: boolean;
365
+ }
366
+ /**
367
+ * Wizard Tab — step tab for multi-step wizard flows.
368
+ *
369
+ * Mirrors the Library set **`Wizard Tabs` `9817:17894`** (`Property 2` =
370
+ * Active / Hover / Idle / Pressed / Inactive), re-enumerated 2026-09-08.
371
+ *
372
+ * ## The step circle is gone (2026-09-08)
373
+ *
374
+ * The designer restructured this component: there is **no numbered circle badge**
375
+ * any more. The step number is simply the head of the label — Figma's `Tab Name`
376
+ * property literally reads `"1. Default"` — and the tab is otherwise a plain
377
+ * underline tab.
378
+ *
379
+ * ## Which makes it a `PageTab` with two additions, so it composes one
380
+ *
381
+ * Every remaining state matches {@link PageTab} token for token — Active and
382
+ * Pressed `--text-secondary-label`, Hover `--text-default-label`, Idle
383
+ * `--text-default-label-idle`, and a 2px `--icons-secondary-default` indicator on
384
+ * Active only — over the same 40px-tall, `--padding-12px` shell. So this renders a
385
+ * `PageTab` rather than a second copy of that styling: the two components are now
386
+ * the same tab in the design, and duplicating it is how they would quietly drift
387
+ * apart on the next change to either.
388
+ *
389
+ * What it adds on top:
390
+ *
391
+ * 1. **The `"{step}. "` prefix**, composed here so the number always agrees with
392
+ * the tab's own position (see {@link step}).
393
+ * 2. **The `Inactive` state**, which `PageTab` has no equivalent of: 60% opacity
394
+ * *and* genuinely inert — a future step can't be hovered, focused, or clicked
395
+ * into, because the user hasn't finished the step they're on. `pointerEvents:
396
+ * none` is what suppresses the composed tab's own hover/press tracking; a
397
+ * visual-only dim would still light up under the cursor.
398
+ */
399
+ declare const WizardTab: React.ForwardRefExoticComponent<WizardTabProps & React.RefAttributes<HTMLButtonElement>>;
400
+
401
+ type MapIconVariant = 'object-pin' | 'numeric-pin' | 'badge' | 'event-pin' | 'bike-delivery';
402
+ interface MapIconProps extends React.HTMLAttributes<HTMLDivElement> {
403
+ /** Which shape to render. */
404
+ variant: MapIconVariant;
405
+ /**
406
+ * Fill colour for the inner Background shape (the coloured circle inside the
407
+ * pin / behind the badge content). Default: 'var(--surface-secondary-bg)'.
408
+ * The outer pin/badge body is always white with a light-gray stroke for
409
+ * visibility against white-background maps.
410
+ *
411
+ * For `event-pin`, this controls the pin-icon colour instead.
412
+ * Ignored for `bike-delivery` (fixed illustration).
413
+ */
414
+ color?: string;
415
+ /**
416
+ * Icon to display inside Object Pin or Badge.
417
+ * Takes precedence over `text` when both are supplied.
418
+ */
419
+ icon?: IconName;
420
+ /**
421
+ * Text to display (e.g. a count like "5") — required for `numeric-pin`,
422
+ * optional for `badge`. Ignored for `object-pin`, `event-pin`, `bike-delivery`.
423
+ */
424
+ text?: string;
425
+ }
426
+ /**
427
+ * Map Icon — base map marker component for LETA map interfaces.
428
+ *
429
+ * Five variants:
430
+ * - **object-pin** — teardrop with an inner coloured circle + an icon (default: User)
431
+ * - **numeric-pin** — teardrop with an inner coloured circle + a number (`text`)
432
+ * - **badge** — circle with an inner coloured fill + text or icon
433
+ * - **event-pin** — solid teardrop with built-in Location-Check icon
434
+ * - **bike-delivery** — fixed 19×32 raster illustration of a top-down bike courier
435
+ *
436
+ * Interactive — consumers attach onClick / onMouseEnter handlers for
437
+ * tooltips, drawers, modals, etc.
438
+ */
439
+ declare const MapIcon: React.ForwardRefExoticComponent<MapIconProps & React.RefAttributes<HTMLDivElement>>;
440
+
441
+ type TitleVariant = 'page-dialog' | 'card';
442
+ interface TitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
443
+ /** Heading text. @default 'Heading 1' (matches Figma default). */
444
+ text?: string;
445
+ /**
446
+ * Visual variant — matches Figma `Property 1`.
447
+ * - `page-dialog` → Heading/M/SemiBold (24px / 28px line-height)
448
+ * - `card` → Body/L/SemiBold (16px / 24px line-height)
449
+ * @default 'page-dialog'
450
+ */
451
+ variant?: TitleVariant;
452
+ /**
453
+ * Semantic heading level to render. The visual size is controlled by
454
+ * `variant` — `as` only affects the underlying HTML tag for accessibility
455
+ * and document outline purposes.
456
+ * @default 'h2'
457
+ */
458
+ as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
459
+ }
460
+ /**
461
+ * Title — non-interactive heading element from Figma `6767:26920` ("Titles").
462
+ *
463
+ * Two variants:
464
+ * - **Page & Dialog Title** — top-level page or modal heading
465
+ * - **Card Title** — section / card heading
466
+ *
467
+ * The semantic HTML element is decoupled from the visual variant — callers
468
+ * pick `as` to fit their document outline, and `variant` to control size.
469
+ */
470
+ declare const Title: React.ForwardRefExoticComponent<TitleProps & React.RefAttributes<HTMLHeadingElement>>;
471
+
472
+ type MobileBadgeColor = 'blue' | 'green' | 'red' | 'orange' | 'yellow' | 'purple' | 'grey' | 'coral-red';
473
+ type MobileBadgeVariant = 'basic' | 'progress';
474
+ interface MobileBadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
475
+ /** Badge label text. */
476
+ label: string;
477
+ /**
478
+ * Semantic colour. Each value maps to a `--surface/{semantic}/mobile-badge`,
479
+ * `--border/{semantic}/mobile-badge`, and `--text/{semantic}/label` token triple.
480
+ * Per Figma `3100:17588`.
481
+ *
482
+ * Ignored for `variant="progress"` (always uses the grey/neutral palette per Figma).
483
+ */
484
+ color: MobileBadgeColor;
485
+ /** Optional leading (left) icon, 14×14. Ignored when `variant="progress"`. */
486
+ leadingIcon?: IconName;
487
+ /** Optional trailing (right) icon, 14×14. Ignored when `variant="progress"`. */
488
+ trailingIcon?: IconName;
489
+ /**
490
+ * Badge layout variant.
491
+ * - `basic` (default): plain text badge with optional icons.
492
+ * - `progress`: leading-indicator badge with a `ProgressTracker` on the left and progress text.
493
+ * Always renders in the grey/neutral palette per Figma.
494
+ */
495
+ variant?: MobileBadgeVariant;
496
+ /**
497
+ * Progress value 0–100, used only when `variant="progress"`.
498
+ * @default 0
499
+ */
500
+ progressValue?: number;
501
+ }
502
+ /**
503
+ * Mobile Badge — compact pill-shaped status indicator for mobile interfaces.
504
+ *
505
+ * 8 colour variants × 3 icon-position types (No Icon / Leading / Trailing) = 24
506
+ * Figma variants under node `3100:17588`. Purely presentational — non-interactive.
507
+ *
508
+ * Padding is asymmetric: the icon-side uses `--padding-6px` and the text-side
509
+ * uses `--padding-8px`. No Icon uses 8/8.
510
+ *
511
+ * Typography: Caption/L/SemiBold (10/16/-0.28). Icons render at 14×14 with
512
+ * `color` matching the text colour.
513
+ */
514
+ declare const MobileBadge: React.ForwardRefExoticComponent<MobileBadgeProps & React.RefAttributes<HTMLSpanElement>>;
515
+
516
+ interface MobileChipProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
517
+ /** Chip label text. */
518
+ label: string;
519
+ /** Optional leading (left) icon, 16×16. */
520
+ leadingIcon?: IconName;
521
+ /** Optional trailing (right) icon, 16×16. */
522
+ trailingIcon?: IconName;
523
+ /**
524
+ * Caller-controlled active (selected) state. Maps to Figma `State=Active`.
525
+ */
526
+ active?: boolean;
527
+ }
528
+ /**
529
+ * Mobile Chip — a compact, pill-shaped element that represents a specific
530
+ * piece of information, an attribute, or a discrete action on touch interfaces.
531
+ * Chips help users filter content, make selections, or trigger context-specific
532
+ * tasks.
533
+ *
534
+ * **When to use:**
535
+ * - Above **stacked lists** to filter the items shown (mobile context).
536
+ * - As toggleable attribute tags (e.g. category, status, type).
537
+ * - As compact triggers for a context-specific action tied to a list item.
538
+ *
539
+ * **When NOT to use:**
540
+ * - To filter **table** data — use the table's built-in column filters instead.
541
+ * - As a navigation element — use Mobile Segments or Tabs for that.
542
+ * - To replace a full-width button or a form control.
543
+ *
544
+ * **Touch-first:** no hover state. Pressed is tracked via touch/mouse-down;
545
+ * Active is caller-controlled via the `active` prop.
546
+ *
547
+ * 4 types (No Icon / Leading / Trailing / Leading + Trailing) × 4 states
548
+ * (Idle / Pressed / Active / Focus) = 16 Figma variants (`8269:29237`).
549
+ * Typography: Body/S/SemiBold (12px). Icons render at 16×16.
550
+ */
551
+ declare const MobileChip: React.ForwardRefExoticComponent<MobileChipProps & React.RefAttributes<HTMLButtonElement>>;
552
+
553
+ type MobileFeaturedIconColor = 'information' | 'success' | 'warning' | 'error' | 'highlight' | 'neutral';
554
+ type MobileFeaturedIconVariant = 'basic' | 'filled';
555
+ type MobileFeaturedIconSize = 'small' | 'medium' | 'large';
556
+ interface MobileFeaturedIconProps extends React.HTMLAttributes<HTMLSpanElement> {
557
+ icon: IconName;
558
+ /** Semantic colour — maps to the icon and (for `filled`) the background tint. */
559
+ color: MobileFeaturedIconColor;
560
+ /**
561
+ * `basic` renders just the icon (no background).
562
+ * `filled` renders the icon centred in a tinted circular background.
563
+ * @default 'filled'
564
+ */
565
+ variant?: MobileFeaturedIconVariant;
566
+ /** @default 'medium' */
567
+ size?: MobileFeaturedIconSize;
568
+ }
569
+ /**
570
+ * Mobile Featured Icon — visual anchor for mobile cards / list rows / empty states.
571
+ *
572
+ * 6 colours × 2 variants × 3 sizes = 36 Figma variants under node `4136:74148`.
573
+ *
574
+ * - **Basic** — icon only (no background)
575
+ * - **Filled** — icon centred in a tinted circular background (same pattern as desktop FeaturedIcon)
576
+ *
577
+ * Non-interactive, purely presentational.
578
+ */
579
+ declare const MobileFeaturedIcon: React.ForwardRefExoticComponent<MobileFeaturedIconProps & React.RefAttributes<HTMLSpanElement>>;
580
+
581
+ interface MobileSegmentProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
582
+ /** Segment label text. */
583
+ label: string;
584
+ /**
585
+ * Caller-controlled active (selected) state. Maps to Figma `State=Active`.
586
+ * When true: elevated white fill + 3-layer shadow + full-contrast text.
587
+ * When false: idle gray fill + muted text.
588
+ */
589
+ active?: boolean;
590
+ }
591
+ /**
592
+ * Mobile Segment — pill-shaped segmented-control tab for mobile interfaces.
593
+ *
594
+ * Figma `3038:38166` — 2 variants (Default / Active). Mobile-only, so no hover.
595
+ * `active` is caller-controlled — typically wired into a parent Segmented
596
+ * Control molecule's selection state.
597
+ *
598
+ * Default: idle gray fill (`--surface-neutral-segment-idle`) + muted text.
599
+ * Active: white fill (`--surface-neutral-segment-selected`) + 3-layer shadow
600
+ * + full-contrast text.
601
+ */
602
+ declare const MobileSegment: React.ForwardRefExoticComponent<MobileSegmentProps & React.RefAttributes<HTMLButtonElement>>;
603
+
604
+ interface MobileNavTabProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
605
+ label: string;
606
+ /** 24×24 icon shown above the label. */
607
+ icon: IconName;
608
+ /**
609
+ * Caller-controlled active state. When true, the icon and label render in
610
+ * the primary (LETA red) colour; otherwise the muted idle gray.
611
+ */
612
+ active?: boolean;
613
+ }
614
+ /**
615
+ * Mobile Nav Tab — vertical icon-over-label cell for mobile bottom navigation.
616
+ *
617
+ * Figma `8417:23519` — 2 variants (Idle / Active). 80×58 with bottom-aligned
618
+ * content (icon over label, 4px gap). Mobile-only, no hover.
619
+ *
620
+ * - Idle: icon `--icons-neutral-idle`, text `--text-default-label-idle`
621
+ * - Active: icon `--icons-primary-default`, text `--text-primary-label`
622
+ */
623
+ declare const MobileNavTab: React.ForwardRefExoticComponent<MobileNavTabProps & React.RefAttributes<HTMLButtonElement>>;
624
+
625
+ interface CarouselPaginationProps extends React.HTMLAttributes<HTMLDivElement> {
626
+ /** Total number of pages. @default 3 */
627
+ total?: number;
628
+ /** Current page, 1-indexed. Must be in `[1, total]`. */
629
+ current: number;
630
+ }
631
+ /**
632
+ * Carousel Pagination — page-position indicator for mobile carousels.
633
+ *
634
+ * Figma `8667:15335` defines exactly 3 page variants; this component
635
+ * generalises to any total. The active indicator is a 20×6 red pill;
636
+ * inactive indicators are 6×6 gray circles. 8px gap.
637
+ *
638
+ * Non-interactive — the parent carousel handles page navigation.
639
+ */
640
+ declare const CarouselPagination: React.ForwardRefExoticComponent<CarouselPaginationProps & React.RefAttributes<HTMLDivElement>>;
641
+
642
+ interface ProgressTrackerProps extends React.HTMLAttributes<HTMLSpanElement> {
643
+ /** Progress value, 0-100. Clamped at the bounds. */
644
+ value: number;
645
+ }
646
+ /**
647
+ * Progress Tracker — 14×14 circular progress indicator (Figma `5608:216176`).
648
+ *
649
+ * A gray track ring with a green arc showing completion percentage. Figma
650
+ * defines 4 discrete variants (10 / 50 / 75 / 100 %); this React component
651
+ * generalises to any `value` in `[0, 100]`.
652
+ *
653
+ * Used as the leading indicator inside the Progress Badge variant of
654
+ * MobileBadge.
655
+ */
656
+ declare const ProgressTracker: React.ForwardRefExoticComponent<ProgressTrackerProps & React.RefAttributes<HTMLSpanElement>>;
657
+
658
+ interface MapZoomControlProps extends React.HTMLAttributes<HTMLDivElement> {
659
+ /** Called when the zoom-in (+) button is clicked. */
660
+ onZoomIn?: () => void;
661
+ /** Called when the zoom-out (−) button is clicked. */
662
+ onZoomOut?: () => void;
663
+ /** Disables the zoom-in button (e.g. when already at maximum zoom). */
664
+ disableZoomIn?: boolean;
665
+ /** Disables the zoom-out button (e.g. when already at minimum zoom). */
666
+ disableZoomOut?: boolean;
667
+ }
668
+ declare const MapZoomControl: React.ForwardRefExoticComponent<MapZoomControlProps & React.RefAttributes<HTMLDivElement>>;
669
+
670
+ interface MapViewProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onLoad'> {
671
+ /** Map centre as `[latitude, longitude]`. Default Nairobi (`[-1.286, 36.817]`). */
672
+ center?: [number, number];
673
+ /** Initial zoom level. Default 14. */
674
+ zoom?: number;
675
+ /** Minimum zoom level. Default 3. */
676
+ minZoom?: number;
677
+ /** Maximum zoom level. Default 19 (OSM raster max). */
678
+ maxZoom?: number;
679
+ /**
680
+ * Raster tile URL template. **Omit to get the default** — OpenStreetMap standard
681
+ * tiles, darkened in CSS when the theme is dark (see `DARK_TILE_FILTER`). Passing
682
+ * this pins the basemap and opts out of the dark treatment entirely (pass
683
+ * `attribution` too, since the notice must match the tiles served).
684
+ */
685
+ tileUrl?: string;
686
+ /** Tile attribution HTML. Defaults to the notice for whichever themed basemap is in use. */
687
+ attribution?: string;
688
+ /** Show the overlaid `<MapZoomControl>` (bottom-right). Default true. */
689
+ showZoomControl?: boolean;
690
+ /** Fired (after) the Leaflet map instance is created. */
691
+ onReady?: (map: Map) => void;
692
+ }
693
+ /**
694
+ * Map View — the LETA standard interactive map primitive. A **Leaflet** map
695
+ * (OpenStreetMap raster tiles, no API key) with the design system's
696
+ * {@link MapZoomControl} overlaid bottom-right and wired to drive the map's zoom
697
+ * (Leaflet's own zoom control is disabled). Pan by drag, zoom by wheel / the
698
+ * control; the zoom buttons disable at the min/max zoom.
699
+ *
700
+ * **Standard:** this is the canonical map surface for every LETA map view (e.g.
701
+ * the Extra Large Modal picker) **until a more robust provider (e.g. Google Maps)
702
+ * is adopted** — swap the internals here and every consumer updates.
703
+ *
704
+ * Leaflet is loaded client-side (dynamic import) so it is SSR-safe; its CSS is
705
+ * injected at runtime (CDN-pinned). Requires network access for tiles.
706
+ *
707
+ * **When to use:** any embedded geographic map (route assignment, delivery
708
+ * tracking, location pickers).
709
+ * **When NOT to use:** a static location thumbnail (use an image) or the Map
710
+ * Icon markers in isolation.
711
+ */
712
+ declare const MapView: React.ForwardRefExoticComponent<MapViewProps & React.RefAttributes<HTMLDivElement>>;
713
+
714
+ /**
715
+ * The design-system route colours, as **token names** (pass through `var()`).
716
+ *
717
+ * These are theme-aware on purpose: the planned-route navy inverts to a light
718
+ * colour in dark mode, which is only legible because `MapView` also swaps to a
719
+ * dark basemap at the same time. Hardcoding a hex here (as one of the two former
720
+ * legend copies did) breaks in dark mode twice over — invisible on the dark pill
721
+ * *and* wrong against the dark tiles.
722
+ */
723
+ declare const MAP_ROUTE_PLANNED = "--surface-secondary-bg";
724
+ declare const MAP_ROUTE_DRIVEN = "--icons-primary-default";
725
+ interface MapLegendEntry {
726
+ /** Row label, e.g. "Planned Route". */
727
+ label: string;
728
+ /**
729
+ * Swatch colour. A design-token NAME (`--surface-secondary-bg`) or any CSS
730
+ * colour. Token names are wrapped in `var()` automatically, so
731
+ * {@link MAP_ROUTE_PLANNED} / {@link MAP_ROUTE_DRIVEN} can be passed directly.
732
+ */
733
+ color: string;
734
+ /** Draw the swatch dashed (a planned/predicted route) rather than solid. */
735
+ dashed?: boolean;
736
+ }
737
+ interface MapLegendProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
738
+ /** Rows, in order. Dividers are inserted between them. */
739
+ entries: MapLegendEntry[];
740
+ }
741
+ /**
742
+ * Map Legend — the route key that floats over a map surface (local Figma component
743
+ * set `1528:119929`; `1 Route` / `2 Routes` are just one vs two `entries`).
744
+ *
745
+ * A pill on `--surface-neutral-bg-default` with the map-overlay elevation, one row
746
+ * per route: a 32px line swatch (dashed = planned, solid = driven) plus its label.
747
+ *
748
+ * **This exists because it shipped twice and drifted.** The order-detail map and the
749
+ * dispatch/add-to-trip maps each had their own copy, and they diverged in three
750
+ * ways at once — a hardcoded `#192037` swatch instead of the theme-aware token
751
+ * (invisible on the dark pill), a `viewBox` that clipped the dash caps, and a stray
752
+ * `strokeLinecap="round"` that turned the dashes into dots. One component, one
753
+ * rendering.
754
+ *
755
+ * Positioning is the caller's job (the legend is `position: static` here) — the map
756
+ * surfaces place it bottom-centre, and the Add To Trip map lifts it clear of the
757
+ * driver popover.
758
+ */
759
+ declare const MapLegend: React.ForwardRefExoticComponent<MapLegendProps & React.RefAttributes<HTMLDivElement>>;
760
+
761
+ interface LoadingOverlayProps extends React.HTMLAttributes<HTMLDivElement> {
762
+ /**
763
+ * Show the overlay. Setting this back to `false` requests dismissal — the
764
+ * overlay stays visible until the animation completes its current cycle
765
+ * (one full cycle minimum), then unmounts.
766
+ */
767
+ open: boolean;
768
+ /**
769
+ * How long `open` must stay true before the loader actually appears, ms.
770
+ *
771
+ * A fetch that resolves quickly should show nothing at all: a spinner that
772
+ * flashes up and vanishes reads as a glitch and is harder to follow than a
773
+ * brief pause. Only once loading has gone on long enough to be noticed is a
774
+ * loader an explanation rather than a distraction (Doc 3 §2.2).
775
+ *
776
+ * The matching "once shown, keep it up long enough to read" half is already
777
+ * covered, and more strictly, by the cycle-aligned dismissal below. Set to `0`
778
+ * for a surface that must acknowledge instantly.
779
+ */
780
+ showDelayMs?: number;
781
+ /**
782
+ * Hold the loader until the mark finishes its current animation cycle before
783
+ * hiding. Default **true**.
784
+ *
785
+ * The cycle is ~3.7s, and aligning to it exists so the LETA mark is never cut
786
+ * off mid-sweep — right for a first load, where the viewer is waiting anyway
787
+ * and the mark is the only thing on screen.
788
+ *
789
+ * It is wrong for a short acknowledgement. Anything that resolves in
790
+ * well under a cycle inherits the whole of it: a hold of, say, 700ms becomes
791
+ * ~3.7s on screen, and the loader stops reporting work and starts being a
792
+ * delay. Pass `false` there and the loader leaves when its `open` does.
793
+ */
794
+ holdForCycle?: boolean;
795
+ /**
796
+ * Cover only the nearest positioned ancestor (`position: absolute`) instead
797
+ * of the whole viewport (`position: fixed`). Use for region-scoped loads —
798
+ * e.g. dimming just the table area (toolbars + table + pagination) while it
799
+ * reloads. The parent region must be `position: relative`.
800
+ */
801
+ contained?: boolean;
802
+ /**
803
+ * Solid scrim instead of the default translucent one. Use when the content
804
+ * behind must NOT show through — a full-screen / whole-view reload (e.g. the
805
+ * first data load, empty → populated). Light region refreshes keep the default
806
+ * translucent scrim so the surrounding chrome stays visible.
807
+ */
808
+ opaque?: boolean;
809
+ /** First text line (Heading/S/SemiBold, `--text-default-heading`). Default "Loading" (Doc 3 §2.1). */
810
+ title?: string;
811
+ /** Second text line (Body/M/Regular, `--text-default-sub-body`). Default "This will only take a moment" (Doc 3 §2.1). */
812
+ subtitle?: string;
813
+ /**
814
+ * Override the animation source URL (a Lottie JSON). Defaults to the LETA
815
+ * loader shipped with the package.
816
+ */
817
+ animationUrl?: string;
818
+ }
819
+ declare const LoadingOverlay: React.ForwardRefExoticComponent<LoadingOverlayProps & React.RefAttributes<HTMLDivElement>>;
820
+
821
+ type PageVariant = 'data-table' | 'configuration';
822
+ interface PageProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
823
+ /**
824
+ * Which page layout to render (Figma `Type`):
825
+ * - `data-table` — a Table Container (toolbar + table) page.
826
+ * - `configuration` — a Sidetab nav beside a column of Configuration Cards.
827
+ * Default `data-table`.
828
+ */
829
+ variant?: PageVariant;
830
+ /** Page heading. Default "Heading 1". */
831
+ heading?: string;
832
+ /** Body override — replaces the variant's default page body (everything below the Top Bar). */
833
+ children?: React.ReactNode;
834
+ /**
835
+ * Number of active filter rules. Forwarded to the default `data-table` variant's
836
+ * `TableContainer`. Ignored when `children` is overridden or `variant` is
837
+ * `configuration`. Default 0.
838
+ */
839
+ filterCount?: number;
840
+ }
841
+ /**
842
+ * Page (`9626:14490`) — a full desktop application page: a collapsed
843
+ * {@link SideBar} rail beside a viewport of a {@link TopBar} and a scrolling body.
844
+ * The body opens with a page Title and a {@link PageTabsControl}, then an info
845
+ * {@link NotificationBanner}, then the variant's main content.
846
+ *
847
+ * Variants (Figma `Type`):
848
+ * - **data-table** — a {@link TableContainer} (search/filter toolbar + table + pagination).
849
+ * - **configuration** — a {@link Sidetab} nav beside a column of {@link ConfigurationCard}s.
850
+ *
851
+ * The Side Bar and Top Bar are fixed (sticky); only the page body scrolls.
852
+ * Composition only — every region is an already-built organism / molecule.
853
+ *
854
+ * **When to use:** the top-level shell for a product screen.
855
+ * **When NOT to use:** a modal/dialog flow (use the Templates) or a single
856
+ * component in isolation.
857
+ */
858
+ declare const Page: React.ForwardRefExoticComponent<PageProps & React.RefAttributes<HTMLDivElement>>;
859
+
860
+ type UserMenuState = 'idle' | 'hover' | 'pressed';
861
+ interface UserMenuProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
862
+ /** The user's name — drives the avatar initials and the accessible name. */
863
+ name: string;
864
+ /** Avatar photo URL (falls back to initials). */
865
+ avatarSrc?: string;
866
+ /** Avatar tone. Default `teal`. */
867
+ tone?: AvatarTone;
868
+ /** Force a visual state (catalogs) — overrides hover/press. */
869
+ state?: UserMenuState;
870
+ }
871
+ /**
872
+ * User-Menu — the account trigger in the Top Bar: a pill holding the user's
873
+ * Avatar and a chevron, opening the user menu dropdown on click. Hover/pressed
874
+ * are runtime; `state` forces a visual state for catalogs.
875
+ *
876
+ * **When to use:** the account control in the application Top Bar.
877
+ * **When not to use:** the menu panel it opens (Desktop Dropdowns `user-menu`);
878
+ * a plain avatar (Avatar).
879
+ */
880
+ declare const UserMenu: React.ForwardRefExoticComponent<UserMenuProps & React.RefAttributes<HTMLButtonElement>>;
881
+
882
+ interface TopFilterProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
883
+ /** Filter label. Typically the dimension being filtered (e.g. "Status"). */
884
+ label?: string;
885
+ /**
886
+ * When true, renders a trailing Chevron-Down affordance. Advanced filters open
887
+ * an options dropdown on click — the overlay is a separate (later) molecule, so
888
+ * this component only fires `onClick`; it does not own or render the dropdown.
889
+ */
890
+ advanced?: boolean;
891
+ /**
892
+ * When true, the filter is currently applied. Caller-controlled. Switches the
893
+ * border to the secondary (active) treatment and, at rest, fills with the
894
+ * active surface. Exposed to assistive tech via `aria-pressed`.
895
+ */
896
+ selected?: boolean;
897
+ /**
898
+ * Optional badge shown between the label and chevron when `advanced && selected`.
899
+ * Pass a Delivery Badge (`<Badge />`) to indicate which sub-status is active.
900
+ */
901
+ badge?: React.ReactNode;
902
+ }
903
+ /**
904
+ * Top Filter — a compact, pill-shaped filter control for table/list toolbars.
905
+ * Filters rows by a status (or similar categorical dimension).
906
+ *
907
+ * **When to use:**
908
+ * - Quick status/category filters in a table toolbar.
909
+ * - `advanced` for filters whose options live behind a dropdown; `basic`
910
+ * (default) for a single on/off toggle.
911
+ *
912
+ * **When NOT to use:**
913
+ * - For navigation — use Page Tabs Control or Desktop Segment Control.
914
+ * - For free-text search — use a search input.
915
+ * - As a general-purpose chip/tag — use Chip or Tag.
916
+ *
917
+ * 2 types (Basic / Advanced) × 6 states (Idle / Hover / Pressed and their
918
+ * `-Selected` counterparts) = 12 Figma variants (`1572:12741`). Renders a
919
+ * `<button>`; hover/press are tracked internally, `selected` is caller-controlled.
920
+ */
921
+ declare const TopFilter: React.ForwardRefExoticComponent<TopFilterProps & React.RefAttributes<HTMLButtonElement>>;
922
+
923
+ /** A single filter entry within a Top Filter Section. */
924
+ interface TopFilterSectionItem {
925
+ /** Filter label. Defaults to "Status" if omitted (matches TopFilter). */
926
+ label?: string;
927
+ /** When true, this filter renders the Advanced (Chevron-Down) affordance. */
928
+ advanced?: boolean;
929
+ /** When true, this filter is currently applied. Caller-controlled. */
930
+ selected?: boolean;
931
+ /** Optional badge (e.g. Delivery Badge) shown inside Advanced filters when selected. */
932
+ badge?: React.ReactNode;
933
+ }
934
+ interface TopFilterSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
935
+ /** The filters to render, left to right. */
936
+ filters: TopFilterSectionItem[];
937
+ /** Fired when any filter is clicked, with that filter's index. */
938
+ onFilterClick?: (index: number) => void;
939
+ }
940
+ /**
941
+ * Top Filter Section — the filter bar that holds a horizontal row of
942
+ * {@link TopFilter} controls in a table toolbar.
943
+ *
944
+ * **When to use:**
945
+ * - As the status-filter row above/within a data table.
946
+ *
947
+ * **When NOT to use:**
948
+ * - For a single filter — use {@link TopFilter} directly.
949
+ * - For navigation — use Page Tabs Control.
950
+ * - For view switching — use Desktop Segment Control.
951
+ *
952
+ * Data-driven: pass a `filters` array; each entry becomes a `TopFilter`.
953
+ * Filters are **independent** (several can be applied at once) — selection state
954
+ * lives in the caller's data, surfaced back through `onFilterClick(index)`.
955
+ *
956
+ * **Selection is instant.** The selected border appears on the filter that was
957
+ * picked; each pill paints its own. An `animatedSelection` option once lifted the
958
+ * border off the pills and slid a single floating ring between them — it was
959
+ * removed on 2026-08-18 in favour of this, matching how the Broadcast Event
960
+ * Accordion's chips switch. A ring travelling between pills draws the eye to the
961
+ * journey rather than to the choice that was made.
962
+ *
963
+ * Figma `9469:84304` (Basic / Advanced reflect which kind of filters the row
964
+ * holds; the layout is identical). Renders a non-interactive `<div>` flex row.
965
+ */
966
+ declare const TopFilterSection: React.ForwardRefExoticComponent<TopFilterSectionProps & React.RefAttributes<HTMLDivElement>>;
967
+
968
+ type DesktopSegmentControlVariant = 'view' | 'segment';
969
+ /** A single segment within a Desktop Segment Control. */
970
+ interface DesktopSegmentControlItem {
971
+ /** Segment label text. */
972
+ label: string;
973
+ /** Optional icon before the label. */
974
+ leadingIcon?: IconName;
975
+ }
976
+ interface DesktopSegmentControlProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onChange'> {
977
+ /**
978
+ * `view` — compact (ViewSwitcherTab); switches the layout of the current
979
+ * content without changing data (e.g. Grid vs List). `segment` — prominent
980
+ * (SegmentSwitcherTab); high-level navigation within a drawer/panel.
981
+ */
982
+ variant: DesktopSegmentControlVariant;
983
+ /** The segments to render, left to right. */
984
+ segments: DesktopSegmentControlItem[];
985
+ /** Index of the active segment. Controlled. */
986
+ value: number;
987
+ /** Fired with the clicked segment's index. */
988
+ onChange: (index: number) => void;
989
+ }
990
+ /**
991
+ * Desktop Segment Control — a segmented control that groups 2+ mutually
992
+ * exclusive options into a single track, with exactly one active.
993
+ *
994
+ * Two sizes from one Figma set (`5778:230039`):
995
+ * - **`view`** — compact (wraps {@link ViewSwitcherTab}); toggles how the same
996
+ * data is displayed (Grid / List / Map). Sits near the content it controls.
997
+ * - **`segment`** — prominent (wraps {@link SegmentSwitcherTab}); high-level
998
+ * navigation within a drawer/panel, swapping the body content.
999
+ *
1000
+ * **When NOT to use:** top-level page navigation (use Page Tabs Control),
1001
+ * filtering (use Top Filter), binary on/off (use Toggle), or long/overflowing
1002
+ * option sets.
1003
+ *
1004
+ * Data-driven: `value`/`onChange` enforce single-active. Renders a `<div>`
1005
+ * track (`role="group"`); each tab exposes `aria-pressed`.
1006
+ */
1007
+ declare const DesktopSegmentControl: React.ForwardRefExoticComponent<DesktopSegmentControlProps & React.RefAttributes<HTMLDivElement>>;
1008
+
1009
+ type PageTabsControlVariant = 'basic' | 'wizard';
1010
+ /** A single tab within a Page Tabs Control. */
1011
+ interface PageTabsControlItem {
1012
+ /** Tab label text. */
1013
+ label: string;
1014
+ /** Step number prefixed to the label (wizard only). Defaults to the 1-based index. */
1015
+ step?: string | number;
1016
+ /** Wizard only — marks a future/unreached step (renders at 60% opacity). */
1017
+ inactive?: boolean;
1018
+ }
1019
+ interface PageTabsControlProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onChange'> {
1020
+ /** `basic` wraps PageTab; `wizard` wraps WizardTab (numbered `"N. Label"` steps). */
1021
+ variant?: PageTabsControlVariant;
1022
+ /** The tabs to render, left to right. */
1023
+ tabs: PageTabsControlItem[];
1024
+ /** Index of the active tab. Controlled. */
1025
+ value: number;
1026
+ /** Fired with the clicked tab's index. */
1027
+ onChange: (index: number) => void;
1028
+ }
1029
+ /**
1030
+ * Page Tabs Control — a full-width horizontal tab bar for top-level navigation
1031
+ * between sections/pages, with a full-width demarcator line beneath the tabs.
1032
+ *
1033
+ * - **`basic`** (wraps {@link PageTab}) — navigate between page sections.
1034
+ * - **`wizard`** (wraps {@link WizardTab}) — sequential multi-step flow; each tab
1035
+ * is numbered `"N. Label"` and carries an optional `inactive` (future-step) flag.
1036
+ *
1037
+ * **When NOT to use:** switching content layout (use Desktop Segment Control),
1038
+ * filtering (use Top Filter), or very large tab counts needing overflow scroll.
1039
+ *
1040
+ * Figma `3907:71981`. Data-driven: `value`/`onChange`. The active tab's 2px
1041
+ * indicator sits on the demarcator line (`--border-neutral-default`). Renders a
1042
+ * `<div role="tablist">`; each tab is `role="tab"` + `aria-selected`.
1043
+ */
1044
+ declare const PageTabsControl: React.ForwardRefExoticComponent<PageTabsControlProps & React.RefAttributes<HTMLDivElement>>;
1045
+
1046
+ type SelectionControlVariant = 'checkbox' | 'radio' | 'switch';
1047
+ interface SelectionControlProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
1048
+ /**
1049
+ * Which control to render. `checkbox` — multi-select / independent on-off
1050
+ * options (supports `indeterminate`). `radio` — single-select within a group.
1051
+ * `switch` — immediate on/off setting (label sits *before* the toggle).
1052
+ */
1053
+ variant: SelectionControlVariant;
1054
+ /** The visible label text shown beside the control. */
1055
+ label: React.ReactNode;
1056
+ /** Controlled checked state. */
1057
+ checked?: boolean;
1058
+ /** Uncontrolled initial checked state. */
1059
+ defaultChecked?: boolean;
1060
+ /** Checkbox only — partial / mixed-children state. Ignored for radio/switch. */
1061
+ indeterminate?: boolean;
1062
+ /** Dims the whole row and blocks interaction. */
1063
+ disabled?: boolean;
1064
+ /** Fired with the next checked value when the control toggles. */
1065
+ onChange?: (checked: boolean) => void;
1066
+ /**
1067
+ * Optional help/info icon shown after the label (Figma "Show Label Trailing
1068
+ * Icon"). Rendered outlined at 18px; the Figma default content is `Info`.
1069
+ */
1070
+ trailingIcon?: IconName;
1071
+ /**
1072
+ * Applied to the underlying control so the visible `<label>`'s `htmlFor`
1073
+ * targets it. Auto-generated when omitted.
1074
+ */
1075
+ id?: string;
1076
+ /** Forwarded to the underlying control. */
1077
+ name?: string;
1078
+ /** Forwarded to the underlying input for checkbox/radio (ignored for switch). */
1079
+ value?: string;
1080
+ /**
1081
+ * Stretch to the full width of the container with the label filling and the
1082
+ * control pushed flush to the trailing edge (Figma `szH: FILL` — e.g. a Switch
1083
+ * settings row, or the Popover's Configuration Control). Default false (the
1084
+ * row hugs its content).
1085
+ */
1086
+ fullWidth?: boolean;
1087
+ }
1088
+ /**
1089
+ * Selection Control — a labelled selection-input wrapper that renders a
1090
+ * Checkbox, Radio Button, or Switch with consistent label, spacing, and states.
1091
+ * Composes the existing {@link Checkbox} / {@link RadioButton} / {@link Toggle}
1092
+ * atoms.
1093
+ *
1094
+ * **When to use:** anywhere a labelled boolean/option control is needed in
1095
+ * forms, lists, and settings.
1096
+ *
1097
+ * **When NOT to use:** as a bare glyph — use the underlying atoms directly only
1098
+ * when you supply your own label.
1099
+ *
1100
+ * 3 variants × state (`37:362`): Checkbox (Idle / Active / Indeterminate /
1101
+ * Disabled), Radio Button + Switch (Idle / Active / Disabled — no
1102
+ * Indeterminate). Checkbox/Radio put the control first; **Switch puts the label
1103
+ * first, toggle trailing**. The label is wired to the control via `htmlFor` +
1104
+ * `aria-labelledby`, so clicking the text toggles it; Disabled dims the row.
1105
+ */
1106
+ declare const SelectionControl: React.ForwardRefExoticComponent<SelectionControlProps & React.RefAttributes<HTMLDivElement>>;
1107
+
1108
+ interface ShortcutProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
1109
+ /** Keys in the combination, in order (e.g. `['Ctrl', 'K']`). Each renders as its own keycap. */
1110
+ keys: string[];
1111
+ /** Muted styling for when the parent option's key binding is unavailable. */
1112
+ disabled?: boolean;
1113
+ }
1114
+ /**
1115
+ * Shortcut — a compact, contextual inline element placed at the trailing edge
1116
+ * of dropdown menu items, command-palette rows, or list items. It surfaces the
1117
+ * keyboard combination that triggers that action, reinforcing power-user
1118
+ * workflows and discoverability.
1119
+ *
1120
+ * **When to use:** beside an actionable menu/command/list item that has a
1121
+ * keyboard binding.
1122
+ *
1123
+ * **When NOT to use:** for non-actionable text, or where no shortcut exists.
1124
+ *
1125
+ * 2 states (`7259:81045`): **Idle** — operational, full emphasis; **Disabled** —
1126
+ * muted, communicates the shortcut can't be triggered right now. Each key renders
1127
+ * as a semantic `<kbd>` keycap.
1128
+ */
1129
+ declare const Shortcut: React.ForwardRefExoticComponent<ShortcutProps & React.RefAttributes<HTMLSpanElement>>;
1130
+
1131
+ interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
1132
+ /** Block width — a number is treated as px, any other value is passed through as CSS (e.g. `'100%'`). Default `'100%'`. */
1133
+ width?: number | string;
1134
+ /** Block height — a number is treated as px, any other value is passed through as CSS. Default `16`. */
1135
+ height?: number | string;
1136
+ /** Corner radius — a number is treated as px, any other value is passed through as CSS. Default `--rounding-lg`. */
1137
+ borderRadius?: number | string;
1138
+ }
1139
+ /**
1140
+ * Skeleton — a shimmering placeholder rectangle for loading states, used
1141
+ * anywhere real content isn't ready yet (starting with table rows). Purely
1142
+ * presentational: compose several into whatever shape the loading content will
1143
+ * take (a table-row arrangement, a card, a list) — see `TableContainer`'s
1144
+ * `Loading` story for a worked example.
1145
+ *
1146
+ * The shimmer is a `background-position` sweep across a static gradient
1147
+ * (`--surface-neutral-bg-muted` base, `--surface-disabled-input-field`
1148
+ * highlight), 1.5s ease-in-out, looping — `prefers-reduced-motion: reduce`
1149
+ * drops to a static muted block.
1150
+ *
1151
+ * `aria-hidden` by default (it's decorative filler, not content); the loading
1152
+ * region it sits within should carry the real `role="status"`/`aria-live`.
1153
+ *
1154
+ * **When to use:** a region that will shortly hold real content of a known
1155
+ * shape (a table row, a card). **When not to use:** an indeterminate,
1156
+ * whole-page "please wait" — use `LoadingOverlay` for that (Loading pattern:
1157
+ * first load with nothing to show yet → `LoadingOverlay`; a subsequent update
1158
+ * to already-visible content — filter, sort, tab switch, refresh → `Skeleton`
1159
+ * rows only, no scrim, the rest of the page stays usable).
1160
+ */
1161
+ declare const Skeleton: React.ForwardRefExoticComponent<SkeletonProps & React.RefAttributes<HTMLDivElement>>;
1162
+
1163
+ type DesktopProgressIndicatorVariant = 'upload' | 'task' | 'system-process';
1164
+ interface DesktopProgressIndicatorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
1165
+ /**
1166
+ * The kind of process — drives both layout and bar colour:
1167
+ * - `upload` — **horizontal**: track + a trailing `%` (replaced by a check
1168
+ * icon at 100%). Green bar. No helper text.
1169
+ * - `task` — **vertical**: track with a helper line beneath. Green bar.
1170
+ * - `system-process` — **vertical**: track with a helper line beneath. Blue bar.
1171
+ */
1172
+ variant?: DesktopProgressIndicatorVariant;
1173
+ /** Completion percentage, 0–100. */
1174
+ value: number;
1175
+ /** Helper line beneath the bar — `task` / `system-process` only (e.g. "3 of 10 steps completed"). */
1176
+ helperText?: string;
1177
+ }
1178
+ /**
1179
+ * Desktop Progress Indicator — a linear progress bar that communicates the
1180
+ * completion of an ongoing or measured process. (Distinct from the 14×14
1181
+ * Progress Tracker donut used in mobile badges.)
1182
+ *
1183
+ * **When to use:** for determinate progress with a known percentage.
1184
+ *
1185
+ * **When NOT to use:** for indeterminate spinners or tiny inline indicators.
1186
+ *
1187
+ * Three Types (`7353:37255`), each with its **own layout** — do not conflate:
1188
+ * - **Upload** — horizontal; green bar + a trailing `%` that becomes a green
1189
+ * `Check-Circle` at 100%. No helper text.
1190
+ * - **Task** — vertical; green bar with a helper line beneath (e.g. "3 of 10
1191
+ * steps completed").
1192
+ * - **System Process** — vertical; **blue** bar with a helper line beneath
1193
+ * (e.g. "API usage: 60% of limit", "Storage used"). System-driven / background work.
1194
+ *
1195
+ * 8px pill track; `role="progressbar"` with aria value attributes.
1196
+ */
1197
+ declare const DesktopProgressIndicator: React.ForwardRefExoticComponent<DesktopProgressIndicatorProps & React.RefAttributes<HTMLDivElement>>;
1198
+
1199
+ type StepperVariant = 'discrete' | 'segmented';
1200
+ interface StepperProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {
1201
+ /**
1202
+ * `discrete` — a bordered field with the value; the up/down spinner
1203
+ * (`Icon/Stepper`) reveals on hover. `segmented` — a `[−] [count] [+]` control
1204
+ * whose −/+ are Icon-Only Buttons.
1205
+ */
1206
+ variant?: StepperVariant;
1207
+ /** Controlled value. */
1208
+ value?: number;
1209
+ /** Uncontrolled initial value. */
1210
+ defaultValue?: number;
1211
+ /** Fired with the next clamped value. */
1212
+ onChange?: (value: number) => void;
1213
+ /** Lower bound (inclusive). Defaults to `0` — steppers model non-negative
1214
+ * quantities/counts/durations, so the value cannot be decremented below 0
1215
+ * unless a lower `min` is supplied. */
1216
+ min?: number;
1217
+ /** Upper bound (inclusive). */
1218
+ max?: number;
1219
+ /** Increment/decrement amount. Default 1. */
1220
+ step?: number;
1221
+ disabled?: boolean;
1222
+ 'aria-label'?: string;
1223
+ }
1224
+ /**
1225
+ * Stepper — a numeric input with increment/decrement affordances for adjusting
1226
+ * a value in discrete steps.
1227
+ *
1228
+ * **When to use:** bounded numeric entry where ± nudging is faster than typing
1229
+ * (quantities, counts, durations).
1230
+ *
1231
+ * **When NOT to use:** unbounded numbers, ranges (use a slider), or step-through
1232
+ * wizards.
1233
+ *
1234
+ * Two types (`4524:205932`): **Discrete** — a bordered field with the value; the
1235
+ * up/down spinner (`Icon/Stepper`) appears on hover and the field lifts with a
1236
+ * drop shadow. **Segmented** — a `[−] [count] [+]` control whose buttons reuse the
1237
+ * Desktop {@link Button} atom (− disables at `min`, + at `max`). Controlled via
1238
+ * `value`/`onChange` or uncontrolled via `defaultValue`; ArrowUp/ArrowDown nudge.
1239
+ */
1240
+ declare const Stepper: React.ForwardRefExoticComponent<StepperProps & React.RefAttributes<HTMLDivElement>>;
1241
+
1242
+ type LeadingInputFieldElementVariant = 'single' | 'multiple';
1243
+ interface LeadingInputFieldElementProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onClick'> {
1244
+ /**
1245
+ * `single` — display-only, locked to one country (flag + dial code, no
1246
+ * chevron). `multiple` — interactive selector (flag + chevron) that opens a
1247
+ * country picker.
1248
+ */
1249
+ variant: LeadingInputFieldElementVariant;
1250
+ /** ISO country code for the flag (e.g. `'KE'`, `'US'`). */
1251
+ countryCode: string;
1252
+ /** Dial code shown in the `single` variant (e.g. `'+254'`). */
1253
+ dialCode?: string;
1254
+ disabled?: boolean;
1255
+ /** `multiple` only — fired when the selector is activated (opens the picker). */
1256
+ onClick?: () => void;
1257
+ 'aria-label'?: string;
1258
+ }
1259
+ /**
1260
+ * Leading Input Field Element — an interactive adornment that sits at the
1261
+ * **leading** edge inside an input field. The current type is a Country Selector
1262
+ * for phone/locale inputs.
1263
+ *
1264
+ * **When to use:** inside text/phone inputs that need a leading selector or
1265
+ * context.
1266
+ *
1267
+ * **When NOT to use:** as a standalone control outside an input.
1268
+ *
1269
+ * Country Selector (`7111:43945`): **Single Country** — display-only flag + dial
1270
+ * code, non-selectable; **Multiple Countries** — flag + chevron, opens a country
1271
+ * picker (Idle / Hover / Pressed / Focus / Disabled). Styled with the
1272
+ * secondary-button token family; reuses the {@link Flag} atom.
1273
+ */
1274
+ declare const LeadingInputFieldElement: React.ForwardRefExoticComponent<LeadingInputFieldElementProps & React.RefAttributes<HTMLElement>>;
1275
+
1276
+ type TrailingInputFieldElementVariant = 'basic' | 'dropdown';
1277
+ interface TrailingInputFieldElementProps {
1278
+ /**
1279
+ * `basic` — a simple presentational trailing affordance (unit text, status
1280
+ * icon, clear "×"). `dropdown` — a Secondary Button with a trailing chevron
1281
+ * that opens a selector overlay.
1282
+ */
1283
+ variant: TrailingInputFieldElementVariant;
1284
+ /** Text label — `basic`: the unit/status text; `dropdown`: the button label. */
1285
+ label?: string;
1286
+ /** `basic` only — custom content (icon, "×", unit text) that overrides `label`. */
1287
+ children?: React.ReactNode;
1288
+ disabled?: boolean;
1289
+ /** `dropdown` — fired when activated (opens the overlay). */
1290
+ onClick?: () => void;
1291
+ className?: string;
1292
+ style?: React.CSSProperties;
1293
+ 'aria-label'?: string;
1294
+ }
1295
+ /**
1296
+ * Trailing Input Field Element — an adornment that sits at the **trailing** edge
1297
+ * inside an input field.
1298
+ *
1299
+ * **When to use:** inside inputs needing a trailing action or selector.
1300
+ *
1301
+ * **When NOT to use:** standalone, outside an input.
1302
+ *
1303
+ * `4478:344281`: **Basic** — a presentational content slot (unit text / status
1304
+ * icon / clear "×"); **Dropdown** — a Secondary Button with a trailing
1305
+ * `Chevron-Down` that opens a selector. Dropdown reuses the Desktop {@link Button} atom.
1306
+ */
1307
+ declare const TrailingInputFieldElement: React.ForwardRefExoticComponent<TrailingInputFieldElementProps & React.RefAttributes<HTMLElement>>;
1308
+
1309
+ type PaginationVariant = 'table' | 'combobox' | 'stacked-list';
1310
+ interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
1311
+ /**
1312
+ * `table` — full data tables: count + page-number controls + rows-per-page
1313
+ * selector (taller). `stacked-list` — same controls, condensed height.
1314
+ * `combobox` — compact: count + prev/next only (no page numbers).
1315
+ */
1316
+ variant?: PaginationVariant;
1317
+ /** Current page (1-based). */
1318
+ page: number;
1319
+ /** Total number of pages. */
1320
+ pageCount: number;
1321
+ /**
1322
+ * Show the page-number navigation cluster (prev/next + numbered cells) on the
1323
+ * `table` / `stacked-list` variants. Mirrors the Figma `Show Pages` property.
1324
+ * Default true; set `false` for just the count + rows-per-page selector.
1325
+ */
1326
+ showPages?: boolean;
1327
+ /** Fired with the next page when a control is activated. */
1328
+ onPageChange: (page: number) => void;
1329
+ /** Count summary text (e.g. "Showing 10 of 180" or "1 - 10 of 10"). Caller-provided. */
1330
+ countLabel?: string;
1331
+ /** `table` / `stacked-list` — current rows-per-page value shown in the selector. */
1332
+ rowsPerPage?: number;
1333
+ /** `table` / `stacked-list` — fired when the rows-per-page selector is activated. */
1334
+ onRowsPerPageClick?: () => void;
1335
+ }
1336
+ /**
1337
+ * Pagination — navigation for moving through paged data sets, in the layout that
1338
+ * fits its host surface.
1339
+ *
1340
+ * **When to use:** below tables, lists, or comboboxes with more results than fit
1341
+ * one view.
1342
+ *
1343
+ * **When NOT to use:** step-through wizards (use Page Tabs Control / Stepper) or
1344
+ * carousels (use Carousel Pagination).
1345
+ *
1346
+ * `7292:86007`: **Table** — count + page-number controls + rows-per-page selector;
1347
+ * **Stacked List** — same controls, condensed; **Combobox** — compact count +
1348
+ * prev/next only. Prev/next reuse Ghost icon Buttons; the page cell is a 32×32
1349
+ * numbered button (Active = `--surface-secondary-pagination-active`).
1350
+ */
1351
+ declare const Pagination: React.ForwardRefExoticComponent<PaginationProps & React.RefAttributes<HTMLDivElement>>;
1352
+
1353
+ type BreadcrumbsType = 'nested' | 'global-client' | 'global-admin';
1354
+ /** A single ancestor (link) crumb in the trail. */
1355
+ interface BreadcrumbCrumb {
1356
+ /** Visible label. */
1357
+ label: string;
1358
+ /** Fired when the crumb is activated (navigate up the tree). */
1359
+ onClick?: () => void;
1360
+ }
1361
+ interface BreadcrumbsProps extends React.HTMLAttributes<HTMLElement> {
1362
+ /** Which trail style to render. Default `nested`. */
1363
+ type?: BreadcrumbsType;
1364
+ /** Ancestor link crumbs, root → leaf, excluding the current page. */
1365
+ items?: BreadcrumbCrumb[];
1366
+ /** The current page label — rendered non-interactive with `aria-current`. Ignored when `children` is provided. */
1367
+ current?: string;
1368
+ /**
1369
+ * Trail-content slot (Figma `Nested Content` / `Global Client Content` /
1370
+ * `Global Admin Content` SLOT — one per `type`). When provided, the injected
1371
+ * nodes replace the auto-built trail, laid out in the component's owned
1372
+ * horizontal `--spacing-8px` row. Omit to render the data-driven default
1373
+ * (`items` + `current`, root chip for the global variants).
1374
+ */
1375
+ children?: React.ReactNode;
1376
+ /** Company / client name shown at the root of the global variants. */
1377
+ client?: string;
1378
+ /**
1379
+ * Root-chip activation. For `global-admin` this opens the client-switcher
1380
+ * dropdown (the overlay itself is a separate component); for `global-client`
1381
+ * it optionally navigates to the client home. When omitted, the
1382
+ * `global-client` root renders as a non-interactive label (matching Figma).
1383
+ */
1384
+ onClientClick?: () => void;
1385
+ }
1386
+ /**
1387
+ * Breadcrumbs — a horizontal trail showing the user's location in a hierarchy,
1388
+ * with each ancestor a link back up the tree, ending in the current page.
1389
+ *
1390
+ * **When to use:** pages nested ≥2 levels deep, so users can orient and
1391
+ * navigate up.
1392
+ *
1393
+ * **When NOT to use:** flat hierarchies, or as primary navigation.
1394
+ *
1395
+ * Three variants (Figma `9108:33624`):
1396
+ * - **nested** — in-section hierarchy; Small link crumbs.
1397
+ * - **global-client** — client-app wayfinding rooted at a company chip
1398
+ * (`Icon/Company` + name); Medium link crumbs.
1399
+ * - **global-admin** — admin wayfinding whose root is a Plain split button
1400
+ * (`Icon/Company` + name + `Icon/Stepper`) that opens a client-switcher
1401
+ * dropdown via `onClientClick`; Medium link crumbs.
1402
+ *
1403
+ * Data-driven: pass `items` (ancestor links) + `current`. Crumbs are separated
1404
+ * by a `/` slash; the current page is muted + semibold and non-interactive
1405
+ * (`aria-current="page"`). Renders semantic `<nav aria-label><ol><li>`.
1406
+ */
1407
+ declare const Breadcrumbs: React.ForwardRefExoticComponent<BreadcrumbsProps & React.RefAttributes<HTMLElement>>;
1408
+
1409
+ type FooterFrameVariant = 'default' | 'tertiary-action' | 'data-summary' | 'preference' | 'validation' | 'card';
1410
+ interface FooterFrameProps extends React.HTMLAttributes<HTMLDivElement> {
1411
+ /** Which footer treatment. Drives height / padding / background. Default `default`. */
1412
+ variant?: FooterFrameVariant;
1413
+ /**
1414
+ * Leading-content slot (left edge) — e.g. a tertiary Button, a Selection
1415
+ * Control, a Notification Banner, or a data-summary row. Omit (or `default`
1416
+ * variant) to right-align the actions with nothing on the left.
1417
+ */
1418
+ leading?: React.ReactNode;
1419
+ /** Trailing actions — pass the footer's Button(s); laid out in a right-aligned row, gap 8. */
1420
+ children?: React.ReactNode;
1421
+ /**
1422
+ * Apply the subtle upward scroll-affordance drop shadow (Figma) — set this
1423
+ * whenever the footer pins below a **scrollable** region so it reads as separated
1424
+ * from the content scrolling under it.
1425
+ *
1426
+ * **Static (`true`)** — always shows the shadow; right for containers that are
1427
+ * always scrollable (e.g. Desktop Dropdowns Basic Filter / Filter Group).
1428
+ *
1429
+ * **Dynamic** — for containers that may or may not overflow, use the companion
1430
+ * `useScrollShadow(containerRef)` hook instead of hardcoding `true`. The hook
1431
+ * returns `true` only while there is content below the fold, and `false` once
1432
+ * scrolled to the bottom:
1433
+ * ```tsx
1434
+ * const bodyRef = useRef<HTMLDivElement>(null);
1435
+ * const scrollShadow = useScrollShadow(bodyRef);
1436
+ *
1437
+ * <div ref={bodyRef} style={{ overflowY: 'auto', maxHeight: 300 }}>{items}</div>
1438
+ * <FooterFrame scrollShadow={scrollShadow}>…</FooterFrame>
1439
+ * ```
1440
+ *
1441
+ * **`ModalShell` is handled automatically** — passing `bodyHeight` or `fillHeight`
1442
+ * activates the same logic internally; you do not pass `scrollShadow` to the
1443
+ * `FooterFrame` inside a `ModalShell`.
1444
+ *
1445
+ * **Applies to every variant EXCEPT `card`** — Card footers are flush/transparent
1446
+ * and never show this shadow (passing `scrollShadow` on a `card` is a no-op).
1447
+ */
1448
+ scrollShadow?: boolean;
1449
+ }
1450
+ /**
1451
+ * Footer Frame — the bottom action region of modals, cards, and panels. A
1452
+ * horizontal shell with optional leading content on the left and a right-aligned
1453
+ * row of action buttons on the right.
1454
+ *
1455
+ * **When to use:** any surface (modal / card / panel) that needs committed
1456
+ * actions or a contextual summary pinned at its base.
1457
+ *
1458
+ * **When NOT to use:** for inline actions within body content.
1459
+ *
1460
+ * Slot-based, mirroring Figma `6448:32008` (`Leading Content` SLOT + trailing
1461
+ * actions). `variant` only sets dimensions/background; the caller slots the
1462
+ * leading content and the action buttons:
1463
+ * - **default** — actions only (right-aligned), 72px.
1464
+ * - **tertiary-action** — a low-priority/destructive Button set apart on the left.
1465
+ * - **data-summary** — a row of stat blocks on the left (Title/Subtext × N split by
1466
+ * vertical demarcators); 72px. Also used as the Desktop Dropdowns Basic Filter footer.
1467
+ * - **preference** — a persistent preference control (e.g. a Selection Control).
1468
+ * - **validation** — a validation/error Notification Banner.
1469
+ * - **card** — compact (40px, no padding, transparent) for Card surfaces.
1470
+ */
1471
+ declare const FooterFrame: React.ForwardRefExoticComponent<FooterFrameProps & React.RefAttributes<HTMLDivElement>>;
1472
+
1473
+ /**
1474
+ * Tracks whether a scrollable container has content still below the visible
1475
+ * viewport — the signal for a footer **edge shadow** (see the Scroll Edge notes in
1476
+ * `@leta-io/design-tokens/scroll-utilities.css`).
1477
+ *
1478
+ * A convenience wrapper over {@link useScrollEdges}, which is the general
1479
+ * primitive: it reports all four edges and both overflow axes. Reach for that one
1480
+ * directly when you need a header shadow, a horizontal edge, or both axes; this
1481
+ * one is just the common "footer below a vertical list" case.
1482
+ *
1483
+ * Returns `true` while content remains below the fold, `false` once the user
1484
+ * reaches the bottom or when the container does not overflow at all.
1485
+ *
1486
+ * Re-evaluates on scroll, on container resize, **and on content change** — that
1487
+ * last one matters: a body that starts out exactly fitting and then grows past the
1488
+ * fold (accordion expands, tab swaps, async content lands) has no scroll and no
1489
+ * resize to react to. See {@link useScrollEdges} for why that case needs its own
1490
+ * observer.
1491
+ *
1492
+ * **Usage with `FooterFrame`:**
1493
+ * ```tsx
1494
+ * const bodyRef = useRef<HTMLDivElement>(null);
1495
+ * const scrollShadow = useScrollShadow(bodyRef);
1496
+ *
1497
+ * <div ref={bodyRef} style={{ overflowY: 'auto', maxHeight: 300 }}>
1498
+ * {items}
1499
+ * </div>
1500
+ * <FooterFrame scrollShadow={scrollShadow}>
1501
+ * <Button variant="primary">Apply</Button>
1502
+ * </FooterFrame>
1503
+ * ```
1504
+ *
1505
+ * **Note:** `FooterFrame` also accepts `scrollShadow` as a plain `boolean` — pass
1506
+ * `true` directly when the container is always scrollable (e.g. Desktop Dropdowns)
1507
+ * and you don't need the dynamic on/off behaviour.
1508
+ *
1509
+ * **Not needed inside `ModalShell`:** the shell manages the header + footer edge
1510
+ * shadows internally from a single `useScrollEdges` call; just set `bodyHeight` or
1511
+ * `fillHeight` and the shell handles it automatically.
1512
+ */
1513
+ declare function useScrollShadow(containerRef: React.RefObject<HTMLElement | null>): boolean;
1514
+
1515
+ type ModalHeadersVariant = 'default' | 'with-tabs';
1516
+ interface ModalHeadersProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'children'> {
1517
+ /** Which header treatment. `with-tabs` adds a tab row beneath the title. */
1518
+ variant?: ModalHeadersVariant;
1519
+ /** Modal title text. */
1520
+ title?: string;
1521
+ /** Close-button handler. The close button is always rendered. */
1522
+ onClose?: () => void;
1523
+ /** When true, renders a Breadcrumbs component above the title. */
1524
+ showBreadcrumb?: boolean;
1525
+ /** Content to render in the breadcrumb slot (typically a `<Breadcrumbs>` element). */
1526
+ breadcrumb?: React.ReactNode;
1527
+ /** When true, renders a back-navigation arrow (`Arrow-Left`) before the title. */
1528
+ showNavArrow?: boolean;
1529
+ /** Fired when the nav arrow is clicked. */
1530
+ onNavBack?: () => void;
1531
+ /** When true, renders a leading icon before the title text. */
1532
+ showLeadingIcon?: boolean;
1533
+ /** The icon to show before the title (when `showLeadingIcon` is true). */
1534
+ leadingIcon?: IconName;
1535
+ /** Color of the leading icon. Defaults to `--icons-neutral-default`. */
1536
+ leadingIconColor?: string;
1537
+ /**
1538
+ * Controls the **Secondary Content** slot (Figma `9200:38903`). Defaults to
1539
+ * `true` to mirror Figma, where the slot frame is visible. The slot reserves
1540
+ * its row even when empty so prototypes can populate it later.
1541
+ */
1542
+ showSecondaryContent?: boolean;
1543
+ /**
1544
+ * Leading group of the Secondary Content slot — the left side of its
1545
+ * SPACE_BETWEEN row (Figma "Status Badges"). Typically status `<Badge>`s.
1546
+ */
1547
+ secondaryLeading?: React.ReactNode;
1548
+ /**
1549
+ * Trailing group of the Secondary Content slot — the right side of its
1550
+ * SPACE_BETWEEN row (Figma "Header CTAs"). Typically secondary `<Button>`s.
1551
+ */
1552
+ secondaryTrailing?: React.ReactNode;
1553
+ /** Tab row (typically a `<PageTabsControl>` element). Only shown in `with-tabs` variant. */
1554
+ tabs?: React.ReactNode;
1555
+ }
1556
+ declare const ModalHeaders: React.ForwardRefExoticComponent<ModalHeadersProps & React.RefAttributes<HTMLDivElement>>;
1557
+
1558
+ interface ModalShellProps extends React.HTMLAttributes<HTMLDivElement> {
1559
+ /** Fixed modal width in px (e.g. 480 / 512 / 768 / 1024). */
1560
+ width: number;
1561
+ /** Round the root corners (`--rounding-xl` = 12). Drawer modals pass false (square). Default true. */
1562
+ rounded?: boolean;
1563
+ /** The header region — typically a `<ModalHeaders>`. */
1564
+ header: React.ReactNode;
1565
+ /**
1566
+ * The footer region — typically a `<FooterFrame>`.
1567
+ *
1568
+ * Optional: a shell can legitimately end at its body (the notifications panel,
1569
+ * whose Figma frames ship the Footer Frame hidden). Omitted, the region is not
1570
+ * rendered at all rather than rendered empty — an empty fixed row would still
1571
+ * hold its own stacking context and cast the body's bottom scroll edge onto
1572
+ * nothing.
1573
+ */
1574
+ footer?: React.ReactNode;
1575
+ /** The body region content. */
1576
+ children?: React.ReactNode;
1577
+ /** Style overrides for the body wrapper (padding / gap / layout / sizing). */
1578
+ bodyStyle?: React.CSSProperties;
1579
+ /**
1580
+ * Fixed body height in px. When set, the body region is locked to this height
1581
+ * and scrolls vertically when its content overflows.
1582
+ */
1583
+ bodyHeight?: number;
1584
+ /**
1585
+ * Stretch the shell to the full viewport height (`100dvh`) — a drawer / side
1586
+ * sheet. The header and footer stay fixed (sticky) and only the body scrolls.
1587
+ * Overrides `bodyHeight`.
1588
+ */
1589
+ fillHeight?: boolean;
1590
+ /**
1591
+ * Called when Escape is pressed while this modal is the topmost overlay
1592
+ * (Doc 3 §10) — typically the same handler as the header's close button
1593
+ * (`onClose ?? onCancel`). While mounted, this shell also traps Tab focus
1594
+ * within itself and returns focus to the trigger on unmount.
1595
+ */
1596
+ onEscape?: () => void;
1597
+ }
1598
+ /**
1599
+ * Internal shell shared by the modal templates. Mirrors the Figma modal root
1600
+ * frame: a vertical column (header + body + footer), `--surface-neutral-bg-default`
1601
+ * fill, and a 1px `--border-neutral-default` stroke painted OUTSIDE via a
1602
+ * `box-shadow` ring (so the border never shrinks the content area), clipped to
1603
+ * the corner radius.
1604
+ *
1605
+ * With `fillHeight`, the shell becomes a full-viewport-height drawer: the header
1606
+ * and footer are pinned (sticky) and the body is the only scroll region.
1607
+ *
1608
+ * **Scroll affordance:** the Footer Frame no longer has a top outline, so when the
1609
+ * body overflows, the header gets a downward drop shadow once scrolled from the
1610
+ * top, and the footer gets an upward drop shadow while more content sits below —
1611
+ * both subtle (`--shadow-neutral-1`), both hidden at the respective scroll ends.
1612
+ *
1613
+ * Not part of the public surface — the four template components compose it.
1614
+ */
1615
+ declare const ModalShell: React.ForwardRefExoticComponent<ModalShellProps & React.RefAttributes<HTMLDivElement>>;
1616
+
1617
+ /**
1618
+ * Registers this overlay on the shared {@link pushOverlay} stack while
1619
+ * `active`, so Escape closes only the topmost overlay (Doc 3 §10) no matter
1620
+ * how dropdowns and modals/drawers are nested. `onEscape` is read fresh on
1621
+ * every call — no need to memoize it.
1622
+ */
1623
+ declare function useEscapeLayer(active: boolean, onEscape: () => void): void;
1624
+
1625
+ type ContentPrimitivesType = 'page-heading' | 'section-heading' | 'group-header' | 'utility' | 'progress-indicator' | 'vertical-list-row' | 'horizontal-list-row' | 'metrics';
1626
+ interface ContentPrimitivesProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {
1627
+ type?: ContentPrimitivesType;
1628
+ /** Title content. Accepts a node for mixed inline styling (e.g. a grey count: "Items (15)"). */
1629
+ text?: React.ReactNode;
1630
+ subtext?: React.ReactNode;
1631
+ /** Show the subtitle/description line under the title. Default true. */
1632
+ showSubtext?: boolean;
1633
+ /**
1634
+ * List-row label. Accepts a node so a row can carry an inline marker beside
1635
+ * its label — e.g. the manual Dispatch Order popover's "On-time rate ⓘ", where
1636
+ * the help affordance sits on the label line rather than the value line
1637
+ * (`showDescriptionLeadingIcon` covers the value line).
1638
+ */
1639
+ titleName?: React.ReactNode;
1640
+ listRowText?: string;
1641
+ metric?: string;
1642
+ eyebrowText?: string;
1643
+ showVisualAnchor?: boolean;
1644
+ showLeadingIcon?: boolean;
1645
+ leadingIcon?: IconName;
1646
+ leadingIconOutlined?: boolean;
1647
+ showAvatar?: boolean;
1648
+ avatarName?: string;
1649
+ avatarSrc?: string;
1650
+ showFeaturedIcon?: boolean;
1651
+ featuredIconName?: IconName;
1652
+ /** Render the featured icon glyph outlined rather than filled. @default false */
1653
+ featuredIconOutlined?: boolean;
1654
+ /**
1655
+ * Featured-icon colour. `neutral` by default — the grey anchor most rows use.
1656
+ *
1657
+ * Set it where the anchor is carrying meaning rather than just anchoring the
1658
+ * row: Admin's account-type card binds Featured Icon / **Teal** (`notice`), so
1659
+ * the icon reads as a statement about the account and not as another list
1660
+ * bullet. The colour was hardcoded `neutral` here until 2026-09-04, which made
1661
+ * that instance unreproducible.
1662
+ */
1663
+ featuredIconColor?: FeaturedIconColor;
1664
+ showMonogramIcon?: boolean;
1665
+ monogramLabel?: string;
1666
+ showTrailingContent?: boolean;
1667
+ showPassiveElements?: boolean;
1668
+ passiveElements?: React.ReactNode;
1669
+ showInteractiveElements?: boolean;
1670
+ interactiveElements?: React.ReactNode;
1671
+ /**
1672
+ * Vertical alignment of the heading row's content (leading + trailing).
1673
+ * `center` (default) matches the standalone Utility/Group-Header primitives;
1674
+ * `top` mirrors instances whose Content frame is `crossAxis: MIN` (e.g. the
1675
+ * Option Card, where the trailing control aligns with the title). Only the
1676
+ * heading-family layouts honor this.
1677
+ */
1678
+ contentAlign?: 'center' | 'top';
1679
+ showDescriptionLeadingIcon?: boolean;
1680
+ descriptionLeadingIcon?: IconName;
1681
+ onCopy?: () => void;
1682
+ showMetricVariance?: boolean;
1683
+ metricVarianceLabel?: string;
1684
+ /** Variance badge color (Figma "Variance": Neutral→neutral, Positive→success, Negative→error). */
1685
+ metricVarianceColor?: BadgeColor;
1686
+ /** Leading icon on the variance badge (e.g. Up-Arrow for positive, Down-Arrow for negative). */
1687
+ metricVarianceIcon?: IconName;
1688
+ showMetricSubtext?: boolean;
1689
+ showEyebrowTrailingIcon?: boolean;
1690
+ eyebrowTrailingIcon?: IconName;
1691
+ progressValue?: number;
1692
+ progressHelperText?: string;
1693
+ showProgressHelperText?: boolean;
1694
+ /**
1695
+ * Which {@link DesktopProgressIndicator} variant the Progress Indicator layout
1696
+ * renders. Defaults to `task` (green) — the historical behaviour. Pass
1697
+ * `system-process` for the blue system bar, as the Broadcast Logs Broadcast Status
1698
+ * Card does (its Figma instance binds `Type: System Process`).
1699
+ */
1700
+ progressVariant?: 'upload' | 'task' | 'system-process';
1701
+ }
1702
+ declare const ContentPrimitives: React.ForwardRefExoticComponent<ContentPrimitivesProps & React.RefAttributes<HTMLDivElement>>;
1703
+
1704
+ type NotificationBannerType = 'info' | 'neutral' | 'highlight' | 'warning' | 'error';
1705
+ type NotificationBannerVariant = 'filled' | 'subtle';
1706
+ interface NotificationBannerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'children'> {
1707
+ type?: NotificationBannerType;
1708
+ variant?: NotificationBannerVariant;
1709
+ title?: string;
1710
+ description: string;
1711
+ /** Override the leading icon (defaults to the icon derived from `type`). */
1712
+ icon?: IconName;
1713
+ onDismiss?: () => void;
1714
+ children?: React.ReactNode;
1715
+ showContentButtons?: boolean;
1716
+ /**
1717
+ * Optional trailing call-to-action, pinned to the **bottom-right** of the
1718
+ * trailing section (Figma `CTA` frame — a Primary/Small button, e.g. Dispatch).
1719
+ * The dismiss × sits top-right; when both are present they are pushed to
1720
+ * opposite ends of the full-height trailing column. Hidden by default
1721
+ * (mirrors the Figma `CTA` frame's `visible: false`).
1722
+ */
1723
+ cta?: React.ReactNode;
1724
+ }
1725
+ declare const NotificationBanner: React.ForwardRefExoticComponent<NotificationBannerProps & React.RefAttributes<HTMLDivElement>>;
1726
+
1727
+ type MetricVariance = 'none' | 'neutral' | 'positive' | 'negative';
1728
+ interface DesktopMetricCardProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {
1729
+ /** The large metric value, e.g. "10". */
1730
+ metric?: string;
1731
+ /** Eyebrow / period label above the metric, e.g. "This week". */
1732
+ eyebrowText?: string;
1733
+ /** Visual-anchor icon (top-left, 24px). Figma default is Check-Circle (outlined). */
1734
+ leadingIcon?: IconName;
1735
+ /** Whether the visual-anchor icon uses its outlined variant. Default true. */
1736
+ leadingIconOutlined?: boolean;
1737
+ /** Show the outlined Question help icon after the eyebrow text. Default true. */
1738
+ showEyebrowTrailingIcon?: boolean;
1739
+ /** Variance treatment for the trailing badge. Default "none" (no badge). */
1740
+ variance?: MetricVariance;
1741
+ /** Variance badge label, e.g. "20%". Shown when variance ≠ "none". */
1742
+ varianceLabel?: string;
1743
+ /** Optional subtext below the metric. Hidden by default (mirrors Figma). */
1744
+ subtext?: string;
1745
+ /** Show the metric subtext row. Default false. */
1746
+ showMetricSubtext?: boolean;
1747
+ /**
1748
+ * Trailing content (top-right). Defaults to a Proceed (↗) arrow.
1749
+ * Pass `null` to render nothing.
1750
+ */
1751
+ trailingContent?: React.ReactNode;
1752
+ /**
1753
+ * Force a visual state (Figma `State` axis). When set, overrides the
1754
+ * interactive hover/pressed tracking — useful for catalogs/snapshots.
1755
+ */
1756
+ state?: MetricCardState;
1757
+ }
1758
+ type MetricCardState = 'default' | 'hover' | 'pressed' | 'focus';
1759
+ declare const DesktopMetricCard: React.ForwardRefExoticComponent<DesktopMetricCardProps & React.RefAttributes<HTMLButtonElement>>;
1760
+
1761
+ interface OptionCardProps extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, 'onChange'> {
1762
+ /** Card title (Label/M/SemiBold). */
1763
+ title: string;
1764
+ /** Supporting description (Body/M/Regular). */
1765
+ description?: string;
1766
+ /**
1767
+ * Trailing element rendered on the right of the card. The Option Card is
1768
+ * built on the **Utility Content Primitive**, so its trailing slot is fully
1769
+ * composable — pass any `ReactNode` (a `<Badge>`, a metadata `<span>`, a CTA
1770
+ * `<Button>`, an icon, etc.).
1771
+ *
1772
+ * When omitted, defaults to a `<RadioButton>` driven by
1773
+ * `selected` / `onChange` / `name` / `value` (the mutually-exclusive-choice
1774
+ * case). Provide `trailing` to opt out of the radio entirely.
1775
+ */
1776
+ trailing?: React.ReactNode;
1777
+ /**
1778
+ * Whether to render the trailing content area at all. Defaults to `true`.
1779
+ * Set `false` for a card with **no trailing element** (e.g. the Multi-choice
1780
+ * modal's cards, where selection is shown by the Active border alone).
1781
+ */
1782
+ showTrailing?: boolean;
1783
+ /** Whether this option is selected (Active state). Drives the default radio. */
1784
+ selected?: boolean;
1785
+ /** Fires when the option is chosen (default radio only). */
1786
+ onChange?: (selected: boolean) => void;
1787
+ /** Disables interaction. */
1788
+ disabled?: boolean;
1789
+ /** Radio group name (default radio only — for mutually-exclusive selection). */
1790
+ name?: string;
1791
+ /** Radio value (default radio only). */
1792
+ value?: string;
1793
+ /**
1794
+ * Force a visual state (Figma `State` axis). When set, overrides the
1795
+ * interactive hover/pressed/selected derivation — useful for catalogs/snapshots.
1796
+ * `"focus"` renders the focus ring statically.
1797
+ */
1798
+ state?: OptionCardState;
1799
+ }
1800
+ type OptionCardState = 'idle' | 'hover' | 'pressed' | 'active' | 'focus';
1801
+ /**
1802
+ * Option Card (`9894:18459`) — a full-width selectable card built on the
1803
+ * **Utility Content Primitive**: a title + description on the left and a
1804
+ * composable **trailing element** on the right.
1805
+ *
1806
+ * **What it is:** a card-shaped choice surface. The single `State` axis drives
1807
+ * its appearance — Idle / Hover / Pressed / Active / Focus.
1808
+ *
1809
+ * **Trailing element is not fixed to a radio.** Because the card is composed
1810
+ * from the Utility Content Primitive, its trailing slot is fully composable.
1811
+ * It defaults to a `<RadioButton>` (the mutually-exclusive-choice case, driven
1812
+ * by `selected` / `onChange` / `name` / `value`), but pass `trailing` to render
1813
+ * **anything** — a metadata `<span>`, a `<Badge>`, a CTA `<Button>`, an icon,
1814
+ * a `<Checkbox>`, etc. — or `showTrailing={false}` for **no trailing element**
1815
+ * at all (selection shown by the Active border alone, e.g. the Multi-choice modal).
1816
+ *
1817
+ * **States:**
1818
+ * - **Idle** — neutral fill + 1px neutral border.
1819
+ * - **Hover** — same fill/border, distinguished only by a Neutral Drop Shadow 1.
1820
+ * - **Pressed** — slightly darker fill/border.
1821
+ * - **Active** — navy border (1.5px) + (default radio) filled.
1822
+ * - **Focus** — standard 1.5px focus ring at 4px offset (drawn around the card
1823
+ * when the nested focusable trailing element is keyboard-focused).
1824
+ *
1825
+ * **When to use:** presenting a small set of selectable options, each with a
1826
+ * label + supporting copy.
1827
+ * **When NOT to use:** dense lists (use a list/menu row) or non-selectable
1828
+ * informational cards (use Content Card).
1829
+ */
1830
+ declare const OptionCard: React.ForwardRefExoticComponent<OptionCardProps & React.RefAttributes<HTMLLabelElement>>;
1831
+
1832
+ interface ConfigurationCardRowProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
1833
+ /** Row title (Label/M/SemiBold). */
1834
+ title: string;
1835
+ /** Row description (Body/M/Regular). */
1836
+ description?: string;
1837
+ /** Trailing action — e.g. a `<Button>` ("Dispatch"). */
1838
+ trailing?: React.ReactNode;
1839
+ }
1840
+ declare const ConfigurationCardRow: React.ForwardRefExoticComponent<ConfigurationCardRowProps & React.RefAttributes<HTMLDivElement>>;
1841
+ type ConfigurationCardVariant = 'toggle' | 'control';
1842
+ interface ConfigurationCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'onToggle'> {
1843
+ /**
1844
+ * Which card shape:
1845
+ * - `toggle` (default) — the standard settings card: a Toggle in the header
1846
+ * switches the setting on/off and reveals the body.
1847
+ * - `control` — the same card **minus the switch**, for a setting that isn't
1848
+ * on/off (durations, a derived read-only value, a link out to another
1849
+ * module). Its body is always visible, and the header's trailing slot takes
1850
+ * whatever {@link ConfigurationCardProps.control} supplies — or nothing.
1851
+ */
1852
+ variant?: ConfigurationCardVariant;
1853
+ /**
1854
+ * Header trailing content for the `control` variant — an inline input, a
1855
+ * read-only value, or a link-out Button. Ignored by the `toggle` variant,
1856
+ * whose trailing slot is the Toggle.
1857
+ */
1858
+ control?: React.ReactNode;
1859
+ /** Section title (Label/M/SemiBold). */
1860
+ title: string;
1861
+ /** Section description (Body/M/Regular). */
1862
+ description?: string;
1863
+ /** Whether the section is enabled. Controls the header Toggle + body/footer visibility. */
1864
+ enabled?: boolean;
1865
+ /** Fires when the header Toggle is flipped. */
1866
+ onToggle?: (enabled: boolean) => void;
1867
+ /**
1868
+ * Render the whole card as unavailable: the header Toggle goes to its disabled
1869
+ * state and the card dims to 60% opacity.
1870
+ *
1871
+ * For a setting gated by a **master switch** elsewhere in the section — the
1872
+ * dependency stays visible so the admin can see what they'd get, rather than
1873
+ * the options appearing out of nowhere once the master is flipped on. Distinct
1874
+ * from `enabled`, which is this card's own on/off; a disabled card keeps
1875
+ * whatever `enabled` value it had, so turning the master back on restores it.
1876
+ */
1877
+ disabled?: boolean;
1878
+ /**
1879
+ * Body content — typically one or more `<ConfigurationCardRow>`. Revealed when
1880
+ * enabled and hidden (but kept mounted, so entered values survive) when not.
1881
+ */
1882
+ children?: React.ReactNode;
1883
+ /** Show the footer region when enabled. Default true. */
1884
+ showFooter?: boolean;
1885
+ /** Validation / helper message shown in the footer's subtle Notification Banner. */
1886
+ footerMessage?: string;
1887
+ /** Notification Banner type for the footer message. Default "info". */
1888
+ footerMessageType?: NotificationBannerType;
1889
+ /** Secondary action label. */
1890
+ cancelLabel?: string;
1891
+ /** Secondary action handler. */
1892
+ onCancel?: () => void;
1893
+ /** Primary action label. */
1894
+ submitLabel?: string;
1895
+ /** Primary action handler. */
1896
+ onSubmit?: () => void;
1897
+ }
1898
+ declare const ConfigurationCard: React.ForwardRefExoticComponent<ConfigurationCardProps & React.RefAttributes<HTMLDivElement>>;
1899
+
1900
+ interface ContentCardProps extends React.HTMLAttributes<HTMLDivElement> {
1901
+ /**
1902
+ * The card body — any content block, typically a `ContentPrimitives`. Maps to
1903
+ * the Figma `Container` slot. Defaults to a Utility primitive (title + subtext +
1904
+ * a trailing "Dispatch" Secondary button), mirroring Figma's default instance.
1905
+ */
1906
+ children?: React.ReactNode;
1907
+ }
1908
+ /**
1909
+ * Content Card — a plain bordered surface that wraps a single content block. It's
1910
+ * the generic "card chrome" you drop a Content Primitive into: a white card with a
1911
+ * 1px neutral border, 12px corners, and 20px padding (no shadow).
1912
+ *
1913
+ * The Figma `Container` slot is the `children` prop, laid out in a vertical
1914
+ * 16px-gap, full-width column. Pass any content (a `ContentPrimitives` of any type,
1915
+ * or your own markup); the default is a Utility primitive with a "Dispatch" action.
1916
+ *
1917
+ * **When to use:** to present a content block (Utility / Metrics / List-Row /
1918
+ * Progress primitive) on its own card surface.
1919
+ * **When NOT:** for selectable choices (use Option Card), KPI tiles (use Metric
1920
+ * Card), or toggleable sections (use Configuration Card).
1921
+ *
1922
+ * Figma `9896:25095` ("Content Primitive Containers" → Content Card).
1923
+ */
1924
+ declare const ContentCard: React.ForwardRefExoticComponent<ContentCardProps & React.RefAttributes<HTMLDivElement>>;
1925
+
1926
+ interface StackedCardsProps extends React.HTMLAttributes<HTMLDivElement> {
1927
+ /** The stacked cards — typically `<ContentCard>`s. Defaults to two Content Cards. */
1928
+ children?: React.ReactNode;
1929
+ }
1930
+ /**
1931
+ * Stacked Cards — vertically stacks multiple Content Cards with a 16px gap. It has
1932
+ * no surface of its own (no fill/border); it just lays its children out in a column.
1933
+ * Pass `<ContentCard>`s (or anything) as `children`; the default is two Content Cards.
1934
+ *
1935
+ * Figma `2794:28551` ("Content Primitive Containers" → Stacked Cards).
1936
+ */
1937
+ declare const StackedCards: React.ForwardRefExoticComponent<StackedCardsProps & React.RefAttributes<HTMLDivElement>>;
1938
+
1939
+ /** Convenience open/closed state hook. */
1940
+ declare function useAccordion(defaultOpen?: boolean): {
1941
+ open: boolean;
1942
+ toggle: () => void;
1943
+ setOpen: React.Dispatch<React.SetStateAction<boolean>>;
1944
+ };
1945
+ interface AccordionHeaderProps {
1946
+ open: boolean;
1947
+ onToggle: () => void;
1948
+ /** The `ContentPrimitives type="section-heading"` (with an {@link AccordionChevron} in its interactiveElements slot). */
1949
+ children: React.ReactNode;
1950
+ }
1951
+ /**
1952
+ * The clickable + hoverable section-header row. The whole row toggles the section
1953
+ * and drives the trailing chevron's hover state. The chevron itself remains the
1954
+ * semantic focusable control (for keyboard/AT); this row is the large hit area.
1955
+ */
1956
+ declare function AccordionHeader({ open, onToggle, children }: AccordionHeaderProps): React.ReactElement;
1957
+ /**
1958
+ * The accordion's chevron toggle. Rotates 180° between closed (down) and open (up)
1959
+ * with an ease-in-out transition. This is the semantic toggle control.
1960
+ *
1961
+ * Two visual treatments, mirroring the two Button variants the designs use:
1962
+ * - `ghost` (default) — **Ghost / Prominent Icon-Only**, a 40×40 box that takes the
1963
+ * ghost-hover fill when the enclosing {@link AccordionHeader} is hovered/focused
1964
+ * (via CSS) or when hovered directly. Used by the section organisms (List / Table
1965
+ * / Input Section) and the Order Detail accordions.
1966
+ * - `plain` — **Plain / Icon-Only / Small**, a bare glyph hugging the icon with no
1967
+ * hover fill. Used by the Activity-tab timeline entries (Figma `1487:173235`,
1968
+ * where the chevron instance is `Variant=Plain, Type=Icon Only, Size=Small`
1969
+ * at 16×16).
1970
+ */
1971
+ declare function AccordionChevron({ open, onToggle, size, variant, label, }: {
1972
+ open: boolean;
1973
+ onToggle: () => void;
1974
+ size?: number;
1975
+ /** Visual treatment — see the doc comment. Defaults to `ghost`. */
1976
+ variant?: 'ghost' | 'plain';
1977
+ /**
1978
+ * Accessible name. Defaults to "Expand/Collapse section" — override when the
1979
+ * thing being revealed isn't a page section (e.g. "driver details"), so screen
1980
+ * readers name what actually opens.
1981
+ */
1982
+ label?: {
1983
+ expand: string;
1984
+ collapse: string;
1985
+ };
1986
+ }): React.ReactElement;
1987
+ /**
1988
+ * Animated open/close reveal (Accordion Behaviour rule 4). Uses the
1989
+ * `grid-template-rows: 0fr → 1fr` technique so arbitrary-height content animates
1990
+ * smoothly (ease-in-out, interruptible CSS transition) without measuring height.
1991
+ * Owns the header→body gap as inner `paddingTop` so it collapses with the content
1992
+ * (no phantom gap above a closed section). `prefers-reduced-motion` → instant.
1993
+ *
1994
+ * @param gap row gap between body children (default `--spacing-24px`)
1995
+ * @param topGap header→body gap, applied as padding-top that animates away
1996
+ * (default `--spacing-12px`)
1997
+ */
1998
+ declare function AccordionContent({ open, children, gap, topGap, }: {
1999
+ open: boolean;
2000
+ children: React.ReactNode;
2001
+ gap?: string;
2002
+ topGap?: string;
2003
+ }): React.ReactElement;
2004
+
2005
+ type InputFieldVariant = 'basic' | 'leading' | 'trailing';
2006
+ interface InputFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
2007
+ /** Field-row composition. Default `basic`. */
2008
+ variant?: InputFieldVariant;
2009
+ /** Label text. */
2010
+ label?: string;
2011
+ /** Show the label section. Default true. */
2012
+ showLabel?: boolean;
2013
+ /** Show an Info marker after the label. */
2014
+ showLabelIcon?: boolean;
2015
+ /** The label marker icon. Default `Info` (outlined). */
2016
+ labelIcon?: IconName;
2017
+ /** Optional/Required tag after the label. Default `none`. */
2018
+ tag?: 'none' | 'optional' | 'required';
2019
+ /** Icon inside the field, before the input. */
2020
+ leadingFieldIcon?: IconName;
2021
+ /** Currency/unit prefix shown before the input (e.g. "KES"). */
2022
+ currency?: string;
2023
+ /** Icon inside the field, after the input (e.g. a help marker). */
2024
+ trailingFieldIcon?: IconName;
2025
+ /** Helper text below the field. */
2026
+ helperText?: string;
2027
+ /** Show the helper/message line. Default true. */
2028
+ showHelper?: boolean;
2029
+ /** Error message — turns the border red + shows an error icon. */
2030
+ error?: string;
2031
+ /** Warning message — shows a warning icon (border unchanged). */
2032
+ warning?: string;
2033
+ /** Show a right-aligned character counter ("n/max"). */
2034
+ showCounter?: boolean;
2035
+ /** Right-aligned control on the label row (e.g. a `<SelectionControl variant="switch">`). */
2036
+ labelToggle?: React.ReactNode;
2037
+ /** `variant="leading"` → e.g. `<LeadingInputFieldElement>`. */
2038
+ leadingElement?: React.ReactNode;
2039
+ /** `variant="trailing"` → e.g. `<TrailingInputFieldElement>`. */
2040
+ trailingElement?: React.ReactNode;
2041
+ }
2042
+ declare const InputField: React.ForwardRefExoticComponent<InputFieldProps & React.RefAttributes<HTMLInputElement>>;
2043
+
2044
+ /** A dashed horizontal rule separating Input Groups (Figma "Demarcator"). */
2045
+ declare function FormDemarcator({ style, ...rest }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
2046
+ interface InputGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
2047
+ /** Group sub-header title (Figma group-header). Default "Group Name". */
2048
+ title?: string;
2049
+ /** Group sub-header description. Default "Provide details for this group". */
2050
+ description?: string;
2051
+ /**
2052
+ * Fields laid out in a wrapping 2-column grid (col gap 32, row gap 20). Each is an
2053
+ * `<InputField>`; defaults to a basic field (label "Label Text", placeholder
2054
+ * "Field Text", helper hidden), mirroring the Figma instance config. Default 8 fields.
2055
+ */
2056
+ fields?: InputFieldProps[];
2057
+ /** Trailing content on the group header (the group-header's interactive/passive slot). */
2058
+ headerTrailing?: React.ReactNode;
2059
+ /** Replace the group header entirely. */
2060
+ header?: React.ReactNode;
2061
+ /** Replace the field grid entirely (overrides `fields`). */
2062
+ children?: React.ReactNode;
2063
+ }
2064
+ /**
2065
+ * Input Group — one titled cluster within an {@link InputSection}: a `group-header`
2066
+ * Content Primitive over a responsive 2-column grid of `InputField`s. Each field
2067
+ * fills its column and the grid wraps to one column when the container is narrow.
2068
+ */
2069
+ declare const InputGroup: React.ForwardRefExoticComponent<InputGroupProps & React.RefAttributes<HTMLDivElement>>;
2070
+ interface InputSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
2071
+ /** Section header title. Default "Text". */
2072
+ title?: string;
2073
+ /** Section header description. Default "Enter description here". */
2074
+ description?: string;
2075
+ /** Render the trailing collapse chevron. Default true. */
2076
+ showChevron?: boolean;
2077
+ /**
2078
+ * Start expanded (Figma `Open` variant). Default `true`. When collapsed
2079
+ * (`Close` variant) only the section header renders; the chevron toggles it.
2080
+ */
2081
+ defaultOpen?: boolean;
2082
+ /**
2083
+ * Controlled-toggle hook. When provided, the chevron calls this instead of
2084
+ * managing collapse internally — the caller drives `defaultOpen`.
2085
+ */
2086
+ onToggle?: () => void;
2087
+ /** Replace the section header entirely. */
2088
+ header?: React.ReactNode;
2089
+ /**
2090
+ * The form body — the Figma "Forms" SLOT (a vertical, 24px-gap stack). Provide
2091
+ * `<InputGroup>`s; a dashed demarcator is auto-inserted between adjacent children.
2092
+ * Defaults to two Input Groups, mirroring Figma.
2093
+ */
2094
+ children?: React.ReactNode;
2095
+ }
2096
+ /**
2097
+ * Input Section — a titled, collapsible, multi-group form organism (Figma
2098
+ * component set `10557:36087`, variants **Open** / **Close**). A section header
2099
+ * (title + description + collapse chevron) sits above the "Forms" slot: a vertical
2100
+ * stack of {@link InputGroup}s, each a `group-header` over a 2-column grid of
2101
+ * `InputField`s, separated by dashed demarcators.
2102
+ *
2103
+ * The chevron collapses the section like {@link ListSection} — **Open** shows the
2104
+ * header + Forms with a `Chevron-Up`; **Close** shows the header only with a
2105
+ * `Chevron-Down`.
2106
+ *
2107
+ * Composes `ContentPrimitives` (group-header) + `InputField`. The form body is the
2108
+ * Figma "Forms" SLOT, exposed as `children`; the default mirrors Figma (two groups).
2109
+ *
2110
+ * **When to use:** a structured, grouped form within a page or dialog.
2111
+ * **When not to use:** a single field (`InputField`), a few related fields
2112
+ * (`GroupedInput`), or tabular data (`Table`).
2113
+ */
2114
+ declare const InputSection: React.ForwardRefExoticComponent<InputSectionProps & React.RefAttributes<HTMLDivElement>>;
2115
+
2116
+ type ToastType = 'success' | 'warning' | 'error';
2117
+ interface ToastProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'children'> {
2118
+ /** Outcome the toast reports. Default `success`. */
2119
+ type?: ToastType;
2120
+ /** Bold title line. */
2121
+ title?: string;
2122
+ /** Show the title line. Default true. */
2123
+ showTitle?: boolean;
2124
+ /** Supporting subtitle line. */
2125
+ subtitle?: string;
2126
+ /** Show the subtitle line. Default true. */
2127
+ showSubtitle?: boolean;
2128
+ /** Renders a trailing dismiss (×) button and is the dismiss handler. */
2129
+ onDismiss?: () => void;
2130
+ /**
2131
+ * Auto-dismiss delay in ms. When set together with `onDismiss`, the toast
2132
+ * fires `onDismiss` after this delay. LETA toasts persist ~7000ms.
2133
+ */
2134
+ duration?: number;
2135
+ /** Optional trailing CTA (a `<Button>`), shown when `showCTA`. */
2136
+ children?: React.ReactNode;
2137
+ /** Show the trailing CTA slot. Default false (mirrors Figma). */
2138
+ showCTA?: boolean;
2139
+ }
2140
+ /**
2141
+ * Desktop Toast — a transient, auto-dismissing notification confirming the
2142
+ * outcome of an action. Per Doc 3 §4, the consumer's toast container places
2143
+ * these top-right (stacking downward, newest on top) and persists them 6s by
2144
+ * default / 8s when a CTA is present (set `duration`); positioning/stacking is
2145
+ * owned by that container, this component is the visual surface. `type="error"`
2146
+ * (a destructive outcome) renders `role="alert"`/`aria-live="assertive"`
2147
+ * instead of `role="status"`/`polite`. Figma `68:36772`.
2148
+ */
2149
+ declare const Toast: React.ForwardRefExoticComponent<ToastProps & React.RefAttributes<HTMLDivElement>>;
2150
+
2151
+ type TooltipVariant = 'small' | 'standard' | 'coachmark' | 'flyout' | 'popover';
2152
+ type TooltipPlatform = 'desktop' | 'mobile';
2153
+ type CaretSide = 'top' | 'bottom' | 'left' | 'right';
2154
+ type CaretAlign = 'start' | 'center' | 'end';
2155
+ interface TooltipProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
2156
+ /** Tooltip shape/content. Default `standard`. */
2157
+ variant?: TooltipVariant;
2158
+ /** `mobile` supports only small / standard / coachmark. Default `desktop`. */
2159
+ platform?: TooltipPlatform;
2160
+ /**
2161
+ * Body text (small label / paragraph / coachmark + flyout body). Accepts a node
2162
+ * so a Small tooltip can carry more than one styled line — e.g. the dispatch
2163
+ * map's driver pins, which show a bold name over a greyed qualifier.
2164
+ */
2165
+ text?: React.ReactNode;
2166
+ /** Title (coachmark / flyout / popover). */
2167
+ title?: string;
2168
+ /** Edge the caret points from. Default `bottom`. */
2169
+ caretSide?: CaretSide;
2170
+ /** Caret position along the edge. Default `center`. */
2171
+ caretAlign?: CaretAlign;
2172
+ /** Show the caret. Default true. */
2173
+ showCaret?: boolean;
2174
+ /**
2175
+ * Override the body width, px. The `standard` surface is **288** in the Library
2176
+ * (`1178:15588`: a 256px text column + 16px padding either side), and instances
2177
+ * are routinely resized from it — the Assign Driver dialog's is 236, the order
2178
+ * table's SLA tips are 256.
2179
+ *
2180
+ * It exists so those are stated at the call site instead of the component being
2181
+ * re-derived from whichever instance was last inspected. That is exactly how the
2182
+ * default became 236 on 2026-08-12: the number was read off `1875:341533`, which
2183
+ * is an *instance*, not the component.
2184
+ */
2185
+ width?: number;
2186
+ step?: number;
2187
+ totalSteps?: number;
2188
+ skipLabel?: string;
2189
+ onSkip?: () => void;
2190
+ nextLabel?: string;
2191
+ onNext?: () => void;
2192
+ /** Optional badge rendered beside the coachmark title. */
2193
+ badge?: React.ReactNode;
2194
+ cancelLabel?: string;
2195
+ onCancel?: () => void;
2196
+ confirmLabel?: string;
2197
+ onConfirm?: () => void;
2198
+ confirmVariant?: 'destructive' | 'primary';
2199
+ /**
2200
+ * Popover — Details Section slot (the metadata grid + any configuration
2201
+ * controls like a toggle row, with their dividers). Figma SLOT → ReactNode.
2202
+ */
2203
+ details?: React.ReactNode;
2204
+ /** Popover — CTA Section slot (the action buttons). Figma SLOT → ReactNode. */
2205
+ cta?: React.ReactNode;
2206
+ }
2207
+ declare const Tooltip: React.ForwardRefExoticComponent<TooltipProps & React.RefAttributes<HTMLDivElement>>;
2208
+
2209
+ /**
2210
+ * Where the tooltip sits relative to its trigger.
2211
+ *
2212
+ * - `auto` (default) — above, flipping below when there's no room. The right
2213
+ * choice for tips on inline content, where a side tooltip would cover the text
2214
+ * beside the trigger.
2215
+ * - `right` — to the trigger's right, caret pointing left. For triggers in a
2216
+ * narrow left-hand column (the collapsed Side Bar's icon-only nav), where
2217
+ * above/below would land on the neighbouring nav item.
2218
+ */
2219
+ type HoverTipPlacement = 'auto' | 'right';
2220
+ interface HoverTipProps {
2221
+ /**
2222
+ * Tooltip copy. One line for `small`, a short paragraph for `standard`.
2223
+ *
2224
+ * Pass a **function** when the copy depends on something that moves — a running
2225
+ * clock, a live count. It is then called each time the tip opens, the same
2226
+ * evaluate-at-hover-time treatment {@link HoverTipProps.shouldShow} gets, so the
2227
+ * tip can't state a number that has drifted from what is on screen beside it.
2228
+ * (The alternative is re-rendering the whole host once a second just to refresh
2229
+ * a string nobody is looking at.)
2230
+ */
2231
+ label: React.ReactNode | (() => React.ReactNode);
2232
+ /**
2233
+ * Accessible name, when `label` is not a plain string.
2234
+ *
2235
+ * The wrapper's `aria-label` normally reuses the label, which only works while the
2236
+ * label IS text. A node label (the SLA tips stack a status Badge above a sentence)
2237
+ * has to say in words what it shows.
2238
+ */
2239
+ ariaLabel?: string;
2240
+ /** Body width override, px — see {@link TooltipProps.width}. */
2241
+ width?: number;
2242
+ /**
2243
+ * Which `Tooltip` surface to render. Default `small` — the compact dark chip
2244
+ * used for terse labels ("Copy ID", a truncated value).
2245
+ *
2246
+ * Use `standard` when the tip is a sentence explaining something rather than
2247
+ * naming it, e.g. the driver popover's On-time-rate ⓘ: "Share of this driver's
2248
+ * deliveries completed within the expected fulfilment time." The Small surface
2249
+ * caps its text at 163px and centres it, so a sentence there wraps into a tall
2250
+ * narrow column; Standard is the wider, left-aligned paragraph surface.
2251
+ */
2252
+ variant?: 'small' | 'standard';
2253
+ /** The hover/focus trigger. Wrapped in an inline-flex span. */
2254
+ children: React.ReactNode;
2255
+ /** Delay before showing, ms. Default 120 (avoids flicker on pass-through). */
2256
+ delay?: number;
2257
+ /** See {@link HoverTipPlacement}. Default `auto`. */
2258
+ placement?: HoverTipPlacement;
2259
+ /**
2260
+ * Gate evaluated **at hover time**, not at render. Return false to suppress
2261
+ * the tip for this hover.
2262
+ *
2263
+ * For conditions that depend on layout — "only tip when this text is actually
2264
+ * truncated" — this is the reliable form. Deciding at mount means measuring
2265
+ * before the parent has finished sizing its columns, and then depending on a
2266
+ * ResizeObserver to correct it; the moment the pointer arrives, layout is
2267
+ * settled and the answer is simply true.
2268
+ */
2269
+ shouldShow?: () => boolean;
2270
+ /** Wrapper span style overrides. */
2271
+ style?: React.CSSProperties;
2272
+ }
2273
+ /**
2274
+ * HoverTip — wires the presentational `Tooltip` (Small variant, dark surface)
2275
+ * to a hover/focus trigger: the tooltip portals into `document.body` centered
2276
+ * on the trigger with its caret pointing at it, per the wireframes' hover
2277
+ * overlays (order-row provenance icons, Copy ID, SLA status icons,
2278
+ * finished-duration icons — and the same icons in the order-detail header).
2279
+ *
2280
+ * **Placement mirrors the dropdown/Popover logic:** the default `auto` prefers
2281
+ * **above** (caret down), but **flips below** (caret up) when there isn't room
2282
+ * above the viewport; the horizontal centre is clamped to an 8px viewport
2283
+ * margin. It measures the rendered tooltip first (hidden for one frame) so the
2284
+ * flip/clamp uses the true size. `placement="right"` puts the tooltip beside the
2285
+ * trigger instead (caret left) — the collapsed Side Bar's icon-only nav, where
2286
+ * an above/below tip would cover the adjacent nav item.
2287
+ *
2288
+ * Shows after a short `delay` on mouseenter, or on **keyboard** focus only
2289
+ * (`:focus-visible` — see `showFromFocus`); on mouseleave/blur it plays
2290
+ * the exit animation, then unmounts. The tooltip is `pointer-events: none` (never
2291
+ * traps the cursor) and `aria-hidden` — callers keep the trigger's own accessible
2292
+ * name (e.g. the Copy button's `aria-label`); for plain decorative icons the
2293
+ * label is also exposed via `aria-label` on the wrapper.
2294
+ */
2295
+ declare function HoverTip({ label, ariaLabel, width, variant, children, delay, placement, shouldShow, style }: HoverTipProps): React.ReactElement;
2296
+
2297
+ /** Which side of the trigger the panel ended up on. */
2298
+ type TooltipSide = 'above' | 'below' | 'right';
2299
+ /** Caret side to render for a given resolved {@link TooltipSide}. */
2300
+ declare const CARET_SIDE: Record<TooltipSide, 'top' | 'bottom' | 'left'>;
2301
+ interface TooltipRect {
2302
+ top: number;
2303
+ left: number;
2304
+ width: number;
2305
+ height: number;
2306
+ }
2307
+ interface TooltipPositionInput {
2308
+ /** Trigger's viewport rect. */
2309
+ trigger: TooltipRect;
2310
+ /** Measured panel size (body only — the caret is overflow). */
2311
+ panel: {
2312
+ width: number;
2313
+ height: number;
2314
+ };
2315
+ /**
2316
+ * `auto` prefers above and flips below; `right` is an explicit opt-in that
2317
+ * never flips (a caller picks it because the sides are the only viable axis,
2318
+ * e.g. a narrow nav column) and only clamps vertically.
2319
+ */
2320
+ placement?: 'auto' | 'right';
2321
+ /**
2322
+ * The box the tooltip must stay inside. Defaults to the viewport.
2323
+ *
2324
+ * Pass a container rect when the tooltip belongs to a bounded surface — the
2325
+ * map panel passes its own rect so a tooltip on a pin near the top flips
2326
+ * below instead of escaping over the modal header. The tooltip should still
2327
+ * be *rendered* outside that container (portalled to `document.body`) so the
2328
+ * container's `overflow: hidden` cannot clip it; this only constrains where
2329
+ * it is placed.
2330
+ */
2331
+ boundary?: TooltipRect;
2332
+ /** Clearance from the boundary edges. Default {@link BOUNDARY_MARGIN}. */
2333
+ margin?: number;
2334
+ }
2335
+ interface TooltipPosition {
2336
+ /** Viewport coordinates for the panel's top-left corner. */
2337
+ top: number;
2338
+ left: number;
2339
+ side: TooltipSide;
2340
+ caretAlign: CaretAlign;
2341
+ }
2342
+ declare function computeTooltipPosition({ trigger, panel, placement, boundary, margin, }: TooltipPositionInput): TooltipPosition;
2343
+
2344
+ type EmptyStateType = 'no-results' | 'no-reviews' | 'no-broadcast-logs' | 'image-upload' | 'file-upload' | 'no-suspensions' | 'no-items' | 'no-orders' | 'no-network' | 'new-update' | 'no-data' | 'no-trips' | 'no-drivers' | 'no-products' | 'error' | 'comments' | 'notifications';
2345
+ type EmptyStateSize = 'mobile' | 'desktop';
2346
+ interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
2347
+ /** Preset scenario — sets the illustration + default copy. Default `no-orders`. */
2348
+ type?: EmptyStateType;
2349
+ /** `desktop` (full-page, larger heading) or `mobile` (compact — cards/panels/results). Default `desktop`. */
2350
+ size?: EmptyStateSize;
2351
+ /** Override the heading. */
2352
+ heading?: string;
2353
+ /** Override the supporting copy. */
2354
+ description?: string;
2355
+ /** Show the illustration. Default true (false ⇒ Figma's "No Icon" treatment — text only). */
2356
+ showIcon?: boolean;
2357
+ /** Optional CTA (e.g. a `<Button>`), rendered below the copy (Container slot). */
2358
+ children?: React.ReactNode;
2359
+ }
2360
+ /**
2361
+ * Empty State (`7339:29150`) — a centred placeholder column shown when there's no
2362
+ * data: a 150×150 LETA illustration (with its own ground shadow) over a heading
2363
+ * and supporting copy, plus an optional CTA. Choose a scenario with `type` (14
2364
+ * presets), the heading scale with `size`, or pass `showIcon={false}` for the
2365
+ * text-only "No Icon" treatment. The `children` slot (Figma Container) holds the CTA.
2366
+ *
2367
+ * **When to use:** an empty table/list/panel, no search results, a connection
2368
+ * error, or an upload prompt.
2369
+ * **When not to use:** inline field errors (use the field's own message) or a
2370
+ * transient toast (use Toast).
2371
+ */
2372
+ declare const EmptyState: React.ForwardRefExoticComponent<EmptyStateProps & React.RefAttributes<HTMLDivElement>>;
2373
+
2374
+ /**
2375
+ * Select — the field acts as a select trigger: a read-only field box with a
2376
+ * trailing chevron that opens a menu/overlay (owned by the consumer). The
2377
+ * `Select` type of Data Entry `38:42` (Variant=Basic). Visually identical to
2378
+ * the field box of Input Field; clicking the box fires `onSelectClick`.
2379
+ *
2380
+ * The field box carries `data-field-box` — a stable hook for consumers that
2381
+ * anchor a popover/overlay to this control. Anchoring to the outer (labelled)
2382
+ * wrapper instead measures a rect that includes the label above the box, which
2383
+ * throws off overlay flip-above positioning (the panel lands level with the
2384
+ * label, not the visible field).
2385
+ */
2386
+ interface SelectProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
2387
+ /** Label text. */
2388
+ label?: string;
2389
+ /** Show the label section. Default true. */
2390
+ showLabel?: boolean;
2391
+ /** Show an Info marker after the label. */
2392
+ showLabelIcon?: boolean;
2393
+ /** The label marker icon. Default `Info` (outlined). */
2394
+ labelIcon?: IconName;
2395
+ /** Optional/Required tag after the label. Default `none`. */
2396
+ tag?: 'none' | 'optional' | 'required';
2397
+ /** Icon inside the field, before the value. */
2398
+ leadingFieldIcon?: IconName;
2399
+ /** Currency/unit prefix shown before the value (e.g. "KES"). */
2400
+ currency?: string;
2401
+ /** Helper text below the field. */
2402
+ helperText?: string;
2403
+ /** Show the helper/message line. Default true. */
2404
+ showHelper?: boolean;
2405
+ /** Error message — turns the border red + shows an error icon. */
2406
+ error?: string;
2407
+ /** Warning message — shows a warning icon (border unchanged). */
2408
+ warning?: string;
2409
+ /** Right-aligned control on the label row. */
2410
+ labelToggle?: React.ReactNode;
2411
+ /** Fired when the field/chevron is clicked (open the menu/overlay). */
2412
+ onSelectClick?: () => void;
2413
+ }
2414
+ declare const Select: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<HTMLInputElement>>;
2415
+
2416
+ /**
2417
+ * Stepper Input — a labelled numeric stepper field. The `Stepper Input` type of
2418
+ * Data Entry `38:42` (Variant=Basic): the label + helper chrome of a Data Entry
2419
+ * field, with a `<Stepper>` (its building block) in place of the text field box.
2420
+ * Renders an internal `<Stepper>` with the forwarded props, or accepts a
2421
+ * `stepper` slot to inject a fully-configured one.
2422
+ */
2423
+ interface StepperInputProps {
2424
+ /** Label text. */
2425
+ label?: string;
2426
+ /** Show the label section. Default true. */
2427
+ showLabel?: boolean;
2428
+ /** Show an Info marker after the label. */
2429
+ showLabelIcon?: boolean;
2430
+ /** The label marker icon. Default `Info` (outlined). */
2431
+ labelIcon?: IconName;
2432
+ /** Optional/Required tag after the label. Default `none`. */
2433
+ tag?: 'none' | 'optional' | 'required';
2434
+ /** Helper text below the field. */
2435
+ helperText?: string;
2436
+ /** Show the helper/message line. Default true. */
2437
+ showHelper?: boolean;
2438
+ /** Error message — shows an error icon + red text. */
2439
+ error?: string;
2440
+ /** Warning message — shows a warning icon + warning text. */
2441
+ warning?: string;
2442
+ /** Right-aligned control on the label row. */
2443
+ labelToggle?: React.ReactNode;
2444
+ /** Stepper visual variant. Default `discrete`. */
2445
+ stepperVariant?: StepperVariant;
2446
+ /** Controlled stepper value. */
2447
+ value?: number;
2448
+ /** Uncontrolled initial stepper value. */
2449
+ defaultValue?: number;
2450
+ /** Fired with the next clamped value. */
2451
+ onChange?: (value: number) => void;
2452
+ /** Lower bound (inclusive). Default 0. */
2453
+ min?: number;
2454
+ /** Upper bound (inclusive). */
2455
+ max?: number;
2456
+ /** Increment/decrement amount. Default 1. */
2457
+ step?: number;
2458
+ disabled?: boolean;
2459
+ /** Override the internal `<Stepper>` with a fully-configured one. */
2460
+ stepper?: React.ReactNode;
2461
+ className?: string;
2462
+ style?: React.CSSProperties;
2463
+ }
2464
+ declare function StepperInput({ label, showLabel, showLabelIcon, labelIcon, tag, helperText, showHelper, error, warning, labelToggle, stepperVariant, value, defaultValue, onChange, min, max, step, disabled, stepper, className, style, }: StepperInputProps): react_jsx_runtime.JSX.Element;
2465
+
2466
+ type GroupedInputVariant = 'multi-field' | 'range-input' | 'time-input-stepper';
2467
+ interface GroupedInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
2468
+ /** Which Figma `Property 1` layout. Default `multi-field`. */
2469
+ variant?: GroupedInputVariant;
2470
+ /** Bottom helper text. */
2471
+ showHelperText?: boolean;
2472
+ helperText?: string;
2473
+ /** The grouped fields (default: three `<InputField>`s). */
2474
+ children?: React.ReactNode;
2475
+ /** Show the trailing element after the fields (multi-field). Default true. */
2476
+ showTailComponent?: boolean;
2477
+ /** Trailing element (default: a Dropdown `<TrailingInputFieldElement>`). */
2478
+ tail?: React.ReactNode;
2479
+ /** Left field of the range (default `<InputField>`). */
2480
+ from?: React.ReactNode;
2481
+ /** Right field of the range (default `<InputField>`). */
2482
+ to?: React.ReactNode;
2483
+ /** Show the editable label above the steppers. Default true. */
2484
+ showEditableLabel?: boolean;
2485
+ /** Editable-label text (time-input-stepper). */
2486
+ editableLabel?: string;
2487
+ }
2488
+ /**
2489
+ * Grouped Input — lays out several data-entry fields together as one unit
2490
+ * (Figma `5146:845211`). Three layouts:
2491
+ *
2492
+ * - **`multi-field`** — a row of input fields (the `children`) ending in an optional
2493
+ * trailing element (`tail`, e.g. a unit dropdown).
2494
+ * - **`range-input`** — two fields joined by a "→" arrow, for a from→to range.
2495
+ * - **`time-input-stepper`** — an editable label above a row of Hours / Minutes /
2496
+ * Seconds stepper inputs.
2497
+ *
2498
+ * Fields align at their input boxes (labels sit above), and an optional helper line
2499
+ * sits beneath the whole group.
2500
+ *
2501
+ * **When to use:** when several fields form one logical value (a date range, a
2502
+ * duration, an address row). **When NOT:** for a single field (use Input Field).
2503
+ */
2504
+ declare const GroupedInput: React.ForwardRefExoticComponent<GroupedInputProps & React.RefAttributes<HTMLDivElement>>;
2505
+
2506
+ type DateTimePickerType = 'simple' | 'date-range' | 'date-time';
2507
+ interface DateTimePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
2508
+ /** Which picker. Default `simple`. */
2509
+ type?: DateTimePickerType;
2510
+ platform?: 'desktop' | 'mobile';
2511
+ /** Initial displayed month. Default: the current month. */
2512
+ defaultMonth?: {
2513
+ year: number;
2514
+ month: number;
2515
+ };
2516
+ /**
2517
+ * Disable every day before this one, and — on that same day — every time
2518
+ * before its time-of-day (desktop `date-time`'s Time of Day list only; the
2519
+ * mobile time wheel does not yet gate). For scheduling something that can't
2520
+ * happen in the past (a delivery date, a reschedule). Omit for pickers that
2521
+ * filter historical records (e.g. a "Created" date-range filter), which must
2522
+ * still reach the past.
2523
+ */
2524
+ minDate?: Date;
2525
+ /**
2526
+ * Seed the picker with the value that is **already applied** — the selected
2527
+ * day for `simple`, the day *and* time-of-day for `date-time`.
2528
+ *
2529
+ * **Read once, at mount.** These are uncontrolled seeds, not a controlled
2530
+ * value, because this picker is mounted only while its popover is open: it is
2531
+ * a fresh component on every open, so the only moment it can learn what the
2532
+ * host already has is its first render. A host that re-renders with a new
2533
+ * `defaultDate` while the picker is open is not trying to move the user's
2534
+ * cursor mid-edit.
2535
+ *
2536
+ * Without it a picker reopens blank — showing the current month with nothing
2537
+ * selected and Apply disabled — while the field beside it displays a real
2538
+ * value. The user is then asked to re-enter what they can already read.
2539
+ *
2540
+ * On `date-time` the time-of-day is derived from the same Date and snapped to
2541
+ * the nearest 30-minute row, since those are the only times the list offers.
2542
+ */
2543
+ defaultDate?: Date | null;
2544
+ /**
2545
+ * Seed a `date-range` picker with the applied range. Same read-once semantics
2546
+ * as {@link DateTimePickerProps.defaultDate}. The calendars open on the
2547
+ * range's start month, and the Start / End fields show it.
2548
+ */
2549
+ defaultRange?: {
2550
+ start: Date | null;
2551
+ end: Date | null;
2552
+ } | null;
2553
+ /**
2554
+ * Seed which `date-range` preset row reads as active ("Today", "Last 7 Days",
2555
+ * "Custom", …). Pass back whatever `onApply` reported, so reopening the picker
2556
+ * shows the same row ticked that produced the range in the field.
2557
+ */
2558
+ defaultPreset?: string;
2559
+ /** Mobile bottom-sheet header title / subtitle. */
2560
+ title?: string;
2561
+ subtitle?: string;
2562
+ /**
2563
+ * Fired when the user applies a single date / range / time. `preset` is set for
2564
+ * date-range presets and Custom. `explicit` is true when the user pressed a
2565
+ * footer button rather than a preset auto-applying.
2566
+ *
2567
+ * **A `date-range` Clear reports here too**, as `{ start: null, end: null,
2568
+ * preset: undefined, explicit: true }` — so a host must treat null endpoints as
2569
+ * "no date filter" rather than assuming every call carries a range.
2570
+ */
2571
+ onApply?: (value: {
2572
+ date?: Date | null;
2573
+ start?: Date | null;
2574
+ end?: Date | null;
2575
+ time?: string | null;
2576
+ preset?: string;
2577
+ explicit?: boolean;
2578
+ }) => void;
2579
+ onCancel?: () => void;
2580
+ }
2581
+ /**
2582
+ * Date & Time Pickers (`1182:17579`) — `simple` (one calendar), `date-range`
2583
+ * (preset list + dual calendars), and `date-time` (calendar + time column), on
2584
+ * desktop or mobile. Desktop calendars show the abbreviated month ("Nov 2024");
2585
+ * mobile shows the full month. Range selection paints a continuous grey band
2586
+ * across the in-between days.
2587
+ *
2588
+ * **Footer (desktop)** — a Footer Frame (Card Footer) with a Notification Banner
2589
+ * on the left + Clear / Apply on the right. The banner message is contextual:
2590
+ * - **Date & Time**: while *not both* a date and a time are selected (none, only
2591
+ * the date, or only the time) it reads **"Select date & time"**; once **both**
2592
+ * are selected it shows the chosen value, e.g. **"Nov 5 2024, 12:30 AM"**.
2593
+ * - **Date Range**: it reads **"{N} days selected"**.
2594
+ */
2595
+ declare const DateTimePicker: React.ForwardRefExoticComponent<DateTimePickerProps & React.RefAttributes<HTMLDivElement>>;
2596
+
2597
+ interface CalendarProps {
2598
+ /** Displayed year. */
2599
+ year: number;
2600
+ /** Displayed month (0–11). */
2601
+ month: number;
2602
+ platform?: 'desktop' | 'mobile';
2603
+ /** Single selected day (simple / date-time). */
2604
+ selected?: Date | null;
2605
+ /** Range endpoints (date-range). */
2606
+ rangeStart?: Date | null;
2607
+ rangeEnd?: Date | null;
2608
+ /**
2609
+ * Disable every day strictly before this one (compared by calendar day, not
2610
+ * time-of-day) — a past day is greyed out and not selectable. Used when the
2611
+ * picker is scheduling something that can't happen in the past (a delivery
2612
+ * date, a reschedule), never for a picker that filters historical records
2613
+ * (e.g. the Orders table's "Created" date filter, which must reach the past).
2614
+ */
2615
+ minDate?: Date;
2616
+ onSelectDay?: (date: Date) => void;
2617
+ onPrevMonth?: () => void;
2618
+ onNextMonth?: () => void;
2619
+ onPrevYear?: () => void;
2620
+ onNextYear?: () => void;
2621
+ style?: React.CSSProperties;
2622
+ }
2623
+ /**
2624
+ * Calendar — the shared month grid used by every Date & Time Picker type. A
2625
+ * Month & Year header (navigation + label), a Monday-first weekday row, and a
2626
+ * weekday-aligned grid of day cells (reusing the Day Cell menu-option). Selected
2627
+ * days / range endpoints render `active`; in-between range days get a light fill;
2628
+ * leading/trailing days from adjacent months are muted and non-interactive.
2629
+ */
2630
+ declare const Calendar: React.ForwardRefExoticComponent<CalendarProps & React.RefAttributes<HTMLDivElement>>;
2631
+
2632
+ type TextAreaVariant = 'basic' | 'rich';
2633
+ interface TextAreaShared {
2634
+ /** `basic` plain multi-line field, or `rich` with a formatting-toolbar footer. Default `basic`. */
2635
+ variant?: TextAreaVariant;
2636
+ /** Label text. */
2637
+ label?: string;
2638
+ /** Show the label section. Default true. */
2639
+ showLabel?: boolean;
2640
+ /** Show an Info marker after the label. */
2641
+ showLabelIcon?: boolean;
2642
+ /** The label marker icon. Default `Info` (outlined). */
2643
+ labelIcon?: IconName;
2644
+ /** Optional/Required tag after the label. Default `none`. */
2645
+ tag?: 'none' | 'optional' | 'required';
2646
+ /** Right-aligned control on the label row (e.g. a `<SelectionControl variant="switch">`). */
2647
+ labelToggle?: React.ReactNode;
2648
+ /** Helper text below the field. */
2649
+ helperText?: string;
2650
+ /** Show the helper/message line. Default true. */
2651
+ showHelper?: boolean;
2652
+ /** Error message — turns the border red + shows an error icon. */
2653
+ error?: string;
2654
+ /** Warning message — shows a warning icon (border unchanged). */
2655
+ warning?: string;
2656
+ /** Show the in-field character counter ("n/max"). Default true. */
2657
+ showCounter?: boolean;
2658
+ /** Visible text rows (drives min height, basic variant only). Default ~4 (≈120px box). */
2659
+ rows?: number;
2660
+ disabled?: boolean;
2661
+ placeholder?: string;
2662
+ maxLength?: number;
2663
+ className?: string;
2664
+ style?: React.CSSProperties;
2665
+ }
2666
+ interface TextAreaBasicProps extends TextAreaShared, Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'rows' | 'value' | 'defaultValue' | 'onChange' | 'placeholder' | 'disabled' | 'maxLength' | 'className' | 'style'> {
2667
+ variant?: 'basic';
2668
+ value?: string;
2669
+ defaultValue?: string;
2670
+ onChange?: React.ChangeEventHandler<HTMLTextAreaElement>;
2671
+ }
2672
+ interface TextAreaRichProps extends TextAreaShared {
2673
+ variant: 'rich';
2674
+ /**
2675
+ * Sanitized HTML — the only markup that ever survives is `<strong>/<em>/<u>/<br>`
2676
+ * (see `sanitizeRichText`). Controlled; omit for an uncontrolled field.
2677
+ */
2678
+ value?: string;
2679
+ /** Uncontrolled initial HTML value. */
2680
+ defaultValue?: string;
2681
+ /** Fired with the new sanitized HTML after every edit (typing, formatting, paste). */
2682
+ onChange?: (html: string) => void;
2683
+ /**
2684
+ * Fired when the user toggles Bold/Italic/Underline — `active` is the format's
2685
+ * new state. Informational only: `TextArea` already applies the formatting to
2686
+ * the selection/caret itself:
2687
+ * - With text highlighted, the button bolds/italicizes/underlines the selection.
2688
+ * - With just a caret, the format becomes "sticky" — it applies to whatever is
2689
+ * typed next, like Word/Docs — until toggled off or the caret moves away.
2690
+ */
2691
+ onBold?: (active: boolean) => void;
2692
+ onItalic?: (active: boolean) => void;
2693
+ onUnderline?: (active: boolean) => void;
2694
+ /**
2695
+ * Trailing footer slot (Figma `38:42` Text Area / Rich — `Trailing Buttons`
2696
+ * SLOT). Whatever ReactNode you pass renders here, right of the formatting
2697
+ * toggles. Omit for the DS default (a Secondary "Cancel" + Primary "Save",
2698
+ * wired to `onCancel`/`onSave`); pass `null` for no trailing region at all
2699
+ * (inline-edit variant, where Save/Cancel live in a separate card footer).
2700
+ */
2701
+ trailing?: React.ReactNode;
2702
+ /** Wired to the default trailing Save button. Ignored when `trailing` is set. */
2703
+ onSave?: () => void;
2704
+ /** Wired to the default trailing Cancel button. Ignored when `trailing` is set. */
2705
+ onCancel?: () => void;
2706
+ /**
2707
+ * Disable the default trailing Save button. Default `false` — the Save button
2708
+ * ships as Idle per Figma and enables the enter/submit action even on an
2709
+ * empty draft unless the caller opts in.
2710
+ */
2711
+ saveDisabled?: boolean;
2712
+ /**
2713
+ * Focus the field on mount and place the caret at the end of any seeded
2714
+ * content. Use when the rich field appears in response to a user action (e.g.
2715
+ * expanding a collapsed comment composer, or entering inline-edit) so the user
2716
+ * can type immediately.
2717
+ */
2718
+ autoFocus?: boolean;
2719
+ onFocus?: React.FocusEventHandler<HTMLDivElement>;
2720
+ onBlur?: React.FocusEventHandler<HTMLDivElement>;
2721
+ }
2722
+ type TextAreaProps = TextAreaBasicProps | TextAreaRichProps;
2723
+ declare const TextArea: React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<HTMLDivElement | HTMLTextAreaElement>>;
2724
+
2725
+ /**
2726
+ * Reduce an HTML string down to only `<strong>/<b>/<em>/<i>/<u>/<br>`, no
2727
+ * attributes, no other tags — the output is inert markup, safe to render as
2728
+ * raw HTML anywhere downstream. No-ops (returns unchanged) outside a browser.
2729
+ */
2730
+ declare function sanitizeRichText(html: string): string;
2731
+ /** Plain visible text of a (rich or plain) HTML string — for length/emptiness checks. */
2732
+ declare function htmlToPlainText(html: string): string;
2733
+
2734
+ interface SearchInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
2735
+ /** Placeholder. Default "Search here...". */
2736
+ placeholder?: string;
2737
+ /** Leading icon. Default `Search`. */
2738
+ icon?: IconName;
2739
+ /** Optional label above the field (hidden by default). */
2740
+ label?: string;
2741
+ /** Optional helper text below the field (hidden by default). */
2742
+ helperText?: string;
2743
+ /** Notified when the clear (×) is clicked. Optional — the field clears itself. */
2744
+ onClear?: () => void;
2745
+ /** Error state — error-colored field border + an error message row below. */
2746
+ error?: boolean;
2747
+ /** The error message text (shown when `error`). Default "Enter a valid character/value". */
2748
+ errorMessage?: string;
2749
+ disabled?: boolean;
2750
+ }
2751
+ /**
2752
+ * Desktop search field — the `Search Input` type of Data Entry `38:42` (Desktop
2753
+ * variant): `--rounding-lg` field on `--surface-neutral-search-field`. The mobile,
2754
+ * web-map and mobile-map variants are the separate `MobileSearchInput`,
2755
+ * `MapSearchInput` and `MobileMapSearchInput` components.
2756
+ *
2757
+ * A trailing clear (×) button appears automatically as soon as the field has text
2758
+ * and clears it on click (also firing `onClear`); it's hidden while the field is empty.
2759
+ *
2760
+ * **Error state** (`error`) — mirrors Figma's Desktop/Error variant: the field
2761
+ * border turns `--border-error-default` and an error message row (`Icon/Error` +
2762
+ * `--text-error-label` text) renders below the field.
2763
+ */
2764
+ declare const SearchInput: React.ForwardRefExoticComponent<SearchInputProps & React.RefAttributes<HTMLInputElement>>;
2765
+
2766
+ interface MobileSearchInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
2767
+ /** Placeholder. Default "Search here...". */
2768
+ placeholder?: string;
2769
+ /** Leading icon. Default `Search`. */
2770
+ icon?: IconName;
2771
+ /** Optional label above the field (hidden by default). */
2772
+ label?: string;
2773
+ /** Optional helper text below the field (hidden by default). */
2774
+ helperText?: string;
2775
+ /** Notified when the clear (×) is clicked. Optional — the field clears itself. */
2776
+ onClear?: () => void;
2777
+ disabled?: boolean;
2778
+ }
2779
+ /**
2780
+ * Mobile search field — the `Search Input` type of Data Entry `38:42` (Mobile
2781
+ * variant): a pill `--rounding-round` field on `--surface-neutral-input-field`.
2782
+ * (Desktop is `SearchInput`; the map variants are `MapSearchInput` /
2783
+ * `MobileMapSearchInput`.)
2784
+ *
2785
+ * A trailing clear (×) button appears automatically as soon as the field has text
2786
+ * and clears it on click (also firing `onClear`); it's hidden while the field is empty.
2787
+ */
2788
+ declare const MobileSearchInput: React.ForwardRefExoticComponent<MobileSearchInputProps & React.RefAttributes<HTMLInputElement>>;
2789
+
2790
+ type MapSearchState = 'idle' | 'no-history' | 'active-history' | 'empty-results' | 'active-results';
2791
+ interface MapSearchInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
2792
+ /** Panel state. `idle` = field only; the rest attach a results panel. Default `active-results`. */
2793
+ state?: MapSearchState;
2794
+ /** Placeholder. Default "Search here...". */
2795
+ placeholder?: string;
2796
+ /** Leading icon. Default `Search`. */
2797
+ icon?: IconName;
2798
+ /** Notified when the clear (×) is clicked. Optional — the field clears itself. */
2799
+ onClear?: () => void;
2800
+ /** `active-history` header title. Default "Recent Searches". */
2801
+ recentTitle?: string;
2802
+ /** `active-history` "Clear All" handler. */
2803
+ onClearHistory?: () => void;
2804
+ /** Filter chip labels in the results Top Section. Default three "Filter"s. */
2805
+ filters?: string[];
2806
+ /** Index of the active filter chip. Default 0. */
2807
+ activeFilter?: number;
2808
+ /** Results count shown in the Top Section heading ("Results (N)"). Default 5. */
2809
+ resultsCount?: number;
2810
+ /** Empty-results copy below the no-results illustration. */
2811
+ noResultsText?: string;
2812
+ /** "No recent searches" copy. */
2813
+ noHistoryText?: string;
2814
+ /** Menu-options list — defaults to a `<Placeholder>` standing in for Desktop Menu Options `1531:5056`. */
2815
+ children?: React.ReactNode;
2816
+ disabled?: boolean;
2817
+ }
2818
+ /**
2819
+ * Web-map search — the `Search Input` type of Data Entry `38:42` (Web Map variant):
2820
+ * a 480px `--surface-neutral-alt-search-field` field with an attached results dropdown.
2821
+ * The `state` prop drives the panel (Figma states):
2822
+ * - `idle` — field only.
2823
+ * - `no-history` — "No recent searches" helper.
2824
+ * - `active-history` — "Recent Searches" header + Clear All + a recent-search list.
2825
+ * - `empty-results` — filter chips + "Results (0)" + a no-results `<EmptyState>`.
2826
+ * - `active-results` — filter chips + "Results (N)" + a results list.
2827
+ * The list slots default to `DesktopMenuOptions` rows; pass your own via `children`.
2828
+ *
2829
+ * The field shows a trailing clear (×) — always while the panel is open, and as soon
2830
+ * as the closed (idle) field has text. Clicking it clears the field and fires `onClear`.
2831
+ */
2832
+ declare const MapSearchInput: React.ForwardRefExoticComponent<MapSearchInputProps & React.RefAttributes<HTMLInputElement>>;
2833
+
2834
+ interface MobileMapSearchInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {
2835
+ /** Placeholder. Default "Search here...". */
2836
+ placeholder?: string;
2837
+ /** Leading icon. Default `Search`. */
2838
+ icon?: IconName;
2839
+ /** Show the attached results panel. Default true. */
2840
+ open?: boolean;
2841
+ /** Notified when the clear (×) is clicked. Optional — the field clears itself. */
2842
+ onClear?: () => void;
2843
+ /** Results-panel body — defaults to a `MobileDropdown` of `MobileMenuOptions` rows. */
2844
+ children?: React.ReactNode;
2845
+ disabled?: boolean;
2846
+ }
2847
+ /**
2848
+ * Mobile-map search — the `Search Input` type of Data Entry `38:42` (Mobile Map
2849
+ * variant): a pill `--surface-neutral-alt-search-field` field with an attached
2850
+ * `MobileDropdown` results panel holding a list of `MobileMenuOptions` rows
2851
+ * (pass your own via `children`).
2852
+ *
2853
+ * The field shows a trailing clear (×) — always while the panel is open, and as soon
2854
+ * as the closed field has text. Clicking it clears the field and fires `onClear`.
2855
+ */
2856
+ declare const MobileMapSearchInput: React.ForwardRefExoticComponent<MobileMapSearchInputProps & React.RefAttributes<HTMLInputElement>>;
2857
+
2858
+ interface FileUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
2859
+ /** Label above the drop zone. Default "Attach an image". */
2860
+ label?: string;
2861
+ /** Show the label section. Default true. */
2862
+ showLabel?: boolean;
2863
+ /** Show an Info marker after the label. */
2864
+ showLabelIcon?: boolean;
2865
+ labelIcon?: IconName;
2866
+ /** Optional/Required tag after the label. Default `optional`. */
2867
+ tag?: 'none' | 'optional' | 'required';
2868
+ /** Prompt text inside the drop zone. */
2869
+ promptText?: string;
2870
+ /** Browse button label. */
2871
+ browseLabel?: string;
2872
+ /** Max-size hint below the button. */
2873
+ maxSizeText?: string;
2874
+ /** `accept` attribute for the file input. */
2875
+ accept?: string;
2876
+ /** Allow multiple files. */
2877
+ multiple?: boolean;
2878
+ /** Fires with the selected/dropped files. */
2879
+ onFiles?: (files: FileList) => void;
2880
+ /** File-queue slot — render `<FileUploadCard>` groups (Uploading/Uploaded) here. */
2881
+ children?: React.ReactNode;
2882
+ }
2883
+ /**
2884
+ * Desktop drag-and-drop file upload zone — the `File Upload` type of Data Entry
2885
+ * `38:42` (Desktop variant). Label + a dashed drop zone with a "Browse to upload"
2886
+ * Secondary button + max-size hint; a hidden file input is triggered by Browse,
2887
+ * and drag-drop is supported via `onFiles`. The Uploading / Uploaded states render
2888
+ * a queue of `<FileUploadCard>`s in the `children` slot. (Figma has no disabled
2889
+ * state.) The mobile image-tile grid is the separate `MobileFileUpload` component.
2890
+ */
2891
+ declare const FileUpload: React.ForwardRefExoticComponent<FileUploadProps & React.RefAttributes<HTMLDivElement>>;
2892
+
2893
+ type FileUploadCardStatus = 'uploading' | 'uploaded';
2894
+ interface FileUploadCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
2895
+ /** `uploading` → Loading glyph + progress bar; `uploaded` → Check-Circle glyph, no bar. */
2896
+ status?: FileUploadCardStatus;
2897
+ /** File name (Label/M/SemiBold). */
2898
+ filename: string;
2899
+ /** File size, e.g. "32MB" (Label/S/Regular). */
2900
+ size?: string;
2901
+ /** Upload progress 0–100 (`uploading` only). */
2902
+ progress?: number;
2903
+ /** Fires when the trailing × is clicked. */
2904
+ onRemove?: () => void;
2905
+ }
2906
+ /**
2907
+ * A single row of the File Upload queue — the "File Upload Cards" sub-instance of
2908
+ * Data Entry `38:42` (`Property 1 = Uploading | Uploaded`). A `--surface-neutral-
2909
+ * bg-muted` card with a leading status glyph, filename + size, a trailing Ghost
2910
+ * Icon-Only remove button, and (when uploading) a `DesktopProgressIndicator`.
2911
+ */
2912
+ declare const FileUploadCard: React.ForwardRefExoticComponent<FileUploadCardProps & React.RefAttributes<HTMLDivElement>>;
2913
+
2914
+ interface MobileFileUploadImage {
2915
+ src: string;
2916
+ alt?: string;
2917
+ }
2918
+ interface MobileFileUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
2919
+ /** Label above the grid. Default "Attach an image". */
2920
+ label?: string;
2921
+ /** Show the label section. Default true. */
2922
+ showLabel?: boolean;
2923
+ /** Show an Info marker after the label. */
2924
+ showLabelIcon?: boolean;
2925
+ labelIcon?: IconName;
2926
+ /** Optional/Required tag after the label. Default `optional`. */
2927
+ tag?: 'none' | 'optional' | 'required';
2928
+ /** Uploaded image thumbnails. */
2929
+ images?: MobileFileUploadImage[];
2930
+ /** Number of trailing "Add Photo" tiles. Defaults to filling a 3-up row when empty, else 0. */
2931
+ addTiles?: number;
2932
+ /** "Add Photo" tile label. */
2933
+ addLabel?: string;
2934
+ /** Fires when an Add Photo tile is activated. */
2935
+ onAdd?: () => void;
2936
+ /** Fires with the index of the image whose delete badge was clicked. */
2937
+ onRemove?: (index: number) => void;
2938
+ }
2939
+ /**
2940
+ * Mobile file upload — the `File Upload` type of Data Entry `38:42` (Mobile
2941
+ * variant). A 3-up grid of 111×104 tiles: "Add Photo" placeholders (icon + label
2942
+ * on `--surface-neutral-input-field` with a solid border) and uploaded image
2943
+ * thumbnails with a red delete badge. (Desktop drag-zone is `FileUpload`.)
2944
+ */
2945
+ declare const MobileFileUpload: React.ForwardRefExoticComponent<MobileFileUploadProps & React.RefAttributes<HTMLDivElement>>;
2946
+
2947
+ interface PlaceholderProps extends React.HTMLAttributes<HTMLDivElement> {
2948
+ /** Centered label. Default "Placeholder". */
2949
+ label?: string;
2950
+ /** Min height of the box. Default 120. */
2951
+ minHeight?: number;
2952
+ }
2953
+ /**
2954
+ * A temporary visual stand-in for a not-yet-built component (a dashed neutral box
2955
+ * with a centered muted label). Used e.g. inside the Map search results panel in
2956
+ * place of the Desktop Menu Options list (`1531:5056`) until that component exists.
2957
+ * Swap out once the real component ships.
2958
+ */
2959
+ declare const Placeholder: React.ForwardRefExoticComponent<PlaceholderProps & React.RefAttributes<HTMLDivElement>>;
2960
+
2961
+ /**
2962
+ * The `Type` of menu row to render. Each value is one kind of item you'd find
2963
+ * inside a desktop menu, dropdown, sidebar, calendar, or pager:
2964
+ *
2965
+ * - `combobox` — a selectable option in a single-select list. The chosen option
2966
+ * gets a light highlight and a trailing checkmark.
2967
+ * - `dropdown-basic` — a standard menu command. Can show a trailing chevron (to
2968
+ * open a submenu), a keyboard shortcut, or a small badge.
2969
+ * - `dropdown-advanced` — a richer two-line item (title + description) for results
2970
+ * or entities that need extra detail.
2971
+ * - `dropdown-destructive` — a dangerous command such as Delete, shown in red.
2972
+ * - `checkbox-selection` / `radio-selection` — a row with a built-in checkbox
2973
+ * (pick several) or radio button (pick one).
2974
+ * - `day-cell` / `pagination` — small 32×32 square cells for calendar days and
2975
+ * page numbers; the current one is filled dark with white text.
2976
+ * - `time-picker` — a compact time option such as "12:00 AM".
2977
+ * - `filter-group` — a bordered filter heading. Once options are ticked it reveals
2978
+ * a single "{n} selected" chip whose × clears them all.
2979
+ * - `sidebar-main` / `sidebar-main-icon` / `sidebar-sub` / `side-tab` — items for
2980
+ * the app's left sidebar and side tabs; the current section is highlighted and
2981
+ * set in semibold (icon-only is the collapsed-sidebar version).
2982
+ */
2983
+ type DesktopMenuOptionType = 'combobox' | 'dropdown-basic' | 'dropdown-advanced' | 'dropdown-destructive' | 'checkbox-selection' | 'radio-selection' | 'day-cell' | 'time-picker' | 'filter-group' | 'sidebar-main' | 'sidebar-main-icon' | 'sidebar-sub' | 'side-tab' | 'pagination';
2984
+ interface DesktopMenuOptionsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'onSelect' | 'content'> {
2985
+ /** Which of the 15 Figma Type variants to render. Default `combobox`. */
2986
+ type?: DesktopMenuOptionType;
2987
+ /** Primary text — label / day number / time / page number / nav or tab name / filter name. */
2988
+ label?: string;
2989
+ /** Caller-controlled active (current page / selected date / current nav). */
2990
+ active?: boolean;
2991
+ /** Caller-controlled selected (checkbox/radio selection rows; filter-group reveals tags). */
2992
+ selected?: boolean;
2993
+ disabled?: boolean;
2994
+ /** Force a visual state for catalogs/stories — overrides interaction + active/selected/disabled. */
2995
+ state?: DesktopMenuOptionState;
2996
+ /**
2997
+ * Leading icon — a help marker on rows, the module icon on
2998
+ * sidebar-main / icon-only, and a 20px glyph on `dropdown-advanced`
2999
+ * (where it renders whenever supplied, without `showLeadingIcon`).
3000
+ */
3001
+ leadingIcon?: IconName;
3002
+ /** Show the leading icon. */
3003
+ showLeadingIcon?: boolean;
3004
+ /** dropdown-basic: trailing keyboard shortcut keys. */
3005
+ shortcut?: string[];
3006
+ /** Trailing badge (dropdown-basic / sidebar / side-tab). */
3007
+ badge?: React.ReactNode;
3008
+ /**
3009
+ * Show the trailing chevron (dropdown-basic / dropdown-advanced → right;
3010
+ * sidebar-main / side-tab → down). Default per type — `dropdown-advanced`
3011
+ * defaults to `true`, so pass `false` for a row whose trailing content Figma
3012
+ * switches off.
3013
+ */
3014
+ showChevron?: boolean;
3015
+ /** dropdown-advanced: subtext beneath the title. */
3016
+ subtext?: string;
3017
+ /** dropdown-advanced: full content override (else a flat title + subtext + chevron is built from label/subtext). */
3018
+ content?: React.ReactNode;
3019
+ /**
3020
+ * filter-group: how many options are currently selected in the List section.
3021
+ * Drives the single "{n} selected" chip shown beneath the label; the chip is
3022
+ * hidden when this is 0 (the row falls back to its plain Active/Idle look).
3023
+ */
3024
+ selectedCount?: number;
3025
+ /** filter-group: fired when the "{n} selected" chip (its × icon) is clicked — clears the whole group. */
3026
+ onDeselectAll?: () => void;
3027
+ /** Fired on activation (click / Enter / Space). For selection rows, fired with the next checked value. */
3028
+ onSelect?: (next: boolean) => void;
3029
+ }
3030
+ type DesktopMenuOptionState = 'idle' | 'hover' | 'pressed' | 'active' | 'disabled' | 'idle-selected' | 'hover-selected' | 'pressed-selected' | 'active-selected';
3031
+ /**
3032
+ * Desktop Menu Options — a single row inside a desktop menu, dropdown, sidebar,
3033
+ * calendar, or pager. It's the basic building block of the things people pick
3034
+ * from: each row shows a label plus, depending on its `type`, an optional leading
3035
+ * icon, a trailing checkmark / chevron / keyboard shortcut / badge, or an embedded
3036
+ * checkbox or radio button.
3037
+ *
3038
+ * You rarely use a row on its own — you stack several inside a **Desktop Dropdowns**
3039
+ * panel (or a sidebar / calendar) to build the full menu. Hover and pressed states
3040
+ * are handled automatically; `active` (current/selected), `selected`
3041
+ * (checkbox/radio rows), and `disabled` are caller-controlled. The `state` prop
3042
+ * forces one visual state, which is only useful for catalog/showcase stories.
3043
+ *
3044
+ * **When to use:** for the individual items of any menu, dropdown, select, filter
3045
+ * list, calendar, pager, sidebar, or side-tab.
3046
+ * **When not to use:** as a standalone button (use Button) or as a top-level page
3047
+ * tab (use Page Tabs Control).
3048
+ */
3049
+ declare const DesktopMenuOptions: React.ForwardRefExoticComponent<DesktopMenuOptionsProps & React.RefAttributes<HTMLDivElement>>;
3050
+
3051
+ type MobileMenuOptionType = 'combobox' | 'mobile-day-cell' | 'checkbox-selection' | 'radio-selection';
3052
+ /**
3053
+ * Forced visual state, for catalogs that need to show every Figma variant at
3054
+ * once. Mirrors `DesktopMenuOptionState`. Touch-first, so there is no `hover`.
3055
+ */
3056
+ type MobileMenuOptionState = 'idle' | 'pressed' | 'active' | 'disabled';
3057
+ interface MobileMenuOptionsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'onSelect'> {
3058
+ /** Which of the 4 Figma Types (`8338:35033`). Default `combobox`. */
3059
+ type?: MobileMenuOptionType;
3060
+ /** Row label / day number. */
3061
+ label?: string;
3062
+ /** Optional leading icon (combobox). */
3063
+ leadingIcon?: IconName;
3064
+ showLeadingIcon?: boolean;
3065
+ /** Caller-controlled active (selected value / current date). */
3066
+ active?: boolean;
3067
+ /** Caller-controlled selected (checkbox/radio rows). */
3068
+ selected?: boolean;
3069
+ disabled?: boolean;
3070
+ /**
3071
+ * Force a visual state instead of deriving it from interaction. For Storybook
3072
+ * catalogs — leave unset in product code so press stays a real touch state.
3073
+ */
3074
+ state?: MobileMenuOptionState;
3075
+ onSelect?: (next: boolean) => void;
3076
+ }
3077
+ /**
3078
+ * Mobile Menu Options — the touch version of a single menu / list row for phones.
3079
+ * It's like Desktop Menu Options but simpler: bigger tap target and no hover state
3080
+ * (just Idle, Pressed, Active, and Disabled). You stack several inside a
3081
+ * **Mobile Dropdown** to build the full menu.
3082
+ *
3083
+ * Types: `combobox` (a selectable option; the chosen one shows a trailing checkmark),
3084
+ * `mobile-day-cell` (a calendar day), and `checkbox-selection` / `radio-selection`
3085
+ * (rows with a built-in checkbox or radio button).
3086
+ *
3087
+ * **When to use:** for the items of a mobile menu, select, filter list, or calendar.
3088
+ * **When not to use:** on desktop (use Desktop Menu Options) or as a standalone button.
3089
+ */
3090
+ declare const MobileMenuOptions: React.ForwardRefExoticComponent<MobileMenuOptionsProps & React.RefAttributes<HTMLDivElement>>;
3091
+
3092
+ interface MobileDropdownOption {
3093
+ label: string;
3094
+ type?: MobileMenuOptionType;
3095
+ leadingIcon?: IconName;
3096
+ showLeadingIcon?: boolean;
3097
+ active?: boolean;
3098
+ selected?: boolean;
3099
+ disabled?: boolean;
3100
+ onSelect?: (next: boolean) => void;
3101
+ }
3102
+ interface MobileDropdownProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
3103
+ /** Rows to render as `MobileMenuOptions`. */
3104
+ options?: MobileDropdownOption[];
3105
+ /** Override the rows entirely. */
3106
+ children?: React.ReactNode;
3107
+ /** Max panel height before the list scrolls. Default 248 (Figma). */
3108
+ maxHeight?: number;
3109
+ }
3110
+ /**
3111
+ * Mobile Dropdown — the phone version of the floating menu panel: a white, rounded,
3112
+ * bordered card with a soft shadow that stacks **Mobile Menu Options** rows and
3113
+ * scrolls when the list is long. It's the mobile counterpart of Desktop Dropdowns,
3114
+ * used by mobile selects and the mobile map search. Pass the rows via `options`
3115
+ * (or override them with `children`).
3116
+ *
3117
+ * **When to use:** for any mobile overlay that lets the user pick from a list.
3118
+ * **When not to use:** for full-screen sheets or dialogs.
3119
+ */
3120
+ declare const MobileDropdown: React.ForwardRefExoticComponent<MobileDropdownProps & React.RefAttributes<HTMLDivElement>>;
3121
+
3122
+ /**
3123
+ * Which ready-made dropdown panel to render:
3124
+ *
3125
+ * - `combobox` — a scrollable single-select list (no pagination footer; Figma `8230:26475` — 350×248).
3126
+ * - `combobox-empty` — the plain combobox with no options at all: the whole card body is a
3127
+ * centered text-only Empty State ("No Matching Results" / "Try adjusting your search."),
3128
+ * no search box and no pagination footer (Figma `8230:26475` — 350×248, same card height
3129
+ * as `combobox`).
3130
+ * - `combobox-search` — the same list with a search box on top (no pagination footer; 350×304).
3131
+ * - `combobox-search-empty` — the search state shown when nothing matches. Its results
3132
+ * region is the **same height as `combobox-search`** (Figma `8230:26475` — both variants
3133
+ * are 304px tall) so the panel does not resize between states; the "No Matching Results" /
3134
+ * "Try adjusting your search." message is centered in that region.
3135
+ * - `combobox-create` — a list plus an 'Add "…"' action to create a new entry.
3136
+ * - `combobox-create-empty` — the create state when nothing matches, with a hint.
3137
+ * - `actions` — a context / "⋯" menu of commands, ending in a red destructive action.
3138
+ * - `user-menu` — the account menu: avatar, name and email, then grouped links ending in Logout.
3139
+ * - `sort` — pick a field to sort by (radio) and a direction (ascending / descending).
3140
+ * - `basic-filter` — one checklist of filters; footer shows the result count + Close / Show Results.
3141
+ * - `filter-group` — a two-pane filter: groups on the left, their searchable options on the
3142
+ * right. The active group shows how many options are ticked; the footer shows the live
3143
+ * result count with Reset / Show Results.
3144
+ * - `filter-group-empty` — the same when the search finds no options.
3145
+ * - `timepicker` — a scrollable list of times.
3146
+ * - `stacked-list` — a list of richer two-line rows (title + description) for results / entities.
3147
+ */
3148
+ type DesktopDropdownVariant = 'combobox' | 'combobox-empty' | 'combobox-search' | 'combobox-search-empty' | 'combobox-create' | 'combobox-create-empty' | 'actions' | 'user-menu' | 'sort' | 'basic-filter' | 'basic-filter-search' | 'basic-filter-search-empty' | 'filter-group' | 'filter-group-empty' | 'timepicker' | 'stacked-list';
3149
+ /** One rail dimension of a `filter-group` panel — its label plus the full option list shown when it's active. */
3150
+ interface FilterGroupDimension {
3151
+ /** Rail label, e.g. "Recipient", "Depot", "Driver", "Created By". */
3152
+ label: string;
3153
+ /** Full option list for this dimension (checkbox rows on the right when it's the active rail selection). */
3154
+ options: string[];
3155
+ }
3156
+ interface DesktopDropdownsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
3157
+ /** Which assembled dropdown panel to render (Figma `8230:26475`). Default `combobox`. */
3158
+ variant?: DesktopDropdownVariant;
3159
+ /** Row labels for the main list (combobox / timepicker / basic-filter / filter list / actions). */
3160
+ options?: string[];
3161
+ /** Initially-selected option index (combobox / timepicker). */
3162
+ activeIndex?: number;
3163
+ /**
3164
+ * Dimension definitions for `filter-group`/`filter-group-empty` — rail label +
3165
+ * its full option list. Falls back to a 3-dimension demo set when omitted.
3166
+ */
3167
+ groups?: FilterGroupDimension[];
3168
+ /**
3169
+ * Pre-checked option values per group, index-aligned with `groups` — restores
3170
+ * a previously-applied filter when the panel is reopened (the panel itself
3171
+ * remounts fresh each time it opens, so this is the host's hook to persist
3172
+ * selections across opens).
3173
+ */
3174
+ initialGroupSelections?: string[][];
3175
+ /**
3176
+ * Fires with the full current per-group selection (index-aligned with
3177
+ * `groups`) whenever any checkbox toggles. These are a live/draft preview —
3178
+ * per Doc 3 §9, nothing is applied to the host's data until `onApply` fires;
3179
+ * use this to recompute and pass back a live `resultsText` preview count.
3180
+ */
3181
+ onGroupSelectionChange?: (selected: string[][]) => void;
3182
+ /** "Show Results" clicked (`filter-group`) — the host should commit the last selection reported via `onGroupSelectionChange` and typically close the panel. */
3183
+ onApply?: () => void;
3184
+ /** "Reset" clicked (`filter-group`) — clears every dimension's selection (both here and on the host's applied filter). */
3185
+ onReset?: () => void;
3186
+ /** Disable "Show Results" (`filter-group`) — e.g. the host's live preview count is 0. */
3187
+ showResultsDisabled?: boolean;
3188
+ /**
3189
+ * Footer summary for the filter panels (basic-filter / filter-group). This is
3190
+ * the host table's current matching-row count — a placeholder the consuming
3191
+ * screen recomputes as filters narrow (Figma shows "30 results"). The leading
3192
+ * number is emphasized automatically.
3193
+ */
3194
+ resultsText?: string;
3195
+ /** Combobox-Create "Add" footer label. */
3196
+ createLabel?: string;
3197
+ /**
3198
+ * Override the empty-state message for the `combobox-empty` / `combobox-search-empty`
3199
+ * variants (e.g. "No depots found"). Defaults to the `no-results` preset copy
3200
+ * ("Try adjusting your search.").
3201
+ */
3202
+ emptyDescription?: string;
3203
+ /** User Menu display name. */
3204
+ userName?: string;
3205
+ /** User Menu email shown under the name. */
3206
+ userEmail?: string;
3207
+ /** User Menu avatar monogram tone (used when there is no uploaded photo). Default `teal`. */
3208
+ userTone?: AvatarTone;
3209
+ /** User Menu avatar photo URL. When set, shown in place of the monogram. */
3210
+ userAvatarSrc?: string;
3211
+ /**
3212
+ * Sort fields + per-field direction labels (Figma `1050:209224`). The selected
3213
+ * field's `ascLabel`/`descLabel` drive the two direction rows — e.g. a date field
3214
+ * reads "Oldest to Newest / Newest to Oldest" while a numeric field reads
3215
+ * "Low to High / High to Low". Defaults to Created / Duration / Last Updated.
3216
+ */
3217
+ sortOptions?: Array<{
3218
+ label: string;
3219
+ ascLabel?: string;
3220
+ descLabel?: string;
3221
+ }>;
3222
+ /**
3223
+ * Initially-selected sort field index (`sort` variant). Default 0.
3224
+ *
3225
+ * The panel owns its selection after mount, so this **seeds** it rather than
3226
+ * controlling it. It matters because callers typically mount the panel only while
3227
+ * it is open: without a seed, reopening shows the first field selected while the
3228
+ * data is still sorted by whatever was picked last.
3229
+ */
3230
+ sortIndex?: number;
3231
+ /** Initially-selected sort direction (`sort` variant). Default `desc`. Seeds, like {@link sortIndex}. */
3232
+ sortDirection?: 'asc' | 'desc';
3233
+ /** Fired when the sort field or direction changes (`sort` variant). */
3234
+ onSortChange?: (sel: {
3235
+ index: number;
3236
+ label: string;
3237
+ direction: 'asc' | 'desc';
3238
+ }) => void;
3239
+ /** Fired with the new selected-count whenever the filter selection changes (host updates `resultsText`). */
3240
+ onSelectionChange?: (count: number) => void;
3241
+ /** Override the panel body entirely. */
3242
+ children?: React.ReactNode;
3243
+ }
3244
+ /**
3245
+ * Desktop Dropdowns — a ready-made floating panel that appears when you open a
3246
+ * menu, select, filter, or picker. It's the white rounded card with a soft shadow
3247
+ * that holds a list of **Desktop Menu Options** rows plus whatever extra pieces the
3248
+ * chosen `variant` needs: a search box, a pagination footer, an empty-state message,
3249
+ * an account header, or footer buttons. Position it directly under the control that
3250
+ * opens it.
3251
+ *
3252
+ * The selection-bearing variants manage their own state so the panel behaves like
3253
+ * the real thing: ticking rows updates the Filter Group "{n} selected" chip,
3254
+ * clicking a combobox / time / sort row moves the active checkmark, and long lists
3255
+ * scroll. Pass `options` for the row labels and `onSelectionChange` to mirror the
3256
+ * footer result count from your data.
3257
+ *
3258
+ * **Height & scroll model (Figma `8230:26475`).** The scrollable results region
3259
+ * **hugs its content** by default, growing row-by-row until it reaches the variant's
3260
+ * own **max height** — then the height locks and the list **scrolls** (the rest sits
3261
+ * below the fold). Per-variant scroll-region maxes: Combobox / Combobox-Create /
3262
+ * Combobox-Search = **240**; Basic Filter = **256**; Basic Filter-Search = **200**
3263
+ * (the search row eats 56 of the 256). This same hug→max→scroll rule governs the
3264
+ * bulk-toolbar "N selected" combobox. **Exception — the search-empty variants**
3265
+ * (`combobox-search-empty`, `basic-filter-search-empty`) do **not** hug: they render
3266
+ * at the **full max height** with the "No Matching Results / Try adjusting your
3267
+ * search." message centered, so the panel does not shrink when a query returns
3268
+ * nothing. **Create-empty** (`combobox-create-empty`) is NOT a search-empty state —
3269
+ * it **hugs** its short content (hint banner + "Add …").
3270
+ *
3271
+ * **When to use:** for any overlay that lets the user pick or filter something.
3272
+ * **When not to use:** for full pages or confirmation dialogs (use a Modal), or for
3273
+ * content shown inline on the page.
3274
+ */
3275
+ declare const DesktopDropdowns: React.ForwardRefExoticComponent<DesktopDropdownsProps & React.RefAttributes<HTMLDivElement>>;
3276
+
3277
+ type DurationLabelVariant = 'finished' | 'active';
3278
+ type DurationLabelStatus = 'on-target' | 'delayed' | 'at-risk';
3279
+ interface DurationLabelProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {
3280
+ /**
3281
+ * `finished` — a completed/measured duration: greyed time, no icon. `active` — a
3282
+ * live, running timer, the time itself coloured by status. Default `finished`.
3283
+ */
3284
+ variant?: DurationLabelVariant;
3285
+ /**
3286
+ * The timing status. Drives the **Active** time colour only (on-target = default,
3287
+ * at-risk = warning/orange, delayed = error/red). Default `on-target`.
3288
+ *
3289
+ * Ignored by `finished`, which is greyed time regardless — Figma collapsed that
3290
+ * variant's status axis to a single `All` when its icon was removed.
3291
+ */
3292
+ status?: DurationLabelStatus;
3293
+ /** The duration text. Caller-supplied (e.g. "1h 24m 12s"). Default "0h 0m 0s". */
3294
+ time?: string;
3295
+ /**
3296
+ * Makes the `active` variant **actually run**: an absolute epoch-ms timestamp
3297
+ * for the moment the clock started. The label renders `now − runningFrom`,
3298
+ * re-formatting itself once a second, and ignores `time`.
3299
+ *
3300
+ * An absolute instant rather than an elapsed count on purpose — it survives
3301
+ * remounting (a table that reseeds its rows doesn't restart the timer), and any
3302
+ * two surfaces given the same instant show the same number, which an
3303
+ * each-anchors-at-its-own-mount design cannot guarantee.
3304
+ *
3305
+ * Ignored by the `finished` variant: a completed duration is measured, not
3306
+ * running, so it must never tick.
3307
+ */
3308
+ runningFrom?: number;
3309
+ }
3310
+ /**
3311
+ * Duration Labels — a compact inline label that communicates a duration and its
3312
+ * status, used inside table Duration cells and timing summaries (Figma
3313
+ * `4445:107943`).
3314
+ *
3315
+ * - **Finished** is greyed-out time, **no icon** (Figma `4445:107943`, re-enumerated
3316
+ * 2026-08-18: the Finished variant's `Status` axis collapsed to a single `All` and
3317
+ * its leading icon was removed). The Within/Beyond-target outcome it used to carry
3318
+ * now reads from the **Status cell's** trailing SLA icon instead, beside the
3319
+ * Delivered / Cancelled badge — the same place every in-progress state shows it.
3320
+ * - **Active** shows a live, running time coloured by status: default = on
3321
+ * target, orange = at risk, red = delayed.
3322
+ *
3323
+ * Presentational and non-interactive; the accessible name is the `time` text.
3324
+ */
3325
+ declare const DurationLabel: React.ForwardRefExoticComponent<DurationLabelProps & React.RefAttributes<HTMLSpanElement>>;
3326
+
3327
+ /**
3328
+ * The kind of content a Cell renders. Header types are 40px tall and label the
3329
+ * columns; the remaining body types are 72px tall and hold a row's data.
3330
+ */
3331
+ type CellType = 'header' | 'header-checkbox' | 'sample' | 'date' | 'text-link' | 'status' | 'default-checkbox' | 'actions' | 'preview-chips' | 'duration' | 'select-field' | 'item-stepper' | 'time-stepper' | 'list-item' | 'address-cell' | 'manual-order' | 'automatic-order' | 'driver-cell' | 'user-cell' | 'api-cell';
3332
+ /**
3333
+ * A cell's visual state. Mirrors the Figma `State` axis on Cell `4444:45000`,
3334
+ * whose five values are mutually exclusive.
3335
+ *
3336
+ * `selected-pressed` exists because Selected and Selected-Pressed share a
3337
+ * SURFACE — the press is carried entirely by the bottom border darkening one
3338
+ * step. Letting the neutral `pressed` fill win on a selected row would read as
3339
+ * the row being deselected for as long as the button is held, which is why the
3340
+ * design system gives the combination its own state rather than a precedence
3341
+ * rule between two.
3342
+ */
3343
+ type CellState = 'idle' | 'hover' | 'pressed' | 'selected' | 'selected-pressed';
3344
+ interface CellProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'content'> {
3345
+ /** Which of the 19 Figma Types to render. Default `sample`. */
3346
+ type?: CellType;
3347
+ /** Caller-controlled selected row (body types only; ignored by Header types). */
3348
+ selected?: boolean;
3349
+ /** Force a visual state for catalogs/stories — overrides interaction + `selected`. */
3350
+ state?: CellState;
3351
+ /**
3352
+ * Draw the state-coloured bottom border (the row divider). Default true, per
3353
+ * Figma, where every variant carries it. `Table` turns it off on its last row,
3354
+ * whose divider would otherwise double up with the Pagination footer's own top
3355
+ * border sitting immediately beneath it.
3356
+ */
3357
+ showDivider?: boolean;
3358
+ /** `header`: the column title. Default "Label". */
3359
+ columnName?: string;
3360
+ /** `header`: render the leading info icon. Default false. */
3361
+ showLeadingIcon?: boolean;
3362
+ /** `header`: the leading icon (outlined). Default `Info`. */
3363
+ leadingIcon?: IconName;
3364
+ /** `header`: render the trailing info icon. Default false. */
3365
+ showTrailingIcon?: boolean;
3366
+ /** `header`: the trailing icon (outlined). Default `Info`. */
3367
+ trailingIcon?: IconName;
3368
+ /**
3369
+ * `header-checkbox` / `default-checkbox`: checked state. Leave undefined for
3370
+ * uncontrolled behaviour — the Checkbox self-toggles checked ↔ unchecked on
3371
+ * click (and fires `onCheckedChange`). Pass a boolean to control it.
3372
+ */
3373
+ checked?: boolean;
3374
+ /** `header-checkbox`: indeterminate (some-rows-selected) state — for the "some but not all rows selected" header checkbox. */
3375
+ indeterminate?: boolean;
3376
+ /** `header-checkbox` / `default-checkbox`: fired with the next checked value. */
3377
+ onCheckedChange?: (checked: boolean) => void;
3378
+ /** `sample`: the plain text value. Right-align numerics for scanning. Default "Content". */
3379
+ text?: string;
3380
+ /** `sample`: right-align the value (numeric quantities/amounts). Default false. */
3381
+ alignRight?: boolean;
3382
+ /**
3383
+ * Horizontal alignment of the cell's whole content, any `type`. `'right'` for
3384
+ * numeric columns (Distance, Duration) per the annotations' "right-align
3385
+ * numerics" rule. Normally set once on the `TableColumn` so the header label and
3386
+ * its values align together, rather than per cell.
3387
+ */
3388
+ align?: 'left' | 'right';
3389
+ /** `date`: the two-line date/time value. Default "Jan 23, 2023\n9:00 AM". */
3390
+ date?: string;
3391
+ /** `text-link`: the link text. Default "contact@gmail.com". */
3392
+ link?: string;
3393
+ /** `text-link`: fired when the link is clicked. */
3394
+ onLinkClick?: () => void;
3395
+ /** `list-item`: the title (truncates with ellipsis). Default "Text". */
3396
+ title?: string;
3397
+ /** `list-item`: the description (truncates with ellipsis). Default "Enter description here". */
3398
+ subtext?: string;
3399
+ /** `address-cell`: the pickup address (truncates with ellipsis). */
3400
+ pickup?: string;
3401
+ /** `address-cell`: the dropoff address (truncates with ellipsis). */
3402
+ dropoff?: string;
3403
+ /** `manual-order` / `automatic-order`: the order ID (truncates, max 250 chars). */
3404
+ orderId?: string;
3405
+ /** `preview-chips`: chip labels. Default three "Type" chips. */
3406
+ chips?: string[];
3407
+ /** `duration`: the embedded Duration Label variant. Default `finished`. */
3408
+ durationVariant?: DurationLabelVariant;
3409
+ /** `duration`: the Duration Label status. Default `on-target`. */
3410
+ durationStatus?: DurationLabelStatus;
3411
+ /** `duration`: the duration text. Default "0h 0m 0s". */
3412
+ durationTime?: string;
3413
+ /**
3414
+ * `duration` type: absolute epoch-ms start for a **running** timer — the cell
3415
+ * counts up from it once a second instead of showing the static
3416
+ * `durationTime`. See {@link DurationLabelProps.runningFrom}; ignored when the
3417
+ * variant is `finished`.
3418
+ */
3419
+ durationRunningFrom?: number;
3420
+ /** `select-field`: fired when the inline select is clicked. */
3421
+ onSelectClick?: () => void;
3422
+ /** `item-stepper`: the stepper value. */
3423
+ stepperValue?: number;
3424
+ /** `item-stepper`: fired with the next stepper value. */
3425
+ onStepperChange?: (value: number) => void;
3426
+ /** `driver-cell` / `user-cell`: the person's name (also the source for the Avatar's initials). Default "Michael Kariuki". */
3427
+ name?: string;
3428
+ /** `driver-cell` / `user-cell`: the avatar photo URL (falls back to empty-teal initials). */
3429
+ avatarSrc?: string;
3430
+ /**
3431
+ * `driver-cell`: show the trailing Swap + Call action buttons under the name.
3432
+ * Default true. Set false for **finished** orders (delivered/cancelled) — a
3433
+ * terminal order's driver can't be swapped or called, so the cell shows just
3434
+ * the name, vertically centered against the avatar.
3435
+ */
3436
+ showDriverActions?: boolean;
3437
+ /**
3438
+ * `driver-cell`: show the **Swap** (change-driver) button specifically.
3439
+ * Default true. Set false once the driver has left the depot with the package
3440
+ * (In Transit / Arrived / Returning): there is no handover point any more, so
3441
+ * a swap would need the order physically recovered first — the recourse there
3442
+ * is Return, not Change Driver. Call stays available regardless.
3443
+ *
3444
+ * Independent of {@link showDriverActions}, which hides the whole action row
3445
+ * for terminal orders.
3446
+ */
3447
+ showSwapDriver?: boolean;
3448
+ /** `driver-cell`: fired when the Swap (change-driver) button is clicked. */
3449
+ onSwapDriver?: () => void;
3450
+ /** `driver-cell`: fired when the Call button is clicked. */
3451
+ onCallDriver?: () => void;
3452
+ /** `driver-cell`: hover tooltip on the Swap (change-driver) button. Default "Change Driver". */
3453
+ swapTooltip?: string;
3454
+ /** `driver-cell`: hover tooltip on the Call button. Default "Call". */
3455
+ callTooltip?: string;
3456
+ /** `user-cell`: the user's email, shown under the name in muted sub-body text. */
3457
+ email?: string;
3458
+ /** `api-cell`: the title (e.g. how the row was created). Default "Auto-created". */
3459
+ apiTitle?: string;
3460
+ /** `api-cell`: the sub-body describing the source. Default "From online store". */
3461
+ apiSubtext?: string;
3462
+ /** `api-cell`: the Featured Icon glyph. Default "Integration". */
3463
+ apiIcon?: IconName;
3464
+ /**
3465
+ * SLA signal rendered **after** the status badge (Table Column spec §2.3). Four
3466
+ * values, one per SLA outcome — the icon and its colour are fixed per value so a
3467
+ * host can't pair a green tick with a delay:
3468
+ *
3469
+ * | Value | Glyph | Colour | Meaning |
3470
+ * |---|---|---|---|
3471
+ * | `warning` | `Warning` | warning | in progress, At Risk (§2.3.1) |
3472
+ * | `error` | `Error` | error | in progress, Delayed (§2.3.1) |
3473
+ * | `success` | `Check-Circle` | success | completed **within** the fulfilment target |
3474
+ * | `failure` | `Cancel-Circle` | error | completed **beyond** the fulfilment target |
3475
+ *
3476
+ * `success` / `failure` were added 2026-08-18: the completed outcome used to live
3477
+ * on the Duration cell's own leading icon, which Figma removed from
3478
+ * `DurationLabel`. It now reads here, beside the Delivered / Cancelled badge —
3479
+ * the same place every in-progress state already showed it.
3480
+ */
3481
+ statusIcon?: 'warning' | 'error' | 'success' | 'failure';
3482
+ /**
3483
+ * Hover tooltip on the SLA icon. Accepts a node, because the designed SLA tips head
3484
+ * the copy with a status `Badge` rather than a text title
3485
+ * (`2032:131435` … `2038:133959`) — the `standard` surface stacks its children at
3486
+ * gap 16 for exactly that.
3487
+ *
3488
+ * Pass a **function** when the copy quotes something that moves; it is resolved at
3489
+ * hover time (see `HoverTip`).
3490
+ */
3491
+ statusIconTooltip?: React.ReactNode | (() => React.ReactNode);
3492
+ /** Accessible name for a node tooltip — what the badge says, in words. */
3493
+ statusIconTooltipLabel?: string;
3494
+ /** Tooltip body width, px. The designed SLA tips are 256. */
3495
+ statusIconTooltipWidth?: number;
3496
+ /** `header`: hover tooltip on the trailing icon (e.g. the Duration header's ⓘ). */
3497
+ trailingIconTooltip?: string;
3498
+ /** `status` SLOT — the status/delivery badge(s). Default a Scheduled badge. */
3499
+ statusContent?: React.ReactNode;
3500
+ /** `actions` SLOT — row-level action buttons. Default a Ghost "More" icon button. */
3501
+ actions?: React.ReactNode;
3502
+ /** `time-stepper` SLOT — the multi-row time editor. Default a Grouped Input + Add Row. */
3503
+ timeStepperContent?: React.ReactNode;
3504
+ /** `manual-order` SLOT — order ID + interactive elements. Default built from `orderId`. */
3505
+ manualOrderContent?: React.ReactNode;
3506
+ /** `automatic-order` SLOT — order ID + interactive elements. Default built from `orderId`. */
3507
+ automaticOrderContent?: React.ReactNode;
3508
+ /** `manual-order` / `automatic-order`: fired when the Copy icon button is clicked. */
3509
+ onCopyOrderId?: () => void;
3510
+ /** `manual-order` / `automatic-order`: hover tooltip on the Copy button. Default "Copy ID". */
3511
+ copyTooltip?: string;
3512
+ /** `manual-order` / `automatic-order`: hover tooltip on the provenance icon
3513
+ * (Manual-Touch / Integration). Defaults "Created manually" / "Created via integration". */
3514
+ sourceTooltip?: string;
3515
+ /** `manual-order` / `automatic-order`: show the Calendar scheduled-origin icon.
3516
+ * Default true (the Figma default renders it). */
3517
+ showScheduledIcon?: boolean;
3518
+ /** `manual-order` / `automatic-order`: hover tooltip on the Calendar icon —
3519
+ * the order's scheduled delivery date/time (e.g. "Scheduled: 09 Jun 2027, 12:30 PM").
3520
+ * No tooltip when omitted. */
3521
+ scheduledTooltip?: string;
3522
+ /** `manual-order` / `automatic-order`: show the Broadcast auto-broadcast icon.
3523
+ * Default false (data-driven — only auto-broadcasted orders carry it). */
3524
+ showBroadcastIcon?: boolean;
3525
+ /** `manual-order` / `automatic-order`: hover tooltip on the Broadcast icon. Default "Auto-broadcast". */
3526
+ broadcastTooltip?: string;
3527
+ }
3528
+ declare const Cell: React.ForwardRefExoticComponent<CellProps & React.RefAttributes<HTMLDivElement>>;
3529
+
3530
+ /**
3531
+ * Row density. `basic` is a 52px row of simple cells; `complex` is an 80px row
3532
+ * that accommodates rich cells (manual-order, driver, address) — per the Figma
3533
+ * annotation "Basic rows max-height 52px, Complex rows max-height 80px".
3534
+ */
3535
+ type DataRowsVariant = 'basic' | 'complex';
3536
+ /**
3537
+ * A row's interaction state. Mirrors the Figma `State` axis on Data Rows
3538
+ * `4445:105200`, minus its legacy `Active State` value — which drives the exact
3539
+ * same `Selected` Cell state as `Selected State` does, and is a leftover of the
3540
+ * name this used to carry in code too. `selected` has only ever meant
3541
+ * checkbox-selected; the old `active` name invited reaching for it wanting a
3542
+ * neutral emphasis and silently painting the row as bulk-selected.
3543
+ */
3544
+ type DataRowsState = 'idle' | 'hover' | 'pressed' | 'selected' | 'selected-pressed';
3545
+ /** One column's cell. Any `Cell` prop, plus an optional fixed column width. */
3546
+ interface DataRowCell extends CellProps {
3547
+ /**
3548
+ * Fixed column width (px or any CSS width). Omit → the column flexes to fill
3549
+ * an equal share of the remaining row width (Figma "Fill Container" cells).
3550
+ */
3551
+ width?: number | string;
3552
+ /**
3553
+ * Proportional flex weight (flex-grow). When set (and no `width`), the cell
3554
+ * takes a share of the remaining width proportional to its weight. Ignored if
3555
+ * `width` is set.
3556
+ */
3557
+ flex?: number;
3558
+ /**
3559
+ * Minimum width (floor) for a flexible cell so its content truncates instead of
3560
+ * collapsing (per the Table Column Layout spec's truncation rules). Ignored if
3561
+ * `width` is set. Defaults to 0.
3562
+ */
3563
+ minWidth?: number | string;
3564
+ /**
3565
+ * Maximum width for a bounded-flexible cell (spec §3.3) — caps its growth so
3566
+ * surplus width goes to the primary flexible cells. Ignored if `width` is set.
3567
+ */
3568
+ maxWidth?: number | string;
3569
+ /**
3570
+ * Pin (sticky) this cell to an edge during horizontal scroll (spec §4.3). Set by
3571
+ * `Table` on the anchor columns (Order ID left, Actions right; checkbox pins
3572
+ * left with Order ID) only when the table is in `scrollX` mode. `pinInset` is the
3573
+ * px offset from that edge (the summed width of preceding same-side pinned cells).
3574
+ */
3575
+ pinned?: 'left' | 'right';
3576
+ /** Px offset from the pinned edge — set alongside `pinned` by `Table`. */
3577
+ pinInset?: number;
3578
+ }
3579
+ interface DataRowsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
3580
+ /** Row density — `basic` (52px) or `complex` (80px). Default `basic`. */
3581
+ variant?: DataRowsVariant;
3582
+ /** Force a visual state (catalog/showcase) — overrides interaction + `selected`. */
3583
+ state?: DataRowsState;
3584
+ /** Caller-controlled selected (checkbox-selected) row. */
3585
+ selected?: boolean;
3586
+ /**
3587
+ * Draw each cell's state-coloured bottom border (the row divider). Default
3588
+ * true. `Table` turns it off on its last row, where it would double up with
3589
+ * the Pagination footer's own top border — and where the last row is
3590
+ * emphasised, that footer border takes the row's colour instead, so the
3591
+ * bracket still closes without a second line.
3592
+ */
3593
+ showDivider?: boolean;
3594
+ /**
3595
+ * Force the focus ring (Figma Data Rows `State=Focus State`) — for catalogs.
3596
+ *
3597
+ * Deliberately NOT a `DataRowsState` value. Figma models Focus as a State
3598
+ * because a variant axis is the only place it can live there, but the ring is
3599
+ * an OVERLAY: a focused row still shows whatever it actually is underneath —
3600
+ * idle, hover, selected. Folding it into the enum would force it to displace
3601
+ * that. (The Figma variant's cells read `Selected`, which is a leftover of the
3602
+ * `Active State` -> `Focus State` rename; ruled 2026-09-02.)
3603
+ *
3604
+ * In a real table the ring comes from `:focus-visible` on the focusable row,
3605
+ * which `Table` owns. Keyboard only, so a right-clicked row — focused
3606
+ * programmatically — does not get it on top of its pressed fill.
3607
+ */
3608
+ focused?: boolean;
3609
+ /**
3610
+ * Data-driven cells. Each entry is a `Cell` (its `type` chooses the renderer)
3611
+ * plus an optional fixed `width`. Defaults to a representative set for the
3612
+ * `variant`. The row drives every cell's state, so per-cell `state` is ignored.
3613
+ */
3614
+ cells?: DataRowCell[];
3615
+ /**
3616
+ * Escape hatch — raw cell nodes laid out in the row instead of `cells`. When
3617
+ * provided, the row does NOT force a shared state onto them (you own that).
3618
+ */
3619
+ children?: React.ReactNode;
3620
+ }
3621
+ /**
3622
+ * Data Rows — one row of a LETA data table: a horizontal run of `Cell`s laid
3623
+ * flush (no gaps) so they read as a single, uniformly-coloured row. The row owns
3624
+ * the interaction state (Idle / Hover / Pressed / Active) and pushes it to every
3625
+ * cell, so hovering anywhere highlights the whole row. Columns either take a fixed
3626
+ * `width` (checkbox, status, date, actions) or flex to fill an equal share.
3627
+ *
3628
+ * **When to use:** as the repeating body row inside `Table` (or any list of
3629
+ * tabular records).
3630
+ * **When not to use:** the column header row (that's a row of `Cell type="header"`,
3631
+ * owned by `Table`); non-tabular content blocks → Content Card.
3632
+ */
3633
+ declare const DataRows: React.ForwardRefExoticComponent<DataRowsProps & React.RefAttributes<HTMLDivElement>>;
3634
+
3635
+ /**
3636
+ * Column category from the Table Column Layout spec. Drives the default sizing
3637
+ * mode so the right choice is the default:
3638
+ * - `primary` — the record's main content (Driver, Route, Recipient, Customer).
3639
+ * **Flexible**: absorbs the remaining width via a `flex` weight (defaults to 1
3640
+ * if no `flex` is given). Never give a `primary` column a fixed `width`.
3641
+ * - `identifier` — uniquely identifies the record but doesn't benefit from extra
3642
+ * width (Order ID, Trip ID, Invoice #). **Fixed `width`**, truncates safely.
3643
+ * - `secondary` — predictable supporting context (Depot, Service Type, Region).
3644
+ * **Fixed `width`**.
3645
+ * - `utility` — small metadata/status (Status, Duration, Created, Priority).
3646
+ * **Fixed `width`**, only as wide as the content needs.
3647
+ * - `control` — interactions, not information (Checkbox, Overflow, Actions). The
3648
+ * smallest columns; **fixed `width`**; an actions column carries no header label.
3649
+ *
3650
+ * The golden rule the role enforces: **never make all columns equal width** —
3651
+ * only `primary` columns flex; everything else is fixed.
3652
+ */
3653
+ type TableColumnRole = 'primary' | 'identifier' | 'secondary' | 'utility' | 'control';
3654
+ /** A column definition — drives one header cell and the matching body column width. */
3655
+ interface TableColumn {
3656
+ /** Header label. Omit (or pass `''`) for an action/utility column that should have no header — the header bar stays full-width but the cell is blank. */
3657
+ label?: string;
3658
+ /**
3659
+ * Column category (Table Column Layout spec). Sets the default sizing mode:
3660
+ * `primary` → flexible (flex weight, defaults to 1); all other roles → fixed
3661
+ * `width`. Optional, but recommended — it documents intent and makes "never all
3662
+ * equal width" the default. Explicit `width`/`flex` always win over the role.
3663
+ */
3664
+ role?: TableColumnRole;
3665
+ /**
3666
+ * Horizontal alignment of this column's header label AND every body value in it.
3667
+ * `'right'` for numeric columns (Distance, Duration) per the Cell annotations'
3668
+ * "right-align numerics" rule — figures read down a right edge, so magnitudes
3669
+ * are comparable at a glance. Defaults to left.
3670
+ *
3671
+ * Deliberately a **column** property: aligning only the cells would leave the
3672
+ * header label sitting over the opposite edge of its own numbers.
3673
+ */
3674
+ align?: 'left' | 'right';
3675
+ /** Fixed column width (px or CSS). Omit → the column flexes to fill an equal share. */
3676
+ width?: number | string;
3677
+ /**
3678
+ * Proportional flex weight (flex-grow). When set (and no `width`), the column
3679
+ * flexes to a share of the remaining width proportional to its weight — e.g.
3680
+ * a `flex: 2` column gets twice the slack of a `flex: 1` column. Lets the whole
3681
+ * table scale to any viewport with balanced, content-appropriate proportions
3682
+ * instead of equal-width flex columns. Ignored if `width` is set.
3683
+ *
3684
+ * The percentage split is the source of truth; weights are that ratio expressed
3685
+ * for `flex-grow`, with **Recipient as the 1.00 base** (spec §3.2): Route `1.48`
3686
+ * (40%), Driver `1.22` (33%), Recipient `1.00` (27%). Weights are relative, so
3687
+ * when a flexible column is added or removed the rest redistribute
3688
+ * proportionally on their own (drop Driver → Route/Recipient settle at 60/40).
3689
+ */
3690
+ flex?: number;
3691
+ /**
3692
+ * Minimum width (px or CSS) — the column's **floor** (spec §3.4): the smallest
3693
+ * width that avoids truncating its protected content. Applies to flexible and
3694
+ * bounded-flexible columns (ignored when a plain fixed `width` is set); on shrink
3695
+ * the column freezes here and the remaining shrink redistributes to columns still
3696
+ * above their floors. Base a name floor on a representative (p90) length, not the
3697
+ * longest possible. Defaults to 0.
3698
+ */
3699
+ minWidth?: number | string;
3700
+ /**
3701
+ * Maximum width (px or CSS) for a **bounded-flexible** column (spec §3.3) — a
3702
+ * Primary Identifier (e.g. Order ID) promoted to flex within a `minWidth`–
3703
+ * `maxWidth` band with a low `flex` weight: it sits at its min on constrained
3704
+ * screens, grows slowly once every primary floor is satisfied, then stops at its
3705
+ * max and cedes further width to the primary flexible columns. Never use this for
3706
+ * unbounded growth. Ignored when a plain fixed `width` is set.
3707
+ */
3708
+ maxWidth?: number | string;
3709
+ /**
3710
+ * Screen-reader-only accessible name for a column whose visible `label` is empty
3711
+ * (spec §8) — the Control/Actions and checkbox columns carry no *visible* header
3712
+ * (icons already read as interactive), but the header cell still needs an
3713
+ * accessible name (e.g. "Actions") so the column is never announced as empty.
3714
+ */
3715
+ accessibleName?: string;
3716
+ /**
3717
+ * Pin (sticky) this column to an edge while the table scrolls horizontally
3718
+ * (spec §4.3) — the **anchor** columns stay visible so every row is identifiable
3719
+ * as the middle scrolls. `'left'` for the leading identifier (Order ID; the
3720
+ * checkbox pins with it), `'right'` for the trailing Actions column. Only takes
3721
+ * effect when `scrollX` is on; a no-op otherwise (flex-fill). Pin offsets are
3722
+ * computed from the widths of preceding same-side pinned columns.
3723
+ */
3724
+ pinned?: 'left' | 'right';
3725
+ /** Render the header's leading info icon. */
3726
+ showLeadingIcon?: boolean;
3727
+ /** The header leading icon (outlined). Default `Info`. */
3728
+ leadingIcon?: IconName;
3729
+ /** Render the header's trailing (sort) icon. */
3730
+ showTrailingIcon?: boolean;
3731
+ /** The header trailing icon (outlined). Default `Info`. */
3732
+ trailingIcon?: IconName;
3733
+ /** Hover tooltip on the trailing icon (e.g. the Duration header's ⓘ). */
3734
+ trailingIconTooltip?: string;
3735
+ }
3736
+ /** A body row — its cells line up with `columns` by index (excluding the checkbox column). */
3737
+ interface TableRow {
3738
+ /** One cell per column. Each cell's `width` defaults to the matching column's width. */
3739
+ cells: DataRowCell[];
3740
+ /** Selected (Active) row — highlights the row and checks its checkbox. */
3741
+ selected?: boolean;
3742
+ /**
3743
+ * Stable row identity (e.g. an order id). Rows are otherwise positional, so
3744
+ * anything that has to name a *particular* row across re-renders and page
3745
+ * changes needs this — currently {@link TableProps.highlightedIds}.
3746
+ */
3747
+ id?: string;
3748
+ }
3749
+ interface TableProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'rows'> {
3750
+ /** Column definitions (drive the header + shared column widths). */
3751
+ columns?: TableColumn[];
3752
+ /** Body rows. */
3753
+ rows?: TableRow[];
3754
+ /** Row density for every body row. Default `basic` (52px); `complex` is 80px. */
3755
+ rowVariant?: DataRowsVariant;
3756
+ /** Prepend a 52px checkbox column (header-checkbox + per-row default-checkbox). Default true. */
3757
+ selectable?: boolean;
3758
+ /**
3759
+ * Selection is managed internally: clicking a row's checkbox toggles it;
3760
+ * clicking the header checkbox selects/clears all rows; the header shows the
3761
+ * indeterminate glyph when only some rows are selected. Seed the initial
3762
+ * selection via each row's `selected` flag. `onSelectionChange` reports the
3763
+ * selected row indices.
3764
+ */
3765
+ onSelectionChange?: (selectedIndices: number[]) => void;
3766
+ /**
3767
+ * Fired when a body row is clicked (OM §3.1 — a dynamic table's row is a
3768
+ * target, typically opening the record's detail view). Clicks that originate
3769
+ * from interactive elements inside the row — the selection checkbox, inline
3770
+ * cell buttons/links/inputs — are ignored so they keep acting independently
3771
+ * (§3.1: "the checkbox column is the only selection target"; inline buttons
3772
+ * stop propagation). Rows get `cursor: pointer` while this is set.
3773
+ */
3774
+ onRowClick?: (rowIndex: number) => void;
3775
+ /**
3776
+ * Fired when a body row is **right-clicked** (or two-finger-tapped on a
3777
+ * trackpad) — the shortcut to that row's actions menu, opened at the pointer.
3778
+ *
3779
+ * Receives the viewport coordinates of the click so the host can anchor its
3780
+ * menu there rather than at the row's ⋯ button. Return **true** to indicate a
3781
+ * menu was opened; the browser's own context menu is then suppressed. Return
3782
+ * **false** (or nothing) to let the native menu through — the right behaviour
3783
+ * for a row with no available actions, where intercepting would leave the user
3784
+ * with an empty popover and no way to copy text or inspect the page.
3785
+ *
3786
+ * Right-click deliberately **ignores the checkbox selection**: it always means
3787
+ * "act on this row", the same as its ⋯ button, so the same gesture never does
3788
+ * two different things depending on state the user can't see at the pointer.
3789
+ */
3790
+ onRowContextMenu?: (rowIndex: number, position: {
3791
+ x: number;
3792
+ y: number;
3793
+ }) => boolean | void;
3794
+ /**
3795
+ * Whether the host's row context menu is currently open. The target row drops
3796
+ * its highlight as soon as this goes false.
3797
+ *
3798
+ * The table cannot detect the dismissal itself: the menu is the host's, in the
3799
+ * host's own portal. A row left highlighted after its menu closed would read as
3800
+ * a selection the user has no way to clear.
3801
+ *
3802
+ * Deliberately a boolean rather than a "closed" counter — a counter changes on
3803
+ * OPEN as well, which cleared the highlight in the same commit that set it.
3804
+ */
3805
+ contextMenuOpen?: boolean;
3806
+ /** Render the Pagination footer. Default true. */
3807
+ showPagination?: boolean;
3808
+ /** Show the Pagination page-number cluster. Default true; `false` → count + rows-per-page only. */
3809
+ showPages?: boolean;
3810
+ /**
3811
+ * Horizontal-scroll mode (spec §4.3). Keep columns at their natural widths and
3812
+ * let the table scroll **horizontally** (and vertically) instead of shrinking
3813
+ * cells below their floors. The header sticks to the top during vertical
3814
+ * scroll and scrolls in sync with the body horizontally; pinned anchor columns
3815
+ * (Order ID left / Actions right) engage.
3816
+ *
3817
+ * - `'auto'` (recommended) — measures: scroll activates **only while the
3818
+ * table's minimum width** (checkbox + fixed columns + flexible floors)
3819
+ * **exceeds the container** — the spec's rule. Both §4.3 triggers fall out
3820
+ * of the same check: narrowing the window, or switching on an optional
3821
+ * column that no longer fits. On a sparse table with surplus space, an
3822
+ * optional column simply joins the flex-fill — no scroll.
3823
+ * - `true` — force scroll mode on unconditionally.
3824
+ * - `false` (default) — never scroll; columns flex to fill the container.
3825
+ */
3826
+ scrollX?: boolean | 'auto';
3827
+ /** Current page (1-based). */
3828
+ page?: number;
3829
+ /** Total pages. */
3830
+ pageCount?: number;
3831
+ /** Fired with the next page. */
3832
+ onPageChange?: (page: number) => void;
3833
+ /** Pagination count summary. Default "Showing 10 of 180". */
3834
+ countLabel?: string;
3835
+ /** Rows-per-page value shown in the selector. Default 10. */
3836
+ rowsPerPage?: number;
3837
+ /** Fired when the rows-per-page selector is activated. */
3838
+ onRowsPerPageClick?: () => void;
3839
+ /**
3840
+ * Constrain the body height — the body scrolls under a sticky header/footer.
3841
+ * Mirrors Figma's fixed Scroll Frame. Omit → the body sizes to its rows.
3842
+ */
3843
+ maxBodyHeight?: number | string;
3844
+ /**
3845
+ * Fill the available height of a flex-column parent (`flex: 1`) instead of
3846
+ * sizing to the rows: the body scrolls internally while the header and the
3847
+ * Pagination footer stay pinned. Use inside a Page / Table Container that owns
3848
+ * a fixed viewport so the pagination is always visible without page scroll.
3849
+ */
3850
+ fillHeight?: boolean;
3851
+ /**
3852
+ * Rows to call attention to, by {@link TableRow.id} — "here are the rows you
3853
+ * just acted on". Each is ringed in the design system's focus treatment for a
3854
+ * couple of seconds and then released, and the first one is scrolled into view.
3855
+ *
3856
+ * **One ring per row, not one around the block.** Affected rows are routinely
3857
+ * non-contiguous — a bulk action lands them scattered down the sorted page — so
3858
+ * a single enclosing ring would claim the untouched rows sitting between them.
3859
+ *
3860
+ * Deliberately separate from {@link TableRow.selected}: selection means "rows I
3861
+ * am about to act on" and owns the checkboxes, while this means "rows that just
3862
+ * changed". Routing attention through `selected` would tick checkboxes the user
3863
+ * never ticked and fight the internal index-keyed selection sync.
3864
+ *
3865
+ * Pass a **new array identity** to replay the highlight (e.g. after a second
3866
+ * bulk action on the same rows); passing the same ids again is a no-op.
3867
+ */
3868
+ highlightedIds?: string[];
3869
+ /** Escape hatch — raw body content (e.g. custom `DataRows`) instead of `rows`. */
3870
+ children?: React.ReactNode;
3871
+ }
3872
+ /**
3873
+ * Table — a full LETA data table: a bordered, rounded card stacking a column
3874
+ * header (`Cell type="header"`), a body of `DataRows`, and a `Pagination` footer.
3875
+ * Columns are defined once (`columns`) and shared by the header and every row so
3876
+ * they always align; set `selectable` for the leading checkbox column. The body
3877
+ * can scroll under a sticky header via `maxBodyHeight`. Hairline dividers separate
3878
+ * the header and every row, matching the design.
3879
+ *
3880
+ * **Width:** the table fills its container (`width: 100%`) — it expands to the
3881
+ * viewport/content frame it sits in; the Figma frame's fixed width is just the
3882
+ * design canvas, not a constraint. **Selection is internal** — the header
3883
+ * checkbox selects/clears all rows and shows the indeterminate glyph for a
3884
+ * partial selection; per-row checkboxes toggle individually.
3885
+ *
3886
+ * **When to use:** displaying a paged set of tabular records.
3887
+ * **When not to use:** a single record's fields → a form / Content Card; the
3888
+ * surrounding toolbar + empty-state shell → Table Container.
3889
+ */
3890
+ declare const Table: React.ForwardRefExoticComponent<TableProps & React.RefAttributes<HTMLDivElement>>;
3891
+
3892
+ /**
3893
+ * Instance A — Order Table (dispatched & finished: Assigned, At Depot, In Transit,
3894
+ * Arrived, Delivered, Returned, Cancelled). The full-column shape — any state where
3895
+ * a driver and a trip exist. Actions is 64 (overflow only). Duration carries the SLA.
3896
+ */
3897
+ declare const ORDER_TABLE_COLUMNS: TableColumn[];
3898
+ /**
3899
+ * Instance A — Order Table, **Delivered/Cancelled (Finished) view**. Same column
3900
+ * *order* as {@link ORDER_TABLE_COLUMNS}, with two terminal-state differences:
3901
+ * - Actions is a single labelled "View Logs" button, no ⋯ menu → 126px (§2.1).
3902
+ * - **No Checkbox** (ruled 2026-07-09): terminal orders carry no bulk actions, so
3903
+ * like the All view they omit the selection target. **Consume with
3904
+ * `<Table selectable={false}>`** — passing `selectable` would re-add the 52px
3905
+ * checkbox column the finished shape must not have.
3906
+ */
3907
+ declare const ORDER_TABLE_COLUMNS_FINISHED: TableColumn[];
3908
+ /**
3909
+ * Instance B — Unassigned Orders, **Pending view**. No driver and no trip yet, so
3910
+ * both columns are removed; Route/Recipient re-weight to 60/40 automatically.
3911
+ * Actions is 182 (the Dispatch split button + overflow — §2.1). No Batch ID.
3912
+ */
3913
+ declare const UNASSIGNED_ORDER_COLUMNS: TableColumn[];
3914
+ /**
3915
+ * Instance B — Unassigned Orders, **Broadcasted view**. Pending set **plus Batch ID**
3916
+ * (90px, Primary Identifier) after Order ID — broadcasted orders belong to a batch.
3917
+ */
3918
+ declare const BROADCASTED_ORDER_COLUMNS: TableColumn[];
3919
+ /**
3920
+ * Instance B — Unassigned Orders, **Scheduled view**. Pending set **minus Duration**
3921
+ * (no SLA until an order enters the active queue) and no Batch ID.
3922
+ */
3923
+ declare const SCHEDULED_ORDER_COLUMNS: TableColumn[];
3924
+ /**
3925
+ * Instance C — All (search / triage) view. The dispatcher searches across mixed
3926
+ * statuses; the primary interaction is search + the Status column. No Checkbox,
3927
+ * Driver, Trip, Batch ID, or Actions (every row opens the drawer). Order ID is the
3928
+ * only pinned anchor on scroll. Duration shows "—" for scheduled rows (caller-set).
3929
+ * Use with `<Table selectable={false}>`.
3930
+ */
3931
+ declare const ALL_ORDER_COLUMNS: TableColumn[];
3932
+ /**
3933
+ * Optional `Last Updated` column (utility, 120px) — hidden by default; splice it in
3934
+ * **after `Created`** (before `Status`) when the user enables it via the column
3935
+ * control. Raises the table's minimum width, which is what triggers horizontal
3936
+ * scroll (§4.3) on a constrained viewport.
3937
+ */
3938
+ declare const LAST_UPDATED_COLUMN: TableColumn;
3939
+ /**
3940
+ * Optional `Created By` column — hidden by default; splice it in **after
3941
+ * `Last Updated`** (before `Status`) when the user enables it via the column
3942
+ * control. Low-weight flexible Primary column (§3.3): flex 0.5, 200px floor, no
3943
+ * cap — grows slowly on wide viewports without competing with Route/Driver/
3944
+ * Recipient for surplus width. Renders the `user-cell` Cell type (avatar + name
3945
+ * + email) — the caller supplies `name`/`email`/`avatarSrc` per row.
3946
+ */
3947
+ declare const CREATED_BY_COLUMN: TableColumn;
3948
+
3949
+ interface BulkActionsToolbarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
3950
+ /** Leading selection-count label. Default "10 selected". */
3951
+ selectionLabel?: string;
3952
+ /** Fired when the selection button is clicked (typically clears the selection). */
3953
+ onSelectionClick?: () => void;
3954
+ /**
3955
+ * Structured weight/volume metadata shown between the selection and actions.
3956
+ * Each item renders its `value` in SemiBold and `unit` in Regular, separated
3957
+ * by a Regular " · ". Omit for the common case (no summary). Used only for
3958
+ * weight/size metadata — never for displaying a selection count.
3959
+ */
3960
+ summaryItems?: Array<{
3961
+ value: string;
3962
+ unit: string;
3963
+ }>;
3964
+ /**
3965
+ * The action buttons (Center group). Default = two Ghost "Action" + one
3966
+ * Ghost-Error "Action" (all leading ↗). Pass your own row-level action Buttons.
3967
+ *
3968
+ * **Use outlined icons by default.** When composing actions, pass `iconOutlined`
3969
+ * to each `Button` so its glyph renders as the outlined library variant (the
3970
+ * filled variant is only a fallback when no outline exists, e.g. `Proceed`).
3971
+ * This keeps the toolbar visually correct across every screen it is dropped into.
3972
+ */
3973
+ actions?: React.ReactNode;
3974
+ /** Show the overflow "More" (⋯) button after the actions. Default true. */
3975
+ showOverflow?: boolean;
3976
+ /** Fired when the overflow (More) button is clicked. */
3977
+ onOverflowClick?: () => void;
3978
+ /** Fired when the close (✕) button is clicked. */
3979
+ onClose?: () => void;
3980
+ /**
3981
+ * Apply the real placement — `position: fixed`, centered, 80px from the
3982
+ * viewport bottom (per the Figma annotation). Default false (consumer owns
3983
+ * placement, like Toast).
3984
+ */
3985
+ fixed?: boolean;
3986
+ }
3987
+ /**
3988
+ * Bulk Actions Toolbar — the floating action bar that appears when rows are
3989
+ * selected in a table. A centered white pill grouping the selection control (+
3990
+ * optional summary), the available bulk actions (with a "More" overflow), and a
3991
+ * close control, separated by vertical dividers. Per the design it is fixed to
3992
+ * the viewport 80px from the bottom, centered, capped at 800px, in a single
3993
+ * non-wrapping row — pass `fixed` to apply that placement, or place it yourself.
3994
+ *
3995
+ * The selection control is a Ghost button with a **trailing `Chevron-Down`**
3996
+ * ("10 selected ⌄") — a dropdown affordance for selection-scope options — not a
3997
+ * leading checkbox.
3998
+ *
3999
+ * **Icon convention — outlined by default.** Every icon-bearing Button in this
4000
+ * toolbar (the default actions, and any `actions` you supply) should pass
4001
+ * `iconOutlined` so glyphs render as the outlined library variant; the filled
4002
+ * variant is only a fallback for glyphs with no outline (e.g. `Proceed`, `More`,
4003
+ * `Cancel`). This guarantees the toolbar renders correctly on every screen.
4004
+ *
4005
+ * **When to use:** acting on a multi-row selection in a `Table`.
4006
+ * **When not to use:** a single row's actions (the row's `actions` cell); page-level
4007
+ * primary actions (Table Data Control CTAs); transient feedback (Toast).
4008
+ */
4009
+ declare const BulkActionsToolbar: React.ForwardRefExoticComponent<BulkActionsToolbarProps & React.RefAttributes<HTMLDivElement>>;
4010
+
4011
+ /**
4012
+ * - `search-create` — search + filter buttons (Created / Filter / Sort By) on the
4013
+ * left, primary CTAs (Add Order / Import-Export) on the right.
4014
+ * - `search-column` — the same search + filters, with a data count + an
4015
+ * Auto-refresh switch + Columns control on the right.
4016
+ * - `filters-column` — a Top Filter Section on the left, data count +
4017
+ * Auto-refresh switch + Columns on the right.
4018
+ */
4019
+ type TableDataControlVariant = 'search-create' | 'search-column' | 'filters-column';
4020
+ interface TableDataControlProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
4021
+ /** Which toolbar layout to render. Default `search-create`. */
4022
+ variant?: TableDataControlVariant;
4023
+ /** Data count shown in the column-control group (e.g. "10 Orders"). Default "10 Orders". */
4024
+ dataCount?: string;
4025
+ /** Show the data count (column-control variants). Default true. */
4026
+ showDataCount?: boolean;
4027
+ /**
4028
+ * Show the right-hand column-control group (data count + Columns button) on the
4029
+ * `search-column` / `filters-column` variants. Mirrors the Figma
4030
+ * `Show Column Control & Count` property. Default true; set `false` for a
4031
+ * search/filter-only toolbar (e.g. the Table Section's table).
4032
+ */
4033
+ showColumnControl?: boolean;
4034
+ /**
4035
+ * Number of active filter rules currently applied. When > 0, a Coral Red (Alt)
4036
+ * count badge is overlaid at the top-right corner of the Filter icon button.
4037
+ * Filter and Sort are always icon-only buttons in both base and active states.
4038
+ * Mirrors the Figma `search-create` / `search-column` variants and their
4039
+ * "Active Filter" counterparts (Figma nodes `10697:60514` / `10697:60683`).
4040
+ * Default 0 (no active filters).
4041
+ */
4042
+ filterCount?: number;
4043
+ /** Left section for the search variants — overrides the default search + filter buttons. */
4044
+ searchSection?: React.ReactNode;
4045
+ /** Left section for `filters-column` — overrides the default Top Filter Section. */
4046
+ filters?: React.ReactNode;
4047
+ /** Right section for `search-create` — overrides the default Add Order + Import/Export. */
4048
+ ctas?: React.ReactNode;
4049
+ /**
4050
+ * Show the Primary "Add Order" button in the default `search-create` CTAs.
4051
+ * Default true; set `false` for the Empty State toolbar, where the primary
4052
+ * Add Order CTA lives beside the illustration instead (per Figma
4053
+ * `4368:154614`). Ignored when `ctas` is overridden.
4054
+ */
4055
+ showAddOrder?: boolean;
4056
+ /** Right column-control content (search-column / filters-column) — overrides the default Columns button. */
4057
+ columnControl?: React.ReactNode;
4058
+ /** Search field placeholder. Default "Search here...". */
4059
+ searchPlaceholder?: string;
4060
+ /** Controlled search field value. Omit for an uncontrolled field. */
4061
+ searchValue?: string;
4062
+ /** Fired as the user types in the search field. */
4063
+ onSearchChange?: (value: string) => void;
4064
+ /** Fired when the search field's clear (×) button is clicked. */
4065
+ onSearchClear?: () => void;
4066
+ /** Label for the Created date-filter button. Default "Created: Today". */
4067
+ createdLabel?: string;
4068
+ onCreatedClick?: () => void;
4069
+ onFilterClick?: () => void;
4070
+ onSortClick?: () => void;
4071
+ onAddOrderClick?: () => void;
4072
+ onImportExportClick?: () => void;
4073
+ onColumnsClick?: () => void;
4074
+ /**
4075
+ * Controlled state of the **Auto-refresh** switch (column-control variants).
4076
+ * When on, orders auto-refresh into the table — replaces the old manual
4077
+ * Refresh button (Figma `7575:36637`). Omit for uncontrolled.
4078
+ */
4079
+ autoRefresh?: boolean;
4080
+ /** Fired with the next value when the Auto-refresh switch is toggled. */
4081
+ onAutoRefreshChange?: (checked: boolean) => void;
4082
+ }
4083
+ /**
4084
+ * Table Data Control — the toolbar that sits above a data table to search,
4085
+ * filter, sort, and act on its rows. Three layouts (`variant`) cover the common
4086
+ * table headers: search + create, search + column control, and top-level filters
4087
+ * + column control. The left/right sections are slot props with Figma-faithful
4088
+ * defaults (reusing Search Input, Button, and Top Filter Section).
4089
+ *
4090
+ * **When to use:** as the controls row of a `Table Container`.
4091
+ * **When not to use:** acting on a multi-row selection (Bulk Actions Toolbar);
4092
+ * in-table pagination (the Table's Pagination footer).
4093
+ */
4094
+ declare const TableDataControl: React.ForwardRefExoticComponent<TableDataControlProps & React.RefAttributes<HTMLDivElement>>;
4095
+
4096
+ /**
4097
+ * `default` shows the populated table; `empty` swaps the table for an Empty
4098
+ * State (no data yet); `no-results` keeps both toolbars but swaps the table for
4099
+ * the No Matching Results Empty State (an active search/filter matched nothing).
4100
+ */
4101
+ type TableContainerVariant = 'default' | 'empty' | 'no-results';
4102
+ interface TableContainerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {
4103
+ /** Which state to render. Default `default`. */
4104
+ variant?: TableContainerVariant;
4105
+ /**
4106
+ * The control row(s) above the table. Default mirrors Figma: `default` →
4107
+ * Search + Create then Top Filters + Column Control; `empty` → Search + Create only.
4108
+ */
4109
+ controls?: React.ReactNode;
4110
+ /** The table region (`default` variant). Default a full `Table`. */
4111
+ table?: React.ReactNode;
4112
+ /**
4113
+ * The empty region (`empty` variant). Default an Empty State (No Orders + Add
4114
+ * Order CTA). **Centred automatically** — the container wraps this slot in a
4115
+ * centred flex box, so pass the bare Empty State, not your own layout.
4116
+ */
4117
+ empty?: React.ReactNode;
4118
+ /**
4119
+ * The no-results region (`no-results` variant). Default the No Matching
4120
+ * Results Empty State ("Try adjusting your filters and date.", per Doc 3
4121
+ * §3/§9's copy standard; Figma `1524:40283` Property 1=No Results).
4122
+ * **Centred automatically** (see `empty`) — pass the bare Empty State.
4123
+ */
4124
+ noResults?: React.ReactNode;
4125
+ /** Fired by the default Empty State's Add Order CTA. */
4126
+ onAddOrder?: () => void;
4127
+ /**
4128
+ * Fill the available height of a flex-column parent (`flex: 1`): the table
4129
+ * region grows to the viewport and scrolls internally while its Pagination
4130
+ * stays pinned. Used by the Page so the table pagination is always visible
4131
+ * without page scroll. Forwarded to the default `Table`.
4132
+ */
4133
+ fillHeight?: boolean;
4134
+ /**
4135
+ * Number of active filter rules applied to the table. Forwarded to the default
4136
+ * Search + Create `TableDataControl` — when > 0 the Filter button condenses to
4137
+ * icon-only with a Coral Red (Alt) count badge. Ignored when `controls` is
4138
+ * overridden. Default 0.
4139
+ */
4140
+ filterCount?: number;
4141
+ }
4142
+ /**
4143
+ * Table Container — the full data-table section: a vertical stack of the control
4144
+ * toolbar(s) and either the populated `Table`, a centered Empty State (no data
4145
+ * yet), or the No Matching Results state (active search/filters matched
4146
+ * nothing — both toolbars stay). Composes Table Data Control, Table, and Empty
4147
+ * State; all regions are slot props with Figma-faithful defaults.
4148
+ *
4149
+ * **When to use:** the top-level shell for a table view (toolbar + table + empty state).
4150
+ * **When not to use:** just the grid (Table) or just the toolbar (Table Data Control).
4151
+ */
4152
+ declare const TableContainer: React.ForwardRefExoticComponent<TableContainerProps & React.RefAttributes<HTMLDivElement>>;
4153
+
4154
+ /** One side-tab entry. */
4155
+ interface SidetabItem {
4156
+ /** Tab label. Default "Tab Name". */
4157
+ label?: string;
4158
+ /** Optional leading icon. */
4159
+ leadingIcon?: IconName;
4160
+ }
4161
+ interface SidetabProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onChange'> {
4162
+ /** The tabs, top to bottom. Default five "Tab Name" items. */
4163
+ tabs?: SidetabItem[];
4164
+ /** Index of the active tab. Default 0. */
4165
+ value?: number;
4166
+ /** Fired with the index of the clicked tab. */
4167
+ onChange?: (index: number) => void;
4168
+ /** Escape hatch — raw Body content instead of the data-driven `tabs`. */
4169
+ children?: React.ReactNode;
4170
+ }
4171
+ /**
4172
+ * Sidetab — secondary, in-module navigation: a fixed-width column of side-tab
4173
+ * menu options that switch the visible section without leaving the current
4174
+ * workflow. Data-driven (`tabs` + `value`/`onChange`), composing the side-tab
4175
+ * `DesktopMenuOptions`.
4176
+ *
4177
+ * **When to use:** navigating between sections of one module/page.
4178
+ * **When not to use:** top-level product navigation (Side Bar); page-level tabs
4179
+ * across a content area (Page Tabs Control).
4180
+ */
4181
+ declare const Sidetab: React.ForwardRefExoticComponent<SidetabProps & React.RefAttributes<HTMLDivElement>>;
4182
+
4183
+ /** `expanded` (240px, labelled nav) or `collapsed` (72px, icon-only nav). */
4184
+ type SideBarVariant = 'expanded' | 'collapsed';
4185
+ /** One navigation destination. */
4186
+ interface SideBarItem {
4187
+ /** Item label (shown when expanded). Default "Module 1". */
4188
+ label?: string;
4189
+ /** Leading nav icon. Default the placeholder Question glyph (as in Figma). */
4190
+ leadingIcon?: IconName;
4191
+ /** The user's current location. */
4192
+ active?: boolean;
4193
+ /** Optional trailing content when expanded (e.g. an external-link icon or badge). */
4194
+ trailing?: React.ReactNode;
4195
+ }
4196
+ /** A group of nav items, optionally headed by a section label. Groups are divider-separated. */
4197
+ interface SideBarGroup {
4198
+ /** Section header label (e.g. "Management"). Omit for an unlabelled group. */
4199
+ label?: string;
4200
+ items: SideBarItem[];
4201
+ }
4202
+ interface SideBarProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {
4203
+ /** Expanded (240px) or collapsed (72px). Default `expanded`. */
4204
+ variant?: SideBarVariant;
4205
+ /** Main nav groups (divider-separated). */
4206
+ groups?: SideBarGroup[];
4207
+ /** Footer nav items (Help Center, etc.). */
4208
+ footerItems?: SideBarItem[];
4209
+ /** Footer version string. Default "Leta Technologies v.3.1.5". */
4210
+ version?: string;
4211
+ /** Show the Global Search field (expanded) / search icon (collapsed). Default true. */
4212
+ showSearch?: boolean;
4213
+ /** Search placeholder. Default "Global Search". */
4214
+ searchPlaceholder?: string;
4215
+ /** Fired by the header collapse toggle (expanded) / the Collapsed Sidebar Logo (collapsed). */
4216
+ onToggleCollapse?: () => void;
4217
+ /** Fired when a nav item is clicked: (groupIndex, itemIndex). Footer items use groupIndex -1. */
4218
+ onItemClick?: (groupIndex: number, itemIndex: number) => void;
4219
+ }
4220
+ /**
4221
+ * Side Bar — the product's primary navigation: persistent access to top-level
4222
+ * destinations, in an expanded (labelled, 240px) or collapsed (icon-only, 72px)
4223
+ * column. Header (logo + collapse toggle), Global Search, divider-separated nav
4224
+ * groups, and a footer (utility links + version). Composes Leta Logo / Collapsed
4225
+ * Sidebar Logo, Search Input, Button, and the sidebar Desktop Menu Options.
4226
+ *
4227
+ * **When to use:** top-level navigation across the application.
4228
+ * **When not to use:** in-module section nav (Sidetab); page tabs (Page Tabs Control).
4229
+ */
4230
+ declare const SideBar: React.ForwardRefExoticComponent<SideBarProps & React.RefAttributes<HTMLElement>>;
4231
+
4232
+ /** `default` (no unread indicator) or `active` (notification dot on the bell). */
4233
+ type TopBarVariant = 'default' | 'active';
4234
+ interface TopBarProps extends Omit<React.HTMLAttributes<HTMLElement>, 'children'> {
4235
+ /** Default (no unread dot) or active (unread-notification dot). Default `default`. */
4236
+ variant?: TopBarVariant;
4237
+ /** Left wayfinding content. Default a global-admin Breadcrumbs. */
4238
+ left?: React.ReactNode;
4239
+ /** The signed-in user (drives the User-Menu). Default { name: "Alex Smith" }. */
4240
+ user?: {
4241
+ name: string;
4242
+ avatarSrc?: string;
4243
+ tone?: AvatarTone;
4244
+ };
4245
+ /** Fired when the notification bell is clicked. */
4246
+ onNotificationsClick?: () => void;
4247
+ /** Fired when the User-Menu is clicked. */
4248
+ onUserMenuClick?: () => void;
4249
+ }
4250
+ /**
4251
+ * Top Bar — the persistent application header: contextual wayfinding
4252
+ * (breadcrumbs) on the left, and global controls — notifications and the
4253
+ * User-Menu — on the right. The `active` variant shows an unread-notification dot
4254
+ * on the bell. Composes Breadcrumbs, Button, and User-Menu.
4255
+ *
4256
+ * **Width:** the bar fills its container (`width: 100%`) — in a real app it
4257
+ * expands to the viewport/content frame it sits in. The Figma frame's fixed
4258
+ * 1200px is just the design canvas, not a constraint.
4259
+ *
4260
+ * **When to use:** the top-level app chrome above the page content.
4261
+ * **When not to use:** in-page tabs (Page Tabs Control); the table toolbar
4262
+ * (Table Data Control); the side navigation (Side Bar).
4263
+ */
4264
+ declare const TopBar: React.ForwardRefExoticComponent<TopBarProps & React.RefAttributes<HTMLElement>>;
4265
+
4266
+ interface ListItemData {
4267
+ /** Primary label — maps to CP `text`. */
4268
+ label: string;
4269
+ /** Secondary value / description — maps to CP `subtext`. */
4270
+ value?: string;
4271
+ /** Show the leading visual-anchor (help icon). Default true, per Figma. */
4272
+ showAnchor?: boolean;
4273
+ }
4274
+ interface ListGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
4275
+ /** Group sub-header title (Figma `group-header` CP). Default "Group Name". */
4276
+ title?: string;
4277
+ /** Group sub-header description. Default "Enter description here". */
4278
+ description?: string;
4279
+ /**
4280
+ * List items rendered in a 2-column grid (gap 16 horizontal, gap 20 vertical).
4281
+ * Each item is a `ContentPrimitives type="vertical-list-row"`. Default 6 items.
4282
+ */
4283
+ items?: ListItemData[];
4284
+ /** Replace the item grid entirely. */
4285
+ children?: React.ReactNode;
4286
+ }
4287
+ /**
4288
+ * List Group — one titled cluster within a {@link ListSection}: a `group-header`
4289
+ * Content Primitive over a 2-column grid of `vertical-list-row` Content Primitives.
4290
+ */
4291
+ declare const ListGroup: React.ForwardRefExoticComponent<ListGroupProps & React.RefAttributes<HTMLDivElement>>;
4292
+ interface ListSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
4293
+ /** Section header title. Default "Title". */
4294
+ title?: string;
4295
+ /** Section header description. Default "Enter description here". */
4296
+ subtext?: string;
4297
+ /**
4298
+ * The list body — the Figma "Content" SLOT (vertical 24px-gap stack). Provide
4299
+ * `<ListGroup>`s; a dashed demarcator is auto-inserted between adjacent children.
4300
+ * Defaults to two List Groups, mirroring Figma.
4301
+ */
4302
+ children?: React.ReactNode;
4303
+ /** Start expanded. Default true. */
4304
+ defaultOpen?: boolean;
4305
+ }
4306
+ /**
4307
+ * List Section — a collapsible, titled read-only list organism (Figma `217:6694`).
4308
+ * A white card (border, `--rounding-xl`, 20px padding) with a section header
4309
+ * (title + description + collapse chevron) over the "Content" SLOT: a vertical
4310
+ * stack of {@link ListGroup}s separated by dashed demarcators.
4311
+ *
4312
+ * Composes `ContentPrimitives` (section-heading, group-header, vertical-list-row).
4313
+ *
4314
+ * **When to use:** a grouped, read-only key-value information panel on a page.
4315
+ * **When not to use:** editable fields (`InputSection`), tabular data (`TableSection`).
4316
+ */
4317
+ declare const ListSection: React.ForwardRefExoticComponent<ListSectionProps & React.RefAttributes<HTMLDivElement>>;
4318
+
4319
+ interface TableSectionProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
4320
+ /** Section header title. Default "Title". */
4321
+ title?: string;
4322
+ /** Section header description. Default "Enter description here". */
4323
+ subtext?: string;
4324
+ /**
4325
+ * The table body — the Figma "Container" SLOT, a `Table-Container` instance.
4326
+ * Defaults to a `<TableContainer>` with a search/filter toolbar. Pass your own
4327
+ * `<TableContainer>` with real data, or any other content.
4328
+ */
4329
+ children?: React.ReactNode;
4330
+ /** Start expanded. Default true. */
4331
+ defaultOpen?: boolean;
4332
+ /**
4333
+ * Number of active filter rules. Forwarded to the default `TableContainer`'s
4334
+ * `TableDataControl`. Ignored when `children` is overridden. Default 0.
4335
+ */
4336
+ filterCount?: number;
4337
+ }
4338
+ /**
4339
+ * Table Section — a collapsible, titled table organism (Figma `4818:152180`,
4340
+ * variants **Open** / **Closed**). An edge-to-edge section (no card chrome) with a
4341
+ * Section-Heading Content Primitive (title + description + collapse chevron) over
4342
+ * the "Container" SLOT — a **`Table-Container` instance** (toolbar + table). No
4343
+ * group sub-header (the Table Container owns its own structure).
4344
+ *
4345
+ * Composes `ContentPrimitives` (section-heading) + `TableContainer`.
4346
+ *
4347
+ * **When to use:** a titled, collapsible table on a forms/lists-&-sections page.
4348
+ * **When not to use:** a standalone table without a section context (`TableContainer`).
4349
+ */
4350
+ declare const TableSection: React.ForwardRefExoticComponent<TableSectionProps & React.RefAttributes<HTMLDivElement>>;
4351
+
4352
+ type AlertDialogVariant = 'basic' | 'warning';
4353
+ interface AlertDialogProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
4354
+ /** `basic` (no header icon) or `warning` (leading warning icon in the header). Default `basic`. */
4355
+ variant?: AlertDialogVariant;
4356
+ /** Modal title. Default "Title". */
4357
+ title?: string;
4358
+ /** Body copy (Body/L/Regular). Ignored when `children` is provided. */
4359
+ message?: string;
4360
+ /** Body override — replaces the default message text. */
4361
+ children?: React.ReactNode;
4362
+ /** Optional leading content revealed above the message (Figma's hidden in-slot Notification Banner). */
4363
+ banner?: React.ReactNode;
4364
+ /**
4365
+ * Footer leading slot — content pinned far left, opposite the actions.
4366
+ *
4367
+ * Its one use so far is a **"Don't show this again" checkbox** (Figma
4368
+ * `1892:370929`, Change Driver): an opt-out belongs beside the actions it
4369
+ * silences, but it is not itself an action, so it sits apart rather than joining
4370
+ * the Close / Confirm pair. Switches the footer to `tertiary-action`, which is
4371
+ * the variant that has a leading region.
4372
+ */
4373
+ footerLeading?: React.ReactNode;
4374
+ /** Cancel/dismiss action label. Default "Close". */
4375
+ cancelLabel?: string;
4376
+ /** Confirm action label. Default "Confirm". */
4377
+ confirmLabel?: string;
4378
+ /**
4379
+ * Style the confirm button as destructive (`Button variant="destructive"`,
4380
+ * red) instead of the default primary. Doc 3 §5: "primary styled to the
4381
+ * action's nature — destructive red for Cancel." Default false.
4382
+ */
4383
+ destructive?: boolean;
4384
+ /** Cancel button handler (also the default for the header close). */
4385
+ onCancel?: () => void;
4386
+ /** Confirm button handler. */
4387
+ onConfirm?: () => void;
4388
+ /** Header close-button handler. Falls back to `onCancel`. */
4389
+ onClose?: () => void;
4390
+ }
4391
+ /**
4392
+ * Alert Dialog (`1106:2868`) — the smallest modal template: a confirmation /
4393
+ * destructive-action prompt. 480×256, composing `ModalHeaders` (default) + a
4394
+ * body region (Body/L/Regular message) + `FooterFrame` (Close / Confirm).
4395
+ *
4396
+ * - **basic** — title + message.
4397
+ * - **warning** — adds a leading warning icon in the header.
4398
+ *
4399
+ * **When to use:** confirm a discrete, often destructive action.
4400
+ * **When NOT to use:** multi-field forms or content-heavy flows (use Modal
4401
+ * Dialog / Large Modal).
4402
+ */
4403
+ declare const AlertDialog: React.ForwardRefExoticComponent<AlertDialogProps & React.RefAttributes<HTMLDivElement>>;
4404
+
4405
+ type ModalDialogVariant = 'comment' | 'form' | 'signature' | 'image' | 'multi-choice';
4406
+ interface ModalDialogProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
4407
+ /** Which single-purpose body. Default `comment`. */
4408
+ variant?: ModalDialogVariant;
4409
+ /** Modal title. Default "Title". */
4410
+ title?: string;
4411
+ /** Body override — replaces the variant's default body content. */
4412
+ children?: React.ReactNode;
4413
+ /** `image` variant — the image source. Defaults to the Figma sample delivery photo. */
4414
+ imageSrc?: string;
4415
+ /** `signature` variant — a captured-signature image source. Defaults to the Figma sample signature. */
4416
+ signatureSrc?: string;
4417
+ /** Cancel/dismiss label. Default "Close". */
4418
+ cancelLabel?: string;
4419
+ /**
4420
+ * Render the confirm button. Default true. Only applies to the Close/Confirm
4421
+ * footer (`comment` / `form` / `multi-choice`, or `image`/`signature` with
4422
+ * `showDownload={false}`) — the default `image`/`signature` footer is the
4423
+ * single "Download Image" action and ignores this prop.
4424
+ */
4425
+ showConfirm?: boolean;
4426
+ /** Confirm label. Default "Confirm". */
4427
+ confirmLabel?: string;
4428
+ /**
4429
+ * Style the confirm button as destructive red (`Button variant="destructive"`)
4430
+ * instead of primary — Doc 3 §5: "primary styled to the action's nature".
4431
+ * Default false.
4432
+ */
4433
+ destructive?: boolean;
4434
+ /**
4435
+ * Override the confirm button's variant. Defaults to `primary` (or
4436
+ * `destructive` when {@link ModalDialogProps.destructive} is set).
4437
+ *
4438
+ * Pass `'secondary'` when the dialog's two actions are genuinely equal-weight
4439
+ * side-exits rather than a path and its escape — e.g. Affected Depots, where
4440
+ * "Close" and "Filter Orders" are two different ways to leave, and styling one
4441
+ * as primary would recommend it.
4442
+ */
4443
+ confirmVariant?: 'primary' | 'secondary' | 'destructive';
4444
+ /** Disable the confirm button (e.g. until a required selection is made). Default false. */
4445
+ confirmDisabled?: boolean;
4446
+ /** Optional leading icon on the confirm button (outlined), e.g. the Cancel Order trash. */
4447
+ confirmIconLeft?: IconName;
4448
+ onCancel?: () => void;
4449
+ onConfirm?: () => void;
4450
+ /** Header close handler. Falls back to `onCancel`. */
4451
+ onClose?: () => void;
4452
+ /**
4453
+ * `image` / `signature` variants only — show the footer's "Download Image"
4454
+ * action. Defaults to `true` for these two variants (matches Figma) and is
4455
+ * ignored elsewhere. Set `false` to fall back to the standard Close (+
4456
+ * Confirm) footer instead — e.g. a non-proof use of these variants that
4457
+ * still needs a dismiss/confirm pair.
4458
+ */
4459
+ showDownload?: boolean;
4460
+ /** Saved filename for the download. Defaults to `signature.png` / `proof-of-delivery.jpg`. */
4461
+ downloadFileName?: string;
4462
+ /**
4463
+ * Override the download action entirely — e.g. to fetch the full-resolution
4464
+ * file from a different endpoint than the thumbnail shown in the modal, or
4465
+ * to log analytics. Without it, the default behavior downloads `imageSrc` /
4466
+ * `signatureSrc` directly via `downloadFile`.
4467
+ */
4468
+ onDownload?: () => void;
4469
+ /**
4470
+ * Fixed body height override (px) — replaces the variant's default so a
4471
+ * children-composed body can match its wireframe exactly (e.g. the Cancel
4472
+ * Order modal's 454px multi-choice body).
4473
+ */
4474
+ bodyHeight?: number;
4475
+ }
4476
+ /**
4477
+ * Modal Dialog (`1317:4855`) — a 512px-wide single-purpose dialog for one focused
4478
+ * task: capturing a short input or a small form, previewing a signature or image,
4479
+ * or picking from a set of choices. Shell = `ModalHeaders` (default) + body +
4480
+ * `FooterFrame`. Five `variant`s set the body:
4481
+ * - **comment** — a `TextArea` (counter, no label). Footer: Close / Confirm.
4482
+ * - **form** — a two-column row of `InputField`s. Footer: Close / Confirm.
4483
+ * - **signature** — a bordered **preview** of a captured signature (480×304;
4484
+ * override via `signatureSrc`). Footer: a single "Download Image" action
4485
+ * (dismiss is via the header ×) — see `showDownload`/`downloadFileName`/`onDownload`.
4486
+ * - **image** — an image **preview** (480×304, e.g. proof of delivery;
4487
+ * override via `imageSrc`). Footer: same "Download Image" action as `signature`.
4488
+ * - **multi-choice** — a vertical list of `OptionCard`s. Footer: Close / Confirm.
4489
+ *
4490
+ * Provide `children` to replace any variant's body.
4491
+ */
4492
+ declare const ModalDialog: React.ForwardRefExoticComponent<ModalDialogProps & React.RefAttributes<HTMLDivElement>>;
4493
+
4494
+ declare const DOORSTEP_DELIVERY_IMAGE: string;
4495
+
4496
+ declare const SIGNATURE_IMAGE: string;
4497
+
4498
+ /**
4499
+ * Downloads a URL as a local file. Tries a fetch→blob round trip first (works
4500
+ * for data-URI assets and same-origin/CORS-permissive remote files, and
4501
+ * forces a real "Save" rather than a navigation); if that's blocked — a
4502
+ * cross-origin image host without CORS headers, for example — falls back to
4503
+ * opening the URL in a new tab so the action never dead-ends.
4504
+ *
4505
+ * Shared by any component that offers a "download this asset" action (e.g.
4506
+ * `ModalDialog`'s image/signature proof viewers) so the CORS/blob handling is
4507
+ * solved once, not per component.
4508
+ */
4509
+ declare function downloadFile(url: string, filename: string): Promise<void>;
4510
+
4511
+ /**
4512
+ * Which edges of a scroll container currently have nothing more past them, and
4513
+ * whether it overflows at all. See {@link useScrollEdges}.
4514
+ */
4515
+ interface ScrollEdges {
4516
+ /** Vertical scroll is at (or above) the top — nothing more above. */
4517
+ atTop: boolean;
4518
+ /** Vertical scroll has reached the bottom — nothing more below. */
4519
+ atBottom: boolean;
4520
+ /** Horizontal scroll is at the start (left in LTR) — nothing more before. */
4521
+ atStart: boolean;
4522
+ /** Horizontal scroll has reached the end — nothing more after. */
4523
+ atEnd: boolean;
4524
+ /** The container's content is taller than its box. */
4525
+ overflowY: boolean;
4526
+ /** The container's content is wider than its box. */
4527
+ overflowX: boolean;
4528
+ }
4529
+ /**
4530
+ * The single detection primitive behind every **Scroll Edge** affordance — the
4531
+ * edge fades on the Table's pinned columns and the edge shadows on ModalShell /
4532
+ * FooterFrame all read from this, so "is there more content past this edge?" is
4533
+ * answered one way across the design system.
4534
+ *
4535
+ * Returns all four edges plus both overflow flags, so one call covers a vertical
4536
+ * list, a horizontal table, or a container that scrolls on both axes.
4537
+ *
4538
+ * ## Why not just a scroll listener
4539
+ *
4540
+ * Three things change the answer, and a naive implementation catches only the first:
4541
+ *
4542
+ * 1. **The user scrolls** — a `scroll` listener on the container.
4543
+ * 2. **The container's own box resizes** — a `ResizeObserver` on the container
4544
+ * (window resize, a sibling growing, a layout reflow).
4545
+ * 3. **The container's CONTENT changes while its box stays fixed** — a
4546
+ * `MutationObserver` on its subtree.
4547
+ *
4548
+ * Case 3 is the one that bites. `ResizeObserver` reports the target's *own* box,
4549
+ * not its `scrollHeight`, so appending rows inside a height-clamped container
4550
+ * never fires it. A modal body that starts out exactly fitting and then grows
4551
+ * past the fold (an accordion expands, a tab swaps in more rows, async content
4552
+ * lands, a search widens its result set) genuinely overflows, but nothing the
4553
+ * other two observers listen for has happened — so a scroll-and-resize-only
4554
+ * implementation reports "no overflow" forever and the affordance never appears.
4555
+ *
4556
+ * That was a real divergence before this hook existed: `ModalShell` drove its
4557
+ * header shadow from an effect keyed on `children` (so it *did* recompute on
4558
+ * content change) while its footer shadow came from a scroll+resize-only hook —
4559
+ * two shadows nine lines apart in the same file, disagreeing about whether the
4560
+ * body overflowed. Both now read from here.
4561
+ *
4562
+ * ## Element swaps under a stable ref
4563
+ *
4564
+ * The effect deliberately has **no dependency array** and instead compares
4565
+ * `ref.current` on every render. A `RefObject`'s identity never changes, so a
4566
+ * `[ref]`-keyed effect never notices its `.current` being swapped for a different
4567
+ * node (a two-pane modal switching which side owns the scroll, a conditionally
4568
+ * mounted list). Without this the hook keeps observing a node that has already
4569
+ * left the document and its answer freezes. The cheap identity check below makes
4570
+ * re-running per render free in the common case where the target never changes.
4571
+ *
4572
+ * @example
4573
+ * ```tsx
4574
+ * const bodyRef = useRef<HTMLDivElement>(null);
4575
+ * const { atBottom, overflowY } = useScrollEdges(bodyRef);
4576
+ *
4577
+ * <div ref={bodyRef} style={{ overflowY: 'auto', maxHeight: 300 }}>{items}</div>
4578
+ * <FooterFrame scrollShadow={overflowY && !atBottom}>…</FooterFrame>
4579
+ * ```
4580
+ */
4581
+ declare function useScrollEdges(containerRef: React.RefObject<HTMLElement | null>): ScrollEdges;
4582
+
4583
+ /**
4584
+ * Arrow-key navigation for a menu, applied to the container that holds its rows.
4585
+ *
4586
+ * Menu rows already carry `tabIndex={0}` and activate on Enter/Space, so they were
4587
+ * reachable by Tab — but only one at a time, and a long option list meant a Tab for
4588
+ * every row. Doc 3 §10 asks for the standard menu behaviour instead: arrows move
4589
+ * between options, Home/End jump to the ends, Enter selects. This supplies the half
4590
+ * that was missing everywhere in the product, in one place rather than per menu.
4591
+ *
4592
+ * Deliberately DOM-driven rather than index-driven state: the menus here render
4593
+ * wildly different bodies (flat lists, grouped lists with dividers, two-pane filter
4594
+ * groups, a search box above a list), and several are composed by callers who own
4595
+ * their own rows. Querying the container for what is focusable at the moment a key
4596
+ * is pressed handles all of those without every menu having to declare its shape.
4597
+ *
4598
+ * `Escape` is not handled here: overlays own dismissal through the shared Escape
4599
+ * stack, which is the only thing that knows which layer is on top.
4600
+ */
4601
+ declare function useRovingFocus<T extends HTMLElement>(ref: React.RefObject<T | null>): void;
4602
+
4603
+ /**
4604
+ * Smoothly animate an element's `scrollTop`, and **guarantee it lands**.
4605
+ *
4606
+ * ## Why this is hand-rolled
4607
+ *
4608
+ * Deliberately not `element.scrollTo({ behavior: 'smooth' })`, `scrollIntoView({
4609
+ * behavior: 'smooth' })` or CSS `scroll-behavior: smooth`. All three are **no-ops
4610
+ * in some renderers** — verified in this project's own preview pane, where a
4611
+ * scripted smooth scroll left `scrollTop` untouched while the instant form moved
4612
+ * correctly. A scroll that silently does nothing is worse than an abrupt one: the
4613
+ * control appears dead.
4614
+ *
4615
+ * ## Why the timeout exists
4616
+ *
4617
+ * The tween runs on `requestAnimationFrame`, which is **throttled to nothing in a
4618
+ * background or occluded tab** (and absent altogether in some headless renderers).
4619
+ * Without the fallback, a scroll started just before the user switches tabs stays
4620
+ * half-finished — or never starts. Once the tween's window has passed the final
4621
+ * position is forced: a no-op when the animation already completed, and the whole
4622
+ * effect when rAF never ran. This is the same guaranteed-landing pattern the route
4623
+ * tracer and the marker pan use, for the same reason.
4624
+ *
4625
+ * ## Reduced motion
4626
+ *
4627
+ * Collapses to an instant jump. The point of the animation is to show *where the
4628
+ * list went*; when a user has asked for less motion, arriving is what matters.
4629
+ *
4630
+ * @returns A `cancel()` that stops the tween and clears the fallback. Call it from
4631
+ * an effect cleanup — otherwise a tween started by one render can keep writing
4632
+ * `scrollTop` after the element has been scrolled somewhere else (or unmounted).
4633
+ */
4634
+ declare function animateScrollTop(el: HTMLElement, top: number, duration?: number): () => void;
4635
+
4636
+ type LargeModalVariant = 'single-column-form' | 'dual-column-form' | 'drawer-read' | 'centered';
4637
+ interface LargeModalProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
4638
+ /** Which large-modal treatment. Default `centered`. */
4639
+ variant?: LargeModalVariant;
4640
+ /** Modal title. Default "Title". */
4641
+ title?: string;
4642
+ /**
4643
+ * The header tab row (drawer variants use the `with-tabs` header). Defaults to
4644
+ * a 3-tab `PageTabsControl`. Ignored for `centered` (default header, no tabs).
4645
+ */
4646
+ tabs?: React.ReactNode;
4647
+ /** Body override — replaces the variant's default scrolling body. */
4648
+ children?: React.ReactNode;
4649
+ /** Footer leading content (the `preference` footer's persistent control). */
4650
+ footerLeading?: React.ReactNode;
4651
+ /** Cancel label. Default "Close" (centered) / "Cancel" (drawers). */
4652
+ cancelLabel?: string;
4653
+ /** Confirm label. Default "Confirm" (centered) / "Save" (drawers). */
4654
+ confirmLabel?: string;
4655
+ onCancel?: () => void;
4656
+ onConfirm?: () => void;
4657
+ /** Header close handler. Falls back to `onCancel`. */
4658
+ onClose?: () => void;
4659
+ /**
4660
+ * Number of active filter rules. Forwarded to the default `centered` variant's
4661
+ * `TableSection`. Ignored when `children` is overridden. Default 0.
4662
+ */
4663
+ filterCount?: number;
4664
+ }
4665
+ /**
4666
+ * Large Modal (`228:11413`) — 768px-wide modal with a **scrolling** body.
4667
+ * - **single-column-form** — square drawer; `with-tabs` header; one vertical column
4668
+ * of stacked `InputSection`s. For **short forms** where the user doesn't have to
4669
+ * work through 4+ accordions nesting text fields.
4670
+ * - **dual-column-form** — square drawer; two columns of `InputSection`s split by a
4671
+ * full-height vertical **solid** demarcator (it runs to the footer even when the
4672
+ * columns are collapsed). For **long forms** where a single column means heavy
4673
+ * scrolling and the fields fall into 2+ independent groups.
4674
+ * - **drawer-read** — square drawer; `with-tabs` header; body = stacked `ListSection`s.
4675
+ * - **centered** — radius 12; default header; body = `InputSection` + demarcator + `TableSection`.
4676
+ *
4677
+ * Drawers are 768-wide, **full viewport height** (square side-sheets) with a
4678
+ * sticky header/footer and a scrolling body; centered is 768×768 (rounded). All
4679
+ * use the `preference` footer.
4680
+ */
4681
+ declare const LargeModal: React.ForwardRefExoticComponent<LargeModalProps & React.RefAttributes<HTMLDivElement>>;
4682
+
4683
+ interface ExtraLargeModalProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {
4684
+ /** Modal title. Default "Title". */
4685
+ title?: string;
4686
+ /** Left panel content (below the group heading). Default a search/filter toolbar + `<Table>`. */
4687
+ tableContent?: React.ReactNode;
4688
+ /** Right map-panel content. Default a live `<MapView>` (Leaflet/OpenStreetMap). */
4689
+ mapContent?: React.ReactNode;
4690
+ /** Map centre `[lat, lng]` for the default `<MapView>`. Default Nairobi. */
4691
+ mapCenter?: [number, number];
4692
+ /** Cancel label. Default "Cancel". */
4693
+ cancelLabel?: string;
4694
+ /** Confirm label. Default "Confirm". */
4695
+ confirmLabel?: string;
4696
+ onCancel?: () => void;
4697
+ onConfirm?: () => void;
4698
+ /** Header close handler. Falls back to `onCancel`. */
4699
+ onClose?: () => void;
4700
+ }
4701
+ /**
4702
+ * Extra Large Modal (`7900:165088`) — a 1024×768 two-panel picker modal.
4703
+ * Shell = `ModalHeaders` (default) + a **horizontal** body + `FooterFrame`.
4704
+ * The body splits into a fixed 512px left **Panel** (a `section-heading`
4705
+ * `ContentPrimitives` + a simplified search/filter toolbar + a selectable
4706
+ * `Table`, with a right divider) and a filling right **Map Section** (a live
4707
+ * `MapView` — Leaflet/OpenStreetMap — with its built-in `MapZoomControl`).
4708
+ *
4709
+ * The table mirrors the modal's *modified* table instance — a plain
4710
+ * Search + Filter + Sort By toolbar over a selectable table of "Label"/"Content"
4711
+ * columns with the standard "Showing 10 of 180" pagination footer (no Created
4712
+ * filter, no top-filter chips, no status/actions columns).
4713
+ *
4714
+ * **When to use:** select rows while referencing a map (e.g. assigning orders
4715
+ * to a route).
4716
+ */
4717
+ declare const ExtraLargeModal: React.ForwardRefExoticComponent<ExtraLargeModalProps & React.RefAttributes<HTMLDivElement>>;
4718
+
4719
+ export { ALL_ORDER_COLUMNS, AVATAR_PHOTOS, AccordionChevron, AccordionContent, AccordionHeader, type AccordionHeaderProps, AlertDialog, type AlertDialogProps, type AlertDialogVariant, Avatar, type AvatarProps, type AvatarSize, type AvatarTone, BROADCASTED_ORDER_COLUMNS, Badge, type BadgeColor, type BadgeProps, type BreadcrumbCrumb, Breadcrumbs, type BreadcrumbsProps, type BreadcrumbsType, BulkActionsToolbar, type BulkActionsToolbarProps, Button, type ButtonPlatform, type ButtonProps, type ButtonSize, type ButtonVariant, CARET_SIDE, CREATED_BY_COLUMN, Calendar, type CalendarProps, type CaretAlign, type CaretSide, CarouselPagination, type CarouselPaginationProps, Cell, type CellProps, type CellState, type CellType, Checkbox, type CheckboxProps, Chip, type ChipProps, CollapsedSidebarLogo, type CollapsedSidebarLogoProps, ConfigurationCard, type ConfigurationCardProps, ConfigurationCardRow, type ConfigurationCardRowProps, type ConfigurationCardVariant, ContentCard, type ContentCardProps, ContentPrimitives, type ContentPrimitivesProps, type ContentPrimitivesType, DOORSTEP_DELIVERY_IMAGE, type DataRowCell, DataRows, type DataRowsProps, type DataRowsState, type DataRowsVariant, DateTimePicker, type DateTimePickerProps, type DateTimePickerType, type DesktopDropdownVariant, DesktopDropdowns, type DesktopDropdownsProps, type DesktopMenuOptionState, type DesktopMenuOptionType, DesktopMenuOptions, type DesktopMenuOptionsProps, DesktopMetricCard, type DesktopMetricCardProps, DesktopProgressIndicator, type DesktopProgressIndicatorProps, type DesktopProgressIndicatorVariant, DesktopSegmentControl, type DesktopSegmentControlItem, type DesktopSegmentControlProps, type DesktopSegmentControlVariant, DurationLabel, type DurationLabelProps, type DurationLabelStatus, type DurationLabelVariant, EmptyState, type EmptyStateProps, type EmptyStateSize, type EmptyStateType, ExtraLargeModal, type ExtraLargeModalProps, FeaturedIcon, type FeaturedIconColor, type FeaturedIconProps, type FeaturedIconSize, FileUpload, FileUploadCard, type FileUploadCardProps, type FileUploadCardStatus, type FileUploadProps, type FilterGroupDimension, Flag, type FlagProps, FooterFrame, type FooterFrameProps, type FooterFrameVariant, FormDemarcator, GroupedInput, type GroupedInputProps, type GroupedInputVariant, HoverTip, type HoverTipProps, InputField, type InputFieldProps, type InputFieldVariant, InputGroup, type InputGroupProps, InputSection, type InputSectionProps, LAST_UPDATED_COLUMN, LargeModal, type LargeModalProps, type LargeModalVariant, LeadingInputFieldElement, type LeadingInputFieldElementProps, type LeadingInputFieldElementVariant, LetaLogo, type LetaLogoProps, ListGroup, type ListGroupProps, type ListItemData, ListSection, type ListSectionProps, LoadingOverlay, type LoadingOverlayProps, MAP_ROUTE_DRIVEN, MAP_ROUTE_PLANNED, MapIcon, type MapIconProps, type MapIconVariant, MapLegend, type MapLegendEntry, type MapLegendProps, MapSearchInput, type MapSearchInputProps, MapView, type MapViewProps, MapZoomControl, type MapZoomControlProps, type MetricCardState, type MetricVariance, MobileBadge, type MobileBadgeColor, type MobileBadgeProps, type MobileBadgeVariant, MobileChip, type MobileChipProps, MobileDropdown, type MobileDropdownOption, type MobileDropdownProps, MobileFeaturedIcon, type MobileFeaturedIconColor, type MobileFeaturedIconProps, type MobileFeaturedIconSize, type MobileFeaturedIconVariant, MobileFileUpload, type MobileFileUploadImage, type MobileFileUploadProps, MobileMapSearchInput, type MobileMapSearchInputProps, type MobileMenuOptionState, type MobileMenuOptionType, MobileMenuOptions, type MobileMenuOptionsProps, MobileNavTab, type MobileNavTabProps, MobileSearchInput, type MobileSearchInputProps, MobileSegment, type MobileSegmentProps, ModalDialog, type ModalDialogProps, type ModalDialogVariant, ModalHeaders, type ModalHeadersProps, type ModalHeadersVariant, ModalShell, type ModalShellProps, NotificationBanner, type NotificationBannerProps, type NotificationBannerType, type NotificationBannerVariant, ORDER_TABLE_COLUMNS, ORDER_TABLE_COLUMNS_FINISHED, OptionCard, type OptionCardProps, type OptionCardState, Page, type PageProps, PageTab, type PageTabProps, PageTabsControl, type PageTabsControlItem, type PageTabsControlProps, type PageTabsControlVariant, type PageVariant, Pagination, type PaginationProps, type PaginationVariant, Placeholder, type PlaceholderProps, ProgressTracker, type ProgressTrackerProps, RadioButton, type RadioButtonProps, SCHEDULED_ORDER_COLUMNS, SIGNATURE_IMAGE, type ScrollEdges, SearchInput, type SearchInputProps, SegmentSwitcherTab, type SegmentSwitcherTabProps, Select, type SelectProps, SelectionControl, type SelectionControlProps, type SelectionControlVariant, Shortcut, type ShortcutProps, SideBar, type SideBarGroup, type SideBarItem, type SideBarProps, type SideBarVariant, Sidetab, type SidetabItem, type SidetabProps, Skeleton, type SkeletonProps, StackedCards, type StackedCardsProps, Stepper, StepperInput, type StepperInputProps, type StepperProps, type StepperVariant, Table, type TableColumn, type TableColumnRole, TableContainer, type TableContainerProps, type TableContainerVariant, TableDataControl, type TableDataControlProps, type TableDataControlVariant, type TableProps, type TableRow, TableSection, type TableSectionProps, Tag, type TagProps, TextArea, type TextAreaBasicProps, type TextAreaProps, type TextAreaRichProps, type TextAreaVariant, Title, type TitleProps, type TitleVariant, Toast, type ToastProps, type ToastType, Toggle, ToggleButton, type ToggleButtonProps, type ToggleProps, Tooltip, type TooltipPlatform, type TooltipPosition, type TooltipPositionInput, type TooltipProps, type TooltipRect, type TooltipSide, type TooltipVariant, TopBar, type TopBarProps, type TopBarVariant, TopFilter, type TopFilterProps, TopFilterSection, type TopFilterSectionItem, type TopFilterSectionProps, TrailingInputFieldElement, type TrailingInputFieldElementProps, type TrailingInputFieldElementVariant, UNASSIGNED_ORDER_COLUMNS, UserMenu, type UserMenuProps, type UserMenuState, ViewSwitcherTab, type ViewSwitcherTabProps, WizardTab, type WizardTabProps, animateScrollTop, computeTooltipPosition, downloadFile, htmlToPlainText, sanitizeRichText, useAccordion, useEscapeLayer, useRovingFocus, useScrollEdges, useScrollShadow };