@optimum-intelligence/opti-ui 0.7.1 → 0.7.3

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 (56) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/components/app-shell/AppShell.d.ts +12 -3
  3. package/dist/components/app-shell/AppShell.js +45 -26
  4. package/dist/components/app-shell/AppShell.js.map +1 -1
  5. package/dist/components/combobox/Combobox.d.ts +11 -2
  6. package/dist/components/combobox/Combobox.js +155 -118
  7. package/dist/components/combobox/Combobox.js.map +1 -1
  8. package/dist/components/data-table/DataTable.d.ts +25 -4
  9. package/dist/components/data-table/DataTable.js +238 -90
  10. package/dist/components/data-table/DataTable.js.map +1 -1
  11. package/dist/components/data-table/DataTableContent.d.ts +6 -1
  12. package/dist/components/data-table/DataTableContent.js +306 -409
  13. package/dist/components/data-table/DataTableContent.js.map +1 -1
  14. package/dist/components/data-table/DataTableFilters.d.ts +6 -1
  15. package/dist/components/data-table/DataTableFilters.js +65 -45
  16. package/dist/components/data-table/DataTableFilters.js.map +1 -1
  17. package/dist/components/data-table/DataTableRow.js +2 -0
  18. package/dist/components/data-table/DataTableRow.js.map +1 -1
  19. package/dist/components/data-table/types.d.ts +14 -1
  20. package/dist/components/data-table/useDataTable.js +2 -0
  21. package/dist/components/data-table/useDataTable.js.map +1 -1
  22. package/dist/components/drawer/Drawer.d.ts +7 -4
  23. package/dist/components/drawer/Drawer.js +2 -1
  24. package/dist/components/drawer/Drawer.js.map +1 -1
  25. package/dist/components/map/Map.d.ts +30 -6
  26. package/dist/components/map/Map.js +387 -271
  27. package/dist/components/map/Map.js.map +1 -1
  28. package/dist/components/stat-card/StatCard.d.ts +2 -2
  29. package/dist/components/stat-card/StatCard.js +1 -1
  30. package/dist/components/stat-card/StatCard.js.map +1 -1
  31. package/dist/components/stepper/Stepper.d.ts +7 -1
  32. package/dist/components/stepper/Stepper.js +46 -27
  33. package/dist/components/stepper/Stepper.js.map +1 -1
  34. package/dist/components/table/Table.d.ts +1 -1
  35. package/dist/components/table/Table.js +3 -1
  36. package/dist/components/table/Table.js.map +1 -1
  37. package/dist/components/tabs/Tabs.d.ts +4 -1
  38. package/dist/components/tabs/Tabs.js +33 -23
  39. package/dist/components/tabs/Tabs.js.map +1 -1
  40. package/dist/components/toggle/Toggle.d.ts +1 -1
  41. package/dist/components/toggle/Toggle.js.map +1 -1
  42. package/dist/components.json +109 -30
  43. package/dist/icons/index.d.ts +8 -0
  44. package/dist/icons/index.js +11 -1
  45. package/dist/icons/index.js.map +1 -1
  46. package/dist/index.js +2 -2
  47. package/dist/llms-full.txt +55 -20
  48. package/dist/llms.txt +8 -8
  49. package/dist/opti-ui.css +394 -29
  50. package/dist/utils/media.d.ts +4 -0
  51. package/dist/utils/media.js +34 -0
  52. package/dist/utils/media.js.map +1 -0
  53. package/dist/utils/scroll-fade.d.ts +9 -0
  54. package/dist/utils/scroll-fade.js +45 -0
  55. package/dist/utils/scroll-fade.js.map +1 -0
  56. package/package.json +1 -1
@@ -186,12 +186,17 @@ Also accepts all props of: `BaseCheckboxGroup.Props`.
186
186
  compound · Forms
187
187
 
188
188
  Searchable select. `<Combobox items={…} />` covers single and `multiple`
189
- (chips) selection; compose the parts for anything custom.
189
+ (chips) selection; `maxChips` keeps a multi-select on one line. Compose the
190
+ parts for anything custom.
190
191
 
191
192
  ```tsx
192
193
  import { Combobox } from '@optimum-intelligence/opti-ui';
193
194
  ```
194
195
 
196
+ ```tsx
197
+ <Combobox label="Vehicles" items={vehicles} multiple maxChips={1} placeholder="All vehicles" />
198
+ ```
199
+
195
200
  | Prop | Type | Default | Description |
196
201
  | --- | --- | --- | --- |
197
202
  | `items` | `ComboboxOption[]` | | Options to choose from. |
@@ -202,6 +207,7 @@ import { Combobox } from '@optimum-intelligence/opti-ui';
202
207
  | `emptyText?` | `React.ReactNode` | `'No results found.'` | Shown when the filter matches nothing. |
