@bigbinary/neeto-atoms 1.0.102 → 1.0.104

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 (258) 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/{DataTable-CwWARMEv.js → DataTable-mxDU-16D.js} +75 -55
  6. package/dist/DataTable-mxDU-16D.js.map +1 -0
  7. package/dist/{DatePicker-Uf_h3ohA.js → DatePicker-BoXx1Wve.js} +13 -4
  8. package/dist/DatePicker-BoXx1Wve.js.map +1 -0
  9. package/dist/{Dialog-D8C0-nEo.js → Dialog-Yw34WDqY.js} +2 -2
  10. package/dist/Dialog-Yw34WDqY.js.map +1 -0
  11. package/dist/{HelpIcon-CbnRiSjn.js → HelpIcon-xh488VXs.js} +11 -3
  12. package/dist/HelpIcon-xh488VXs.js.map +1 -0
  13. package/dist/{Input-CuIurquS.js → Input-W8foyOcS.js} +35 -7
  14. package/dist/Input-W8foyOcS.js.map +1 -0
  15. package/dist/{Label-DjOaTM4Q.js → Label-B-R4PNNq.js} +2 -2
  16. package/dist/{Label-DjOaTM4Q.js.map → Label-B-R4PNNq.js.map} +1 -1
  17. package/dist/{MultiEmailInput-BB334s4C.js → MultiEmailInput-Bzd2dPFC.js} +68 -25
  18. package/dist/MultiEmailInput-Bzd2dPFC.js.map +1 -0
  19. package/dist/{RadioGroup-CpgVdPzz.js → RadioGroup-CBXByAMW.js} +63 -34
  20. package/dist/RadioGroup-CBXByAMW.js.map +1 -0
  21. package/dist/{Select-YWCfd2p1.js → Select-N5Ten-tn.js} +3 -10
  22. package/dist/Select-N5Ten-tn.js.map +1 -0
  23. package/dist/{Slider-Bokg8-oi.js → Slider-CxQdlyHZ.js} +32 -7
  24. package/dist/Slider-CxQdlyHZ.js.map +1 -0
  25. package/dist/{Stepper-DO7EBWYL.js → Stepper-GK8gDn-s.js} +2 -1
  26. package/dist/Stepper-GK8gDn-s.js.map +1 -0
  27. package/dist/{Switch-Am2l2UdV.js → Switch-C9fqpoNR.js} +16 -2
  28. package/dist/Switch-C9fqpoNR.js.map +1 -0
  29. package/dist/{Tabs-ModAabFc.js → Tabs-DaXiF_67.js} +3 -3
  30. package/dist/Tabs-DaXiF_67.js.map +1 -0
  31. package/dist/{Textarea-CMGZZ4rL.js → Textarea-CUe09-sr.js} +34 -7
  32. package/dist/Textarea-CUe09-sr.js.map +1 -0
  33. package/dist/{TimePicker-Ca7iF-a_.js → TimePicker-BixF9wdU.js} +21 -4
  34. package/dist/TimePicker-BixF9wdU.js.map +1 -0
  35. package/dist/{Toastr-Cka6pudu.js → Toastr-CXqmoXjn.js} +9 -2
  36. package/dist/Toastr-CXqmoXjn.js.map +1 -0
  37. package/dist/{TreeSelect-wYDOZ5yD.js → TreeSelect-DMbr7J2H.js} +2 -1
  38. package/dist/TreeSelect-DMbr7J2H.js.map +1 -0
  39. package/dist/cjs/{Avatar-DGuMcBnh.js → Avatar-D2k6WnzD.js} +8 -2
  40. package/dist/cjs/Avatar-D2k6WnzD.js.map +1 -0
  41. package/dist/cjs/{Checkbox-7lX2aMKA.js → Checkbox-83g1FDsc.js} +26 -7
  42. package/dist/cjs/Checkbox-83g1FDsc.js.map +1 -0
  43. package/dist/cjs/{DataTable-ChgPVrRB.js → DataTable-OtA15NKE.js} +75 -55
  44. package/dist/cjs/DataTable-OtA15NKE.js.map +1 -0
  45. package/dist/cjs/{DatePicker-Czp9QLy0.js → DatePicker-DtmJ-VkV.js} +13 -4
  46. package/dist/cjs/DatePicker-DtmJ-VkV.js.map +1 -0
  47. package/dist/cjs/{Dialog-DNv7j7ts.js → Dialog-ZUHGaoAE.js} +2 -2
  48. package/dist/cjs/Dialog-ZUHGaoAE.js.map +1 -0
  49. package/dist/cjs/{HelpIcon-QpZY6Zmc.js → HelpIcon-BF1ePUQf.js} +11 -3
  50. package/dist/cjs/HelpIcon-BF1ePUQf.js.map +1 -0
  51. package/dist/cjs/{Input-lWo0YoZ9.js → Input-DIq7T9D0.js} +35 -7
  52. package/dist/cjs/Input-DIq7T9D0.js.map +1 -0
  53. package/dist/cjs/{Label-D8RFE9hd.js → Label-CpsdGBV8.js} +2 -2
  54. package/dist/cjs/{Label-D8RFE9hd.js.map → Label-CpsdGBV8.js.map} +1 -1
  55. package/dist/cjs/{MultiEmailInput-BlIqzq-o.js → MultiEmailInput-FNRR9b74.js} +68 -25
  56. package/dist/cjs/MultiEmailInput-FNRR9b74.js.map +1 -0
  57. package/dist/cjs/{RadioGroup-DCEw94Dk.js → RadioGroup-B-u8rdbf.js} +63 -34
  58. package/dist/cjs/RadioGroup-B-u8rdbf.js.map +1 -0
  59. package/dist/cjs/{Select-Bs5Fp3wj.js → Select-CGG3J9NS.js} +7 -14
  60. package/dist/cjs/Select-CGG3J9NS.js.map +1 -0
  61. package/dist/cjs/{Slider-CRmd_VMs.js → Slider-DIUSlx_m.js} +32 -7
  62. package/dist/cjs/Slider-DIUSlx_m.js.map +1 -0
  63. package/dist/cjs/{Stepper-BtZG_XmC.js → Stepper-BZBdL6JW.js} +2 -1
  64. package/dist/cjs/Stepper-BZBdL6JW.js.map +1 -0
  65. package/dist/cjs/{Switch-DY7bdiEz.js → Switch-BbRK3HUZ.js} +16 -2
  66. package/dist/cjs/Switch-BbRK3HUZ.js.map +1 -0
  67. package/dist/cjs/{Tabs-CA0QAWp0.js → Tabs-BQl63Ewe.js} +3 -3
  68. package/dist/cjs/Tabs-BQl63Ewe.js.map +1 -0
  69. package/dist/cjs/{Textarea-Cw7Uea82.js → Textarea-bxleSw86.js} +34 -7
  70. package/dist/cjs/Textarea-bxleSw86.js.map +1 -0
  71. package/dist/cjs/{TimePicker-DW7OM3IE.js → TimePicker-lJ2985nh.js} +21 -4
  72. package/dist/cjs/TimePicker-lJ2985nh.js.map +1 -0
  73. package/dist/cjs/{Toastr-E0yLh_MW.js → Toastr-9DXjD-Mq.js} +9 -2
  74. package/dist/cjs/Toastr-9DXjD-Mq.js.map +1 -0
  75. package/dist/cjs/{TreeSelect-C9BSJt1d.js → TreeSelect-3APPRsqr.js} +2 -1
  76. package/dist/cjs/TreeSelect-3APPRsqr.js.map +1 -0
  77. package/dist/cjs/components/Avatar.js +1 -1
  78. package/dist/cjs/components/Checkbox.js +4 -2
  79. package/dist/cjs/components/Checkbox.js.map +1 -1
  80. package/dist/cjs/components/DataTable.js +2 -1
  81. package/dist/cjs/components/DataTable.js.map +1 -1
  82. package/dist/cjs/components/DatePicker.js +4 -2
  83. package/dist/cjs/components/DatePicker.js.map +1 -1
  84. package/dist/cjs/components/Dialog.js +1 -1
  85. package/dist/cjs/components/DropdownMenu.js +3 -1
  86. package/dist/cjs/components/DropdownMenu.js.map +1 -1
  87. package/dist/cjs/components/Input.js +4 -2
  88. package/dist/cjs/components/Input.js.map +1 -1
  89. package/dist/cjs/components/Label.js +2 -2
  90. package/dist/cjs/components/MultiEmailInput.js +4 -2
  91. package/dist/cjs/components/MultiEmailInput.js.map +1 -1
  92. package/dist/cjs/components/RadioGroup.js +4 -2
  93. package/dist/cjs/components/RadioGroup.js.map +1 -1
  94. package/dist/cjs/components/Select.js +4 -3
  95. package/dist/cjs/components/Select.js.map +1 -1
  96. package/dist/cjs/components/Slider.js +4 -2
  97. package/dist/cjs/components/Slider.js.map +1 -1
  98. package/dist/cjs/components/Stepper.js +1 -1
  99. package/dist/cjs/components/Switch.js +4 -2
  100. package/dist/cjs/components/Switch.js.map +1 -1
  101. package/dist/cjs/components/Tabs.js +2 -2
  102. package/dist/cjs/components/Textarea.js +4 -2
  103. package/dist/cjs/components/Textarea.js.map +1 -1
  104. package/dist/cjs/components/TimePicker.js +4 -2
  105. package/dist/cjs/components/TimePicker.js.map +1 -1
  106. package/dist/cjs/components/Toastr.js +1 -1
  107. package/dist/cjs/components/TreeSelect.js +2 -2
  108. package/dist/cjs/components/index.js +21 -20
  109. package/dist/cjs/components/index.js.map +1 -1
  110. package/dist/cjs/fieldIds-DiVU6GVS.js +14 -0
  111. package/dist/cjs/fieldIds-DiVU6GVS.js.map +1 -0
  112. package/dist/cjs/formik/BlockNavigation.js +1 -1
  113. package/dist/cjs/formik/Checkbox.js +4 -2
  114. package/dist/cjs/formik/Checkbox.js.map +1 -1
  115. package/dist/cjs/formik/Input.js +4 -2
  116. package/dist/cjs/formik/Input.js.map +1 -1
  117. package/dist/cjs/formik/MultiEmailInput.js +4 -2
  118. package/dist/cjs/formik/MultiEmailInput.js.map +1 -1
  119. package/dist/cjs/formik/RadioGroup.js +4 -2
  120. package/dist/cjs/formik/RadioGroup.js.map +1 -1
  121. package/dist/cjs/formik/Select.js +4 -3
  122. package/dist/cjs/formik/Select.js.map +1 -1
  123. package/dist/cjs/formik/Slider.js +4 -2
  124. package/dist/cjs/formik/Slider.js.map +1 -1
  125. package/dist/cjs/formik/Switch.js +4 -2
  126. package/dist/cjs/formik/Switch.js.map +1 -1
  127. package/dist/cjs/formik/Textarea.js +4 -2
  128. package/dist/cjs/formik/Textarea.js.map +1 -1
  129. package/dist/cjs/formik/TreeSelect.js +2 -2
  130. package/dist/cjs/formik/index.js +13 -12
  131. package/dist/cjs/formik/index.js.map +1 -1
  132. package/dist/cjs/hyphenize-BTrVNVv3.js +13 -0
  133. package/dist/cjs/hyphenize-BTrVNVv3.js.map +1 -0
  134. package/dist/cjs/index.js +21 -20
  135. package/dist/cjs/index.js.map +1 -1
  136. package/dist/cjs/primitives/Button.js +2 -0
  137. package/dist/cjs/primitives/Button.js.map +1 -1
  138. package/dist/cjs/primitives/Field.js +1 -1
  139. package/dist/cjs/primitives/index.js +1 -1
  140. package/dist/components/Avatar.js +1 -1
  141. package/dist/components/Checkbox/Checkbox.d.ts +2 -0
  142. package/dist/components/Checkbox.js +4 -2
  143. package/dist/components/Checkbox.js.map +1 -1
  144. package/dist/components/DataTable.js +2 -1
  145. package/dist/components/DataTable.js.map +1 -1
  146. package/dist/components/DatePicker/DatePickerField.d.ts +1 -0
  147. package/dist/components/DatePicker/DatePickerTrigger.d.ts +1 -0
  148. package/dist/components/DatePicker/types.d.ts +2 -0
  149. package/dist/components/DatePicker.js +4 -2
  150. package/dist/components/DatePicker.js.map +1 -1
  151. package/dist/components/Dialog.js +1 -1
  152. package/dist/components/DropdownMenu.js +3 -1
  153. package/dist/components/DropdownMenu.js.map +1 -1
  154. package/dist/components/Input/Input.d.ts +2 -0
  155. package/dist/components/Input.js +4 -2
  156. package/dist/components/Input.js.map +1 -1
  157. package/dist/components/Label.js +2 -2
  158. package/dist/components/MultiEmailInput/types.d.ts +2 -0
  159. package/dist/components/MultiEmailInput.js +4 -2
  160. package/dist/components/MultiEmailInput.js.map +1 -1
  161. package/dist/components/RadioGroup/RadioGroup.d.ts +4 -0
  162. package/dist/components/RadioGroup.js +4 -2
  163. package/dist/components/RadioGroup.js.map +1 -1
  164. package/dist/components/Select/hooks/useMultiSelectState.d.ts +1 -1
  165. package/dist/components/Select/hooks/useSelectState.d.ts +1 -1
  166. package/dist/components/Select.js +4 -3
  167. package/dist/components/Select.js.map +1 -1
  168. package/dist/components/Slider/Slider.d.ts +2 -0
  169. package/dist/components/Slider.js +4 -2
  170. package/dist/components/Slider.js.map +1 -1
  171. package/dist/components/Stepper.js +1 -1
  172. package/dist/components/Switch/Switch.d.ts +2 -0
  173. package/dist/components/Switch.js +4 -2
  174. package/dist/components/Switch.js.map +1 -1
  175. package/dist/components/Tabs.js +2 -2
  176. package/dist/components/Textarea/Textarea.d.ts +2 -0
  177. package/dist/components/Textarea.js +4 -2
  178. package/dist/components/Textarea.js.map +1 -1
  179. package/dist/components/TimePicker/types.d.ts +2 -0
  180. package/dist/components/TimePicker.js +4 -2
  181. package/dist/components/TimePicker.js.map +1 -1
  182. package/dist/components/Toastr.js +1 -1
  183. package/dist/components/TreeSelect.js +2 -2
  184. package/dist/components/index.js +21 -20
  185. package/dist/components/index.js.map +1 -1
  186. package/dist/fieldIds-VpluAAMl.js +11 -0
  187. package/dist/fieldIds-VpluAAMl.js.map +1 -0
  188. package/dist/formik/BlockNavigation.js +1 -1
  189. package/dist/formik/Checkbox.js +4 -2
  190. package/dist/formik/Checkbox.js.map +1 -1
  191. package/dist/formik/Input.js +4 -2
  192. package/dist/formik/Input.js.map +1 -1
  193. package/dist/formik/MultiEmailInput.js +4 -2
  194. package/dist/formik/MultiEmailInput.js.map +1 -1
  195. package/dist/formik/RadioGroup.js +4 -2
  196. package/dist/formik/RadioGroup.js.map +1 -1
  197. package/dist/formik/Select.js +4 -3
  198. package/dist/formik/Select.js.map +1 -1
  199. package/dist/formik/Slider.js +4 -2
  200. package/dist/formik/Slider.js.map +1 -1
  201. package/dist/formik/Switch.js +4 -2
  202. package/dist/formik/Switch.js.map +1 -1
  203. package/dist/formik/Textarea.js +4 -2
  204. package/dist/formik/Textarea.js.map +1 -1
  205. package/dist/formik/TreeSelect.js +2 -2
  206. package/dist/formik/index.js +13 -12
  207. package/dist/formik/index.js.map +1 -1
  208. package/dist/hyphenize-TRhMI0tl.js +11 -0
  209. package/dist/hyphenize-TRhMI0tl.js.map +1 -0
  210. package/dist/index.js +21 -20
  211. package/dist/index.js.map +1 -1
  212. package/dist/primitives/Button.js +2 -0
  213. package/dist/primitives/Button.js.map +1 -1
  214. package/dist/primitives/Field.js +1 -1
  215. package/dist/primitives/index.js +1 -1
  216. package/dist/utils/fieldIds.d.ts +1 -1
  217. package/dist/utils/hyphenize.d.ts +1 -1
  218. package/package.json +1 -1
  219. package/dist/Avatar-ChF94Ken.js.map +0 -1
  220. package/dist/Checkbox-DiAngQvO.js.map +0 -1
  221. package/dist/DataTable-CwWARMEv.js.map +0 -1
  222. package/dist/DatePicker-Uf_h3ohA.js.map +0 -1
  223. package/dist/Dialog-D8C0-nEo.js.map +0 -1
  224. package/dist/HelpIcon-CbnRiSjn.js.map +0 -1
  225. package/dist/Input-CuIurquS.js.map +0 -1
  226. package/dist/MultiEmailInput-BB334s4C.js.map +0 -1
  227. package/dist/RadioGroup-CpgVdPzz.js.map +0 -1
  228. package/dist/Select-YWCfd2p1.js.map +0 -1
  229. package/dist/Slider-Bokg8-oi.js.map +0 -1
  230. package/dist/Stepper-DO7EBWYL.js.map +0 -1
  231. package/dist/Switch-Am2l2UdV.js.map +0 -1
  232. package/dist/Tabs-ModAabFc.js.map +0 -1
  233. package/dist/Textarea-CMGZZ4rL.js.map +0 -1
  234. package/dist/TimePicker-Ca7iF-a_.js.map +0 -1
  235. package/dist/Toastr-Cka6pudu.js.map +0 -1
  236. package/dist/TreeSelect-wYDOZ5yD.js.map +0 -1
  237. package/dist/cjs/Avatar-DGuMcBnh.js.map +0 -1
  238. package/dist/cjs/Checkbox-7lX2aMKA.js.map +0 -1
  239. package/dist/cjs/DataTable-ChgPVrRB.js.map +0 -1
  240. package/dist/cjs/DatePicker-Czp9QLy0.js.map +0 -1
  241. package/dist/cjs/Dialog-DNv7j7ts.js.map +0 -1
  242. package/dist/cjs/HelpIcon-QpZY6Zmc.js.map +0 -1
  243. package/dist/cjs/Input-lWo0YoZ9.js.map +0 -1
  244. package/dist/cjs/MultiEmailInput-BlIqzq-o.js.map +0 -1
  245. package/dist/cjs/RadioGroup-DCEw94Dk.js.map +0 -1
  246. package/dist/cjs/Select-Bs5Fp3wj.js.map +0 -1
  247. package/dist/cjs/Slider-CRmd_VMs.js.map +0 -1
  248. package/dist/cjs/Stepper-BtZG_XmC.js.map +0 -1
  249. package/dist/cjs/Switch-DY7bdiEz.js.map +0 -1
  250. package/dist/cjs/Tabs-CA0QAWp0.js.map +0 -1
  251. package/dist/cjs/Textarea-Cw7Uea82.js.map +0 -1
  252. package/dist/cjs/TimePicker-DW7OM3IE.js.map +0 -1
  253. package/dist/cjs/Toastr-E0yLh_MW.js.map +0 -1
  254. package/dist/cjs/TreeSelect-C9BSJt1d.js.map +0 -1
  255. package/dist/cjs/hyphenize-B8IGPzjp.js +0 -8
  256. package/dist/cjs/hyphenize-B8IGPzjp.js.map +0 -1
  257. package/dist/hyphenize-BU4K8zjb.js +0 -6
  258. package/dist/hyphenize-BU4K8zjb.js.map +0 -1
