@codefast/ui 0.3.16-canary.2 → 0.4.0-canary.4

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 (289) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +28 -17
  3. package/dist/components/accordion.d.mts +7 -22
  4. package/dist/components/accordion.mjs +26 -29
  5. package/dist/components/alert-dialog.d.mts +27 -26
  6. package/dist/components/alert-dialog.mjs +53 -45
  7. package/dist/components/alert.d.mts +14 -14
  8. package/dist/components/alert.mjs +17 -28
  9. package/dist/components/aspect-ratio.d.mts +2 -2
  10. package/dist/components/aspect-ratio.mjs +2 -3
  11. package/dist/components/avatar.d.mts +41 -5
  12. package/dist/components/avatar.mjs +40 -10
  13. package/dist/components/badge.d.mts +3 -15
  14. package/dist/components/badge.mjs +6 -48
  15. package/dist/components/breadcrumb.d.mts +1 -0
  16. package/dist/components/breadcrumb.mjs +11 -10
  17. package/dist/components/button-group.d.mts +3 -13
  18. package/dist/components/button-group.mjs +9 -31
  19. package/dist/components/button.d.mts +3 -26
  20. package/dist/components/button.mjs +9 -79
  21. package/dist/components/calendar.d.mts +6 -2
  22. package/dist/components/calendar.mjs +41 -44
  23. package/dist/components/card.d.mts +4 -2
  24. package/dist/components/card.mjs +9 -9
  25. package/dist/components/carousel.d.mts +16 -5
  26. package/dist/components/carousel.mjs +24 -11
  27. package/dist/components/chart.d.mts +9 -6
  28. package/dist/components/chart.mjs +21 -15
  29. package/dist/components/checkbox-cards.mjs +4 -4
  30. package/dist/components/checkbox-group.mjs +3 -4
  31. package/dist/components/checkbox.d.mts +2 -2
  32. package/dist/components/checkbox.mjs +6 -7
  33. package/dist/components/collapsible.d.mts +4 -4
  34. package/dist/components/collapsible.mjs +4 -5
  35. package/dist/components/command.d.mts +11 -1
  36. package/dist/components/command.mjs +35 -32
  37. package/dist/components/context-menu.d.mts +22 -15
  38. package/dist/components/context-menu.mjs +44 -39
  39. package/dist/components/dialog.d.mts +19 -23
  40. package/dist/components/dialog.mjs +48 -47
  41. package/dist/components/direction.d.mts +24 -0
  42. package/dist/components/direction.mjs +18 -0
  43. package/dist/components/drawer.d.mts +3 -21
  44. package/dist/components/drawer.mjs +19 -27
  45. package/dist/components/dropdown-menu.d.mts +22 -15
  46. package/dist/components/dropdown-menu.mjs +41 -37
  47. package/dist/components/empty.d.mts +3 -13
  48. package/dist/components/empty.mjs +8 -23
  49. package/dist/components/field.d.mts +3 -14
  50. package/dist/components/field.mjs +14 -44
  51. package/dist/components/form.d.mts +7 -10
  52. package/dist/components/form.mjs +6 -7
  53. package/dist/components/hover-card.d.mts +5 -5
  54. package/dist/components/hover-card.mjs +14 -12
  55. package/dist/components/input-group.d.mts +4 -31
  56. package/dist/components/input-group.mjs +14 -96
  57. package/dist/components/input-number.d.mts +3 -1
  58. package/dist/components/input-number.mjs +50 -28
  59. package/dist/components/input-otp.mjs +9 -7
  60. package/dist/components/input-password.mjs +1 -4
  61. package/dist/components/input-search.mjs +3 -5
  62. package/dist/components/input.mjs +1 -2
  63. package/dist/components/item.d.mts +4 -29
  64. package/dist/components/item.mjs +12 -65
  65. package/dist/components/kbd.mjs +1 -1
  66. package/dist/components/label.d.mts +2 -2
  67. package/dist/components/label.mjs +3 -4
  68. package/dist/components/menubar.d.mts +22 -16
  69. package/dist/components/menubar.mjs +54 -47
  70. package/dist/components/native-select.d.mts +5 -1
  71. package/dist/components/native-select.mjs +9 -6
  72. package/dist/components/navigation-menu.d.mts +30 -13
  73. package/dist/components/navigation-menu.mjs +35 -32
  74. package/dist/components/pagination.d.mts +7 -1
  75. package/dist/components/pagination.mjs +27 -12
  76. package/dist/components/popover.d.mts +40 -7
  77. package/dist/components/popover.mjs +46 -14
  78. package/dist/components/progress-circle.d.mts +3 -47
  79. package/dist/components/progress-circle.mjs +2 -48
  80. package/dist/components/progress.d.mts +2 -2
  81. package/dist/components/progress.mjs +5 -6
  82. package/dist/components/radio-cards.d.mts +3 -3
  83. package/dist/components/radio-cards.mjs +11 -11
  84. package/dist/components/radio-group.d.mts +3 -3
  85. package/dist/components/radio-group.mjs +9 -9
  86. package/dist/components/radio.mjs +2 -3
  87. package/dist/components/resizable.mjs +3 -8
  88. package/dist/components/scroll-area.d.mts +8 -24
  89. package/dist/components/scroll-area.mjs +16 -70
  90. package/dist/components/select.d.mts +14 -14
  91. package/dist/components/select.mjs +47 -47
  92. package/dist/components/separator.d.mts +4 -19
  93. package/dist/components/separator.mjs +6 -27
  94. package/dist/components/sheet.d.mts +18 -31
  95. package/dist/components/sheet.mjs +46 -87
  96. package/dist/components/sidebar.d.mts +3 -19
  97. package/dist/components/sidebar.mjs +48 -84
  98. package/dist/components/skeleton.mjs +1 -1
  99. package/dist/components/slider.d.mts +2 -2
  100. package/dist/components/slider.mjs +9 -11
  101. package/dist/components/sonner.mjs +11 -3
  102. package/dist/components/spinner.mjs +6 -7
  103. package/dist/components/switch.d.mts +5 -2
  104. package/dist/components/switch.mjs +7 -7
  105. package/dist/components/table.mjs +10 -10
  106. package/dist/components/tabs.d.mts +8 -5
  107. package/dist/components/tabs.mjs +18 -12
  108. package/dist/components/textarea.mjs +1 -1
  109. package/dist/components/toggle-group.d.mts +11 -7
  110. package/dist/components/toggle-group.mjs +20 -21
  111. package/dist/components/toggle.d.mts +4 -24
  112. package/dist/components/toggle.mjs +6 -45
  113. package/dist/components/tooltip.d.mts +7 -6
  114. package/dist/components/tooltip.mjs +19 -17
  115. package/dist/hooks/use-animated-value.mjs +0 -1
  116. package/dist/hooks/use-copy-to-clipboard.mjs +0 -1
  117. package/dist/hooks/use-is-mobile.mjs +0 -1
  118. package/dist/hooks/use-media-query.mjs +0 -1
  119. package/dist/hooks/use-mutation-observer.mjs +0 -1
  120. package/dist/hooks/use-pagination.mjs +0 -1
  121. package/dist/index.d.mts +38 -21
  122. package/dist/index.mjs +40 -23
  123. package/dist/lib/utils.d.mts +1 -12
  124. package/dist/lib/utils.mjs +1 -9
  125. package/dist/primitives/checkbox-group.d.mts +9 -11
  126. package/dist/primitives/checkbox-group.mjs +14 -19
  127. package/dist/primitives/input-number.d.mts +3 -4
  128. package/dist/primitives/input-number.mjs +3 -5
  129. package/dist/primitives/input.d.mts +4 -5
  130. package/dist/primitives/input.mjs +2 -3
  131. package/dist/primitives/progress-circle.d.mts +3 -4
  132. package/dist/primitives/progress-circle.mjs +2 -3
  133. package/dist/variants/alert.d.mts +18 -0
  134. package/dist/variants/alert.mjs +15 -0
  135. package/dist/variants/badge.d.mts +22 -0
  136. package/dist/variants/badge.mjs +19 -0
  137. package/dist/variants/button-group.d.mts +18 -0
  138. package/dist/variants/button-group.mjs +15 -0
  139. package/dist/variants/button.d.mts +32 -0
  140. package/dist/variants/button.mjs +34 -0
  141. package/dist/variants/empty.d.mts +18 -0
  142. package/dist/variants/empty.mjs +15 -0
  143. package/dist/variants/field.d.mts +19 -0
  144. package/dist/variants/field.mjs +16 -0
  145. package/dist/variants/input-group.d.mts +43 -0
  146. package/dist/variants/input-group.mjs +34 -0
  147. package/dist/variants/input-number.d.mts +45 -0
  148. package/dist/variants/input-number.mjs +40 -0
  149. package/dist/variants/item.d.mts +38 -0
  150. package/dist/variants/item.mjs +38 -0
  151. package/dist/variants/navigation-menu.d.mts +13 -0
  152. package/dist/variants/navigation-menu.mjs +8 -0
  153. package/dist/variants/progress-circle.d.mts +52 -0
  154. package/dist/variants/progress-circle.mjs +45 -0
  155. package/dist/variants/scroll-area.d.mts +24 -0
  156. package/dist/variants/scroll-area.mjs +58 -0
  157. package/dist/variants/separator.d.mts +23 -0
  158. package/dist/variants/separator.mjs +25 -0
  159. package/dist/variants/sheet.d.mts +20 -0
  160. package/dist/variants/sheet.mjs +17 -0
  161. package/dist/variants/sidebar.d.mts +23 -0
  162. package/dist/variants/sidebar.mjs +25 -0
  163. package/dist/variants/tabs.d.mts +18 -0
  164. package/dist/variants/tabs.mjs +15 -0
  165. package/dist/variants/toggle.d.mts +23 -0
  166. package/dist/variants/toggle.mjs +25 -0
  167. package/package.json +186 -55
  168. package/src/components/accordion.tsx +114 -0
  169. package/src/components/alert-dialog.tsx +298 -0
  170. package/src/components/alert.tsx +94 -0
  171. package/src/components/aspect-ratio.tsx +25 -0
  172. package/src/components/avatar.tsx +171 -0
  173. package/src/components/badge.tsx +35 -0
  174. package/src/components/breadcrumb.tsx +191 -0
  175. package/src/components/button-group.tsx +97 -0
  176. package/src/components/button.tsx +55 -0
  177. package/src/components/calendar.tsx +222 -0
  178. package/src/components/card.tsx +169 -0
  179. package/src/components/carousel.tsx +349 -0
  180. package/src/components/chart.tsx +536 -0
  181. package/src/components/checkbox-cards.tsx +72 -0
  182. package/src/components/checkbox-group.tsx +60 -0
  183. package/src/components/checkbox.tsx +44 -0
  184. package/src/components/collapsible.tsx +57 -0
  185. package/src/components/command.tsx +298 -0
  186. package/src/components/context-menu.tsx +410 -0
  187. package/src/components/dialog.tsx +243 -0
  188. package/src/components/direction.tsx +32 -0
  189. package/src/components/drawer.tsx +209 -0
  190. package/src/components/dropdown-menu.tsx +419 -0
  191. package/src/components/empty.tsx +155 -0
  192. package/src/components/field.tsx +329 -0
  193. package/src/components/form.tsx +258 -0
  194. package/src/components/hover-card.tsx +93 -0
  195. package/src/components/input-group.tsx +185 -0
  196. package/src/components/input-number.tsx +141 -0
  197. package/src/components/input-otp.tsx +132 -0
  198. package/src/components/input-password.tsx +50 -0
  199. package/src/components/input-search.tsx +81 -0
  200. package/src/components/input.tsx +36 -0
  201. package/src/components/item.tsx +266 -0
  202. package/src/components/kbd.tsx +47 -0
  203. package/src/components/label.tsx +36 -0
  204. package/src/components/menubar.tsx +440 -0
  205. package/src/components/native-select.tsx +87 -0
  206. package/src/components/navigation-menu.tsx +235 -0
  207. package/src/components/pagination.tsx +198 -0
  208. package/src/components/popover.tsx +170 -0
  209. package/src/components/progress-circle.tsx +185 -0
  210. package/src/components/progress.tsx +41 -0
  211. package/src/components/radio-cards.tsx +66 -0
  212. package/src/components/radio-group.tsx +59 -0
  213. package/src/components/radio.tsx +40 -0
  214. package/src/components/resizable.tsx +78 -0
  215. package/src/components/scroll-area.tsx +95 -0
  216. package/src/components/select.tsx +296 -0
  217. package/src/components/separator.tsx +60 -0
  218. package/src/components/sheet.tsx +241 -0
  219. package/src/components/sidebar.tsx +926 -0
  220. package/src/components/skeleton.tsx +35 -0
  221. package/src/components/slider.tsx +66 -0
  222. package/src/components/sonner.tsx +57 -0
  223. package/src/components/spinner.tsx +66 -0
  224. package/src/components/switch.tsx +44 -0
  225. package/src/components/table.tsx +183 -0
  226. package/src/components/tabs.tsx +110 -0
  227. package/src/components/textarea.tsx +35 -0
  228. package/src/components/toggle-group.tsx +137 -0
  229. package/src/components/toggle.tsx +30 -0
  230. package/src/components/tooltip.tsx +115 -0
  231. package/src/css/foundation/base.css +50 -0
  232. package/src/css/foundation/motion.css +36 -0
  233. package/src/css/foundation/source.css +3 -0
  234. package/src/css/foundation/tokens.css +71 -0
  235. package/src/css/foundation/variants.css +113 -0
  236. package/src/css/preset.css +5 -195
  237. package/src/css/style.css +1 -1
  238. package/src/css/{amber.css → themes/amber.css} +59 -22
  239. package/src/css/{blue.css → themes/blue.css} +59 -22
  240. package/src/css/{cyan.css → themes/cyan.css} +59 -22
  241. package/src/css/{emerald.css → themes/emerald.css} +59 -22
  242. package/src/css/{fuchsia.css → themes/fuchsia.css} +59 -22
  243. package/src/css/{gray.css → themes/gray.css} +59 -22
  244. package/src/css/{green.css → themes/green.css} +59 -22
  245. package/src/css/{indigo.css → themes/indigo.css} +59 -22
  246. package/src/css/{lime.css → themes/lime.css} +59 -22
  247. package/src/css/{neutral.css → themes/neutral.css} +59 -22
  248. package/src/css/{orange.css → themes/orange.css} +59 -22
  249. package/src/css/{pink.css → themes/pink.css} +59 -22
  250. package/src/css/{purple.css → themes/purple.css} +59 -22
  251. package/src/css/{red.css → themes/red.css} +59 -22
  252. package/src/css/{rose.css → themes/rose.css} +59 -22
  253. package/src/css/{sky.css → themes/sky.css} +59 -22
  254. package/src/css/{slate.css → themes/slate.css} +59 -22
  255. package/src/css/{stone.css → themes/stone.css} +59 -22
  256. package/src/css/{teal.css → themes/teal.css} +59 -22
  257. package/src/css/{violet.css → themes/violet.css} +59 -22
  258. package/src/css/{yellow.css → themes/yellow.css} +59 -22
  259. package/src/css/{zinc.css → themes/zinc.css} +59 -22
  260. package/src/hooks/use-animated-value.ts +91 -0
  261. package/src/hooks/use-copy-to-clipboard.ts +58 -0
  262. package/src/hooks/use-is-mobile.ts +25 -0
  263. package/src/hooks/use-media-query.ts +69 -0
  264. package/src/hooks/use-mutation-observer.ts +51 -0
  265. package/src/hooks/use-pagination.ts +164 -0
  266. package/src/index.ts +679 -0
  267. package/src/lib/utils.ts +5 -0
  268. package/src/primitives/checkbox-group.tsx +346 -0
  269. package/src/primitives/input-number.tsx +967 -0
  270. package/src/primitives/input.tsx +227 -0
  271. package/src/primitives/progress-circle.tsx +507 -0
  272. package/src/variants/alert.ts +34 -0
  273. package/src/variants/badge.ts +39 -0
  274. package/src/variants/button-group.ts +36 -0
  275. package/src/variants/button.ts +56 -0
  276. package/src/variants/empty.ts +34 -0
  277. package/src/variants/field.ts +37 -0
  278. package/src/variants/input-group.ts +80 -0
  279. package/src/variants/input-number.ts +65 -0
  280. package/src/variants/item.ts +68 -0
  281. package/src/variants/navigation-menu.ts +25 -0
  282. package/src/variants/progress-circle.ts +46 -0
  283. package/src/variants/scroll-area.ts +73 -0
  284. package/src/variants/separator.ts +40 -0
  285. package/src/variants/sheet.ts +37 -0
  286. package/src/variants/sidebar.ts +41 -0
  287. package/src/variants/tabs.ts +34 -0
  288. package/src/variants/toggle.ts +40 -0
  289. package/dist/node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts +0 -6