203
208
  | `size?` | `'sm' \| 'md' \| 'lg'` | `'md'` | Control height. |
204
209
  | `hideClear?` | `boolean` | | Hide the clear button. |
210
+ | `maxChips?` | `number` | | With `multiple`, show at most this many chips and a `+N` chip for the rest, keeping the field on one line (long labels are truncated). Leave unset to wrap all chips onto new lines. |
205
211
  | `inputProps?` | `BaseCombobox.Input.Props` | | Props for the text input. |
206
212
 
207
213
  Also accepts all props of: `RootProps`.
@@ -1035,7 +1041,7 @@ import { CardTitle } from '@optimum-intelligence/opti-ui';
1035
1041
 
1036
1042
  component · Layout
1037
1043
 
1038
- Responsive dashboard grid.
1044
+ Responsive dashboard grid: up to `columns` equal columns, fewer when its own width cannot fit them.
1039
1045
 
1040
1046
  ```tsx
1041
1047
  import { Grid } from '@optimum-intelligence/opti-ui';
@@ -1044,7 +1050,8 @@ import { Grid } from '@optimum-intelligence/opti-ui';
1044
1050
  | Prop | Type | Default | Description |
1045
1051
  | --- | --- | --- | --- |
1046
1052
  | `ref?` | `React.Ref<HTMLDivElement>` | | Ref to the grid element. |
1047
- | `columns?` | `1 \| 2 \| 3 \| 4 \| 5 \| 6` | `3` | Columns on wide screens; collapses to 2 below 1200px (for 4+) and 1 below 900px. |
1053
+ | `columns?` | `1 \| 2 \| 3 \| 4 \| 5 \| 6` | `3` | Most columns, shown while each can be at least `minItemWidth` wide. As the grid's own width runs out it steps down to half the columns (4 → 2, 6 → 3), then to as many as fit. With the defaults a 4–6 column KPI row keeps 2 columns on a phone. |
1054
+ | `minItemWidth?` | `string` | | Narrowest a column may get before the grid drops columns: any CSS length. Defaults to `12rem`; for 4–6 columns `11rem`, or `9rem` below 640px. Same as setting `--oui-grid-min-item-width`. |
1048
1055
  | `gap?` | `'sm' \| 'md' \| 'lg'` | `'md'` | Space between grid cells. |
1049
1056
 
1050
1057
  Also accepts all props of: `React.HTMLAttributes<HTMLDivElement>`.
@@ -1268,7 +1275,7 @@ Also accepts all props of: `useRender.ComponentProps<'div', StackState>`.
1268
1275
 
1269
1276
  component · Layout
1270
1277
 
1271
- KPI tile: label, large value, optional unit and trend.
1278
+ KPI tile: label, large value, optional unit and trend. Below 640px it turns compact (smaller value, no icon) to sit two to a row.
1272
1279
 
1273
1280
  ```tsx
1274
1281
  import { StatCard } from '@optimum-intelligence/opti-ui';
@@ -1286,7 +1293,7 @@ import { StatCard } from '@optimum-intelligence/opti-ui';
1286
1293
  | `trend?` | `'up' \| 'down' \| 'flat'` | | Arrow direction shown next to `delta`. |
1287
1294
  | `tone?` | `'positive' \| 'negative' \| 'neutral'` | | Color of the delta. Defaults to positive for `up`, negative for `down`. |
1288
1295
  | `hint?` | `React.ReactNode` | | Supporting text under the value. |
1289
- | `icon?` | `React.ReactNode` | | Icon tile shown in the top-right corner. |
1296
+ | `icon?` | `React.ReactNode` | | Icon tile shown in the top-right corner. Hidden below 640px, where the tile is compact. |
1290
1297
  | `loading?` | `boolean` | | Replaces the value with a skeleton while data loads. |
1291
1298
 
1292
1299
  Also accepts all props of: `useRender.ComponentProps<'div', CardState>`.
@@ -1539,7 +1546,7 @@ import { SegmentedControl } from '@optimum-intelligence/opti-ui';
1539
1546
  | Prop | Type | Default | Description |
1540
1547
  | --- | --- | --- | --- |
1541
1548
  | `size?` | `'sm' \| 'md'` | `'md'` | Segment height. |
1542
- | `variant?` | `'segmented' \| 'outline'` | | `segmented` renders a pill track like a tab switcher; `outline` separate buttons. |
1549
+ | `variant?` | `'segmented' \| 'outline'` | | `segmented` renders a pill track like a tab switcher, kept on one line; `outline` separate buttons, which wrap onto more rows when they do not fit. |
1543
1550
  | `fullWidth?` | `boolean` | | Stretch segments to fill the width. |
1544
1551
  | `options` | `SegmentedControlOption[]` | | Segments to show. |
