@viraui/react 2026.7.1 → 2026.9.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 (223) 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 +4 -1
  10. package/dist/components/select/select-group.js +1 -1
  11. package/dist/components/select/select.css +1 -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/stack/stack.css +1 -1
  133. package/dist/components/stack/stack.d.ts +15 -3
  134. package/dist/components/stack/stack.js +2 -1
  135. package/dist/components/surface/surface.css +1 -1
  136. package/dist/components/text/text.css +1 -1
  137. package/dist/components/text/text.d.ts +10 -2
  138. package/dist/components/title/title.d.ts +7 -0
  139. package/dist/index.js +2 -1
  140. package/dist/preflight.css +1 -1
  141. package/dist/specs/PROTOCOL.md +1 -1
  142. package/dist/specs/activity-hints.xml +4 -4
  143. package/dist/specs/components/accordion/props.xml +2 -2
  144. package/dist/specs/components/accordion/usage.xml +2 -0
  145. package/dist/specs/components/autocomplete/patterns.xml +4 -4
  146. package/dist/specs/components/autocomplete/props.xml +2 -2
  147. package/dist/specs/components/autocomplete/usage.xml +1 -1
  148. package/dist/specs/components/button/patterns.xml +2 -2
  149. package/dist/specs/components/button/props.xml +4 -4
  150. package/dist/specs/components/button/usage.xml +2 -1
  151. package/dist/specs/components/chip/patterns.xml +2 -2
  152. package/dist/specs/components/chip/props.xml +2 -2
  153. package/dist/specs/components/chip/usage.xml +2 -0
  154. package/dist/specs/components/direction-provider/a11y.xml +6 -0
  155. package/dist/specs/components/direction-provider/meta.xml +20 -0
  156. package/dist/specs/components/direction-provider/patterns.xml +27 -0
  157. package/dist/specs/components/direction-provider/props.xml +18 -0
  158. package/dist/specs/components/direction-provider/usage.xml +10 -0
  159. package/dist/specs/components/disclosure/patterns.xml +2 -2
  160. package/dist/specs/components/disclosure/props.xml +2 -2
  161. package/dist/specs/components/disclosure/usage.xml +2 -0
  162. package/dist/specs/components/glow/patterns.xml +1 -1
  163. package/dist/specs/components/grid/patterns.xml +3 -3
  164. package/dist/specs/components/icon-button/props.xml +4 -4
  165. package/dist/specs/components/icon-button/usage.xml +3 -1
  166. package/dist/specs/components/menu/patterns.xml +18 -18
  167. package/dist/specs/components/menu/props.xml +5 -5
  168. package/dist/specs/components/menu/usage.xml +3 -1
  169. package/dist/specs/components/meter/patterns.xml +1 -1
  170. package/dist/specs/components/progressive-blur/usage.xml +2 -0
  171. package/dist/specs/components/prose/meta.xml +1 -1
  172. package/dist/specs/components/prose/patterns.xml +34 -10
  173. package/dist/specs/components/prose/props.xml +3 -1
  174. package/dist/specs/components/prose/usage.xml +4 -1
  175. package/dist/specs/components/select/patterns.xml +2 -2
  176. package/dist/specs/components/select/props.xml +2 -2
  177. package/dist/specs/components/select/usage.xml +1 -0
  178. package/dist/specs/components/slider/patterns.xml +1 -1
  179. package/dist/specs/components/spinner/props.xml +1 -1
  180. package/dist/specs/components/spinner/usage.xml +1 -1
  181. package/dist/specs/components/stack/patterns.xml +102 -4
  182. package/dist/specs/components/stack/props.xml +9 -3
  183. package/dist/specs/components/stack/usage.xml +7 -3
  184. package/dist/specs/components/surface/patterns.xml +3 -3
  185. package/dist/specs/components/surface/usage.xml +1 -1
  186. package/dist/specs/components/tabs/patterns.xml +3 -3
  187. package/dist/specs/components/tabs/props.xml +1 -1
  188. package/dist/specs/components/tabs/usage.xml +2 -1
  189. package/dist/specs/components/text/meta.xml +2 -1
  190. package/dist/specs/components/text/patterns.xml +19 -16
  191. package/dist/specs/components/text/props.xml +8 -6
  192. package/dist/specs/components/text/usage.xml +9 -3
  193. package/dist/specs/components/textfield/patterns.xml +3 -3
  194. package/dist/specs/components/textfield/props.xml +2 -2
  195. package/dist/specs/components/textfield/usage.xml +2 -1
  196. package/dist/specs/components/title/meta.xml +2 -1
  197. package/dist/specs/components/title/patterns.xml +11 -10
  198. package/dist/specs/components/title/props.xml +5 -4
  199. package/dist/specs/components/title/usage.xml +8 -3
  200. package/dist/specs/components/toggle-button/patterns.xml +8 -8
  201. package/dist/specs/components/toggle-button/props.xml +3 -3
  202. package/dist/specs/components/toggle-button/usage.xml +2 -0
  203. package/dist/specs/components/toggle-group/patterns.xml +3 -3
  204. package/dist/specs/components/tooltip/patterns.xml +7 -7
  205. package/dist/specs/foundation/attributes.xml +24 -4
  206. package/dist/specs/foundation/bootstrap.xml +1 -1
  207. package/dist/specs/foundation/modules.xml +14 -5
  208. package/dist/specs/foundation/theme-topics.xml +3 -3
  209. package/dist/specs/foundation/toggles.xml +3 -3
  210. package/dist/specs/index.xml +14 -22
  211. package/dist/specs/patterns/compose-layout-first.xml +1 -1
  212. package/package.json +2 -2
  213. package/dist/components/spinner/variants/bars.d.ts +0 -2
  214. package/dist/components/spinner/variants/bars.js +0 -134
  215. package/dist/components/spinner/variants/dot-grid.css +0 -1
  216. package/dist/components/spinner/variants/dot-grid.d.ts +0 -2
  217. package/dist/components/spinner/variants/dot-grid.js +0 -57
  218. package/dist/components/spinner/variants/dot-grid.module.js +0 -16
  219. package/dist/components/spinner/variants/dots.d.ts +0 -2
  220. package/dist/components/spinner/variants/dots.js +0 -189
  221. package/dist/specs/patterns/equal-width-actions.xml +0 -22
  222. package/dist/specs/patterns/page-chrome.xml +0 -34
  223. package/dist/specs/patterns/stack-as-surface.xml +0 -37
