@bigbinary/neeto-atoms 1.0.103 → 1.0.105

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 (278) hide show
  1. package/dist/{Avatar-ChF94Ken.js → Avatar-Dg5-X_dH.js} +8 -2
  2. package/dist/Avatar-Dg5-X_dH.js.map +1 -0
  3. package/dist/{Checkbox-DiAngQvO.js → Checkbox-BalUzegZ.js} +26 -7
  4. package/dist/Checkbox-BalUzegZ.js.map +1 -0
  5. package/dist/{Combobox-DriZMj4f.js → Combobox-NgubHftk.js} +2 -2
  6. package/dist/{Combobox-DriZMj4f.js.map → Combobox-NgubHftk.js.map} +1 -1
  7. package/dist/{DataTable-CwWARMEv.js → DataTable-mxDU-16D.js} +75 -55
  8. package/dist/DataTable-mxDU-16D.js.map +1 -0
  9. package/dist/{DatePicker-Uf_h3ohA.js → DatePicker-BoXx1Wve.js} +13 -4
  10. package/dist/DatePicker-BoXx1Wve.js.map +1 -0
  11. package/dist/{Dialog-D8C0-nEo.js → Dialog-Yw34WDqY.js} +2 -2
  12. package/dist/Dialog-Yw34WDqY.js.map +1 -0
  13. package/dist/{HelpIcon-CbnRiSjn.js → HelpIcon-xh488VXs.js} +11 -3
  14. package/dist/HelpIcon-xh488VXs.js.map +1 -0
  15. package/dist/{Input-CuIurquS.js → Input-W8foyOcS.js} +35 -7
  16. package/dist/Input-W8foyOcS.js.map +1 -0
  17. package/dist/{Label-DjOaTM4Q.js → Label-B-R4PNNq.js} +2 -2
  18. package/dist/{Label-DjOaTM4Q.js.map → Label-B-R4PNNq.js.map} +1 -1
  19. package/dist/{MultiEmailInput-BB334s4C.js → MultiEmailInput-Bzd2dPFC.js} +68 -25
  20. package/dist/MultiEmailInput-Bzd2dPFC.js.map +1 -0
  21. package/dist/{RadioGroup-CpgVdPzz.js → RadioGroup-CBXByAMW.js} +63 -34
  22. package/dist/RadioGroup-CBXByAMW.js.map +1 -0
  23. package/dist/{Select-YWCfd2p1.js → Select-ZWR0HFCa.js} +255 -94
  24. package/dist/Select-ZWR0HFCa.js.map +1 -0
  25. package/dist/{SelectFieldWrapper-D98IWsW5.js → SelectFieldWrapper-D370CD4o.js} +8 -1
  26. package/dist/SelectFieldWrapper-D370CD4o.js.map +1 -0
  27. package/dist/{Slider-Bokg8-oi.js → Slider-CxQdlyHZ.js} +32 -7
  28. package/dist/Slider-CxQdlyHZ.js.map +1 -0
  29. package/dist/{Stepper-DO7EBWYL.js → Stepper-GK8gDn-s.js} +2 -1
  30. package/dist/Stepper-GK8gDn-s.js.map +1 -0
  31. package/dist/{Switch-Am2l2UdV.js → Switch-C9fqpoNR.js} +16 -2
  32. package/dist/Switch-C9fqpoNR.js.map +1 -0
  33. package/dist/{Tabs-ModAabFc.js → Tabs-DaXiF_67.js} +3 -3
  34. package/dist/Tabs-DaXiF_67.js.map +1 -0
  35. package/dist/{Textarea-CMGZZ4rL.js → Textarea-CUe09-sr.js} +34 -7
  36. package/dist/Textarea-CUe09-sr.js.map +1 -0
  37. package/dist/{TimePicker-Ca7iF-a_.js → TimePicker-BixF9wdU.js} +21 -4
  38. package/dist/TimePicker-BixF9wdU.js.map +1 -0
  39. package/dist/{Toastr-Cka6pudu.js → Toastr-CXqmoXjn.js} +9 -2
  40. package/dist/Toastr-CXqmoXjn.js.map +1 -0
  41. package/dist/{TreeSelect-wYDOZ5yD.js → TreeSelect-rrTHwY42.js} +3 -2
  42. package/dist/TreeSelect-rrTHwY42.js.map +1 -0
  43. package/dist/cjs/{Avatar-DGuMcBnh.js → Avatar-D2k6WnzD.js} +8 -2
  44. package/dist/cjs/Avatar-D2k6WnzD.js.map +1 -0
  45. package/dist/cjs/{Checkbox-7lX2aMKA.js → Checkbox-83g1FDsc.js} +26 -7
  46. package/dist/cjs/Checkbox-83g1FDsc.js.map +1 -0
  47. package/dist/cjs/{Combobox-BE8LT4yq.js → Combobox-PAGcNUr6.js} +2 -2
  48. package/dist/cjs/{Combobox-BE8LT4yq.js.map → Combobox-PAGcNUr6.js.map} +1 -1
  49. package/dist/cjs/{DataTable-ChgPVrRB.js → DataTable-OtA15NKE.js} +75 -55
  50. package/dist/cjs/DataTable-OtA15NKE.js.map +1 -0
  51. package/dist/cjs/{DatePicker-Czp9QLy0.js → DatePicker-DtmJ-VkV.js} +13 -4
  52. package/dist/cjs/DatePicker-DtmJ-VkV.js.map +1 -0
  53. package/dist/cjs/{Dialog-DNv7j7ts.js → Dialog-ZUHGaoAE.js} +2 -2
  54. package/dist/cjs/Dialog-ZUHGaoAE.js.map +1 -0
  55. package/dist/cjs/{HelpIcon-QpZY6Zmc.js → HelpIcon-BF1ePUQf.js} +11 -3
  56. package/dist/cjs/HelpIcon-BF1ePUQf.js.map +1 -0
  57. package/dist/cjs/{Input-lWo0YoZ9.js → Input-DIq7T9D0.js} +35 -7
  58. package/dist/cjs/Input-DIq7T9D0.js.map +1 -0
  59. package/dist/cjs/{Label-D8RFE9hd.js → Label-CpsdGBV8.js} +2 -2
  60. package/dist/cjs/{Label-D8RFE9hd.js.map → Label-CpsdGBV8.js.map} +1 -1
  61. package/dist/cjs/{MultiEmailInput-BlIqzq-o.js → MultiEmailInput-FNRR9b74.js} +68 -25
  62. package/dist/cjs/MultiEmailInput-FNRR9b74.js.map +1 -0
  63. package/dist/cjs/{RadioGroup-DCEw94Dk.js → RadioGroup-B-u8rdbf.js} +63 -34
  64. package/dist/cjs/RadioGroup-B-u8rdbf.js.map +1 -0
  65. package/dist/cjs/{Select-Bs5Fp3wj.js → Select-VQCROyX1.js} +258 -97
  66. package/dist/cjs/Select-VQCROyX1.js.map +1 -0
  67. package/dist/cjs/{SelectFieldWrapper-BLVvwUcK.js → SelectFieldWrapper-CIh_atln.js} +8 -1
  68. package/dist/cjs/SelectFieldWrapper-CIh_atln.js.map +1 -0
  69. package/dist/cjs/{Slider-CRmd_VMs.js → Slider-DIUSlx_m.js} +32 -7
  70. package/dist/cjs/Slider-DIUSlx_m.js.map +1 -0
  71. package/dist/cjs/{Stepper-BtZG_XmC.js → Stepper-BZBdL6JW.js} +2 -1
  72. package/dist/cjs/Stepper-BZBdL6JW.js.map +1 -0
  73. package/dist/cjs/{Switch-DY7bdiEz.js → Switch-BbRK3HUZ.js} +16 -2
  74. package/dist/cjs/Switch-BbRK3HUZ.js.map +1 -0
  75. package/dist/cjs/{Tabs-CA0QAWp0.js → Tabs-BQl63Ewe.js} +3 -3
  76. package/dist/cjs/Tabs-BQl63Ewe.js.map +1 -0
  77. package/dist/cjs/{Textarea-Cw7Uea82.js → Textarea-bxleSw86.js} +34 -7
  78. package/dist/cjs/Textarea-bxleSw86.js.map +1 -0
  79. package/dist/cjs/{TimePicker-DW7OM3IE.js → TimePicker-lJ2985nh.js} +21 -4
  80. package/dist/cjs/TimePicker-lJ2985nh.js.map +1 -0
  81. package/dist/cjs/{Toastr-E0yLh_MW.js → Toastr-9DXjD-Mq.js} +9 -2
  82. package/dist/cjs/Toastr-9DXjD-Mq.js.map +1 -0
  83. package/dist/cjs/{TreeSelect-C9BSJt1d.js → TreeSelect-DDQx8FPS.js} +3 -2
  84. package/dist/cjs/TreeSelect-DDQx8FPS.js.map +1 -0
  85. package/dist/cjs/components/Avatar.js +1 -1
  86. package/dist/cjs/components/Checkbox.js +4 -2
  87. package/dist/cjs/components/Checkbox.js.map +1 -1
  88. package/dist/cjs/components/DataTable.js +2 -1
  89. package/dist/cjs/components/DataTable.js.map +1 -1
  90. package/dist/cjs/components/DatePicker.js +4 -2
  91. package/dist/cjs/components/DatePicker.js.map +1 -1
  92. package/dist/cjs/components/Dialog.js +1 -1
  93. package/dist/cjs/components/DropdownMenu.js +3 -1
  94. package/dist/cjs/components/DropdownMenu.js.map +1 -1
  95. package/dist/cjs/components/Input.js +4 -2
  96. package/dist/cjs/components/Input.js.map +1 -1
  97. package/dist/cjs/components/Label.js +2 -2
  98. package/dist/cjs/components/MultiEmailInput.js +4 -2
  99. package/dist/cjs/components/MultiEmailInput.js.map +1 -1
  100. package/dist/cjs/components/RadioGroup.js +4 -2
  101. package/dist/cjs/components/RadioGroup.js.map +1 -1
  102. package/dist/cjs/components/Select.js +7 -6
  103. package/dist/cjs/components/Select.js.map +1 -1
  104. package/dist/cjs/components/Slider.js +4 -2
  105. package/dist/cjs/components/Slider.js.map +1 -1
  106. package/dist/cjs/components/Stepper.js +1 -1
  107. package/dist/cjs/components/Switch.js +4 -2
  108. package/dist/cjs/components/Switch.js.map +1 -1
  109. package/dist/cjs/components/Tabs.js +2 -2
  110. package/dist/cjs/components/Textarea.js +4 -2
  111. package/dist/cjs/components/Textarea.js.map +1 -1
  112. package/dist/cjs/components/TimePicker.js +4 -2
  113. package/dist/cjs/components/TimePicker.js.map +1 -1
  114. package/dist/cjs/components/Toastr.js +1 -1
  115. package/dist/cjs/components/TreeSelect.js +3 -3
  116. package/dist/cjs/components/index.js +23 -22
  117. package/dist/cjs/components/index.js.map +1 -1
  118. package/dist/cjs/fieldIds-DiVU6GVS.js +14 -0
  119. package/dist/cjs/fieldIds-DiVU6GVS.js.map +1 -0
  120. package/dist/cjs/formik/BlockNavigation.js +1 -1
  121. package/dist/cjs/formik/Checkbox.js +4 -2
  122. package/dist/cjs/formik/Checkbox.js.map +1 -1
  123. package/dist/cjs/formik/Input.js +4 -2
  124. package/dist/cjs/formik/Input.js.map +1 -1
  125. package/dist/cjs/formik/MultiEmailInput.js +4 -2
  126. package/dist/cjs/formik/MultiEmailInput.js.map +1 -1
  127. package/dist/cjs/formik/RadioGroup.js +4 -2
  128. package/dist/cjs/formik/RadioGroup.js.map +1 -1
  129. package/dist/cjs/formik/Select.js +7 -6
  130. package/dist/cjs/formik/Select.js.map +1 -1
  131. package/dist/cjs/formik/Slider.js +4 -2
  132. package/dist/cjs/formik/Slider.js.map +1 -1
  133. package/dist/cjs/formik/Switch.js +4 -2
  134. package/dist/cjs/formik/Switch.js.map +1 -1
  135. package/dist/cjs/formik/Textarea.js +4 -2
  136. package/dist/cjs/formik/Textarea.js.map +1 -1
  137. package/dist/cjs/formik/TreeSelect.js +3 -3
  138. package/dist/cjs/formik/index.js +16 -15
  139. package/dist/cjs/formik/index.js.map +1 -1
  140. package/dist/cjs/hyphenize-BTrVNVv3.js +13 -0
  141. package/dist/cjs/hyphenize-BTrVNVv3.js.map +1 -0
  142. package/dist/cjs/index.js +23 -22
  143. package/dist/cjs/index.js.map +1 -1
  144. package/dist/cjs/primitives/AlertDialog.js +6 -38
  145. package/dist/cjs/primitives/AlertDialog.js.map +1 -1
  146. package/dist/cjs/primitives/Combobox.js +2 -2
  147. package/dist/cjs/primitives/Field.js +1 -1
  148. package/dist/cjs/primitives/index.js +2 -2
  149. package/dist/components/Avatar.js +1 -1
  150. package/dist/components/Checkbox/Checkbox.d.ts +2 -0
  151. package/dist/components/Checkbox.js +4 -2
  152. package/dist/components/Checkbox.js.map +1 -1
  153. package/dist/components/DataTable.js +2 -1
  154. package/dist/components/DataTable.js.map +1 -1
  155. package/dist/components/DatePicker/DatePickerField.d.ts +1 -0
  156. package/dist/components/DatePicker/DatePickerTrigger.d.ts +1 -0
  157. package/dist/components/DatePicker/types.d.ts +2 -0
  158. package/dist/components/DatePicker.js +4 -2
  159. package/dist/components/DatePicker.js.map +1 -1
  160. package/dist/components/Dialog.js +1 -1
  161. package/dist/components/DropdownMenu.js +3 -1
  162. package/dist/components/DropdownMenu.js.map +1 -1
  163. package/dist/components/Input/Input.d.ts +2 -0
  164. package/dist/components/Input.js +4 -2
  165. package/dist/components/Input.js.map +1 -1
  166. package/dist/components/Label.js +2 -2
  167. package/dist/components/MultiEmailInput/types.d.ts +2 -0
  168. package/dist/components/MultiEmailInput.js +4 -2
  169. package/dist/components/MultiEmailInput.js.map +1 -1
  170. package/dist/components/RadioGroup/RadioGroup.d.ts +4 -0
  171. package/dist/components/RadioGroup.js +4 -2
  172. package/dist/components/RadioGroup.js.map +1 -1
  173. package/dist/components/Select/MultiSelectCombobox.types.d.ts +6 -0
  174. package/dist/components/Select/SelectAnchor.d.ts +19 -1
  175. package/dist/components/Select/SelectCombobox.types.d.ts +12 -2
  176. package/dist/components/Select/SelectFieldWrapper.d.ts +7 -1
  177. package/dist/components/Select/constants.d.ts +1 -0
  178. package/dist/components/Select/hooks/useCreatableItems.d.ts +3 -1
  179. package/dist/components/Select/hooks/useMultiSelectState.d.ts +8 -2
  180. package/dist/components/Select/hooks/useSelectState.d.ts +8 -2
  181. package/dist/components/Select/types.d.ts +23 -0
  182. package/dist/components/Select/utils.d.ts +13 -0
  183. package/dist/components/Select.js +7 -6
  184. package/dist/components/Select.js.map +1 -1
  185. package/dist/components/Slider/Slider.d.ts +2 -0
  186. package/dist/components/Slider.js +4 -2
  187. package/dist/components/Slider.js.map +1 -1
  188. package/dist/components/Stepper.js +1 -1
  189. package/dist/components/Switch/Switch.d.ts +2 -0
  190. package/dist/components/Switch.js +4 -2
  191. package/dist/components/Switch.js.map +1 -1
  192. package/dist/components/Tabs.js +2 -2
  193. package/dist/components/Textarea/Textarea.d.ts +2 -0
  194. package/dist/components/Textarea.js +4 -2
  195. package/dist/components/Textarea.js.map +1 -1
  196. package/dist/components/TimePicker/types.d.ts +2 -0
  197. package/dist/components/TimePicker.js +4 -2
  198. package/dist/components/TimePicker.js.map +1 -1
  199. package/dist/components/Toastr.js +1 -1
  200. package/dist/components/TreeSelect.js +3 -3
  201. package/dist/components/index.js +23 -22
  202. package/dist/components/index.js.map +1 -1
  203. package/dist/fieldIds-VpluAAMl.js +11 -0
  204. package/dist/fieldIds-VpluAAMl.js.map +1 -0
  205. package/dist/formik/BlockNavigation.js +1 -1
  206. package/dist/formik/Checkbox.js +4 -2
  207. package/dist/formik/Checkbox.js.map +1 -1
  208. package/dist/formik/Input.js +4 -2
  209. package/dist/formik/Input.js.map +1 -1
  210. package/dist/formik/MultiEmailInput.js +4 -2
  211. package/dist/formik/MultiEmailInput.js.map +1 -1
  212. package/dist/formik/RadioGroup.js +4 -2
  213. package/dist/formik/RadioGroup.js.map +1 -1
  214. package/dist/formik/Select.js +7 -6
  215. package/dist/formik/Select.js.map +1 -1
  216. package/dist/formik/Slider.js +4 -2
  217. package/dist/formik/Slider.js.map +1 -1
  218. package/dist/formik/Switch.js +4 -2
  219. package/dist/formik/Switch.js.map +1 -1
  220. package/dist/formik/Textarea.js +4 -2
  221. package/dist/formik/Textarea.js.map +1 -1
  222. package/dist/formik/TreeSelect.js +3 -3
  223. package/dist/formik/index.js +16 -15
  224. package/dist/formik/index.js.map +1 -1
  225. package/dist/hyphenize-TRhMI0tl.js +11 -0
  226. package/dist/hyphenize-TRhMI0tl.js.map +1 -0
  227. package/dist/index.js +23 -22
  228. package/dist/index.js.map +1 -1
  229. package/dist/primitives/AlertDialog.js +6 -38
  230. package/dist/primitives/AlertDialog.js.map +1 -1
  231. package/dist/primitives/Combobox.js +2 -2
  232. package/dist/primitives/Field.js +1 -1
  233. package/dist/primitives/index.js +2 -2
  234. package/dist/utils/fieldIds.d.ts +1 -1
  235. package/dist/utils/hyphenize.d.ts +1 -1
  236. package/package.json +1 -1
  237. package/dist/Avatar-ChF94Ken.js.map +0 -1
  238. package/dist/Checkbox-DiAngQvO.js.map +0 -1
  239. package/dist/DataTable-CwWARMEv.js.map +0 -1
  240. package/dist/DatePicker-Uf_h3ohA.js.map +0 -1
  241. package/dist/Dialog-D8C0-nEo.js.map +0 -1
  242. package/dist/HelpIcon-CbnRiSjn.js.map +0 -1
  243. package/dist/Input-CuIurquS.js.map +0 -1
  244. package/dist/MultiEmailInput-BB334s4C.js.map +0 -1
  245. package/dist/RadioGroup-CpgVdPzz.js.map +0 -1
  246. package/dist/Select-YWCfd2p1.js.map +0 -1
  247. package/dist/SelectFieldWrapper-D98IWsW5.js.map +0 -1
  248. package/dist/Slider-Bokg8-oi.js.map +0 -1
  249. package/dist/Stepper-DO7EBWYL.js.map +0 -1
  250. package/dist/Switch-Am2l2UdV.js.map +0 -1
  251. package/dist/Tabs-ModAabFc.js.map +0 -1
  252. package/dist/Textarea-CMGZZ4rL.js.map +0 -1
  253. package/dist/TimePicker-Ca7iF-a_.js.map +0 -1
  254. package/dist/Toastr-Cka6pudu.js.map +0 -1
  255. package/dist/TreeSelect-wYDOZ5yD.js.map +0 -1
  256. package/dist/cjs/Avatar-DGuMcBnh.js.map +0 -1
  257. package/dist/cjs/Checkbox-7lX2aMKA.js.map +0 -1
  258. package/dist/cjs/DataTable-ChgPVrRB.js.map +0 -1
  259. package/dist/cjs/DatePicker-Czp9QLy0.js.map +0 -1
  260. package/dist/cjs/Dialog-DNv7j7ts.js.map +0 -1
  261. package/dist/cjs/HelpIcon-QpZY6Zmc.js.map +0 -1
  262. package/dist/cjs/Input-lWo0YoZ9.js.map +0 -1
  263. package/dist/cjs/MultiEmailInput-BlIqzq-o.js.map +0 -1
  264. package/dist/cjs/RadioGroup-DCEw94Dk.js.map +0 -1
  265. package/dist/cjs/Select-Bs5Fp3wj.js.map +0 -1
  266. package/dist/cjs/SelectFieldWrapper-BLVvwUcK.js.map +0 -1
  267. package/dist/cjs/Slider-CRmd_VMs.js.map +0 -1
  268. package/dist/cjs/Stepper-BtZG_XmC.js.map +0 -1
  269. package/dist/cjs/Switch-DY7bdiEz.js.map +0 -1
  270. package/dist/cjs/Tabs-CA0QAWp0.js.map +0 -1
  271. package/dist/cjs/Textarea-Cw7Uea82.js.map +0 -1
  272. package/dist/cjs/TimePicker-DW7OM3IE.js.map +0 -1
  273. package/dist/cjs/Toastr-E0yLh_MW.js.map +0 -1
  274. package/dist/cjs/TreeSelect-C9BSJt1d.js.map +0 -1
  275. package/dist/cjs/hyphenize-B8IGPzjp.js +0 -8
  276. package/dist/cjs/hyphenize-B8IGPzjp.js.map +0 -1
  277. package/dist/hyphenize-BU4K8zjb.js +0 -6
  278. package/dist/hyphenize-BU4K8zjb.js.map +0 -1