1545
1552
  | `value?` | `string` | | Selected option `value` (controlled). |
@@ -1577,7 +1584,7 @@ import { ToggleGroup } from '@optimum-intelligence/opti-ui';
1577
1584
  | Prop | Type | Default | Description |
1578
1585
  | --- | --- | --- | --- |
1579
1586
  | `size?` | `'sm' \| 'md'` | `'md'` | Segment height. |
1580
- | `variant?` | `'segmented' \| 'outline'` | `'segmented'` | `segmented` renders a pill track like a tab switcher; `outline` separate buttons. |
1587
+ | `variant?` | `'segmented' \| 'outline'` | `'segmented'` | `segmented` renders a pill track like a tab switcher, kept on one line; `outline` separate buttons, which wrap onto more rows when they do not fit. |
1581
1588
  | `fullWidth?` | `boolean` | | Stretch segments to fill the width. |
1582
1589
 
1583
1590
  Also accepts all props of: `BaseToggleGroup.Props`.
@@ -1810,7 +1817,8 @@ Base UI `Dialog.createHandle` re-exported unchanged. See https://base-ui.com/rea
1810
1817
  component · Overlays
1811
1818
 
1812
1819
  Side panel for inspecting or editing a record without leaving the page:
1813
- pinned header, scrolling body, optional pinned footer. For a free-form
1820
+ pinned header, scrolling body, optional pinned footer. `side="bottom"` makes
1821
+ it a bottom sheet, for filters and actions on phones. For a free-form
1814
1822
  sheet use `Dialog.Content` with `placement`.
1815
1823
 
1816
1824
  ```tsx
@@ -1830,8 +1838,8 @@ import { Drawer } from '@optimum-intelligence/opti-ui';
1830
1838
  | `description?` | `React.ReactNode` | | Supporting text under the title. |
1831
1839
  | `actions?` | `React.ReactNode` | | Header content next to the close button (edit, delete, a menu…). |
1832
1840
  | `footer?` | `React.ReactNode` | | Pinned to the bottom, for form buttons. |
1833
- | `side?` | `'right' \| 'left'` | `'right'` | Edge the drawer slides in from. |
1834
- | `size?` | `'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Width: sm 24rem, md 32rem (default), lg 48rem, xl 60rem. Override with `--oui-drawer-width`. |
1841
+ | `side?` | `'right' \| 'left' \| 'bottom'` | `'right'` | Edge the drawer slides in from. A `bottom` sheet is full width, as tall as its content, up to 85% of the screen. |
1842
+ | `size?` | `'sm' \| 'md' \| 'lg' \| 'xl'` | `'md'` | Width of a side drawer: sm 24rem, md 32rem (default), lg 48rem, xl 60rem. Override with `--oui-drawer-width`. Ignored by `bottom`. |
1835
1843
  | `dismissible?` | `boolean` | `true` | Set to `false` to block Esc, outside clicks and the close button, e.g. while a form inside is saving. |
1836
1844
  | `modal?` | `boolean` | `true` | `false` leaves the page behind interactive and drops the backdrop. |
1837
1845
  | `backdropBlur?` | `'none' \| 'sm' \| 'md' \| 'lg'` | `'md'` | How strongly the page behind a modal drawer is blurred. Override the radius with `--oui-backdrop-blur`. |
@@ -2121,12 +2129,17 @@ Also accepts all props of: `Omit<React.HTMLAttributes<HTMLElement>, 'onChange'>`
2121
2129
 
2122
2130
  component · Disclosure & navigation
2123
2131
 
2124
- Progress through an ordered sequence: a wizard, a checkout, a background job's phases.
2132
+ Progress through an ordered sequence: a wizard, a checkout, a background job's phases. Below 640px a
2133
+ horizontal stepper turns compact: a segmented progress bar under the current step ("2/4 · Date").
2125
2134
 
2126
2135
  ```tsx
2127
2136
  import { Stepper } from '@optimum-intelligence/opti-ui';
2128
2137
  ```
2129
2138
 
2139
+ ```tsx
2140
+ <Stepper current={1} steps={[{ label: 'Vehicle' }, { label: 'Date' }, { label: 'Route' }, { label: 'Summary' }]} />
2141
+ ```
2142
+
2130
2143
  | Prop | Type | Default | Description |
2131
2144
  | --- | --- | --- | --- |
2132
2145
  | `ref?` | `React.Ref<HTMLOListElement>` | | Ref to the `<ol>` element. |
@@ -2142,7 +2155,8 @@ Also accepts all props of: `React.OlHTMLAttributes<HTMLOListElement>`.
2142
2155
 
2143
2156
  compound · Disclosure & navigation
2144
2157
 
