@optimum-intelligence/opti-ui 0.4.0 → 0.5.1

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 (36) hide show
  1. package/README.md +9 -7
  2. package/dist/components/app-shell/AppShell.d.ts +75 -6
  3. package/dist/components/app-shell/AppShell.js +670 -185
  4. package/dist/components/app-shell/AppShell.js.map +1 -1
  5. package/dist/components/badge/Badge.d.ts +2 -4
  6. package/dist/components/badge/Badge.js +12 -29
  7. package/dist/components/badge/Badge.js.map +1 -1
  8. package/dist/components/calendar/Calendar.d.ts +19 -8
  9. package/dist/components/calendar/Calendar.js +285 -212
  10. package/dist/components/calendar/Calendar.js.map +1 -1
  11. package/dist/components/calendar/DateConfig.d.ts +37 -0
  12. package/dist/components/calendar/DateConfig.js +75 -0
  13. package/dist/components/calendar/DateConfig.js.map +1 -0
  14. package/dist/components/calendar/date-utils.d.ts +41 -6
  15. package/dist/components/calendar/date-utils.js +119 -20
  16. package/dist/components/calendar/date-utils.js.map +1 -1
  17. package/dist/components/data-table/DataTableContent.js +3 -3
  18. package/dist/components/data-table/DataTableContent.js.map +1 -1
  19. package/dist/components/date-picker/DatePicker.d.ts +33 -10
  20. package/dist/components/date-picker/DatePicker.js +315 -279
  21. package/dist/components/date-picker/DatePicker.js.map +1 -1
  22. package/dist/components/date-picker/DateRangePicker.d.ts +11 -4
  23. package/dist/components/date-picker/DateRangePicker.js +240 -206
  24. package/dist/components/date-picker/DateRangePicker.js.map +1 -1
  25. package/dist/components/date-picker/PickerField.js +1 -1
  26. package/dist/components/date-picker/PickerField.js.map +1 -1
  27. package/dist/components/table/Table.d.ts +1 -1
  28. package/dist/components/table/Table.js +2 -2
  29. package/dist/components/table/Table.js.map +1 -1
  30. package/dist/components.json +2023 -1864
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.js +4 -3
  33. package/dist/llms-full.txt +869 -752
  34. package/dist/llms.txt +37 -35
  35. package/dist/opti-ui.css +171 -81
  36. package/package.json +1 -1
package/dist/llms.txt CHANGED
@@ -41,9 +41,43 @@ so the components work in Next.js App Router.
41
41
  - `ThemeProvider` — Scopes a theme to its children. Popups opened inside are portalled into the provider so they pick up the same tokens.
42
42
  - `themeToStyle` — Converts a theme object into CSS custom properties for a `style` prop.
43
43
 
