@viraui/react 0.0.21 → 0.0.23

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 (181) hide show
  1. package/dist/catalog.json +33 -3
  2. package/dist/components/avatar/avatar.css +1 -1
  3. package/dist/components/avatar/avatar.js +1 -1
  4. package/dist/components/avatar/avatar.module.js +3 -3
  5. package/dist/components/avatar-group/avatar-group.css +1 -1
  6. package/dist/components/avatar-group/avatar-group.js +3 -2
  7. package/dist/components/avatar-group/avatar-group.module.js +5 -5
  8. package/dist/components/basic-input/basic-input.css +1 -1
  9. package/dist/components/basic-input/basic-input.js +1 -2
  10. package/dist/components/basic-input/basic-input.module.js +1 -1
  11. package/dist/components/basic-input/field-helper-copy.d.ts +1 -1
  12. package/dist/components/basic-input/field-helper-copy.js +0 -1
  13. package/dist/components/basic-input/field-label.css +1 -1
  14. package/dist/components/basic-input/field-label.js +1 -2
  15. package/dist/components/basic-input/field-label.module.js +1 -1
  16. package/dist/components/basic-input/input-control-group.js +0 -1
  17. package/dist/components/button/button.css +1 -1
  18. package/dist/components/button/button.d.ts +13 -7
  19. package/dist/components/button/button.guide.json +7 -5
  20. package/dist/components/button/button.js +12 -11
  21. package/dist/components/button/button.module.js +3 -3
  22. package/dist/components/checkbox/checkbox-group.d.ts +12 -0
  23. package/dist/components/checkbox/checkbox-group.js +15 -0
  24. package/dist/components/checkbox/checkbox.css +1 -1
  25. package/dist/components/checkbox/checkbox.d.ts +6 -21
  26. package/dist/components/checkbox/checkbox.guide.json +10 -5
  27. package/dist/components/checkbox/checkbox.js +46 -60
  28. package/dist/components/checkbox/checkbox.module.js +7 -6
  29. package/dist/components/checkbox/index.d.ts +2 -0
  30. package/dist/components/chip/chip.css +1 -1
  31. package/dist/components/chip/chip.js +1 -3
  32. package/dist/components/chip/chip.module.js +4 -4
  33. package/dist/components/clamp-text/clamp-text.css +1 -1
  34. package/dist/components/clamp-text/clamp-text.js +1 -1
  35. package/dist/components/clamp-text/clamp-text.module.js +1 -1
  36. package/dist/components/dialog/dialog-close.d.ts +15 -0
  37. package/dist/components/dialog/dialog-close.js +9 -0
  38. package/dist/components/dialog/dialog-sheet.d.ts +66 -0
  39. package/dist/components/dialog/dialog-sheet.js +80 -0
  40. package/dist/components/dialog/dialog-trigger.d.ts +13 -0
  41. package/dist/components/dialog/dialog-trigger.js +9 -0
  42. package/dist/components/dialog/dialog.css +1 -0
  43. package/dist/components/dialog/dialog.d.ts +21 -0
  44. package/dist/components/dialog/dialog.guide.json +26 -0
  45. package/dist/components/dialog/dialog.js +18 -0
  46. package/dist/components/dialog/dialog.module.js +13 -0
  47. package/dist/components/dialog/index.d.ts +8 -0
  48. package/dist/components/elevator/elevator.js +4 -4
  49. package/dist/components/fieldset/fieldset.d.ts +35 -0
  50. package/dist/components/fieldset/fieldset.guide.json +28 -0
  51. package/dist/components/fieldset/fieldset.js +30 -0
  52. package/dist/components/fieldset/index.d.ts +2 -0
  53. package/dist/components/icon/icon.css +1 -1
  54. package/dist/components/icon/icon.js +1 -1
  55. package/dist/components/icon/icon.module.js +1 -1
  56. package/dist/components/icon-button/icon-button.d.ts +1 -1
  57. package/dist/components/icon-button/icon-button.guide.json +1 -1
  58. package/dist/components/icon-button/icon-button.js +1 -1
  59. package/dist/components/index.d.ts +5 -0
  60. package/dist/components/linear-progress/linear-progress.css +1 -1
  61. package/dist/components/linear-progress/linear-progress.js +1 -2
  62. package/dist/components/linear-progress/linear-progress.module.js +4 -4
  63. package/dist/components/masonry/masonry-item.js +1 -2
  64. package/dist/components/masonry/masonry.css +1 -1
  65. package/dist/components/masonry/masonry.js +3 -4
  66. package/dist/components/masonry/masonry.module.js +2 -2
  67. package/dist/components/progressive-blur/index.d.ts +2 -0
  68. package/dist/components/progressive-blur/progressive-blur.css +1 -0
  69. package/dist/components/progressive-blur/progressive-blur.d.ts +38 -0
  70. package/dist/components/progressive-blur/progressive-blur.guide.json +25 -0
  71. package/dist/components/progressive-blur/progressive-blur.js +39 -0
  72. package/dist/components/progressive-blur/progressive-blur.module.js +6 -0
  73. package/dist/components/progressive-blur/progressive-blur.utils.d.ts +14 -0
  74. package/dist/components/progressive-blur/progressive-blur.utils.js +40 -0
  75. package/dist/components/radio/radio-group.d.ts +5 -38
  76. package/dist/components/radio/radio-group.js +12 -50
  77. package/dist/components/radio/radio.css +1 -1
  78. package/dist/components/radio/radio.d.ts +1 -1
  79. package/dist/components/radio/radio.guide.json +12 -8
  80. package/dist/components/radio/radio.js +32 -30
  81. package/dist/components/radio/radio.module.js +3 -5
  82. package/dist/components/select/select-group.js +2 -2
  83. package/dist/components/select/select-indicator-slot.js +0 -1
  84. package/dist/components/select/select-option.d.ts +15 -2
  85. package/dist/components/select/select-option.js +34 -21
  86. package/dist/components/select/select-separator.js +1 -2
  87. package/dist/components/select/select.css +1 -1
  88. package/dist/components/select/select.d.ts +7 -1
  89. package/dist/components/select/select.guide.json +9 -3
  90. package/dist/components/select/select.js +6 -5
  91. package/dist/components/select/select.module.js +17 -15
  92. package/dist/components/skeleton/skeleton.css +1 -1
  93. package/dist/components/skeleton/skeleton.js +2 -2
  94. package/dist/components/skeleton/skeleton.module.js +2 -2
  95. package/dist/components/slider/slider-control.js +0 -1
  96. package/dist/components/slider/slider.css +1 -1
  97. package/dist/components/slider/slider.js +2 -4
  98. package/dist/components/slider/slider.module.js +9 -8
  99. package/dist/components/spinner/spinner.css +1 -1
  100. package/dist/components/spinner/spinner.js +4 -4
  101. package/dist/components/spinner/spinner.module.js +3 -3
  102. package/dist/components/stack/stack.css +1 -1
  103. package/dist/components/stack/stack.d.ts +2 -2
  104. package/dist/components/stack/stack.js +1 -2
  105. package/dist/components/stack/stack.module.js +1 -1
  106. package/dist/components/static-noise/index.d.ts +2 -0
  107. package/dist/components/static-noise/static-noise.css +1 -0
  108. package/dist/components/static-noise/static-noise.d.ts +37 -0
  109. package/dist/components/static-noise/static-noise.guide.json +25 -0
  110. package/dist/components/static-noise/static-noise.js +46 -0
  111. package/dist/components/static-noise/static-noise.module.js +6 -0
  112. package/dist/components/surface/surface-radius-context.d.ts +45 -0
  113. package/dist/components/surface/surface-radius-context.js +81 -0
  114. package/dist/components/surface/surface.css +1 -1
  115. package/dist/components/surface/surface.d.ts +11 -5
  116. package/dist/components/surface/surface.guide.json +12 -4
  117. package/dist/components/surface/surface.js +26 -7
  118. package/dist/components/surface/surface.module.js +1 -4
  119. package/dist/components/switch/switch.css +1 -1
  120. package/dist/components/switch/switch.js +32 -30
  121. package/dist/components/switch/switch.module.js +4 -3
  122. package/dist/components/tabs/index.d.ts +6 -0
  123. package/dist/components/tabs/tabs-indicator.d.ts +9 -0
  124. package/dist/components/tabs/tabs-indicator.js +16 -0
  125. package/dist/components/tabs/tabs-list.d.ts +12 -0
  126. package/dist/components/tabs/tabs-list.js +29 -0
  127. package/dist/components/tabs/tabs-panel.d.ts +11 -0
  128. package/dist/components/tabs/tabs-panel.js +13 -0
  129. package/dist/components/tabs/tabs-tab.d.ts +24 -0
  130. package/dist/components/tabs/tabs-tab.js +24 -0
  131. package/dist/components/tabs/tabs-viewport.d.ts +8 -0
  132. package/dist/components/tabs/tabs-viewport.js +11 -0
  133. package/dist/components/tabs/tabs.css +1 -0
  134. package/dist/components/tabs/tabs.d.ts +31 -0
  135. package/dist/components/tabs/tabs.guide.json +23 -0
  136. package/dist/components/tabs/tabs.js +30 -0
  137. package/dist/components/tabs/tabs.module.js +11 -0
  138. package/dist/components/text/text.css +1 -1
  139. package/dist/components/text/text.d.ts +2 -2
  140. package/dist/components/text/text.js +3 -4
  141. package/dist/components/text/text.module.js +1 -1
  142. package/dist/components/textarea/textarea.css +1 -1
  143. package/dist/components/textarea/textarea.guide.json +8 -3
  144. package/dist/components/textarea/textarea.js +2 -4
  145. package/dist/components/textarea/textarea.module.js +4 -3
  146. package/dist/components/textfield/textfield.css +1 -1
  147. package/dist/components/textfield/textfield.guide.json +9 -3
  148. package/dist/components/textfield/textfield.js +2 -4
  149. package/dist/components/textfield/textfield.module.js +6 -5
  150. package/dist/components/title/title.css +1 -1
  151. package/dist/components/title/title.js +3 -4
  152. package/dist/components/title/title.module.js +1 -1
  153. package/dist/core/clsx.d.ts +1 -0
  154. package/dist/core/clsx.js +36 -0
  155. package/dist/core/elevation/get-elevation-props.js +2 -2
  156. package/dist/core/props/intrinsic-vira-props.d.ts +3 -3
  157. package/dist/index.js +10 -1
  158. package/dist/internal-icons/icon-registry.d.ts +4 -1
  159. package/dist/internal-icons/icon-registry.js +9 -0
  160. package/dist/internal-icons/icons/duo/ArrowDown.js +1 -1
  161. package/dist/internal-icons/icons/duo/ArrowDownLeft.js +1 -1
  162. package/dist/internal-icons/icons/duo/ArrowDownRight.js +1 -1
  163. package/dist/internal-icons/icons/duo/ArrowLeft.js +1 -1
  164. package/dist/internal-icons/icons/duo/ArrowRight.js +1 -1
  165. package/dist/internal-icons/icons/duo/ArrowUp.js +1 -1
  166. package/dist/internal-icons/icons/duo/ArrowUpLeft.js +1 -1
  167. package/dist/internal-icons/icons/duo/ArrowUpRight.js +1 -1
  168. package/dist/internal-icons/icons/duo/ChevronExpandY.js +2 -2
  169. package/dist/internal-icons/icons/duo/CircleCheck.d.ts +7 -0
  170. package/dist/internal-icons/icons/duo/CircleCheck.js +13 -0
  171. package/dist/internal-icons/icons/duo/Duplicate.d.ts +7 -0
  172. package/dist/internal-icons/icons/duo/Duplicate.js +13 -0
  173. package/dist/internal-icons/icons/duo/RefreshAnticlockwise.js +1 -1
  174. package/dist/internal-icons/icons/duo/ShieldCheck.d.ts +7 -0
  175. package/dist/internal-icons/icons/duo/ShieldCheck.js +13 -0
  176. package/dist/internal-icons/icons/duo/index.d.ts +3 -0
  177. package/dist/internal-icons/icons/duo/index.js +3 -0
  178. package/dist/preflight-surface.json +15 -1
  179. package/dist/preflight.css +1 -1
  180. package/dist/theme-surface.json +0 -5
  181. package/package.json +4 -7
