twico-ui 1.11.0 → 1.12.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.
package/dist/index.d.cts CHANGED
@@ -205,6 +205,18 @@ type Sx = React.CSSProperties & {
205
205
  [selector: string]: React.CSSProperties[keyof React.CSSProperties] | string | number | Sx | undefined;
206
206
  };
207
207
 
208
+ /**
209
+ * Props mixin for the components that accept the {@link Sx} escape hatch (#221). The sx-capable
210
+ * set is exactly the primitives that render a **single styleable root element**: `Box`, `Stack`,
211
+ * `Grid`, `Container` (layout), `Text`, `Heading` (typography), and `Card`. Multi-element
212
+ * composites (Input, Select, Combobox, MultiSelect, Dialog, …) intentionally omit `sx` because a
213
+ * single style target is ambiguous there — they would need an explicit per-slot API. See docs/sx.md.
214
+ */
215
+ interface WithSx {
216
+ /** Style escape hatch: flat CSS goes inline (wins over the base style); nested selectors/at-rules compile to a scoped stylesheet. See {@link Sx}. */
217
+ sx?: Sx;
218
+ }
219
+
208
220
  // ── Polymorphic component type kit ────────────────────────────────────────────
209
221
  // Powers the `as`-driven primitives (Box, Stack, Grid, Container, Text, Heading).
210
222
  // Passing `as="a"` narrows the accepted props to that element's attributes (href,
@@ -1505,6 +1517,8 @@ interface ColorPickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "o
1505
1517
  alpha?: boolean;
1506
1518
  /** Color intent for the focus/open accent. @default "primary" */
1507
1519
  tone?: Tone;
1520
+ /** Control size. @default "md" */
1521
+ size?: "sm" | "md" | "lg";
1508
1522
  onChange?: (hex: string) => void;
1509
1523
  }
1510
1524
 
@@ -1745,6 +1759,9 @@ interface DatatableProps<T = any> extends Omit<React.HTMLAttributes<HTMLDivEleme
1745
1759
  * This prop is the initial state — when enabled, users can hide/show the column from the toolbar's
1746
1760
  * **Columns** panel ("Row number"). @default false */
1747
1761
  rowNumbers?: boolean;
1762
+ /** Restrict the toolbar quick-search to these column `field`s (client mode); defaults to every
1763
+ * visible column. Mirrors `runDatatableQuery`'s `options.searchFields`. */
1764
+ searchFields?: string[];
1748
1765
  /**
1749
1766
  * Actions shown in the toolbar when one or more rows are selected (requires
1750
1767
  * `checkboxSelection`). Each handler receives the selected keys, the resolved
@@ -1919,8 +1936,12 @@ interface DatatableQuery {
1919
1936
  }
1920
1937
 
1921
1938
  interface DatatableColumn<T = any> {
1922
- /** Row object key (also the sort/filter key). */
1939
+ /** Row object key (also the default sort/filter/search/group/export key). */
1923
1940
  field: string;
1941
+ /** Derive the column's value from the whole row (nested/computed) — drives sort, filter,
1942
+ * quick-search, grouping, aggregation, the default cell render, and export. Falls back to
1943
+ * `row[field]` when omitted. Inline edits still write to the raw `field`. */
1944
+ valueGetter?: (row: T) => unknown;
1924
1945
  /** Header label. @default field ("Actions" for actions columns) */
1925
1946
  headerName?: string;
1926
1947
  /** Data type. "actions" renders per-row action buttons via getActions. @default "string" */
@@ -2018,6 +2039,161 @@ declare function runDatatableQuery<T = any>(
2018
2039
  options?: { columns?: DatatableColumn<T>[]; searchFields?: string[] }
2019
2040
  ): { rows: T[]; total: number; filtered: T[] };
2020
2041
 
