@viraui/react 1.0.12 → 1.0.14

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 (144) hide show
  1. package/dist/catalog.json +16 -4
  2. package/dist/components/accordion/accordion.css +1 -1
  3. package/dist/components/accordion/accordion.guide.json +26 -0
  4. package/dist/components/annotate/annotate.css +1 -1
  5. package/dist/components/annotate/annotate.guide.json +46 -57
  6. package/dist/components/avatar/avatar.css +1 -1
  7. package/dist/components/avatar/avatar.guide.json +22 -10
  8. package/dist/components/avatar/avatar.js +0 -2
  9. package/dist/components/avatar-group/avatar-group.css +1 -7
  10. package/dist/components/avatar-group/avatar-group.guide.json +23 -16
  11. package/dist/components/badge/badge.css +1 -0
  12. package/dist/components/badge/badge.d.ts +39 -0
  13. package/dist/components/badge/badge.guide.json +59 -0
  14. package/dist/components/badge/badge.js +50 -0
  15. package/dist/components/badge/badge.module.js +11 -0
  16. package/dist/components/badge/index.d.ts +2 -0
  17. package/dist/components/basic-input/basic-input.css +1 -1
  18. package/dist/components/basic-input/field-label.css +1 -1
  19. package/dist/components/basic-input/field-label.js +2 -0
  20. package/dist/components/bleed/bleed.guide.json +9 -6
  21. package/dist/components/button/button-chrome.d.ts +3 -1
  22. package/dist/components/button/button-chrome.js +3 -2
  23. package/dist/components/button/button-link.guide.json +55 -1
  24. package/dist/components/button/button-link.js +2 -1
  25. package/dist/components/button/button.css +1 -1
  26. package/dist/components/button/button.guide.json +27 -7
  27. package/dist/components/button/button.js +2 -1
  28. package/dist/components/checkbox/checkbox.css +1 -1
  29. package/dist/components/checkbox/checkbox.guide.json +40 -1
  30. package/dist/components/checkbox/checkbox.js +2 -2
  31. package/dist/components/checkbox/checkbox.module.js +1 -3
  32. package/dist/components/chip/chip.css +1 -1
  33. package/dist/components/chip/chip.guide.json +23 -6
  34. package/dist/components/chip/chip.js +2 -1
  35. package/dist/components/clamp-text/clamp-text.css +1 -1
  36. package/dist/components/clamp-text/clamp-text.guide.json +9 -0
  37. package/dist/components/clamp-text/clamp-text.js +1 -1
  38. package/dist/components/dialog/dialog-sheet.js +1 -1
  39. package/dist/components/dialog/dialog.css +1 -1
  40. package/dist/components/dialog/dialog.guide.json +24 -0
  41. package/dist/components/dialog/dialog.module.js +1 -3
  42. package/dist/components/elevator/elevator.guide.json +23 -1
  43. package/dist/components/fieldset/fieldset.guide.json +16 -3
  44. package/dist/components/fieldset/fieldset.js +6 -6
  45. package/dist/components/fit-text/fit-text.css +1 -1
  46. package/dist/components/fit-text/fit-text.guide.json +2 -4
  47. package/dist/components/icon-button/icon-button-link.guide.json +52 -1
  48. package/dist/components/icon-button/icon-button-link.js +2 -2
  49. package/dist/components/icon-button/icon-button.d.ts +1 -1
  50. package/dist/components/icon-button/icon-button.guide.json +48 -3
  51. package/dist/components/icon-button/icon-button.js +2 -2
  52. package/dist/components/index.d.ts +2 -0
  53. package/dist/components/linear-progress/linear-progress.guide.json +16 -5
  54. package/dist/components/linear-progress/linear-progress.js +0 -1
  55. package/dist/components/masonry/masonry.d.ts +1 -1
  56. package/dist/components/masonry/masonry.guide.json +11 -9
  57. package/dist/components/masonry/masonry.js +1 -1
  58. package/dist/components/menu/index.d.ts +11 -0
  59. package/dist/components/menu/menu-checkbox-item.d.ts +42 -0
  60. package/dist/components/menu/menu-checkbox-item.js +28 -0
  61. package/dist/components/menu/menu-group.d.ts +12 -0
  62. package/dist/components/menu/menu-group.js +36 -0
  63. package/dist/components/menu/menu-indicator-slot.d.ts +15 -0
  64. package/dist/components/menu/menu-indicator-slot.js +52 -0
  65. package/dist/components/menu/menu-item-row.d.ts +18 -0
  66. package/dist/components/menu/menu-item-row.js +47 -0
  67. package/dist/components/menu/menu-item.d.ts +36 -0
  68. package/dist/components/menu/menu-item.js +23 -0
  69. package/dist/components/menu/menu-link-item.d.ts +36 -0
  70. package/dist/components/menu/menu-link-item.js +26 -0
  71. package/dist/components/menu/menu-popup.d.ts +17 -0
  72. package/dist/components/menu/menu-popup.js +28 -0
  73. package/dist/components/menu/menu-radio-group.d.ts +16 -0
  74. package/dist/components/menu/menu-radio-group.js +36 -0
  75. package/dist/components/menu/menu-radio-item.d.ts +42 -0
  76. package/dist/components/menu/menu-radio-item.js +28 -0
  77. package/dist/components/menu/menu-separator.d.ts +9 -0
  78. package/dist/components/menu/menu-separator.js +15 -0
  79. package/dist/components/menu/menu-submenu-trigger.d.ts +29 -0
  80. package/dist/components/menu/menu-submenu-trigger.js +26 -0
  81. package/dist/components/menu/menu.css +1 -0
  82. package/dist/components/menu/menu.d.ts +58 -0
  83. package/dist/components/menu/menu.guide.json +101 -0
  84. package/dist/components/menu/menu.js +36 -0
  85. package/dist/components/menu/menu.module.js +13 -0
  86. package/dist/components/meter/meter.guide.json +15 -4
  87. package/dist/components/meter/meter.js +0 -1
  88. package/dist/components/popover/popover-sheet.js +1 -1
  89. package/dist/components/popover/popover.guide.json +25 -1
  90. package/dist/components/progressive-blur/progressive-blur.css +1 -1
  91. package/dist/components/progressive-blur/progressive-blur.guide.json +14 -4
  92. package/dist/components/progressive-blur/progressive-blur.js +2 -2
  93. package/dist/components/radio/radio.css +1 -1
  94. package/dist/components/radio/radio.guide.json +34 -1
  95. package/dist/components/radio/radio.js +28 -31
  96. package/dist/components/select/select-group.js +1 -1
  97. package/dist/components/select/select-option.d.ts +1 -1
  98. package/dist/components/select/select-option.js +2 -5
  99. package/dist/components/select/select-separator.js +7 -4
  100. package/dist/components/select/select.css +1 -1
  101. package/dist/components/select/select.guide.json +49 -8
  102. package/dist/components/select/select.js +1 -1
  103. package/dist/components/select/select.module.js +1 -5
  104. package/dist/components/separator/separator.guide.json +28 -1
  105. package/dist/components/shimmer/shimmer.css +1 -1
  106. package/dist/components/shimmer/shimmer.guide.json +19 -16
  107. package/dist/components/skeleton/skeleton.guide.json +24 -31
  108. package/dist/components/slider/slider.guide.json +27 -7
  109. package/dist/components/spinner/spinner.guide.json +5 -4
  110. package/dist/components/stack/stack.guide.json +49 -47
  111. package/dist/components/static-noise/static-noise.guide.json +18 -2
  112. package/dist/components/surface/surface.css +1 -1
  113. package/dist/components/surface/surface.guide.json +41 -48
  114. package/dist/components/switch/switch.css +1 -1
  115. package/dist/components/switch/switch.guide.json +25 -10
  116. package/dist/components/tabs/tabs.guide.json +11 -0
  117. package/dist/components/text/text.css +1 -1
  118. package/dist/components/text/text.guide.json +67 -76
  119. package/dist/components/textarea/textarea.css +1 -1
  120. package/dist/components/textarea/textarea.d.ts +4 -3
  121. package/dist/components/textarea/textarea.guide.json +19 -7
  122. package/dist/components/textfield/textfield.css +1 -1
  123. package/dist/components/textfield/textfield.guide.json +22 -7
  124. package/dist/components/title/title.css +1 -1
  125. package/dist/components/title/title.guide.json +62 -72
  126. package/dist/components/title/title.js +0 -1
  127. package/dist/components/toast/toast.css +1 -1
  128. package/dist/components/toast/toast.guide.json +32 -1
  129. package/dist/components/toggle-button/toggle-button.css +1 -0
  130. package/dist/components/toggle-button/toggle-button.d.ts +7 -0
  131. package/dist/components/toggle-button/toggle-button.guide.json +29 -2
  132. package/dist/components/toggle-button/toggle-button.js +18 -3
  133. package/dist/components/toggle-button/toggle-button.module.js +9 -0
  134. package/dist/components/toggle-group/toggle-group.d.ts +2 -1
  135. package/dist/components/toggle-group/toggle-group.guide.json +2 -3
  136. package/dist/components/tooltip/tooltip.guide.json +8 -1
  137. package/dist/components/typewriter/typewriter.css +1 -1
  138. package/dist/components/typewriter/typewriter.guide.json +27 -5
  139. package/dist/index.js +13 -2
  140. package/dist/internal/chrome-icons/chrome-icons.d.ts +2 -0
  141. package/dist/internal/chrome-icons/chrome-icons.js +7 -1
  142. package/dist/preflight-surface.json +1 -1
  143. package/dist/preflight.css +1 -1
  144. package/package.json +2 -2