@@ -1,75 +1,61 @@
1
- "use client";
2
1
  import './checkbox.css';
3
- import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
2
+ import { clsx } from "../../core/clsx.js";
4
3
  import { Stack } from "../stack/stack.js";
5
4
  import { FieldHelperCopy } from "../basic-input/field-helper-copy.js";
6
5
  import { FieldLabel } from "../basic-input/field-label.js";
7
6
  import checkbox_module_default from "./checkbox.module.js";
8
7
  import { Icon } from "../icon/icon.js";
9
- import { clsx } from "clsx";
10
8
  import { jsx, jsxs } from "react/jsx-runtime";
11
- import { Checkbox, Field } from "@base-ui/react";
9
+ import { Field } from "@base-ui/react/field";
10
+ import { Checkbox } from "@base-ui/react/checkbox";
12
11
  //#region src/components/checkbox/checkbox.tsx
13
- var Checkbox$1 = ({ className, description, dirty, disabled, error, invalid, label, name, ref, size = "small", vPadding, hPadding, touched, validate, validationDebounceTime, validationMode, ...checkboxRootProps }) => {
12
+ var Checkbox$1 = ({ className, description, disabled, error, label, ref, size = "small", vPadding, hPadding, value, ...checkboxRootProps }) => {
14
13
  const hasTextDescription = Boolean(description || error);
15
14
  const iconSize = size === "small" ? 12 : 16;
16
- const { componentProps, intrinsicAttributes } = extractIntrinsicViraProps(checkboxRootProps);
17
- return /* @__PURE__ */ jsx(Field.Root, {
18
- ...intrinsicAttributes,
15
+ return /* @__PURE__ */ jsx(Field.Item, {
19
16
  className: checkbox_module_default.Checkbox,
20
- dirty,
21
- disabled,
22
- invalid,
23
- name,
24
- touched,
25
- validate,
26
- validationDebounceTime,
27
- validationMode,
28
- render: /* @__PURE__ */ jsx(Stack, {
29
- direction: "row",
30
- columnGap: size === "small" ? "small" : "medium",
31
- fillChildren: false,
32
- vAlign: hasTextDescription ? "start" : "center"
33
- }),
34
- children: /* @__PURE__ */ jsx(Field.Label, { children: /* @__PURE__ */ jsxs(Stack, {
35
- direction: "row",
36
- columnGap: size === "small" ? "small" : "medium",
37
- fillChildren: false,
38
- vAlign: hasTextDescription ? "start" : "center",
39
- ...hPadding !== void 0 ? { hPadding } : {},
40
- ...vPadding !== void 0 ? { vPadding } : {},
41
- children: [/* @__PURE__ */ jsx(Checkbox.Root, {
42
- ...componentProps,
43
- className: clsx(checkbox_module_default.CheckboxRoot, className),
44
- "data-size": size,
45
- disabled,
46
- name,
47
- ref,
48
- children: /* @__PURE__ */ jsxs(Checkbox.Indicator, {
49
- className: checkbox_module_default.Indicator,
50
- children: [/* @__PURE__ */ jsx(Icon, {
51
- className: clsx(checkbox_module_default.Icon, checkbox_module_default.CheckIcon),
52
- name: "Check",
53
- size: iconSize
54
- }), /* @__PURE__ */ jsx(Icon, {
55
- className: clsx(checkbox_module_default.Icon, checkbox_module_default.MinusIcon),
56
- name: "Minus",
57
- size: iconSize
58
- })]
59
- })
60
- }), label || description || error ? /* @__PURE__ */ jsxs(Stack, {
61
- direction: "column",
17
+ children: /* @__PURE__ */ jsx(Field.Label, {
18
+ className: checkbox_module_default.Label,
19
+ children: /* @__PURE__ */ jsxs(Stack, {
20
+ direction: "row",
21
+ columnGap: size === "small" ? "small" : "medium",
62
22
  fillChildren: false,
63
- rowGap: size === "small" ? "2x-small" : "x-small",
64
- children: [label && /* @__PURE__ */ jsx(FieldLabel, {
65
- size: size === "small" ? "small" : "medium",
66
- children: label
67
- }), /* @__PURE__ */ jsx(FieldHelperCopy, {
68
- description,
69
- error
70
- })]
71
- }) : null]
72
- }) })
23
+ vAlign: hasTextDescription ? "start" : "center",
24
+ hPadding,
25
+ vPadding,
26
+ children: [/* @__PURE__ */ jsx(Checkbox.Root, {
27
+ ...checkboxRootProps,
28
+ className: clsx(checkbox_module_default.CheckboxRoot, className),
29
+ "data-size": size,
30
+ disabled,
31
+ ref,
32
+ value,
33
+ children: /* @__PURE__ */ jsxs(Checkbox.Indicator, {
34
+ className: checkbox_module_default.Indicator,
35
+ children: [/* @__PURE__ */ jsx(Icon, {
36
+ className: clsx(checkbox_module_default.Icon, checkbox_module_default.CheckIcon),
37
+ name: "Check",
38
+ size: iconSize
39
+ }), /* @__PURE__ */ jsx(Icon, {
40
+ className: clsx(checkbox_module_default.Icon, checkbox_module_default.MinusIcon),
41
+ name: "Minus",
42
+ size: iconSize
43
+ })]
44
+ })
45
+ }), label || description || error ? /* @__PURE__ */ jsxs(Stack, {
46
+ direction: "column",
47
+ fillChildren: false,
48
+ rowGap: "small",
49
+ children: [label ? /* @__PURE__ */ jsx(FieldLabel, {
50
+ size: size === "small" ? "small" : "medium",
51
+ children: label
52
+ }) : null, /* @__PURE__ */ jsx(FieldHelperCopy, {
53
+ description,
54
+ error
55
+ })]
56
+ }) : null]
57
+ })
58
+ })
73
59
  });
74
60
  };
75
61
  //#endregion
@@ -1,10 +1,11 @@
1
1
  var checkbox_module_default = {
2
- Checkbox: "checkbox-module_Checkbox_3oGip",
3
- CheckboxRoot: "checkbox-module_CheckboxRoot_PeyF5",
4
- Indicator: "checkbox-module_Indicator_C-k-l",
5
- Icon: "checkbox-module_Icon_926Sa",
6
- MinusIcon: "checkbox-module_MinusIcon_Q57pY",
7
- CheckIcon: "checkbox-module_CheckIcon_XqUcs"
2
+ Checkbox: "viraui__checkbox-module__Checkbox_3oGip",
3
+ Label: "viraui__checkbox-module__Label_n9HL7",
4
+ CheckboxRoot: "viraui__checkbox-module__CheckboxRoot_PeyF5",
5
+ Indicator: "viraui__checkbox-module__Indicator_C-k-l",
6
+ Icon: "viraui__checkbox-module__Icon_926Sa",
7
+ MinusIcon: "viraui__checkbox-module__MinusIcon_Q57pY",
8
+ CheckIcon: "viraui__checkbox-module__CheckIcon_XqUcs"
8
9
  };
9
10
  //#endregion
10
11
  export { checkbox_module_default as default };
@@ -1,2 +1,4 @@
1
1
  export { Checkbox } from './checkbox';
2
+ export { CheckboxGroup } from './checkbox-group';
2
3
  export type { CheckboxProps } from './checkbox';
4
+ export type { CheckboxGroupProps } from './checkbox-group';
@@ -1 +1 @@
1
- .chip-module_Chip_2D18T{--chip-background:var(--global-primary);--chip-border-color:transparent;--chip-color:contrast-color(var(--global-primary));--chip-height:var(--space-large);--chip-icon-size:0.9em;--chip-color-bg-opacity:13%;--chip-color-border-opacity:0%;min-block-size:var(--chip-height);block-size:var(--chip-height);border:1px solid var(--chip-border-color);border-radius:var(--radius-infinite);background:var(--chip-background);color:var(--chip-color);font-size:var(--font-scale-body-small);font-variation-settings:"wght" 400;text-decoration:none;white-space:nowrap;overflow:hidden;&[data-variant=primary]{--chip-background:var(--global-primary);--chip-color:contrast-color(var(--global-primary))}&[data-variant=secondary]{--chip-background:var(--global-contrast);--chip-color:var(--base-6)}&[data-variant=outline]{--chip-background:transparent;--chip-border-color:oklab(from var(--global-contrast) l a b/0.2);--chip-color:var(--base-6)}&[data-variant=gray]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-gray)}&[data-variant=slate]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-slate)}&[data-variant=yellow]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-yellow)}&[data-variant=green]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-green)}&[data-variant=blue]{--chip-color:var(--highlight-blue)}&[data-variant=blue],&[data-variant=red]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity))}&[data-variant=red]{--chip-color:var(--highlight-red)}&[data-variant=cyan]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-cyan)}&[data-variant=purple]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-purple)}&[data-variant=indigo]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-indigo)}&[data-variant=acid]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-acid)}&[data-variant=salmon]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-salmon)}&[data-variant=magenta]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-magenta)}}.chip-module_Content_7mLuL{min-inline-size:0;min-block-size:100%}.chip-module_IconSlot_9N5vD{display:inline-grid;place-items:center;flex-shrink:0;>svg{inline-size:var(--chip-icon-size);block-size:var(--chip-icon-size)}}.chip-module_Label_Hdx7l{display:inline-block;min-inline-size:0;overflow:hidden;text-overflow:ellipsis}
1
+ .viraui__chip-module__Chip_2D18T{--chip-background:var(--global-primary);--chip-border-color:transparent;--chip-color:contrast-color(var(--global-primary));--chip-height:var(--space-large);--chip-icon-size:0.9em;--chip-color-bg-opacity:13%;--chip-color-border-opacity:0%;min-block-size:var(--chip-height);block-size:var(--chip-height);border:1px solid var(--chip-border-color);border-radius:var(--radius-infinite);background:var(--chip-background);color:var(--chip-color);font-size:var(--font-scale-body-small);font-variation-settings:"wght" 400;text-decoration:none;white-space:nowrap;overflow:hidden;&[data-variant=primary]{--chip-background:var(--global-primary);--chip-color:contrast-color(var(--global-primary))}&[data-variant=secondary]{--chip-background:var(--global-contrast);--chip-color:var(--base-6)}&[data-variant=outline]{--chip-background:transparent;--chip-border-color:oklab(from var(--global-contrast) l a b/0.2);--chip-color:var(--base-6)}&[data-variant=gray]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-gray)}&[data-variant=slate]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-slate)}&[data-variant=yellow]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-yellow)}&[data-variant=green]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-green)}&[data-variant=blue]{--chip-color:var(--highlight-blue)}&[data-variant=blue],&[data-variant=red]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity))}&[data-variant=red]{--chip-color:var(--highlight-red)}&[data-variant=cyan]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-cyan)}&[data-variant=purple]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-purple)}&[data-variant=indigo]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-indigo)}&[data-variant=acid]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-acid)}&[data-variant=salmon]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-salmon)}&[data-variant=magenta]{--chip-background:oklab(from currentColor l a b/var(--chip-color-bg-opacity));--chip-border-color:oklab(from currentColor l a b/var(--chip-color-border-opacity));--chip-color:var(--highlight-magenta)}}.viraui__chip-module__Content_7mLuL{min-inline-size:0;min-block-size:100%}.viraui__chip-module__IconSlot_9N5vD{display:inline-grid;place-items:center;flex-shrink:0;>svg{inline-size:var(--chip-icon-size);block-size:var(--chip-icon-size)}}.viraui__chip-module__Label_Hdx7l{display:inline-block;min-inline-size:0;overflow:hidden;text-overflow:ellipsis}
@@ -1,9 +1,8 @@
1
- "use client";
2
1
  import './chip.css';