2042
+ /** A single sort clause — the field to sort on and the direction. */
2043
+ interface CardGridSort {
2044
+ field: string;
2045
+ dir: "asc" | "desc";
2046
+ }
2047
+
2048
+ /** A normalized filter clause (same shape Datatable emits/consumes). */
2049
+ interface CardGridFilter {
2050
+ field: string;
2051
+ op: string;
2052
+ value: unknown;
2053
+ }
2054
+
2055
+ /** The query object emitted to `onServerChange` — identical to Datatable's server query (minus columns). */
2056
+ interface CardGridQuery {
2057
+ page: number;
2058
+ pageSize: number;
2059
+ sort: CardGridSort | null;
2060
+ filters: CardGridFilter[];
2061
+ quickFilter: string;
2062
+ }
2063
+
2064
+ /** An entry for the built-in sort control. */
2065
+ interface CardGridSortOption {
2066
+ field: string;
2067
+ label?: React.ReactNode;
2068
+ /** Compare numerically instead of lexically. */
2069
+ type?: "number" | "string";
2070
+ }
2071
+
2072
+ /**
2073
+ * Paginated card grid — the card analogue of Datatable's `serverMode`. Turns
2074
+ * page/sort/filter/search into a query and renders one card per row via `renderCard`,
2075
+ * with built-in pagination, loading, and empty states. In client mode it applies the
2076
+ * query locally with Datatable's exact semantics; in `serverMode` it emits the query
2077
+ * and consumes `{ rows, rowCount }`, so a page can toggle table/card views on one model.
2078
+ *
2079
+ * @startingPoint section="Data display" subtitle="Server-mode card grid" viewport="900x520"
2080
+ */
2081
+ interface CardGridProps<Row = any> extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
2082
+ /** The rows: the full set in client mode, or the current page in `serverMode`. */
2083
+ rows?: Row[];
2084
+ /** Render one card for a row. Required. */
2085
+ renderCard: (row: Row, index: number) => React.ReactNode;
2086
+ /** Stable key per row: a field name or an accessor. @default "id" */
2087
+ rowKey?: string | ((row: Row) => React.Key);
2088
+ /** Min card width for the responsive auto-fill grid (Grid `minChildWidth`). @default "18rem" */
2089
+ minChildWidth?: string | number;
2090
+ /** Fixed column count (responsive object allowed); overrides `minChildWidth` when set. */
2091
+ columns?: number | Record<string, number>;
2092
+ /** Grid gap on the token scale. @default 4 */
2093
+ gap?: number | string;
2094
+ /** Cards per page (0 disables pagination). @default 12 */
2095
+ pageSize?: number;
2096
+ /** Options for the "per page" selector. @default [12, 24, 48, 96] */
2097
+ pageSizeOptions?: number[];
2098
+ /** Controlled 0-based page. */
2099
+ page?: number;
2100
+ /** Initial 0-based page when uncontrolled. @default 0 */
2101
+ defaultPage?: number;
2102
+ onPageChange?: (page: number) => void;
2103
+ onPageSizeChange?: (pageSize: number) => void;
2104
+ /** Show the "per page" selector in the footer. @default true */
2105
+ showPageSize?: boolean;
2106
+ /** Emit a query and consume `rows`/`rowCount`/`loading` instead of filtering locally. @default false */
2107
+ serverMode?: boolean;
2108
+ /** Total row count for pagination in `serverMode`. */
2109
+ rowCount?: number;
2110
+ /** Show the loading overlay (and dim the grid). @default false */
2111
+ loading?: boolean;
2112
+ /** Called (debounced) with the query whenever page/sort/filter/search changes. */
2113
+ onServerChange?: (query: CardGridQuery) => void;
2114
+ /** External filter clauses (e.g. from a FilterBar) applied in client mode / passed through in server mode. @default [] */
2115
+ filters?: CardGridFilter[];
2116
+ /** Controlled quick-search string. */
2117
+ quickFilter?: string;
2118
+ /** Initial quick-search string when uncontrolled. @default "" */
2119
+ defaultQuickFilter?: string;
2120
+ onQuickFilterChange?: (value: string) => void;
2121
+ /** Render a built-in search box in the toolbar. @default false */
2122
+ searchable?: boolean;
2123
+ /** Fields scanned by quick search in client mode (defaults to the first row's keys). */
2124
+ searchFields?: string[];
2125
+ searchPlaceholder?: string;
2126
+ /** Controlled sort clause. */
2127
+ sort?: CardGridSort | null;
2128
+ /** Initial sort clause when uncontrolled. @default null */
2129
+ defaultSort?: CardGridSort | null;
2130
+ onSortChange?: (sort: CardGridSort | null) => void;
2131
+ /** Fields offered by the built-in sort control (renders it when provided). */
2132
+ sortOptions?: CardGridSortOption[];
2133
+ /** Extra node rendered in the toolbar row (before the sort control). */
2134
+ toolbar?: React.ReactNode;
2135
+ /** Shown when there are no rows and not loading. @default "No results." */
2136
+ emptyState?: React.ReactNode;
2137
+ /** Optional heading above the grid. */
2138
+ label?: React.ReactNode;
2139
+ }
2140
+
2141
+ declare function CardGrid<Row = any>(props: CardGridProps<Row>): React.JSX.Element;
2142
+
2143
+ /** The classification of a paired row. */
2144
+ type DiffOp = "added" | "removed" | "modified" | "moved" | "unchanged";
2145
+
2146
+ /** A column definition for DiffTable. */
2147
+ interface DiffTableColumn<Row = any> {
2148
+ /** Row property this column reads (also its React key). */
2149
+ field: string;
2150
+ /** Header label; defaults to `field`. */
2151
+ headerName?: React.ReactNode;
2152
+ /** Custom value accessor; defaults to `row[field]`. */
2153
+ valueGetter?: (row: Row) => unknown;
2154
+ /** Format a value for display; defaults to `String(value)`. */
2155
+ valueFormatter?: (value: any) => React.ReactNode;
2156
+ /** Per-column equality override (return true when the two values are equal). */
2157
+ compare?: (a: any, b: any) => boolean;
2158
+ }
2159
+
2160
+ /**
2161
+ * Row + field-level comparison of two datasets. Pairs rows from `from` and `to`
2162
+ * on `rowKey`, classifies each **added / removed / modified / moved**, and renders
2163
+ * modified rows as per-cell `before → after` (strikethrough old, accented new). Shows
2164
+ * an op badge per row, a `+N ~M -K` summary, and an "only changed" toggle.
2165
+ *
2166
+ * @startingPoint section="Data display" subtitle="Compare two datasets" viewport="900x420"
2167
+ */
2168
+ interface DiffTableProps<Row = any> extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
2169
+ /** The "before" rows (version A). */
2170
+ from?: Row[];
2171
+ /** The "after" rows (version B). */
2172
+ to?: Row[];
2173
+ /** Stable business key per row, used to pair A↔B. Defaults to `row.id`. */
2174
+ rowKey?: (row: Row) => React.Key;
2175
+ /** Columns to compare and render. */
2176
+ columns?: DiffTableColumn<Row>[];
2177
+ /** Hide unchanged rows (the toggle's initial state). @default true */
2178
+ onlyChanged?: boolean;
2179
+ /** Render the "only changed" toggle. @default true */
2180
+ showToggle?: boolean;
2181
+ /** Render the +added ~modified -removed summary badges. @default true */
2182
+ showSummary?: boolean;
2183
+ /** Classify same-value rows whose position changed as "moved" (minimal LIS-based set). @default true */
2184
+ moveDetection?: boolean;
2185
+ /** Global equality override for all fields (return true when equal). Falls back to `===` then JSON compare. */
2186
+ compare?: (a: any, b: any, field: string) => boolean;
2187
+ /** Shown when there are no rows to display. @default "No differences." */
2188
+ emptyState?: React.ReactNode;
2189
+ /** Label for the "only changed" toggle. @default "Only changed" */
2190
+ toggleLabel?: React.ReactNode;
2191
+ /** Optional heading above the table. */
2192
+ label?: React.ReactNode;
2193
+ }
2194
+
2195
+ declare function DiffTable<Row = any>(props: DiffTableProps<Row>): React.JSX.Element;
2196
+
2021
2197
  /**
2022
2198
  * Date picker with a calendar popover — month/year navigation, a month grid,
2023
2199
  * today highlight, min/max bounds, clearable value, and custom formatting.
@@ -2042,9 +2218,13 @@ interface DatePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "on
2042
2218
  min?: Date;
2043
2219
  /** Latest selectable date. */