@@ -3,6 +3,7 @@ import { forwardRef, useId, useCallback } from 'react';
3
3
  import { Slider as Slider$1 } from './primitives/Slider.js';
4
4
  import { c as cn } from './utils-BJnb9o5c.js';
5
5
  import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from './primitives/Field.js';
6
+ import { b as buildTestIdPrefix } from './fieldIds-VpluAAMl.js';
6
7
 
7
8
  const toArray = (value) => {
8
9
  if (value === void 0) return void 0;
@@ -16,6 +17,7 @@ const Slider = forwardRef(
16
17
  required = false,
17
18
  className,
18
19
  labelProps,
20
+ dataTestId,
19
21
  disabled,
20
22
  id: idProp,
21
23
  value,
@@ -30,6 +32,7 @@ const Slider = forwardRef(
30
32
  const helpTextId = `helpText_${id}`;
31
33
  const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null].filter(Boolean).join(" ") || void 0;
32
34
  const hasField = !!(label || error || helpText);
35
+ const testIdPrefix = buildTestIdPrefix(dataTestId, label);
33
36
  const inputShapeIsScalar = value !== void 0 ? !Array.isArray(value) : defaultValue !== void 0 ? !Array.isArray(defaultValue) : false;
34
37
  const unwrap = useCallback(
35
38
  (next) => inputShapeIsScalar ? next[0] : next,
@@ -70,14 +73,36 @@ const Slider = forwardRef(
70
73
  "data-invalid": !!error || void 0,
71
74
  className,
72
75
  children: [
73
- label && /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: id, ...labelProps, children: [
74
- label,
75
- required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
76
- ] }),
76
+ label && /* @__PURE__ */ jsxs(
77
+ FieldLabel,
78
+ {
79
+ htmlFor: id,
80
+ "data-testid": `${testIdPrefix}-slider-label`,
81
+ ...labelProps,
82
+ children: [
83
+ label,
84
+ required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
85
+ ]
86
+ }
87
+ ),
77
88
  /* @__PURE__ */ jsxs(FieldContent, { children: [
78
89
  slider,
79
- !!error && /* @__PURE__ */ jsx(FieldError, { id: errorId, children: error }),
80
- helpText && /* @__PURE__ */ jsx(FieldDescription, { id: helpTextId, children: helpText })
90
+ !!error && /* @__PURE__ */ jsx(
91
+ FieldError,
92
+ {
93
+ id: errorId,
94
+ "data-testid": `${testIdPrefix}-input-error`,
95
+ children: error
96
+ }
97
+ ),
98
+ helpText && /* @__PURE__ */ jsx(
99
+ FieldDescription,
100
+ {
101
+ id: helpTextId,
102
+ "data-testid": `${testIdPrefix}-input-help`,
103
+ children: helpText
104
+ }
105
+ )
81
106
  ] })
82
107
  ]
83
108
  }
@@ -87,4 +112,4 @@ const Slider = forwardRef(
87
112
  Slider.displayName = "Slider";
88
113
 
89
114
  export { Slider as S };
90
- //# sourceMappingURL=Slider-Bokg8-oi.js.map
115
+ //# sourceMappingURL=Slider-CxQdlyHZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Slider-CxQdlyHZ.js","sources":["../src/components/Slider/Slider.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useId } from \"react\";\n\nimport { Slider as PrimitiveSlider } from \"src/primitives/Slider\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\n\ntype SliderValue = number | number[];\n\ntype PrimitiveSliderProps = React.ComponentProps<typeof PrimitiveSlider>;\n\nexport interface SliderProps extends Omit<\n PrimitiveSliderProps,\n \"value\" | \"defaultValue\" | \"onValueChange\" | \"onValueCommit\"\n> {\n /** Current value. Pass a number for a single-thumb slider or an array for a range slider. */\n value?: SliderValue;\n /** Default value (uncontrolled). Shape mirrors `value`. */\n defaultValue?: SliderValue;\n /** Called on every change. Emits a number if `value`/`defaultValue` was a number, an array otherwise. */\n onValueChange?: (value: SliderValue) => void;\n /** Called when the user stops dragging. Emits a number if `value`/`defaultValue` was a number, an array otherwise. */\n onValueCommit?: (value: SliderValue) => void;\n /** Label displayed above the slider. */\n label?: string;\n /** Error message displayed below the slider. */\n error?: string;\n /** Help text displayed below the slider. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Shows a required indicator next to the label. */\n required?: boolean;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** Props forwarded to the FieldLabel element. */\n labelProps?: React.ComponentProps<typeof FieldLabel>;\n /** Prefix for the field's testid family(slider-label, input-error, input-help). Falls back to the hyphenized label. */\n dataTestId?: string;\n}\n\nconst toArray = (value: SliderValue | undefined): number[] | undefined => {\n if (value === undefined) return undefined;\n return Array.isArray(value) ? value : [value];\n};\n\nconst Slider = forwardRef<\n React.ComponentRef<typeof PrimitiveSlider>,\n SliderProps\n>(\n (\n {\n label,\n error,\n helpText,\n required = false,\n className,\n labelProps,\n dataTestId,\n disabled,\n id: idProp,\n value,\n defaultValue,\n onValueChange,\n onValueCommit,\n ...otherProps\n },\n ref\n ) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const hasField = !!(label || error || helpText);\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n\n const inputShapeIsScalar =\n value !== undefined\n ? !Array.isArray(value)\n : defaultValue !== undefined\n ? !Array.isArray(defaultValue)\n : false;\n\n const unwrap = useCallback(\n (next: number[]): SliderValue =>\n inputShapeIsScalar ? (next[0] as number) : next,\n [inputShapeIsScalar]\n );\n\n const handleValueChange = useCallback(\n (next: number[]) => onValueChange?.(unwrap(next)),\n [onValueChange, unwrap]\n );\n\n const handleValueCommit = useCallback(\n (next: number[]) => onValueCommit?.(unwrap(next)),\n [onValueCommit, unwrap]\n );\n\n const slider = (\n <PrimitiveSlider\n ref={ref}\n id={id}\n disabled={disabled}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n aria-label={!label ? undefined : label}\n className={cn(!hasField && className)}\n value={toArray(value)}\n defaultValue={toArray(defaultValue)}\n onValueChange={onValueChange ? handleValueChange : undefined}\n onValueCommit={onValueCommit ? handleValueCommit : undefined}\n {...otherProps}\n />\n );\n\n if (!hasField) {\n return slider;\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {label && (\n <FieldLabel\n htmlFor={id}\n data-testid={`${testIdPrefix}-slider-label`}\n {...labelProps}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n <FieldContent>\n {slider}\n {!!error && (\n <FieldError\n id={errorId}\n data-testid={`${testIdPrefix}-input-error`}\n >\n {error}\n </FieldError>\n )}\n {helpText && (\n <FieldDescription\n id={helpTextId}\n data-testid={`${testIdPrefix}-input-help`}\n >\n {helpText}\n </FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nSlider.displayName = \"Slider\";\n\nexport { Slider };\n"],"names":["PrimitiveSlider"],"mappings":"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"}
@@ -52,6 +52,7 @@ const Stepper = forwardRef(
52
52
  "button",
53
53
  {
54
54
  type: "button",
55
+ "data-testid": "stepper-navigation-button",
55
56
  onClick: () => onStepClick(index),
56
57
  "aria-current": isActive ? "step" : void 0,
57
58
  className: "cursor-pointer rounded-full focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring",
@@ -107,4 +108,4 @@ const Stepper = forwardRef(
107
108
  Stepper.displayName = "Stepper";
108
109
 
109
110
  export { Stepper as S };
110
- //# sourceMappingURL=Stepper-DO7EBWYL.js.map
111
+ //# sourceMappingURL=Stepper-GK8gDn-s.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stepper-GK8gDn-s.js","sources":["../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { CheckIcon } from \"lucide-react\";\n\nexport interface StepperProps {\n /** Step definitions. */\n steps: Array<{ id: string | number; label: string }>;\n /** Current active step (0-based). */\n activeIndex?: number;\n /** Callback when a step indicator is clicked. */\n onStepClick?: (index: number) => void;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** Layout direction. */\n orientation?: \"horizontal\" | \"vertical\";\n}\n\nconst Stepper = forwardRef<HTMLDivElement, StepperProps>(\n (\n {\n steps,\n activeIndex = 0,\n onStepClick,\n className,\n orientation = \"horizontal\",\n },\n ref\n ) => {\n const isHorizontal = orientation === \"horizontal\";\n\n return (\n <div\n ref={ref}\n role=\"list\"\n aria-label=\"Progress\"\n className={cn(\n \"flex gap-2\",\n isHorizontal ? \"flex-row items-center\" : \"flex-col items-start\",\n className\n )}\n >\n {steps.map((step, index) => {\n const isCompleted = index < activeIndex;\n const isActive = index === activeIndex;\n const isClickable = (isCompleted || isActive) && !!onStepClick;\n const isLast = index === steps.length - 1;\n\n const indicator = (\n <span\n className={cn(\n \"relative flex size-7 shrink-0 items-center justify-center rounded-full text-sm font-semibold transition-colors\",\n isCompleted && \"bg-primary text-primary-foreground\",\n isActive &&\n \"bg-primary text-primary-foreground ring-2 ring-primary ring-offset-2 ring-offset-background\",\n !isCompleted &&\n !isActive &&\n \"bg-muted text-foreground/60 ring-1 ring-border\"\n )}\n >\n {isCompleted ? (\n <CheckIcon className=\"size-3.5\" aria-hidden=\"true\" />\n ) : (\n index + 1\n )}\n </span>\n );\n\n const stepContent = (\n <div\n className={cn(\n \"flex min-w-0\",\n isHorizontal\n ? \"flex-row items-center gap-2\"\n : \"flex-row items-center gap-3\"\n )}\n >\n {isClickable ? (\n <button\n type=\"button\"\n data-testid=\"stepper-navigation-button\"\n onClick={() => onStepClick(index)}\n aria-current={isActive ? \"step\" : undefined}\n className=\"cursor-pointer rounded-full focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n >\n {indicator}\n </button>\n ) : (\n <span aria-current={isActive ? \"step\" : undefined}>\n {indicator}\n </span>\n )}\n <span\n className={cn(\n \"hidden text-sm truncate max-w-full sm:inline\",\n isActive && \"font-medium text-foreground\",\n isCompleted && \"text-foreground\",\n !isCompleted && !isActive && \"text-muted-foreground\"\n )}\n >\n {step.label}\n </span>\n </div>\n );\n\n const connector = !isLast && (\n <div\n aria-hidden=\"true\"\n className={cn(\n \"transition-colors\",\n isHorizontal\n ? \"mx-2 min-w-5 flex-1 border-t-2 sm:mx-3 sm:min-w-8\"\n : \"ms-[13px] min-h-6 self-stretch border-s-2\",\n isCompleted ? \"border-primary\" : \"border-dashed border-border\"\n )}\n />\n );\n\n return (\n <React.Fragment key={step.id}>\n <div\n role=\"listitem\"\n data-testid={`stepper-item-${step.id}`}\n className={cn(\n \"flex min-w-0\",\n isHorizontal ? \"shrink-0\" : \"flex-col\"\n )}\n >\n {stepContent}\n </div>\n {connector}\n </React.Fragment>\n );\n })}\n </div>\n );\n }\n);\n\nStepper.displayName = \"Stepper\";\n\nexport { Stepper };\n"],"names":["CheckIcon","React"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { forwardRef, useId } from 'react';
3
3
  import { FieldLabel } from './primitives/Field.js';
4
4
  import { Switch as Switch$1 } from './primitives/Switch.js';
5
5
  import { c as cn } from './utils-BJnb9o5c.js';
6
+ import { b as buildTestIdPrefix } from './fieldIds-VpluAAMl.js';
6
7
 
7
8
  const Switch = forwardRef(
8
9
  ({
@@ -15,12 +16,14 @@ const Switch = forwardRef(
15
16
  disabled,
16
17
  id: idProp,
17
18
  labelProps,
19
+ dataTestId,
18
20
  ...otherProps
19
21
  }, ref) => {
20
22
  const generatedId = useId();
21
23
  const id = idProp ?? generatedId;
22
24
  const errorId = `error_${id}`;
23
25
  const helpTextId = `helpText_${id}`;
26
+ const testIdPrefix = buildTestIdPrefix(dataTestId, label);
24
27
  const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null].filter(Boolean).join(" ") || void 0;
25
28
  return /* @__PURE__ */ jsxs(
26
29
  "div",
@@ -37,6 +40,7 @@ const Switch = forwardRef(
37
40
  "relative inline-flex gap-2",
38
41
  helpText ? "items-start" : "items-center"
39
42
  ),
43
+ "data-testid": `${testIdPrefix}-switch`,
40
44
  children: [
41
45
  /* @__PURE__ */ jsx(
42
46
  Switch$1,
@@ -58,6 +62,7 @@ const Switch = forwardRef(
58
62
  FieldLabel,
59
63
  {
60
64
  htmlFor: id,
65
+ "data-testid": `${testIdPrefix.replace(/[^a-z0-9-]/gi, "")}-switch-label`,
61
66
  ...labelProps,
62
67
  className: cn(
63
68
  "cursor-pointer",
@@ -75,7 +80,16 @@ const Switch = forwardRef(
75
80
  ]
76
81
  }
77
82
  ),
78
- error && /* @__PURE__ */ jsx("p", { id: errorId, role: "alert", className: "text-xs text-destructive", children: error })
83
+ error && /* @__PURE__ */ jsx(
84
+ "p",
85
+ {
86
+ id: errorId,
87
+ role: "alert",
88
+ className: "text-xs text-destructive",
89
+ "data-testid": `${testIdPrefix}-switch-error`,
90
+ children: error
91
+ }
92
+ )
79
93
  ]
80
94
  }
81
95
  );
@@ -84,4 +98,4 @@ const Switch = forwardRef(
84
98
  Switch.displayName = "Switch";
85
99
 
86
100
  export { Switch as S };
87
- //# sourceMappingURL=Switch-Am2l2UdV.js.map
101
+ //# sourceMappingURL=Switch-C9fqpoNR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch-C9fqpoNR.js","sources":["../src/components/Switch/Switch.tsx"],"sourcesContent":["import React, { forwardRef, useId } from \"react\";\n\nimport { FieldLabel } from \"src/primitives/Field\";\nimport { Switch as PrimitiveSwitch } from \"src/primitives/Switch\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\n\nexport interface SwitchProps extends Omit<\n React.ComponentProps<typeof PrimitiveSwitch>,\n \"children\"\n> {\n /** Text label displayed next to the switch. */\n label?: string;\n /** Error message displayed below the switch. */\n error?: string;\n /** Helper text displayed below the label. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Shows a required indicator next to the label. */\n required?: boolean;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** Size of the switch. */\n size?: \"sm\" | \"default\" | \"lg\";\n /** Props forwarded to the Label element. */\n labelProps?: React.ComponentProps<typeof FieldLabel>;\n /** Prefix for the field's testid family(switch, switch-label, switch-error). Falls back to the hyphenized label. */\n dataTestId?: string;\n}\n\nconst Switch = forwardRef<\n React.ComponentRef<typeof PrimitiveSwitch>,\n SwitchProps\n>(\n (\n {\n label,\n error,\n helpText,\n required = false,\n className,\n size = \"default\",\n disabled,\n id: idProp,\n labelProps,\n dataTestId,\n ...otherProps\n },\n ref\n ) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n return (\n <div\n className={cn(\"inline-flex flex-col gap-1.5\", className)}\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n data-testid=\"nui-switch-wrapper\"\n >\n {/* relative contains Radix's hidden form input (an absolutely\n positioned sibling of the switch button); without a positioned\n ancestor it resolves against the document and can inflate the\n page's scroll height. */}\n <div\n className={cn(\n \"relative inline-flex gap-2\",\n helpText ? \"items-start\" : \"items-center\"\n )}\n data-testid={`${testIdPrefix}-switch`}\n >\n <PrimitiveSwitch\n ref={ref}\n id={id}\n size={size}\n disabled={disabled}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n aria-required={required || undefined}\n className={helpText ? \"mt-0.5\" : undefined}\n data-testid=\"nui-switch-item\"\n {...otherProps}\n />\n {(label || helpText) && (\n <div className=\"flex flex-col gap-0.5\">\n {label && (\n <FieldLabel\n htmlFor={id}\n data-testid={`${testIdPrefix.replace(/[^a-z0-9-]/gi, \"\")}-switch-label`}\n {...labelProps}\n className={cn(\n \"cursor-pointer\",\n disabled && \"cursor-not-allowed opacity-50\",\n labelProps?.className\n )}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n {helpText && (\n <p id={helpTextId} className=\"text-sm text-muted-foreground\">\n {helpText}\n </p>\n )}\n </div>\n )}\n </div>\n {error && (\n <p\n id={errorId}\n role=\"alert\"\n className=\"text-xs text-destructive\"\n data-testid={`${testIdPrefix}-switch-error`}\n >\n {error}\n </p>\n )}\n </div>\n );\n }\n);\n\nSwitch.displayName = \"Switch\";\n\nexport { Switch };\n"],"names":["PrimitiveSwitch"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { createContext, forwardRef, useContext } from 'react';
3
3
  import { Link } from 'react-router-dom';
4
4
  import { c as cn } from './utils-BJnb9o5c.js';
5
5
  import { r as renderIcon } from './renderIcon-C6twJSqH.js';
6
- import { h as hyphenize } from './hyphenize-BU4K8zjb.js';
6
+ import { h as hyphenize } from './hyphenize-TRhMI0tl.js';
7
7
  import { Tabs as Tabs$1, TabsList, TabsTrigger, TabsContent } from './primitives/Tabs.js';
8
8
 
9
9
  const SIZE_CLASSES = {
@@ -17,7 +17,7 @@ const LIST_HEIGHT = {
17
17
  const TabsSizeContext = createContext("default");
18
18
 
19
19
  const TabsRoot = forwardRef(
20
- ({ size = "default", children, ...props }, ref) => /* @__PURE__ */ jsx(TabsSizeContext.Provider, { value: size, children: /* @__PURE__ */ jsx(Tabs$1, { ref, "data-testid": "tabs-container", ...props, children }) })
20
+ ({ size = "default", children, ...props }, ref) => /* @__PURE__ */ jsx(TabsSizeContext.Provider, { value: size, children: /* @__PURE__ */ jsx(Tabs$1, { ref, "data-testid": "tab-container", ...props, children }) })
21
21
  );
22
22
  TabsRoot.displayName = "Tabs";
23
23
  const TabsListComponent = forwardRef(
@@ -79,4 +79,4 @@ const Tabs = Object.assign(TabsRoot, {
79
79
  });
80
80
 
81
81
  export { Tabs as T };
82
- //# sourceMappingURL=Tabs-ModAabFc.js.map
82
+ //# sourceMappingURL=Tabs-DaXiF_67.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs-DaXiF_67.js","sources":["../src/components/Tabs/constants.ts","../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { createContext } from \"react\";\n\ntype TabsSize = \"default\" | \"lg\";\n\nexport const SIZE_CLASSES: Record<TabsSize, string> = {\n default: \"\",\n lg: \"text-[15px] px-3 py-1.5\",\n};\n\nexport const LIST_HEIGHT: Record<TabsSize, string> = {\n default: \"\",\n lg: \"group-data-horizontal/tabs:h-10\",\n};\n\nexport const TabsSizeContext = createContext<TabsSize>(\"default\");\n","import React, { forwardRef, useContext } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/shared/renderIcon\";\nimport { hyphenize } from \"src/utils/hyphenize\";\nimport {\n Tabs as PrimitiveTabs,\n TabsList as PrimitiveTabsList,\n TabsTrigger as PrimitiveTabsTrigger,\n TabsContent as PrimitiveTabsContent,\n} from \"src/primitives/Tabs\";\n\nimport { SIZE_CLASSES, LIST_HEIGHT, TabsSizeContext } from \"./constants\";\n\ntype LinkTo = React.ComponentProps<typeof Link>[\"to\"];\n\ntype TabsSize = \"default\" | \"lg\";\n\nexport interface TabsProps extends React.ComponentProps<typeof PrimitiveTabs> {\n /** Size of tab triggers. Applied to all Tabs.Item children. */\n size?: TabsSize;\n}\n\ntype TabsListProps = React.ComponentProps<typeof PrimitiveTabsList>;\n\ninterface TabsItemProps extends React.ComponentProps<\n typeof PrimitiveTabsTrigger\n> {\n /** Icon component, element, or class-name string rendered before the label. */\n icon?: IconProp;\n /** When set, the trigger renders as a react-router-dom Link to this path. */\n to?: LinkTo;\n /** Custom data-testid attribute. Defaults to `${hyphenize(value)}-tab`. */\n dataTestid?: string;\n}\n\ntype TabsContentProps = React.ComponentProps<typeof PrimitiveTabsContent>;\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsProps>(\n ({ size = \"default\", children, ...props }, ref) => (\n <TabsSizeContext.Provider value={size}>\n <PrimitiveTabs ref={ref} data-testid=\"tab-container\" {...props}>\n {children}\n </PrimitiveTabs>\n </TabsSizeContext.Provider>\n )\n);\nTabsRoot.displayName = \"Tabs\";\n\nconst TabsListComponent = forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, ...props }, ref) => {\n const size = useContext(TabsSizeContext);\n\n return (\n <PrimitiveTabsList\n ref={ref}\n className={cn(LIST_HEIGHT[size], className)}\n {...props}\n />\n );\n }\n);\nTabsListComponent.displayName = \"Tabs.List\";\n\nconst TabsItemComponent = forwardRef<HTMLButtonElement, TabsItemProps>(\n ({ icon, className, children, to, dataTestid, ...otherProps }, ref) => {\n const size = useContext(TabsSizeContext);\n const testId =\n dataTestid ??\n (otherProps.value != null\n ? `${hyphenize(String(otherProps.value))}-tab`\n : undefined);\n const content = icon ? (\n <>\n {renderIcon(icon, size === \"lg\" ? \"size-5\" : \"size-4\")}\n {children}\n </>\n ) : (\n children\n );\n\n if (to !== undefined) {\n return (\n <PrimitiveTabsTrigger\n asChild\n ref={ref}\n className={cn(SIZE_CLASSES[size], icon && \"gap-1.5\", className)}\n data-testid={testId}\n {...otherProps}\n >\n <Link to={to}>{content}</Link>\n </PrimitiveTabsTrigger>\n );\n }\n\n return (\n <PrimitiveTabsTrigger\n ref={ref}\n className={cn(SIZE_CLASSES[size], icon && \"gap-1.5\", className)}\n data-testid={testId}\n {...otherProps}\n >\n {content}\n </PrimitiveTabsTrigger>\n );\n }\n);\nTabsItemComponent.displayName = \"Tabs.Item\";\n\nconst TabsContentComponent = forwardRef<HTMLDivElement, TabsContentProps>(\n (props, ref) => <PrimitiveTabsContent ref={ref} {...props} />\n);\nTabsContentComponent.displayName = \"Tabs.Content\";\n\nconst Tabs = Object.assign(TabsRoot, {\n List: TabsListComponent,\n Item: TabsItemComponent,\n Content: TabsContentComponent,\n});\n\nexport { Tabs };\n"],"names":["PrimitiveTabs","PrimitiveTabsList","PrimitiveTabsTrigger","PrimitiveTabsContent"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { forwardRef, useId, useState } from 'react';
3
3
  import { c as cn } from './utils-BJnb9o5c.js';
4
4
  import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from './primitives/Field.js';
5
5
  import { Textarea as Textarea$1 } from './primitives/Textarea.js';
6
+ import { b as buildTestIdPrefix } from './fieldIds-VpluAAMl.js';
6
7
 
7
8
  const SIZE_ROWS = {
8
9
  small: 1,
@@ -37,6 +38,7 @@ const Textarea = forwardRef(
37
38
  nakedTextarea = false,
38
39
  labelProps,
39
40
  className = "",
41
+ dataTestId,
40
42
  rows: rowsProp,
41
43
  onBlur,
42
44
  onChange,
@@ -47,6 +49,7 @@ const Textarea = forwardRef(
47
49
  const id = otherProps.id ?? generatedId;
48
50
  const errorId = `error_${id}`;
49
51
  const helpTextId = `helpText_${id}`;
52
+ const testIdPrefix = buildTestIdPrefix(dataTestId, label);
50
53
  const [valueInternal, setValueInternal] = useState(controlledValue ?? "");
51
54
  const isControlled = controlledValue !== void 0;
52
55
  const value = isControlled ? controlledValue : valueInternal;
@@ -90,6 +93,7 @@ const Textarea = forwardRef(
90
93
  nakedTextarea && "border-transparent shadow-none px-0 py-0 focus-visible:border-transparent focus-visible:ring-0",
91
94
  !!error && "border-destructive ring-destructive/20 ring-3"
92
95
  ),
96
+ "data-testid": `${testIdPrefix}-text-input`,
93
97
  value,
94
98
  onBlur: handleBlur,
95
99
  onChange: handleChange,
@@ -124,6 +128,7 @@ const Textarea = forwardRef(
124
128
  resize === "none" && "resize-none",
125
129
  resize === "vertical" && "resize-y"
126
130
  ),
131
+ "data-testid": `${testIdPrefix}-text-input`,
127
132
  value,
128
133
  onBlur: handleBlur,
129
134
  onChange: handleChange,
@@ -147,10 +152,18 @@ const Textarea = forwardRef(
147
152
  "data-testid": "nui-textarea-wrapper",
148
153
  children: [
149
154
  (label || isCharacterLimitVisible) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
150
- label && /* @__PURE__ */ jsxs(FieldLabel, { htmlFor: id, ...labelProps, children: [
151
- label,
152
- required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
153
- ] }),
155
+ label && /* @__PURE__ */ jsxs(
156
+ FieldLabel,
157
+ {
158
+ htmlFor: id,
159
+ "data-testid": `${testIdPrefix}-label`,
160
+ ...labelProps,
161
+ children: [
162
+ label,
163
+ required && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" })
164
+ ]
165
+ }
166
+ ),
154
167
  isCharacterLimitVisible && /* @__PURE__ */ jsxs(
155
168
  "span",
156
169
  {
@@ -168,8 +181,22 @@ const Textarea = forwardRef(
168
181
  ] }),
169
182
  /* @__PURE__ */ jsxs(FieldContent, { children: [
170
183
  textareaWithAffixes,
171
- !!error && /* @__PURE__ */ jsx(FieldError, { "data-testid": "input-error", id: errorId, children: error }),
172
- helpText && /* @__PURE__ */ jsx(FieldDescription, { id: helpTextId, children: helpText })
184
+ !!error && /* @__PURE__ */ jsx(
185
+ FieldError,
186
+ {
187
+ id: errorId,
188
+ "data-testid": `${testIdPrefix}-input-error`,
189
+ children: error
190
+ }
191
+ ),
192
+ helpText && /* @__PURE__ */ jsx(
193
+ FieldDescription,
194
+ {
195
+ id: helpTextId,
196
+ "data-testid": `${testIdPrefix}-input-help`,
197
+ children: helpText
198
+ }
199
+ )
173
200
  ] })
174
201
  ]
175
202
  }
@@ -179,4 +206,4 @@ const Textarea = forwardRef(
179
206
  Textarea.displayName = "Textarea";
180
207
 
181
208
  export { Textarea as T };
182
- //# sourceMappingURL=Textarea-CMGZZ4rL.js.map
209
+ //# sourceMappingURL=Textarea-CUe09-sr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Textarea-CUe09-sr.js","sources":["../src/components/Textarea/constants.ts","../src/components/Textarea/utils.ts","../src/components/Textarea/Textarea.tsx"],"sourcesContent":["type TextareaSize = \"small\" | \"medium\" | \"large\";\n\nconst SIZE_ROWS: Record<TextareaSize, number> = {\n small: 1,\n medium: 3,\n large: 4,\n};\n\nconst SIZE_MIN_HEIGHT: Record<TextareaSize, string> = {\n small: \"min-h-8\",\n medium: \"min-h-20\",\n large: \"min-h-28\",\n};\n\nexport { SIZE_ROWS, SIZE_MIN_HEIGHT };\nexport type { TextareaSize };\n","function getTrimmedValue(\n value: string | number,\n disableTrimOnBlur: boolean\n): string | number {\n if (disableTrimOnBlur || typeof value !== \"string\") return value;\n return value.trim();\n}\n\nexport { getTrimmedValue };\n","import React, { forwardRef, useId, useState } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport { Textarea as PrimitiveTextarea } from \"src/primitives/Textarea\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\n\nimport { SIZE_ROWS, SIZE_MIN_HEIGHT } from \"./constants\";\nimport { getTrimmedValue } from \"./utils\";\n\nimport type { TextareaSize } from \"./constants\";\n\ntype TextareaResize = \"vertical\" | \"none\";\n\ntype PrimitiveTextareaProps = React.ComponentProps<typeof PrimitiveTextarea>;\n\nexport interface TextareaProps extends Omit<\n PrimitiveTextareaProps,\n \"size\" | \"children\" | \"prefix\" | \"value\"\n> {\n /** Controlled value. */\n value?: string | number;\n /** Size of the textarea. Controls default rows: small=1, medium=3, large=4. */\n size?: TextareaSize;\n /** Resize behavior. */\n resize?: TextareaResize;\n /** Label displayed above the textarea. */\n label?: string;\n /** Error message displayed below the textarea. */\n error?: string;\n /** Help text displayed below the textarea. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Maximum character limit. Counter visible at 85% capacity. */\n maxLength?: number;\n /** Allow typing past maxLength, show error styling on count. */\n unlimitedChars?: boolean;\n /** Prevent trimming whitespace on blur. */\n disableTrimOnBlur?: boolean;\n /** Content to display before the textarea. */\n prefix?: React.ReactNode;\n /** Content to display after the textarea. */\n suffix?: React.ReactNode;\n /** Render the textarea without borders. */\n nakedTextarea?: boolean;\n /** Props forwarded to the Label element. */\n labelProps?: React.ComponentProps<typeof FieldLabel>;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** Prefix for the field's testid family(label, input, error, help). Falls back to the hyphenized label. */\n dataTestId?: string;\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n size = \"medium\",\n resize = \"vertical\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n disabled = false,\n required = false,\n maxLength,\n unlimitedChars = false,\n disableTrimOnBlur = false,\n prefix,\n suffix,\n nakedTextarea = false,\n labelProps,\n className = \"\",\n dataTestId,\n rows: rowsProp,\n onBlur,\n onChange,\n value: controlledValue,\n ...otherProps\n },\n ref\n ) => {\n const generatedId = useId();\n const id = otherProps.id ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n\n // Controlled / uncontrolled value tracking\n const [valueInternal, setValueInternal] = useState(controlledValue ?? \"\");\n const isControlled = controlledValue !== undefined;\n\n const value = isControlled ? controlledValue : valueInternal;\n const valueLength = value?.toString().length || 0;\n\n const isMaxLengthPresent = !!maxLength || maxLength === 0;\n const isCharacterLimitVisible =\n isMaxLengthPresent && valueLength >= maxLength! * 0.85;\n const maxLengthError = unlimitedChars && valueLength > maxLength!;\n\n const rows = rowsProp ?? SIZE_ROWS[size];\n\n // --- Handlers ---\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setValueInternal(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n const trimmedValue = getTrimmedValue(value ?? \"\", disableTrimOnBlur);\n\n if (trimmedValue !== value) {\n e.target.value = trimmedValue.toString();\n handleChange(e as unknown as React.ChangeEvent<HTMLTextAreaElement>);\n }\n\n onBlur?.(e);\n };\n\n // --- aria-describedby ---\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n // --- Textarea element ---\n\n const hasField = !!(label || error || helpText);\n\n const textareaElement = (\n <PrimitiveTextarea\n ref={ref}\n id={id}\n rows={rows}\n disabled={disabled}\n required={required}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n className={cn(\n // Override shadcn's field-sizing-content and min-h-16 so rows works\n \"!field-sizing-normal\",\n SIZE_MIN_HEIGHT[size],\n resize === \"none\" && \"resize-none\",\n resize === \"vertical\" && \"resize-y\",\n nakedTextarea &&\n \"border-transparent shadow-none px-0 py-0 focus-visible:border-transparent focus-visible:ring-0\",\n !!error && \"border-destructive ring-destructive/20 ring-3\"\n )}\n data-testid={`${testIdPrefix}-text-input`}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n {...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {})}\n {...otherProps}\n />\n );\n\n const hasPrefixSuffix = !!(prefix || suffix);\n\n const textareaWithAffixes = hasPrefixSuffix ? (\n <div\n className={cn(\n \"flex items-start gap-2 rounded-lg border border-input px-2.5 py-2 focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\",\n !!error && \"border-destructive ring-destructive/20 ring-3\",\n nakedTextarea && \"border-transparent shadow-none\"\n )}\n >\n {prefix && (\n <div className=\"shrink-0 pt-0.5 text-muted-foreground\">{prefix}</div>\n )}\n <PrimitiveTextarea\n ref={ref}\n id={id}\n rows={rows}\n disabled={disabled}\n required={required}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n className={cn(\n \"!field-sizing-normal border-0 p-0 shadow-none focus-visible:border-0 focus-visible:ring-0\",\n SIZE_MIN_HEIGHT[size],\n resize === \"none\" && \"resize-none\",\n resize === \"vertical\" && \"resize-y\"\n )}\n data-testid={`${testIdPrefix}-text-input`}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n {...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {})}\n {...otherProps}\n />\n {suffix && (\n <div className=\"shrink-0 pt-0.5 text-muted-foreground\">{suffix}</div>\n )}\n </div>\n ) : (\n textareaElement\n );\n\n if (!hasField) {\n return (\n <div className={cn(className)} data-testid=\"nui-textarea-wrapper\">\n {textareaWithAffixes}\n </div>\n );\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n data-testid=\"nui-textarea-wrapper\"\n >\n {(label || isCharacterLimitVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel\n htmlFor={id}\n data-testid={`${testIdPrefix}-label`}\n {...labelProps}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n {isCharacterLimitVisible && (\n <span\n className={cn(\n \"text-xs tabular-nums\",\n maxLengthError ? \"text-destructive\" : \"text-muted-foreground\"\n )}\n >\n {valueLength}/{maxLength}\n </span>\n )}\n </div>\n )}\n <FieldContent>\n {textareaWithAffixes}\n {!!error && (\n <FieldError\n id={errorId}\n data-testid={`${testIdPrefix}-input-error`}\n >\n {error}\n </FieldError>\n )}\n {helpText && (\n <FieldDescription\n id={helpTextId}\n data-testid={`${testIdPrefix}-input-help`}\n >\n {helpText}\n </FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n"],"names":["PrimitiveTextarea"],"mappings":";;;;;;;AAEA,MAAM,SAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEA,MAAM,eAAA,GAAgD;AAAA,EACpD,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;;ACZA,SAAS,eAAA,CACP,OACA,iBAAA,EACiB;AACjB,EAAA,IAAI,iBAAA,IAAqB,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAC3D,EAAA,OAAO,MAAM,IAAA,EAAK;AACpB;;ACoDA,MAAM,QAAA,GAAW,UAAA;AAAA,EACf,CACE;AAAA,IACE,IAAA,GAAO,QAAA;AAAA,IACP,MAAA,GAAS,UAAA;AAAA,IACT,KAAA,GAAQ,EAAA;AAAA,IACR,KAAA,GAAQ,EAAA;AAAA,IACR,QAAA,GAAW,EAAA;AAAA,IACX,QAAA,GAAW,KAAA;AAAA,IACX,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,cAAA,GAAiB,KAAA;AAAA,IACjB,iBAAA,GAAoB,KAAA;AAAA,IACpB,MAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA,GAAgB,KAAA;AAAA,IAChB,UAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,UAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,MAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,eAAA;AAAA,IACP,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,IAAA,MAAM,EAAA,GAAK,WAAW,EAAA,IAAM,WAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,SAAS,EAAE,CAAA,CAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,YAAY,EAAE,CAAA,CAAA;AACjC,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,UAAA,EAAY,KAAK,CAAA;AAGxD,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAS,mBAAmB,EAAE,CAAA;AACxE,IAAA,MAAM,eAAe,eAAA,KAAoB,MAAA;AAEzC,IAAA,MAAM,KAAA,GAAQ,eAAe,eAAA,GAAkB,aAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,KAAA,EAAO,QAAA,EAAS,CAAE,MAAA,IAAU,CAAA;AAEhD,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAC,SAAA,IAAa,SAAA,KAAc,CAAA;AACxD,IAAA,MAAM,uBAAA,GACJ,kBAAA,IAAsB,WAAA,IAAe,SAAA,GAAa,IAAA;AACpD,IAAA,MAAM,cAAA,GAAiB,kBAAkB,WAAA,GAAc,SAAA;AAEvD,IAAA,MAAM,IAAA,GAAO,QAAA,IAAY,SAAA,CAAU,IAAI,CAAA;AAIvC,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA8C;AAClE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACjC;AACA,MAAA,QAAA,GAAW,CAAC,CAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAA6C;AAC/D,MAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,KAAA,IAAS,EAAA,EAAI,iBAAiB,CAAA;AAEnE,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,YAAA,CAAa,QAAA,EAAS;AACvC,QAAA,YAAA,CAAa,CAAsD,CAAA;AAAA,MACrE;AAEA,MAAA,MAAA,GAAS,CAAC,CAAA;AAAA,IACZ,CAAA;AAIA,IAAA,MAAM,eAAA,GACJ,CAAC,KAAA,GAAQ,OAAA,GAAU,MAAM,QAAA,GAAW,UAAA,GAAa,IAAI,CAAA,CAClD,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAIlB,IAAA,MAAM,QAAA,GAAW,CAAC,EAAE,KAAA,IAAS,KAAA,IAAS,QAAA,CAAA;AAEtC,IAAA,MAAM,eAAA,mBACJ,GAAA;AAAA,MAACA,UAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,EAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA,EAAc,CAAC,CAAC,KAAA,IAAS,MAAA;AAAA,QACzB,kBAAA,EAAkB,eAAA;AAAA,QAClB,SAAA,EAAW,EAAA;AAAA;AAAA,UAET,sBAAA;AAAA,UACA,gBAAgB,IAAI,CAAA;AAAA,UACpB,WAAW,MAAA,IAAU,aAAA;AAAA,UACrB,WAAW,UAAA,IAAc,UAAA;AAAA,UACzB,aAAA,IACE,gGAAA;AAAA,UACF,CAAC,CAAC,KAAA,IAAS;AAAA,SACb;AAAA,QACA,aAAA,EAAa,GAAG,YAAY,CAAA,WAAA,CAAA;AAAA,QAC5B,KAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,QAAA,EAAU,YAAA;AAAA,QACT,GAAI,kBAAA,IAAsB,CAAC,iBAAiB,EAAE,SAAA,KAAc,EAAC;AAAA,QAC7D,GAAG;AAAA;AAAA,KACN;AAGF,IAAA,MAAM,eAAA,GAAkB,CAAC,EAAE,MAAA,IAAU,MAAA,CAAA;AAErC,IAAA,MAAM,sBAAsB,eAAA,mBAC1B,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,0IAAA;AAAA,UACA,CAAC,CAAC,KAAA,IAAS,+CAAA;AAAA,UACX,aAAA,IAAiB;AAAA,SACnB;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,MAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,0BAEjE,GAAA;AAAA,YAACA,UAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,EAAA;AAAA,cACA,IAAA;AAAA,cACA,QAAA;AAAA,cACA,QAAA;AAAA,cACA,cAAA,EAAc,CAAC,CAAC,KAAA,IAAS,MAAA;AAAA,cACzB,kBAAA,EAAkB,eAAA;AAAA,cAClB,SAAA,EAAW,EAAA;AAAA,gBACT,2FAAA;AAAA,gBACA,gBAAgB,IAAI,CAAA;AAAA,gBACpB,WAAW,MAAA,IAAU,aAAA;AAAA,gBACrB,WAAW,UAAA,IAAc;AAAA,eAC3B;AAAA,cACA,aAAA,EAAa,GAAG,YAAY,CAAA,WAAA,CAAA;AAAA,cAC5B,KAAA;AAAA,cACA,MAAA,EAAQ,UAAA;AAAA,cACR,QAAA,EAAU,YAAA;AAAA,cACT,GAAI,kBAAA,IAAsB,CAAC,iBAAiB,EAAE,SAAA,KAAc,EAAC;AAAA,cAC7D,GAAG;AAAA;AAAA,WACN;AAAA,UACC,MAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAyC,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,KAEnE,GAEA,eAAA;AAGF,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,uBACE,GAAA,CAAC,SAAI,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA,EAAG,aAAA,EAAY,wBACxC,QAAA,EAAA,mBAAA,EACH,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,iBAAe,QAAA,IAAY,MAAA;AAAA,QAC3B,cAAA,EAAc,CAAC,CAAC,KAAA,IAAS,MAAA;AAAA,QACzB,SAAA;AAAA,QACA,aAAA,EAAY,sBAAA;AAAA,QAEV,QAAA,EAAA;AAAA,UAAA,CAAA,KAAA,IAAS,uBAAA,qBACT,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,oBACC,IAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,EAAA;AAAA,gBACT,aAAA,EAAa,GAAG,YAAY,CAAA,MAAA,CAAA;AAAA,gBAC3B,GAAG,UAAA;AAAA,gBAEH,QAAA,EAAA;AAAA,kBAAA,KAAA;AAAA,kBACA,4BACC,GAAA,CAAC,MAAA,EAAA,EAAK,eAAY,MAAA,EAAO,SAAA,EAAU,oBAAmB,QAAA,EAAA,GAAA,EAEtD;AAAA;AAAA;AAAA,aAEJ;AAAA,YAED,uBAAA,oBACC,IAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,EAAA;AAAA,kBACT,sBAAA;AAAA,kBACA,iBAAiB,kBAAA,GAAqB;AAAA,iBACxC;AAAA,gBAEC,QAAA,EAAA;AAAA,kBAAA,WAAA;AAAA,kBAAY,GAAA;AAAA,kBAAE;AAAA;AAAA;AAAA;AACjB,WAAA,EAEJ,CAAA;AAAA,+BAED,YAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,mBAAA;AAAA,YACA,CAAC,CAAC,KAAA,oBACD,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,OAAA;AAAA,gBACJ,aAAA,EAAa,GAAG,YAAY,CAAA,YAAA,CAAA;AAAA,gBAE3B,QAAA,EAAA;AAAA;AAAA,aACH;AAAA,YAED,QAAA,oBACC,GAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,UAAA;AAAA,gBACJ,aAAA,EAAa,GAAG,YAAY,CAAA,WAAA,CAAA;AAAA,gBAE3B,QAAA,EAAA;AAAA;AAAA;AACH,WAAA,EAEJ;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;;;;"}
@@ -3,6 +3,7 @@ import { forwardRef, useId, useRef, useCallback, useState, useMemo, useEffect }
3
3
  import { Popover, PopoverAnchor, PopoverContent } from './primitives/Popover.js';
4
4
  import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from './primitives/Field.js';
5
5
  import { c as cn } from './utils-BJnb9o5c.js';
6
+ import { b as buildTestIdPrefix } from './fieldIds-VpluAAMl.js';
6
7
  import { u as useControlledOpen, c as coerceToTimeValue, f as formatTimeWithPattern, a as formatTimeDisplay, t as timeValueEquals, b as useOutsideClickClose, d as buildMaskTemplate, g as getDefaultTimeMaskFormat, e as useCursorRestore, S as SIZE_CONFIG, T as TimePickerPanel, h as timeValueToDayjs, i as getTimePlaceholder, j as applyMask, p as parseTimeWithPattern, k as parseTimeString } from './TimePickerPanel--KDX5QwS.js';
7
8
  import { c as createLucideIcon } from './createLucideIcon-C8ycilSN.js';
8
9
  import { X } from './x-_o2T3n6D.js';
@@ -45,11 +46,13 @@ const TimePicker = forwardRef(
45
46
  needConfirm = true,
46
47
  onOk,
47
48
  labelProps,
48
- className
49
+ className,
50
+ dataTestId
49
51
  }, ref) => {
50
52
  const generatedId = useId();
51
53
  const errorId = `error_${generatedId}`;
52
54
  const helpTextId = `helpText_${generatedId}`;
55
+ const testIdPrefix = buildTestIdPrefix(dataTestId, label);
53
56
  const containerRef = useRef(null);
54
57
  const fromInputRef = useRef(null);
55
58
  const toInputRef = useRef(null);
@@ -432,8 +435,22 @@ const TimePicker = forwardRef(
432
435
  ),
433
436
  /* @__PURE__ */ jsxs(FieldContent, { children: [
434
437
  triggerContent,
435
- !!error && /* @__PURE__ */ jsx(FieldError, { id: errorId, children: error }),
436
- helpText && /* @__PURE__ */ jsx(FieldDescription, { id: helpTextId, children: helpText })
438
+ !!error && /* @__PURE__ */ jsx(
439
+ FieldError,
440
+ {
441
+ id: errorId,
442
+ "data-testid": `${testIdPrefix}-input-error`,
443
+ children: error
444
+ }
445
+ ),
446
+ helpText && /* @__PURE__ */ jsx(
447
+ FieldDescription,
448
+ {
449
+ id: helpTextId,
450
+ "data-testid": `${testIdPrefix}-input-help`,
451
+ children: helpText
452
+ }
453
+ )
437
454
  ] })
438
455
  ]
439
456
  }
@@ -443,4 +460,4 @@ const TimePicker = forwardRef(
443
460
  TimePicker.displayName = "TimePicker";
444
461
 
445
462
  export { TimePicker as T };
446
- //# sourceMappingURL=TimePicker-Ca7iF-a_.js.map
463
+ //# sourceMappingURL=TimePicker-BixF9wdU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimePicker-BixF9wdU.js","sources":["../node_modules/lucide-react/dist/esm/icons/clock.js","../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 6v6l4 2\", key: \"mmk7yg\" }]\n];\nconst Clock = createLucideIcon(\"clock\", __iconNode);\n\nexport { __iconNode, Clock as default };\n//# sourceMappingURL=clock.js.map\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { Clock, X } from \"lucide-react\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"src/primitives/Popover\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { useControlledOpen } from \"src/hooks/useControlledOpen\";\nimport { useCursorRestore } from \"src/hooks/useCursorRestore\";\nimport { useOutsideClickClose } from \"src/hooks/useOutsideClickClose\";\n\nimport type { Dayjs } from \"dayjs\";\n\nimport { TimePickerPanel } from \"./TimePickerPanel\";\nimport { SIZE_CONFIG } from \"./constants\";\nimport type { TimePickerProps, TimeValue } from \"./types\";\nimport {\n coerceToTimeValue,\n formatTimeDisplay,\n formatTimeWithPattern,\n getDefaultTimeMaskFormat,\n getTimePlaceholder,\n parseTimeString,\n parseTimeWithPattern,\n timeValueEquals,\n timeValueToDayjs,\n} from \"./utils\";\nimport { applyMask, buildMaskTemplate } from \"src/utils/inputMask\";\n\ntype RangeSide = \"from\" | \"to\";\n\nconst TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n value,\n onChange,\n onBlur,\n type = \"time\",\n format = \"24\",\n displayFormat,\n showSeconds = false,\n minuteStep = 1,\n secondStep = 1,\n disabled = false,\n placeholder,\n label,\n error,\n helpText,\n size = \"medium\",\n required = false,\n timezone,\n open: openProp,\n onOpenChange,\n needConfirm = true,\n onOk,\n labelProps,\n className,\n dataTestId,\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 const containerRef = useRef<HTMLDivElement>(null);\n const fromInputRef = useRef<HTMLInputElement>(null);\n const toInputRef = useRef<HTMLInputElement>(null);\n const fromCursorRef = useRef<number | null>(null);\n const toCursorRef = useRef<number | null>(null);\n\n const popoverContentId = useRef(\n `timepicker-popover-${generatedId}`\n ).current;\n\n const committedRef = useRef<{\n from: TimeValue | null;\n to: TimeValue | null;\n }>({ from: null, to: null });\n\n const { open, setOpen } = useControlledOpen(openProp, onOpenChange);\n\n const isRange = type === \"range\";\n\n const getInitialTimes = useCallback(() => {\n if (isRange) {\n if (!value || !Array.isArray(value)) {\n return { from: null, to: null };\n }\n\n return {\n from: coerceToTimeValue(value[0] as TimeValue | Date | Dayjs | null),\n to: coerceToTimeValue(value[1] as TimeValue | Date | Dayjs | null),\n };\n }\n\n return {\n from: coerceToTimeValue(\n value as TimeValue | Date | Dayjs | null | undefined\n ),\n to: null,\n };\n }, [value, isRange]);\n\n const formatOne = useCallback(\n (time: TimeValue | null) =>\n displayFormat\n ? formatTimeWithPattern(time, displayFormat)\n : formatTimeDisplay(time, format, showSeconds),\n [displayFormat, format, showSeconds]\n );\n\n const [activeSide, setActiveSide] = useState<RangeSide>(\"from\");\n const [fromTime, setFromTime] = useState(() => getInitialTimes().from);\n const [toTime, setToTime] = useState(() => getInitialTimes().to);\n\n const [fromText, setFromText] = useState(() =>\n formatOne(getInitialTimes().from)\n );\n const [toText, setToText] = useState(() => formatOne(getInitialTimes().to));\n\n const parseOne = (text: string): TimeValue | null =>\n displayFormat\n ? parseTimeWithPattern(text, displayFormat)\n : parseTimeString(text, format);\n\n const emitChange = (from: TimeValue | null, to: TimeValue | null) => {\n if (isRange) {\n if (!from || !to) {\n onChange?.(null, [\"\", \"\"]);\n\n return;\n }\n\n onChange?.(\n [timeValueToDayjs(from), timeValueToDayjs(to)],\n [formatOne(from), formatOne(to)]\n );\n\n return;\n }\n\n if (!from) {\n onChange?.(null, \"\");\n\n return;\n }\n\n onChange?.(timeValueToDayjs(from), formatOne(from));\n };\n\n const commitPendingOnClose = useCallback(() => {\n if (!needConfirm) {\n setFromText(formatOne(fromTime));\n setToText(formatOne(toTime));\n\n return;\n }\n\n const { from: committedFrom, to: committedTo } = committedRef.current;\n const unchanged =\n timeValueEquals(fromTime, committedFrom) &&\n timeValueEquals(toTime, committedTo);\n if (unchanged) return;\n\n emitChange(fromTime, toTime);\n committedRef.current = { from: fromTime, to: toTime };\n }, [needConfirm, fromTime, toTime, formatOne, isRange, onChange]);\n\n const closePopover = useCallback(() => {\n commitPendingOnClose();\n setOpen(false);\n }, [commitPendingOnClose, setOpen]);\n\n useOutsideClickClose({\n enabled: open,\n containerRef,\n popoverElementId: popoverContentId,\n onClose: closePopover,\n });\n\n const maskTemplate = useMemo(\n () =>\n displayFormat\n ? null\n : buildMaskTemplate(getDefaultTimeMaskFormat(format, showSeconds)),\n [displayFormat, format, showSeconds]\n );\n\n const handleOk = () => {\n if (isRange && activeSide === \"from\" && fromTime && !toTime) {\n setActiveSide(\"to\");\n toInputRef.current?.focus();\n\n return;\n }\n\n committedRef.current = { from: fromTime, to: toTime };\n emitChange(fromTime, toTime);\n\n if (isRange) {\n if (fromTime && toTime) {\n onOk?.([timeValueToDayjs(fromTime), timeValueToDayjs(toTime)]);\n } else {\n onOk?.(null);\n }\n } else {\n onOk?.(fromTime ? timeValueToDayjs(fromTime) : null);\n }\n\n setOpen(false);\n };\n\n const handlePanelChange = (time: TimeValue) => {\n if (!isRange) {\n setFromTime(time);\n setFromText(formatOne(time));\n if (!needConfirm) emitChange(time, null);\n\n return;\n }\n\n if (activeSide === \"from\") {\n setFromTime(time);\n setFromText(formatOne(time));\n if (!needConfirm) emitChange(time, toTime);\n\n return;\n }\n\n setToTime(time);\n setToText(formatOne(time));\n if (!needConfirm) emitChange(fromTime, time);\n };\n\n const buildInputChangeHandler =\n (side: RangeSide) => (e: React.ChangeEvent<HTMLInputElement>) => {\n let text = e.target.value;\n const previousText = side === \"from\" ? fromText : toText;\n\n if (maskTemplate) {\n const masked = applyMask(\n text,\n maskTemplate,\n previousText,\n e.target.selectionStart\n );\n text = masked.text;\n\n if (side === \"from\") fromCursorRef.current = masked.cursorPosition;\n else toCursorRef.current = masked.cursorPosition;\n }\n\n if (side === \"from\") setFromText(text);\n else setToText(text);\n\n const parsed = parseOne(text);\n if (!parsed) return;\n\n if (side === \"from\") {\n setFromTime(parsed);\n if (!needConfirm) emitChange(parsed, toTime);\n } else {\n setToTime(parsed);\n if (!needConfirm) emitChange(fromTime, parsed);\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Escape\") {\n const { from, to } = committedRef.current;\n setFromTime(from);\n setToTime(to);\n setFromText(formatOne(from));\n setToText(formatOne(to));\n setOpen(false);\n\n return;\n }\n\n if (e.key !== \"Enter\") return;\n\n if (needConfirm) {\n handleOk();\n\n return;\n }\n\n setFromText(formatOne(fromTime));\n setToText(formatOne(toTime));\n setOpen(false);\n };\n\n const handleInputFocus = (side: RangeSide) => {\n setActiveSide(side);\n if (!open) setOpen(true);\n };\n\n const handleInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const next = e.relatedTarget as HTMLElement | null;\n if (next && containerRef.current?.contains(next)) return;\n\n const popoverEl = document.getElementById(popoverContentId);\n if (next && popoverEl?.contains(next)) return;\n\n onBlur?.(e);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n setFromTime(null);\n setToTime(null);\n setFromText(\"\");\n setToText(\"\");\n\n committedRef.current = { from: null, to: null };\n onChange?.(null, isRange ? [\"\", \"\"] : \"\");\n };\n\n useEffect(() => {\n if (value === undefined) return;\n\n const next = getInitialTimes();\n setFromTime(next.from);\n setToTime(next.to);\n if (open) return;\n\n setFromText(formatOne(next.from));\n setToText(formatOne(next.to));\n committedRef.current = { from: next.from, to: next.to };\n }, [value, getInitialTimes, formatOne, open]);\n\n useEffect(() => {\n if (!open) return;\n\n committedRef.current = { from: fromTime, to: toTime };\n }, [open]);\n\n useCursorRestore([\n { inputRef: fromInputRef, cursorRef: fromCursorRef },\n { inputRef: toInputRef, cursorRef: toCursorRef },\n ]);\n\n const singlePlaceholder = getTimePlaceholder(\n format,\n showSeconds,\n displayFormat\n );\n\n const hasField = !!(label || error || helpText);\n const sizeConfig = SIZE_CONFIG[size];\n const hasAnyValue = !!(fromText || toText);\n const activeTime = activeSide === \"from\" ? fromTime : toTime;\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n const inputBaseClass = cn(\n \"min-w-0 bg-transparent outline-none placeholder:text-muted-foreground\",\n \"disabled:cursor-not-allowed\",\n sizeConfig.input\n );\n\n const triggerContent = (\n <Popover open={open}>\n <PopoverAnchor asChild>\n <div\n ref={containerRef}\n className={cn(\n \"relative flex w-full items-center gap-2 rounded-md border border-input bg-transparent pe-8 ps-3\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\",\n disabled && \"cursor-not-allowed opacity-50\",\n !!error && \"border-destructive ring-destructive/20 ring-3\",\n sizeConfig.trigger,\n !hasField && className\n )}\n >\n {timezone ? (\n <span className=\"shrink-0 rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground\">\n {timezone.toUpperCase()}\n </span>\n ) : (\n <Clock\n className={cn(\n \"shrink-0 text-muted-foreground\",\n sizeConfig.icon\n )}\n />\n )}\n {isRange ? (\n <>\n <input\n ref={fromInputRef}\n type=\"text\"\n disabled={disabled}\n aria-label={\n label ? `${label} start time` : \"Pick a start time\"\n }\n aria-describedby={ariaDescribedBy}\n aria-invalid={!!error || undefined}\n placeholder={placeholder ?? singlePlaceholder}\n value={fromText}\n onChange={buildInputChangeHandler(\"from\")}\n onKeyDown={handleInputKeyDown}\n onFocus={() => handleInputFocus(\"from\")}\n onBlur={handleInputBlur}\n className={cn(inputBaseClass, \"flex-1\")}\n />\n <span\n aria-hidden=\"true\"\n className=\"shrink-0 text-muted-foreground\"\n >\n ~\n </span>\n <input\n ref={toInputRef}\n type=\"text\"\n disabled={disabled}\n aria-label={label ? `${label} end time` : \"Pick an end time\"}\n aria-describedby={ariaDescribedBy}\n aria-invalid={!!error || undefined}\n placeholder={placeholder ?? singlePlaceholder}\n value={toText}\n onChange={buildInputChangeHandler(\"to\")}\n onKeyDown={handleInputKeyDown}\n onFocus={() => handleInputFocus(\"to\")}\n onBlur={handleInputBlur}\n className={cn(inputBaseClass, \"flex-1\")}\n />\n </>\n ) : (\n <input\n ref={fromInputRef}\n type=\"text\"\n disabled={disabled}\n aria-label={label || \"Pick a time\"}\n aria-describedby={ariaDescribedBy}\n aria-invalid={!!error || undefined}\n placeholder={placeholder ?? singlePlaceholder}\n value={fromText}\n onChange={buildInputChangeHandler(\"from\")}\n onKeyDown={handleInputKeyDown}\n onFocus={() => handleInputFocus(\"from\")}\n onBlur={handleInputBlur}\n className={cn(inputBaseClass, \"flex-1\")}\n />\n )}\n <button\n type=\"button\"\n onPointerDown={e => e.preventDefault()}\n onClick={handleClear}\n className={cn(\n \"absolute inset-y-0 end-2 flex items-center text-muted-foreground hover:text-foreground focus:outline-none\",\n !(hasAnyValue && !disabled) && \"invisible\"\n )}\n aria-label={isRange ? \"Clear time range\" : \"Clear time\"}\n tabIndex={-1}\n >\n <X className={sizeConfig.icon} />\n </button>\n </div>\n </PopoverAnchor>\n {open && (\n <PopoverContent\n id={popoverContentId}\n className=\"w-auto p-0\"\n align=\"start\"\n onOpenAutoFocus={e => e.preventDefault()}\n onCloseAutoFocus={e => e.preventDefault()}\n onPointerDownOutside={e => e.preventDefault()}\n onInteractOutside={e => e.preventDefault()}\n >\n <TimePickerPanel\n value={activeTime ?? undefined}\n onChange={handlePanelChange}\n format={format}\n showSeconds={showSeconds}\n minuteStep={minuteStep}\n secondStep={secondStep}\n disabled={disabled}\n />\n {needConfirm && (\n <div className=\"flex items-center justify-end border-t border-border px-3 py-2\">\n <button\n type=\"button\"\n onClick={handleOk}\n className=\"rounded bg-primary px-3 py-1 text-sm font-medium text-primary-foreground hover:bg-primary/90 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n OK\n </button>\n </div>\n )}\n </PopoverContent>\n )}\n </Popover>\n );\n\n if (!hasField) {\n return (\n <div ref={ref} className={className}>\n {triggerContent}\n </div>\n );\n }\n\n return (\n <Field\n ref={ref}\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {label && (\n <FieldLabel\n {...(labelProps as React.ComponentProps<typeof FieldLabel>)}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n <FieldContent>\n {triggerContent}\n {!!error && (\n <FieldError\n id={errorId}\n data-testid={`${testIdPrefix}-input-error`}\n >\n {error}\n </FieldError>\n )}\n {helpText && (\n <FieldDescription\n id={helpTextId}\n data-testid={`${testIdPrefix}-input-help`}\n >\n {helpText}\n </FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nTimePicker.displayName = \"TimePicker\";\n\nexport { TimePicker };\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
@@ -131,7 +131,14 @@ const ToastrBody = ({
131
131
  VARIANT_CLASSES[type]
132
132
  ),
133
133
  children: [
134
- showIcon && /* @__PURE__ */ jsx(Icon, { "aria-hidden": true, className: "size-4 shrink-0" }),
134
+ showIcon && /* @__PURE__ */ jsx(
135
+ Icon,
136
+ {
137
+ "aria-hidden": true,
138
+ "data-testid": `${type}-toast-icon`,
139
+ className: "size-4 shrink-0"
140
+ }
141
+ ),
135
142
  /* @__PURE__ */ jsxs("span", { className: "flex-1", children: [
136
143
  message,
137
144
  copyableMessage && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -246,4 +253,4 @@ const Toastr = {
246
253
  };
247
254
 
248
255
  export { Toastr as T };
249
- //# sourceMappingURL=Toastr-Cka6pudu.js.map
256
+ //# sourceMappingURL=Toastr-CXqmoXjn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toastr-CXqmoXjn.js","sources":["../src/components/Toastr/utils.ts","../src/components/Toastr/ToastrBody.tsx","../src/components/Toastr/Toastr.tsx"],"sourcesContent":["import i18next from \"i18next\";\nimport { isValidElement, type ReactNode } from \"react\";\n\nimport type { ToastrConfig, ToastrErrorInput, ToastrMessage } from \"./Toastr\";\n\nconst activeToasts = new Set<string>();\n\nfunction toastKey(\n type: string,\n message: ReactNode,\n buttonLabel?: string\n): string | null {\n if (typeof message !== \"string\") return null;\n return `${type}::${message}::${buttonLabel ?? \"\"}`;\n}\n\nfunction getContentDir(): \"ltr\" | \"rtl\" {\n if (typeof document === \"undefined\") return \"ltr\";\n return (\n (document.documentElement.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n (document.body.getAttribute(\"dir\") as \"ltr\" | \"rtl\") ??\n \"ltr\"\n );\n}\n\nfunction resolveMessage(message: ToastrMessage): ReactNode {\n if (typeof message === \"string\") return message;\n if (isValidElement(message)) return message;\n // Arrays of ReactNodes (e.g. [<a/>, \" \", <b/>]) render natively via {message}.\n if (Array.isArray(message)) return message;\n if (message && typeof message === \"object\") {\n const obj = message as {\n noticeCode?: string;\n customMessage?: string;\n notice?: string;\n };\n if (obj.customMessage) return obj.customMessage;\n if (obj.notice) return obj.notice;\n if (obj.noticeCode) return i18next.t(obj.noticeCode);\n }\n return String(message);\n}\n\nfunction resolveErrorMessage(errorObject: ToastrErrorInput): ReactNode {\n if (typeof errorObject === \"string\") return errorObject;\n\n if (errorObject && typeof errorObject === \"object\") {\n // Axios-style error\n const axiosLike = errorObject as {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n };\n\n if (axiosLike.response?.data) {\n const data = axiosLike.response.data;\n if (data.customMessage) return String(data.customMessage);\n if (data.error) return String(data.error);\n if (Array.isArray(data.errors)) return data.errors.join(\"\\n\");\n if (data.noticeCode) return String(data.noticeCode);\n }\n\n if (axiosLike.isAxiosError && axiosLike.message) return axiosLike.message;\n\n // Native Error\n if (errorObject instanceof Error) return errorObject.message;\n\n // ToastrMessage (string, React element, array, or notice-shape object)\n return resolveMessage(errorObject as ToastrMessage);\n }\n\n return \"Something went wrong.\";\n}\n\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n\n return true;\n } catch {\n // Clipboard API is unavailable in insecure contexts; fall back to execCommand.\n try {\n const textArea = document.createElement(\"textarea\");\n textArea.value = text;\n textArea.style.position = \"fixed\";\n textArea.style.opacity = \"0\";\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n const isCopied = document.execCommand(\"copy\");\n textArea.remove();\n\n return isCopied;\n } catch {\n return false;\n }\n }\n}\n\nfunction parseConfig(args: unknown[]): ToastrConfig {\n if (args.length === 0) return {};\n\n const first = args[0];\n if (typeof first === \"object\" && first !== null && !Array.isArray(first)) {\n return first as ToastrConfig;\n }\n\n // Legacy positional args: buttonLabel, onClick, customConfig, showIcon\n const [buttonLabel, onClick, customConfig, showIcon] = args as [\n string?,\n (() => void)?,\n Record<string, unknown>?,\n boolean?,\n ];\n\n return {\n ...(buttonLabel ? { buttonLabel } : {}),\n ...(onClick ? { onClick } : {}),\n ...(showIcon !== undefined ? { showIcon } : {}),\n ...(customConfig ?? {}),\n };\n}\n\nexport {\n activeToasts,\n copyToClipboard,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n};\n","import { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n CircleCheckIcon,\n InfoIcon,\n OctagonXIcon,\n TriangleAlertIcon,\n XIcon,\n type LucideIcon,\n} from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\n\nimport { copyToClipboard } from \"./utils\";\n\ntype ToastrType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nconst ICONS: Record<ToastrType, LucideIcon> = {\n success: CircleCheckIcon,\n info: InfoIcon,\n warning: TriangleAlertIcon,\n error: OctagonXIcon,\n};\n\nconst VARIANT_CLASSES: Record<ToastrType, string> = {\n success:\n \"bg-success-solid text-success-solid-foreground border-success-solid/30\",\n error: \"bg-error-solid text-error-solid-foreground border-error-solid/30\",\n warning:\n \"bg-warning-solid text-warning-solid-foreground border-warning-solid/30\",\n info: \"bg-info-solid text-info-solid-foreground border-info-solid/30\",\n};\n\nexport interface ToastrBodyProps {\n type: ToastrType;\n message: ReactNode;\n /** Plain-text version of the message; renders a copy-to-clipboard affordance when set. */\n copyableMessage?: string;\n showIcon?: boolean;\n dismissible?: boolean;\n buttonLabel?: string;\n onAction?: () => void;\n onDismiss: () => void;\n}\n\nconst COPIED_FEEDBACK_DURATION_MS = 2000;\n\nconst ToastrBody = ({\n type,\n message,\n copyableMessage,\n showIcon = true,\n dismissible = true,\n buttonLabel,\n onAction,\n onDismiss,\n}: ToastrBodyProps) => {\n const Icon = ICONS[type];\n const { t } = useTranslation();\n const [isCopied, setIsCopied] = useState(false);\n const copiedTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n );\n\n useEffect(() => () => clearTimeout(copiedTimeoutRef.current), []);\n\n const handleCopy = async () => {\n if (!copyableMessage || !(await copyToClipboard(copyableMessage))) return;\n\n setIsCopied(true);\n clearTimeout(copiedTimeoutRef.current);\n copiedTimeoutRef.current = setTimeout(\n () => setIsCopied(false),\n COPIED_FEEDBACK_DURATION_MS\n );\n };\n\n return (\n <div\n role={type === \"error\" || type === \"warning\" ? \"alert\" : \"status\"}\n data-testid={`toastr-${type}-container`}\n className={cn(\n \"flex w-full items-center gap-3 rounded-md border px-4 py-3 text-sm shadow-lg\",\n VARIANT_CLASSES[type]\n )}\n >\n {showIcon && (\n <Icon\n aria-hidden\n data-testid={`${type}-toast-icon`}\n className=\"size-4 shrink-0\"\n />\n )}\n <span className=\"flex-1\">\n {message}\n {copyableMessage && (\n <>\n {\" \"}\n <button\n type=\"button\"\n data-testid={`toastr-${type}-copy-button`}\n className=\"text-xs italic underline-offset-2 opacity-80 transition-opacity hover:underline hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n onClick={handleCopy}\n >\n {isCopied\n ? t(\"neetoatoms.toastr.copied\", \"Copied!\")\n : t(\"neetoatoms.toastr.copyMessage\", \"Copy this error message\")}\n </button>\n </>\n )}\n </span>\n {buttonLabel && (\n <button\n type=\"button\"\n onClick={onAction}\n data-testid={`toastr-${type}-button`}\n className=\"shrink-0 text-sm font-medium underline-offset-2 hover:underline\"\n >\n {buttonLabel}\n </button>\n )}\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n data-testid=\"toastr-close-button\"\n className=\"shrink-0 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2\"\n >\n <XIcon aria-hidden className=\"size-4\" />\n </button>\n )}\n </div>\n );\n};\n\nexport { ToastrBody };\n","import type { ReactNode } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { ToastrBody } from \"./ToastrBody\";\nimport {\n activeToasts,\n getContentDir,\n parseConfig,\n resolveErrorMessage,\n resolveMessage,\n toastKey,\n} from \"./utils\";\n\nexport interface ToastrConfig {\n /** Label for an action button inside the toast. */\n buttonLabel?: string;\n /** Callback when the action button is clicked. */\n onClick?: () => void;\n /** Whether to show the type icon in the toast. */\n showIcon?: boolean;\n /** Whether the toast can be dismissed (shows X button + enables swipe). Defaults to true. */\n dismissible?: boolean;\n /** Whether to show the copy-to-clipboard affordance in error toasts. Defaults to true. */\n showCopyButton?: boolean;\n /** Additional sonner toast options (duration, position, etc.). */\n [key: string]: unknown;\n}\n\nexport type ToastrMessage =\n | ReactNode\n | { noticeCode?: string; customMessage?: string; notice?: string };\n\nexport type ToastrErrorInput =\n | string\n | Error\n | {\n response?: { data?: Record<string, unknown> };\n message?: string;\n isAxiosError?: boolean;\n }\n | ToastrMessage;\n\ntype SonnerType = \"success\" | \"info\" | \"warning\" | \"error\";\n\nfunction showToast(\n type: SonnerType,\n message: ReactNode,\n config?: ToastrConfig\n): string | number | undefined {\n const {\n buttonLabel,\n onClick,\n showIcon,\n dismissible = true,\n showCopyButton = true,\n onDismiss: userOnDismiss,\n onAutoClose: userOnAutoClose,\n ...restConfig\n } = config ?? {};\n\n const key = toastKey(type, message, buttonLabel);\n\n if (key !== null && activeToasts.has(key)) return undefined;\n if (key !== null) activeToasts.add(key);\n\n // Error toasts stay until dismissed so the message can be read and copied.\n const options: Record<string, unknown> = {\n ...(type === \"error\" && { duration: Infinity }),\n ...restConfig,\n position: getContentDir() === \"rtl\" ? \"bottom-right\" : \"bottom-left\",\n dismissible,\n onDismiss: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnDismiss as ((t: unknown) => void) | undefined)?.(t);\n },\n onAutoClose: (t: unknown) => {\n if (key !== null) activeToasts.delete(key);\n (userOnAutoClose as ((t: unknown) => void) | undefined)?.(t);\n },\n };\n\n const copyableMessage =\n showCopyButton && type === \"error\" && typeof message === \"string\"\n ? message\n : undefined;\n\n return toast.custom(\n id => (\n <ToastrBody\n buttonLabel={buttonLabel}\n copyableMessage={copyableMessage}\n dismissible={dismissible}\n message={message}\n showIcon={showIcon}\n type={type}\n onAction={() => {\n try {\n onClick?.();\n } finally {\n toast.dismiss(id);\n }\n }}\n onDismiss={() => toast.dismiss(id)}\n />\n ),\n options\n );\n}\n\nconst Toastr = {\n success(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"success\", resolveMessage(message), parseConfig(args));\n },\n\n info(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n show(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"info\", resolveMessage(message), parseConfig(args));\n },\n\n warning(message: ToastrMessage, ...args: unknown[]) {\n return showToast(\"warning\", resolveMessage(message), parseConfig(args));\n },\n\n error(errorObject: ToastrErrorInput, ...args: unknown[]) {\n const msg = resolveErrorMessage(errorObject);\n return showToast(\"error\", msg, parseConfig(args));\n },\n};\n\nexport { Toastr };\n"],"names":["i18next","CircleCheckIcon","InfoIcon","TriangleAlertIcon","OctagonXIcon","XIcon"],"mappings":"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"}
@@ -195,6 +195,7 @@ const TreeSelectTrigger = forwardRef(
195
195
  ref,
196
196
  type: "button",
197
197
  disabled: isDisabled,
198
+ "data-testid": "neeto-ui-tree-select-wrapper",
198
199
  ...rest,
199
200
  className: cn(
200
201
  "inline-flex w-full items-center gap-1 rounded-md border border-input bg-background outline-none",
@@ -336,4 +337,4 @@ const TreeSelect = forwardRef(
336
337
  TreeSelect.displayName = "TreeSelect";
337
338
 
338
339
  export { TreeSelect as T };
339
- //# sourceMappingURL=TreeSelect-wYDOZ5yD.js.map
340
+ //# sourceMappingURL=TreeSelect-DMbr7J2H.js.map