2
+ import { clsx } from "../../core/clsx.js";
3
3
  import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
4
4
  import { Stack } from "../stack/stack.js";
5
5
  import chip_module_default from "./chip.module.js";
6
- import { clsx } from "clsx";
7
6
  import { jsx, jsxs } from "react/jsx-runtime";
8
7
  import { useRender } from "@base-ui/react/use-render";
9
8
  import "react";
@@ -39,7 +38,6 @@ var Chip = ({ addon, addonPosition = "start", children, className, ref, render,
39
38
  children: content,
40
39
  className: clsx(chip_module_default.Chip, className),
41
40
  "data-has-icon": addon ? "true" : void 0,
42
- "data-icon-position": addon ? addonPosition : void 0,
43
41
  "data-variant": variant
44
42
  }
45
43
  });
@@ -1,8 +1,8 @@
1
1
  var chip_module_default = {
2
- Chip: "chip-module_Chip_2D18T",
3
- Content: "chip-module_Content_7mLuL",
4
- IconSlot: "chip-module_IconSlot_9N5vD",
5
- Label: "chip-module_Label_Hdx7l"
2
+ Chip: "viraui__chip-module__Chip_2D18T",
3
+ Content: "viraui__chip-module__Content_7mLuL",
4
+ IconSlot: "viraui__chip-module__IconSlot_9N5vD",
5
+ Label: "viraui__chip-module__Label_Hdx7l"
6
6
  };