@@ -2,6 +2,8 @@ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useState, useCallback, useMemo, forwardRef, useId } from 'react';
3
3
  import { c as cn } from './utils-BJnb9o5c.js';
4
4
  import { Field, FieldLabel, FieldContent } from './primitives/Field.js';
5
+ import { b as buildTestIdPrefix } from './fieldIds-VpluAAMl.js';
6
+ import { h as hyphenize } from './hyphenize-TRhMI0tl.js';
5
7
  import { w as withIconSize } from './withIconSize-BonoFXeH.js';
6
8
  import { X } from './x-_o2T3n6D.js';
7
9
 
@@ -149,9 +151,11 @@ const MultiEmailInput = forwardRef((props, ref) => {
149
151
  prefix,
150
152
  suffix,
151
153
  labelProps,
152
- className
154
+ className,
155
+ dataTestId
153
156
  } = props;
154
157
  const id = useId();
158
+ const testIdPrefix = buildTestIdPrefix(dataTestId, label);
155
159
  const {
156
160
  isCounterVisible,
157
161
  validCount,
@@ -175,19 +179,35 @@ const MultiEmailInput = forwardRef((props, ref) => {
175
179
  "data-testid": "email-input-wrapper",
176
180
  children: [
177
181
  (label || isCounterVisible) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
178
- label && /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: id, ...labelProps, children: [
179
- label,
180
- required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: " *" })
181
- ] }),
182
- isCounterVisible && /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground", children: [
183
- validCount,
184
- " ",
185
- typeof counter === "object" && counter?.label ? counter.label : pluralizeEmail(validCount)
186
- ] })
182
+ label && /* @__PURE__ */ jsxs(
183
+ FieldLabel,
184
+ {
185
+ htmlFor: id,
186
+ "data-testid": `${testIdPrefix}-input-label`,
187
+ ...labelProps,
188
+ children: [
189
+ label,
190
+ required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: " *" })
191
+ ]
192
+ }
193
+ ),
194
+ isCounterVisible && /* @__PURE__ */ jsxs(
195
+ "span",
196
+ {
197
+ className: "text-xs text-muted-foreground",
198
+ "data-testid": `${testIdPrefix}-email-counter`,
199
+ children: [
200
+ validCount,
201
+ " ",
202
+ typeof counter === "object" && counter?.label ? counter.label : pluralizeEmail(validCount)
203
+ ]
204
+ }
205
+ )
187
206
  ] }),