44
+ ## Forms
45
+
46
+ - `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.
47
+ - `Checkbox` — Checkbox with optional `label` and `description`. Supports `indeterminate`.
48
+ - `CheckboxGroup` — Manages the checked values of several `Checkbox` children (`value` / `onValueChange`).
49
+ - `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
+ - `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.
51
+ - `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`.
52
+ - `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.
53
+ - `DateTimePicker` — Date and time field. Values are UTC instants (`"2026-03-09T13:30:00Z"`) shown and edited in `timeZone` (the browser's by default) on a 24-hour clock, as `2026-03-09 14:30`. Values without an offset (`"2026-03-09T14:30"`) are read as wall-clock time in `timeZone`.
54
+ - `Dropzone` — Drop target that also opens the file browser on click, Enter or Space.
55
+ - `Field` — Field parts wire up labels, descriptions and validation for any control inside (Input, Select, Checkbox, Switch, NumberField…). (parts: Root, Label, Description, Error, Item, Validity)
56
+ - `Fieldset` — Groups related fields under a legend. (parts: Root, Legend)
57
+ - `FileItem` — One file in a list: name, size, upload progress or error, and a remove button.
58
+ - `FileUpload` — File field: a dropzone plus the list of chosen files. It only collects `File` objects; upload them yourself and report progress through `fileState`.
59
+ - `Form` — Form with Base UI validation wiring and vertical field spacing.
60
+ - `formatDate` — Formats a date or date-time the way the date pickers show it: ISO-style (`2026-03-09 14:30`) on a 24-hour clock by default, or with a custom `format`. Instants (`"2026-03-09T13:30:00Z"`) are shown in `timeZone`. Returns `""` for an invalid value.
61
+ - `formatFileSize` — `1536` → `"1.5 KB"`.
62
+ - `Input` — Text input, optionally with `startAdornment` / `endAdornment` inside the box. Use `TextField` for a labelled one.
63
+ - `NumberField` — Numeric input with stepper buttons, locale formatting and keyboard stepping.
64
+ - `PasswordField` — Labelled password input with description and error message.
65
+ - `PasswordInput` — Password input with a button that reveals the value.
66
+ - `Radio` — Radio button with optional `label` and `description`. Use inside `RadioGroup`; each needs a `value`.
67
+ - `RadioGroup` — Single-choice group for `Radio` children (`value` / `onValueChange`).
68
+ - `RangeCalendar` — Month grid for picking a range of days: the first pick sets one end, the second completes the range (in either order). Same keyboard as Calendar. Disabled days cannot be picked as an end but may fall inside a range.
69
+ - `SearchInput` — Text input with a search icon and a clear button that appears once there is a value.
70
+ - `Select` — `<Select items={…} />` renders a complete labelled select. For full control compose the parts: `Select.Root`, `Select.Trigger`, `Select.Content`, `Select.Item`, `Select.Group`, `Select.GroupLabel`, `Select.Separator`. (parts: Root, Label, Trigger, Value, Content, Item, Group, GroupLabel, Separator)
71
+ - `Slider` — Single value or range (pass an array) slider.
72
+ - `Switch` — On/off switch with optional `label` and `description`.
73
+ - `Textarea` — Multi-line text input. Use `TextareaField` for a labelled one.
74
+ - `TextareaField` — Labelled textarea with description and error message.
75
+ - `TextField` — Labelled input with description and error message.
76
+ - `useDateConfig` — The date settings from the nearest `DateConfigProvider`. Spread it into `formatDate` options to format dates the same way the pickers do.
77
+
44
78
  ## Layout
45
79
 
46
- - `AppShell` — Full-height layout with a fixed navbar and an internally scrolling main area. Below 900px the navbar moves into a slide-in drawer. Customize width with `--oui-navbar-width` and `--oui-navbar-collapsed-width`.
80
+ - `AppShell` — Full-height layout with a fixed navbar and an internally scrolling main area. Below 900px the navbar moves into a slide-in drawer, and `NavbarItem`s marked `pinned` show in a tab bar (see `mobileNavPosition`). Customize width with `--oui-navbar-width` and `--oui-navbar-collapsed-width`.
47
81
  - `Card` — Surface that groups related content. Compose with `CardHeader` (`CardTitle`, `CardDescription`, `CardActions`), `CardContent` and `CardFooter`.
48
82
  - `CardActions` — Right-aligned slot inside CardHeader for icon buttons or menus. (parts: displayName)
49
83
  - `CardContent` — Styled `<div>` (`.oui-card__content`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes. (parts: displayName)
@@ -55,8 +89,9 @@ so the components work in Next.js App Router.
55
89
  - `Navbar` — Collapsible side navigation. Use inside `AppShell`. Compose with `NavbarHeader` (`NavbarBrand`), `NavbarSection` (`NavbarSectionLabel`, `NavbarItem`) and `NavbarFooter`.
56
90
  - `NavbarBrand` — Logo, title and subtitle block for the top of a `Navbar`.
57
91
  - `NavbarFooter` — Styled `<div>` (`.oui-navbar__footer`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes. (parts: displayName)
92
+ - `NavbarGroup` — Expandable parent row in a `Navbar` with nested `NavbarItem` sub-links. Place it in a `NavbarSection` next to other items. On a collapsed rail the sub-links are hidden and the parent shows as active when one of them is; the hover peek shows the full tree.
58
93
  - `NavbarHeader` — Styled `<div>` (`.oui-navbar__header`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes. (parts: displayName)
59
- - `NavbarItem` — Navigation link. Renders an `<a>`; use `render={<Link to="…" />}` for a router link or `render={<button />}` for an action.
94
+ - `NavbarItem` — Navigation link. Renders an `<a>`; use `render={<Link to="…" />}` for a router link or `render={<button />}` for an action. Inside a `NavbarGroup` it becomes an indented sub-link.
60
95
  - `NavbarSection` — Styled `<div>` (`.oui-navbar__section`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes. (parts: displayName)
61
96
  - `NavbarSectionLabel` — Styled `<div>` (`.oui-navbar__section-label`). Accepts `className`, `style`, the `render` prop and all `<div>` attributes. (parts: displayName)
62
97
  - `PageHeader` — Page title block with optional breadcrumbs, eyebrow, description and actions.
@@ -83,39 +118,6 @@ so the components work in Next.js App Router.
83
118
  - `ToggleGroup` — Group of `Toggle` buttons that share selection state (single or multiple).
84
119
  - `Toolbar` — Row of controls that is a single tab stop; arrow keys move between them. Other controls join through `render`: `<Toolbar.Button render={<Toggle />} />`, `<Toolbar.Button render={<Menu.Trigger />} />`. (parts: Root, Button, Link, Group, Separator, Input)
85
120
 
86
- ## Forms
87
-
88
- - `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.
89
- - `Checkbox` — Checkbox with optional `label` and `description`. Supports `indeterminate`.
90
- - `CheckboxGroup` — Manages the checked values of several `Checkbox` children (`value` / `onValueChange`).
91
- - `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)
92
- - `DatePicker` — Date field with a calendar popover. Values are ISO dates (`"2026-03-09"`), the same format as `<input type="date">`, and are shown the same way.
93
- - `DateRangePicker` — Date range field with a calendar popover and optional presets. Values are `{ start, end }` ISO dates (`"2026-03-09"`), both inclusive.
94
- - `DateTimePicker` — Date and time field. Values are local ISO date-times (`"2026-03-09T14:30"`), the same format as `<input type="datetime-local">`, shown as `2026-03-09 14:30:00` on a 24-hour clock whatever the locale.
95
- - `Dropzone` — Drop target that also opens the file browser on click, Enter or Space.
96
- - `Field` — Field parts wire up labels, descriptions and validation for any control inside (Input, Select, Checkbox, Switch, NumberField…). (parts: Root, Label, Description, Error, Item, Validity)
97
- - `Fieldset` — Groups related fields under a legend. (parts: Root, Legend)
98
- - `FileItem` — One file in a list: name, size, upload progress or error, and a remove button.
99
- - `FileUpload` — File field: a dropzone plus the list of chosen files. It only collects `File` objects; upload them yourself and report progress through `fileState`.
100
- - `Form` — Form with Base UI validation wiring and vertical field spacing.
101
- - `formatDate` — `"2026-03-09"`, or `"2026-03-09 14:30:00"` for a date-time: the same everywhere, on a 24-hour clock.
102
- - `formatDateLong` — The written form, `"2026. March 9."`, or `"2026. March 9. 14:30"` for a date-time. The order and the 24-hour clock are fixed; `locale` only translates the month name.
103
- - `formatFileSize` — `1536` → `"1.5 KB"`.
104
- - `Input` — Text input, optionally with `startAdornment` / `endAdornment` inside the box. Use `TextField` for a labelled one.
105
- - `NumberField` — Numeric input with stepper buttons, locale formatting and keyboard stepping.
106
- - `PasswordField` — Labelled password input with description and error message.
107
- - `PasswordInput` — Password input with a button that reveals the value.
108
- - `Radio` — Radio button with optional `label` and `description`. Use inside `RadioGroup`; each needs a `value`.
109
- - `RadioGroup` — Single-choice group for `Radio` children (`value` / `onValueChange`).
110
- - `RangeCalendar` — Month grid for picking a range of days: the first pick sets one end, the second completes the range (in either order). Same keyboard as Calendar. Disabled days cannot be picked as an end but may fall inside a range.
111
- - `SearchInput` — Text input with a search icon and a clear button that appears once there is a value.
112
- - `Select` — `<Select items={…} />` renders a complete labelled select. For full control compose the parts: `Select.Root`, `Select.Trigger`, `Select.Content`, `Select.Item`, `Select.Group`, `Select.GroupLabel`, `Select.Separator`. (parts: Root, Label, Trigger, Value, Content, Item, Group, GroupLabel, Separator)
113
- - `Slider` — Single value or range (pass an array) slider.
114
- - `Switch` — On/off switch with optional `label` and `description`.
115
- - `Textarea` — Multi-line text input. Use `TextareaField` for a labelled one.
116
- - `TextareaField` — Labelled textarea with description and error message.
117
- - `TextField` — Labelled input with description and error message.
118
-
119
121
  ## Overlays
120
122
 
121
123
  - `AlertDialog` — Confirmation dialog that requires an explicit choice (no outside-click dismissal). (parts: Root, Trigger, Content, Header, Title, Description, Body, Footer, Close)
package/dist/opti-ui.css CHANGED
@@ -33,9 +33,18 @@
33
33
  --oui-radius-md: 12px;
34
34
  --oui-radius-card: 16px;
35
35
  --oui-radius-pill: 999px;
36
- --oui-control-height-sm: 2rem;
37
- --oui-control-height-md: 2.5rem;
38
- --oui-control-height-lg: 3rem;
36
+ --oui-space-1: 0.125rem;
37
+ --oui-space-2: 0.25rem;
38
+ --oui-space-3: 0.375rem;
39
+ --oui-space-4: 0.5rem;
40
+ --oui-space-5: 0.625rem;
41
+ --oui-space-6: 0.75rem;
42
+ --oui-space-8: 1rem;
43
+ --oui-space-10: 1.25rem;
44
+ --oui-space-12: 1.5rem;
45
+ --oui-control-height-sm: 1.875rem;
46
+ --oui-control-height-md: 2.375rem;
47
+ --oui-control-height-lg: 2.875rem;
39
48
  --oui-control-border-width: 2px;
40
49
  --oui-control-disabled-opacity: 0.5;
41
50
  --oui-duration-fast: 0.15s;
@@ -501,7 +510,7 @@
501
510
  align-items: center;
502
511
  gap: 0.7rem;
503
512
  width: 100%;
504
- padding: 0.55rem 0.7rem;
513
+ padding: var(--oui-space-5) 0.7rem;
505
514
  border: 0;
506
515
  border-radius: var(--oui-radius-control);
507
516
  background: transparent;
@@ -566,6 +575,41 @@
566
575
  line-height: 1.3;
567
576
  text-align: center;
568
577
  }
578
+ .oui-navbar__item-chevron {
579
+ flex-shrink: 0;
580
+ width: 1rem;
581
+ height: 1rem;
582
+ opacity: 0.7;
583
+ transition: transform var(--oui-duration-normal) var(--oui-ease-out), opacity var(--oui-duration-fast) var(--oui-ease) var(--oui-duration-normal);
584
+ }
585
+ [data-open] > .oui-navbar__item-chevron {
586
+ transform: rotate(90deg);
587
+ }
588
+ .oui-navbar__group {
589
+ display: flex;
590
+ flex-direction: column;
591
+ }
592
+ .oui-navbar__group-panel {
593
+ height: var(--collapsible-panel-height);
594
+ overflow: hidden;
595
+ transition: height var(--oui-duration-normal) var(--oui-ease-out);
596
+ }
597
+ .oui-navbar__group-panel[data-starting-style], .oui-navbar__group-panel[data-ending-style] {
598
+ height: 0;
599
+ }
600
+ .oui-navbar__group-items {
601
+ display: flex;
602
+ flex-direction: column;
603
+ gap: 0.15rem;
604
+ margin: 0.15rem 0 0.15rem 1.625rem;
605
+ padding-left: var(--oui-space-3);
606
+ border-left: 1px solid var(--_border);
607
+ }
608
+ .oui-navbar__group-items .oui-navbar__item {
609
+ padding-block: var(--oui-space-4);
610
+ padding-left: calc(1.625rem - 1px - var(--oui-space-3));
611
+ font-size: var(--oui-font-size-sm);
612
+ }
569
613
  .oui-navbar__footer {
570
614
  display: flex;
571
615
  flex-direction: column;
@@ -577,7 +621,7 @@
577
621
  .oui-navbar__toggle {
578
622
  position: absolute;
579
623
  top: 1.625rem;
580
- right: 0.75rem;
624
+ left: calc(100% - 2.75rem);
581
625
  display: inline-flex;
582
626
  flex-shrink: 0;
583
627
  align-items: center;
@@ -590,7 +634,7 @@
590
634
  background: transparent;
591
635
  color: var(--_fg-muted);
592
636
  cursor: pointer;
593
- transition: top var(--_motion), right var(--_motion), background-color var(--oui-duration-normal) var(--oui-ease), color var(--oui-duration-normal) var(--oui-ease);
637
+ transition: top var(--_motion), left var(--_motion), background-color var(--oui-duration-normal) var(--oui-ease), color var(--oui-duration-normal) var(--oui-ease);
594
638
  }
595
639
  .oui-navbar__toggle svg {
596
640
  flex-shrink: 0;
@@ -623,6 +667,7 @@
623
667
  .oui-navbar[data-collapsed] .oui-navbar__toggle,
624
668
  .oui-navbar[data-peek] .oui-navbar__toggle {
625
669
  top: 1.125rem;
670
+ left: calc((var(--oui-navbar-collapsed-width, 4.25rem) - 2rem) / 2);
626
671
  }
627
672
  .oui-navbar[data-collapsed] .oui-navbar__header,
628
673
  .oui-navbar[data-peek] .oui-navbar__header {
@@ -632,14 +677,12 @@
632
677
  width: var(--oui-navbar-collapsed-width, 4.25rem);
633
678
  padding-inline: 0.5rem;
634
679
  }
635
- .oui-navbar[data-collapsed] .oui-navbar__toggle {
636
- right: calc((var(--oui-navbar-collapsed-width, 4.25rem) - 2rem) / 2);
637
- }
638
680
  .oui-navbar[data-collapsed] .oui-navbar__header {
639
681
  padding-inline: 0;
640
682
  }
641
683
  .oui-navbar[data-collapsed] .oui-navbar__brand-text,
642
- .oui-navbar[data-collapsed] .oui-navbar__item-label {
684
+ .oui-navbar[data-collapsed] .oui-navbar__item-label,
685
+ .oui-navbar[data-collapsed] .oui-navbar__item-chevron {
643
686
  opacity: 0;
644
687
  transition: opacity var(--oui-duration-fast) var(--oui-ease);
645
688
  }
@@ -649,6 +692,9 @@
649
692
  color: transparent;
650
693
  font-size: 0;
651
694
  }
695
+ .oui-navbar[data-collapsed] .oui-navbar__group-panel {
696
+ display: none;
697
+ }
652
698
  .oui-navbar[data-collapsed] .oui-navbar__item-badge {
653
699
  position: absolute;
654
700
  top: 0.3rem;
@@ -709,39 +755,82 @@
709
755
  overflow-y: auto;
710
756
  background: var(--oui-app-shell-bg, var(--oui-color-bg));
711
757
  }
712
- .oui-app-shell__mobile-bar {
758
+ .oui-app-shell__mobile-bar,
759
+ .oui-app-shell__tabbar {
713
760
  display: none;
714
761
  }
715
- .oui-app-shell__menu-button,
716
- .oui-app-shell__drawer-close {
717
- display: inline-flex;
762
+ .oui-app-shell__tabbar {
763
+ gap: 0.25rem;
764
+ padding: 0.3rem 0.4rem calc(0.3rem + env(safe-area-inset-bottom));
765
+ border-top: 1px solid var(--oui-color-inverse-border);
766
+ background: var(--oui-navbar-bg, var(--oui-color-inverse));
767
+ color: var(--oui-color-on-inverse-muted);
768
+ }
769
+ .oui-app-shell__tabbar[data-position=top] {
770
+ padding-bottom: 0.3rem;
771
+ border-top: 0;
772
+ border-bottom: 1px solid var(--oui-color-inverse-border);
773
+ }
774
+ .oui-app-shell__tab {
775
+ box-sizing: border-box;
776
+ margin: 0;
777
+ font-family: var(--oui-font-body);
778
+ -webkit-font-smoothing: antialiased;
779
+ -moz-osx-font-smoothing: grayscale;
780
+ display: flex;
781
+ flex: 1 1 0;
782
+ flex-direction: column;
718
783
  align-items: center;
719
784
  justify-content: center;
720
- width: 2.25rem;
721
- height: 2.25rem;
722
- padding: 0;
785
+ gap: 0.2rem;
786
+ min-width: 0;
787
+ padding: 0.3rem 0.25rem;
723
788
  border: 0;
724
789
  border-radius: var(--oui-radius-control);
725
790
  background: transparent;
726
791
  color: inherit;
792
+ font-size: var(--oui-font-size-2xs);
793
+ font-weight: var(--oui-font-weight-medium);
794
+ text-decoration: none;
727
795
  cursor: pointer;
728
- transition: background-color var(--oui-duration-fast) var(--oui-ease);
729
- }
730
- .oui-app-shell__menu-button svg,
731
- .oui-app-shell__drawer-close svg {
732
- flex-shrink: 0;
733
- width: 1.3rem;
734
- height: 1.3rem;
796
+ transition: background-color var(--oui-duration-fast) var(--oui-ease), color var(--oui-duration-fast) var(--oui-ease);
735
797
  }
736
- .oui-app-shell__menu-button:hover,
737
- .oui-app-shell__drawer-close:hover {
798
+ .oui-app-shell__tab:hover {
738
799
  background: var(--oui-color-inverse-hover);
800
+ color: var(--oui-color-on-inverse);
739
801
  }
740
- .oui-app-shell__menu-button:focus-visible,
741
- .oui-app-shell__drawer-close:focus-visible {
802
+ .oui-app-shell__tab:focus-visible {
742
803
  outline: 2px solid currentColor;
743
804
  outline-offset: -2px;
744
805
  }
806
+ .oui-app-shell__tab[data-active] {
807
+ color: var(--oui-color-on-inverse);
808
+ font-weight: var(--oui-font-weight-semibold);
809
+ }
810
+ .oui-app-shell__tab[data-active] .oui-app-shell__tab-icon {
811
+ background: var(--oui-color-accent);
812
+ color: var(--oui-color-on-accent);
813
+ }
814
+ .oui-app-shell__tab-icon {
815
+ display: inline-flex;
816
+ align-items: center;
817
+ justify-content: center;
818
+ width: 2.75rem;
819
+ height: 1.75rem;
820
+ border-radius: var(--oui-radius-pill);
821
+ transition: background-color var(--oui-duration-fast) var(--oui-ease), color var(--oui-duration-fast) var(--oui-ease);
822
+ }
823
+ .oui-app-shell__tab-icon svg {
824
+ flex-shrink: 0;
825
+ width: 1.15rem;
826
+ height: 1.15rem;
827
+ }
828
+ .oui-app-shell__tab-label {
829
+ max-width: 100%;
830
+ overflow: hidden;
831
+ text-overflow: ellipsis;
832
+ white-space: nowrap;
833
+ }
745
834
  .oui-app-shell__drawer {
746
835
  position: fixed;
747
836
  top: 0;
@@ -765,8 +854,14 @@
765
854
  }
766
855
  @media (max-width: 900px) {
767
856
  .oui-app-shell {
768
- grid-template-columns: minmax(0, 1fr);
769
- grid-template-rows: auto minmax(0, 1fr);
857
+ display: flex;
858
+ flex-direction: column;
859
+ }
860
+ .oui-app-shell__main {
861
+ flex: 1;
862
+ }
863
+ .oui-app-shell__tabbar {
864
+ display: flex;
770
865
  }
771
866
  .oui-app-shell__navbar {
772
867
  display: none;
@@ -796,15 +891,15 @@
796
891
  flex-wrap: wrap;
797
892
  align-items: flex-end;
798
893
  justify-content: space-between;
799
- gap: 1rem 1.5rem;
894
+ gap: var(--oui-space-6) var(--oui-space-10);
800
895
  }
801
896
  .oui-page-header__text {
802
897
  display: grid;
803
- gap: 0.35rem;
898
+ gap: var(--oui-space-2);
804
899
  min-width: 0;
805
900
  }
806
901
  .oui-page-header__breadcrumbs {
807
- margin-bottom: 0.4rem;
902
+ margin-bottom: var(--oui-space-3);
808
903
  }
809
904
  .oui-page-header__title {
810
905
  margin: 0;
@@ -827,12 +922,12 @@
827
922
  .oui-page-header__actions {
828
923
  display: flex;
829
924
  flex-wrap: wrap;
830
- gap: 0.6rem;
925
+ gap: var(--oui-space-4);
831
926
  }
832
927
  .oui-grid {
833
928
  display: grid;
834
929
  grid-template-columns: repeat(var(--_cols, 3), minmax(0, 1fr));
835
- gap: var(--_gap, 1rem);
930
+ gap: var(--_gap, var(--oui-space-6));
836
931
  min-width: 0;
837
932
  }
838
933
  .oui-grid > * {
@@ -857,10 +952,10 @@
857
952
  --_cols: 6;
858
953
  }
859
954
  .oui-grid[data-gap=sm] {
860
- --_gap: 0.6rem;
955
+ --_gap: var(--oui-space-4);
861
956
  }
862
957
  .oui-grid[data-gap=lg] {
863
- --_gap: 1.5rem;
958
+ --_gap: var(--oui-space-10);
864
959
  }
865
960
  @media (max-width: 1200px) {
866
961
  .oui-grid[data-columns="4"], .oui-grid[data-columns="5"], .oui-grid[data-columns="6"] {
@@ -1018,12 +1113,6 @@
1018
1113
  border-color: var(--_tone-border);
1019
1114
  background: transparent;
1020
1115
  }
1021
- .oui-badge__dot {
1022
- width: 0.45rem;
1023
- height: 0.45rem;
1024
- border-radius: 50%;
1025
- background: var(--_tone);
1026
- }
1027
1116
  }
1028
1117
  @layer oui.components {
1029
1118
  .oui-breadcrumbs {
@@ -1422,10 +1511,10 @@
1422
1511
  font-family: var(--oui-font-body);
1423
1512
  -webkit-font-smoothing: antialiased;
1424
1513
  -moz-osx-font-smoothing: grayscale;
1425
- --_padding: 1.25rem;
1514
+ --_padding: var(--oui-space-8);
1426
1515
  display: flex;
1427
1516
  flex-direction: column;
1428
- gap: 0.9rem;
1517
+ gap: var(--oui-space-6);
1429
1518
  min-width: 0;
1430
1519
  padding: var(--oui-card-padding, var(--_padding));
1431
1520
  border: 1.5px solid var(--oui-card-border, var(--oui-color-border));
@@ -1439,10 +1528,10 @@
1439
1528
  --_padding: 0;
1440
1529
  }
1441
1530
  .oui-card[data-padding=sm] {
1442
- --_padding: 1rem;
1531
+ --_padding: var(--oui-space-6);
1443
1532
  }
1444
1533
  .oui-card[data-padding=lg] {
1445
- --_padding: 1.75rem;
1534
+ --_padding: var(--oui-space-12);
1446
1535
  }
1447
1536
  .oui-card[data-variant=elevated] {
1448
1537
  border-color: transparent;
@@ -1474,7 +1563,7 @@
1474
1563
  }
1475
1564
  @media (max-width: 640px) {
1476
1565
  .oui-card[data-padding=md], .oui-card[data-padding=lg] {
1477
- --_padding: 1rem;
1566
+ --_padding: var(--oui-space-6);
1478
1567
  }
1479
1568
  }
1480
1569
  .oui-card__header {
@@ -1519,7 +1608,7 @@
1519
1608
  flex-wrap: wrap;
1520
1609
  align-items: center;
1521
1610
  gap: 0.5rem;
1522
- padding-top: 0.9rem;
1611
+ padding-top: var(--oui-space-6);
1523
1612
  border-top: 1px solid var(--oui-color-border-subtle);
1524
1613
  }
1525
1614
  }
@@ -1829,7 +1918,7 @@
1829
1918
  --_height: var(--oui-control-height-lg);
1830
1919
  }
1831
1920
  .oui-combobox__group[data-multiple] {
1832
- padding-block: 0.25rem;
1921
+ padding-block: max(0px, (var(--oui-input-height, var(--_height)) - 2 * var(--oui-control-border-width) - 1.5rem) / 2);
1833
1922
  padding-left: 0.35rem;
1834
1923
  }
1835
1924
  .oui-combobox__group[data-invalid]:focus-within, .oui-combobox__group:has([data-invalid]):focus-within {
@@ -1858,7 +1947,7 @@
1858
1947
  }
1859
1948
  .oui-combobox__chips .oui-combobox__input {
1860
1949
  min-width: 2.5rem;
1861
- height: 1.75rem;
1950
+ height: 1.5rem;
1862
1951
  padding-left: 0.4rem;
1863
1952
  }
1864
1953
  .oui-combobox__actions {
@@ -1871,8 +1960,9 @@
1871
1960
  display: inline-flex;
1872
1961
  align-items: center;
1873
1962
  justify-content: center;
1874
- width: 1.75rem;
1875
- height: 1.75rem;
1963
+ --_size: min(1.75rem, calc(var(--oui-input-height, var(--_height)) - 2 * var(--oui-control-border-width) - 0.25rem));
1964
+ width: var(--_size);
1965
+ height: var(--_size);
1876
1966
  padding: 0;
1877
1967
  border: 0;
1878
1968
  border-radius: var(--oui-radius-sm);
@@ -1912,7 +2002,7 @@
1912
2002
  display: inline-flex;
1913
2003
  align-items: center;
1914
2004
  gap: 0.2rem;
1915
- height: 1.75rem;
2005
+ height: 1.5rem;
1916
2006
  padding: 0 0.2rem 0 0.6rem;
1917
2007
  border-radius: var(--oui-radius-sm);
1918
2008
  background: var(--oui-color-accent-subtle);
@@ -2253,7 +2343,7 @@
2253
2343
  -moz-osx-font-smoothing: grayscale;
2254
2344
  display: flex;
2255
2345
  flex-direction: column;
2256
- gap: 0.75rem;
2346
+ gap: var(--oui-space-5);
2257
2347
  min-width: 0;
2258
2348
  }
2259
2349
  .oui-data-table__toolbar {
@@ -2261,7 +2351,7 @@
2261
2351
  flex-wrap: wrap;
2262
2352
  align-items: center;
2263
2353
  justify-content: space-between;
2264
- gap: 0.6rem 1rem;
2354
+ gap: var(--oui-space-4) var(--oui-space-6);
2265
2355
  }
2266
2356
  .oui-data-table__toolbar > .oui-input-group {
2267
2357
  flex: 1 1 14rem;
@@ -2641,13 +2731,13 @@
2641
2731
  -webkit-font-smoothing: antialiased;
2642
2732
  -moz-osx-font-smoothing: grayscale;
2643
2733
  --_width: 32rem;
2644
- --_padding: 1.5rem;
2734
+ --_padding: var(--oui-space-10);
2645
2735
  --_radius: var(--oui-dialog-radius, var(--oui-radius-card));
2646
2736
  position: fixed;
2647
2737
  z-index: var(--oui-z-dialog);
2648
2738
  display: flex;
2649
2739
  flex-direction: column;
2650
- gap: 1.1rem;
2740
+ gap: var(--oui-space-8);
2651
2741
  box-sizing: border-box;
2652
2742
  width: min(var(--oui-dialog-width, var(--_width)), 100vw - 2rem);
2653
2743
  max-height: calc(100dvh - 2rem);
@@ -2736,7 +2826,7 @@
2736
2826
  }
2737
2827
  @media (max-width: 640px) {
2738
2828
  .oui-dialog {
2739
- --_padding: 1.15rem;
2829
+ --_padding: var(--oui-space-8);
2740
2830
  }
2741
2831
  }
2742
2832
  .oui-dialog__header {
@@ -2821,7 +2911,7 @@
2821
2911
  -webkit-font-smoothing: antialiased;
2822
2912
  -moz-osx-font-smoothing: grayscale;
2823
2913
  --_width: 32rem;
2824
- --_padding: 1.5rem;
2914
+ --_padding: var(--oui-space-10);
2825
2915
  position: fixed;
2826
2916
  top: 0;
2827
2917
  bottom: 0;
@@ -2873,7 +2963,7 @@
2873
2963
  }
2874
2964
  @media (max-width: 640px) {
2875
2965
  .oui-drawer {
2876
- --_padding: 1.15rem;
2966
+ --_padding: var(--oui-space-8);
2877
2967
  border-radius: 0 !important;
2878
2968
  }
2879
2969
  }
@@ -2883,7 +2973,7 @@
2883
2973
  align-items: flex-start;
2884
2974
  justify-content: space-between;
2885
2975
  gap: 1rem;
2886
- padding: 1rem var(--oui-drawer-padding, var(--_padding));
2976
+ padding: var(--oui-space-6) var(--oui-drawer-padding, var(--_padding));
2887
2977
  border-bottom: 1px solid var(--oui-color-border-subtle);
2888
2978
  }
2889
2979
  .oui-drawer__heading {
@@ -2939,7 +3029,7 @@
2939
3029
  flex-wrap: wrap;
2940
3030
  justify-content: flex-end;
2941
3031
  gap: 0.6rem;
2942
- padding: 1rem var(--oui-drawer-padding, var(--_padding));
3032
+ padding: var(--oui-space-6) var(--oui-drawer-padding, var(--_padding));
2943
3033
  border-top: 1px solid var(--oui-color-border-subtle);
2944
3034
  }
2945
3035
  }
@@ -3008,7 +3098,7 @@
3008
3098
  -moz-osx-font-smoothing: grayscale;
3009
3099
  display: flex;
3010
3100
  flex-direction: column;
3011
- gap: 0.4rem;
3101
+ gap: var(--oui-space-3);
3012
3102
  min-width: 0;
3013
3103
  }
3014
3104
  .oui-field[data-disabled] .oui-field__label {
@@ -3055,7 +3145,7 @@
3055
3145
  -moz-osx-font-smoothing: grayscale;
3056
3146
  display: flex;
3057
3147
  flex-direction: column;
3058
- gap: 0.75rem;
3148
+ gap: var(--oui-space-5);
3059
3149
  min-width: 0;
3060
3150
  padding: 0;
3061
3151
  border: 0;
@@ -3070,7 +3160,7 @@
3070
3160
  .oui-form {
3071
3161
  display: flex;
3072
3162
  flex-direction: column;
3073
- gap: 1.1rem;
3163
+ gap: var(--oui-space-8);
3074
3164
  }
3075
3165
  }
3076
3166
  @layer oui.components {
@@ -3802,10 +3892,10 @@
3802
3892
  .oui-popover {
3803
3893
  display: flex;
3804
3894
  flex-direction: column;
3805
- gap: 0.75rem;
3895
+ gap: var(--oui-space-5);
3806
3896
  max-width: min(var(--available-width), 24rem);
3807
3897
  max-height: var(--available-height);
3808
- padding: var(--oui-popover-padding, 1rem);
3898
+ padding: var(--oui-popover-padding, var(--oui-space-6));
3809
3899
  overflow: auto;
3810
3900
  }
3811
3901
  .oui-popover__title {
@@ -4418,7 +4508,7 @@
4418
4508
  }
4419
4509
  @layer oui.components {
4420
4510
  .oui-stack {
4421
- --_gap: 1rem;
4511
+ --_gap: var(--oui-space-6);
4422
4512
  display: flex;
4423
4513
  flex-direction: column;
4424
4514
  gap: var(--oui-stack-gap, var(--_gap));
@@ -4435,16 +4525,16 @@
4435
4525
  --_gap: 0;
4436
4526
  }
4437
4527
  .oui-stack[data-gap=xs] {
4438
- --_gap: 0.25rem;
4528
+ --_gap: var(--oui-space-2);
4439
4529
  }
4440
4530
  .oui-stack[data-gap=sm] {
4441
- --_gap: 0.6rem;
4531
+ --_gap: var(--oui-space-4);
4442
4532
  }
4443
4533
  .oui-stack[data-gap=lg] {
4444
- --_gap: 1.5rem;
4534
+ --_gap: var(--oui-space-10);
4445
4535
  }
4446
4536
  .oui-stack[data-gap=xl] {
4447
- --_gap: 2rem;
4537
+ --_gap: var(--oui-space-12);
4448
4538
  }
4449
4539
  .oui-stack[data-align=start] {
4450
4540
  align-items: flex-start;
@@ -4726,21 +4816,21 @@
4726
4816
  font-family: var(--oui-font-body);
4727
4817
  -webkit-font-smoothing: antialiased;
4728
4818
  -moz-osx-font-smoothing: grayscale;
4729
- --_py: 0.65rem;
4730
- --_px: 0.75rem;
4819
+ --_py: var(--oui-space-3);
4820
+ --_px: var(--oui-space-5);
4731
4821
  width: 100%;
4732
4822
  border-collapse: collapse;
4733
4823
  color: var(--oui-color-text-strong);
4734
- font-size: var(--oui-font-size-md);
4824
+ font-size: var(--oui-font-size-sm);
4735
4825
  }
4736
4826
  .oui-table[data-density=compact] {
4737
- --_py: 0.4rem;
4738
- --_px: 0.6rem;
4739
- font-size: var(--oui-font-size-sm);
4827
+ --_py: var(--oui-space-2);
4828
+ --_px: var(--oui-space-4);
4740
4829
  }
4741
4830
  .oui-table[data-density=comfortable] {
4742
- --_py: 0.95rem;
4743
- --_px: 1rem;
4831
+ --_py: var(--oui-space-5);
4832
+ --_px: var(--oui-space-6);
4833
+ font-size: var(--oui-font-size-md);
4744
4834
  }
4745
4835
  .oui-table[data-striped] .oui-table__body .oui-table__row:nth-child(even) {
4746
4836
  background: var(--oui-color-surface-muted);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optimum-intelligence/opti-ui",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "Optimum's customizable React component library, built on Base UI.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Optimum Intelligence",