@viraui/react 2026.7.0 → 2026.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/dist/catalog.json +9 -3
  2. package/dist/components/button/button.css +1 -1
  3. package/dist/components/direction-provider/index.d.ts +2 -0
  4. package/dist/components/direction-provider/index.js +2 -0
  5. package/dist/components/index.d.ts +1 -0
  6. package/dist/components/menu/menu-popup.d.ts +2 -2
  7. package/dist/components/menu/menu.css +1 -1
  8. package/dist/components/progressive-blur/progressive-blur.css +1 -1
  9. package/dist/components/prose/prose.d.ts +5 -4
  10. package/dist/components/select/select-group.js +1 -1
  11. package/dist/components/select/select.d.ts +4 -1
  12. package/dist/components/select/select.js +4 -1
  13. package/dist/components/spinner/spinner.d.ts +6 -1
  14. package/dist/components/spinner/variants/arc.css +1 -0
  15. package/dist/components/spinner/variants/arc.d.ts +2 -0
  16. package/dist/components/spinner/variants/arc.js +19 -0
  17. package/dist/components/spinner/variants/arc.module.js +8 -0
  18. package/dist/components/spinner/variants/atom.css +1 -0
  19. package/dist/components/spinner/variants/atom.d.ts +6 -0
  20. package/dist/components/spinner/variants/atom.js +40 -0
  21. package/dist/components/spinner/variants/atom.module.js +8 -0
  22. package/dist/components/spinner/variants/blocks.css +1 -0
  23. package/dist/components/spinner/variants/blocks.d.ts +2 -0
  24. package/dist/components/spinner/variants/blocks.js +25 -0
  25. package/dist/components/spinner/variants/blocks.module.js +8 -0
  26. package/dist/components/spinner/variants/bouncing-dots.css +1 -0
  27. package/dist/components/spinner/variants/bouncing-dots.d.ts +2 -0
  28. package/dist/components/spinner/variants/bouncing-dots.js +21 -0
  29. package/dist/components/spinner/variants/bouncing-dots.module.js +8 -0
  30. package/dist/components/spinner/variants/cascade.css +1 -0
  31. package/dist/components/spinner/variants/cascade.d.ts +2 -0
  32. package/dist/components/spinner/variants/cascade.js +34 -0
  33. package/dist/components/spinner/variants/cascade.module.js +8 -0
  34. package/dist/components/spinner/variants/circular-dots.css +1 -0
  35. package/dist/components/spinner/variants/circular-dots.d.ts +2 -0
  36. package/dist/components/spinner/variants/circular-dots.js +26 -0
  37. package/dist/components/spinner/variants/circular-dots.module.js +8 -0
  38. package/dist/components/spinner/variants/classic-v2.css +1 -0
  39. package/dist/components/spinner/variants/classic-v2.d.ts +2 -0
  40. package/dist/components/spinner/variants/classic-v2.js +24 -0
  41. package/dist/components/spinner/variants/classic-v2.module.js +8 -0
  42. package/dist/components/spinner/variants/classic.css +1 -0
  43. package/dist/components/spinner/variants/classic.d.ts +2 -0
  44. package/dist/components/spinner/variants/classic.js +22 -0
  45. package/dist/components/spinner/variants/classic.module.js +8 -0
  46. package/dist/components/spinner/variants/clock.css +1 -0
  47. package/dist/components/spinner/variants/clock.d.ts +2 -0
  48. package/dist/components/spinner/variants/clock.js +18 -0
  49. package/dist/components/spinner/variants/clock.module.js +8 -0
  50. package/dist/components/spinner/variants/comet.css +1 -0
  51. package/dist/components/spinner/variants/comet.d.ts +2 -0
  52. package/dist/components/spinner/variants/comet.js +33 -0
  53. package/dist/components/spinner/variants/comet.module.js +10 -0
  54. package/dist/components/spinner/variants/compass.css +1 -0
  55. package/dist/components/spinner/variants/compass.d.ts +2 -0
  56. package/dist/components/spinner/variants/compass.js +16 -0
  57. package/dist/components/spinner/variants/compass.module.js +8 -0
  58. package/dist/components/spinner/variants/dual.css +1 -0
  59. package/dist/components/spinner/variants/dual.d.ts +2 -0
  60. package/dist/components/spinner/variants/dual.js +25 -0
  61. package/dist/components/spinner/variants/dual.module.js +10 -0
  62. package/dist/components/spinner/variants/eclipse.css +1 -0
  63. package/dist/components/spinner/variants/eclipse.d.ts +6 -0
  64. package/dist/components/spinner/variants/eclipse.js +21 -0
  65. package/dist/components/spinner/variants/eclipse.module.js +9 -0
  66. package/dist/components/spinner/variants/flip.css +1 -0
  67. package/dist/components/spinner/variants/flip.d.ts +2 -0
  68. package/dist/components/spinner/variants/flip.js +17 -0
  69. package/dist/components/spinner/variants/flip.module.js +8 -0
  70. package/dist/components/spinner/variants/gather.css +1 -0
  71. package/dist/components/spinner/variants/gather.d.ts +2 -0
  72. package/dist/components/spinner/variants/gather.js +50 -0
  73. package/dist/components/spinner/variants/gather.module.js +11 -0
  74. package/dist/components/spinner/variants/index.d.ts +9 -1
  75. package/dist/components/spinner/variants/index.js +96 -10
  76. package/dist/components/spinner/variants/leap.css +1 -0
  77. package/dist/components/spinner/variants/leap.d.ts +6 -0
  78. package/dist/components/spinner/variants/leap.js +27 -0
  79. package/dist/components/spinner/variants/leap.module.js +8 -0
  80. package/dist/components/spinner/variants/linear-dots.css +1 -0
  81. package/dist/components/spinner/variants/linear-dots.d.ts +2 -0
  82. package/dist/components/spinner/variants/linear-dots.js +21 -0
  83. package/dist/components/spinner/variants/linear-dots.module.js +8 -0
  84. package/dist/components/spinner/variants/loading.css +1 -0
  85. package/dist/components/spinner/variants/loading.d.ts +2 -0
  86. package/dist/components/spinner/variants/loading.js +50 -0
  87. package/dist/components/spinner/variants/loading.module.js +8 -0
  88. package/dist/components/spinner/variants/morph.css +1 -0
  89. package/dist/components/spinner/variants/morph.d.ts +2 -0
  90. package/dist/components/spinner/variants/morph.js +17 -0
  91. package/dist/components/spinner/variants/morph.module.js +8 -0
  92. package/dist/components/spinner/variants/orbit.css +1 -0
  93. package/dist/components/spinner/variants/orbit.d.ts +2 -0
  94. package/dist/components/spinner/variants/orbit.js +24 -0
  95. package/dist/components/spinner/variants/orbit.module.js +8 -0
  96. package/dist/components/spinner/variants/pulse.css +1 -0
  97. package/dist/components/spinner/variants/pulse.d.ts +2 -0
  98. package/dist/components/spinner/variants/pulse.js +19 -0
  99. package/dist/components/spinner/variants/pulse.module.js +8 -0
  100. package/dist/components/spinner/variants/radar.css +1 -0
  101. package/dist/components/spinner/variants/radar.d.ts +2 -0
  102. package/dist/components/spinner/variants/radar.js +53 -0
  103. package/dist/components/spinner/variants/radar.module.js +8 -0
  104. package/dist/components/spinner/variants/ring.css +1 -0
  105. package/dist/components/spinner/variants/ring.d.ts +2 -0
  106. package/dist/components/spinner/variants/ring.js +24 -0
  107. package/dist/components/spinner/variants/ring.module.js +8 -0
  108. package/dist/components/spinner/variants/ripple.css +1 -0
  109. package/dist/components/spinner/variants/ripple.d.ts +2 -0
  110. package/dist/components/spinner/variants/ripple.js +23 -0
  111. package/dist/components/spinner/variants/ripple.module.js +8 -0
  112. package/dist/components/spinner/variants/slide.css +1 -0
  113. package/dist/components/spinner/variants/slide.d.ts +2 -0
  114. package/dist/components/spinner/variants/slide.js +24 -0
  115. package/dist/components/spinner/variants/slide.module.js +8 -0
  116. package/dist/components/spinner/variants/snake.css +1 -0
  117. package/dist/components/spinner/variants/snake.d.ts +2 -0
  118. package/dist/components/spinner/variants/snake.js +19 -0
  119. package/dist/components/spinner/variants/snake.module.js +11 -0
  120. package/dist/components/spinner/variants/swirl.css +1 -0
  121. package/dist/components/spinner/variants/swirl.d.ts +2 -0
  122. package/dist/components/spinner/variants/swirl.js +35 -0
  123. package/dist/components/spinner/variants/swirl.module.js +8 -0
  124. package/dist/components/spinner/variants/trace.css +1 -0
  125. package/dist/components/spinner/variants/trace.d.ts +2 -0
  126. package/dist/components/spinner/variants/trace.js +28 -0
  127. package/dist/components/spinner/variants/trace.module.js +8 -0
  128. package/dist/components/spinner/variants/wave.css +1 -0
  129. package/dist/components/spinner/variants/wave.d.ts +2 -0
  130. package/dist/components/spinner/variants/wave.js +25 -0
  131. package/dist/components/spinner/variants/wave.module.js +8 -0
  132. package/dist/components/text/text.css +1 -1
  133. package/dist/components/text/text.d.ts +10 -2
  134. package/dist/components/title/title.d.ts +7 -0
  135. package/dist/index.js +2 -1
  136. package/dist/preflight.css +1 -1
  137. package/dist/specs/components/accordion/props.xml +2 -2
  138. package/dist/specs/components/accordion/usage.xml +2 -0
  139. package/dist/specs/components/autocomplete/patterns.xml +4 -4
  140. package/dist/specs/components/autocomplete/props.xml +2 -2
  141. package/dist/specs/components/autocomplete/usage.xml +1 -1
  142. package/dist/specs/components/button/patterns.xml +2 -2
  143. package/dist/specs/components/button/props.xml +4 -4
  144. package/dist/specs/components/button/usage.xml +2 -1
  145. package/dist/specs/components/chip/patterns.xml +2 -2
  146. package/dist/specs/components/chip/props.xml +2 -2
  147. package/dist/specs/components/chip/usage.xml +2 -0
  148. package/dist/specs/components/direction-provider/a11y.xml +6 -0
  149. package/dist/specs/components/direction-provider/meta.xml +20 -0
  150. package/dist/specs/components/direction-provider/patterns.xml +27 -0
  151. package/dist/specs/components/direction-provider/props.xml +18 -0
  152. package/dist/specs/components/direction-provider/usage.xml +10 -0
  153. package/dist/specs/components/disclosure/patterns.xml +2 -2
  154. package/dist/specs/components/disclosure/props.xml +2 -2
  155. package/dist/specs/components/disclosure/usage.xml +2 -0
  156. package/dist/specs/components/glow/patterns.xml +1 -1
  157. package/dist/specs/components/grid/patterns.xml +3 -3
  158. package/dist/specs/components/icon-button/props.xml +4 -4
  159. package/dist/specs/components/icon-button/usage.xml +3 -1
  160. package/dist/specs/components/menu/patterns.xml +18 -18
  161. package/dist/specs/components/menu/props.xml +5 -5
  162. package/dist/specs/components/menu/usage.xml +3 -1
  163. package/dist/specs/components/meter/patterns.xml +1 -1
  164. package/dist/specs/components/progressive-blur/usage.xml +2 -0
  165. package/dist/specs/components/prose/meta.xml +1 -1
  166. package/dist/specs/components/prose/patterns.xml +34 -10
  167. package/dist/specs/components/prose/props.xml +3 -1
  168. package/dist/specs/components/prose/usage.xml +4 -1
  169. package/dist/specs/components/select/patterns.xml +2 -2
  170. package/dist/specs/components/select/props.xml +4 -4
  171. package/dist/specs/components/select/usage.xml +2 -0
  172. package/dist/specs/components/slider/patterns.xml +1 -1
  173. package/dist/specs/components/spinner/props.xml +1 -1
  174. package/dist/specs/components/spinner/usage.xml +1 -1
  175. package/dist/specs/components/stack/patterns.xml +4 -4
  176. package/dist/specs/components/stack/props.xml +1 -0
  177. package/dist/specs/components/stack/usage.xml +1 -0
  178. package/dist/specs/components/surface/patterns.xml +3 -3
  179. package/dist/specs/components/tabs/patterns.xml +3 -3
  180. package/dist/specs/components/tabs/props.xml +1 -1
  181. package/dist/specs/components/tabs/usage.xml +2 -1
  182. package/dist/specs/components/text/meta.xml +2 -1
  183. package/dist/specs/components/text/patterns.xml +19 -16
  184. package/dist/specs/components/text/props.xml +8 -6
  185. package/dist/specs/components/text/usage.xml +9 -3
  186. package/dist/specs/components/textfield/patterns.xml +3 -3
  187. package/dist/specs/components/textfield/props.xml +2 -2
  188. package/dist/specs/components/textfield/usage.xml +2 -1
  189. package/dist/specs/components/title/meta.xml +2 -1
  190. package/dist/specs/components/title/patterns.xml +11 -10
  191. package/dist/specs/components/title/props.xml +5 -4
  192. package/dist/specs/components/title/usage.xml +8 -3
  193. package/dist/specs/components/toggle-button/patterns.xml +8 -8
  194. package/dist/specs/components/toggle-button/props.xml +3 -3
  195. package/dist/specs/components/toggle-button/usage.xml +2 -0
  196. package/dist/specs/components/toggle-group/patterns.xml +3 -3
  197. package/dist/specs/components/tooltip/patterns.xml +7 -7
  198. package/dist/specs/foundation/attributes.xml +22 -0
  199. package/dist/specs/foundation/bootstrap.xml +1 -1
  200. package/dist/specs/foundation/modules.xml +16 -7
  201. package/dist/specs/foundation/toggles.xml +1 -1
  202. package/dist/specs/index.xml +14 -4
  203. package/package.json +2 -2
  204. package/dist/components/spinner/variants/bars.d.ts +0 -2
  205. package/dist/components/spinner/variants/bars.js +0 -134
  206. package/dist/components/spinner/variants/dot-grid.css +0 -1
  207. package/dist/components/spinner/variants/dot-grid.d.ts +0 -2
  208. package/dist/components/spinner/variants/dot-grid.js +0 -57
  209. package/dist/components/spinner/variants/dot-grid.module.js +0 -16
  210. package/dist/components/spinner/variants/dots.d.ts +0 -2
  211. package/dist/components/spinner/variants/dots.js +0 -189