@@ -0,0 +1,24 @@
1
+ import './orbit.css';
2
+ import orbit_module_default from "./orbit.module.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/orbit.tsx
5
+ var OrbitGlyph = () => /* @__PURE__ */ jsxs("g", { children: [/* @__PURE__ */ jsx("circle", {
6
+ cx: "12",
7
+ cy: "12",
8
+ r: "3",
9
+ fill: "currentColor"
10
+ }), /* @__PURE__ */ jsx("g", {
11
+ className: orbit_module_default.Track,
12
+ fill: "none",
13
+ stroke: "currentColor",
14
+ strokeWidth: "1.5",
15
+ strokeLinecap: "round",
16
+ children: /* @__PURE__ */ jsx("circle", {
17
+ cx: "12",
18
+ cy: "12",
19
+ r: "9",
20
+ strokeDasharray: "28 28.5"
21
+ })
22
+ })] });
23
+ //#endregion
24
+ export { OrbitGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/orbit.module.css
2
+ var Track = "viraui__orbit-module__Track_kisTF";
3
+ var orbit_module_default = {
4
+ Track,
5
+ "spinner-orbit-spin": "viraui__orbit-module__spinner-orbit-spin_unNkn"
6
+ };
7
+ //#endregion
8
+ export { Track, orbit_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__pulse-module__spinner-pulse-ripple_uxhZW{0%{opacity:.4;transform:scale(.25)}to{opacity:0;transform:scale(1)}}.viraui__pulse-module__Ring_urT8a{transform-origin:12px 12px;animation:viraui__pulse-module__spinner-pulse-ripple_uxhZW 1.2s ease-out infinite;@media (prefers-reduced-motion:reduce){animation:none;opacity:.2}}}
@@ -0,0 +1,2 @@
1
+ declare const PulseGlyph: React.FC;
2
+ export default PulseGlyph;
@@ -0,0 +1,19 @@
1
+ import './pulse.css';
2
+ import pulse_module_default from "./pulse.module.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/pulse.tsx
5
+ var PulseGlyph = () => /* @__PURE__ */ jsxs("g", {
6
+ fill: "currentColor",
7
+ children: [/* @__PURE__ */ jsx("circle", {
8
+ className: pulse_module_default.Ring,
9
+ cx: "12",
10
+ cy: "12",
11
+ r: "12"
12
+ }), /* @__PURE__ */ jsx("circle", {
13
+ cx: "12",
14
+ cy: "12",
15
+ r: "3"
16
+ })]
17
+ });
18
+ //#endregion
19
+ export { PulseGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/pulse.module.css
2
+ var Ring = "viraui__pulse-module__Ring_urT8a";
3
+ var pulse_module_default = {
4
+ Ring,
5
+ "spinner-pulse-ripple": "viraui__pulse-module__spinner-pulse-ripple_uxhZW"
6
+ };
7
+ //#endregion
8
+ export { Ring, pulse_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__radar-module__spinner-radar-spin_VcFzP{to{transform:rotate(1turn)}}.viraui__radar-module__Beam_iPWap{transform-origin:12px 12px;animation:viraui__radar-module__spinner-radar-spin_VcFzP 1.5s linear infinite;@media (prefers-reduced-motion:reduce){animation:none}}}
@@ -0,0 +1,2 @@
1
+ declare const RadarGlyph: React.FC;
2
+ export default RadarGlyph;
@@ -0,0 +1,53 @@
1
+ import './radar.css';
2
+ import radar_module_default from "./radar.module.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { useId } from "react";
5
+ //#region src/components/spinner/variants/radar.tsx
6
+ var RadarGlyph = () => {
7
+ const gradientId = `${useId().replaceAll(":", "")}-radar`;
8
+ return /* @__PURE__ */ jsxs("g", { children: [
9
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("radialGradient", {
10
+ id: gradientId,
11
+ cx: "12",
12
+ cy: "12",
13
+ r: "12",
14
+ gradientUnits: "userSpaceOnUse",
15
+ children: [/* @__PURE__ */ jsx("stop", {
16
+ offset: "0.3334",
17
+ stopColor: "currentColor"
18
+ }), /* @__PURE__ */ jsx("stop", {
19
+ offset: "1",
20
+ stopColor: "currentColor",
21
+ stopOpacity: "0"
22
+ })]
23
+ }) }),
24
+ /* @__PURE__ */ jsx("circle", {
25
+ cx: "12",
26
+ cy: "12",
27
+ r: "12",
28
+ fill: "currentColor",
29
+ opacity: "0.2"
30
+ }),
31
+ /* @__PURE__ */ jsx("circle", {
32
+ cx: "12",
33
+ cy: "12",
34
+ r: "8.25",
35
+ fill: "none",
36
+ stroke: "currentColor",
37
+ opacity: "0.2"
38
+ }),
39
+ /* @__PURE__ */ jsx("path", {
40
+ className: radar_module_default.Beam,
41
+ d: "M12 0C14.2599 0 16.4736 0.638508 18.3867 1.84131C20.2999 3.04429 21.8355 4.763 22.815 6.7998C23.7944 8.8366 24.179 11.1094 23.9238 13.3549C23.6687 15.6002 22.7844 17.7276 21.3735 19.4927L15.7061 14.5488C16.2056 13.824 16.5 12.9468 16.5 12C16.5 9.51472 14.4853 7.5 12 7.5V0Z",
42
+ fill: `url(#${gradientId})`
43
+ }),
44
+ /* @__PURE__ */ jsx("circle", {
45
+ cx: "12",
46
+ cy: "12",
47
+ r: "3",
48
+ fill: "currentColor"
49
+ })
50
+ ] });
51
+ };
52
+ //#endregion
53
+ export { RadarGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/radar.module.css
2
+ var Beam = "viraui__radar-module__Beam_iPWap";
3
+ var radar_module_default = {
4
+ Beam,
5
+ "spinner-radar-spin": "viraui__radar-module__spinner-radar-spin_VcFzP"
6
+ };
7
+ //#endregion
8
+ export { Beam, radar_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__ring-module__spinner-ring-spin_GiTYf{to{transform:rotate(1turn)}}.viraui__ring-module__Spin_UI5qI{transform-origin:12px 12px;animation:viraui__ring-module__spinner-ring-spin_GiTYf .8s linear infinite;@media (prefers-reduced-motion:reduce){animation:none}}}
@@ -0,0 +1,2 @@
1
+ declare const RingGlyph: React.FC;
2
+ export default RingGlyph;
@@ -0,0 +1,24 @@
1
+ import './ring.css';
2
+ import ring_module_default from "./ring.module.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/ring.tsx
5
+ var RingGlyph = () => /* @__PURE__ */ jsxs("g", {
6
+ fill: "none",
7
+ stroke: "currentColor",
8
+ strokeWidth: "2.5",
9
+ strokeLinecap: "round",
10
+ children: [/* @__PURE__ */ jsx("circle", {
11
+ cx: "12",
12
+ cy: "12",
13
+ r: "10",
14
+ opacity: "0.2"
15
+ }), /* @__PURE__ */ jsx("circle", {
16
+ className: ring_module_default.Spin,
17
+ cx: "12",
18
+ cy: "12",
19
+ r: "10",
20
+ strokeDasharray: "16 46.8"
21
+ })]
22
+ });
23
+ //#endregion
24
+ export { RingGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/ring.module.css
2
+ var Spin = "viraui__ring-module__Spin_UI5qI";
3
+ var ring_module_default = {
4
+ Spin,
5
+ "spinner-ring-spin": "viraui__ring-module__spinner-ring-spin_GiTYf"
6
+ };
7
+ //#endregion
8
+ export { Spin, ring_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__ripple-module__spinner-ripple-spread_2XAYW{0%{opacity:1;transform:scale(0)}to{opacity:0;transform:scale(1)}}.viraui__ripple-module__Ring_40qYn{transform-origin:12px 12px;animation:viraui__ripple-module__spinner-ripple-spread_2XAYW 1.2s ease-out infinite;animation-delay:calc(1.2s * (var(--__spinner-ripple-step) - 3) / 3);@media (prefers-reduced-motion:reduce){animation:none;opacity:.4;transform:scale(calc((var(--__spinner-ripple-step) + 1) / 3))}}}
@@ -0,0 +1,2 @@
1
+ declare const RippleGlyph: React.FC;
2
+ export default RippleGlyph;
@@ -0,0 +1,23 @@
1
+ import './ripple.css';
2
+ import ripple_module_default from "./ripple.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/ripple.tsx
5
+ var RINGS = [
6
+ 0,
7
+ 1,
8
+ 2
9
+ ];
10
+ var RippleGlyph = () => /* @__PURE__ */ jsx("g", {
11
+ fill: "none",
12
+ stroke: "currentColor",
13
+ strokeWidth: "1.9",
14
+ children: RINGS.map((index) => /* @__PURE__ */ jsx("circle", {
15
+ className: ripple_module_default.Ring,
16
+ cx: "12",
17
+ cy: "12",
18
+ r: "11",
19
+ style: { "--__spinner-ripple-step": index }
20
+ }, index))
21
+ });
22
+ //#endregion
23
+ export { RippleGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/ripple.module.css
2
+ var Ring = "viraui__ripple-module__Ring_40qYn";
3
+ var ripple_module_default = {
4
+ Ring,
5
+ "spinner-ripple-spread": "viraui__ripple-module__spinner-ripple-spread_2XAYW"
6
+ };
7
+ //#endregion
8
+ export { Ring, ripple_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__slide-module__spinner-slide-walk_53ezW{0%{transform:translate(10.5px)}25%,8.33%{transform:translate(10.5px,10.5px)}33.33%,50%{transform:translateY(10.5px)}58.33%,75%{transform:translate(0)}83.33%,to{transform:translate(10.5px)}}.viraui__slide-module__Dot_Ca-UR{animation:viraui__slide-module__spinner-slide-walk_53ezW 2.4s ease-in-out infinite;animation-delay:calc(2.4s * (var(--__spinner-slide-step) - 3) / 3);@media (prefers-reduced-motion:reduce){animation:none;transform:var(--__spinner-slide-rest)}}}
@@ -0,0 +1,2 @@
1
+ declare const SlideGlyph: React.FC;
2
+ export default SlideGlyph;
@@ -0,0 +1,24 @@
1
+ import './slide.css';
2
+ import slide_module_default from "./slide.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/slide.tsx
5
+ var RESTS = [
6
+ "translate(10.5px, 0)",
7
+ "translate(0, 0)",
8
+ "translate(0, 10.5px)"
9
+ ];
10
+ var SlideGlyph = () => /* @__PURE__ */ jsx("g", {
11
+ fill: "currentColor",
12
+ children: RESTS.map((rest, index) => /* @__PURE__ */ jsx("circle", {
13
+ className: slide_module_default.Dot,
14
+ cx: "4.5",
15
+ cy: "4.5",
16
+ r: "4",
17
+ style: {
18
+ "--__spinner-slide-step": index,
19
+ "--__spinner-slide-rest": rest
20
+ }
21
+ }, rest))
22
+ });
23
+ //#endregion
24
+ export { SlideGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/slide.module.css
2
+ var Dot = "viraui__slide-module__Dot_Ca-UR";
3
+ var slide_module_default = {
4
+ Dot,
5
+ "spinner-slide-walk": "viraui__slide-module__spinner-slide-walk_53ezW"
6
+ };
7
+ //#endregion
8
+ export { Dot, slide_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__snake-module__spinner-snake-spin_76ETQ{to{transform:rotate(1turn)}}@keyframes viraui__snake-module__spinner-snake-stretch_j03ip{0%{stroke-dasharray:1 100;stroke-dashoffset:0}50%{stroke-dasharray:45 100;stroke-dashoffset:-17}to{stroke-dasharray:45 100;stroke-dashoffset:-62}}.viraui__snake-module__Spin_qqtko{transform-origin:12px 12px;animation:viraui__snake-module__spinner-snake-spin_76ETQ 1.4s linear infinite;@media (prefers-reduced-motion:reduce){animation:none}}.viraui__snake-module__Dash_MvPl3{animation:viraui__snake-module__spinner-snake-stretch_j03ip 1.4s ease-in-out infinite;@media (prefers-reduced-motion:reduce){animation:none;stroke-dasharray:18 100}}}
@@ -0,0 +1,2 @@
1
+ declare const SnakeGlyph: React.FC;
2
+ export default SnakeGlyph;
@@ -0,0 +1,19 @@
1
+ import './snake.css';
2
+ import snake_module_default from "./snake.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/snake.tsx
5
+ var SnakeGlyph = () => /* @__PURE__ */ jsx("g", {
6
+ className: snake_module_default.Spin,
7
+ fill: "none",
8
+ stroke: "currentColor",
9
+ strokeWidth: "2.5",
10
+ strokeLinecap: "round",
11
+ children: /* @__PURE__ */ jsx("circle", {
12
+ className: snake_module_default.Dash,
13
+ cx: "12",
14
+ cy: "12",
15
+ r: "10"
16
+ })
17
+ });
18
+ //#endregion
19
+ export { SnakeGlyph as default };
@@ -0,0 +1,11 @@
1
+ //#region src/components/spinner/variants/snake.module.css
2
+ var Spin = "viraui__snake-module__Spin_qqtko";
3
+ var Dash = "viraui__snake-module__Dash_MvPl3";
4
+ var snake_module_default = {
5
+ Spin,
6
+ "spinner-snake-spin": "viraui__snake-module__spinner-snake-spin_76ETQ",
7
+ Dash,
8
+ "spinner-snake-stretch": "viraui__snake-module__spinner-snake-stretch_j03ip"
9
+ };
10
+ //#endregion
11
+ export { Dash, Spin, snake_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__swirl-module__spinner-swirl-fade_jOM4Q{0%{opacity:1}to{opacity:.2}}.viraui__swirl-module__Cell_ntRNb{animation:viraui__swirl-module__spinner-swirl-fade_jOM4Q 1.2s linear infinite;animation-delay:calc(1.2s * (var(--__spinner-swirl-step) - 8) / 8);@media (prefers-reduced-motion:reduce){animation:none;opacity:.6}}}
@@ -0,0 +1,2 @@
1
+ declare const SwirlGlyph: React.FC;
2
+ export default SwirlGlyph;
@@ -0,0 +1,35 @@
1
+ import './swirl.css';
2
+ import swirl_module_default from "./swirl.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/swirl.tsx
5
+ var RING = [
6
+ 0,
7
+ 1,
8
+ 2,
9
+ 7,
10
+ null,
11
+ 3,
12
+ 6,
13
+ 5,
14
+ 4
15
+ ];
16
+ var CELL = 7;
17
+ var SwirlGlyph = () => /* @__PURE__ */ jsx("g", {
18
+ fill: "currentColor",
19
+ children: RING.map((place, index) => {
20
+ if (place === null) return null;
21
+ const col = index % 3;
22
+ const row = Math.floor(index / 3);
23
+ return /* @__PURE__ */ jsx("rect", {
24
+ className: swirl_module_default.Cell,
25
+ x: col * 8.5,
26
+ y: row * 8.5,
27
+ width: CELL,
28
+ height: CELL,
29
+ rx: "1.5",
30
+ style: { "--__spinner-swirl-step": place }
31
+ }, place);
32
+ })
33
+ });
34
+ //#endregion
35
+ export { SwirlGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/swirl.module.css
2
+ var Cell = "viraui__swirl-module__Cell_ntRNb";
3
+ var swirl_module_default = {
4
+ Cell,
5
+ "spinner-swirl-fade": "viraui__swirl-module__spinner-swirl-fade_jOM4Q"
6
+ };
7
+ //#endregion
8
+ export { Cell, swirl_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__trace-module__spinner-trace-dash_-Wnw8{to{stroke-dashoffset:-63.13}}.viraui__trace-module__Dash_mjMJN{animation:viraui__trace-module__spinner-trace-dash_-Wnw8 1.2s linear infinite;@media (prefers-reduced-motion:reduce){animation:none}}}
@@ -0,0 +1,2 @@
1
+ declare const TraceGlyph: React.FC;
2
+ export default TraceGlyph;
@@ -0,0 +1,28 @@
1
+ import './trace.css';
2
+ import trace_module_default from "./trace.module.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/trace.tsx
5
+ var TraceGlyph = () => /* @__PURE__ */ jsxs("g", {
6
+ fill: "none",
7
+ stroke: "currentColor",
8
+ strokeWidth: "2.5",
9
+ strokeLinecap: "round",
10
+ children: [/* @__PURE__ */ jsx("rect", {
11
+ x: "3.25",
12
+ y: "3.25",
13
+ width: "17.5",
14
+ height: "17.5",
15
+ rx: "4",
16
+ opacity: "0.2"
17
+ }), /* @__PURE__ */ jsx("rect", {
18
+ className: trace_module_default.Dash,
19
+ x: "3.25",
20
+ y: "3.25",
21
+ width: "17.5",
22
+ height: "17.5",
23
+ rx: "4",
24
+ strokeDasharray: "16 47.13"
25
+ })]
26
+ });
27
+ //#endregion
28
+ export { TraceGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/trace.module.css
2
+ var Dash = "viraui__trace-module__Dash_mjMJN";
3
+ var trace_module_default = {
4
+ Dash,
5
+ "spinner-trace-dash": "viraui__trace-module__spinner-trace-dash_-Wnw8"
6
+ };
7
+ //#endregion
8
+ export { Dash, trace_module_default as default };
@@ -0,0 +1 @@
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@keyframes viraui__wave-module__spinner-wave-rise_lowcl{0%,to{transform:scaleY(.3)}50%{transform:scaleY(1)}}.viraui__wave-module__Bar_fg7xQ{transform-box:fill-box;transform-origin:center;animation:viraui__wave-module__spinner-wave-rise_lowcl .9s ease-in-out infinite;animation-delay:calc(.9s * (var(--__spinner-wave-step) - 5) / 5);@media (prefers-reduced-motion:reduce){animation:none;transform:scaleY(calc(.4 + var(--__spinner-wave-step) * .12))}}}
@@ -0,0 +1,2 @@
1
+ declare const WaveGlyph: React.FC;
2
+ export default WaveGlyph;
@@ -0,0 +1,25 @@
1
+ import './wave.css';
2
+ import wave_module_default from "./wave.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/components/spinner/variants/wave.tsx
5
+ var BARS = [
6
+ 0,
7
+ 1,
8
+ 2,
9
+ 3,
10
+ 4
11
+ ];
12
+ var WaveGlyph = () => /* @__PURE__ */ jsx("g", {
13
+ fill: "currentColor",
14
+ children: BARS.map((index) => /* @__PURE__ */ jsx("rect", {
15
+ className: wave_module_default.Bar,
16
+ x: 2 + index * 4.4,
17
+ y: 3.6,
18
+ width: "2.8",
19
+ height: "16.8",
20
+ rx: "1.4",
21
+ style: { "--__spinner-wave-step": index }
22
+ }, index))
23
+ });
24
+ //#endregion
25
+ export { WaveGlyph as default };
@@ -0,0 +1,8 @@
1
+ //#region src/components/spinner/variants/wave.module.css
2
+ var Bar = "viraui__wave-module__Bar_fg7xQ";
3
+ var wave_module_default = {
4
+ Bar,
5
+ "spinner-wave-rise": "viraui__wave-module__spinner-wave-rise_lowcl"
6
+ };
7
+ //#endregion
8
+ export { Bar, wave_module_default as default };
@@ -1 +1 @@
1
- @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-stack-row-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-column-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-h-align{syntax:"*";inherits:false;initial-value:initial}@property --vui-stack-v-align{syntax:"*";inherits:false;initial-value:initial}@property --vui-stack-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-max-width{syntax:"*";inherits:false;initial-value:none}@property --vui-stack-min-width{syntax:"*";inherits:false;initial-value:none}.viraui__stack-module__Stack_NR-Ey{display:flex;gap:var(--vui-stack-row-gap) var(--vui-stack-column-gap);flex-direction:column;align-items:var(--vui-stack-h-align);justify-content:var(--vui-stack-v-align);max-inline-size:var(--vui-stack-max-width);min-inline-size:var(--vui-stack-min-width);&[data-stack-direction=column-reverse]{flex-direction:column-reverse}&[data-stack-direction=row-reverse],&[data-stack-direction=row]{align-items:var(--vui-stack-v-align);justify-content:var(--vui-stack-h-align)}&[data-stack-direction=row]{flex-direction:row}&[data-stack-direction=row-reverse]{flex-direction:row-reverse}&[data-stack-inline=true]{display:inline-flex;flex-grow:0}:where(&[data-stack-wrap=true]){flex-wrap:wrap}:where(&[data-stack-has-padding=true]){padding:var(--vui-stack-padding-block-start) var(--vui-stack-padding-inline-end) var(--vui-stack-padding-block-end) var(--vui-stack-padding-inline-start)}:where(&[data-stack-expand-children=true]>*){flex-grow:var(--vira-flex-grow,1)}&[data-stack-full-width=true]{inline-size:100%}&[data-stack-container=true]{container:stack/inline-size}}}
1
+ @layer viraui.preflight, viraui.components, viraui.overrides;@layer viraui.components{@property --vui-stack-row-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-column-gap{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-h-align{syntax:"*";inherits:false;initial-value:initial}@property --vui-stack-v-align{syntax:"*";inherits:false;initial-value:initial}@property --vui-stack-padding-inline-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-inline-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-block-start{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-padding-block-end{syntax:"<length>";inherits:false;initial-value:0}@property --vui-stack-max-width{syntax:"*";inherits:false;initial-value:none}@property --vui-stack-min-width{syntax:"*";inherits:false;initial-value:none}.viraui__stack-module__Stack_NR-Ey{display:flex;gap:var(--vui-stack-row-gap) var(--vui-stack-column-gap);flex-direction:column;align-items:var(--vui-stack-h-align);justify-content:var(--vui-stack-v-align);max-inline-size:var(--vui-stack-max-width);min-inline-size:var(--vui-stack-min-width);&[data-stack-direction=column-reverse]{flex-direction:column-reverse}&[data-stack-direction=row-reverse],&[data-stack-direction=row]{align-items:var(--vui-stack-v-align);justify-content:var(--vui-stack-h-align)}&[data-stack-direction=row]{flex-direction:row}&[data-stack-direction=row-reverse]{flex-direction:row-reverse}&[data-stack-inline=true]{display:inline-flex;flex-grow:0}:where(&[data-stack-wrap=true]){flex-wrap:wrap}:where(&[data-stack-has-padding=true]){padding:var(--vui-stack-padding-block-start) var(--vui-stack-padding-inline-end) var(--vui-stack-padding-block-end) var(--vui-stack-padding-inline-start)}:where(&[data-stack-expand-children=true]>*){flex-grow:var(--vira-flex-grow,1)}&[data-stack-full-width=true]{inline-size:100%}&[data-stack-full-height=true]{block-size:100%}&[data-stack-container=true]{container:stack/inline-size}}}
@@ -47,8 +47,9 @@ export type StackProps = React.ComponentPropsWithoutRef<'div'> & {
47
47
  * Makes direct children grow along the flex main axis (`flex-grow`).
48
48
  *
49
49
  * Prefer for equal-width row actions instead of inventing width/flex CSS on each child.
50
- * Does not set the stack root's own inline size — use `fullWidth` when this stack must
51
- * fill its parent width (e.g. centered shell with `maxWidth`, or a full-bleed Button column).
50
+ * Cross-axis fill stays on `hAlign` / `vAlign="stretch"` (which prop is cross depends on
51
+ * `direction`). Does not size this root — use `fullWidth` / `fullHeight` when the Stack must
52
+ * fill its parent first so stretch has room.
52
53
  *
53
54
  * @defaultValue false
54
55
  */
@@ -59,11 +60,22 @@ export type StackProps = React.ComponentPropsWithoutRef<'div'> & {
59
60
  * Prefer this (with cross-axis stretch) so content-sized children like Button span a panel —
60
61
  * do not add `width: 100%` CSS on those children.
61
62
  * Use with `maxWidth` under a parent `hAlign="center"` for a fluid, capped, centered shell.
62
- * Orthogonal to `expandChildren` (self size vs children grow).
63
+ * Orthogonal to `expandChildren` (self size vs children grow). Pair with `fullHeight` when the
64
+ * root must fill both parent axes.
63
65
  *
64
66
  * @defaultValue false
65
67
  */
66
68
  fullWidth?: boolean;
69
+ /**
70
+ * Sets `block-size: 100%` on the stack root so it fills the parent's block size.
71
+ *
72
+ * Prefer this over `style`/`className` `height` / `block-size: 100%` on this Stack.
73
+ * Pair with `expandChildren` and cross-axis `hAlign`/`vAlign="stretch"` so children fill both
74
+ * axes without per-child size CSS. Orthogonal to `expandChildren` and `fullWidth`.
75
+ *
76
+ * @defaultValue false
77
+ */
78
+ fullHeight?: boolean;
67
79
  /**
68
80
  * Sets the gap between flex rows using the Vira space token scale.
69
81
  *
@@ -5,7 +5,7 @@ import { resolveAxisPadding } from "../../core/styles/resolve-axis-padding.js";
5
5
  import stack_module_default from "./stack.module.js";
6
6
  import { useRender } from "@base-ui/react/use-render";
7
7
  //#region src/components/stack/stack.tsx
8
- var Stack = ({ className, direction = "column", expandChildren = false, fullWidth = false, hAlign = "initial", hPadding, inline = false, maxWidth, minWidth, enableContainer, ref, render, rowGap, columnGap, style, vAlign = "initial", vPadding, wrap = false, ...otherProps }) => {
8
+ var Stack = ({ className, direction = "column", expandChildren = false, fullHeight = false, fullWidth = false, hAlign = "initial", hPadding, inline = false, maxWidth, minWidth, enableContainer, ref, render, rowGap, columnGap, style, vAlign = "initial", vPadding, wrap = false, ...otherProps }) => {
9
9
  const hasPadding = Boolean(hPadding || vPadding);
10
10
  const dynamicStyle = {
11
11
  "--vui-stack-row-gap": resolveThemeValue(rowGap, "space", 0),
@@ -30,6 +30,7 @@ var Stack = ({ className, direction = "column", expandChildren = false, fullWidt
30
30
  "data-stack-wrap": wrap ? "true" : "false",
31
31
  "data-stack-expand-children": expandChildren ? "true" : "false",
32
32
  "data-stack-full-width": fullWidth ? "true" : "false",
33
+ "data-stack-full-height": fullHeight ? "true" : "false",
33
34
  "data-stack-has-padding": hasPadding ? "true" : "false",
34
35
  className: clsx(stack_module_default.Stack, className),
35
36
  style: dynamicStyle
@@ -4,4 +4,4 @@
4
4
  )}&[data-surface-hover-color=primary]{--vui-surface-background-hover:light-dark(
5
5
  oklab(from var(--global-primary) l a b / 20%),
6
6
  oklab(from var(--global-primary) l a b / 10%)
7
- )}@container root not style(--effect-vibrancy: initial){&[data-vibrant]{background:oklab(from var(--global-background) l a b/80%)}&[data-vibrant][data-surface-has-color=true]{background:oklab(from var(--vui-surface-background) l a b/80%)}}&[data-surface-has-padding=true]{padding:var(--vui-surface-padding-block-start) var(--vui-surface-padding-inline-end) var(--vui-surface-padding-block-end) var(--vui-surface-padding-inline-start)}&[data-surface-border]{border-style:var(--vui-surface-border-style);border-color:var(--global-contrast);border-left-width:0;border-bottom-width:0;border-right-width:0;border-top-width:0}&[data-surface-border~=all]{border-width:1px}&[data-surface-border~=top]{border-top-width:1px}&[data-surface-border~=right]{border-right-width:1px}&[data-surface-border~=bottom]{border-bottom-width:1px}&[data-surface-border~=left]{border-left-width:1px}@media (hover:hover) and (pointer:fine){&[data-surface-has-hover-color=true]:hover{background:var(--vui-surface-background-hover)}}&[data-surface-container=true]{container:surface/inline-size}}}
7
+ )}@container root not style(--effect-vibrancy: initial){&[data-vibrant]{background:#0000}&[data-vibrant][data-surface-has-color=true]{background:oklab(from var(--vui-surface-background) l a b/80%)}}&[data-surface-has-padding=true]{padding:var(--vui-surface-padding-block-start) var(--vui-surface-padding-inline-end) var(--vui-surface-padding-block-end) var(--vui-surface-padding-inline-start)}&[data-surface-border]{border-style:var(--vui-surface-border-style);border-color:var(--global-contrast);border-left-width:0;border-bottom-width:0;border-right-width:0;border-top-width:0}&[data-surface-border~=all]{border-width:1px}&[data-surface-border~=top]{border-top-width:1px}&[data-surface-border~=right]{border-right-width:1px}&[data-surface-border~=bottom]{border-bottom-width:1px}&[data-surface-border~=left]{border-left-width:1px}@media (hover:hover) and (pointer:fine){&[data-surface-has-hover-color=true]:hover{background:var(--vui-surface-background-hover)}}&[data-surface-container=true]{container:surface/inline-size}}}
@@ -2,4 +2,4 @@
2
2
  var(--__text-size-min),
3
3
  calc(var(--__text-size-min) + (var(--__text-size-max) - var(--__text-size-min)) * var(--__text-fluid)),
4
4
  var(--__text-size-max)
5
- );--vui-text-font-family:var(--font-family-body);--vui-text-line-height:var(--font-leading-m);margin:0;max-inline-size:var(--vui-text-max-width);font-family:var(--vui-text-font-family);font-size:var(--vui-text-font-size);line-height:var(--vui-text-line-height);letter-spacing:var(--vui-text-letter-spacing);text-transform:var(--vui-text-text-transform);white-space:var(--vui-text-white-space);word-break:break-word;font-weight:var(--vui-text-font-weight);font-stretch:calc(var(--vui-text-font-width) * 1%);font-optical-sizing:auto;font-variation-settings:"wght" var(--vui-text-font-weight),"wdth" var(--vui-text-font-width),"opsz" var(--vui-text-font-opsz);text-box:var(--vui-text-trim) var(--vui-text-trim-type);&[data-text-balanced=true]{text-wrap:balance}&[data-text-selection=false]{-webkit-user-select:none;user-select:none}&[data-text-has-align=true]{text-align:var(--vui-text-align)}&[data-text-has-padding=true]{padding:var(--vui-text-padding-block-start) var(--vui-text-padding-inline-end) var(--vui-text-padding-block-end) var(--vui-text-padding-inline-start)}&[data-text-family=mono]{--vui-text-font-family:var(--font-family-mono)}&[data-text-size="4xl"]{--__text-size-min:var(--font-scale-body-3xl);--__text-size-max:var(--font-scale-body-4xl)}&[data-text-size="3xl"]{--__text-size-min:var(--font-scale-body-2xl);--__text-size-max:var(--font-scale-body-3xl)}&[data-text-size="2xl"]{--__text-size-min:var(--font-scale-body-xl);--__text-size-max:var(--font-scale-body-2xl)}&[data-text-size=xl]{--__text-size-min:var(--font-scale-body-l);--__text-size-max:var(--font-scale-body-xl)}&[data-text-size=l]{--__text-size-min:var(--font-scale-body-m);--__text-size-max:var(--font-scale-body-l)}&[data-text-size=s]{--__text-size-max:var(--font-scale-body-s)}&[data-text-size=s],&[data-text-size=xs]{--__text-size-min:var(--font-scale-body-xs)}&[data-text-size=xs]{--__text-size-max:var(--font-scale-body-xs)}& .viraui__text-module__Text_bS8kv:not([data-text-size]){font-size:inherit}& .viraui__text-module__Text_bS8kv:not([data-text-line-height]){line-height:inherit}&[data-text-fluid=false]{--vui-text-font-size:var(--__text-size-max)}@container root style(--effect-fluid-typography: initial){--vui-text-font-size:var(--__text-size-max)}&[data-text-weight=light]{--vui-text-font-weight:200}&[data-text-weight=semibold]{--vui-text-font-weight:600}&[data-text-weight=bold]{--vui-text-font-weight:800}&[data-text-tone=primary]{color:var(--global-primary)}&[data-text-tone=muted]{color:var(--global-muted)}&[data-text-tone=interactive]{color:var(--global-interactive-text)}&[data-text-tone=positive]{color:var(--highlight-green)}&[data-text-tone=informative]{color:var(--highlight-blue)}&[data-text-tone=danger]{color:var(--highlight-red)}&[data-text-tone=warning]{color:var(--highlight-yellow)}&[data-text-has-literal-color=true]{color:var(--vui-text-literal-color)}&[data-text-line-height=none]{--vui-text-line-height:0}&[data-text-line-height=xs]{--vui-text-line-height:var(--font-leading-xs)}&[data-text-line-height=s]{--vui-text-line-height:var(--font-leading-s)}&[data-text-line-height=m]{--vui-text-line-height:var(--font-leading-m)}&[data-text-line-height=l]{--vui-text-line-height:var(--font-leading-l)}}}
5
+ );--vui-text-font-family:var(--font-family-body);--vui-text-line-height:var(--font-leading-m);margin:0;max-inline-size:var(--vui-text-max-width);font-family:var(--vui-text-font-family);font-size:var(--vui-text-font-size);line-height:var(--vui-text-line-height);letter-spacing:var(--vui-text-letter-spacing);text-transform:var(--vui-text-text-transform);white-space:var(--vui-text-white-space);word-break:break-word;font-weight:var(--vui-text-font-weight);font-stretch:calc(var(--vui-text-font-width) * 1%);font-optical-sizing:auto;font-variation-settings:"wght" var(--vui-text-font-weight),"wdth" var(--vui-text-font-width),"opsz" var(--vui-text-font-opsz);text-box:var(--vui-text-trim) var(--vui-text-trim-type);&[data-text-balanced=true]{text-wrap:balance}&[data-text-selection=false]{-webkit-user-select:none;user-select:none}&[data-text-has-align=true]{text-align:var(--vui-text-align)}&[data-text-has-padding=true]{padding:var(--vui-text-padding-block-start) var(--vui-text-padding-inline-end) var(--vui-text-padding-block-end) var(--vui-text-padding-inline-start)}&[data-text-family=mono]{--vui-text-font-family:var(--font-family-mono)}&[data-text-size="4xl"]{--__text-size-min:var(--font-scale-body-3xl);--__text-size-max:var(--font-scale-body-4xl)}&[data-text-size="3xl"]{--__text-size-min:var(--font-scale-body-2xl);--__text-size-max:var(--font-scale-body-3xl)}&[data-text-size="2xl"]{--__text-size-min:var(--font-scale-body-xl);--__text-size-max:var(--font-scale-body-2xl)}&[data-text-size=xl]{--__text-size-min:var(--font-scale-body-l);--__text-size-max:var(--font-scale-body-xl)}&[data-text-size=l]{--__text-size-min:var(--font-scale-body-m);--__text-size-max:var(--font-scale-body-l)}&[data-text-size=s]{--__text-size-min:var(--font-scale-body-s);--__text-size-max:var(--font-scale-body-s)}&[data-text-size=xs]{--__text-size-min:var(--font-scale-body-xs);--__text-size-max:var(--font-scale-body-xs)}& .viraui__text-module__Text_bS8kv:not([data-text-size]){font-size:inherit}& .viraui__text-module__Text_bS8kv:not([data-text-line-height]){line-height:inherit}&[data-text-fluid=false]{--vui-text-font-size:var(--__text-size-max)}@container root style(--effect-fluid-typography: initial){--vui-text-font-size:var(--__text-size-max)}&[data-text-weight=light]{--vui-text-font-weight:200}&[data-text-weight=semibold]{--vui-text-font-weight:600}&[data-text-weight=bold]{--vui-text-font-weight:800}&[data-text-tone=primary]{color:var(--global-primary)}&[data-text-tone=muted]{color:var(--global-muted)}&[data-text-tone=interactive]{color:var(--global-interactive-text)}&[data-text-tone=positive]{color:var(--highlight-green)}&[data-text-tone=informative]{color:var(--highlight-blue)}&[data-text-tone=danger]{color:var(--highlight-red)}&[data-text-tone=warning]{color:var(--highlight-yellow)}&[data-text-has-literal-color=true]{color:var(--vui-text-literal-color)}&[data-text-line-height=none]{--vui-text-line-height:0}&[data-text-line-height=xs]{--vui-text-line-height:var(--font-leading-xs)}&[data-text-line-height=s]{--vui-text-line-height:var(--font-leading-s)}&[data-text-line-height=m]{--vui-text-line-height:var(--font-leading-m)}&[data-text-line-height=l]{--vui-text-line-height:var(--font-leading-l)}}}
@@ -31,7 +31,7 @@ export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
31
31
  *
32
32
  * @defaultValue 'm' on root Text (CSS); inherit when nested and omitted
33
33
  */
34
- size?: '4xl' | '3xl' | '2xl' | 'xl' | 'l' | 'm' | 's' | 'xs';
34
+ size?: 'xs' | 's' | 'm' | 'l' | 'xl' | '2xl' | '3xl' | '4xl';
35
35
  /**
36
36
  * Selects the semantic font family for body copy and inline code-like text.
37
37
  *
@@ -61,7 +61,9 @@ export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
61
61
  color?: string;
62
62
  /**
63
63
  * Controls line height through foundation leading tokens.
64
+ * Root Text without lineHeight uses leading `m` (`l` when open; `s` for dense chrome).
64
65
  * Omit when nested in Text so line-height inherits the outer Text.
66
+ * Prefer this prop over CSS `line-height`.
65
67
  *
66
68
  * @defaultValue 'm' on root Text (CSS); inherit when nested and omitted
67
69
  */
@@ -75,6 +77,9 @@ export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
75
77
  align?: React.CSSProperties['textAlign'];
76
78
  /**
77
79
  * Constrains the maximum inline size of the rendered text block.
80
+ * Prefer for readable UI measure (~10–12 words/line) over CSS `max-width`.
81
+ * Prefer `ch` (not `rem`) in patterns/examples. Width tracks `size` — smaller type → narrower cap;
82
+ * never one fixed ch for every size. Shared columns may use parent Stack `maxWidth` sized for the dominant body `size`.
78
83
  *
79
84
  * @defaultValue No max width constraint.
80
85
  */
@@ -101,6 +106,8 @@ export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
101
106
  transform?: React.CSSProperties['textTransform'];
102
107
  /**
103
108
  * Enables balanced wrapping for block-like copy.
109
+ * Prefer on short wrapping UI paragraphs (hero lead, empty state, card blurb);
110
+ * omit when single-line or intentional ragged.
104
111
  *
105
112
  * @defaultValue false
106
113
  */
@@ -151,7 +158,8 @@ export type TextProps = React.ComponentPropsWithoutRef<'span'> & {
151
158
  /**
152
159
  * Enables viewport fluid clamp sizing for this instance.
153
160
  * Default locks at this size’s `--font-scale-body-*` token (UI chrome stays stable).
154
- * Pass `true` for fluid page/body copy. Theme `--effect-fluid-typography: initial` still locks all Text globally.
161
+ * Pass `true` for fluid page/body copy (`m`+). `s` / `xs` stay fixed either way.
162
+ * Theme `--effect-fluid-typography: initial` still locks all Text globally.
155
163
  *
156
164
  * @defaultValue false
157
165
  */