@viraui/react 0.0.22 → 0.0.24

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 (175) hide show
  1. package/dist/catalog.json +26 -2
  2. package/dist/components/avatar/avatar.css +1 -1
  3. package/dist/components/avatar/avatar.module.js +3 -3
  4. package/dist/components/avatar-group/avatar-group.css +1 -1
  5. package/dist/components/avatar-group/avatar-group.module.js +5 -5
  6. package/dist/components/basic-input/basic-input.css +1 -1
  7. package/dist/components/basic-input/basic-input.js +0 -1
  8. package/dist/components/basic-input/basic-input.module.js +1 -1
  9. package/dist/components/basic-input/field-helper-copy.d.ts +1 -1
  10. package/dist/components/basic-input/field-helper-copy.js +0 -1
  11. package/dist/components/basic-input/field-label.css +1 -1
  12. package/dist/components/basic-input/field-label.js +0 -1
  13. package/dist/components/basic-input/field-label.module.js +1 -1
  14. package/dist/components/basic-input/input-control-group.js +0 -1
  15. package/dist/components/button/button.css +1 -1
  16. package/dist/components/button/button.d.ts +13 -7
  17. package/dist/components/button/button.guide.json +7 -5
  18. package/dist/components/button/button.js +11 -10
  19. package/dist/components/button/button.module.js +3 -3
  20. package/dist/components/checkbox/checkbox-group.d.ts +12 -0
  21. package/dist/components/checkbox/checkbox-group.js +15 -0
  22. package/dist/components/checkbox/checkbox.css +1 -1
  23. package/dist/components/checkbox/checkbox.d.ts +6 -21
  24. package/dist/components/checkbox/checkbox.guide.json +10 -5
  25. package/dist/components/checkbox/checkbox.js +45 -59
  26. package/dist/components/checkbox/checkbox.module.js +7 -6
  27. package/dist/components/checkbox/index.d.ts +2 -0
  28. package/dist/components/chip/chip.css +1 -1
  29. package/dist/components/chip/chip.js +0 -2
  30. package/dist/components/chip/chip.module.js +4 -4
  31. package/dist/components/clamp-text/clamp-text.css +1 -1
  32. package/dist/components/clamp-text/clamp-text.module.js +1 -1
  33. package/dist/components/dialog/dialog-close.d.ts +15 -0
  34. package/dist/components/dialog/dialog-close.js +9 -0
  35. package/dist/components/dialog/dialog-indent-background.d.ts +12 -0
  36. package/dist/components/dialog/dialog-indent-background.js +11 -0
  37. package/dist/components/dialog/dialog-indent.d.ts +12 -0
  38. package/dist/components/dialog/dialog-indent.js +11 -0
  39. package/dist/components/dialog/dialog-sheet.d.ts +66 -0
  40. package/dist/components/dialog/dialog-sheet.js +80 -0
  41. package/dist/components/dialog/dialog-trigger.d.ts +13 -0
  42. package/dist/components/dialog/dialog-trigger.js +9 -0
  43. package/dist/components/dialog/dialog.css +1 -0
  44. package/dist/components/dialog/dialog.d.ts +28 -0
  45. package/dist/components/dialog/dialog.guide.json +27 -0
  46. package/dist/components/dialog/dialog.js +23 -0
  47. package/dist/components/dialog/dialog.module.js +15 -0
  48. package/dist/components/dialog/index.d.ts +12 -0
  49. package/dist/components/elevator/elevator.js +4 -4
  50. package/dist/components/fieldset/fieldset.d.ts +35 -0
  51. package/dist/components/fieldset/fieldset.guide.json +28 -0
  52. package/dist/components/fieldset/fieldset.js +30 -0
  53. package/dist/components/fieldset/index.d.ts +2 -0
  54. package/dist/components/icon/icon.css +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 +4 -0
  60. package/dist/components/linear-progress/linear-progress.css +1 -1
  61. package/dist/components/linear-progress/linear-progress.js +0 -1
  62. package/dist/components/linear-progress/linear-progress.module.js +4 -4
  63. package/dist/components/masonry/masonry-item.js +0 -1
  64. package/dist/components/masonry/masonry.css +1 -1
  65. package/dist/components/masonry/masonry.js +2 -3
  66. package/dist/components/masonry/masonry.module.js +2 -2
  67. package/dist/components/progressive-blur/progressive-blur.css +1 -1
  68. package/dist/components/progressive-blur/progressive-blur.module.js +2 -2
  69. package/dist/components/radio/radio-group.d.ts +5 -38
  70. package/dist/components/radio/radio-group.js +12 -50
  71. package/dist/components/radio/radio.css +1 -1
  72. package/dist/components/radio/radio.d.ts +1 -1
  73. package/dist/components/radio/radio.guide.json +12 -8
  74. package/dist/components/radio/radio.js +31 -29
  75. package/dist/components/radio/radio.module.js +3 -5
  76. package/dist/components/select/select-group.js +1 -1
  77. package/dist/components/select/select-indicator-slot.js +0 -1
  78. package/dist/components/select/select-option.d.ts +9 -2
  79. package/dist/components/select/select-option.js +32 -31
  80. package/dist/components/select/select-separator.js +0 -1
  81. package/dist/components/select/select.css +1 -1
  82. package/dist/components/select/select.guide.json +8 -3
  83. package/dist/components/select/select.js +3 -2
  84. package/dist/components/select/select.module.js +17 -16
  85. package/dist/components/separator/index.d.ts +2 -0
  86. package/dist/components/separator/separator.css +1 -0
  87. package/dist/components/separator/separator.d.ts +54 -0
  88. package/dist/components/separator/separator.guide.json +24 -0
  89. package/dist/components/separator/separator.js +43 -0
  90. package/dist/components/separator/separator.module.js +3 -0
  91. package/dist/components/skeleton/skeleton.css +1 -1
  92. package/dist/components/skeleton/skeleton.module.js +2 -2
  93. package/dist/components/slider/slider-control.js +0 -1
  94. package/dist/components/slider/slider.css +1 -1
  95. package/dist/components/slider/slider.js +1 -3
  96. package/dist/components/slider/slider.module.js +9 -8
  97. package/dist/components/spinner/spinner.css +1 -1
  98. package/dist/components/spinner/spinner.js +2 -2
  99. package/dist/components/spinner/spinner.module.js +3 -3
  100. package/dist/components/stack/stack.css +1 -1
  101. package/dist/components/stack/stack.d.ts +2 -2
  102. package/dist/components/stack/stack.js +0 -1
  103. package/dist/components/stack/stack.module.js +1 -1
  104. package/dist/components/static-noise/static-noise.css +1 -1
  105. package/dist/components/static-noise/static-noise.d.ts +1 -1
  106. package/dist/components/static-noise/static-noise.js +2 -1
  107. package/dist/components/static-noise/static-noise.module.js +2 -2
  108. package/dist/components/surface/surface-radius-context.d.ts +9 -1
  109. package/dist/components/surface/surface-radius-context.js +17 -6
  110. package/dist/components/surface/surface.css +1 -1
  111. package/dist/components/surface/surface.d.ts +9 -3
  112. package/dist/components/surface/surface.guide.json +3 -1
  113. package/dist/components/surface/surface.js +3 -3
  114. package/dist/components/surface/surface.module.js +1 -4
  115. package/dist/components/switch/switch.css +1 -1
  116. package/dist/components/switch/switch.js +31 -29
  117. package/dist/components/switch/switch.module.js +4 -3
  118. package/dist/components/tabs/index.d.ts +6 -0
  119. package/dist/components/tabs/tabs-indicator.d.ts +9 -0
  120. package/dist/components/tabs/tabs-indicator.js +16 -0
  121. package/dist/components/tabs/tabs-list.d.ts +12 -0
  122. package/dist/components/tabs/tabs-list.js +29 -0
  123. package/dist/components/tabs/tabs-panel.d.ts +11 -0
  124. package/dist/components/tabs/tabs-panel.js +13 -0
  125. package/dist/components/tabs/tabs-tab.d.ts +24 -0
  126. package/dist/components/tabs/tabs-tab.js +24 -0
  127. package/dist/components/tabs/tabs-viewport.d.ts +8 -0
  128. package/dist/components/tabs/tabs-viewport.js +11 -0
  129. package/dist/components/tabs/tabs.css +1 -0
  130. package/dist/components/tabs/tabs.d.ts +31 -0
  131. package/dist/components/tabs/tabs.guide.json +23 -0
  132. package/dist/components/tabs/tabs.js +30 -0
  133. package/dist/components/tabs/tabs.module.js +11 -0
  134. package/dist/components/text/text.css +1 -1
  135. package/dist/components/text/text.d.ts +2 -2
  136. package/dist/components/text/text.js +2 -3
  137. package/dist/components/text/text.module.js +1 -1
  138. package/dist/components/textarea/textarea.css +1 -1
  139. package/dist/components/textarea/textarea.guide.json +8 -3
  140. package/dist/components/textarea/textarea.js +1 -3
  141. package/dist/components/textarea/textarea.module.js +4 -3
  142. package/dist/components/textfield/textfield.css +1 -1
  143. package/dist/components/textfield/textfield.guide.json +9 -3
  144. package/dist/components/textfield/textfield.js +1 -3
  145. package/dist/components/textfield/textfield.module.js +6 -5
  146. package/dist/components/title/title.css +1 -1
  147. package/dist/components/title/title.js +2 -3
  148. package/dist/components/title/title.module.js +1 -1
  149. package/dist/core/elevation/get-elevation-props.js +2 -2
  150. package/dist/core/props/intrinsic-vira-props.d.ts +3 -3
  151. package/dist/index.js +11 -1
  152. package/dist/internal-icons/icon-registry.d.ts +4 -1
  153. package/dist/internal-icons/icon-registry.js +9 -0
  154. package/dist/internal-icons/icons/duo/ArrowDown.js +1 -1
  155. package/dist/internal-icons/icons/duo/ArrowDownLeft.js +1 -1
  156. package/dist/internal-icons/icons/duo/ArrowDownRight.js +1 -1
  157. package/dist/internal-icons/icons/duo/ArrowLeft.js +1 -1
  158. package/dist/internal-icons/icons/duo/ArrowRight.js +1 -1
  159. package/dist/internal-icons/icons/duo/ArrowUp.js +1 -1
  160. package/dist/internal-icons/icons/duo/ArrowUpLeft.js +1 -1
  161. package/dist/internal-icons/icons/duo/ArrowUpRight.js +1 -1
  162. package/dist/internal-icons/icons/duo/ChevronExpandY.js +2 -2
  163. package/dist/internal-icons/icons/duo/CircleCheck.d.ts +7 -0
  164. package/dist/internal-icons/icons/duo/CircleCheck.js +13 -0
  165. package/dist/internal-icons/icons/duo/Duplicate.d.ts +7 -0
  166. package/dist/internal-icons/icons/duo/Duplicate.js +13 -0
  167. package/dist/internal-icons/icons/duo/RefreshAnticlockwise.js +1 -1
  168. package/dist/internal-icons/icons/duo/ShieldCheck.d.ts +7 -0
  169. package/dist/internal-icons/icons/duo/ShieldCheck.js +13 -0
  170. package/dist/internal-icons/icons/duo/index.d.ts +3 -0
  171. package/dist/internal-icons/icons/duo/index.js +3 -0
  172. package/dist/preflight-surface.json +15 -1
  173. package/dist/preflight.css +1 -1
  174. package/dist/theme-surface.json +0 -5
  175. package/package.json +4 -4