7
7
  //#endregion
8
8
  export { chip_module_default as default };
@@ -1 +1 @@
1
- .clamp-text-module_ClampText_Whnkd{display:-webkit-box;-webkit-line-clamp:var(--clamp-text-rows,1);-webkit-box-orient:vertical;overflow:hidden;&[data-clamp-text-inline=true]{display:-webkit-inline-box}}
1
+ .viraui__clamp-text-module__ClampText_Whnkd{display:-webkit-box;-webkit-line-clamp:var(--clamp-text-rows,1);-webkit-box-orient:vertical;overflow:hidden;&[data-clamp-text-inline=true]{display:-webkit-inline-box}}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import './clamp-text.css';
3
+ import { clsx } from "../../core/clsx.js";
3
4
  import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
4
5
  import clamp_text_module_default from "./clamp-text.module.js";
5
- import { clsx } from "clsx";
6
6
  import { useRender } from "@base-ui/react/use-render";
7
7
  import { useMemo } from "react";
8
8
  //#region src/components/clamp-text/clamp-text.tsx
@@ -1,3 +1,3 @@
1
- var clamp_text_module_default = { ClampText: "clamp-text-module_ClampText_Whnkd" };
1
+ var clamp_text_module_default = { ClampText: "viraui__clamp-text-module__ClampText_Whnkd" };
2
2
  //#endregion