@@ -6,7 +6,9 @@
6
6
  <do>Separated islands with root `islands`; attached block corners when `islands={false}`</do>
7
7
  <do>Insert `Separator` between items when `Item` `useSurface={false}`</do>
8
8
  <do>Multiple open sections with root `multiple` (+ `defaultValue` / `value` as needed)</do>
9
+ <do>Omit `size` / width / height on Item `iconClosed` / `iconOpen` glyphs unless expressly overriding — prefer chrome/host default</do>
9
10
  <dont>Trying to compose separate public `Accordion.Header`, `Accordion.Trigger`, or `Accordion.Panel` exports — those stay inside `Accordion.Item`</dont>
11
+ <dont>Passing `size=&quot;1rem&quot;` on every Accordion icon by habit — omit unless expressly overriding</dont>
10
12
  <dont>Rendering an item without trigger text and without an external aria-label strategy</dont>
11
13
  <dont>Using Accordion for a single expandable section — use Disclosure</dont>
12
14
  <dont>Using Accordion for primary navigation that should be links, Tabs, or routes</dont>
@@ -11,7 +11,7 @@
11
11
  placeholder="Search by name…"
12
12
  items={reviewers}
13
13
  itemToStringValue={(person) => person.label}
14
- startAddon={<Magnifier aria-hidden size={16} />}
14
+ startAddon={<Magnifier aria-hidden />}
15
15
  >