2145
- `Tabs.Root` › `Tabs.List` › `Tabs.Tab`, then one `Tabs.Panel` per value.
2158
+ `Tabs.Root` › `Tabs.List` › `Tabs.Tab`, then one `Tabs.Panel` per value. A list wider than its
2159
+ container scrolls sideways, with its cut-off edge faded.
2146
2160
 
2147
2161
  ```tsx
2148
2162
  import { Tabs } from '@optimum-intelligence/opti-ui';
@@ -2261,8 +2275,12 @@ uncontrolled or controlled (`search` / `filterValues` / `sort` / `page` /
2261
2275
 
2262
2276
  For another layout, create the table with `useDataTable` and compose the
2263
2277
  parts: `DataTable.Root`, `DataTable.Toolbar`, `DataTable.Search`,
2264
- `DataTable.Filters`, `DataTable.Filter`, `DataTable.Actions`,
2265
- `DataTable.Summary`, `DataTable.Content`, `DataTable.Pagination`.
2278
+ `DataTable.Filters`, `DataTable.Filter`, `DataTable.FilterSheet` (the
2279
+ phone filter button and sheet), `DataTable.Actions`, `DataTable.Summary`,
2280
+ `DataTable.Content`, `DataTable.Pagination`.
2281
+
2282
+ On phones (below 640px) columns with `priority: 'low'` are hidden, and
2283
+ `stickyFirstColumn` keeps each row's name in view while the rest scrolls.
2266
2284
 
2267
2285
  ```tsx
2268
2286
  import { DataTable } from '@optimum-intelligence/opti-ui';
@@ -2274,12 +2292,13 @@ import { DataTable } from '@optimum-intelligence/opti-ui';
2274
2292
  | `maxHeight?` | `number \| string` | | Scrolls the rows inside this height and keeps the header in view. |
2275
2293
  | `virtualized?` | `boolean \| DataTableVirtualOptions` | | Renders only the rows in view, for thousands of rows without pagination. Rows are one line high: columns fit their longest value, so mark those with long text `truncate`. Scrolls inside `maxHeight` (default `32rem`). |
2276
2294
  | `onEndReached?` | `() => void` | | Called when the rows are scrolled near their end, once per row count: load and append the next rows. Needs `maxHeight` or `virtualized`. |
2295
+ | `stickyFirstColumn?` | `boolean` | | Keeps the first column (and the selection checkboxes) in place while the table scrolls sideways, so each row stays identifiable on narrow screens. |
2277
2296
  | `empty?` | `React.ReactNode` | | Replaces the default empty state. |
2278
2297
  | `tableProps?` | `Omit<TableProps, 'children'>` | | Props for the underlying `Table` (className, wrapperProps, aria-*). |
2279
2298
  | `pageSizeOptions?` | `number[]` | | Choices in the rows-per-page select. |
2280
2299
  | `controlSize?` | `'sm' \| 'md'` | | Size of the search box and the filters. |
2281
2300
  | `toolbar?` | `React.ReactNode \| ((context: DataTableToolbarContext<T>) => React.ReactNode)` | | Extra toolbar content (add, bulk actions…). A function receives the processed rows. |
2282
- | `showToolbar?` | `boolean` | `true` | `false` drops the search, filters, summary and toolbar content: rows only, for short tables under their own heading. |
2301
+ | `showToolbar?` | `boolean` | `true` | `false` drops the search, filters, summary and toolbar content: rows only, for short tables under their own heading. Below 640px the toolbar is the search and a "Filters (n)" button, whose bottom sheet holds the filters and the `toolbar` content, over a line with the row count and export. |
2283
2302
  | `exportName?` | `string` | | Adds an export button that saves the filtered, sorted rows as `<exportName>.csv`. Columns choose their text with `exportValue`. |
2284
2303
  | `fill?` | `boolean` | `false` | Grow to fill the height of a flex column container (a page, or a `Card` whose content holds the table); only the rows scroll. `maxHeight` still caps it. |
2285
2304
  | `className?` | `string` | | Class name for the table's root element. |
@@ -2321,6 +2340,7 @@ Every filter of the table, with a clear button while any is active. Children are
2321
2340
  | Prop | Type | Default | Description |
2322
2341
  | --- | --- | --- | --- |
2323
2342
  | `size?` | `'sm' \| 'md'` | | Control height of every filter. |
2343
+ | `stacked?` | `boolean` | | One filter per row at full width, chip rows and date ranges under their name: the layout of the filter sheet on phones. Leaves out the clear button, which the sheet keeps in its footer. |
2324
2344
 
2325
2345
  Also accepts all props of: `React.HTMLAttributes<HTMLDivElement>`.
2326
2346
 
@@ -2334,6 +2354,17 @@ The control of one filter: a dropdown, a toggle chip, a row of chips or a date r
2334
2354
  | `size?` | `'sm' \| 'md'` | | Control height. |