2044
2220
  max?: Date;
2221
+ /** Predicate to disable arbitrary dates (return true to disable). Composes with `min`/`max`. */
2222
+ disabledDate?: (date: Date) => boolean;
2045
2223
  disabled?: boolean;
2046
2224
  /** Color intent for the focus/open accent. @default "primary" */
2047
2225
  tone?: Tone;
2226
+ /** Control size. @default "md" */
2227
+ size?: "sm" | "md" | "lg";
2048
2228
  /** Show a clear (×) button when a date is set. @default true */
2049
2229
  clearable?: boolean;
2050
2230
  /** Render the trigger as a typeable text input with a trailing calendar toggle; typed text commits via `parse` on Enter/blur. @default false */
@@ -2087,8 +2267,11 @@ interface DateRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>
2087
2267
  /** Uncontrolled initial range. @default { start: null, end: null } */
2088
2268
  defaultValue?: DateRange;
2089
2269
  placeholder?: string;
2090
- /** Show the quick-preset column. @default true */
2091
- presets?: boolean;
2270
+ /** Quick-preset column: `true` for the built-in rolling-day presets (Last 7/14/30/90), `false` to
2271
+ * hide it, or a custom array of `{ label, range }` where `range` is a `DateRange` or a
2272
+ * `() => DateRange` resolved at click time (for calendar-aligned presets like This month / YTD).
2273
+ * @default true */
2274
+ presets?: boolean | Array<{ label: string; range: DateRange | (() => DateRange) }>;
2092
2275
  /** BCP-47 locale for month/weekday names + date formatting (Intl). Omit for the runtime default. @default undefined */
2093
2276
  locale?: string;
2094
2277
  /** First day of week: 0 = Sunday … 6 = Saturday. @default 0 */
@@ -2103,6 +2286,12 @@ interface DateRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>
2103
2286
  disabled?: boolean;
2104
2287
  /** Color intent for the focus/open accent. @default "primary" */
2105
2288
  tone?: Tone;
2289
+ /** Control size. @default "md" */
2290
+ size?: "sm" | "md" | "lg";
2291
+ /** Show a clear (×) button when a range is set; clicking it resets both endpoints. @default true */
2292
+ clearable?: boolean;
2293
+ /** Custom display formatter for the range (defaults to a localized "start – end"). With `editable`, keep it compatible with `parse` so the text round-trips. */
2294
+ format?: (range: DateRange) => string;
2106
2295
  /** Render the trigger as a typeable input accepting "start – end"; typed text commits via `parse` on Enter/blur. @default false */
2107
2296
  editable?: boolean;
2108
2297
  /** Parse one side of the typed range into a Date (used when `editable`). Return a `Date` to accept, `null`/invalid to reject. Defaults to a lenient `Date.parse`. */
@@ -2112,6 +2301,267 @@ interface DateRangePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>
2112
2301
 
2113
2302
  declare function DateRangePicker(props: DateRangePickerProps): React.JSX.Element;
2114
2303
 