188
207
  /* @__PURE__ */ jsxs(
189
208
  "div",
190
209
  {
210
+ "data-testid": "multi-email-select-container",
191
211
  className: cn(
192
212
  CHIPS_CONTAINER,
193
213
  !!error && CHIPS_ERROR,
@@ -207,6 +227,7 @@ const MultiEmailInput = forwardRef((props, ref) => {
207
227
  {
208
228
  type: "button",
209
229
  tabIndex: -1,
230
+ "data-testid": `${hyphenize(email.label)}-remove-icon`,
210
231
  className: "-ms-0.5 rounded-xs opacity-50 hover:opacity-100",
211
232
  onMouseDown: (e) => e.preventDefault(),
212
233
  onClick: () => handleChipRemove(email.value),
@@ -229,6 +250,7 @@ const MultiEmailInput = forwardRef((props, ref) => {
229
250
  ref,
230
251
  id,
231
252
  type: "text",
253
+ "data-testid": "email-select-input-field",
232
254
  value: inputValue,
233
255
  onChange: (e) => setInputValue(e.target.value),
234
256
  onKeyDown: handleKeyDown,
@@ -245,20 +267,41 @@ const MultiEmailInput = forwardRef((props, ref) => {
245
267
  }
246
268
  ),
247
269
  /* @__PURE__ */ jsxs(FieldContent, { children: [
248
- !!error && /* @__PURE__ */ jsxs("p", { className: "text-[0.8rem] text-destructive", children: [
249
- error,
250
- isFilterLinkVisible && /* @__PURE__ */ jsx(
251
- "button",
252
- {
253
- type: "button",
254
- className: "ml-1 cursor-pointer font-semibold underline",
255
- onClick: handleFilterInvalidEmails,
256
- children: filterInvalidEmails?.label ?? "Click here to remove invalid emails."
257
- }
258
- )
259
- ] }),
260
- !!helpText && /* @__PURE__ */ jsx("p", { className: "text-[0.8rem] text-muted-foreground", children: helpText }),
261
- duplicateEmails.length > 0 && /* @__PURE__ */ jsx("p", { className: "text-[0.8rem] text-amber-600 dark:text-amber-400", children: formatDuplicateWarning(duplicateEmails) })
270
+ !!error && /* @__PURE__ */ jsxs(
271
+ "p",
272
+ {
273
+ className: "text-[0.8rem] text-destructive",
274
+ "data-testid": `${testIdPrefix}-input-error`,
275
+ children: [
276
+ error,
277
+ isFilterLinkVisible && /* @__PURE__ */ jsx(
278
+ "button",
279
+ {
280
+ type: "button",
281
+ className: "ml-1 cursor-pointer font-semibold underline",
282
+ onClick: handleFilterInvalidEmails,
283
+ children: filterInvalidEmails?.label ?? "Click here to remove invalid emails."
284
+ }
285
+ )
286
+ ]
287
+ }
288
+ ),
289
+ !!helpText && /* @__PURE__ */ jsx(
290
+ "p",
291
+ {
292
+ className: "text-[0.8rem] text-muted-foreground",
293
+ "data-testid": `${testIdPrefix}-input-help`,
294
+ children: helpText
295
+ }
296
+ ),
297
+ duplicateEmails.length > 0 && /* @__PURE__ */ jsx(
298
+ "p",
299
+ {
300
+ className: "text-[0.8rem] text-amber-600 dark:text-amber-400",
301
+ "data-testid": `${testIdPrefix}-duplicate-emails-warning`,
302
+ children: formatDuplicateWarning(duplicateEmails)
303
+ }
304
+ )
262
305
  ] })
263
306
  ]
264
307
  }
@@ -267,4 +310,4 @@ const MultiEmailInput = forwardRef((props, ref) => {
267
310
  MultiEmailInput.displayName = "MultiEmailInput";
268
311
 
269
312
  export { MultiEmailInput as M };
270
- //# sourceMappingURL=MultiEmailInput-BB334s4C.js.map
313
+ //# sourceMappingURL=MultiEmailInput-Bzd2dPFC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiEmailInput-Bzd2dPFC.js","sources":["../src/components/MultiEmailInput/constants.ts","../src/components/MultiEmailInput/utils.ts","../src/components/MultiEmailInput/useMultiEmailState.ts","../src/components/MultiEmailInput/MultiEmailInput.tsx"],"sourcesContent":["export const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9-]+(?:\\.[A-Z0-9-]+)*\\.[A-Z]{2,}$/i;\n\nexport const UNSTRICT_EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/g;\n\nexport const EMAIL_SEPARATION_REGEX = /[^\\s,]+/g;\n","import { EMAIL_REGEX } from \"./constants\";\nimport type { EmailValue } from \"./types\";\n\nexport const formatEmailInputOption = (email: string): EmailValue => ({\n label: email,\n value: email,\n valid: EMAIL_REGEX.test(email),\n});\n\nexport const pruneDuplicates = (\n existing: EmailValue[],\n newEmailStrings: string[]\n): { uniqueEmails: EmailValue[]; duplicates: string[] } => {\n const seen = new Set(existing.map(e => e.value.toLowerCase()));\n const duplicates: string[] = [];\n const added: EmailValue[] = [];\n\n for (const emailStr of newEmailStrings) {\n const lower = emailStr.toLowerCase();\n if (seen.has(lower)) {\n duplicates.push(emailStr);\n } else {\n seen.add(lower);\n added.push(formatEmailInputOption(emailStr));\n }\n }\n\n return { uniqueEmails: [...existing, ...added], duplicates };\n};\n\nexport const filterValidEmails = (emails: EmailValue[]): EmailValue[] =>\n emails.filter(email => email.valid);\n\nexport const pluralizeEmail = (count: number): string =>\n count === 1 ? \"email\" : \"emails\";\n\nexport const formatDuplicateWarning = (duplicates: string[]): string => {\n const count = duplicates.length;\n\n return `Removed ${count} duplicate ${pluralizeEmail(count)} from the list: ${duplicates.join(\", \")}`;\n};\n","import { useState, useCallback, useMemo } from \"react\";\n\nimport { UNSTRICT_EMAIL_REGEX, EMAIL_SEPARATION_REGEX } from \"./constants\";\nimport { pruneDuplicates, filterValidEmails } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nexport function useMultiEmailState(props: MultiEmailInputProps) {\n const {\n value = [],\n onChange,\n onBlur,\n visibleEmailsCount = 3,\n isAlwaysExpanded = false,\n counter,\n filterInvalidEmails,\n } = props;\n\n const [inputValue, setInputValue] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [duplicateEmails, setDuplicateEmails] = useState<string[]>([]);\n\n const addEmails = useCallback(\n (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) return;\n UNSTRICT_EMAIL_REGEX.lastIndex = 0;\n EMAIL_SEPARATION_REGEX.lastIndex = 0;\n const emailMatches =\n trimmed.match(UNSTRICT_EMAIL_REGEX) ||\n trimmed.match(EMAIL_SEPARATION_REGEX) ||\n [];\n if (emailMatches.length === 0) return;\n const { uniqueEmails, duplicates } = pruneDuplicates(value, emailMatches);\n onChange?.(uniqueEmails);\n setDuplicateEmails(duplicates);\n setInputValue(\"\");\n },\n [value, onChange]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (!inputValue && event.key === \"Backspace\" && value.length > 0) {\n onChange?.(value.slice(0, -1));\n return;\n }\n if (!inputValue) return;\n if ([\"Enter\", \"Tab\", \",\", \" \"].includes(event.key)) {\n addEmails(inputValue);\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [inputValue, value, onChange, addEmails]\n );\n\n const handlePaste = useCallback(\n (event: React.ClipboardEvent<HTMLInputElement>) => {\n const text = event.clipboardData.getData(\"text\");\n if (!text) return;\n event.preventDefault();\n addEmails(text);\n },\n [addEmails]\n );\n\n const handleBlur = useCallback(() => {\n if (inputValue) {\n addEmails(inputValue);\n } else {\n onBlur?.();\n }\n setIsFocused(false);\n setDuplicateEmails([]);\n }, [inputValue, addEmails, onBlur]);\n\n const handleFocus = useCallback(() => setIsFocused(true), []);\n\n const handleChipRemove = useCallback(\n (emailValue: string) =>\n onChange?.(value.filter(e => e.value !== emailValue)),\n [value, onChange]\n );\n\n const handleFilterInvalidEmails = useCallback(\n () => onChange?.(filterValidEmails(value)),\n [value, onChange]\n );\n\n const validCount = useMemo(() => value.filter(e => e.valid).length, [value]);\n const isCounterVisible =\n !!counter &&\n (typeof counter === \"boolean\" ||\n !counter.startsFrom ||\n validCount >= counter.startsFrom);\n const shouldCollapse =\n !isAlwaysExpanded && !isFocused && value.length > visibleEmailsCount;\n const visibleEmails = shouldCollapse\n ? value.slice(0, visibleEmailsCount)\n : value;\n const hiddenCount = shouldCollapse ? value.length - visibleEmailsCount : 0;\n const isFilterLinkVisible =\n !!filterInvalidEmails && value.length > validCount;\n\n return {\n inputValue,\n setInputValue,\n isFocused,\n duplicateEmails,\n handleKeyDown,\n handlePaste,\n handleBlur,\n handleFocus,\n handleChipRemove,\n handleFilterInvalidEmails,\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n isFilterLinkVisible,\n };\n}\n","import { forwardRef, useId } from \"react\";\nimport { XIcon } from \"lucide-react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { Field, FieldLabel, FieldContent } from \"src/primitives/Field\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { hyphenize } from \"src/utils/hyphenize\";\nimport { withIconSize } from \"src/utils/withIconSize\";\nimport { useMultiEmailState } from \"./useMultiEmailState\";\nimport { pluralizeEmail, formatDuplicateWarning } from \"./utils\";\nimport type { MultiEmailInputProps } from \"./types\";\n\nconst CHIP_BASE =\n \"flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground\";\nconst CHIP_INVALID =\n \"border border-destructive text-destructive bg-destructive/10\";\nconst CHIPS_CONTAINER =\n \"flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-base md:text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\";\nconst CHIPS_ERROR =\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\";\n\nexport const MultiEmailInput = forwardRef<\n HTMLInputElement,\n MultiEmailInputProps\n>((props, ref) => {\n const {\n label,\n placeholder = \"\",\n helpText,\n error,\n disabled = false,\n required = false,\n maxHeight = 200,\n counter,\n filterInvalidEmails,\n prefix,\n suffix,\n labelProps,\n className,\n dataTestId,\n } = props;\n const id = useId();\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n const {\n isCounterVisible,\n validCount,\n visibleEmails,\n hiddenCount,\n inputValue,\n setInputValue,\n handleKeyDown,\n handlePaste,\n handleFocus,\n handleBlur,\n handleChipRemove,\n isFilterLinkVisible,\n handleFilterInvalidEmails,\n duplicateEmails,\n } = useMultiEmailState(props);\n\n return (\n <Field\n className={cn(\"flex flex-col gap-1.5\", className)}\n data-testid=\"email-input-wrapper\"\n >\n {(label || isCounterVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel\n htmlFor={id}\n data-testid={`${testIdPrefix}-input-label`}\n {...labelProps}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n {\" *\"}\n </span>\n )}\n </FieldLabel>\n )}\n {isCounterVisible && (\n <span\n className=\"text-xs text-muted-foreground\"\n data-testid={`${testIdPrefix}-email-counter`}\n >\n {validCount}{\" \"}\n {typeof counter === \"object\" && counter?.label\n ? counter.label\n : pluralizeEmail(validCount)}\n </span>\n )}\n </div>\n )}\n <div\n data-testid=\"multi-email-select-container\"\n className={cn(\n CHIPS_CONTAINER,\n !!error && CHIPS_ERROR,\n disabled && \"pointer-events-none opacity-50\"\n )}\n style={{ maxHeight: `${maxHeight}px`, overflowY: \"auto\" }}\n >\n {prefix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(prefix, \"size-4\")}\n </div>\n )}\n {visibleEmails.map(email => (\n <span\n key={email.value}\n className={cn(CHIP_BASE, !email.valid && CHIP_INVALID)}\n >\n {email.label}\n {!disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n data-testid={`${hyphenize(email.label)}-remove-icon`}\n className=\"-ms-0.5 rounded-xs opacity-50 hover:opacity-100\"\n onMouseDown={e => e.preventDefault()}\n onClick={() => handleChipRemove(email.value)}\n aria-label={`Remove ${email.label}`}\n >\n <XIcon className=\"size-3 pointer-events-none\" />\n </button>\n )}\n </span>\n ))}\n {hiddenCount > 0 && (\n <span className=\"flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground\">\n +{hiddenCount} more\n </span>\n )}\n <input\n ref={ref}\n id={id}\n type=\"text\"\n data-testid=\"email-select-input-field\"\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={props.value?.length ? \"\" : placeholder}\n disabled={disabled}\n className=\"min-w-16 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm\"\n />\n {suffix && (\n <div className=\"shrink-0 text-muted-foreground\">\n {withIconSize(suffix, \"size-4\")}\n </div>\n )}\n </div>\n <FieldContent>\n {!!error && (\n <p\n className=\"text-[0.8rem] text-destructive\"\n data-testid={`${testIdPrefix}-input-error`}\n >\n {error}\n {isFilterLinkVisible && (\n <button\n type=\"button\"\n className=\"ml-1 cursor-pointer font-semibold underline\"\n onClick={handleFilterInvalidEmails}\n >\n {filterInvalidEmails?.label ??\n \"Click here to remove invalid emails.\"}\n </button>\n )}\n </p>\n )}\n {!!helpText && (\n <p\n className=\"text-[0.8rem] text-muted-foreground\"\n data-testid={`${testIdPrefix}-input-help`}\n >\n {helpText}\n </p>\n )}\n {duplicateEmails.length > 0 && (\n <p\n className=\"text-[0.8rem] text-amber-600 dark:text-amber-400\"\n data-testid={`${testIdPrefix}-duplicate-emails-warning`}\n >\n {formatDuplicateWarning(duplicateEmails)}\n </p>\n )}\n </FieldContent>\n </Field>\n );\n});\nMultiEmailInput.displayName = \"MultiEmailInput\";\n"],"names":["XIcon"],"mappings":"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"}
@@ -4,39 +4,52 @@ import { c as cn } from './utils-BJnb9o5c.js';
4
4
  import { RadioGroupItem as RadioGroupItem$1, RadioGroup as RadioGroup$1 } from './primitives/RadioGroup.js';
5
5
  import { Label } from './primitives/Label.js';
6
6
  import { FieldDescription, Field, FieldLabel, FieldContent, FieldError } from './primitives/Field.js';
7
+ import { b as buildTestIdPrefix } from './fieldIds-VpluAAMl.js';
7
8
 
8
- const RadioGroupItem = forwardRef(({ label, helpText, value, className, id: idProp, ...props }, ref) => {
9
- const generatedId = useId();
10
- const id = idProp ?? generatedId;
11
- const helpTextId = `helpText_${id}`;
12
- return /* @__PURE__ */ jsxs(
13
- "div",
14
- {
15
- className: cn(
16
- "flex gap-2",
17
- helpText ? "items-start" : "items-center",
18
- className
19
- ),
20
- children: [
21
- /* @__PURE__ */ jsx(
22
- RadioGroupItem$1,
23
- {
24
- ref,
25
- id,
26
- value,
27
- "aria-describedby": helpText ? helpTextId : void 0,
28
- className: helpText ? "mt-0.5" : void 0,
29
- ...props
30
- }
9
+ const RadioGroupItem = forwardRef(
10
+ ({ label, helpText, value, className, id: idProp, dataTestId, ...props }, ref) => {
11
+ const generatedId = useId();
12
+ const id = idProp ?? generatedId;
13
+ const helpTextId = `helpText_${id}`;
14
+ const testIdPrefix = buildTestIdPrefix(dataTestId, label);
15
+ return /* @__PURE__ */ jsxs(
16
+ "div",
17
+ {
18
+ className: cn(
19
+ "flex gap-2",
20
+ helpText ? "items-start" : "items-center",
21
+ className
31
22
  ),
32
- (label || helpText) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
33
- label && /* @__PURE__ */ jsx(Label, { htmlFor: id, className: "cursor-pointer", children: label }),
34
- helpText && /* @__PURE__ */ jsx(FieldDescription, { id: helpTextId, children: helpText })
35
- ] })
36
- ]
37
- }
38
- );
39
- });
23
+ children: [
24
+ /* @__PURE__ */ jsx(
25
+ RadioGroupItem$1,
26
+ {
27
+ ref,
28
+ id,
29
+ value,
30
+ "aria-describedby": helpText ? helpTextId : void 0,
31
+ className: helpText ? "mt-0.5" : void 0,
32
+ "data-testid": `${testIdPrefix}-radio-input`,
33
+ ...props
34
+ }
35
+ ),
36
+ (label || helpText) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
37
+ label && /* @__PURE__ */ jsx(
38
+ Label,
39
+ {
40
+ htmlFor: id,
41
+ className: "cursor-pointer",
42
+ "data-testid": `${testIdPrefix}-radio-label`,
43
+ children: label
44
+ }
45
+ ),
46
+ helpText && /* @__PURE__ */ jsx(FieldDescription, { id: helpTextId, children: helpText })
47
+ ] })
48
+ ]
49
+ }
50
+ );
51
+ }
52
+ );
40
53
  RadioGroupItem.displayName = "RadioGroup.Item";
41
54
  const RadioGroupRoot = forwardRef(
42
55
  ({
@@ -49,11 +62,13 @@ const RadioGroupRoot = forwardRef(
49
62
  required,
50
63
  children,
51
64
  labelProps,
65
+ dataTestId,
52
66
  ...props
53
67
  }, ref) => {
54
68
  const generatedId = useId();
55
69
  const errorId = `error_${generatedId}`;
56
70
  const helpTextId = `helpText_${generatedId}`;
71
+ const testIdPrefix = buildTestIdPrefix(dataTestId, label);
57
72
  const hasField = !!(label || error || helpText);
58
73
  const radioGroup = /* @__PURE__ */ jsx(
59
74
  RadioGroup$1,
@@ -87,11 +102,25 @@ const RadioGroupRoot = forwardRef(
87
102
  label,
88
103
  required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
89
104
  ] }),
90
- helpText && /* @__PURE__ */ jsx(FieldDescription, { id: helpTextId, children: helpText })
105
+ helpText && /* @__PURE__ */ jsx(
106
+ FieldDescription,
107
+ {
108
+ id: helpTextId,
109
+ "data-testid": `${testIdPrefix}-radio-input-help`,
110
+ children: helpText
111
+ }
112
+ )
91
113
  ] }),
92
114
  /* @__PURE__ */ jsxs(FieldContent, { children: [
93
115
  radioGroup,
94
- !!error && /* @__PURE__ */ jsx(FieldError, { id: errorId, children: error })
116
+ !!error && /* @__PURE__ */ jsx(
117
+ FieldError,
118
+ {
119
+ id: errorId,
120
+ "data-testid": `${testIdPrefix}-radio-input-error`,
121
+ children: error
122
+ }
123
+ )
95
124
  ] })
96
125
  ]
97
126
  }