2335
2355
  | `className?` | `string` | | Class name for the filter control. |
2336
2356
 
2357
+ ### DataTable.FilterSheet
2358
+
2359
+ The phone toolbar's "Filters (n)" button, which opens a bottom sheet holding every filter and the
2360
+ `children`. Filters apply as they change. The footer keeps a clear button (disabled while no filter
2361
+ is set, so nothing moves when one is) and a button that closes the sheet on the result count.
2362
+
2363
+ | Prop | Type | Default | Description |
2364
+ | --- | --- | --- | --- |
2365
+ | `size?` | `'sm' \| 'md'` | `'md'` | Height of the filter button; the filters in the sheet are full size. |
2366
+ | `children?` | `React.ReactNode` | | Extra content placed under the filters (add, bulk actions…). |
2367
+
2337
2368
  ### DataTable.Actions
2338
2369
 
2339
2370
  Styled `<div>` (`.oui-data-table__actions`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes.
@@ -2352,6 +2383,7 @@ The table itself, with its loading, empty and error states.
2352
2383
  | `maxHeight?` | `number \| string` | | Scrolls the rows inside this height and keeps the header in view. |
2353
2384
  | `virtualized?` | `boolean \| DataTableVirtualOptions` | | Renders only the rows in view, for thousands of rows without pagination. Rows are one line high: columns fit their longest value, so mark those with long text `truncate`. Scrolls inside `maxHeight` (default `32rem`). |
2354
2385
  | `onEndReached?` | `() => void` | | Called when the rows are scrolled near their end, once per row count: load and append the next rows. Needs `maxHeight` or `virtualized`. |
2386
+ | `stickyFirstColumn?` | `boolean` | | Keeps the first column (and the selection checkboxes) in place while the table scrolls sideways, so each row stays identifiable on narrow screens. |
2355
2387
  | `empty?` | `React.ReactNode` | | Replaces the default empty state. |
2356
2388
  | `tableProps?` | `Omit<TableProps, 'children'>` | | Props for the underlying `Table` (className, wrapperProps, aria-*). |
2357
2389
 
@@ -2532,7 +2564,7 @@ Also accepts all props of: `React.HTMLAttributes<HTMLSpanElement>`.
2532
2564
 
2533
2565
  component · Feedback & data display
2534
2566
 
2535
- Styled HTML table inside a horizontally scrolling wrapper. Compose with `TableHeader`, `TableBody`,
2567
+ Styled HTML table inside a horizontally scrolling wrapper, whose cut-off edge fades. Compose with `TableHeader`, `TableBody`,
2536
2568
  `TableFooter`, `TableRow`, `TableHead`, `TableCell` and `TableCaption`. For search, filters, sorting
2537
2569
  and pagination use `DataTable` instead.
2538
2570
 
@@ -2769,7 +2801,7 @@ Small built-in stroke icon set. Every icon renders an `<svg>` that follows the f
2769
2801
  import { ArrowDownIcon } from '@optimum-intelligence/opti-ui';
2770
2802
  ```
2771
2803
 
2772
- Icons: `ArrowDownIcon`, `ArrowUpIcon`, `CalendarIcon`, `CheckIcon`, `ChevronDownIcon`, `ChevronLeftIcon`, `ChevronRightIcon`, `ChevronUpIcon`, `ChevronsLeftIcon`, `ChevronsRightIcon`, `ChevronsUpDownIcon`, `CircleCheckIcon`, `CircleIcon`, `CircleXIcon`, `ClockIcon`, `DownloadIcon`, `ExternalLinkIcon`, `EyeIcon`, `EyeOffIcon`, `FileIcon`, `InfoIcon`, `MenuIcon`, `MinusIcon`, `MoreHorizontalIcon`, `PencilIcon`, `PlusIcon`, `SearchIcon`, `TrashIcon`, `TrendingDownIcon`, `TrendingUpIcon`, `TriangleAlertIcon`, `UploadIcon`, `XIcon`
2804
+ Icons: `ArrowDownIcon`, `ArrowUpIcon`, `CalendarIcon`, `CheckIcon`, `ChevronDownIcon`, `ChevronLeftIcon`, `ChevronRightIcon`, `ChevronUpIcon`, `ChevronsLeftIcon`, `ChevronsRightIcon`, `ChevronsUpDownIcon`, `CircleCheckIcon`, `CircleIcon`, `CircleXIcon`, `ClockIcon`, `DownloadIcon`, `ExternalLinkIcon`, `EyeIcon`, `EyeOffIcon`, `FileIcon`, `FilterIcon`, `InfoIcon`, `LayersIcon`, `MenuIcon`, `MinusIcon`, `MoreHorizontalIcon`, `PencilIcon`, `PlusIcon`, `SearchIcon`, `TrashIcon`, `TrendingDownIcon`, `TrendingUpIcon`, `TriangleAlertIcon`, `UploadIcon`, `XIcon`
2773
2805
 
2774
2806
  | Prop | Type | Default | Description |
2775
2807
  | --- | --- | --- | --- |
@@ -2887,6 +2919,7 @@ strict Content-Security-Policy needs `worker-src blob:`.
2887
2919
  | `labels?` | `Partial<MapLabels>` | | Translations of the built-in texts; also passed to MapLibre's control strings. |
2888
2920
  | `controlsPosition?` | `ControlPosition \| false` | `'top-right'` | Corner of the zoom buttons, or `false` to hide them. |
2889
2921
  | `expandable?` | `boolean` | `false` | Adds a button, next to the zoom buttons, that expands the map over the whole window (not browser fullscreen) above the page, at the dialog z-index. Escape or the button returns it. |
2922
+ | `attributionCollapsed?` | `boolean` | `false` | Starts the attribution as the small info button, opened with a tap, instead of showing the full text until the map is first dragged. For small maps and phones; check the tile provider's terms first. |
2890
2923
  | `className?` | `string` | | Classes for the map container. Set its height in CSS (`--oui-map-height`, default 24rem). |
2891
2924
  | `style?` | `React.CSSProperties` | | Inline styles for the map container. |
2892
2925
  | `children?` | `React.ReactNode` | | Data parts (`Map.Routes`, `Map.Areas`, …), markers, popups and overlays. |
@@ -3010,7 +3043,7 @@ Content floating over a corner of the map: stat cards, selects, a legend or `Map
3010
3043
  | Prop | Type | Default | Description |
3011
3044
  | --- | --- | --- | --- |
3012
3045
  | `ref?` | `React.Ref<HTMLDivElement>` | | Ref to the overlay element. |
3013
- | `position?` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right'` | `'top-left'` | Corner the overlay sits in. Overlays in the same corner as the zoom buttons cover them. |
3046
+ | `position?` | `'top-left' \| 'top-right' \| 'bottom-left' \| 'bottom-right'` | `'top-left'` | Corner the overlay sits in. Its empty area lets clicks through to the map and controls under it. |
3014
3047
 
3015
3048
  Also accepts all props of: `React.HTMLAttributes<HTMLDivElement>`.
3016
3049
 
@@ -3039,18 +3072,20 @@ works outside the map; inside `Map.Root` it takes the root's labels. Put it in a
3039
3072
  | `onSelectedIdsChange?` | `(ids: string[]) => void` | | Called with the new selected ids. |
3040
3073
  | `onVisibilityChange?` | `(ids: string[], visible: boolean) => void` | | Called with the ids to show or hide. Adds an eye button to every entry. |
3041
3074
  | `showAllToggle?` | `boolean` | `false` | Adds a show all / hide all button when `onVisibilityChange` is set. |
3075
+ | `size?` | `'sm' \| 'md'` | `'md'` | `sm` packs the entries tighter, with smaller swatches and text, for small maps and phones. Either size scrolls past `--oui-map-legend-max-height` (`sm`: 10rem, `md`: none). |
3042
3076
 
3043
3077
  Also accepts all props of: `Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>`.
3044
3078
 
3045
3079
  ### Map.BaseLayerSwitch
3046
3080
 
3047
- Segmented switch between the root's `baseLayers` (e.g. streets and satellite). Put it in a `Map.Overlay`.
3081
+ Switch between the root's `baseLayers` (e.g. streets and satellite): a segmented switch, or with
3082
+ `variant="icon"` a single button that cycles them. Put it in a `Map.Overlay`.
3048
3083
 
3049
3084
  | Prop | Type | Default | Description |
3050
3085
  | --- | --- | --- | --- |
3051
3086
  | `size?` | `'sm' \| 'md'` | `'sm'` | Segment height. |
3052
- | `variant?` | `'segmented' \| 'outline'` | | `segmented` renders a pill track like a tab switcher; `outline` separate buttons. |
3053
3087
  | `fullWidth?` | `boolean` | | Stretch segments to fill the width. |
3088
+ | `variant?` | `'segmented' \| 'outline' \| 'icon'` | `'segmented'` | `segmented` (or `outline`) shows every base map by name. `icon` is one small layers button that moves to the next base map on each press, for small maps and phones; its name says which one is shown. |
3054
3089
 
3055
3090
  Also accepts all props of: `BaseToggleGroup.Props`.
3056
3091
 
package/dist/llms.txt CHANGED
@@ -47,7 +47,7 @@ so the components work in Next.js App Router.
47
47
  - `Calendar` — Month grid for picking one day. Keyboard: arrows move by day / week, Home / End jump within the week, PageUp / PageDown change month (with Shift: year). The month and year in the title open a list to jump straight to another one. With `granularity="month"` or `"year"` it shows a month or year grid instead.
48
48
  - `Checkbox` — Checkbox with optional `label` and `description`. Supports `indeterminate`.
49
49
  - `CheckboxGroup` — Manages the checked values of several `Checkbox` children (`value` / `onValueChange`).
50
- - `Combobox` — Searchable select. `<Combobox items={…} />` covers single and `multiple` (chips) selection; compose the parts for anything custom. (parts: Root, InputGroup, Input, Trigger, Clear, Value, Chips, Chip, Content, List, Item, Empty, Group, GroupLabel, Collection, useFilter)
50
+ - `Combobox` — Searchable select. `<Combobox items={…} />` covers single and `multiple` (chips) selection; `maxChips` keeps a multi-select on one line. Compose the parts for anything custom. (parts: Root, InputGroup, Input, Trigger, Clear, Value, Chips, Chip, Content, List, Item, Empty, Group, GroupLabel, Collection, useFilter)
51
51
  - `DateConfigProvider` — Sets default locale, time zone, week start and display formats for every date picker and calendar inside it. Props on a component still win. Nested providers override only the settings they pass.
52
52
  - `DatePicker` — Date field with a calendar popover. Day values are ISO dates (`"2026-03-09"`), the same format as `<input type="date">`. `granularity="month"` or `"year"` opens a month or year grid and stores the period's first day (`"2026-03-01"`); a time granularity behaves like `DateTimePicker`.
53
53
  - `DateRangePicker` — Date range field with a calendar popover and optional presets. Values are `{ start, end }` ISO dates (`"2026-03-09"`), both inclusive. With `granularity="month"` or `"year"` it picks whole months or years, and each end is the first day of its period.
@@ -86,7 +86,7 @@ so the components work in Next.js App Router.
86
86
  - `CardFooter` — Styled `<div>` (`.oui-card__footer`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes. (parts: displayName)
87
87
  - `CardHeader` — Styled `<div>` (`.oui-card__header`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes. (parts: displayName)
88
88
  - `CardTitle` — Styled `<h3>` (`.oui-card__title`). Accepts `className`, `style`, the `render` prop and all `<h3>` attributes. (parts: displayName)
89
- - `Grid` — Responsive dashboard grid.
89
+ - `Grid` — Responsive dashboard grid: up to `columns` equal columns, fewer when its own width cannot fit them.
90
90
  - `Navbar` — Collapsible side navigation. Use inside `AppShell`. Compose with `NavbarHeader` (`NavbarBrand`), `NavbarSection` (`NavbarSectionLabel`, `NavbarItem`) and `NavbarFooter`.
91
91
  - `NavbarBrand` — Logo, title and subtitle block for the top of a `Navbar`.
92
92
  - `NavbarFooter` — Styled `<div>` (`.oui-navbar__footer`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes. (parts: displayName)
@@ -99,7 +99,7 @@ so the components work in Next.js App Router.
99
99
  - `ScrollArea` — Scroll container with slim, themed overlay scrollbars. Set a height or max-height.
100
100
  - `Separator` — Thin divider line. Set `orientation="vertical"` for a vertical rule.
101
101
  - `Stack` — Flex container that spaces its children evenly, in a column or a row.
102
- - `StatCard` — KPI tile: label, large value, optional unit and trend.
102
+ - `StatCard` — KPI tile: label, large value, optional unit and trend. Below 640px it turns compact (smaller value, no icon) to sit two to a row.
103
103
 
104
104
  ## Typography
105
105
 
@@ -126,7 +126,7 @@ so the components work in Next.js App Router.
126
126
  - `ConfirmDialog` — Asks before an action runs: title, description, cancel and confirm buttons, a pending state that keeps the dialog open, and room for the error. For other layouts compose `AlertDialog`.
127
127
  - `createToastManager` — Base UI `Toast.createToastManager` re-exported unchanged. See https://base-ui.com/react/components/toast.
128
128
  - `Dialog` — Modal dialog and side sheet. Compose: `Dialog.Root` › `Dialog.Trigger` + `Dialog.Content` › `Dialog.Header` (`Title`, `Description`), `Dialog.Body`, `Dialog.Footer`. Use `render={<Button />}` on `Dialog.Trigger` / `Dialog.Close` to style them as buttons. (parts: Root, Trigger, Content, Header, Title, Description, Body, Footer, Close, createHandle)
129
- - `Drawer` — Side panel for inspecting or editing a record without leaving the page: pinned header, scrolling body, optional pinned footer. For a free-form sheet use `Dialog.Content` with `placement`.
129
+ - `Drawer` — Side panel for inspecting or editing a record without leaving the page: pinned header, scrolling body, optional pinned footer. `side="bottom"` makes it a bottom sheet, for filters and actions on phones. For a free-form sheet use `Dialog.Content` with `placement`.
130
130
  - `Popover` — Floating panel anchored to a trigger, for small forms, filters and details. (parts: Root, Trigger, Content, Title, Description, Close)
131
131
  - `PreviewCard` — Card that appears when a link is hovered or focused, previewing what is behind it. `PreviewCard.Trigger` is the link itself. Keep the content supplementary: touch users never see it. (parts: Root, Trigger, Content)
132
132
  - `ToastProvider` — Mount once near the app root. Then call `useToast()` anywhere below, or pass a `toastManager` from `createToastManager()` to trigger toasts outside React.
@@ -141,8 +141,8 @@ so the components work in Next.js App Router.
141
141
  - `Collapsible` — A single section that shows and hides: advanced options, "show more", filter groups. (parts: Root, Trigger, Panel)
142
142
  - `getPageItems` — Page numbers to render, with `'gap'` where pages are skipped.
143
143
  - `Pagination` — Controlled page navigation with an optional rows-per-page select.
144
- - `Stepper` — Progress through an ordered sequence: a wizard, a checkout, a background job's phases.
145
- - `Tabs` — `Tabs.Root` › `Tabs.List` › `Tabs.Tab`, then one `Tabs.Panel` per value. (parts: Root, List, Tab, Panel)
144
+ - `Stepper` — Progress through an ordered sequence: a wizard, a checkout, a background job's phases. Below 640px a horizontal stepper turns compact: a segmented progress bar under the current step ("2/4 · Date").
145
+ - `Tabs` — `Tabs.Root` › `Tabs.List` › `Tabs.Tab`, then one `Tabs.Panel` per value. A list wider than its container scrolls sideways, with its cut-off edge faded. (parts: Root, List, Tab, Panel)
146
146
 
147
147
  ## Feedback & data display
148
148
 
@@ -150,7 +150,7 @@ so the components work in Next.js App Router.
150
150
  - `Avatar` — User or entity picture with initials fallback.
151
151
  - `AvatarGroup` — Overlapping row of `Avatar` children, with an optional "+N" overflow counter.
152
152
  - `Badge` — Small status label.
153
- - `DataTable` — `<DataTable data={…} columns={…} />` renders a complete table with search, filters, sorting, pagination, row selection, row actions and inline editing; columns declare what they take part in. Every piece of state works uncontrolled or controlled (`search` / `filterValues` / `sort` / `page` / `selection`), and with `mode="server"` the same state drives an API. (parts: Root, Toolbar, Search, Filters, Filter, Actions, Summary, Content, Pagination)
153
+ - `DataTable` — `<DataTable data={…} columns={…} />` renders a complete table with search, filters, sorting, pagination, row selection, row actions and inline editing; columns declare what they take part in. Every piece of state works uncontrolled or controlled (`search` / `filterValues` / `sort` / `page` / `selection`), and with `mode="server"` the same state drives an API. (parts: Root, Toolbar, Search, Filters, Filter, FilterSheet, Actions, Summary, Content, Pagination)
154
154
  - `DescriptionItem` — One label and value pair inside a `DescriptionList`.
155
155
  - `DescriptionList` — Label and value pairs, such as a record's details. Holds `DescriptionItem`s.
156
156
  - `EmptyState` — Placeholder for empty lists, searches without results and first-run screens.
@@ -159,7 +159,7 @@ so the components work in Next.js App Router.
159
159
  - `Skeleton` — Pulsing placeholder for content that is still loading.
160
160
  - `SkeletonText` — Skeleton placeholder shaped like a paragraph; the last line is shorter.
161
161
  - `Spinner` — Indeterminate loading indicator that follows `currentColor`.
162
- - `Table` — Styled HTML table inside a horizontally scrolling wrapper. Compose with `TableHeader`, `TableBody`, `TableFooter`, `TableRow`, `TableHead`, `TableCell` and `TableCaption`. For search, filters, sorting and pagination use `DataTable` instead.
162
+ - `Table` — Styled HTML table inside a horizontally scrolling wrapper, whose cut-off edge fades. Compose with `TableHeader`, `TableBody`, `TableFooter`, `TableRow`, `TableHead`, `TableCell` and `TableCaption`. For search, filters, sorting and pagination use `DataTable` instead.
163
163
  - `TableBody` — Styled `<tbody>` (`.oui-table__body`). Accepts `className`, `style`, the `render` prop and all `<tbody>` attributes. (parts: displayName)
164
164
  - `TableCaption` — Styled `<caption>` (`.oui-table__caption`). Accepts `className`, `style`, the `render` prop and all `<caption>` attributes. (parts: displayName)
165
165
  - `TableCell` — Body cell (`<td>`). `numeric` right-aligns and uses tabular figures.