16
16
  {(person) => (
17
17
  <Autocomplete.Item
@@ -36,7 +36,7 @@
36
36
  placeholder="SaaS, travel, contractors…"
37
37
  items={expenseCategories}
38
38
  itemToStringValue={(category) => category.label}
39
- startAddon={<Magnifier aria-hidden size={16} />}
39
+ startAddon={<Magnifier aria-hidden />}
40
40
  >
41
41
  {(category) => (
42
42
  <Autocomplete.Item key={category.id} value={category}>
@@ -57,7 +57,7 @@
57
57
  placeholder="Paris, Austin, Singapore…"
58
58
  items={transferDesks}
59
59
  itemToStringValue={(desk) => desk.label}
60
- startAddon={<Magnifier aria-hidden size={16} />}
60
+ startAddon={<Magnifier aria-hidden />}
61
61
  >
62
62
  {(group) => (
63
63
  <Autocomplete.Group key={group.value} items={group.items} label={group.value}>
@@ -85,7 +85,7 @@
85
85
  items={results}
86
86
  itemToStringValue={(article) => article.title}
87
87
  placeholder="Wire limits, SEPA, tax forms…"
88
- startAddon={<Magnifier aria-hidden size={16} />}
88
+ startAddon={<Magnifier aria-hidden />}
89
89
  status={
90
90
  <Stack columnGap="s" direction="row" vAlign="center">
91
91
  <Spinner aria-hidden size="s" />
@@ -25,7 +25,7 @@
25
25
  <description>Content rendered inside baked `Autocomplete.Empty` when the filtered list has no items.</description>
26
26
  </prop>
27
27
  <prop name="endAddon" kind="react">
28
- <description>Trailing decoration (icon, button). Buttons must use `type=&quot;button&quot;`.</description>
28
+ <description>Trailing decoration (icon, button). Buttons must use `type=&quot;button&quot;`. Omit glyph `size` / width / height on icons unless expressly overriding; IconButton/Button hosts own SVG size via CSS.</description>
29
29
  </prop>
30
30
  <prop name="error" kind="react">
31
31
  <description>Error copy rendered with `Field.Error` and `Text` in the same slot as `description`. Replaces description while the field is invalid and dirty.</description>
@@ -52,7 +52,7 @@
52
52
  <description>Ref forwarded to the autocomplete input.</description>
53
53
  </prop>
54
54
  <prop name="startAddon" kind="react">
55
- <description>Leading decoration (prefix text, icon). Not a second field control.</description>
55
+ <description>Leading decoration (prefix text, icon). Not a second field control. Omit glyph `size` / width / height on icons unless expressly overriding the icon-library default.</description>
56
56
  </prop>
57
57
  <prop name="status" kind="react">
58
58
  <description>Content rendered inside baked `Autocomplete.Status` (async / limit messaging). Keep the slot mounted; update children when status changes.</description>
@@ -4,7 +4,7 @@
4
4
  <do>Prefer Autocomplete over Select when users may type a value not in the list (tags, categories, search)</do>
5
5
  <do>Form section: Fieldset legend + Autocomplete with sibling Textfield/Select when they share one section — Stack owns gap</do>
6
6
  <do>Fill a form column via a parent Stack `fullWidth` / `expandChildren` (Autocomplete has no `fullWidth` prop) — not CSS `width: 100%`</do>
7
- <do>`startAddon` / `endAddon` for leading/trailing chrome (same control-group pattern as Textfield) — IconButton/Button addons use `size=&quot;s&quot;` and `type=&quot;button&quot;`</do>
7
+ <do>`startAddon` / `endAddon` for leading/trailing chrome (same control-group pattern as Textfield) — IconButton/Button addons use control `size=&quot;s&quot;` and `type=&quot;button&quot;`; omit glyph `size` / width / height on icons</do>
8
8
  <do>Grouped suggestion lists via `Autocomplete.Group` + `Autocomplete.Collection`; item rows via `Autocomplete.Item` `addon` (e.g. Avatar)</do>
9
9
  <do>Async or limited result lists: pass `empty` for no-match copy; keep root `status` mounted and update its children — Spinner + Text inside `status` is fine</do>
10
10
  <do>Custom portal host (iframe preview, shadow root, or app overlay root) via `container` on the portal-owning public part</do>
@@ -81,10 +81,10 @@
81
81
  <example title="Flat addon links (clone)">
82
82
  <tsx><![CDATA[
83
83
  <Stack hAlign="start" rowGap="2xs">
84
- <Button addon={<CircleImage size={18} />} variant="flat" size="s">
84
+ <Button addon={<CircleImage />} variant="flat" size="s">
85
85
  Open with GitHub Desktop
86
86
  </Button>
87
- <Button addon={<ArrowDown size={18} />} variant="flat" size="s">
87
+ <Button addon={<ArrowDown />} variant="flat" size="s">
88
88
  Download ZIP
89
89
  </Button>
90
90
  </Stack>
@@ -13,7 +13,7 @@
13
13
  <item>Forcing full panel width with CSS `width: 100%` / `w-full` — wrap in Stack with `fullWidth` and/or `expandChildren` (see stack units)</item>
14
14
  </when_not_to_use>
15
15
  <prop name="addon" kind="react">
16
- <description>Decorative addon rendered alongside the button label. Pass any React element; use a named icon from `@viraui/icons/react` or `&lt;Chip /&gt;` for status chips.</description>
16
+ <description>Decorative addon rendered alongside the button label. Pass any React element; use a named icon from `@viraui/icons/react` or `&lt;Chip /&gt;` for status chips. Omit glyph `size` / width / height — Button CSS sizes SVG via `--vui-button-icon-size`.</description>
17
17
  </prop>
18
18
  <prop name="addonPosition" kind="react">
19
19
  <description>Controls whether the addon appears before or after the label.</description>
@@ -31,7 +31,7 @@
31
31
  <description>Selects the visual treatment for the button.</description>
32
32
  </prop>
33
33
  <prop name="addon" kind="react">
34
- <description>Decorative addon rendered alongside the link label. (button-link)</description>
34
+ <description>Decorative addon rendered alongside the link label. Omit glyph `size` / width / height — host CSS sizes SVG. (button-link)</description>
35
35
  </prop>
36
36
  <prop name="addonPosition" kind="react">
37
37
  <description>Controls whether the addon appears before or after the label. (button-link)</description>
@@ -61,7 +61,7 @@
61
61
  <description>Button block size; size prop presets via data attributes.</description>
62
62
  </prop>
63
63
  <prop name="icon-size" kind="css">
64
- <description>Addon icon size inside the button.</description>
64
+ <description>Addon icon size inside the button (`--vui-button-icon-size`). Prefer this over setting `size` on the glyph ReactNode.</description>
65
65
  </prop>
66
66
  <prop name="padding-block" kind="css">
67
67
  <description>Vertical padding inside the button.</description>
@@ -85,7 +85,7 @@
85
85
  <description>Button block size; size prop presets via data attributes. (button-link)</description>
86
86
  </prop>
87
87
  <prop name="icon-size" kind="css">
88
- <description>Addon icon size inside the button. (button-link)</description>
88
+ <description>Addon icon size inside the button (`--vui-button-icon-size`). Prefer this over setting `size` on the glyph ReactNode. (button-link)</description>
89
89
  </prop>
90
90
  <prop name="padding-block" kind="css">
91
91
  <description>Vertical padding inside the button. (button-link)</description>
@@ -8,10 +8,11 @@
8
8
  <do>Dialog / sheet action strips: Stack row of Button + ButtonLink; Cancel via `Dialog.Close render={&lt;Button variant=&quot;secondary&quot; /&gt;}`</do>
9
9
  <do>Primary Chip addons inside a primary Button — set `data-mode=&quot;inverted&quot;` on the Chip so its fill contrasts</do>
10
10
  <do>Navigation that should look like Button — use ButtonLink (framework Link via `render`; sets `data-no-link-style` so preflight underline does not fight button paint)</do>
11
+ <do>Omit `size` / width / height on `addon` icons — host CSS sets `--vui-button-icon-size` from control `size`; set glyph size only to expressly override</do>
11
12
  <dont>Using Button without children as icon-only — prefer IconButton</dont>
12
13
  <dont>Using Button with `render={&lt;a /&gt;}` for links — Base UI enforces button semantics; use ButtonLink</dont>
13
14
  <dont>Inventing `width: 100%` / `inline-size: 100%` / `w-full` / `.fullWidth` / size-fill `className` (e.g. `.Submit`) on Button when a parent Stack can own the fill</dont>
14
- <dont>Duplicating icon size on every addon slot — Button CSS sizes SVG descendants</dont>
15
+ <dont>Passing `size={16}` / `size=&quot;1rem&quot;` (or width/height) on every `addon` icon — Button CSS sizes SVG descendants via `--vui-button-icon-size`</dont>
15
16
  <dont>Mixing `pill` with custom border-radius overrides that fight `data-pill` styling</dont>
16
17
  <dont>Primary Chip addon inside a primary Button without `data-mode=&quot;inverted&quot;` — chip fill matches the button and disappears</dont>
17
18
  <dont>Forcing `role=&quot;button&quot;` on a link</dont>
@@ -10,7 +10,7 @@
10
10
  Deploying
11
11
  </Chip>
12
12
  <Chip variant="yellow">Queued</Chip>
13
- <Chip variant="red" addon={<Xmark size={14} />}>
13
+ <Chip variant="red" addon={<Xmark />}>
14
14
  Failed
15
15
  </Chip>
16
16
  <Chip variant="salmon">Rolled back</Chip>
@@ -30,7 +30,7 @@
30
30
  $0.00
31
31
  </Title>
32
32
  </Stack>
33
- <Chip variant="outline" addon={<CircleCross size={8} color="var(--highlight-yellow)" />}>
33
+ <Chip variant="outline" addon={<CircleCross color="var(--highlight-yellow)" />}>
34
34
  Pending Setup
35
35
  </Chip>
36
36
  </Stack>
@@ -11,7 +11,7 @@
11
11
  <item>Long-form text content that should wrap like body copy — use Text</item>
12
12
  </when_not_to_use>
13
13
  <prop name="addon" kind="react">
14
- <description>Decorative addon rendered alongside the chip label.</description>
14
+ <description>Decorative addon rendered alongside the chip label. Omit glyph `size` / width / height — Chip CSS sizes SVG via `--vui-chip-icon-size`.</description>
15
15
  </prop>
16
16
  <prop name="addonPosition" kind="react">
17
17
  <description>Controls whether the addon appears before or after the label.</description>
@@ -44,6 +44,6 @@
44
44
  <description>Fixed chip block size.</description>
45
45
  </prop>
46
46
  <prop name="icon-size" kind="css">
47
- <description>Decorative addon icon size.</description>
47
+ <description>Decorative addon icon size (`--vui-chip-icon-size`). Prefer this over setting `size` on the glyph ReactNode.</description>
48
48
  </prop>
49
49
  </props>
@@ -4,10 +4,12 @@
4
4
  <do>Metadata, category, status, or inline tag-like presentation in Stack rows with Text / Title</do>
5
5
  <do>Color-coded status via highlight `variant` values (`green`, `red`, `yellow`, …) or `primary` / `secondary` / `outline`</do>
6
6
  <do>Primary Chip as Button `addon` — set `data-mode=&quot;inverted&quot;` on the Chip when the Button is primary so fills contrast</do>
7
+ <do>Omit `size` / width / height on `addon` icons — Chip CSS sets `--vui-chip-icon-size`; set glyph size only to expressly override</do>
7
8
  <do>Equal-width Chip clusters: wrap in Stack with `fullWidth` and/or `expandChildren` — never per-Chip width CSS</do>
8
9
  <do>Polymorphic label root via `render` (default `div`; Chip sets `data-no-link-style` so Chip-as-`&lt;a&gt;` keeps chip chrome)</do>
9
10
  <dont>Using Chip as a button replacement for clickable actions — use Button or IconButton</dont>
10
11
  <dont>Expecting `addonPosition` to have any effect when `addon` is omitted</dont>
12
+ <dont>Passing `size={16}` / width / height on every Chip `addon` icon — Chip CSS sizes SVG descendants</dont>
11
13
  <dont>Introducing custom size variants instead of the fixed compact height</dont>
12
14
  <dont>Re-adding a one-off destructive variant instead of `variant=&quot;red&quot;`</dont>
13
15
  <dont>Primary Chip inside a primary Button without `data-mode=&quot;inverted&quot;` — chip fill matches the button and disappears</dont>
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <a11y surface="direction-provider">
3
+ <rule>Not an APG widget — direction context only; keep accessible names and semantics when flipping LTR/RTL</rule>
4
+ <rule>Pair provider `direction=&quot;rtl&quot;` with document `dir=&quot;rtl&quot;` so CSS logical properties and portaled overlays stay consistent for assistive tech and visual layout</rule>
5
+ <rule>Do not rely on mirrored chrome alone to communicate meaning that must stay in the accessible name</rule>
6
+ </a11y>
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <meta id="direction-provider" title="DirectionProvider" category="layout" shared_contract="direction-provider">
3
+ <summary>Transparent re-export of Base UI DirectionProvider and useDirection. Enables RTL behavior for Base UI–backed components; does not set HTML dir or CSS direction — pair with document dir=rtl on a portal ancestor (usually html).</summary>
4
+ <exports>
5
+ <export name="DirectionProvider" />
6
+ <export name="useDirection" />
7
+ </exports>
8
+ <related>
9
+ <ref id="menu" />
10
+ <ref id="slider" />
11
+ <ref id="select" />
12
+ </related>
13
+ <units>
14
+ <unit kind="a11y" href="a11y.xml" />
15
+ <unit kind="props" href="props.xml" />
16
+ <unit kind="usage" href="usage.xml" />
17
+ <unit kind="patterns" href="patterns.xml" />
18
+ </units>
19
+ <base_ui href="https://base-ui.com/react/utils/direction-provider#api-reference" />
20
+ </meta>
@@ -0,0 +1,27 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <patterns surface="direction-provider">
3
+ <example title="RTL subtree with Slider">
4
+ <tsx><![CDATA[
5
+ <div dir="rtl">
6
+ <DirectionProvider direction="rtl">
7
+ <Slider defaultValue={25} label="Volume" />
8
+ </DirectionProvider>
9
+ </div>
10
+ ]]></tsx>
11
+ <notes>Transparent Base UI re-export. Provider feeds Base UI context; `dir` on an ancestor owns HTML/CSS direction. For app-wide RTL set `dir` on `html`. Upstream: https://base-ui.com/react/utils/direction-provider</notes>
12
+ </example>
13
+
14
+ <example title="Read direction in a portal-safe hook">
15
+ <tsx><![CDATA[
16
+ function DirectionLabel() {
17
+ const direction = useDirection();
18
+ return <Text size="s">Direction: {direction}</Text>;
19
+ }
20
+
21
+ <DirectionProvider direction="rtl">
22
+ <DirectionLabel />
23
+ </DirectionProvider>
24
+ ]]></tsx>
25
+ <notes>`useDirection` reads the provider context — useful when portaled trees are outside a local `dir` wrapper.</notes>
26
+ </example>
27
+ </patterns>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <props surface="direction-provider">
3
+ <when_to_use>
4
+ <item>RTL apps that need Base UI–backed Vira menus, sliders, selects, and other direction-aware primitives to flip behavior</item>
5
+ <item>Reading the active text direction in portaled trees via `useDirection` when `dir` on html is not enough</item>
6
+ </when_to_use>
7
+ <when_not_to_use>
8
+ <item>Expecting this provider alone to flip HTML/CSS layout — also set `dir=&quot;rtl&quot;` (or `direction: rtl`) on a portal ancestor, usually `&lt;html&gt;`</item>
9
+ <item>Mandatory root chrome — opt-in like BreakpointsProvider; not part of Dialog/Tooltip/Toast overlay shell</item>
10
+ <item>Inventing a Vira wrapper API — this surface is a transparent Base UI re-export</item>
11
+ </when_not_to_use>
12
+ <prop name="children" kind="react">
13
+ <description>Tree that should receive Base UI direction context. Pass-through from Base UI.</description>
14
+ </prop>
15
+ <prop name="direction" kind="react">
16
+ <description>Reading direction: `ltr` (default) or `rtl`. Pass-through from Base UI — see upstream API.</description>
17
+ </prop>
18
+ </props>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <usage surface="direction-provider">
3
+ <do>Import `DirectionProvider` / `useDirection` from `@viraui/react` — transparent Base UI re-export; full API → https://base-ui.com/react/utils/direction-provider</do>
4
+ <do>Wrap the app (or RTL subtree) in `DirectionProvider direction=&quot;rtl&quot;` and set `dir=&quot;rtl&quot;` on a portal ancestor (usually `&lt;html&gt;`) so body-mounted popups inherit CSS direction</do>
5
+ <do>Use `useDirection` when a portaled component needs the context direction without reading the DOM `dir` attribute</do>
6
+ <dont>Assuming `DirectionProvider` sets HTML `dir` or CSS `direction` — it only feeds Base UI context</dont>
7
+ <dont>Setting `dir=&quot;rtl&quot;` only on a local wrapper when popups portal to `document.body` — use `html` / document root</dont>
8
+ <dont>Importing `@base-ui/react/direction-provider` directly in Vira apps when `@viraui/react` already re-exports it</dont>
9
+ <dont>Treating this as required overlay bootstrap — Dialog/Tooltip/Toast providers stay separate; DirectionProvider is opt-in for RTL</dont>
10
+ </usage>
@@ -22,9 +22,9 @@
22
22
  <Disclosure.Trigger
23
23
  hPadding="m"
24
24
  interpolateIcons
25
- openIcon={<Xmark size="1rem" />}
25
+ openIcon={<Xmark />}
26
26
  radius="m"
27
- restingIcon={<Plus size="1rem" />}
27
+ restingIcon={<Plus />}
28
28
  vPadding="m"
29
29
  >
30
30
  Advanced
@@ -10,10 +10,10 @@
10
10
  <item>Primary navigation that should use links, Tabs, or routes</item>
11
11
  </when_not_to_use>
12
12
  <prop name="Trigger.restingIcon" kind="react">
13
- <description>Decorative icon while the panel is closed. Defaults to ChromeChevronEnd when both icon slots are omitted.</description>
13
+ <description>Decorative icon while the panel is closed. Defaults to ChromeChevronEnd when both icon slots are omitted. Omit glyph `size` / width / height — Disclosure CSS sizes SVG in the icon box.</description>
14
14
  </prop>
15
15
  <prop name="Trigger.openIcon" kind="react">
16
- <description>Decorative icon while the panel is open. Defaults to ChromeChevronDown when both icon slots are omitted. When only restingIcon is set, that icon shows in both states.</description>
16
+ <description>Decorative icon while the panel is open. Defaults to ChromeChevronDown when both icon slots are omitted. When only restingIcon is set, that icon shows in both states. Omit glyph `size` / width / height — host CSS sizes SVG.</description>
17
17
  </prop>
18
18
  <prop name="Trigger.interpolateIcons" kind="react">
19
19
  <description>When dual icons are present, crossfade and light-rotate between them (`data-interpolate=&quot;true&quot;`). When false, swap instantly with no transition.</description>
@@ -4,8 +4,10 @@
4
4
  <do>Spread Surface chrome on Trigger (`color`, `hoverColor`, `border`, `radius`, padding) when using the default host</do>
5
5
  <do>Supply Panel children layout (Stack/padding) yourself — Panel has no default content padding</do>
6
6
  <do>Use `restingIcon` / `openIcon` / `interpolateIcons` for ToggleButton-style icon pairs; omit both for chrome chevron End/Down</do>
7
+ <do>Omit `size` / width / height on Trigger icon glyphs — Disclosure CSS sizes SVG in the icon box; set glyph size only to expressly override</do>
7
8
  <do>Pass Trigger `render` when replacing the Surface compose entirely</do>
8
9
  <dont>Using Accordion for a single section — Accordion is multi-item</dont>
9
10
  <dont>Expecting Accordion-like default Panel padding from Disclosure.Panel</dont>
11
+ <dont>Passing `size=&quot;1rem&quot;` / width / height on every Trigger icon glyph — host CSS sizes SVG descendants</dont>
10
12
  <dont>Relying on icon animation alone for open/closed meaning under reduced motion</dont>
11
13
  </usage>
@@ -19,7 +19,7 @@
19
19
  render={
20
20
  <IconButton
21
21
  aria-label="More actions for Q2 payout report"
22
- icon={<DotsVertical size={16} />}
22
+ icon={<DotsVertical />}
23
23
  pill
24
24
  size="s"
25
25
  variant="flat"
@@ -38,13 +38,13 @@
38
38
  <Surface border="all" color={1} radius="l" hPadding="m" vPadding="m">
39
39
  <Grid columns={7} rows={6} columnGap="m" rowGap="m">
40
40
  <Grid.Item render={<Stack hAlign="center" vAlign="center" />}>
41
- <IconButton aria-label="Home" icon={<House size={22} aria-hidden />} variant="flat" />
41
+ <IconButton aria-label="Home" icon={<House aria-hidden />} variant="flat" />
42
42
  </Grid.Item>
43
43
  <Grid.Item render={<Stack hAlign="center" vAlign="center" />}>
44
- <IconButton aria-label="Search" icon={<Magnifier size={22} aria-hidden />} variant="flat" />
44
+ <IconButton aria-label="Search" icon={<Magnifier aria-hidden />} variant="flat" />
45
45
  </Grid.Item>
46
46
  <Grid.Item render={<Stack hAlign="center" vAlign="center" />}>
47
- <IconButton aria-label="Settings" icon={<Gear size={22} aria-hidden />} variant="flat" />
47
+ <IconButton aria-label="Settings" icon={<Gear aria-hidden />} variant="flat" />
48
48
  </Grid.Item>
49
49
  {/* more IconButtons… */}
50
50
  </Grid>
@@ -12,7 +12,7 @@
12
12
  <item>Temporally swap icons after user interactions with temporal pressed state, like copy feedback. Use ToggleButton instead</item>
13
13
  </when_not_to_use>
14
14
  <prop name="icon" kind="react">
15
- <description>Icon rendered as the sole visible control content.</description>
15
+ <description>Icon rendered as the sole visible control content. Omit glyph `size` / width / height — host CSS sizes SVG via `--vui-button-icon-size`.</description>
16
16
  </prop>
17
17
  <prop name="loading" kind="react">
18
18
  <description>Shows a centered spinner overlay while preserving the original content width.</description>
@@ -27,7 +27,7 @@
27
27
  <description>Selects the visual treatment for the button.</description>
28
28
  </prop>
29
29
  <prop name="icon" kind="react">
30
- <description>Icon rendered as the sole visible control content. (icon-button-link)</description>
30
+ <description>Icon rendered as the sole visible control content. Omit glyph `size` / width / height — host CSS sizes SVG. (icon-button-link)</description>
31
31
  </prop>
32
32
  <prop name="loading" kind="react">
33
33
  <description>Shows a centered spinner overlay while preserving the original content width. Sets `aria-disabled` / `aria-busy` for loading chrome; link stays activatable. (icon-button-link)</description>
@@ -54,7 +54,7 @@
54
54
  <description>Button block size; size prop presets via data attributes.</description>
55
55
  </prop>
56
56
  <prop name="icon-size" kind="css">
57
- <description>Addon icon size inside the button.</description>
57
+ <description>Addon icon size inside the button (`--vui-button-icon-size`). Prefer this over setting `size` on the glyph ReactNode.</description>
58
58
  </prop>
59
59
  <prop name="padding-block" kind="css">
60
60
  <description>Vertical padding inside the button.</description>
@@ -78,7 +78,7 @@
78
78
  <description>Button block size; size prop presets via data attributes. (icon-button-link)</description>
79
79
  </prop>
80
80
  <prop name="icon-size" kind="css">
81
- <description>Addon icon size inside the button. (icon-button-link)</description>
81
+ <description>Addon icon size inside the button (`--vui-button-icon-size`). Prefer this over setting `size` on the glyph ReactNode. (icon-button-link)</description>
82
82
  </prop>
83
83
  <prop name="padding-block" kind="css">
84
84
  <description>Vertical padding inside the button. (icon-button-link)</description>
@@ -3,8 +3,9 @@
3
3
  <do>Compact toolbar or chrome actions identified only by icon</do>
4
4
  <do>Same size, variant, and loading model as Button without a visible label</do>
5
5
  <do>Decorative glyph with an explicit accessible name on the root (`aria-label` / `aria-labelledby`)</do>
6
+ <do>Omit `size` / width / height on the `icon` glyph — host CSS sizes SVG via `--vui-button-icon-size`; set glyph size only to expressly override</do>
6
7
  <do>Toolbar / zoom / chrome clusters: Stack row of IconButtons inside Surface — gap via Stack, not per-control CSS</do>
7
- <do>Textfield `endAddon` / `startAddon` for compact field chrome (e.g. copy) — keep addon control `size=&quot;s&quot;`</do>
8
+ <do>Textfield `endAddon` / `startAddon` for compact field chrome (e.g. copy) — keep addon control `size=&quot;s&quot;` (control size, not glyph size)</do>
8
9
  <do>Menu / overlay triggers via `Menu.Trigger render={&lt;IconButton … /&gt;}` (and peers with the same pattern)</do>
9
10
  <do>Icon-only navigation — use IconButtonLink (framework Link via `render`)</do>
10
11
  <dont>Passing `children`, `addon`, or `addonPosition` — not part of the public API; use `icon`</dont>
@@ -12,5 +13,6 @@
12
13
  <dont>Using IconButton for persistent or temporal pressed state — use ToggleButton</dont>
13
14
  <dont>Using IconButton with `render={&lt;a /&gt;}` for links — use IconButtonLink</dont>
14
15
  <dont>Omitting both `aria-label` and `aria-labelledby`</dont>
16
+ <dont>Passing `size={16}` / `size=&quot;1rem&quot;` (or width/height) on the `icon` glyph — IconButton CSS sizes SVG descendants</dont>
15
17
  <dont>Inventing `width: 100%` / `inline-size: 100%` / `w-full` / size-fill `className` (e.g. `.Social`) on IconButton — it is intentionally square; Stack owns gap/align only</dont>
16
18
  </usage>
@@ -18,7 +18,7 @@
18
18
  </Text>
19
19
  </Stack>
20
20
  </Stack>
21
- <ChevronExpandY aria-hidden size={16} />
21
+ <ChevronExpandY aria-hidden />
22
22
  </Stack>
23
23
  </Stack>
24
24
  }
@@ -36,15 +36,15 @@
36
36
  </Stack>
37
37
  </Stack>
38
38
  <Menu.Separator />
39
- <Menu.Item addon={<StarUpgrade aria-hidden size={16} />}>Upgrade to Pro</Menu.Item>
39
+ <Menu.Item addon={<StarUpgrade aria-hidden />}>Upgrade to Pro</Menu.Item>
40
40
  <Menu.Separator />
41
41
  <Menu.Group label="Settings">
42
- <Menu.Item addon={<BadgeCheck aria-hidden size={16} />}>Account</Menu.Item>
43
- <Menu.Item addon={<CreditCards aria-hidden size={16} />}>Billing</Menu.Item>
44
- <Menu.Item addon={<Bell aria-hidden size={16} />}>Notifications</Menu.Item>
42
+ <Menu.Item addon={<BadgeCheck aria-hidden />}>Account</Menu.Item>
43
+ <Menu.Item addon={<CreditCards aria-hidden />}>Billing</Menu.Item>
44
+ <Menu.Item addon={<Bell aria-hidden />}>Notifications</Menu.Item>
45
45
  </Menu.Group>
46
46
  <Menu.Separator />
47
- <Menu.Item addon={<ArrowDoorOut aria-hidden size={16} />} sentiment="destructive">
47
+ <Menu.Item addon={<ArrowDoorOut aria-hidden />} sentiment="destructive">
48
48
  Log out
49
49
  </Menu.Item>
50
50
  </Menu.Popup>
@@ -58,24 +58,24 @@
58
58
  <Menu>
59
59
  <Menu.Trigger
60
60
  render={
61
- <Button size="s" addon={<ChevronDown aria-hidden size={16} />} variant="secondary">
61
+ <Button size="s" addon={<ChevronDown aria-hidden />} variant="secondary">
62
62
  Actions
63
63
  </Button>
64
64
  }
65
65
  />
66
66
  <Menu.Popup align="end" side="bottom">
67
67
  <Menu.Group label="Edit">
68
- <Menu.Item addon={<Pencil aria-hidden size={16} />} note="⌘E">
68
+ <Menu.Item addon={<Pencil aria-hidden />} note="⌘E">
69
69
  Rename report
70
70
  </Menu.Item>
71
- <Menu.Item addon={<Duplicate aria-hidden size={16} />} note="⌘D">
71
+ <Menu.Item addon={<Duplicate aria-hidden />} note="⌘D">
72
72
  Duplicate
73
73
  </Menu.Item>
74
- <Menu.Item addon={<Archive aria-hidden size={16} />}>Archive</Menu.Item>
74
+ <Menu.Item addon={<Archive aria-hidden />}>Archive</Menu.Item>
75
75
  </Menu.Group>
76
76
  <Menu.Separator />
77
77
  <Menu.Group label="View">
78
- <Menu.CheckboxItem addon={<Eye aria-hidden size={16} />} checked>
78
+ <Menu.CheckboxItem addon={<Eye aria-hidden />} checked>
79
79
  Show totals row
80
80
  </Menu.CheckboxItem>
81
81
  <Menu.CheckboxItem>Compact table rows</Menu.CheckboxItem>
@@ -88,7 +88,7 @@
88
88
  </Menu.RadioGroup>
89
89
  <Menu.Separator />
90
90
  <Menu.Submenu>
91
- <Menu.SubmenuTrigger addon={<Link aria-hidden size={16} />}>Share</Menu.SubmenuTrigger>
91
+ <Menu.SubmenuTrigger addon={<Link aria-hidden />}>Share</Menu.SubmenuTrigger>
92
92
  <Menu.Popup side="inline-end">
93
93
  <Menu.LinkItem href="#">Copy link</Menu.LinkItem>
94
94
  <Menu.Item note="⌘⇧E">Export PDF</Menu.Item>
@@ -96,7 +96,7 @@
96
96
  </Menu.Popup>
97
97
  </Menu.Submenu>
98
98
  <Menu.Separator />
99
- <Menu.Item addon={<Trash aria-hidden size={16} />} sentiment="destructive">
99
+ <Menu.Item addon={<Trash aria-hidden />} sentiment="destructive">
100
100
  Delete report
101
101
  </Menu.Item>
102
102
  </Menu.Popup>
@@ -119,7 +119,7 @@
119
119
  render={
120
120
  <IconButton
121
121
  aria-label="More actions for Q2 payout report"
122
- icon={<DotsVertical size={16} />}
122
+ icon={<DotsVertical />}
123
123
  pill
124
124
  size="s"
125
125
  variant="flat"
@@ -127,11 +127,11 @@
127
127
  }
128
128
  />
129
129
  <Menu.Popup align="end" side="bottom">
130
- <Menu.Item addon={<Pencil aria-hidden size={16} />}>Rename</Menu.Item>
131
- <Menu.Item addon={<Duplicate aria-hidden size={16} />}>Duplicate</Menu.Item>
132
- <Menu.Item addon={<Archive aria-hidden size={16} />}>Archive</Menu.Item>
130
+ <Menu.Item addon={<Pencil aria-hidden />}>Rename</Menu.Item>
131
+ <Menu.Item addon={<Duplicate aria-hidden />}>Duplicate</Menu.Item>
132
+ <Menu.Item addon={<Archive aria-hidden />}>Archive</Menu.Item>
133
133
  <Menu.Separator />
134
- <Menu.Item addon={<Trash aria-hidden size={16} />} sentiment="destructive">
134
+ <Menu.Item addon={<Trash aria-hidden />} sentiment="destructive">
135
135
  Delete
136
136
  </Menu.Item>
137
137
  </Menu.Popup>
@@ -16,7 +16,7 @@
16
16
  <item>Rich non-menu panels with forms or free layout (use Popover / Dialog — do not wrap Menu in Popover)</item>
17
17
  </when_not_to_use>
18
18
  <prop name="CheckboxItem.addon" kind="react">
19
- <description>Decorative leading node rendered before the item label.</description>
19
+ <description>Decorative leading node rendered before the item label. Omit glyph `size` / width / height unless expressly overriding the icon-library default.</description>
20
20
  </prop>
21
21
  <prop name="CheckboxItem.note" kind="react">
22
22
  <description>End-aligned secondary text (e.g. keyboard shortcut) before the check indicator. Rendered muted `xs`.</description>
@@ -28,7 +28,7 @@
28
28
  <description>Accessible group label rendered with `Menu.GroupLabel`.</description>
29
29
  </prop>
30
30
  <prop name="Item.addon" kind="react">
31
- <description>Decorative leading node rendered before the item label.</description>
31
+ <description>Decorative leading node rendered before the item label. Omit glyph `size` / width / height unless expressly overriding the icon-library default.</description>
32
32
  </prop>
33
33
  <prop name="Item.note" kind="react">
34
34
  <description>End-aligned secondary text (e.g. keyboard shortcut). Rendered muted `xs`.</description>
@@ -37,7 +37,7 @@
37
37
  <description>Visual sentiment. `destructive` uses highlight-red wash + text.</description>
38
38
  </prop>
39
39
  <prop name="LinkItem.addon" kind="react">
40
- <description>Decorative leading node rendered before the item label.</description>
40
+ <description>Decorative leading node rendered before the item label. Omit glyph `size` / width / height unless expressly overriding the icon-library default.</description>
41
41
  </prop>
42
42
  <prop name="LinkItem.note" kind="react">
43
43
  <description>End-aligned secondary text (e.g. keyboard shortcut). Rendered muted `xs`.</description>
@@ -55,7 +55,7 @@
55
55
  <description>Optional accessible group label rendered with `Menu.GroupLabel`.</description>
56
56
  </prop>
57
57
  <prop name="RadioItem.addon" kind="react">
58
- <description>Decorative leading node rendered before the item label.</description>
58
+ <description>Decorative leading node rendered before the item label. Omit glyph `size` / width / height unless expressly overriding the icon-library default.</description>
59
59
  </prop>
60
60
  <prop name="RadioItem.note" kind="react">
61
61
  <description>End-aligned secondary text (e.g. keyboard shortcut) before the check indicator. Rendered muted `xs`.</description>
@@ -64,7 +64,7 @@
64
64
  <description>Visual sentiment. `destructive` uses highlight-red wash + text.</description>
65
65
  </prop>
66
66
  <prop name="SubmenuTrigger.addon" kind="react">
67
- <description>Decorative leading node rendered before the item label.</description>
67
+ <description>Decorative leading node rendered before the item label. Omit glyph `size` / width / height unless expressly overriding the icon-library default.</description>
68
68
  </prop>
69
69
  <prop name="SubmenuTrigger.sentiment" kind="react">
70
70
  <description>Visual sentiment. `destructive` uses highlight-red wash + text.</description>
@@ -6,10 +6,12 @@
6
6
  <do>Account / user chip: `Menu.Trigger` as Surface/Stack (Avatar + Text) opening `Menu.Popup` with static profile header plus Items</do>
7
7
  <do>Detached or multi-trigger menus via `Menu.createHandle`</do>
8
8
  <do>Custom portal host (iframe preview, shadow root, or app overlay root) via `container` on `Menu.Popup`</do>
9
+ <do>Omit `size` / width / height on Item / LinkItem / checkbox / radio / submenu `addon` icons — prefer icon-library default; set only to expressly override</do>
9
10
  <dont>Expecting `Menu.Arrow`, `Menu.Backdrop`, or public Portal/Positioner/Viewport exports</dont>
11
+ <dont>Passing `size={16}` on every menu `addon` icon by habit — omit unless expressly overriding the library default</dont>
10
12
  <dont>Closing checkbox/radio items on click by default when the menu should stay open for multi-toggle — pass `closeOnClick` only when a single pick should dismiss</dont>
11
13
  <dont>Using physical left/right CSS that breaks RTL submenu chevrons</dont>
12
- <dont>Expecting RTL item rows / left-opening submenus without Base UI `DirectionProvider direction=&quot;rtl&quot;` plus app `dir=&quot;rtl&quot;` on a portal ancestor (usually `&lt;html&gt;` / document root — a local wrapper alone does not reach body-mounted popups)</dont>
14
+ <dont>Expecting RTL item rows / left-opening submenus without `@viraui/react` `DirectionProvider direction=&quot;rtl&quot;` plus app `dir=&quot;rtl&quot;` on a portal ancestor (usually `&lt;html&gt;` / document root — a local wrapper alone does not reach body-mounted popups)</dont>
13
15
  <dont>Nesting Menu inside Popover for an account menu — Menu already owns portal, positioning, and listbox keyboard behavior</dont>
14
16
  <dont>Putting focusable controls (inputs, nested buttons) in `Menu.Popup` outside `Menu.Item` / `Menu.LinkItem` / checkbox / radio / submenu trigger parts — use Popover or Dialog for forms</dont>
15
17
  <dont>Using Menu for form-field single-select from a long list — use Select</dont>
@@ -25,7 +25,7 @@
25
25
  value={91}
26
26
  label={
27
27
  <Stack direction="row" columnGap="xs" vAlign="center">
28
- <Sun aria-hidden size={16} />
28
+ <Sun aria-hidden />
29
29
  <span>Backup health</span>
30
30
  </Stack>
31
31
  }
@@ -4,8 +4,10 @@
4
4
  <do>Edge scrim on glass / `data-vibrant` Surface heroes, sheets, or scroll regions where content should fade into blur</do>
5
5
  <do>Keep semantics and layout on Surface/Stack/Title/Text children underneath — ProgressiveBlur is decorative atmosphere only</do>
6
6
  <do>Use sparingly — stacked `backdrop-filter` is GPU/memory-heavy; prefer one focal overlay per view</do>
7
+ <do>Rounded scroll shells: clip with Surface `overflow` + `radius`, mount ProgressiveBlur as a sibling overlay, set matching `border-radius` on the blur root (layers inherit)</do>
7
8
  <dont>Leaving the ProgressiveBlur root `position: static` so absolute layers escape the intended overlay box</dont>
8
9
  <dont>Driving layout size or scroll behavior from inside the overlay</dont>
9
10
  <dont>Scattering ProgressiveBlur across many cards or stacking full-viewport instances</dont>
10
11
  <dont>Using ProgressiveBlur as standalone loading or status feedback without a labeled parent region</dont>
12
+ <dont>Nesting under an ancestor that pairs overflow clipping with border-radius (e.g. Surface `overflow="hidden"` + `radius`) — Chromium drops masked backdrop-filter</dont>
11
13
  </usage>
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <meta id="prose" title="Prose" category="typography" shared_contract="prose">
3
- <summary>Grouping region that applies heading-aware em rhythm to direct document blocks.</summary>
3
+ <summary>Text-wall grouping region (articles, docs, privacy) with heading-aware em rhythm; reading column via parent Stack `maxWidth` sized for body Text `size`.</summary>
4
4
  <exports>
5
5
  <export name="Prose" />
6
6
  </exports>