@@ -0,0 +1,346 @@
1
+ import { Checkbox as CheckboxPrimitive } from "radix-ui";
2
+ import { Checkbox } from "radix-ui";
3
+ import { Direction } from "radix-ui";
4
+ import { Context } from "radix-ui/internal";
5
+ import { RovingFocus } from "radix-ui/internal";
6
+ import { useControllableState } from "radix-ui/internal";
7
+ import type { ComponentProps, JSX } from "react";
8
+ import { useCallback } from "react";
9
+
10
+ /* -----------------------------------------------------------------------------
11
+ * Context: CheckboxGroup
12
+ * --------------------------------------------------------------------------- */
13
+
14
+ const CHECKBOX_GROUP_NAME = "CheckboxGroup";
15
+
16
+ /**
17
+ * Type for components that can be scoped within the CheckboxGroup context
18
+ */
19
+ type ScopedProps<P> = P & {
20
+ /**
21
+ * Optional scope for the CheckboxGroup component
22
+ */
23
+ __scopeCheckboxGroup?: Context.Scope;
24
+ };
25
+
26
+ const [createCheckboxGroupContext, createCheckboxGroupScope] = Context.createContextScope(CHECKBOX_GROUP_NAME, [
27
+ RovingFocus.createRovingFocusGroupScope,
28
+ Checkbox.createCheckboxScope,
29
+ ]);
30
+
31
+ const useRovingFocusGroupScope = RovingFocus.createRovingFocusGroupScope();
32
+ const useCheckboxScope = Checkbox.createCheckboxScope();
33
+
34
+ /**
35
+ * Context values shared between CheckboxGroup components
36
+ */
37
+ interface CheckboxGroupContextValue {
38
+ /**
39
+ * Whether all checkbox items are disabled
40
+ */
41
+ disabled: boolean;
42
+
43
+ /**
44
+ * Function called when a checkbox item is checked
45
+ * @param value - The value of the checked item
46
+ */
47
+ onItemCheck: (value: string) => void;
48
+
49
+ /**
50
+ * Function called when a checkbox item is unchecked
51
+ * @param value - The value of the unchecked item
52
+ */
53
+ onItemUncheck: (value: string) => void;
54
+
55
+ /**
56
+ * Whether checkbox selection is required
57
+ */
58
+ required: boolean;
59
+
60
+ /**
61
+ * Optional name attribute for the checkbox group form field
62
+ */
63
+ name?: string;
64
+
65
+ /**
66
+ * Array of currently selected checkbox values
67
+ */
68
+ value?: Array<string>;
69
+ }
70
+
71
+ const [CheckboxGroupContextProvider, useCheckboxGroupContext] =
72
+ createCheckboxGroupContext<CheckboxGroupContextValue>(CHECKBOX_GROUP_NAME);
73
+
74
+ /* -----------------------------------------------------------------------------
75
+ * Component: CheckboxGroup
76
+ * --------------------------------------------------------------------------- */
77
+
78
+ /**
79
+ * Base props for the CheckboxGroup component
80
+ */
81
+ interface CheckboxGroupBaseProps {
82
+ /**
83
+ * Default values for the checkbox group when uncontrolled
84
+ */
85
+ defaultValue?: Array<string>;
86
+
87
+ /**
88
+ * Direction for roving focus navigation
89
+ */
90
+ dir?: RovingFocus.RovingFocusGroupProps["dir"];
91
+
92
+ /**
93
+ * Whether the entire checkbox group is disabled
94
+ */
95
+ disabled?: boolean;
96
+
97
+ /**
98
+ * Whether focus should loop to the start/end when reaching the boundaries
99
+ */
100
+ loop?: RovingFocus.RovingFocusGroupProps["loop"];
101
+
102
+ /**
103
+ * Name attribute for the checkbox group form field
104
+ */
105
+ name?: CheckboxGroupContextValue["name"];
106
+
107
+ /**
108
+ * Callback fired when the selected values change
109
+ * @param value - The new array of selected values
110
+ */
111
+ onValueChange?: (value?: Array<string>) => void;
112
+
113
+ /**
114
+ * Orientation of the checkbox group (horizontal or vertical)
115
+ */
116
+ orientation?: RovingFocus.RovingFocusGroupProps["orientation"];
117
+
118
+ /**
119
+ * Whether at least one checkbox must be selected
120
+ */
121
+ required?: boolean;
122
+
123
+ /**
124
+ * Controlled values for the checkbox group
125
+ */
126
+ value?: CheckboxGroupContextValue["value"];
127
+ }
128
+
129
+ /**
130
+ * Props for the CheckboxGroup component
131
+ *
132
+ * @since 0.3.16-canary.0
133
+ */
134
+ type CheckboxGroupProps = CheckboxGroupBaseProps & ComponentProps<"div">;
135
+
136
+ /**
137
+ * CheckboxGroup component that manages a group of checkboxes with roving focus
138
+ *
139
+ * @since 0.3.16-canary.0
140
+ */
141
+ function CheckboxGroup({
142
+ __scopeCheckboxGroup,
143
+ defaultValue,
144
+ dir,
145
+ disabled = false,
146
+ loop = true,
147
+ name,
148
+ onValueChange,
149
+ orientation,
150
+ required = false,
151
+ value: valueProperty,
152
+ ...props
153
+ }: ScopedProps<CheckboxGroupProps>): JSX.Element {
154
+ /**
155
+ * Context.Scope for the RovingFocusGroup component
156
+ */
157
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeCheckboxGroup);
158
+
159
+ /**
160
+ * Direction for layout and navigation
161
+ */
162
+ const direction = Direction.useDirection(dir);
163
+
164
+ /**
165
+ * State for managing selected checkbox values
166
+ */
167
+ const [value = [], setValue] = useControllableState<Array<string> | undefined>({
168
+ defaultProp: defaultValue,
169
+ onChange: onValueChange,
170
+ prop: valueProperty,
171
+ });
172
+
173
+ /**
174
+ * Handles checking a checkbox item
175
+ * @param itemValue - Value of the checkbox being checked
176
+ */
177
+ const handleItemCheck = useCallback(
178
+ (itemValue: string) => {
179
+ setValue((previousValue) => [...(previousValue ?? []), itemValue]);
180
+ },
181
+ [setValue],
182
+ );
183
+
184
+ /**
185
+ * Handles unchecking a checkbox item
186
+ * @param itemValue - Value of the checkbox being unchecked
187
+ */
188
+ const handleItemUncheck = useCallback(
189
+ (itemValue: string) => {
190
+ setValue((previousValue) => {
191
+ const currentValue = previousValue ?? [];
192
+
193
+ // If this is the last selected item and required=true, prevent unchecking
194
+ if (required && currentValue.length === 1 && currentValue[0] === itemValue) {
195
+ return currentValue; // Keep the current state
196
+ }
197
+
198
+ // Otherwise, proceed with unchecking
199
+ return currentValue.filter((inputValue) => inputValue !== itemValue);
200
+ });
201
+ },
202
+ [setValue, required],
203
+ );
204
+
205
+ return (
206
+ <CheckboxGroupContextProvider
207
+ disabled={disabled}
208
+ name={name}
209
+ required={required}
210
+ scope={__scopeCheckboxGroup}
211
+ value={value}
212
+ onItemCheck={handleItemCheck}
213
+ onItemUncheck={handleItemUncheck}
214
+ >
215
+ <RovingFocus.Root asChild {...rovingFocusGroupScope} dir={direction} loop={loop} orientation={orientation}>
216
+ <div data-disabled={disabled ? "" : undefined} dir={direction} role="group" {...props} />
217
+ </RovingFocus.Root>
218
+ </CheckboxGroupContextProvider>
219
+ );
220
+ }
221
+
222
+ /* -----------------------------------------------------------------------------
223
+ * Component: CheckboxGroupItem
224
+ * --------------------------------------------------------------------------- */
225
+ const ITEM_NAME = "CheckboxGroupItem";
226
+
227
+ /**
228
+ * Props for the CheckboxGroupItem component
229
+ *
230
+ * @since 0.3.16-canary.0
231
+ */
232
+ interface CheckboxGroupItemProps extends Omit<
233
+ ComponentProps<typeof CheckboxPrimitive.Root>,
234
+ "checked" | "defaultChecked" | "name" | "onCheckedChange"
235
+ > {
236
+ /**
237
+ * Value of the checkbox item, used to identify the item within the group
238
+ */
239
+ value: string;
240
+
241
+ /**
242
+ * Whether this specific checkbox item is disabled
243
+ */
244
+ disabled?: boolean;
245
+ }
246
+
247
+ /**
248
+ * Individual checkbox item within a CheckboxGroup
249
+ *
250
+ * @since 0.3.16-canary.0
251
+ */
252
+ function CheckboxGroupItem({
253
+ __scopeCheckboxGroup,
254
+ disabled,
255
+ ...props
256
+ }: ScopedProps<CheckboxGroupItemProps>): JSX.Element {
257
+ /**
258
+ * Context values from the parent CheckboxGroup
259
+ */
260
+ const context = useCheckboxGroupContext(ITEM_NAME, __scopeCheckboxGroup);
261
+
262
+ /**
263
+ * Combined disabled state from both context and props
264
+ */
265
+ const isDisabled = context.disabled || disabled;
266
+
267
+ /**
268
+ * Context.Scope for the RovingFocusGroup component
269
+ */
270
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeCheckboxGroup);
271
+
272
+ /**
273
+ * Context.Scope for the Checkbox component
274
+ */
275
+ const checkboxScope = useCheckboxScope(__scopeCheckboxGroup);
276
+
277
+ /**
278
+ * Whether this checkbox is currently checked
279
+ */
280
+ const checked = context.value?.includes(props.value);
281
+
282
+ return (
283
+ <RovingFocus.Item asChild {...rovingFocusGroupScope} active={checked} focusable={!isDisabled}>
284
+ <CheckboxPrimitive.Root
285
+ aria-label={props.value}
286
+ checked={checked}
287
+ disabled={isDisabled}
288
+ name={context.name}
289
+ required={context.required}
290
+ {...checkboxScope}
291
+ {...props}
292
+ onCheckedChange={(checkedState) => {
293
+ if (checkedState) {
294
+ context.onItemCheck(props.value);
295
+ } else {
296
+ context.onItemUncheck(props.value);
297
+ }
298
+ }}
299
+ />
300
+ </RovingFocus.Item>
301
+ );
302
+ }
303
+
304
+ /* -----------------------------------------------------------------------------
305
+ * Component: CheckboxGroupIndicator
306
+ * --------------------------------------------------------------------------- */
307
+
308
+ /**
309
+ * Props for the CheckboxGroupIndicator component
310
+ *
311
+ * @since 0.3.16-canary.0
312
+ */
313
+ type CheckboxGroupIndicatorProps = ComponentProps<typeof CheckboxPrimitive.Indicator>;
314
+
315
+ /**
316
+ * Visual indicator component for a CheckboxGroupItem
317
+ *
318
+ * @since 0.3.16-canary.0
319
+ */
320
+ function CheckboxGroupIndicator({
321
+ __scopeCheckboxGroup,
322
+ ...props
323
+ }: ScopedProps<CheckboxGroupIndicatorProps>): JSX.Element {
324
+ /**
325
+ * Context.Scope for the Checkbox component
326
+ */
327
+ const checkboxScope = useCheckboxScope(__scopeCheckboxGroup);
328
+
329
+ return <CheckboxPrimitive.Indicator {...checkboxScope} {...props} />;
330
+ }
331
+
332
+ /* -----------------------------------------------------------------------------
333
+ * Exports
334
+ * -------------------------------------------------------------------------- */
335
+
336
+ export {
337
+ CheckboxGroup,
338
+ CheckboxGroupIndicator,
339
+ CheckboxGroupItem,
340
+ createCheckboxGroupScope,
341
+ CheckboxGroupIndicator as Indicator,
342
+ CheckboxGroupItem as Item,
343
+ CheckboxGroup as Root,
344
+ };
345
+
346
+ export type { CheckboxGroupIndicatorProps, CheckboxGroupItemProps, CheckboxGroupProps };