package/dist/catalog.json CHANGED
@@ -20,6 +20,12 @@
20
20
  "summary": "Compact visual label primitive for short status, category, or metadata treatments.",
21
21
  "guidePath": "./components/chip/chip.guide.json"
22
22
  },
23
+ {
24
+ "id": "dialog",
25
+ "name": "Dialog",
26
+ "summary": "Compound drawer sheet with `Dialog.Trigger`, `Dialog.Sheet`, `Dialog.Close`, and Base UI pass-through `Dialog.Provider`, `Dialog.Indent`, and `Dialog.IndentBackground` for app-shell indent effects.",
27
+ "guidePath": "./components/dialog/dialog.guide.json"
28
+ },
23
29
  {
24
30
  "id": "clamp-text",
25
31
  "name": "ClampText",
@@ -35,7 +41,7 @@
35
41
  {
36
42
  "id": "button",
37
43
  "name": "Button",
38
- "summary": "Primary action control with size, variant, optional icon, and loading state.",
44
+ "summary": "Primary action control with size, variant, optional addon, optional pill shape, and loading state.",
39
45
  "guidePath": "./components/button/button.guide.json"
40
46
  },
41
47
  {
@@ -83,9 +89,15 @@
83
89
  {
84
90
  "id": "checkbox",
85
91
  "name": "Checkbox",
86
- "summary": "Field-wrapped checkbox control with optional field copy.",
92
+ "summary": "Field.Item checkbox option for standalone fields or CheckboxGroup children.",
87
93
  "guidePath": "./components/checkbox/checkbox.guide.json"
88
94
  },
95
+ {
96
+ "id": "fieldset",
97
+ "name": "Fieldset",
98
+ "summary": "Semantic field grouping with shared legend and optional group helper copy.",
99
+ "guidePath": "./components/fieldset/fieldset.guide.json"
100
+ },
89
101
  {
90
102
  "id": "radio",
91
103
  "name": "Radio",
@@ -98,6 +110,12 @@
98
110
  "summary": "Field-wrapped single-select dropdown with grouped options and field copy.",
99
111
  "guidePath": "./components/select/select.guide.json"
100
112
  },
113
+ {
114
+ "id": "separator",
115
+ "name": "Separator",
116
+ "summary": "Thematic or content divider with horizontal or vertical orientation, token padding, and preset line thickness.",
117
+ "guidePath": "./components/separator/separator.guide.json"
118
+ },
101
119
  {
102
120
  "id": "icon",
103
121
  "name": "Icon",
@@ -122,6 +140,12 @@
122
140
  "summary": "Presentational container with token background, optional border, radius, and padding; nested surfaces use radius=\"auto\" for concentric corners.",
123
141
  "guidePath": "./components/surface/surface.guide.json"
124
142
  },
143
+ {
144
+ "id": "tabs",
145
+ "name": "Tabs",
146
+ "summary": "Compound segmented tab control with Surface list chrome, moving indicator, and animated panels.",
147
+ "guidePath": "./components/tabs/tabs.guide.json"
148
+ },
125
149
  {
126
150
  "id": "spinner",
127
151
  "name": "Spinner",
@@ -1 +1 @@
1
- .avatar-module_Avatar_BRuS3{--avatar-size:var(--space-2x-large);--avatar-background:var(--global-contrast);--avatar-foreground:var(--global-foreground);--avatar-radius:var(--radius-infinite);display:inline-flex;align-items:center;justify-content:center;inline-size:var(--avatar-size);block-size:var(--avatar-size);min-inline-size:var(--avatar-size);min-block-size:var(--avatar-size);overflow:hidden;border-radius:var(--avatar-radius);background:var(--avatar-background);color:var(--avatar-foreground);vertical-align:middle;-webkit-user-select:none;user-select:none;container-name:viraui-avatar;container-type:inline-size;&[data-size=x-small]{--avatar-size:var(--space-large)}&[data-size=small]{--avatar-size:var(--space-2x-large)}&[data-size=regular]{--avatar-size:var(--space-wide)}&[data-size=big]{--avatar-size:var(--space-2x-wide)}}.avatar-module_Image_Q7bHi{inline-size:100%;block-size:100%;display:block;object-fit:cover}.avatar-module_Label_QASTF{font-size:30cqw}
1
+ .viraui__avatar-module__Avatar_BRuS3{--avatar-size:var(--space-2x-large);--avatar-background:var(--global-contrast);--avatar-foreground:var(--global-foreground);--avatar-radius:var(--radius-infinite);display:inline-flex;align-items:center;justify-content:center;inline-size:var(--avatar-size);block-size:var(--avatar-size);min-inline-size:var(--avatar-size);min-block-size:var(--avatar-size);overflow:hidden;border-radius:var(--avatar-radius);background:var(--avatar-background);color:var(--avatar-foreground);vertical-align:middle;-webkit-user-select:none;user-select:none;container-name:viraui-avatar;container-type:inline-size;&[data-size=x-small]{--avatar-size:var(--space-large)}&[data-size=small]{--avatar-size:var(--space-2x-large)}&[data-size=regular]{--avatar-size:var(--space-wide)}&[data-size=big]{--avatar-size:var(--space-2x-wide)}}.viraui__avatar-module__Image_Q7bHi{inline-size:100%;block-size:100%;display:block;object-fit:cover}.viraui__avatar-module__Label_QASTF{font-size:30cqw}
@@ -1,7 +1,7 @@
1
1
  var avatar_module_default = {
2
- Avatar: "avatar-module_Avatar_BRuS3",
3
- Image: "avatar-module_Image_Q7bHi",
4
- Label: "avatar-module_Label_QASTF"
2
+ Avatar: "viraui__avatar-module__Avatar_BRuS3",
3
+ Image: "viraui__avatar-module__Image_Q7bHi",
4
+ Label: "viraui__avatar-module__Label_QASTF"
5
5
  };
6
6
  //#endregion
7
7
  export { avatar_module_default as default };
@@ -1 +1 @@
1
- .avatar-group-module_AvatarGroup_zOrR-{--avatar-size:var(--space-2x-large);--avatar-overlap-distance:var(--space-medium);--avatar-group-gap-size:var(--space-x-small);--avatar-mask-anti-alias-size:0.5px;--avatar-mask-radius:calc((var(--avatar-size) / 2) + var(--avatar-group-gap-size));display:inline-flex;flex-wrap:nowrap;align-items:flex-start;min-inline-size:max-content;vertical-align:middle;&[data-direction=horizontal]{flex-direction:row}&[data-direction=vertical]{flex-direction:column}&[data-size=x-small]{--avatar-size:var(--space-large);--avatar-overlap-distance:var(--space-x-small)}&[data-size=small]{--avatar-size:var(--space-2x-large);--avatar-overlap-distance:var(--space-small)}&[data-size=regular]{--avatar-size:var(--space-wide);--avatar-overlap-distance:var(--space-medium)}&[data-size=big]{--avatar-size:var(--space-2x-wide);--avatar-overlap-distance:var(--space-large)}}.avatar-group-module_AvatarWrapper_0opqY{position:relative;display:inline-flex;flex:0 0 auto;inline-size:var(--avatar-size);block-size:var(--avatar-size);.avatar-group-module_AvatarGroup_zOrR-[data-direction=horizontal] &:not(:first-child){margin-inline-start:calc(var(--avatar-overlap-distance) * -1)}.avatar-group-module_AvatarGroup_zOrR-[data-direction=vertical] &:not(:first-child){margin-block-start:calc(var(--avatar-overlap-distance) * -1)}.avatar-group-module_AvatarGroup_zOrR-:dir(ltr)[data-direction=horizontal] &:not(:last-child){mask-image:radial-gradient(circle var(--avatar-mask-radius) at calc(100% + (var(--avatar-size) / 2) - var(--avatar-overlap-distance)) 50%,transparent calc(var(--avatar-mask-radius) - var(--avatar-mask-anti-alias-size)),#000 calc(var(--avatar-mask-radius) + var(--avatar-mask-anti-alias-size)))}.avatar-group-module_AvatarGroup_zOrR-:dir(rtl)[data-direction=horizontal] &:not(:last-child){mask-image:radial-gradient(circle var(--avatar-mask-radius) at calc((var(--avatar-size) / 2) - var(--avatar-overlap-distance)) 50%,transparent calc(var(--avatar-mask-radius) - var(--avatar-mask-anti-alias-size)),#000 calc(var(--avatar-mask-radius) + var(--avatar-mask-anti-alias-size)))}.avatar-group-module_AvatarGroup_zOrR-[data-direction=vertical] &:not(:last-child){mask-image:radial-gradient(circle var(--avatar-mask-radius) at 50% calc(100% + (var(--avatar-size) / 2) - var(--avatar-overlap-distance)),transparent calc(var(--avatar-mask-radius) - var(--avatar-mask-anti-alias-size)),#000 calc(var(--avatar-mask-radius) + var(--avatar-mask-anti-alias-size)))}}.avatar-group-module_OverflowWrapper_bKv6I{inline-size:auto;min-inline-size:var(--avatar-size)}.avatar-group-module_AvatarGroupItem_Vvlyh{--avatar-radius:100%;corner-shape:unset}.avatar-group-module_OverflowPill_nMmTD{display:inline-flex;align-items:center;justify-content:center;min-inline-size:var(--avatar-size);block-size:var(--avatar-size);min-block-size:var(--avatar-size);corner-shape:unset}
1
+ .viraui__avatar-group-module__AvatarGroup_zOrR-{--avatar-size:var(--space-2x-large);--avatar-overlap-distance:var(--space-medium);--avatar-group-gap-size:var(--space-x-small);--avatar-mask-anti-alias-size:0.5px;--avatar-mask-radius:calc((var(--avatar-size) / 2) + var(--avatar-group-gap-size));display:inline-flex;flex-wrap:nowrap;align-items:flex-start;min-inline-size:max-content;vertical-align:middle;&[data-direction=horizontal]{flex-direction:row}&[data-direction=vertical]{flex-direction:column}&[data-size=x-small]{--avatar-size:var(--space-large);--avatar-overlap-distance:var(--space-x-small)}&[data-size=small]{--avatar-size:var(--space-2x-large);--avatar-overlap-distance:var(--space-small)}&[data-size=regular]{--avatar-size:var(--space-wide);--avatar-overlap-distance:var(--space-medium)}&[data-size=big]{--avatar-size:var(--space-2x-wide);--avatar-overlap-distance:var(--space-large)}}.viraui__avatar-group-module__AvatarWrapper_0opqY{position:relative;display:inline-flex;flex:0 0 auto;inline-size:var(--avatar-size);block-size:var(--avatar-size);.viraui__avatar-group-module__AvatarGroup_zOrR-[data-direction=horizontal] &:not(:first-child){margin-inline-start:calc(var(--avatar-overlap-distance) * -1)}.viraui__avatar-group-module__AvatarGroup_zOrR-[data-direction=vertical] &:not(:first-child){margin-block-start:calc(var(--avatar-overlap-distance) * -1)}.viraui__avatar-group-module__AvatarGroup_zOrR-:dir(ltr)[data-direction=horizontal] &:not(:last-child){mask-image:radial-gradient(circle var(--avatar-mask-radius) at calc(100% + (var(--avatar-size) / 2) - var(--avatar-overlap-distance)) 50%,transparent calc(var(--avatar-mask-radius) - var(--avatar-mask-anti-alias-size)),#000 calc(var(--avatar-mask-radius) + var(--avatar-mask-anti-alias-size)))}.viraui__avatar-group-module__AvatarGroup_zOrR-:dir(rtl)[data-direction=horizontal] &:not(:last-child){mask-image:radial-gradient(circle var(--avatar-mask-radius) at calc((var(--avatar-size) / 2) - var(--avatar-overlap-distance)) 50%,transparent calc(var(--avatar-mask-radius) - var(--avatar-mask-anti-alias-size)),#000 calc(var(--avatar-mask-radius) + var(--avatar-mask-anti-alias-size)))}.viraui__avatar-group-module__AvatarGroup_zOrR-[data-direction=vertical] &:not(:last-child){mask-image:radial-gradient(circle var(--avatar-mask-radius) at 50% calc(100% + (var(--avatar-size) / 2) - var(--avatar-overlap-distance)),transparent calc(var(--avatar-mask-radius) - var(--avatar-mask-anti-alias-size)),#000 calc(var(--avatar-mask-radius) + var(--avatar-mask-anti-alias-size)))}}.viraui__avatar-group-module__OverflowWrapper_bKv6I{inline-size:auto;min-inline-size:var(--avatar-size)}.viraui__avatar-group-module__AvatarGroupItem_Vvlyh{--avatar-radius:100%;corner-shape:unset}.viraui__avatar-group-module__OverflowPill_nMmTD{display:inline-flex;align-items:center;justify-content:center;min-inline-size:var(--avatar-size);block-size:var(--avatar-size);min-block-size:var(--avatar-size);corner-shape:unset}
@@ -1,9 +1,9 @@
1
1
  var avatar_group_module_default = {
2
- AvatarGroup: "avatar-group-module_AvatarGroup_zOrR-",
3
- AvatarWrapper: "avatar-group-module_AvatarWrapper_0opqY",
4
- OverflowWrapper: "avatar-group-module_OverflowWrapper_bKv6I",
5
- AvatarGroupItem: "avatar-group-module_AvatarGroupItem_Vvlyh",
6
- OverflowPill: "avatar-group-module_OverflowPill_nMmTD"
2
+ AvatarGroup: "viraui__avatar-group-module__AvatarGroup_zOrR-",
3
+ AvatarWrapper: "viraui__avatar-group-module__AvatarWrapper_0opqY",
4
+ OverflowWrapper: "viraui__avatar-group-module__OverflowWrapper_bKv6I",
5
+ AvatarGroupItem: "viraui__avatar-group-module__AvatarGroupItem_Vvlyh",
6
+ OverflowPill: "viraui__avatar-group-module__OverflowPill_nMmTD"
7
7
  };
8
8
  //#endregion
9
9
  export { avatar_group_module_default as default };
@@ -1 +1 @@
1
- .basic-input-module_BasicInput_5uE64{--basic-input-background:var(--base-1);--basic-input-color:var(--global-foreground);--basic-input-placeholder-color:var(--global-disabled-foreground);--basic-input-padding-inline:var(--space-small);--basic-input-font-size:var(--font-scale-body-small);--basic-input-border-radius:var(--radius-small);box-sizing:border-box;margin:0;inline-size:100%;min-inline-size:0;padding-inline:calc(var(--basic-input-padding-inline) + ((var(--basic-input-border-radius) + 0px) / 4));font-family:inherit;font-size:var(--basic-input-font-size);font-variation-settings:"wght" 400;color:var(--basic-input-color);background:var(--basic-input-background);border:none;border-radius:var(--basic-input-border-radius);appearance:none;&::-webkit-contacts-auto-fill-button{background-color:var(--basic-input-color)}&::placeholder{color:var(--basic-input-placeholder-color)}&:disabled{--basic-input-background:var(--global-disabled-background);--basic-input-color:var(--global-disabled-foreground);--basic-input-placeholder-color:var(--global-disabled-foreground);cursor:not-allowed}&[data-invalid]{outline-color:oklab(from var(--highlight-red) l a b/.3)}}
1
+ .viraui__basic-input-module__BasicInput_5uE64{--basic-input-background:var(--base-1);--basic-input-color:var(--global-foreground);--basic-input-placeholder-color:var(--global-disabled-foreground);--basic-input-padding-inline:var(--space-small);--basic-input-font-size:var(--font-scale-body-small);--basic-input-border-radius:var(--radius-medium);box-sizing:border-box;margin:0;inline-size:100%;min-inline-size:0;padding-inline:var(--basic-input-padding-inline);font-family:inherit;font-size:var(--basic-input-font-size);font-variation-settings:"wght" 400;color:var(--basic-input-color);background:var(--basic-input-background);border:none;border-radius:var(--basic-input-border-radius);appearance:none;&::-webkit-contacts-auto-fill-button{background-color:var(--basic-input-color)}&::placeholder{color:var(--basic-input-placeholder-color)}&:disabled{--basic-input-background:var(--global-disabled-background);--basic-input-color:var(--global-disabled-foreground);--basic-input-placeholder-color:var(--global-disabled-foreground);cursor:not-allowed}&[data-invalid]{outline-color:oklab(from var(--highlight-red) l a b/.3)}}
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import './basic-input.css';
3
2
  import { clsx } from "../../core/clsx.js";
4
3
  import basic_input_module_default from "./basic-input.module.js";
@@ -1,3 +1,3 @@
1
- var basic_input_module_default = { BasicInput: "basic-input-module_BasicInput_5uE64" };
1
+ var basic_input_module_default = { BasicInput: "viraui__basic-input-module__BasicInput_5uE64" };
2
2
  //#endregion
3
3
  export { basic_input_module_default as default };
@@ -1,6 +1,6 @@
1
1
  import type * as React from 'react';
2
2
  type FieldHelperCopyProps = {
3
- className?: string | undefined;
3
+ className?: string;
4
4
  description?: React.ReactNode;
5
5
  error?: React.ReactNode;
6
6
  };
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import { Text } from "../text/text.js";
3
2
  import { jsx } from "react/jsx-runtime";
4
3
  import { Field } from "@base-ui/react/field";
@@ -1 +1 @@
1
- .field-label-module_FieldLabel_R9SYf{display:flex;flex-direction:column;align-items:stretch;inline-size:100%;padding-inline:var(--field-label-padding-inline,0)}
1
+ .viraui__field-label-module__FieldLabel_R9SYf{display:inline;flex-direction:column;align-items:stretch;inline-size:100%;padding-inline:var(--field-label-padding-inline,0)}
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import './field-label.css';
3
2
  import { clsx } from "../../core/clsx.js";
4
3
  import { Text } from "../text/text.js";
@@ -1,3 +1,3 @@
1
- var field_label_module_default = { FieldLabel: "field-label-module_FieldLabel_R9SYf" };
1
+ var field_label_module_default = { FieldLabel: "viraui__field-label-module__FieldLabel_R9SYf" };
2
2
  //#endregion
3
3
  export { field_label_module_default as default };
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import { Stack } from "../stack/stack.js";
3
2
  import { jsx, jsxs } from "react/jsx-runtime";
4
3
  //#region src/components/basic-input/input-control-group.tsx
@@ -1 +1 @@
1
- .button-module_Button_oPhrP{--button-background:var(--global-primary);--button-color:var(--base-1);--button-height:var(--space-2x-large);--button-padding-inline:var(--space-medium);--button-padding-block:var(--space-small);--button-spinner-color:currentColor;--button-icon-size:1.125em;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;margin:0;cursor:pointer;font-family:inherit;display:inline-flex;align-items:center;min-inline-size:min-content;max-block-size:var(--button-height);block-size:var(--button-height);justify-content:center;text-decoration:none;white-space:nowrap;appearance:button;overflow:hidden;position:relative;padding:var(--button-padding-block) var(--button-padding-inline);font-weight:400;font-variation-settings:"wght" 400;gap:var(--space-small);border:1px solid transparent;background:var(--button-background);color:var(--button-color);font-size:var(--font-scale-body-medium);border-radius:var(--radius-small);transition:translate var(--easing-elastic) var(--duration-instant);background-clip:padding-box;will-change:translate;&:not(:disabled):active{translate:0 1px}&[data-size=medium]{--button-height:var(--space-x-large);--button-padding-inline:var(--space-small);--button-padding-block:var(--space-small);--button-icon-size:1.125em}&[data-size=small]{--button-height:var(--space-large);--button-padding-inline:var(--space-small);--button-padding-block:var(--space-x-small);--button-icon-size:0.9em;gap:var(--space-x-small);font-size:var(--font-scale-body-small)}&[data-variant=primary]{--button-background:var(--global-primary);--button-color:contrast-color(var(--global-primary))}&[data-variant=secondary]{--button-background:var(--global-contrast);--button-color:var(--base-6);background-clip:unset;&:hover{--button-background:oklab(from var(--global-contrast) l a b/calc(alpha + 0.05))}}&[data-variant=flat]{--button-background:transparent;--button-color:var(--base-5);&:hover{--button-background:var(--global-contrast);--button-color:var(--base-7)}}&[data-variant=destructive]{--button-background:oklab(from var(--highlight-red) l a b/15%);--button-color:var(--highlight-red);&:hover{--button-background:oklab(from var(--highlight-red) l a b/30%)}}&[data-icon-position=start]{flex-direction:row}&[data-icon-position=end]{flex-direction:row-reverse}&[data-icon-only=true]{gap:0;padding-block:var(--button-padding-block);padding-inline:var(--button-padding-block);inline-size:var(--button-height);min-inline-size:var(--button-height);max-inline-size:var(--button-height);aspect-ratio:1/1}&:disabled,&:disabled:hover,&[aria-disabled=true]{--button-background:var(--global-disabled-background);--button-color:var(--global-disabled-foreground);cursor:not-allowed;box-shadow:none}&[data-loading=true][data-disabled]{pointer-events:none;border:0;box-shadow:none;--button-color:var(--base-7)}}.button-module_Content_w-pX-{display:inline-grid;place-items:center;&[data-loading=true]{opacity:0}&:first-child>svg{block-size:var(--button-icon-size);inline-size:var(--button-icon-size);flex-shrink:0}}.button-module_SpinnerOverlay_vKqw1{position:absolute;inset:0;display:grid;place-content:center;pointer-events:none}
1
+ .viraui__button-module__Button_oPhrP{--button-background:var(--global-primary);--button-color:var(--base-1);--button-height:var(--space-x-large);--button-padding-inline:var(--space-small);--button-padding-block:var(--space-small);--button-spinner-color:currentColor;--button-icon-size:1.125em;--button-radius:var(--radius-medium);-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;margin:0;cursor:pointer;font-family:inherit;display:inline-flex;align-items:center;min-inline-size:fit-content;max-block-size:var(--button-height);block-size:var(--button-height);justify-content:center;text-decoration:none;white-space:nowrap;appearance:button;overflow:hidden;position:relative;padding:var(--button-padding-block) var(--button-padding-inline);font-weight:400;font-variation-settings:"wght" 400;gap:var(--space-small);border:1px solid transparent;background:var(--button-background);color:var(--button-color);font-size:var(--font-scale-body-medium);border-radius:var(--button-radius);transition:translate var(--easing-elastic) var(--duration-instant);will-change:translate;&:not(:disabled){background-clip:padding-box}&:not(:disabled):active{translate:0 1px}&[data-pill=true]{border-radius:var(--radius-infinite);&[data-addon-position=end]{padding-inline-end:calc(var(--button-padding-inline) / 2)}&[data-addon-position=start]{padding-inline-start:calc(var(--button-padding-inline) / 2)}}&[data-size=big]{--button-height:var(--space-2x-large);--button-padding-inline:var(--space-medium);--button-padding-block:var(--space-small);--button-icon-size:1.125em;--button-radius:var(--radius-medium)}&[data-size=small]{--button-height:var(--space-large);--button-padding-inline:var(--space-small);--button-padding-block:var(--space-x-small);--button-icon-size:1em;--button-radius:var(--radius-small);gap:var(--space-x-small);font-size:var(--font-scale-body-small)}&[data-variant=primary]{--button-background:var(--global-primary);--button-color:contrast-color(var(--global-primary));&:hover{--button-background:oklab(from var(--global-primary) calc(l + 0.05) a b)}}&[data-variant=secondary]{--button-background:var(--global-contrast);--button-color:var(--base-6);background-clip:unset;&:hover{--button-background:oklab(from var(--global-contrast) l a b/calc(alpha + 0.03))}}&[data-variant=flat]{--button-background:transparent;--button-color:var(--base-5);&:hover{--button-background:var(--global-contrast);--button-color:var(--base-7)}}&[data-variant=destructive]{--button-background:oklab(from var(--highlight-red) l a b/12%);--button-color:var(--highlight-red);&:hover{--button-background:oklab(from var(--highlight-red) l a b/30%)}}&[data-addon-position=start]{flex-direction:row;padding-inline-end:calc(var(--button-padding-inline) * 1.2)}&[data-addon-position=end]{flex-direction:row-reverse;padding-inline-start:calc(var(--button-padding-inline) * 1.2)}&[data-icon-only=true]{gap:0;padding-block:var(--button-padding-block);padding-inline:var(--button-padding-block);inline-size:var(--button-height);min-inline-size:var(--button-height);max-inline-size:var(--button-height);aspect-ratio:1/1}&:disabled,&:disabled:hover,&[aria-disabled=true]{--button-background:var(--global-disabled-background);--button-color:var(--global-disabled-foreground);cursor:not-allowed;box-shadow:none}&[data-loading=true][data-disabled]{pointer-events:none;border:0;box-shadow:none;--button-color:var(--base-7)}}.viraui__button-module__Content_w-pX-{display:inline-grid;place-items:center;&[data-loading=true]{opacity:0}&:first-child>svg{block-size:var(--button-icon-size);inline-size:var(--button-icon-size);flex-shrink:0}}.viraui__button-module__SpinnerOverlay_vKqw1{position:absolute;inset:0;display:grid;place-content:center;pointer-events:none}
@@ -1,6 +1,6 @@
1
1
  import { Button as PrimitiveButton } from '@base-ui/react/button';
2
- import { ReactNode } from 'react';
3
2
  import { IntrinsicViraProps } from '../../core/props/intrinsic-vira-props';
3
+ import { ReactNode } from 'react';
4
4
  import * as React from 'react';
5
5
  /**
6
6
  * Public Button props.
@@ -24,23 +24,29 @@ export type ButtonProps = PrimitiveButton.Props & IntrinsicViraProps & {
24
24
  */
25
25
  variant?: 'primary' | 'secondary' | 'flat' | 'destructive';
26
26
  /**
27
- * Decorative icon rendered alongside the button label.
28
- * Pass any React icon element; use `<Icon name="..." />` for the Vira icon set.
27
+ * Decorative addon rendered alongside the button label.
28
+ * Pass any React element; use `<Icon name="..." />` for icons or `<Chip />` for status chips.
29
29
  *
30
- * @default No default; omit when the button has no icon.
30
+ * @default No default; omit when the button has no addon.
31
31
  */
32
- icon?: ReactNode;
32
+ addon?: ReactNode;
33
33
  /**
34
- * Controls whether the icon appears before or after the label.
34
+ * Controls whether the addon appears before or after the label.
35
35
  *
36
36
  * @default 'start'
37
37
  */
38
- iconPosition?: 'start' | 'end';
38
+ addonPosition?: 'start' | 'end';
39
39
  /**
40
40
  * Shows a centered spinner overlay while preserving the original content width.
41
41
  *
42
42
  * @default false
43
43
  */
44
44
  loading?: boolean;
45
+ /**
46
+ * Applies a fully rounded pill shape to the button.
47
+ *
48
+ * @default false
49
+ */
50
+ pill?: boolean;
45
51
  };
46
52
  export declare const Button: React.FC<ButtonProps>;
@@ -1,20 +1,22 @@
1
1
  {
2
2
  "name": "Button",
3
- "summary": "Primary action control with size, variant, optional icon, and loading state.",
3
+ "summary": "Primary action control with size, variant, optional addon, optional pill shape, and loading state.",
4
4
  "whenToUse": [
5
- "Labeled actions with text and optional leading or trailing icon",
5
+ "Labeled actions with text and optional leading or trailing addon",
6
6
  "Primary, secondary, flat, or destructive visual treatments",
7
+ "Capsule-shaped actions via pill when a fully rounded button fits the layout",
7
8
  "Async actions that need a stable width while loading"
8
9
  ],
9
10
  "whenNotToUse": ["Icon-only actions without a visible label — use IconButton", "Navigation or non-button semantics"],
10
11
  "accessibility": [
11
- "Visible button text should name the action; avoid relying on icon alone",
12
+ "Visible button text should name the action; avoid relying on addon alone",
12
13
  "Loading sets aria-busy on the control while Spinner stays decorative",
13
14
  "Disabled and loading states should not remove the action from the tab order without clear context"
14
15
  ],
15
16
  "antiPatterns": [
16
17
  "Using Button without children as icon-only — prefer IconButton",
17
- "Duplicating icon size on every icon slot — Button CSS sizes SVG descendants"
18
+ "Duplicating icon size on every addon slot — Button CSS sizes SVG descendants",
19
+ "Mixing pill with custom border-radius overrides that fight data-pill styling"
18
20
  ],
19
- "related": ["IconButton", "Icon", "Spinner"]
21
+ "related": ["IconButton", "Icon", "Spinner", "Chip"]
20
22
  }
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import './button.css';
3
2
  import { clsx } from "../../core/clsx.js";
4
3
  import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
@@ -37,7 +36,7 @@ var ButtonRenderRoot = ({ isDisabled, ref, render, rootProps }) => {
37
36
  }
38
37
  });
39
38
  };
40
- var ButtonRoot = ({ children, className, intrinsicAttributes, isDisabled, isIconOnly, icon, iconPosition, loading, passThroughProps, ref, render, size, variant }) => {
39
+ var ButtonRoot = ({ children, className, intrinsicAttributes, isDisabled, isIconOnly, addon, addonPosition, loading, passThroughProps, pill, ref, render, size, variant }) => {
41
40
  const rootProps = {
42
41
  ...passThroughProps,
43
42
  ...intrinsicAttributes,
@@ -45,9 +44,10 @@ var ButtonRoot = ({ children, className, intrinsicAttributes, isDisabled, isIcon
45
44
  children,
46
45
  className: clsx(button_module_default.Button, className),
47
46
  "data-loading": loading ? "true" : "false",
47
+ "data-pill": pill ? "true" : void 0,
48
48
  "data-size": size,
49
49
  "data-icon-only": isIconOnly ? "true" : void 0,
50
- "data-icon-position": icon && !isIconOnly ? iconPosition : void 0,
50
+ "data-addon-position": addon && !isIconOnly ? addonPosition : void 0,
51
51
  "data-variant": variant
52
52
  };
53
53
  if (usesButtonPrimitiveRender(render)) return /* @__PURE__ */ jsx(Button, {
@@ -64,9 +64,9 @@ var ButtonRoot = ({ children, className, intrinsicAttributes, isDisabled, isIcon
64
64
  rootProps
65
65
  });
66
66
  };
67
- var Button$1 = ({ children, className, disabled, icon, iconPosition = "start", loading = false, size = "medium", variant = "primary", ...otherProps }) => {
67
+ var Button$1 = ({ children, className, disabled, addon, addonPosition = "start", loading = false, pill = false, size = "medium", variant = "primary", ...otherProps }) => {
68
68
  const isDisabled = disabled || loading;
69
- const isIconOnly = Boolean(icon) && (children == null || children === "");
69
+ const isIconOnly = Boolean(addon) && (children == null || children === "");
70
70
  const { componentProps, intrinsicAttributes } = extractIntrinsicViraProps(otherProps);
71
71
  const { render, ref, ...passThroughProps } = componentProps;
72
72
  return /* @__PURE__ */ jsxs(ButtonRoot, {
@@ -74,10 +74,11 @@ var Button$1 = ({ children, className, disabled, icon, iconPosition = "start", l
74
74
  intrinsicAttributes,
75
75
  isDisabled,
76
76
  isIconOnly,
77
- icon,
78
- iconPosition,
77
+ addon,
78
+ addonPosition,
79
79
  loading,
80
80
  passThroughProps,
81
+ pill,
81
82
  ref,
82
83
  render,
83
84
  size,
@@ -86,12 +87,12 @@ var Button$1 = ({ children, className, disabled, icon, iconPosition = "start", l
86
87
  "aria-hidden": "true",
87
88
  className: button_module_default.Content,
88
89
  "data-loading": loading ? "true" : "false",
89
- children: icon
90
- }) : /* @__PURE__ */ jsxs(Fragment, { children: [icon && /* @__PURE__ */ jsx("span", {
90
+ children: addon
91
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [addon && /* @__PURE__ */ jsx("span", {
91
92
  "aria-hidden": "true",
92
93
  className: button_module_default.Content,
93
94
  "data-loading": loading ? "true" : "false",
94
- children: icon
95
+ children: addon
95
96
  }), /* @__PURE__ */ jsx("span", {
96
97
  className: button_module_default.Content,
97
98
  "data-loading": loading ? "true" : "false",
@@ -1,7 +1,7 @@
1
1
  var button_module_default = {
2
- Button: "button-module_Button_oPhrP",
3
- Content: "button-module_Content_w-pX-",
4
- SpinnerOverlay: "button-module_SpinnerOverlay_vKqw1"
2
+ Button: "viraui__button-module__Button_oPhrP",
3
+ Content: "viraui__button-module__Content_w-pX-",
4
+ SpinnerOverlay: "viraui__button-module__SpinnerOverlay_vKqw1"
5
5
  };
6
6
  //#endregion
7
7
  export { button_module_default as default };
@@ -0,0 +1,12 @@
1
+ import { CheckboxGroup as CheckboxGroupPrimitive } from '@base-ui/react';
2
+ import type * as React from 'react';
3
+ /**
4
+ * Public CheckboxGroup props.
5
+ *
6
+ * Thin wrapper around Base UI `CheckboxGroup` with default option spacing.
7
+ * Compose with `Field.Root` and `Fieldset` for group labels, validation, and copy.
8
+ *
9
+ * @default Base UI pass-through props keep upstream defaults.
10
+ */
11
+ export type CheckboxGroupProps = CheckboxGroupPrimitive.Props;
12
+ export declare const CheckboxGroup: React.FC<CheckboxGroupProps>;
@@ -0,0 +1,15 @@
1
+ import { Stack } from "../stack/stack.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { CheckboxGroup } from "@base-ui/react";
4
+ //#region src/components/checkbox/checkbox-group.tsx
5
+ var CheckboxGroup$1 = ({ children, className, ...props }) => /* @__PURE__ */ jsx(CheckboxGroup, {
6
+ ...props,
7
+ className,
8
+ render: /* @__PURE__ */ jsx(Stack, {
9
+ fillChildren: false,
10
+ rowGap: "small"
11
+ }),
12
+ children
13
+ });
14
+ //#endregion
15
+ export { CheckboxGroup$1 as CheckboxGroup };
@@ -1 +1 @@
1
- .checkbox-module_Checkbox_3oGip{--checkbox-size:var(--space-medium);--checkbox-radius:var(--radius-x-small);--checkbox-background:var(--global-contrast);--checkbox-border-color:transparent;--checkbox-indicator-color:contrast-color(var(--global-primary));&:has([required]) [data-field-label]:after{content:" *";color:var(--highlight-red)}}.checkbox-module_CheckboxRoot_PeyF5{position:relative;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;appearance:none;border:0;box-shadow:inset 0 0 0 1px var(--checkbox-border-color);inline-size:var(--checkbox-size);block-size:var(--checkbox-size);background:var(--checkbox-background);border-radius:var(--checkbox-radius);&[data-size=regular]{--checkbox-size:var(--space-large);--checkbox-radius:var(--radius-small)}&[data-checked]:not([data-disabled]):not([data-invalid]),&[data-indeterminate]:not([data-disabled]):not([data-invalid]){--checkbox-background:var(--global-primary);--checkbox-border-color:var(--global-primary);box-shadow:none}&[data-invalid]:not([data-disabled]),.checkbox-module_Checkbox_3oGip[data-invalid]>&:not([data-disabled]){--checkbox-border-color:var(--highlight-red);--checkbox-indicator-color:var(--global-primary);box-shadow:inset 0 0 0 1px var(--highlight-red);outline-color:oklab(from var(--highlight-red) l a b/.5)}&[data-disabled],.checkbox-module_Checkbox_3oGip[data-disabled]>&{--checkbox-background:var(--global-disabled-background);--checkbox-border-color:transparent;--checkbox-indicator-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}}.checkbox-module_Indicator_C-k-l{display:inline-flex;align-items:center;justify-content:center;color:var(--checkbox-indicator-color)}.checkbox-module_Icon_926Sa{stroke:currentColor}.checkbox-module_CheckboxRoot_PeyF5:not([data-indeterminate]) .checkbox-module_MinusIcon_Q57pY,.checkbox-module_CheckboxRoot_PeyF5[data-indeterminate] .checkbox-module_CheckIcon_XqUcs{display:none}.checkbox-module_CheckboxRoot_PeyF5[data-indeterminate] .checkbox-module_MinusIcon_Q57pY{display:inline-flex}
1
+ .viraui__checkbox-module__Checkbox_3oGip{&:has([required]) .viraui__checkbox-module__Label_n9HL7:after{content:" *";color:var(--highlight-red)}}.viraui__checkbox-module__CheckboxRoot_PeyF5{--checkbox-size:var(--space-medium);--checkbox-radius:var(--radius-x-small);--checkbox-background:var(--global-contrast);--checkbox-border-color:transparent;--checkbox-indicator-color:contrast-color(var(--global-primary));position:relative;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;appearance:none;border:0;box-shadow:inset 0 0 0 1px var(--checkbox-border-color);inline-size:var(--checkbox-size);block-size:var(--checkbox-size);background:var(--checkbox-background);border-radius:var(--checkbox-radius);&[data-size=regular]{--checkbox-size:var(--space-large);--checkbox-radius:var(--radius-small)}&[data-checked]:not([data-disabled]):not([data-invalid]),&[data-indeterminate]:not([data-disabled]):not([data-invalid]){--checkbox-background:var(--global-primary);--checkbox-border-color:var(--global-primary);box-shadow:none}&[data-invalid]:not([data-disabled]),[data-invalid] &:not([data-disabled]){--checkbox-border-color:var(--highlight-red);--checkbox-indicator-color:var(--global-primary);box-shadow:inset 0 0 0 1px var(--highlight-red);outline-color:oklab(from var(--highlight-red) l a b/.5)}&[data-disabled],[data-disabled] &{--checkbox-background:var(--global-disabled-background);--checkbox-border-color:transparent;--checkbox-indicator-color:var(--global-disabled-foreground);box-shadow:none;cursor:not-allowed}}.viraui__checkbox-module__Indicator_C-k-l{display:inline-flex;align-items:center;justify-content:center;color:var(--checkbox-indicator-color)}.viraui__checkbox-module__Icon_926Sa{stroke:currentColor}.viraui__checkbox-module__CheckboxRoot_PeyF5:not([data-indeterminate]) .viraui__checkbox-module__MinusIcon_Q57pY,.viraui__checkbox-module__CheckboxRoot_PeyF5[data-indeterminate] .viraui__checkbox-module__CheckIcon_XqUcs{display:none}.viraui__checkbox-module__CheckboxRoot_PeyF5[data-indeterminate] .viraui__checkbox-module__MinusIcon_Q57pY{display:inline-flex}
@@ -1,29 +1,15 @@
1
- import { CheckboxRoot, FieldRoot } from '@base-ui/react';
1
+ import { CheckboxRoot } from '@base-ui/react/checkbox';
2
2
  import { StackProps } from '..';
3
- import { IntrinsicViraProps } from '../../core/props/intrinsic-vira-props';
4
3
  import type * as React from 'react';
5
4
  /**
6
5
  * Public Checkbox props.
7
6
  *
8
- * Includes Base UI checkbox props such as `checked`, `defaultChecked`, `indeterminate`,
9
- * `disabled`, and change handlers, plus optional field copy rendered with the shared Vira
10
- * field label/helper pattern.
7
+ * Self-contained option row for standalone fields or `CheckboxGroup` children.
8
+ * Standalone usage requires an external `Field.Root` wrapper for validation and naming.
11
9
  *
12
10
  * @default Base UI pass-through props keep upstream defaults.
13
11
  */
14
- export type CheckboxProps = CheckboxRoot.Props & Omit<FieldRoot.Props, 'ref'> & {
15
- /**
16
- * Adds `data-grow="false"` to the field root when false.
17
- *
18
- * @default The field root does not render a grow attribute.
19
- */
20
- grow?: IntrinsicViraProps['grow'];
21
- /**
22
- * Adds `data-shrink="false"` to the field root when false.
23
- *
24
- * @default The field root does not render a shrink attribute.
25
- */
26
- shrink?: IntrinsicViraProps['shrink'];
12
+ export type CheckboxProps = CheckboxRoot.Props & {
27
13
  /**
28
14
  * Visible label rendered with shared internal `FieldLabel`.
29
15
  *
@@ -31,14 +17,13 @@ export type CheckboxProps = CheckboxRoot.Props & Omit<FieldRoot.Props, 'ref'> &
31
17
  */
32
18
  label?: React.ReactNode;
33
19
  /**
34
- * Helper copy rendered with `Field.Description` and `Text` while the field is valid.
20
+ * Helper copy rendered with `Field.Description` and `Text` for this option.
35
21
  *
36
22
  * @default No description is rendered.
37
23
  */
38
24
  description?: React.ReactNode;
39
25
  /**
40
- * Error copy rendered with `Field.Error` and `Text` in the same slot as `description`.
41
- * Replaces description while the field is invalid.
26
+ * Error copy rendered in the same slot as `description` while invalid.
42
27
  *
43
28
  * @default No static error copy is rendered.
44
29
  */
@@ -1,22 +1,27 @@
1
1
  {
2
2
  "name": "Checkbox",
3
- "summary": "Field-wrapped checkbox control with optional field copy.",
3
+ "summary": "Field.Item checkbox option for standalone fields or CheckboxGroup children.",
4
4
  "whenToUse": [
5
- "Single or multi-select boolean choices with optional label and helper text",
5
+ "Single boolean fields wrapped in Field.Root with optional label and helper text — no Fieldset required",
6
+ "CheckboxGroup alone inside Field.Root when each Checkbox has its own label and no shared group legend is needed",
7
+ "Multi-select sets with shared legend or group copy — Field.Root > Fieldset render={<CheckboxGroup />} with Checkbox children",
6
8
  "Invalid and disabled states with Switch-parity focus treatment"
7
9
  ],
8
10
  "whenNotToUse": [
9
11
  "Unlabeled checkbox without aria-label on the root",
10
- "Mutually exclusive options in a set (use radio pattern instead)"
12
+ "Mutually exclusive options in a set (use Radio and RadioGroup instead)",
13
+ "Assuming Fieldset is mandatory for every CheckboxGroup — add Fieldset only for shared legend or group copy",
14
+ "Group legend, description, or validation on CheckboxGroup props — use Field.Root and Fieldset instead"
11
15
  ],
12
16
  "accessibility": [
13
17
  "Provide visible label or aria-label so the checkbox has an accessible name",
14
18
  "Checked and indeterminate states must map to native checkbox semantics exposed by the control",
15
- "Surface invalid state and error copy through the shared field pattern"
19
+ "Surface standalone invalid state and error copy through Field.Root and FieldHelperCopy on Checkbox"
16
20
  ],
17
21
  "antiPatterns": [
18
22
  "Rendering a checkbox without label and without aria-label",
23
+ "Using Checkbox without Field.Root for standalone validated fields",
19
24
  "Expecting description to stay visible when invalid without an error message"
20
25
  ],
21
- "related": ["Switch", "Stack", "Text"]
26
+ "related": ["Fieldset", "CheckboxGroup", "Switch", "Stack", "Text"]
22
27
  }
@@ -1,75 +1,61 @@
1
- "use client";
2
1
  import './checkbox.css';
3
2
  import { clsx } from "../../core/clsx.js";
4
- import { extractIntrinsicViraProps } from "../../core/props/intrinsic-vira-props.js";
5
3
  import { Stack } from "../stack/stack.js";
6
4
  import { FieldHelperCopy } from "../basic-input/field-helper-copy.js";
7
5
  import { FieldLabel } from "../basic-input/field-label.js";
8
6
  import checkbox_module_default from "./checkbox.module.js";
9
7
  import { Icon } from "../icon/icon.js";
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';