@@ -0,0 +1,101 @@
1
+ {
2
+ "name": "Menu",
3
+ "structure": "<Menu>\n <Menu.Trigger />\n <Menu.Popup>\n <Menu.Item />\n <Menu.LinkItem />\n <Menu.CheckboxItem />\n <Menu.Group label=\"…\">\n <Menu.Item />\n </Menu.Group>\n <Menu.RadioGroup>\n <Menu.RadioItem value=\"…\" />\n </Menu.RadioGroup>\n <Menu.Separator />\n <Menu.Submenu>\n <Menu.SubmenuTrigger />\n <Menu.Popup>…</Menu.Popup>\n </Menu.Submenu>\n </Menu.Popup>\n</Menu>",
4
+ "summary": "Compound menu built on Base UI Menu with `Menu.Trigger`, `Menu.Popup`, unified item rows, groups, checkbox/radio items, nested submenus, destructive sentiment, and `Menu.createHandle` for detached triggers; `Popup` owns Portal + Positioner + Elevator/Surface Select-like list chrome.",
5
+ "whenToUse": [
6
+ "Action menus anchored to a button or icon button",
7
+ "Nested command lists with checkbox or radio options that stay open on toggle",
8
+ "Link rows mixed with actions in one menu surface",
9
+ "Detached or multi-trigger menus via `Menu.createHandle`"
10
+ ],
11
+ "whenNotToUse": [
12
+ "Page-blocking modal flows (use Dialog)",
13
+ "Form field single-select from a long list (use Select)",
14
+ "Context menu or menubar chrome (not in this surface)",
15
+ "System-wide transient alerts (use Toast)"
16
+ ],
17
+ "accessibility": [
18
+ "Give the trigger an accessible name (`Button` label or `aria-label` on IconButton)",
19
+ "Use `Menu.Group` `label` for grouped sections so assistive tech gets a group name",
20
+ "Prefer Base UI keyboard navigation; do not trap focus outside the menu pattern"
21
+ ],
22
+ "antiPatterns": [
23
+ "Expecting `Menu.Arrow`, `Menu.Backdrop`, or public Portal/Positioner/Viewport exports",
24
+ "Closing checkbox/radio items on click by default when the menu should stay open for multi-toggle",
25
+ "Using physical left/right CSS that breaks RTL submenu chevrons"
26
+ ],
27
+ "related": ["Button", "IconButton", "Select", "Popover", "Tooltip", "Surface", "Stack"],
28
+ "properties": {
29
+ "react": {
30
+ "CheckboxItem.addon": {
31
+ "description": "Decorative leading node rendered before the item label."
32
+ },
33
+ "CheckboxItem.addonAlign": {
34
+ "description": "Vertical alignment of the addon relative to the label row."
35
+ },
36
+ "CheckboxItem.indicator": {
37
+ "description": "Custom indicator node when checked."
38
+ },
39
+ "CheckboxItem.note": {
40
+ "description": "End-aligned secondary text (e.g. keyboard shortcut) before the check indicator. Rendered muted `x-small`."
41
+ },
42
+ "CheckboxItem.sentiment": {
43
+ "description": "Visual sentiment. `destructive` uses highlight-red wash + text."
44
+ },
45
+ "Group.label": {
46
+ "description": "Accessible group label rendered with `Menu.GroupLabel`."
47
+ },
48
+ "Item.addon": {
49
+ "description": "Decorative leading node rendered before the item label."
50
+ },
51
+ "Item.addonAlign": {
52
+ "description": "Vertical alignment of the addon relative to the label row."
53
+ },
54
+ "Item.note": {
55
+ "description": "End-aligned secondary text (e.g. keyboard shortcut). Rendered muted `x-small` at the end of the row (replaces the empty indicator spacer when set)."
56
+ },
57
+ "Item.sentiment": {
58
+ "description": "Visual sentiment. `destructive` uses highlight-red wash + text."
59
+ },
60
+ "LinkItem.addon": {
61
+ "description": "Decorative leading node rendered before the item label."
62
+ },
63
+ "LinkItem.addonAlign": {
64
+ "description": "Vertical alignment of the addon relative to the label row."
65
+ },
66
+ "LinkItem.note": {
67
+ "description": "End-aligned secondary text (e.g. keyboard shortcut). Rendered muted `x-small` at the end of the row (replaces the empty indicator spacer when set)."
68
+ },
69
+ "LinkItem.sentiment": {
70
+ "description": "Visual sentiment. `destructive` uses highlight-red wash + text."
71
+ },
72
+ "RadioGroup.label": {
73
+ "description": "Optional accessible group label rendered with `Menu.GroupLabel`."
74
+ },
75
+ "RadioItem.addon": {
76
+ "description": "Decorative leading node rendered before the item label."
77
+ },
78
+ "RadioItem.addonAlign": {
79
+ "description": "Vertical alignment of the addon relative to the label row."
80
+ },
81
+ "RadioItem.indicator": {
82
+ "description": "Custom indicator node when selected."
83
+ },
84
+ "RadioItem.note": {
85
+ "description": "End-aligned secondary text (e.g. keyboard shortcut) before the check indicator. Rendered muted `x-small`."
86
+ },
87
+ "RadioItem.sentiment": {
88
+ "description": "Visual sentiment. `destructive` uses highlight-red wash + text."
89
+ },
90
+ "SubmenuTrigger.addon": {
91
+ "description": "Decorative leading node rendered before the item label."
92
+ },
93
+ "SubmenuTrigger.addonAlign": {
94
+ "description": "Vertical alignment of the addon relative to the label row."
95
+ },
96
+ "SubmenuTrigger.sentiment": {
97
+ "description": "Visual sentiment. `destructive` uses highlight-red wash + text."
98
+ }
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,36 @@
1
+ import './menu.css';
2
+ import { MenuCheckboxItem } from "./menu-checkbox-item.js";
3
+ import { MenuGroup } from "./menu-group.js";
4
+ import { MenuItem } from "./menu-item.js";
5
+ import { MenuLinkItem } from "./menu-link-item.js";
6
+ import { MenuPopup } from "./menu-popup.js";
7
+ import { MenuRadioGroup } from "./menu-radio-group.js";
8
+ import { MenuRadioItem } from "./menu-radio-item.js";
9
+ import { MenuSeparator } from "./menu-separator.js";
10
+ import { MenuSubmenuTrigger } from "./menu-submenu-trigger.js";
11
+ import { jsx } from "react/jsx-runtime";
12
+ import { Menu } from "@base-ui/react/menu";
13
+ //#region src/components/menu/menu.tsx
14
+ var MenuTrigger = Menu.Trigger;
15
+ var MenuSubmenu = Menu.SubmenuRoot;
16
+ var MenuRootComponent = ({ children, ...otherProps }) => /* @__PURE__ */ jsx(Menu.Root, {
17
+ ...otherProps,
18
+ children
19
+ });
20
+ var { Arrow: _MenuArrow, Backdrop: _MenuBackdrop, Portal: _MenuPortal, Positioner: _MenuPositioner, Popup: _MenuPopup, Viewport: _MenuViewport, CheckboxItemIndicator: _MenuCheckboxItemIndicator, RadioItemIndicator: _MenuRadioItemIndicator, GroupLabel: _MenuGroupLabel } = Menu;
21
+ var Menu$1 = Object.assign(MenuRootComponent, {
22
+ Trigger: Menu.Trigger,
23
+ Popup: MenuPopup,
24
+ Item: MenuItem,
25
+ LinkItem: MenuLinkItem,
26
+ CheckboxItem: MenuCheckboxItem,
27
+ RadioItem: MenuRadioItem,
28
+ RadioGroup: MenuRadioGroup,
29
+ Group: MenuGroup,
30
+ Separator: MenuSeparator,
31
+ Submenu: Menu.SubmenuRoot,
32
+ SubmenuTrigger: MenuSubmenuTrigger,
33
+ createHandle: Menu.createHandle
34
+ });
35
+ //#endregion
36
+ export { Menu$1 as Menu, MenuCheckboxItem, MenuGroup, MenuItem, MenuLinkItem, MenuPopup, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubmenu, MenuSubmenuTrigger, MenuTrigger };
@@ -0,0 +1,13 @@
1
+ //#region src/components/menu/menu.module.css
2
+ var MenuPopup = "viraui__menu-module__MenuPopup_GkrGa";
3
+ var Indicator = "viraui__menu-module__Indicator_btL99";
4
+ var Group = "viraui__menu-module__Group_Orz5Y";
5
+ var Item = "viraui__menu-module__Item_9zmEO";
6
+ var menu_module_default = {
7
+ MenuPopup,
8
+ Indicator,
9
+ Group,
10
+ Item
11
+ };
12
+ //#endregion
13
+ export { Group, Indicator, Item, MenuPopup, menu_module_default as default };
@@ -25,15 +25,26 @@
25
25
  ],
26
26
  "related": ["LinearProgress", "Slider", "Text"],
27
27
  "properties": {
28
+ "react": {
29
+ "description": {
30
+ "description": "Static helper copy rendered with `Text` below the meter track."
31
+ },
32
+ "label": {
33
+ "description": "Visible label rendered through `Meter.Label` with shared internal `FieldLabel`."
34
+ },
35
+ "showValue": {
36
+ "description": "Renders the formatted current value via `Meter.Value` and `Text`."
37
+ }
38
+ },
28
39
  "css": {
29
- "track-size": {
30
- "description": "Meter track thickness on the root."
40
+ "indicator-color": {
41
+ "description": "Determinate meter indicator color."
31
42
  },
32
43
  "track-background": {
33
44
  "description": "Meter track background color."
34
45
  },
35
- "indicator-color": {
36
- "description": "Determinate meter indicator color."
46
+ "track-size": {
47
+ "description": "Meter track thickness on the root."
37
48
  }
38
49
  }
39
50
  }
@@ -43,7 +43,6 @@ var Meter$1 = ({ className, description, label, showValue = false, value, ...oth
43
43
  children: /* @__PURE__ */ jsx(Meter.Indicator, { className: meter_module_default.Indicator })
44
44
  }),
45
45
  description && /* @__PURE__ */ jsx(Text, {
46
- className: meter_module_default.Description,
47
46
  size: "small",
48
47
  tone: "muted",
49
48
  children: description
@@ -2,8 +2,8 @@ import { ChromeXmark } from "../../internal/chrome-icons/chrome-icons.js";
2
2
  import { Text } from "../text/text.js";
3
3
  import { Stack } from "../stack/stack.js";
4
4
  import { IconButton } from "../icon-button/icon-button.js";
5
- import popover_module_default from "./popover.module.js";
6
5
  import { Surface } from "../surface/surface.js";
6
+ import popover_module_default from "./popover.module.js";
7
7
  import { Title } from "../title/title.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { Popover } from "@base-ui/react/popover";
@@ -25,5 +25,29 @@
25
25
  "Rendering heavy or scroll-bound content that belongs in a Dialog",
26
26
  "Expecting `Popover.Arrow` (it is intentionally not exported or rendered)"
27
27
  ],
28
- "related": ["Surface", "Button", "IconButton", "Stack", "Dialog", "Tabs"]
28
+ "related": ["Surface", "Button", "IconButton", "Stack", "Dialog", "Tabs"],
29
+ "properties": {
30
+ "react": {
31
+ "Sheet.description": {
32
+ "description": "Supporting copy announced with the title."
33
+ },
34
+ "Sheet.headerAlign": {
35
+ "description": "Aligns the header content."
36
+ },
37
+ "Sheet.showCloseButton": {
38
+ "description": "Whether to show the built-in flat IconButton close control."
39
+ },
40
+ "Sheet.title": {
41
+ "description": "Accessible popover title rendered as the popup heading."
42
+ },
43
+ "Sheet.unstyled": {
44
+ "description": "Whether to skip the built-in Surface, header, and close chrome and render only the positioning/animation shell (Portal + Positioner + Popup + Viewport)."
45
+ }
46
+ },
47
+ "css": {
48
+ "content-fade-duration": {
49
+ "description": "content fade duration custom property on the component root."
50
+ }
51
+ }
52
+ }
29
53
  }
@@ -1 +1 @@
1
- @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-progressive-blur-amount{syntax:"<length>";inherits:true;initial-value:16px}.viraui__progressive-blur-module__ProgressiveBlur_eIxTK{pointer-events:none}.viraui__progressive-blur-module__Layer_zbzMS{position:absolute;inset:0;backdrop-filter:blur(calc(var(--vui-progressive-blur-amount) * var(--progressive-blur-factor)));mask-image:var(--progressive-blur-mask-image);.viraui__progressive-blur-module__ProgressiveBlur_eIxTK[data-direction=top] &{--progressive-blur-mask-image:linear-gradient(to top,var(--progressive-blur-mask-gradient))}.viraui__progressive-blur-module__ProgressiveBlur_eIxTK[data-direction=right] &{--progressive-blur-mask-image:linear-gradient(to right,var(--progressive-blur-mask-gradient))}.viraui__progressive-blur-module__ProgressiveBlur_eIxTK[data-direction=bottom] &{--progressive-blur-mask-image:linear-gradient(to bottom,var(--progressive-blur-mask-gradient))}.viraui__progressive-blur-module__ProgressiveBlur_eIxTK[data-direction=left] &{--progressive-blur-mask-image:linear-gradient(to left,var(--progressive-blur-mask-gradient))}}}
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-progressive-blur-amount{syntax:"<length>";inherits:true;initial-value:16px}@property --__progressive-blur-factor{syntax:"<number>";inherits:false;initial-value:1}@property --__progressive-blur-mask-image{syntax:"<image>";inherits:false;initial-value:linear-gradient(#0000,#0000)}@property --__progressive-blur-mask-gradient{syntax:"*";inherits:false;initial-value:#0000}.viraui__progressive-blur-module__ProgressiveBlur_eIxTK{pointer-events:none;&[data-direction=top]{& .viraui__progressive-blur-module__Layer_zbzMS{--__progressive-blur-mask-image:linear-gradient(to top,var(--__progressive-blur-mask-gradient))}}&[data-direction=right]{& .viraui__progressive-blur-module__Layer_zbzMS{--__progressive-blur-mask-image:linear-gradient(to right,var(--__progressive-blur-mask-gradient))}}&[data-direction=bottom]{& .viraui__progressive-blur-module__Layer_zbzMS{--__progressive-blur-mask-image:linear-gradient(to bottom,var(--__progressive-blur-mask-gradient))}}&[data-direction=left]{& .viraui__progressive-blur-module__Layer_zbzMS{--__progressive-blur-mask-image:linear-gradient(to left,var(--__progressive-blur-mask-gradient))}}}.viraui__progressive-blur-module__Layer_zbzMS{position:absolute;inset:0;backdrop-filter:blur(calc(var(--vui-progressive-blur-amount) * var(--__progressive-blur-factor)));mask-image:var(--__progressive-blur-mask-image)}}
@@ -13,14 +13,15 @@
13
13
  "Cases where a single uniform backdrop blur is sufficient"
14
14
  ],
15
15
  "accessibility": [
16
- "ProgressiveBlur is decorative — the root renders with aria-hidden by default",
16
+ "ProgressiveBlur is decorative — the root hardcodes `aria-hidden=\"true\"` (not overridable via props)",
17
17
  "Parent surface or region must expose any meaningful label or busy state",
18
- "Consumer owns position, inset, z-index, and sizing for the overlay placement"
18
+ "Consumer must position the root non-static (for example `position: relative`/`absolute`/`fixed`) and own inset, z-index, and sizing ProgressiveBlur does not create a containing block"
19
19
  ],
20
20
  "antiPatterns": [
21
21
  "Stacking many full-viewport ProgressiveBlur instances on one screen",
22
22
  "Driving layout size or scroll behavior from inside the overlay component",
23
- "Embedding layout positioning rules inside the component stylesheet"
23
+ "Embedding layout positioning rules inside the component stylesheet",
24
+ "Leaving the ProgressiveBlur root `position: static` so absolute layers escape the intended overlay box"
24
25
  ],
25
26
  "related": ["Surface", "StaticNoise"],
26
27
  "properties": {
@@ -28,11 +29,20 @@
28
29
  "blur": {
29
30
  "description": "Sets the maximum blur radius applied to the first layer at the selected edge.",
30
31
  "refCss": "amount"
32
+ },
33
+ "direction": {
34
+ "description": "Selects the edge where maximum blur starts and fades toward the opposite edge."
35
+ },
36
+ "easing": {
37
+ "description": "Selects the easing curve used to distribute blur factors across internal layers."
38
+ },
39
+ "steps": {
40
+ "description": "Sets the number of internal blur layers. Values are clamped to `2..16`."
31
41
  }
32
42
  },
33
43
  "css": {
34
44
  "amount": {
35
- "description": "Maximum blur amount for progressive blur layers.",
45
+ "description": "Sets the maximum blur radius applied to the first layer at the selected edge.",
36
46
  "refReact": "blur"
37
47
  }
38
48
  }
@@ -17,8 +17,8 @@ var ProgressiveBlur = ({ blur = "16px", className, direction = "bottom", easing
17
17
  "aria-hidden": "true",
18
18
  className: progressive_blur_module_default.Layer,
19
19
  style: {
20
- "--progressive-blur-factor": factor,
21
- "--progressive-blur-mask-gradient": maskGradient
20
+ "--__progressive-blur-factor": factor,
21
+ "--__progressive-blur-mask-gradient": maskGradient
22
22
  }
23
23
  }, layerIndex);
24
24
  });
@@ -1 +1 @@
1
- @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-radio-size{syntax:"<length>";inherits:false;initial-value:0}@property --vui-radio-background{syntax:"<color>";inherits:false;initial-value:#0000}@property --vui-radio-border-color{syntax:"<color>";inherits:false;initial-value:#0000}@property --vui-radio-indicator-color{syntax:"<color>";inherits:true;initial-value:#0000}.viraui__radio-module__RadioRoot_3uvvn{--vui-radio-size:var(--space-medium);--vui-radio-background:var(--global-contrast);--vui-radio-indicator-color:contrast-color(var(--global-primary));--radio-disk-size:calc(var(--vui-radio-size) / 2);position:relative;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;appearance:none;border:0;box-shadow:inset 0 0 0 1px var(--vui-radio-border-color);inline-size:var(--vui-radio-size);block-size:var(--vui-radio-size);background:var(--vui-radio-background);border-radius:100000px;corner-shape:unset;&[data-size=regular]{--vui-radio-size:var(--space-large)}&[data-checked]:not([data-disabled]):not([data-invalid]){--vui-radio-background:var(--global-primary);--vui-radio-border-color:var(--global-primary);box-shadow:none}&[data-invalid]:not([data-disabled]),[data-invalid] &:not([data-disabled]){--vui-radio-border-color:var(--highlight-red);--vui-radio-indicator-color:var(--global-primary);box-shadow:inset 0 0 0 1px var(--highlight-red);outline-color:oklab(from var(--highlight-red) l a b/.5)}&[data-disabled],[data-disabled] &{--vui-radio-background:var(--global-disabled-background);--vui-radio-border-color:#0000;--vui-radio-indicator-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}}.viraui__radio-module__Indicator_Ecavw{display:inline-flex;align-items:center;justify-content:center;color:var(--vui-radio-indicator-color)}.viraui__radio-module__Disk_pV-Q1{inline-size:var(--radio-disk-size);aspect-ratio:1/1;border-radius:100000px;corner-shape:unset;background:currentColor}.viraui__radio-module__RadioRoot_3uvvn:not([data-checked]) .viraui__radio-module__Disk_pV-Q1{display:none}}
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-radio-size{syntax:"<length>";inherits:false;initial-value:0}@property --vui-radio-background{syntax:"<color>";inherits:false;initial-value:#0000}@property --vui-radio-border-color{syntax:"<color>";inherits:false;initial-value:#0000}@property --vui-radio-indicator-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --__radio-disk-size{syntax:"<length>";inherits:true;initial-value:0}.viraui__radio-module__RadioRoot_3uvvn{--vui-radio-size:var(--space-medium);--vui-radio-background:var(--global-contrast);--vui-radio-indicator-color:contrast-color(var(--global-primary));--__radio-disk-size:calc(var(--vui-radio-size) / 2);position:relative;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;appearance:none;border:0;box-shadow:inset 0 0 0 1px var(--vui-radio-border-color);inline-size:var(--vui-radio-size);block-size:var(--vui-radio-size);background:var(--vui-radio-background);border-radius:100000px;corner-shape:unset;&[data-size=regular]{--vui-radio-size:var(--space-large)}&[data-checked]:not([data-disabled]):not([data-invalid]){--vui-radio-background:var(--global-primary);--vui-radio-border-color:var(--global-primary);box-shadow:none}&[data-invalid]:not([data-disabled]),[data-invalid] &:not([data-disabled]){--vui-radio-border-color:var(--highlight-red);--vui-radio-indicator-color:var(--global-primary);box-shadow:inset 0 0 0 1px var(--highlight-red);outline-color:oklab(from var(--highlight-red) l a b/.5)}&[data-disabled],[data-disabled] &{--vui-radio-background:var(--global-disabled-background);--vui-radio-border-color:#0000;--vui-radio-indicator-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}}.viraui__radio-module__Indicator_Ecavw{display:inline-flex;align-items:center;justify-content:center;color:var(--vui-radio-indicator-color)}.viraui__radio-module__Disk_pV-Q1{inline-size:var(--__radio-disk-size);aspect-ratio:1/1;border-radius:100000px;corner-shape:unset;background:currentColor}.viraui__radio-module__RadioRoot_3uvvn:not([data-checked]) .viraui__radio-module__Disk_pV-Q1{display:none}}
@@ -27,5 +27,38 @@
27
27
  "Omitting the RadioGroup generic when option value props form a restricted union",
28
28
  "Importing @viraui/react/radio/radio.css or other component CSS subpaths in consumer bootstrap"
29
29
  ],
30
- "related": ["Fieldset", "Checkbox", "Surface", "Stack"]
30
+ "related": ["Fieldset", "Checkbox", "Surface", "Stack"],
31
+ "properties": {
32
+ "react": {
33
+ "description": {
34
+ "description": "Helper copy rendered with `Field.Description` and `Text` for this option."
35
+ },
36
+ "hPadding": {
37
+ "description": "Sets inline padding using one token for both sides or a `[start, end]` tuple."
38
+ },
39
+ "label": {
40
+ "description": "Visible label rendered with shared internal `FieldLabel`."
41
+ },
42
+ "size": {
43
+ "description": "Controls the visual radio size."
44
+ },
45
+ "vPadding": {
46
+ "description": "Sets block padding using one token for both sides or a `[start, end]` tuple."
47
+ }
48
+ },
49
+ "css": {
50
+ "background": {
51
+ "description": "Radio control background color."
52
+ },
53
+ "border-color": {
54
+ "description": "Radio control border color; resting default is transparent (same as Checkbox); checked, invalid, and disabled states override."
55
+ },
56
+ "indicator-color": {
57
+ "description": "Radio selected-disk indicator color."
58
+ },
59
+ "size": {
60
+ "description": "Radio control size; size presets adjust footprint."
61
+ }
62
+ }
63
+ }
31
64
  }
@@ -10,38 +10,35 @@ import { Radio } from "@base-ui/react/radio";
10
10
  //#region src/components/radio/radio.tsx
11
11
  var Radio$1 = ({ className, description, disabled, id, label, ref, size = "small", vPadding, hPadding, value, ...radioRootProps }) => {
12
12
  const hasTextDescription = Boolean(description);
13
- return /* @__PURE__ */ jsx(Field.Item, { children: /* @__PURE__ */ jsx(Field.Label, {
14
- className: radio_module_default.Label,
15
- children: /* @__PURE__ */ jsxs(Stack, {
16
- direction: "row",
17
- columnGap: size === "small" ? "small" : "medium",
13
+ return /* @__PURE__ */ jsx(Field.Item, { children: /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsxs(Stack, {
14
+ direction: "row",
15
+ columnGap: size === "small" ? "small" : "medium",
16
+ fillChildren: false,
17
+ vAlign: hasTextDescription ? "start" : "center",
18
+ hPadding,
19
+ vPadding,
20
+ children: [/* @__PURE__ */ jsx(Radio.Root, {
21
+ ...radioRootProps,
22
+ className: clsx(radio_module_default.RadioRoot, className),
23
+ "data-size": size,
24
+ disabled,
25
+ id,
26
+ ref,
27
+ value,
28
+ children: /* @__PURE__ */ jsx(Radio.Indicator, {
29
+ className: radio_module_default.Indicator,
30
+ children: /* @__PURE__ */ jsx("span", { className: radio_module_default.Disk })
31
+ })
32
+ }), label || description ? /* @__PURE__ */ jsxs(Stack, {
33
+ direction: "column",
18
34
  fillChildren: false,
19
- vAlign: hasTextDescription ? "start" : "center",
20
- hPadding,
21
- vPadding,
22
- children: [/* @__PURE__ */ jsx(Radio.Root, {
23
- ...radioRootProps,
24
- className: clsx(radio_module_default.RadioRoot, className),
25
- "data-size": size,
26
- disabled,
27
- id,
28
- ref,
29
- value,
30
- children: /* @__PURE__ */ jsx(Radio.Indicator, {
31
- className: radio_module_default.Indicator,
32
- children: /* @__PURE__ */ jsx("span", { className: radio_module_default.Disk })
33
- })
34
- }), label || description ? /* @__PURE__ */ jsxs(Stack, {
35
- direction: "column",
36
- fillChildren: false,
37
- rowGap: "small",
38
- children: [label && /* @__PURE__ */ jsx(FieldLabel, {
39
- size: size === "small" ? "small" : "medium",
40
- children: label
41
- }), /* @__PURE__ */ jsx(FieldHelperCopy, { description })]
42
- }) : null]
43
- })
44
- }) });
35
+ rowGap: "small",
36
+ children: [label && /* @__PURE__ */ jsx(FieldLabel, {
37
+ size: size === "small" ? "small" : "medium",
38
+ children: label
39
+ }), /* @__PURE__ */ jsx(FieldHelperCopy, { description })]
40
+ }) : null]
41
+ }) }) });
45
42
  };