3
3
  export { clamp_text_module_default as default };
@@ -0,0 +1,15 @@
1
+ import { DrawerClose } from '@base-ui/react';
2
+ import type * as React from 'react';
3
+ /**
4
+ * Public Dialog.Close props.
5
+ *
6
+ * Pass-through to Base UI `Drawer.Close`. Use `render` for the visible control
7
+ * (`Button`, `IconButton`, or another element) and set `nativeButton` when the
8
+ * rendered root is not a native `<button>`.
9
+ *
10
+ * Compose inside `Dialog.Sheet` so the control closes the open drawer.
11
+ *
12
+ * @default Base UI pass-through props keep upstream defaults.
13
+ */
14
+ export type DialogCloseProps = DrawerClose.Props;
15
+ export declare const DialogClose: React.FC<DialogCloseProps>;
@@ -0,0 +1,9 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Drawer } from "@base-ui/react";
3
+ //#region src/components/dialog/dialog-close.tsx
4
+ var DialogClose = ({ ref, ...props }) => /* @__PURE__ */ jsx(Drawer.Close, {
5
+ ref,
6
+ ...props
7
+ });
8
+ //#endregion
9
+ export { DialogClose };
@@ -0,0 +1,66 @@
1
+ import { StackProps } from '..';
2
+ import type * as React from 'react';
3
+ /**
4
+ * Public Dialog.Sheet props.
5
+ *
6
+ * Renders the drawer portal, scrim, bottom `Surface` panel, title, description,
7
+ * and optional body content. Compose `Dialog.Close` inside `children` when a
8
+ * close control is needed.
9
+ *
10
+ * @default Base UI pass-through props keep upstream defaults.
11
+ */
12
+ export type DialogSheetProps = {
13
+ /**
14
+ * Accessible dialog title rendered as the modal heading.
15
+ */
16
+ title: React.ReactNode;
17
+ /**
18
+ * Supporting copy announced with the title.
19
+ *
20
+ * @default No description is rendered.
21
+ */
22
+ description?: React.ReactNode;
23
+ /**
24
+ * Optional body content rendered below the description.
25
+ *
26
+ * @default No extra body content is rendered.
27
+ */
28
+ children?: React.ReactNode;
29
+ /**
30
+ * Optional maximum width of the content area.
31
+ *
32
+ * @default `50ch`
33
+ */
34
+ maxContentWidth?: StackProps['maxWidth'];
35
+ /**
36
+ * Aligns the header content.
37
+ *
38
+ * @default `start`
39
+ */
40
+ headerAlign?: StackProps['hAlign'];
41
+ /**
42
+ * Whether to show the close button.
43
+ *
44
+ * @default false
45
+ */
46
+ showCloseButton?: boolean;
47
+ /**
48
+ * Centers the sheet horizontally within the viewport.
49
+ *
50
+ * @default false
51
+ */
52
+ fitContent?: boolean;
53
+ /**
54
+ * Whether to show the drag handle above the sheet header.
55
+ *
56
+ * @default true
57
+ */
58
+ showHandle?: boolean;
59
+ /**
60
+ * Maximum block size of the sheet panel.
61
+ *
62
+ * @default `97dvh`
63
+ */
64
+ maxHeight?: string;
65
+ };
66
+ export declare const DialogSheet: React.FC<DialogSheetProps>;
@@ -0,0 +1,80 @@
1
+ import { Stack } from "../stack/stack.js";
2
+ import dialog_module_default from "./dialog.module.js";
3
+ import { IconButton } from "../icon-button/icon-button.js";
4
+ import { Text } from "../text/text.js";
5
+ import { Icon } from "../icon/icon.js";
6
+ import { Surface } from "../surface/surface.js";
7
+ import { Title } from "../title/title.js";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Drawer } from "@base-ui/react";
10
+ //#region src/components/dialog/dialog-sheet.tsx
11
+ var DialogSheet = ({ children, description, title, showCloseButton = false, fitContent = false, showHandle = true, headerAlign = "start", maxContentWidth = "50ch", maxHeight = "97dvh" }) => /* @__PURE__ */ jsxs(Drawer.Portal, { children: [/* @__PURE__ */ jsx(Drawer.Backdrop, { className: dialog_module_default.Backdrop }), /* @__PURE__ */ jsx(Drawer.Viewport, {
12
+ render: /* @__PURE__ */ jsx(Stack, {
13
+ vAlign: "end",
14
+ hPadding: "small",
15
+ vPadding: "small",
16
+ fillChildren: false,
17
+ hAlign: fitContent ? "center" : void 0
18
+ }),
19
+ className: dialog_module_default.Viewport,
20
+ children: /* @__PURE__ */ jsxs(Drawer.Popup, {
21
+ className: dialog_module_default.Popup,
22
+ style: { "--dialog-max-block-size": maxHeight },
23
+ render: /* @__PURE__ */ jsx(Surface, {
24
+ border: "top",
25
+ render: /* @__PURE__ */ jsx(Stack, { hAlign: "center" }),
26
+ color: 1,
27
+ vibrant: true,
28
+ radius: "large",
29
+ vPadding: ["medium", 0]
30
+ }),
31
+ children: [showHandle && /* @__PURE__ */ jsxs(Stack, {
32
+ className: dialog_module_default.Handle,
33
+ inline: true,
34
+ direction: "row",
35
+ vPadding: [0, "medium"],
36
+ columnGap: "small",
37
+ children: [
38
+ /* @__PURE__ */ jsx("div", { className: dialog_module_default.HandleShape }),
39
+ /* @__PURE__ */ jsx("div", { className: dialog_module_default.HandleShape }),
40
+ /* @__PURE__ */ jsx("div", { className: dialog_module_default.HandleShape })
41
+ ]
42
+ }), /* @__PURE__ */ jsxs(Stack, {
43
+ maxWidth: maxContentWidth,
44
+ rowGap: "large",
45
+ className: dialog_module_default.Body,
46
+ children: [/* @__PURE__ */ jsxs(Stack, {
47
+ className: dialog_module_default.Header,
48
+ hAlign: headerAlign,
49
+ hPadding: "medium",
50
+ fillChildren: false,
51
+ children: [/* @__PURE__ */ jsx(Drawer.Title, {
52
+ render: /* @__PURE__ */ jsx(Title, { level: "h4" }),
53
+ children: title
54
+ }), description && /* @__PURE__ */ jsx(Drawer.Description, {
55
+ render: /* @__PURE__ */ jsx(Text, {
56
+ tone: "muted",
57
+ render: /* @__PURE__ */ jsx("p", {})
58
+ }),
59
+ children: description
60
+ })]
61
+ }), /* @__PURE__ */ jsxs(Drawer.Content, {
62
+ render: /* @__PURE__ */ jsx(Stack, {
63
+ vAlign: "start",
64
+ fillChildren: false,
65
+ className: dialog_module_default.Content
66
+ }),
67
+ children: [showCloseButton && /* @__PURE__ */ jsx(Drawer.Close, {
68
+ className: dialog_module_default.CloseButton,
69
+ render: /* @__PURE__ */ jsx(IconButton, {
70
+ "aria-label": "Close dialog",
71
+ icon: /* @__PURE__ */ jsx(Icon, { name: "Xmark" }),
72
+ variant: "flat"
73
+ })
74
+ }), children]
75
+ })]
76
+ })]
77
+ })
78
+ })] });
79
+ //#endregion
80
+ export { DialogSheet };
@@ -0,0 +1,13 @@
1
+ import { DrawerTrigger } from '@base-ui/react';
2
+ import type * as React from 'react';
3
+ /**
4
+ * Public Dialog.Trigger props.
5
+ *
6
+ * Pass-through to Base UI `Drawer.Trigger`. Use `render` for the visible control
7
+ * (`Button`, `IconButton`, or another element) and set `nativeButton` when the
8
+ * rendered root is not a native `<button>`.
9
+ *
10
+ * @default Base UI pass-through props keep upstream defaults.
11
+ */
12
+ export type DialogTriggerProps = DrawerTrigger.Props;
13
+ export declare const DialogTrigger: React.FC<DialogTriggerProps>;
@@ -0,0 +1,9 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Drawer } from "@base-ui/react";
3
+ //#region src/components/dialog/dialog-trigger.tsx
4
+ var DialogTrigger = ({ ref, ...props }) => /* @__PURE__ */ jsx(Drawer.Trigger, {
5
+ ref,
6
+ ...props
7
+ });
8
+ //#endregion
9
+ export { DialogTrigger };
@@ -0,0 +1 @@
1
+ .viraui__dialog-module__Backdrop_xgFhs{position:fixed;inset:0;z-index:0;transition:opacity var(--duration-fast) var(--easing-standard);backdrop-filter:brightness(90%) blur(5px);opacity:1;&[data-ending-style],&[data-starting-style]{opacity:0}&[data-swiping]{opacity:calc(1 - var(--drawer-swipe-progress, 0));transition-duration:0s}@media (prefers-reduced-motion:reduce){transition:none}}.viraui__dialog-module__Viewport_kmZN1{position:fixed;inset:0;z-index:4;pointer-events:none;touch-action:none}.viraui__dialog-module__Popup_5qIyj{--bleed:var(--space-wide);--peek:var(--space-medium);--stack-step:0.05;--stack-progress:clamp(0,var(--drawer-swipe-progress,0),1);--stack-peek-offset:max(0px,calc((var(--nested-drawers, 0) - var(--stack-progress)) * var(--peek)));--stack-scale-base:max(0,calc(1 - var(--nested-drawers, 0) * var(--stack-step)));--stack-scale:clamp(0,calc(var(--stack-scale-base) + var(--stack-step) * var(--stack-progress)),1);--stack-shrink:calc(1 - var(--stack-scale));--stack-height:max(0px,calc(var(--drawer-frontmost-height, var(--drawer-height, 0px)) - var(--bleed)));--translate-y:calc(var(--drawer-snap-point-offset, 0px) + var(--drawer-swipe-movement-y, 0px) - var(--stack-peek-offset) - var(--stack-shrink) * var(--stack-height));max-block-size:var(--dialog-max-block-size,97dvh);outline:none;pointer-events:auto;touch-action:none;height:var(--drawer-height,auto);transform-origin:50% calc(100% - var(--bleed));transition:opacity var(--duration-fast) var(--easing-entrance),transform var(--duration-fast) var(--easing-entrance),height var(--duration-fast) var(--easing-entrance);transform:translateY(var(--translate-y)) scale(var(--stack-scale));&[data-nested-drawer-open]{height:calc(var(--stack-height) + var(--bleed));overflow:hidden}&[data-starting-style]{opacity:0}&[data-ending-style][data-swipe-direction=down],&[data-starting-style]{transform:translateY(100%)}&[data-nested-drawer-swiping],&[data-swiping]{transition-duration:0s}@media (prefers-reduced-motion:reduce){transition:none;&[data-ending-style][data-swipe-direction=down],&[data-starting-style]{opacity:1;transform:translateY(0)}}}.viraui__dialog-module__Handle_nd9SN{margin:0 auto}.viraui__dialog-module__HandleShape_mEg8R{inline-size:var(--space-x-small);block-size:var(--space-x-small);background-color:var(--global-contrast);border-radius:var(--radius-infinite)}.viraui__dialog-module__Header_WnBly{flex-shrink:0;touch-action:none;-webkit-user-select:none;user-select:none}.viraui__dialog-module__Body_9-UgN{min-block-size:0}.viraui__dialog-module__Content_r8lJc{min-block-size:0;overflow:auto;overscroll-behavior:contain;touch-action:auto;padding-block-end:calc(env(safe-area-inset-bottom) + var(--space-medium));transition:opacity var(--duration-fast) var(--easing-standard);@media (prefers-reduced-motion:reduce){transition:none}.viraui__dialog-module__Popup_5qIyj[data-nested-drawer-open] &{opacity:0}.viraui__dialog-module__Popup_5qIyj[data-nested-drawer-open][data-nested-drawer-swiping] &{opacity:1}}.viraui__dialog-module__CloseButton_U-B1r.viraui__dialog-module__CloseButton_U-B1r{position:absolute;top:1rem;right:1rem}
@@ -0,0 +1,21 @@
1
+ import { DrawerRoot } from '@base-ui/react';
2
+ import { DialogCloseProps } from './dialog-close';
3
+ import { DialogSheetProps } from './dialog-sheet';
4
+ import { DialogTriggerProps } from './dialog-trigger';
5
+ import type * as React from 'react';
6
+ /**
7
+ * Public Dialog root props.
8
+ *
9
+ * Groups `Dialog.Trigger`, `Dialog.Sheet`, and `Dialog.Close` under a Base UI `Drawer.Root`.
10
+ *
11
+ * @default Base UI pass-through props keep upstream defaults.
12
+ */
13
+ export type DialogProps = DrawerRoot.Props;
14
+ export type DialogSnapPoint = DrawerRoot.SnapPoint;
15
+ type DialogComponent = React.FC<DialogProps> & {
16
+ Trigger: React.FC<DialogTriggerProps>;
17
+ Sheet: React.FC<DialogSheetProps>;
18
+ Close: React.FC<DialogCloseProps>;
19
+ };
20
+ export declare const Dialog: DialogComponent;
21
+ export {};
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "Dialog",
3
+ "summary": "Compound drawer sheet with `Dialog.Trigger`, `Dialog.Sheet`, and `Dialog.Close`, Surface panel, scrim backdrop, title, description, and swipe-to-dismiss.",
4
+ "whenToUse": [
5
+ "Focused tasks or confirmations that interrupt the current page without navigation",
6
+ "Short forms or read-only content that needs a modal layer above the app",
7
+ "Bottom sheets where swipe dismissal or snap points are useful (pass `snapPoints`, `snapPoint`/`onSnapPointChange`, or `defaultSnapPoint` directly on `Dialog`)",
8
+ "Drill-down sheet flows (for example settings sub-pages) by nesting a `Dialog` inside `Dialog.Sheet` children"
9
+ ],
10
+ "whenNotToUse": [
11
+ "Small anchored hints or quick actions that should use Popover or Menu",
12
+ "Highly custom sheet anatomy that needs primitive-level composition",
13
+ "Centered modal layouts that should not slide from the screen edge"
14
+ ],
15
+ "accessibility": [
16
+ "Always pass `title`; add `description` when the heading alone is not enough context",
17
+ "Compose `Dialog.Close` with an accessible name when a visible close control is needed",
18
+ "Use `Dialog.Close` for footer actions that should dismiss the sheet"
19
+ ],
20
+ "antiPatterns": [
21
+ "Opening a sheet without `title` copy for assistive technologies",
22
+ "Relying only on backdrop press or swipe when a footer action is the primary close path",
23
+ "Using Dialog when a centered non-gesture modal is enough and a future Dialog primitive is available"
24
+ ],
25
+ "related": ["Surface", "Button", "IconButton", "Stack", "Elevator"]
26
+ }
@@ -0,0 +1,18 @@
1
+ import './dialog.css';
2
+ import { DialogClose } from "./dialog-close.js";
3
+ import { DialogSheet } from "./dialog-sheet.js";
4
+ import { DialogTrigger } from "./dialog-trigger.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { Drawer } from "@base-ui/react";
7
+ //#region src/components/dialog/dialog.tsx
8
+ var DialogRootComponent = ({ children, ...props }) => /* @__PURE__ */ jsx(Drawer.Root, {
9
+ ...props,
10
+ children
11
+ });
12
+ var Dialog = Object.assign(DialogRootComponent, {
13
+ Trigger: DialogTrigger,
14
+ Sheet: DialogSheet,
15
+ Close: DialogClose
16
+ });
17
+ //#endregion
18
+ export { Dialog };
@@ -0,0 +1,13 @@
1
+ var dialog_module_default = {
2
+ Backdrop: "viraui__dialog-module__Backdrop_xgFhs",
3
+ Viewport: "viraui__dialog-module__Viewport_kmZN1",
4
+ Popup: "viraui__dialog-module__Popup_5qIyj",
5
+ Handle: "viraui__dialog-module__Handle_nd9SN",
6
+ HandleShape: "viraui__dialog-module__HandleShape_mEg8R",
7
+ Header: "viraui__dialog-module__Header_WnBly",
8
+ Body: "viraui__dialog-module__Body_9-UgN",
9
+ Content: "viraui__dialog-module__Content_r8lJc",
10
+ CloseButton: "viraui__dialog-module__CloseButton_U-B1r"
11
+ };
12
+ //#endregion
13
+ export { dialog_module_default as default };
@@ -0,0 +1,8 @@
1
+ export { Dialog } from './dialog';
2
+ export type { DialogProps, DialogSnapPoint } from './dialog';
3
+ export { DialogClose } from './dialog-close';
4
+ export type { DialogCloseProps } from './dialog-close';
5
+ export { DialogSheet } from './dialog-sheet';
6
+ export type { DialogSheetProps } from './dialog-sheet';
7
+ export { DialogTrigger } from './dialog-trigger';
8
+ export type { DialogTriggerProps } from './dialog-trigger';
@@ -11,10 +11,10 @@ var Elevator = ({ children, resting, hover, direction, shadowColor, extraShadow,
11
11
  const { intrinsicAttributes } = extractIntrinsicViraProps(otherProps);
12
12
  const elevation = getElevationProps({
13
13
  resting,
14
- ...hover !== void 0 ? { hover } : {},
15
- ...direction !== void 0 ? { direction } : {},
16
- ...shadowColor !== void 0 ? { shadowColor } : {},
17
- ...extraShadow !== void 0 ? { extraShadow } : {}
14
+ hover,
15
+ direction,
16
+ shadowColor,
17
+ extraShadow
18
18
  });
19
19
  return Children.map(children, (child) => {
20
20
  if (!isValidElement(child)) return child;
@@ -0,0 +1,35 @@
1
+ import { FieldsetRoot } from '@base-ui/react';
2
+ import { IntrinsicViraProps } from '../../core/props/intrinsic-vira-props';
3
+ import type * as React from 'react';
4
+ /**
5
+ * Public Fieldset props.
6
+ *
7
+ * Thin wrapper around Base UI `Fieldset.Root` and `Fieldset.Legend` with shared Vira
8
+ * legend typography and optional group helper copy. Pass `render` to merge the fieldset
9
+ * root with `RadioGroup`, `CheckboxGroup`, or another compatible root.
10
+ *
11
+ * @default Base UI pass-through props keep upstream defaults.
12
+ */
13
+ export type FieldsetProps = FieldsetRoot.Props & IntrinsicViraProps & {
14
+ /**
15
+ * Visible legend copy rendered with shared internal `FieldLabel`.
16
+ *
17
+ * @default No legend is rendered.
18
+ */
19
+ label?: React.ReactNode;
20
+ /**
21
+ * Group helper copy rendered below the legend while valid.
22
+ * Requires a `Field.Root` ancestor for `FieldHelperCopy`.
23
+ *
24
+ * @default No description is rendered.
25
+ */
26
+ description?: React.ReactNode;
27
+ /**
28
+ * Group error copy rendered below the legend when invalid.
29
+ * Requires a `Field.Root` ancestor.
30
+ *
31
+ * @default No static error copy is rendered.
32
+ */
33
+ error?: React.ReactNode;
34
+ };
35
+ export declare const Fieldset: React.FC<FieldsetProps>;
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "Fieldset",
3
+ "summary": "Semantic field grouping with shared legend and optional group helper copy.",
4
+ "whenToUse": [
5
+ "Section legends for multiple related fields — billing details with Textfield, Textarea, or Select children",
6
+ "Choice groups that need a shared legend, group description, or group error — Field.Root > Fieldset render={<RadioGroup<Value> />} or render={<CheckboxGroup />}",
7
+ "Group validation and helper copy that require a Field.Root ancestor plus Fieldset description or error",
8
+ "Type-safe radio unions via RadioGroup<'ssd' | 'hdd'> merged through Fieldset render",
9
+ "Visual section chrome (legend + bordered content) for a form block"
10
+ ],
11
+ "whenNotToUse": [
12
+ "Every RadioGroup or CheckboxGroup by default — Fieldset is optional when options already have labels and no group copy is needed",
13
+ "Single Textfield, Textarea, Select, Radio, or Checkbox that already exposes its own label",
14
+ "Standalone RadioGroup or CheckboxGroup inside Field.Root with no shared legend — primitives are enough",
15
+ "Group legend, description, or validation on RadioGroup or CheckboxGroup props — those belong on Fieldset (with Field.Root when validating)"
16
+ ],
17
+ "accessibility": [
18
+ "Map visible label to Fieldset.Legend so grouped controls share an accessible section name",
19
+ "Keep group invalid state on Field.Root and surface group error copy through Fieldset error",
20
+ "Pass disabled to Fieldset.Root when the whole section should ignore interaction"
21
+ ],
22
+ "antiPatterns": [
23
+ "Wrapping Fieldset.Root in Stack render — breaks Base UI render merge with RadioGroup or CheckboxGroup",
24
+ "Expecting description or error on Fieldset without a Field.Root ancestor",
25
+ "Omitting RadioGroup<Value> generics when option values are a restricted union"
26
+ ],
27
+ "related": ["RadioGroup", "CheckboxGroup", "Textfield", "Textarea", "Select", "Stack"]
28
+ }
@@ -0,0 +1,30 @@
1
+ import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
2
+ import { Stack } from "../stack/stack.js";
3
+ import { FieldHelperCopy } from "../basic-input/field-helper-copy.js";
4
+ import { FieldLabel } from "../basic-input/field-label.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Fieldset } from "@base-ui/react";
7
+ //#region src/components/fieldset/fieldset.tsx
8
+ var Fieldset$1 = ({ children, className, description, disabled, error, label, render, ...fieldsetRootProps }) => {
9
+ const { componentProps, intrinsicAttributes } = extractIntrinsicViraProps(fieldsetRootProps);
10
+ return /* @__PURE__ */ jsxs(Fieldset.Root, {
11
+ ...intrinsicAttributes,
12
+ ...componentProps,
13
+ className,
14
+ disabled,
15
+ render,
16
+ children: [/* @__PURE__ */ jsxs(Stack, {
17
+ vPadding: [0, "small"],
18
+ rowGap: "small",
19
+ children: [label ? /* @__PURE__ */ jsx(Fieldset.Legend, {
20
+ render: /* @__PURE__ */ jsx(FieldLabel, {}),
21
+ children: label
22
+ }) : null, description || error ? /* @__PURE__ */ jsx(FieldHelperCopy, {
23
+ description,
24
+ error
25
+ }) : null]
26
+ }), children]
27
+ });
28
+ };
29
+ //#endregion
30
+ export { Fieldset$1 as Fieldset };
@@ -0,0 +1,2 @@
1
+ export { Fieldset } from './fieldset';
2
+ export type { FieldsetProps } from './fieldset';