2304
+ /**
2305
+ * Time-of-day picker with a column-spinner popover — scrollable hour/minute
2306
+ * (optional second) columns plus an AM/PM column in 12-hour mode. Emits a `Date`
2307
+ * (date part from `referenceDate`/the current value, time part from the selection)
2308
+ * so it composes with DatePicker into a DateTimePicker. Min/max bound the
2309
+ * time-of-day; clearable value, optional typed entry, custom formatting.
2310
+ *
2311
+ * @startingPoint section="Inputs" subtitle="Time-of-day picker" viewport="700x120"
2312
+ */
2313
+ interface TimePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
2314
+ /** Field label rendered above the control. */
2315
+ label?: React.ReactNode;
2316
+ /** Helper text shown below when there is no error. */
2317
+ hint?: React.ReactNode;
2318
+ /** Error message — turns the field red and replaces the hint. */
2319
+ error?: React.ReactNode;
2320
+ /** Marks the field required (adds an asterisk to the label). @default false */
2321
+ required?: boolean;
2322
+ /** Controlled selected time as a Date (or null). */
2323
+ value?: Date | null;
2324
+ /** Uncontrolled initial time. @default null */
2325
+ defaultValue?: Date | null;
2326
+ placeholder?: string;
2327
+ /** Earliest selectable time-of-day (only H:M:S are compared). */
2328
+ min?: Date;
2329
+ /** Latest selectable time-of-day (only H:M:S are compared). */
2330
+ max?: Date;
2331
+ /** Increment (minutes) for the minute column. @default 5 */
2332
+ minuteStep?: number;
2333
+ /** Increment (seconds) for the second column (when `granularity="second"`). @default 5 */
2334
+ secondStep?: number;
2335
+ /** Which columns show: hour only, hour+minute, or hour+minute+second. @default "minute" */
2336
+ granularity?: "hour" | "minute" | "second";
2337
+ /** 24-hour columns or 12-hour columns with an AM/PM column. @default 24 */
2338
+ hourCycle?: 12 | 24;
2339
+ /** Date whose Y/M/D is used for the emitted Date when no value is set yet. @default today */
2340
+ referenceDate?: Date;
2341
+ disabled?: boolean;
2342
+ /** Color intent for the focus/open accent. @default "primary" */
2343
+ tone?: Tone;
2344
+ /** Control size. @default "md" */
2345
+ size?: "sm" | "md" | "lg";
2346
+ /** Show a clear (×) button when a time is set. @default true */
2347
+ clearable?: boolean;
2348
+ /** Render the trigger as a typeable text input with a trailing toggle; typed text commits via `parse` on Enter/blur. @default false */
2349
+ editable?: boolean;
2350
+ /** Parse typed text into a Date (used when `editable`). Return a `Date` to commit, `null`/invalid to revert. Defaults to an `HH:MM[:SS] [am/pm]` matcher. */
2351
+ parse?: (text: string) => Date | null;
2352
+ /** Custom display formatter (defaults to a localized time honoring `hourCycle`/`granularity`). */
2353
+ format?: (date: Date) => string;
2354
+ /** BCP-47 locale for time formatting (Intl). Omit for the runtime default. @default undefined */
2355
+ locale?: string;
2356
+ onChange?: (date: Date | null) => void;
2357
+ }
2358
+
2359
+ declare function TimePicker(props: TimePickerProps): React.JSX.Element;
2360
+
2361
+ /**
2362
+ * Combined date + time picker over a single `Date` value. Composes DatePicker
2363
+ * (calendar popover) and TimePicker (column spinner) side by side; picking a date
2364
+ * keeps the current time and vice-versa. `min`/`max` bound the date; the time is free.
2365
+ *
2366
+ * @startingPoint section="Inputs" subtitle="Date + time picker" viewport="700x140"
2367
+ */
2368
+ interface DateTimePickerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
2369
+ /** Field label rendered above the pair. */
2370
+ label?: React.ReactNode;
2371
+ /** Helper text shown below when there is no error. */
2372
+ hint?: React.ReactNode;
2373
+ /** Error message — recolors both controls and replaces the hint. */
2374
+ error?: React.ReactNode;
2375
+ /** Marks the field required (adds an asterisk to the label). @default false */
2376
+ required?: boolean;
2377
+ /** Controlled selected date-time (or null). */
2378
+ value?: Date | null;
2379
+ /** Uncontrolled initial date-time. @default null */
2380
+ defaultValue?: Date | null;
2381
+ disabled?: boolean;
2382
+ /** Color intent for the focus/open accent on both controls. @default "primary" */
2383
+ tone?: Tone;
2384
+ /** Control size for both. @default "md" */
2385
+ size?: "sm" | "md" | "lg";
2386
+ /** Show a clear (×) button on the date control (clears the whole value). @default true */
2387
+ clearable?: boolean;
2388
+ /** Earliest selectable date. */
2389
+ min?: Date;
2390
+ /** Latest selectable date. */
2391
+ max?: Date;
2392
+ /** Predicate to disable arbitrary dates (return true to disable). */
2393
+ disabledDate?: (date: Date) => boolean;
2394
+ /** Increment (minutes) for the minute column. @default 5 */
2395
+ minuteStep?: number;
2396
+ /** Increment (seconds) for the second column (when `granularity="second"`). @default 5 */
2397
+ secondStep?: number;
2398
+ /** Time granularity: hour only, hour+minute, or hour+minute+second. @default "minute" */
2399
+ granularity?: "hour" | "minute" | "second";
2400
+ /** 24-hour or 12-hour (AM/PM) time columns. @default 24 */
2401
+ hourCycle?: 12 | 24;
2402
+ /** BCP-47 locale for names + formatting (Intl). @default undefined */
2403
+ locale?: string;
2404
+ /** First day of week: 0 = Sunday … 6 = Saturday. @default 0 */
2405
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
2406
+ /** Custom formatter for the date control's display. */
2407
+ dateFormat?: (date: Date) => string;
2408
+ /** Custom formatter for the time control's display. */
2409
+ timeFormat?: (date: Date) => string;
2410
+ /** Placeholder for the date control. @default "Select date" */
2411
+ datePlaceholder?: string;
2412
+ /** Placeholder for the time control. @default "Time" */
2413
+ timePlaceholder?: string;
2414
+ onChange?: (date: Date | null) => void;
2415
+ }
2416
+
2417
+ declare function DateTimePicker(props: DateTimePickerProps): React.JSX.Element;
2418
+
2419
+ /**
2420
+ * Multi-select (MUI-Autocomplete style) — type directly among the chips to
2421
+ * filter; the overlay shows checkable options only. Supports grouped options
2422
+ * and two-line (title + subtitle) options. Backspace on empty input removes
2423
+ * the last chip.
2424
+ *
2425
+ * @startingPoint section="Selects" subtitle="Multi-select with chips & inline search" viewport="700x180"
2426
+ */
2427
+ interface MultiSelectProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "value" | "defaultValue" | "onChange"> {
2428
+ label?: React.ReactNode;
2429
+ hint?: React.ReactNode;
2430
+ error?: React.ReactNode;
2431
+ required?: boolean;
2432
+ /** Control height preset, matching Select/Combobox. @default "md" */
2433
+ size?: "sm" | "md" | "lg";
2434
+ /** Color intent for the focus/open accent. @default "primary" */
2435
+ tone?: Tone;
2436
+ placeholder?: string;
2437
+ /** Options — strings, {value,label,description}, or {group,options} groups. */
2438
+ options: Array<string | MultiSelectOption | MultiSelectGroup>;
2439
+ /** Controlled selected values. */
2440
+ value?: string[];
2441
+ /** Uncontrolled initial values. */
2442
+ defaultValue?: string[];
2443
+ /** Called with the full array of selected values (empty array when none/cleared). */
2444
+ onChange?: (values: string[]) => void;
2445
+ /** Show a clear-all (×) affix when at least one value is selected. @default false */
2446
+ clearable?: boolean;
2447
+ disabled?: boolean;
2448
+ /** Open the menu upward instead of down (e.g. near a viewport bottom). @default "bottom" */
2449
+ placement?: "bottom" | "top";
2450
+ /** Render the dropdown in a portal (position:fixed on document.body) so it is never clipped by a
2451
+ * scrolling/overflow-hidden ancestor; auto-flips up near the viewport bottom. Set false to render
2452
+ * inline. @default true */
2453
+ portal?: boolean;
2454
+ /** Minimum popover width in px when portaled (useful when the control is narrow). @default 0 */
2455
+ minWidth?: number;
2456
+ /** Show a loading row instead of the option list / empty state. @default false */
2457
+ loading?: boolean;
2458
+ /** Text shown when no options match. @default "No results found" */
2459
+ emptyText?: string;
2460
+ /** Fires with the raw typed query — drive a debounced remote fetch (pair with `loading` and
2461
+ * `filter={false}` so server-ranked results aren't re-filtered locally). */
2462
+ onInputChange?: (query: string) => void;
2463
+ /** `false` shows `options` as-is (server-ranked passthrough); a function replaces the default
2464
+ * label/description matcher. Omit for the built-in local filter. */
2465
+ filter?: boolean | ((option: MultiSelectOption, query: string) => boolean);
2466
+ /** Name for hidden form fields (one per selected value) for native form submission. */
2467
+ name?: string;
2468
+ /** Cap the number of selectable values; once reached, unselected options become disabled. */
2469
+ max?: number;
2470
+ /** Collapse chips after N into a "+K more" pill. */
2471
+ maxTagCount?: number;
2472
+ /** Virtualize the option list — render only the visible slice (plus `overscan`) for long lists. @default false */
2473
+ virtualized?: boolean;
2474
+ /** Extra option rows rendered above/below the viewport when `virtualized`, to smooth fast scrolling. @default 8 */
2475
+ overscan?: number;
2476
+ /** Composed with the field's open-on-focus behavior — your handler runs first. */
2477
+ onFocus?: React.FocusEventHandler<HTMLInputElement>;
2478
+ /** Composed with the field's keyboard navigation (Arrows/Enter/Escape/Backspace) — your handler runs first; call `event.preventDefault()` to suppress it. */
2479
+ onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
2480
+ }
2481
+
2482
+ /** Alias of the shared {@link Option} type (kept for backward-compatible imports). */
2483
+ type MultiSelectOption = Option;
2484
+
2485
+ /** Alias of the shared {@link OptionGroup} type (kept for backward-compatible imports). */
2486
+ type MultiSelectGroup = OptionGroup;
2487
+
2488
+ declare function MultiSelect(props: MultiSelectProps): React.JSX.Element;
2489
+
2490
+ /** The kinds of filter control a field can render. */
2491
+ type FilterFieldType = "multiselect" | "daterange" | "search" | "text" | "number" | "boolean" | "select";
2492
+
2493
+ /** A per-field value map keyed by `field`. Shape depends on the field's `type`. */
2494
+ type FilterValues = Record<string, any>;
2495
+
2496
+ /** One field in the filter schema. */
2497
+ interface FilterField {
2498
+ /** Data field key (also the React key and the clause `field`). */
2499
+ field: string;
2500
+ /** Visible label; defaults to `field`. */
2501
+ label?: React.ReactNode;
2502
+ /** Which control to render. */
2503
+ type: FilterFieldType;
2504
+ /** Options for `multiselect`/`select`. A function receives the current values for dependent/cascading options. */
2505
+ options?: Array<string | MultiSelectOption | MultiSelectGroup | Option> | ((values: FilterValues) => any[]);
2506
+ /** Placeholder for the control. */
2507
+ placeholder?: React.ReactNode;
2508
+ /** Operator emitted in the clause (overrides the per-type default, e.g. `text`→"contains", `number`→"="). */
2509
+ op?: string;
2510
+ /** Disable just this field. */
2511
+ disabled?: boolean;
2512
+ /** Enable type-to-filter for a `select` field. */
2513
+ searchable?: boolean;
2514
+ /** Portal the `select` popover (escape clipping ancestors). */
2515
+ portal?: boolean;
2516
+ /** Labels for a `boolean` field's three states. */
2517
+ anyLabel?: React.ReactNode;
2518
+ trueLabel?: React.ReactNode;
2519
+ falseLabel?: React.ReactNode;
2520
+ }
2521
+
2522
+ /** A normalized filter clause emitted to `onChange`. */
2523
+ interface FilterClause {
2524
+ field: string;
2525
+ op: string;
2526
+ value: unknown;
2527
+ }
2528
+
2529
+ /**
2530
+ * Schema-driven faceted filter bar. Renders a row of controls from a `fields`
2531
+ * schema (multi-select, date-range, search/text, number, boolean, select), and
2532
+ * emits a **normalized clause list** `[{ field, op, value }]` (`isAnyOf`, `>=`/`<`,
2533
+ * `contains`, `=`). Optional per-field clear ✕ and a "Clear all (N)" action; options
2534
+ * can be a function of the current values for dependent/cascading facets.
2535
+ *
2536
+ * @startingPoint section="Inputs" subtitle="Schema-driven filter bar" viewport="900x160"
2537
+ */
2538
+ interface FilterBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
2539
+ /** The filter schema — one entry per facet. */
2540
+ fields: FilterField[];
2541
+ /** Controlled clause list (the same shape emitted by `onChange`). */
2542
+ value?: FilterClause[];
2543
+ /** Uncontrolled initial clause list. @default [] */
2544
+ defaultValue?: FilterClause[];
2545
+ /** Fires with the normalized clause list whenever any field changes. */
2546
+ onChange?: (clauses: FilterClause[]) => void;
2547
+ /** Also fires with the raw per-field value map (convenience for rehydrating controls). */
2548
+ onValuesChange?: (values: FilterValues) => void;
2549
+ /** Render a "Clear all (N)" action. @default false */
2550
+ showClearAll?: boolean;
2551
+ /** Label for the clear-all button. @default "Clear all" */
2552
+ clearAllLabel?: React.ReactNode;
2553
+ /** Show a per-field clear ✕ next to each active field's label. @default true */
2554
+ showFieldClear?: boolean;
2555
+ /** Control size for every field. @default "md" */
2556
+ size?: "sm" | "md" | "lg";
2557
+ /** Accent tone forwarded to the date-range control. @default "primary" */
2558
+ tone?: Tone;
2559
+ /** Disable the whole bar. @default false */
2560
+ disabled?: boolean;
2561
+ }
2562
+
2563
+ declare function FilterBar(props: FilterBarProps): React.JSX.Element;
2564
+
2115
2565
  /**
2116
2566
  * Modal dialog with scrim, pop-in animation, Esc-to-close, and backdrop close.
2117
2567
  * Render conditionally and drive with `open` + `onClose`.
@@ -2250,6 +2700,8 @@ interface FileUploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "on
2250
2700
  /** Allow selecting multiple files. @default false */