46
43
  //#endregion
47
44
  export { Radio$1 as Radio };
@@ -22,7 +22,7 @@ function SelectGroup({ children, className, label, ...groupProps }) {
22
22
  direction: "row",
23
23
  fillChildren: false,
24
24
  hPadding: "small",
25
- vPadding: ["small", "small"],
25
+ vPadding: ["small", "x-small"],
26
26
  vAlign: "center"
27
27
  }),
28
28
  children: [/* @__PURE__ */ jsx(Text, {
@@ -26,4 +26,4 @@ export type SelectOptionProps = SelectItem.Props & {
26
26
  */
27
27
  indicator?: React.ReactNode;
28
28
  };
29
- export declare function SelectOption({ addon, addonAlign, children, className, disabled, indicator, label, value, ...itemProps }: SelectOptionProps): React.JSX.Element;
29
+ export declare function SelectOption({ addon, addonAlign, children, className, indicator, label, ...itemProps }: SelectOptionProps): React.JSX.Element;
@@ -2,21 +2,19 @@ import { clsx } from "../../core/clsx.js";
2
2
  import { ChromeCheck } from "../../internal/chrome-icons/chrome-icons.js";
3
3
  import { Text } from "../text/text.js";
4
4
  import { Stack } from "../stack/stack.js";
5
+ import { Surface } from "../surface/surface.js";
5
6
  import select_module_default from "./select.module.js";
6
7
  import { SelectIndicatorSlot } from "./select-indicator-slot.js";
7
- import { Surface } from "../surface/surface.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import { Select } from "@base-ui/react";
10
10
  //#region src/components/select/select-option.tsx
11
- function SelectOption({ addon, addonAlign = "center", children, className, disabled, indicator, label, value, ...itemProps }) {
11
+ function SelectOption({ addon, addonAlign = "center", children, className, indicator, label, ...itemProps }) {
12
12
  return /* @__PURE__ */ jsx(Select.Item, {
13
13
  ...itemProps,
14
14
  "aria-label": label,
15
15
  label,
16
16
  className: clsx(select_module_default.Option, className),
17
- disabled,
18
17
  render: /* @__PURE__ */ jsx(Surface, { radius: "auto" }),
19
- value,
20
18
  children: /* @__PURE__ */ jsxs(Stack, {
21
19
  columnGap: "medium",
22
20
  direction: "row",
@@ -29,7 +27,6 @@ function SelectOption({ addon, addonAlign = "center", children, className, disab
29
27
  vAlign: addonAlign,
30
28
  fillChildren: false,
31
29
  children: [addon && /* @__PURE__ */ jsx(Stack, {
32
- vPadding: "2x-small",
33
30
  "aria-hidden": "true",
34
31
  "data-grow": "false",
35
32
  "data-shrink": "false",
@@ -1,13 +1,16 @@
1
- import { clsx } from "../../core/clsx.js";
2
- import select_module_default from "./select.module.js";
1
+ import { Separator } from "../separator/separator.js";
3
2
  import { jsx } from "react/jsx-runtime";
4
3
  import { Select } from "@base-ui/react/select";
5
4
  //#region src/components/select/select-separator.tsx
6
5
  function SelectSeparator({ className, orientation = "horizontal", ...separatorProps }) {
7
6
  return /* @__PURE__ */ jsx(Select.Separator, {
8
7
  ...separatorProps,
9
- className: clsx(select_module_default.Separator, className),
10
- orientation
8
+ className,
9
+ orientation,
10
+ render: /* @__PURE__ */ jsx(Separator, {
11
+ vPadding: "x-small",
12
+ hPadding: "x-small"
13
+ })
11
14
  });
12
15
  }
13
16
  //#endregion
@@ -1 +1 @@
1
- @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-select-input-height{syntax:"<length>";inherits:true;initial-value:0}@property --vui-select-control-group-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-select-control-group-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-select-control-group-border-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-select-control-group-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --vui-select-trigger-padding-inline-start{syntax:"<length>";inherits:true;initial-value:0}@property --vui-select-trigger-padding-inline-end{syntax:"<length>";inherits:true;initial-value:0}@property --vui-select-list-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --vui-select-list-padding{syntax:"<length>";inherits:true;initial-value:0}.viraui__select-module__Select_eXv4Y{--vui-select-input-height:var(--space-x-large);--vui-select-control-group-background:var(--base-1);--vui-select-control-group-color:var(--global-foreground);--vui-select-control-group-border-color:var(--global-contrast);--vui-select-control-group-border-radius:var(--radius-medium);--vui-select-trigger-padding-inline-start:var(--space-small);--vui-select-trigger-padding-inline-end:var(--space-x-small);--vui-field-label-padding-inline:calc((var(--vui-select-control-group-border-radius) + 0px) / 2);--select-list-appear-offest:8px;z-index:0;&:has([required]) .viraui__select-module__Label_-Y1fR:after{content:" *";color:var(--highlight-red)}&[data-invalid]>.viraui__select-module__Trigger_-wBsg:not(:disabled):not([data-disabled]){--vui-select-control-group-border-color:var(--highlight-red);box-shadow:none;outline-color:oklab(from var(--highlight-red) l a b/.5)}}.viraui__select-module__Trigger_-wBsg{box-sizing:border-box;inline-size:100%;min-inline-size:0;block-size:var(--vui-select-input-height);padding-inline:var(--vui-select-trigger-padding-inline-start) var(--vui-select-trigger-padding-inline-end);border:1px solid var(--vui-select-control-group-border-color);border-radius:var(--vui-select-control-group-border-radius);background:var(--vui-select-control-group-background);color:var(--vui-select-control-group-color);font:inherit;text-align:start;cursor:pointer;&[data-popup-open]{outline:none}&:disabled,&[data-disabled]{--vui-select-control-group-background:var(--global-disabled-background);--vui-select-control-group-border-color:#0000;--vui-select-control-group-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}}.viraui__select-module__Icon_EOwki{font-size:var(--font-scale-body-small);pointer-events:none}.viraui__select-module__Description_OmwmV{padding-inline:calc((var(--vui-select-control-group-border-radius) + 0px) / 2)}.viraui__select-module__SelectPopup_UzGXL{--vui-select-list-border-radius:var(--radius-medium);--vui-select-list-padding:var(--space-x-small);box-sizing:border-box;min-inline-size:var(--anchor-width);overflow:visible;color:var(--global-foreground);outline:none;position:relative;transform-origin:var(--transform-origin);transition:opacity var(--duration-instant) var(--easing-entrance),scale var(--duration-instant) var(--easing-entrance),translate var(--duration-instant) var(--easing-entrance);&[data-ending-style],&[data-starting-style]{opacity:0;scale:.96}&[data-side=bottom][data-ending-style],&[data-side=bottom][data-starting-style]{scale:.96;translate:0 calc(var(--select-list-appear-offest) * -1)}&[data-side=top][data-ending-style],&[data-side=top][data-starting-style]{scale:.96;translate:0 var(--select-list-appear-offest)}&[data-side=inline-start][data-ending-style],&[data-side=inline-start][data-starting-style],&[data-side=left][data-ending-style],&[data-side=left][data-starting-style]{scale:.96;translate:var(--select-list-appear-offest) 0}&[data-side=inline-end][data-ending-style],&[data-side=inline-end][data-starting-style],&[data-side=right][data-ending-style],&[data-side=right][data-starting-style]{scale:.96;translate:calc(var(--select-list-appear-offest) * -1) 0}&[data-side=none]{transition:none;scale:1;translate:0;opacity:1}}.viraui__select-module__ScrollArrow_kHlEi{position:absolute;inset-inline:0;z-index:1;inline-size:100%;block-size:var(--space-large);cursor:default;background:var(--base-1);border:1px solid var(--global-contrast);@container root not style(--vibrancy-enable: initial){background:oklab(from var(--base-1) l a b/80%);backdrop-filter:brightness(var(--vibrancy-brightness)) blur(calc(var(--vibrancy-blur) * 1px))}}.viraui__select-module__ScrollButton_sHBOa{pointer-events:none}.viraui__select-module__ScrollArrowUp_DGXS-{inset-block-start:0;border-radius:var(--vui-select-list-border-radius) var(--vui-select-list-border-radius) 0 0}.viraui__select-module__ScrollArrowDown_vhJy0{inset-block-end:0;border-radius:0 0 var(--vui-select-list-border-radius) var(--vui-select-list-border-radius)}.viraui__select-module__List_jdUWx{box-sizing:border-box;inline-size:100%;max-block-size:var(--available-height);scroll-padding-block:var(--vui-select-list-padding);list-style:none;overscroll-behavior:contain;&:focus,&:focus-visible{outline:none}}.viraui__select-module__OptionText_UynBD{flex:1 1 auto;min-inline-size:0}.viraui__select-module__Indicator_YNUuz{inline-size:var(--space-medium);color:var(--global-primary);opacity:0;transition:opacity var(--duration-fast) var(--easing-standard),transform var(--duration-fast) var(--easing-standard);&[data-selected]{opacity:1}}.viraui__select-module__Group_xzkuA+.viraui__select-module__Group_xzkuA{margin-block-start:var(--space-medium)}.viraui__select-module__Separator_Q-ri9{block-size:1px;margin-block:var(--space-small);margin-inline:var(--space-small);background:var(--base-3)}}@layer viraui.overrides{.viraui__select-module__Value_uWHPX{--text-fluid-factor:0;--text-font-size:var(--font-scale-body-small);flex:1 1 auto;min-inline-size:0;overflow:hidden;display:block;text-overflow:ellipsis;&[data-placeholder]{color:var(--global-disabled-foreground)}}.viraui__select-module__Option_KgYqz{border-radius:calc((var(--vui-select-list-border-radius) + 0px) - var(--vui-select-list-padding));cursor:pointer;&:focus{outline:none}&:focus-visible{outline:none;box-shadow:none}&:not([data-disabled]):hover,&:not([data-disabled])[data-highlighted]{background:var(--global-contrast);@container root not style(--vibrancy-enable: initial){background:oklab(from var(--global-contrast) l a b/12%)}}&:not([data-disabled],:hover)[data-selected]{background:light-dark(oklab(from var(--global-contrast) l a b/8%),oklab(from var(--global-contrast) l a b/5%))}&[data-disabled]{color:var(--global-disabled-foreground);cursor:not-allowed}}}
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-select-input-height{syntax:"<length>";inherits:true;initial-value:0}@property --vui-select-control-group-background{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-select-control-group-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-select-control-group-border-color{syntax:"<color>";inherits:true;initial-value:#0000}@property --vui-select-control-group-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --vui-select-trigger-padding-inline-start{syntax:"<length>";inherits:true;initial-value:0}@property --vui-select-trigger-padding-inline-end{syntax:"<length>";inherits:true;initial-value:0}@property --vui-select-list-border-radius{syntax:"<length-percentage>";inherits:true;initial-value:0}@property --vui-select-list-padding{syntax:"<length>";inherits:true;initial-value:0}@property --__select-list-appear-offset{syntax:"<length>";inherits:false;initial-value:8px}.viraui__select-module__Select_eXv4Y{--vui-select-input-height:var(--space-x-large);--vui-select-control-group-background:var(--base-1);--vui-select-control-group-color:var(--global-foreground);--vui-select-control-group-border-color:var(--global-contrast);--vui-select-control-group-border-radius:var(--radius-medium);--vui-select-trigger-padding-inline-start:var(--space-small);--vui-select-trigger-padding-inline-end:var(--space-x-small);--vui-field-label-padding-inline:calc((var(--vui-select-control-group-border-radius) + 0px) / 2);z-index:0;&:has([required]) .viraui__select-module__Label_-Y1fR:after{content:" *";color:var(--highlight-red)}&[data-invalid]>.viraui__select-module__Trigger_-wBsg:not(:disabled):not([data-disabled]){--vui-select-control-group-border-color:var(--highlight-red);box-shadow:none;outline-color:oklab(from var(--highlight-red) l a b/.5)}}.viraui__select-module__Trigger_-wBsg{box-sizing:border-box;inline-size:100%;min-inline-size:0;block-size:var(--vui-select-input-height);padding-inline:var(--vui-select-trigger-padding-inline-start) var(--vui-select-trigger-padding-inline-end);border:1px solid var(--vui-select-control-group-border-color);border-radius:var(--vui-select-control-group-border-radius);background:var(--vui-select-control-group-background);color:var(--vui-select-control-group-color);font:inherit;text-align:start;cursor:pointer;&[data-popup-open]{outline:none}&:disabled,&[data-disabled]{--vui-select-control-group-background:var(--global-disabled-background);--vui-select-control-group-border-color:#0000;--vui-select-control-group-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}}.viraui__select-module__Icon_EOwki{font-size:var(--font-scale-body-small);pointer-events:none}.viraui__select-module__Description_OmwmV{padding-inline:calc((var(--vui-select-control-group-border-radius) + 0px) / 2)}.viraui__select-module__SelectPopup_UzGXL{--vui-select-list-border-radius:var(--radius-medium);--vui-select-list-padding:var(--space-x-small);box-sizing:border-box;min-inline-size:var(--anchor-width);overflow:visible;color:var(--global-foreground);outline:none;position:relative;transform-origin:var(--transform-origin);transition:opacity var(--duration-instant) var(--easing-entrance),scale var(--duration-instant) var(--easing-entrance),translate var(--duration-instant) var(--easing-entrance);&[data-ending-style],&[data-starting-style]{opacity:0;scale:.96}&[data-side=bottom][data-ending-style],&[data-side=bottom][data-starting-style]{translate:0 calc(var(--__select-list-appear-offset) * -1)}&[data-side=top][data-ending-style],&[data-side=top][data-starting-style]{translate:0 var(--__select-list-appear-offset)}&[data-side=inline-start][data-ending-style],&[data-side=inline-start][data-starting-style],&[data-side=left][data-ending-style],&[data-side=left][data-starting-style]{translate:var(--__select-list-appear-offset) 0}&[data-side=inline-end][data-ending-style],&[data-side=inline-end][data-starting-style],&[data-side=right][data-ending-style],&[data-side=right][data-starting-style]{translate:calc(var(--__select-list-appear-offset) * -1) 0}&[data-side=none]{transition:none;scale:1;translate:0;opacity:1}}.viraui__select-module__ScrollArrow_kHlEi{position:absolute;inset-inline:0;z-index:1;inline-size:100%;block-size:var(--space-large);cursor:default;background:var(--base-1);border:1px solid var(--global-contrast);@container root not style(--vibrancy-enable: initial){background:oklab(from var(--base-1) l a b/80%);backdrop-filter:brightness(var(--vibrancy-brightness)) blur(calc(var(--vibrancy-blur) * 1px))}}.viraui__select-module__ScrollButton_sHBOa{pointer-events:none}.viraui__select-module__ScrollArrowUp_DGXS-{inset-block-start:0;border-radius:var(--vui-select-list-border-radius) var(--vui-select-list-border-radius) 0 0}.viraui__select-module__ScrollArrowDown_vhJy0{inset-block-end:0;border-radius:0 0 var(--vui-select-list-border-radius) var(--vui-select-list-border-radius)}.viraui__select-module__List_jdUWx{box-sizing:border-box;inline-size:100%;max-block-size:var(--available-height);scroll-padding-block:var(--vui-select-list-padding);overscroll-behavior:contain;&:focus,&:focus-visible{outline:none}}.viraui__select-module__Indicator_YNUuz{min-inline-size:var(--space-medium);min-block-size:var(--space-medium);inline-size:fit-content;block-size:fit-content;color:var(--global-primary);opacity:0;transition:opacity var(--duration-fast) var(--easing-standard),transform var(--duration-fast) var(--easing-standard);&[data-selected]{opacity:1}}.viraui__select-module__Group_xzkuA+.viraui__select-module__Group_xzkuA{margin-block-start:var(--space-medium)}}@layer viraui.overrides{.viraui__select-module__Value_uWHPX{flex:1 1 auto;min-inline-size:0;overflow:hidden;display:block;text-overflow:ellipsis;&[data-placeholder]{color:var(--global-disabled-foreground)}}.viraui__select-module__Option_KgYqz{cursor:pointer;&:focus{outline:none}&:focus-visible{outline:none;box-shadow:none}&:not([data-disabled]):hover,&:not([data-disabled])[data-highlighted]{background:var(--global-contrast);@container root not style(--vibrancy-enable: initial){background:oklab(from var(--global-contrast) l a b/12%)}}&:not([data-disabled],:hover)[data-selected]{background:light-dark(oklab(from var(--global-contrast) l a b/8%),oklab(from var(--global-contrast) l a b/5%))}&[data-disabled]{color:var(--global-disabled-foreground);cursor:not-allowed}}}
@@ -26,27 +26,68 @@
26
26
  ],
27
27
  "related": ["Fieldset", "Textfield", "Stack", "Surface", "Icon"],
28
28
  "properties": {
29
- "css": {
30
- "input-height": {
31
- "description": "Select trigger block size."
29
+ "react": {
30
+ "addon": {
31
+ "description": "Trigger addon rendered inside `Select.Icon`. Pass any React node; use a named icon from `@viraui/icons/react` for content icons."
32
+ },
33
+ "alignListWithTrigger": {
34
+ "description": "When `true`, aligns the list popup width with the trigger via Base UI `alignItemWithTrigger`. Prefer `false` when options use a leading `addon`."
35
+ },
36
+ "description": {
37
+ "description": "Helper copy rendered with `Field.Description` and `Text` while the field is valid."
38
+ },
39
+ "error": {
40
+ "description": "Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid."
41
+ },
42
+ "Group.label": {
43
+ "description": "Accessible group label rendered with `Select.GroupLabel`."
44
+ },
45
+ "label": {
46
+ "description": "Visible label rendered with shared internal `FieldLabel`."
32
47
  },
48
+ "Option.addon": {
49
+ "description": "Decorative leading node rendered before the option label."
50
+ },
51
+ "Option.addonAlign": {
52
+ "description": "Vertical alignment of the addon relative to the option label row."
53
+ },
54
+ "Option.indicator": {
55
+ "description": "Custom indicator node rendered when the option is selected."
56
+ },
57
+ "placeholder": {
58
+ "description": "Placeholder text shown in the trigger when no value is selected."
59
+ },
60
+ "ref": {
61
+ "description": "Ref forwarded to the select trigger button."
62
+ }
63
+ },
64
+ "css": {
33
65
  "control-group-background": {
34
66
  "description": "Trigger background fill."
35
67
  },
36
- "control-group-color": {
37
- "description": "Trigger text and icon color."
38
- },
39
68
  "control-group-border-color": {
40
69
  "description": "Trigger border color; invalid state overrides."
41
70
  },
42
71
  "control-group-border-radius": {
43
72
  "description": "Trigger corner radius."
44
73
  },
45
- "trigger-padding-inline-start": {
46
- "description": "Trigger inline-start padding."
74
+ "control-group-color": {
75
+ "description": "Trigger text and icon color."
76
+ },
77
+ "input-height": {
78
+ "description": "Select trigger block size."
79
+ },
80
+ "list-border-radius": {
81
+ "description": "list border radius custom property on the component root."
82
+ },
83
+ "list-padding": {
84
+ "description": "list padding custom property on the component root."
47
85
  },
48
86
  "trigger-padding-inline-end": {
49
87
  "description": "Trigger inline-end padding."
88
+ },
89
+ "trigger-padding-inline-start": {
90
+ "description": "Trigger inline-start padding."
50
91
  }
51
92
  }
52
93
  }
@@ -8,11 +8,11 @@ import { FieldLabel } from "../basic-input/field-label.js";
8
8
  import { Stack } from "../stack/stack.js";
9
9
  import { Elevator } from "../elevator/elevator.js";
10
10
  import { IconButton } from "../icon-button/icon-button.js";
11
+ import { Surface } from "../surface/surface.js";
11
12
  import select_module_default from "./select.module.js";
12
13
  import { SelectGroup } from "./select-group.js";
13
14
  import { SelectOption } from "./select-option.js";
14
15
  import { SelectSeparator } from "./select-separator.js";
15
- import { Surface } from "../surface/surface.js";
16
16
  import { jsx, jsxs } from "react/jsx-runtime";
17
17
  import { useId } from "react";
18
18
  import { Field } from "@base-ui/react/field";