@@ -104,4 +133,4 @@ const RadioGroup = Object.assign(RadioGroupRoot, {
104
133
  });
105
134
 
106
135
  export { RadioGroup as R };
107
- //# sourceMappingURL=RadioGroup-CpgVdPzz.js.map
136
+ //# sourceMappingURL=RadioGroup-CBXByAMW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioGroup-CBXByAMW.js","sources":["../src/components/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import React, { forwardRef, useId } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n RadioGroup as PrimitiveRadioGroup,\n RadioGroupItem as PrimitiveRadioGroupItem,\n} from \"src/primitives/RadioGroup\";\nimport { Label } from \"src/primitives/Label\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\n\nexport interface RadioGroupProps extends Omit<\n React.ComponentProps<typeof PrimitiveRadioGroup>,\n \"children\"\n> {\n /** Group label displayed above the radio items. */\n label?: string;\n /** Error message displayed below the group. */\n error?: string;\n /** Helper text displayed below the group label. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Layout orientation. Defaults to \"horizontal\". */\n orientation?: \"horizontal\" | \"vertical\";\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** RadioGroup.Item children. */\n children?: React.ReactNode;\n /** Props forwarded to the group Label element. */\n labelProps?: React.ComponentProps<typeof FieldLabel>;\n /** Prefix for the group's error testid(radio-input-error). Falls back to the hyphenized group label. */\n dataTestId?: string;\n}\n\nexport interface RadioGroupItemProps extends React.ComponentProps<\n typeof PrimitiveRadioGroupItem\n> {\n /** Label displayed next to the radio. */\n label?: string;\n /** Helper text displayed below the item label. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Radio value (required). */\n value: string;\n /** Additional class name for the item wrapper. */\n className?: string;\n /** Optional id override; auto-generated if omitted. */\n id?: string;\n /** Prefix for the item's testid family(radio-input, radio-label). Falls back to the hyphenized item label. */\n dataTestId?: string;\n}\n\nconst RadioGroupItem = forwardRef<\n React.ComponentRef<typeof PrimitiveRadioGroupItem>,\n RadioGroupItemProps\n>(\n (\n { label, helpText, value, className, id: idProp, dataTestId, ...props },\n ref\n ) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const helpTextId = `helpText_${id}`;\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n\n return (\n <div\n className={cn(\n \"flex gap-2\",\n helpText ? \"items-start\" : \"items-center\",\n className\n )}\n >\n <PrimitiveRadioGroupItem\n ref={ref}\n id={id}\n value={value}\n aria-describedby={helpText ? helpTextId : undefined}\n className={helpText ? \"mt-0.5\" : undefined}\n data-testid={`${testIdPrefix}-radio-input`}\n {...props}\n />\n {(label || helpText) && (\n <div className=\"flex flex-col gap-0.5\">\n {label && (\n <Label\n htmlFor={id}\n className=\"cursor-pointer\"\n data-testid={`${testIdPrefix}-radio-label`}\n >\n {label}\n </Label>\n )}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </div>\n )}\n </div>\n );\n }\n);\n\nRadioGroupItem.displayName = \"RadioGroup.Item\";\n\nconst RadioGroupRoot = forwardRef<\n React.ComponentRef<typeof PrimitiveRadioGroup>,\n RadioGroupProps\n>(\n (\n {\n label,\n error,\n helpText,\n orientation = \"horizontal\",\n className,\n disabled,\n required,\n children,\n labelProps,\n dataTestId,\n ...props\n },\n ref\n ) => {\n const generatedId = useId();\n const errorId = `error_${generatedId}`;\n const helpTextId = `helpText_${generatedId}`;\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n\n const hasField = !!(label || error || helpText);\n\n const radioGroup = (\n <PrimitiveRadioGroup\n ref={ref}\n disabled={disabled}\n required={required}\n aria-invalid={!!error || undefined}\n aria-describedby={\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined\n }\n orientation={orientation}\n className={cn(\n \"data-[orientation=vertical]:grid data-[orientation=vertical]:gap-2 data-[orientation=horizontal]:flex data-[orientation=horizontal]:flex-row data-[orientation=horizontal]:flex-wrap data-[orientation=horizontal]:items-center data-[orientation=horizontal]:gap-4\",\n !hasField && className\n )}\n {...props}\n >\n {children}\n </PrimitiveRadioGroup>\n );\n\n if (!hasField) {\n return radioGroup;\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {(label || helpText) && (\n <div>\n {label && (\n <FieldLabel {...labelProps}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n {helpText && (\n <FieldDescription\n id={helpTextId}\n data-testid={`${testIdPrefix}-radio-input-help`}\n >\n {helpText}\n </FieldDescription>\n )}\n </div>\n )}\n <FieldContent>\n {radioGroup}\n {!!error && (\n <FieldError\n id={errorId}\n data-testid={`${testIdPrefix}-radio-input-error`}\n >\n {error}\n </FieldError>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nRadioGroupRoot.displayName = \"RadioGroup\";\n\nconst RadioGroup = Object.assign(RadioGroupRoot, {\n Item: RadioGroupItem,\n});\n\nexport { RadioGroup };\n"],"names":["PrimitiveRadioGroupItem","PrimitiveRadioGroup"],"mappings":"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"}