2251
2701
  multiple?: boolean;
2252
2702
  disabled?: boolean;
2703
+ /** Control size — scales the dropzone padding. @default "md" */
2704
+ size?: "sm" | "md" | "lg";
2253
2705
  /** Color intent for the focus/open accent. @default "primary" */
2254
2706
  tone?: Tone;
2255
2707
  /** Field label rendered above the dropzone. */
@@ -2416,71 +2868,6 @@ interface ListProps extends React.HTMLAttributes<HTMLUListElement> {
2416
2868
 
2417
2869
  declare function List(props: ListProps): React.JSX.Element;
2418
2870
 
2419
- /**
2420
- * Multi-select (MUI-Autocomplete style) — type directly among the chips to
2421
- * filter; the overlay shows checkable options only. Supports grouped options
2422
- * and two-line (title + subtitle) options. Backspace on empty input removes
2423
- * the last chip.
2424
- *
2425
- * @startingPoint section="Selects" subtitle="Multi-select with chips & inline search" viewport="700x180"
2426
- */
2427
- interface MultiSelectProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "value" | "defaultValue" | "onChange"> {
2428
- label?: React.ReactNode;
2429
- hint?: React.ReactNode;
2430
- error?: React.ReactNode;
2431
- required?: boolean;
2432
- /** Control height preset, matching Select/Combobox. @default "md" */
2433
- size?: "sm" | "md" | "lg";
2434
- /** Color intent for the focus/open accent. @default "primary" */
2435
- tone?: Tone;
2436
- placeholder?: string;
2437
- /** Options — strings, {value,label,description}, or {group,options} groups. */
2438
- options: Array<string | MultiSelectOption | MultiSelectGroup>;
2439
- /** Controlled selected values. */
2440
- value?: string[];
2441
- /** Uncontrolled initial values. */
2442
- defaultValue?: string[];
2443
- /** Called with the full array of selected values (empty array when none/cleared). */
2444
- onChange?: (values: string[]) => void;
2445
- /** Show a clear-all (×) affix when at least one value is selected. @default false */
2446
- clearable?: boolean;
2447
- disabled?: boolean;
2448
- /** Open the menu upward instead of down (e.g. near a viewport bottom). @default "bottom" */
2449
- placement?: "bottom" | "top";
2450
- /** Render the dropdown in a portal (position:fixed on document.body) so it is never clipped by a
2451
- * scrolling/overflow-hidden ancestor; auto-flips up near the viewport bottom. Set false to render
2452
- * inline. @default true */
2453
- portal?: boolean;
2454
- /** Minimum popover width in px when portaled (useful when the control is narrow). @default 0 */
2455
- minWidth?: number;
2456
- /** Show a loading row instead of the option list / empty state. @default false */
2457
- loading?: boolean;
2458
- /** Text shown when no options match. @default "No results found" */
2459
- emptyText?: string;
2460
- /** Name for hidden form fields (one per selected value) for native form submission. */
2461
- name?: string;
2462
- /** Cap the number of selectable values; once reached, unselected options become disabled. */
2463
- max?: number;
2464
- /** Collapse chips after N into a "+K more" pill. */
2465
- maxTagCount?: number;
2466
- /** Virtualize the option list — render only the visible slice (plus `overscan`) for long lists. @default false */
2467
- virtualized?: boolean;
2468
- /** Extra option rows rendered above/below the viewport when `virtualized`, to smooth fast scrolling. @default 8 */
2469
- overscan?: number;
2470
- /** Composed with the field's open-on-focus behavior — your handler runs first. */
2471
- onFocus?: React.FocusEventHandler<HTMLInputElement>;
2472
- /** Composed with the field's keyboard navigation (Arrows/Enter/Escape/Backspace) — your handler runs first; call `event.preventDefault()` to suppress it. */
2473
- onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
2474
- }
2475
-
2476
- /** Alias of the shared {@link Option} type (kept for backward-compatible imports). */
2477
- type MultiSelectOption = Option;
2478
-
2479
- /** Alias of the shared {@link OptionGroup} type (kept for backward-compatible imports). */
2480
- type MultiSelectGroup = OptionGroup;
2481
-
2482
- declare function MultiSelect(props: MultiSelectProps): React.JSX.Element;
2483
-
2484
2871
  interface NavbarLink {
2485
2872
  label: React.ReactNode;
2486
2873
  href?: string;
@@ -2870,6 +3257,8 @@ interface SliderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChan
2870
3257
  defaultValue?: number | [number, number];
2871
3258
  /** Force dual-thumb range mode even without a tuple value (defaults the range to [min, max]). @default false */
2872
3259
  range?: boolean;
3260
+ /** Control size — scales the track, rail, and thumb. @default "md" */
3261
+ size?: "sm" | "md" | "lg";
2873
3262
  /** @default 0 */
2874
3263
  min?: number;
2875
3264
  /** @default 100 */
@@ -2904,10 +3293,10 @@ declare function Slider(props: SliderProps): React.JSX.Element;
2904
3293
  interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement> {
2905
3294
  /** @default "md" */
2906
3295
  size?: "sm" | "md" | "lg" | "xl";
2907
- /** Color. Wins over `tone` when both are set. @default "current" — inherits currentColor (visible inside buttons, themed). */
2908
- color?: "current" | Tone | "white";
2909
- /** Color. @deprecated since 1.4, removed in 2.0 — use `color`. @default "current" — inherits currentColor (visible inside buttons, themed). */
3296
+ /** Colour intent; wins over `color` when both are set. @default "current" — inherits currentColor (visible inside buttons, themed). */
2910
3297
  tone?: "current" | Tone | "white";
3298
+ /** Colour intent. @deprecated removed in 2.0 — use `tone` (matches every other tone-driven component). @default "current" */
3299
+ color?: "current" | Tone | "white";
2911
3300
  /** Accessible label. @default "Loading" */
2912
3301
  label?: string;
2913
3302
  }
@@ -3424,8 +3813,18 @@ interface GridOwnProps {
3424
3813
  rowGap?: number | string;
3425
3814
  /** Column gap — falls back to `gap`. */
3426
3815
  columnGap?: number | string;
3816
+ /** Aligns each cell's content on the block (row) axis → `align-items`. */
3427
3817
  align?: React.CSSProperties["alignItems"];
3818
+ /**
3819
+ * Aligns each cell's content on the inline (column) axis → `justify-items`. Prefer the
3820
+ * explicit `justifyItems`; this stays as its backward-compatible alias.
3821
+ *
3822
+ * ⚠️ On **Grid** `justify` = `justify-items` (per-cell), but on **Stack** `justify` =
3823
+ * `justify-content` (distribution). For content distribution on a Grid, use `justifyContent`.
3824
+ */
3428
3825
  justify?: React.CSSProperties["justifyItems"];
3826
+ /** Aligns each cell's content on the inline axis → `justify-items` (the explicit name for `justify`; wins over it). */
3827
+ justifyItems?: React.CSSProperties["justifyItems"];
3429
3828
  /** Distribute the grid's rows within extra block space. */
3430
3829
  alignContent?: React.CSSProperties["alignContent"];
3431
3830
  /** Distribute the grid's columns within extra inline space. */
@@ -3449,7 +3848,14 @@ interface StackOwnProps {
3449
3848
  direction?: "row" | "column" | "row-reverse" | "column-reverse";
3450
3849
  /** Gap as a spacing-scale step (number) or any CSS length. @default 4 */
3451
3850
  gap?: number | string;
3851
+ /** Aligns children on the cross axis → `align-items`. */
3452
3852
  align?: React.CSSProperties["alignItems"];
3853
+ /**
3854
+ * Distributes children on the main axis → `justify-content` (e.g. `"space-between"`).
3855
+ *
3856
+ * ⚠️ Note the divergence: on **Grid** `justify` = `justify-items` (per-cell), not
3857
+ * `justify-content` — flex has no `justify-items`, so Stack's `justify` had to be content.
3858
+ */
3453
3859
  justify?: React.CSSProperties["justifyContent"];
3454
3860
  /** Wrap children. @default false */
3455
3861
  wrap?: boolean;
@@ -3732,4 +4138,4 @@ declare function useFocusTrap<T extends HTMLElement = HTMLElement>(
3732
4138
  */
3733
4139
  declare function usePortal(): (node: React.ReactNode) => React.ReactPortal | React.ReactNode | null;
3734
4140
 
3735
- export { Accordion, type AccordionItem, type AccordionProps, type ActionTone, Alert, type AlertProps, Anchor, type AnchorProps, AppShell, type AppShellProps, Avatar, AvatarMenu, type AvatarMenuProps, type AvatarProps, Badge, type BadgeProps, type BarTone, Box, type BoxOwnProps, type BoxProps, Boxplot, type BoxplotDatum, type BoxplotProps, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, BubbleChart, type BubbleChartProps, Button, type ButtonProps, Candlestick, type CandlestickDatum, type CandlestickProps, Card, type CardProps, Carousel, type CarouselProps, Chart, type ChartDatum, type ChartProps, Checkbox, type CheckboxProps, Code, type CodeProps, ColorPicker, type ColorPickerProps, ColorSchemeScript, type ColorSchemeScriptOptions, type ColorSchemeScriptProps, Combobox, type ComboboxGroup, type ComboboxOption, type ComboboxProps, type Command, CommandPalette, type CommandPaletteProps, Container, type ContainerOwnProps, type ContainerProps, Currency, CurrencyField, type CurrencyFieldProps, type CurrencyOption, type CurrencyProps, Datatable, type DatatableBatchAction, type DatatableColumn, type DatatableFilter, type DatatableFilterOp, type DatatableNumberOp, type DatatableProps, type DatatableQuery, type DatatableRowAction, type DatatableStringOp, DatePicker, type DatePickerProps, type DateRange, DateRangePicker, type DateRangePickerProps, Dialog, type DialogProps, Divider, type DividerProps, DonutChart, type DonutChartDatum, type DonutChartProps, Drawer, type DrawerProps, EmptyState, type EmptyStateProps, Field, type FieldProps, FileUpload, type FileUploadProps, Form, type FormProps, FunnelChart, type FunnelChartProps, type FunnelDatum, Gauge, type GaugeProps, type GaugeSeries, Grid, type GridOwnProps, type GridProps, Heading, type HeadingOwnProps, type HeadingProps, type HeadingSize, Heatmap, type HeatmapDatum, type HeatmapProps, IconButton, type IconButtonProps, Image, type ImageProps, Input, type InputProps, Kanban, type KanbanCard, type KanbanColumn, type KanbanProps, Kbd, type KbdProps, Label, type LabelProps, List, type ListItemData, type ListProps, Menu, type MenuItemDef, type MenuProps, MultiSelect, type MultiSelectGroup, type MultiSelectOption, type MultiSelectProps, Navbar, type NavbarLink, type NavbarProps, type Option, type OptionGroup, Pagination, type PaginationProps, PieChart, type PieChartDatum, type PieChartProps, PolarAreaChart, type PolarAreaChartProps, type PolarAreaDatum, type PolymorphicAs, type PolymorphicComponent, type PolymorphicProps, type PolymorphicPropsWithRef, type PolymorphicRef, Popover, type PopoverProps, Portal, type PortalProps, Pre, type PreProps, Progress, type ProgressProps, RadarChart, type RadarChartProps, type RadarDatum, Radio, RadioGroup, type RadioGroupOption, type RadioGroupProps, type RadioProps, RangeChart, type RangeChartProps, type RangeDatum, Rating, type RatingProps, type ResponsiveColumns, ScatterChart, type ScatterChartProps, type ScatterPoint, type ScatterSeries, Select, type SelectGroup, type SelectOption, type SelectProps, Sidebar, type SidebarItem, type SidebarProps, Skeleton, type SkeletonProps, Slider, type SliderProps, Sparkline, type SparklineDatum, type SparklineProps, Spinner, type SpinnerProps, Stack, type StackOwnProps, type StackProps, Stat, type StatProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, type Sx, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Tag, type TagProps, Text, type TextOwnProps, type TextProps, type TextTone, Textarea, type TextareaProps, type Theme, ThemeProvider, type ThemeProviderProps, type ThemeTokens, Timeline, type TimelineItem, type TimelineProps, Toast, type ToastApi, type ToastOptions, type ToastProps, ToastProvider, type ToastProviderProps, type ToastTone, ToastViewport, type ToastViewportProps, type Tone, Tooltip, type TooltipProps, type TreeNode, TreeView, type TreeViewProps, Treemap, type TreemapDatum, type TreemapProps, TwicoProvider, type TwicoProviderProps, type UseColorSchemeOptions, type UseFocusTrapOptions, type UseKeyPressOptions, type UseMediaQueryOptions, VisuallyHidden, type VisuallyHiddenProps, createTheme, getColorSchemeScript, runDatatableQuery, useClickOutside, useColorScheme, useControllableState, useCopyToClipboard, useDebouncedCallback, useDebouncedValue, useDisclosure, useEventListener, useFocusTrap, useHover, useId, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyPress, useLocalStorage, useMediaQuery, useMounted, usePortal, usePrefersReducedMotion, usePrevious, useScrollLock, useTimeout, useToast, useToggle, useWindowSize };
4141
+ export { Accordion, type AccordionItem, type AccordionProps, type ActionTone, Alert, type AlertProps, Anchor, type AnchorProps, AppShell, type AppShellProps, Avatar, AvatarMenu, type AvatarMenuProps, type AvatarProps, Badge, type BadgeProps, type BarTone, Box, type BoxOwnProps, type BoxProps, Boxplot, type BoxplotDatum, type BoxplotProps, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, BubbleChart, type BubbleChartProps, Button, type ButtonProps, Candlestick, type CandlestickDatum, type CandlestickProps, Card, CardGrid, type CardGridFilter, type CardGridProps, type CardGridQuery, type CardGridSort, type CardGridSortOption, type CardProps, Carousel, type CarouselProps, Chart, type ChartDatum, type ChartProps, Checkbox, type CheckboxProps, Code, type CodeProps, ColorPicker, type ColorPickerProps, ColorSchemeScript, type ColorSchemeScriptOptions, type ColorSchemeScriptProps, Combobox, type ComboboxGroup, type ComboboxOption, type ComboboxProps, type Command, CommandPalette, type CommandPaletteProps, Container, type ContainerOwnProps, type ContainerProps, Currency, CurrencyField, type CurrencyFieldProps, type CurrencyOption, type CurrencyProps, Datatable, type DatatableBatchAction, type DatatableColumn, type DatatableFilter, type DatatableFilterOp, type DatatableNumberOp, type DatatableProps, type DatatableQuery, type DatatableRowAction, type DatatableStringOp, DatePicker, type DatePickerProps, type DateRange, DateRangePicker, type DateRangePickerProps, DateTimePicker, type DateTimePickerProps, Dialog, type DialogProps, type DiffOp, DiffTable, type DiffTableColumn, type DiffTableProps, Divider, type DividerProps, DonutChart, type DonutChartDatum, type DonutChartProps, Drawer, type DrawerProps, EmptyState, type EmptyStateProps, Field, type FieldProps, FileUpload, type FileUploadProps, FilterBar, type FilterBarProps, type FilterClause, type FilterField, type FilterFieldType, type FilterValues, Form, type FormProps, FunnelChart, type FunnelChartProps, type FunnelDatum, Gauge, type GaugeProps, type GaugeSeries, Grid, type GridOwnProps, type GridProps, Heading, type HeadingOwnProps, type HeadingProps, type HeadingSize, Heatmap, type HeatmapDatum, type HeatmapProps, IconButton, type IconButtonProps, Image, type ImageProps, Input, type InputProps, Kanban, type KanbanCard, type KanbanColumn, type KanbanProps, Kbd, type KbdProps, Label, type LabelProps, List, type ListItemData, type ListProps, Menu, type MenuItemDef, type MenuProps, MultiSelect, type MultiSelectGroup, type MultiSelectOption, type MultiSelectProps, Navbar, type NavbarLink, type NavbarProps, type Option, type OptionGroup, Pagination, type PaginationProps, PieChart, type PieChartDatum, type PieChartProps, PolarAreaChart, type PolarAreaChartProps, type PolarAreaDatum, type PolymorphicAs, type PolymorphicComponent, type PolymorphicProps, type PolymorphicPropsWithRef, type PolymorphicRef, Popover, type PopoverProps, Portal, type PortalProps, Pre, type PreProps, Progress, type ProgressProps, RadarChart, type RadarChartProps, type RadarDatum, Radio, RadioGroup, type RadioGroupOption, type RadioGroupProps, type RadioProps, RangeChart, type RangeChartProps, type RangeDatum, Rating, type RatingProps, type ResponsiveColumns, ScatterChart, type ScatterChartProps, type ScatterPoint, type ScatterSeries, Select, type SelectGroup, type SelectOption, type SelectProps, Sidebar, type SidebarItem, type SidebarProps, Skeleton, type SkeletonProps, Slider, type SliderProps, Sparkline, type SparklineDatum, type SparklineProps, Spinner, type SpinnerProps, Stack, type StackOwnProps, type StackProps, Stat, type StatProps, type Step, Stepper, type StepperProps, Switch, type SwitchProps, type Sx, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Tag, type TagProps, Text, type TextOwnProps, type TextProps, type TextTone, Textarea, type TextareaProps, type Theme, ThemeProvider, type ThemeProviderProps, type ThemeTokens, TimePicker, type TimePickerProps, Timeline, type TimelineItem, type TimelineProps, Toast, type ToastApi, type ToastOptions, type ToastProps, ToastProvider, type ToastProviderProps, type ToastTone, ToastViewport, type ToastViewportProps, type Tone, Tooltip, type TooltipProps, type TreeNode, TreeView, type TreeViewProps, Treemap, type TreemapDatum, type TreemapProps, TwicoProvider, type TwicoProviderProps, type UseColorSchemeOptions, type UseFocusTrapOptions, type UseKeyPressOptions, type UseMediaQueryOptions, VisuallyHidden, type VisuallyHiddenProps, type WithSx, createTheme, getColorSchemeScript, runDatatableQuery, useClickOutside, useColorScheme, useControllableState, useCopyToClipboard, useDebouncedCallback, useDebouncedValue, useDisclosure, useEventListener, useFocusTrap, useHover, useId, useIntersectionObserver, useInterval, useIsomorphicLayoutEffect, useKeyPress, useLocalStorage, useMediaQuery, useMounted, usePortal, usePrefersReducedMotion, usePrevious, useScrollLock, useTimeout, useToast, useToggle, useWindowSize };