@bigbinary/neeto-atoms 1.0.101 → 1.0.103

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 (241) hide show
  1. package/dist/{Alert-CydF7eEs.js → Alert-BN00VOZx.js} +2 -2
  2. package/dist/{Alert-CydF7eEs.js.map → Alert-BN00VOZx.js.map} +1 -1
  3. package/dist/{Avatar-DxRDQDjh.js → Avatar-ChF94Ken.js} +3 -2
  4. package/dist/Avatar-ChF94Ken.js.map +1 -0
  5. package/dist/{Badge-DC6zxOwS.js → Badge-Bl5cyQ5Q.js} +4 -1
  6. package/dist/Badge-Bl5cyQ5Q.js.map +1 -0
  7. package/dist/{Button-DV9xCqlc.js → Button-C4c_dj-f.js} +2 -2
  8. package/dist/{Button-DV9xCqlc.js.map → Button-C4c_dj-f.js.map} +1 -1
  9. package/dist/{Callout-BgV-Lfuu.js → Callout-DJGi3MQR.js} +2 -1
  10. package/dist/{Callout-BgV-Lfuu.js.map → Callout-DJGi3MQR.js.map} +1 -1
  11. package/dist/{Checkbox-m4rEnxUz.js → Checkbox-DiAngQvO.js} +4 -2
  12. package/dist/Checkbox-DiAngQvO.js.map +1 -0
  13. package/dist/{DataTable-BNMYEa_7.js → DataTable-CwWARMEv.js} +197 -174
  14. package/dist/DataTable-CwWARMEv.js.map +1 -0
  15. package/dist/{Empty-Bfido_mq.js → Empty-DINS0Uu4.js} +19 -8
  16. package/dist/Empty-DINS0Uu4.js.map +1 -0
  17. package/dist/{HelpIcon-Cm3ZgoCx.js → HelpIcon-CbnRiSjn.js} +3 -3
  18. package/dist/{HelpIcon-Cm3ZgoCx.js.map → HelpIcon-CbnRiSjn.js.map} +1 -1
  19. package/dist/{Input-CYKHBpJn.js → Input-CuIurquS.js} +2 -2
  20. package/dist/{Input-CYKHBpJn.js.map → Input-CuIurquS.js.map} +1 -1
  21. package/dist/{Kbd-CAIAs4OO.js → Kbd-CKfR8HlC.js} +2 -2
  22. package/dist/{Kbd-CAIAs4OO.js.map → Kbd-CKfR8HlC.js.map} +1 -1
  23. package/dist/{Label-mrNM2drW.js → Label-DjOaTM4Q.js} +2 -2
  24. package/dist/{Label-mrNM2drW.js.map → Label-DjOaTM4Q.js.map} +1 -1
  25. package/dist/{MultiEmailInput-Du1964Ka.js → MultiEmailInput-BB334s4C.js} +93 -86
  26. package/dist/MultiEmailInput-BB334s4C.js.map +1 -0
  27. package/dist/{Pagination-BRd3WPJ_.js → Pagination-yjG8uCpV.js} +6 -4
  28. package/dist/{Pagination-BRd3WPJ_.js.map → Pagination-yjG8uCpV.js.map} +1 -1
  29. package/dist/{Popover-C1FNlRtU.js → Popover-BHGvcdV2.js} +2 -1
  30. package/dist/{Popover-C1FNlRtU.js.map → Popover-BHGvcdV2.js.map} +1 -1
  31. package/dist/{Progress-DURemsl_.js → Progress-DbtLbWf8.js} +10 -2
  32. package/dist/{Progress-DURemsl_.js.map → Progress-DbtLbWf8.js.map} +1 -1
  33. package/dist/{Select-SvphlEXA.js → Select-YWCfd2p1.js} +2 -5
  34. package/dist/Select-YWCfd2p1.js.map +1 -0
  35. package/dist/{Spinner-DgV3mILN.js → Spinner-vfggfvEp.js} +2 -1
  36. package/dist/{Spinner-DgV3mILN.js.map → Spinner-vfggfvEp.js.map} +1 -1
  37. package/dist/{Stepper-7OpfOfas.js → Stepper-DO7EBWYL.js} +2 -1
  38. package/dist/{Stepper-7OpfOfas.js.map → Stepper-DO7EBWYL.js.map} +1 -1
  39. package/dist/{Switch-D_Xt6QgL.js → Switch-Am2l2UdV.js} +3 -1
  40. package/dist/Switch-Am2l2UdV.js.map +1 -0
  41. package/dist/{Tabs-BCUdAnva.js → Tabs-ModAabFc.js} +7 -3
  42. package/dist/Tabs-ModAabFc.js.map +1 -0
  43. package/dist/{Textarea-B2Uhx-Yy.js → Textarea-CMGZZ4rL.js} +4 -3
  44. package/dist/{Textarea-B2Uhx-Yy.js.map → Textarea-CMGZZ4rL.js.map} +1 -1
  45. package/dist/{Tooltip-CA3irJ2q.js → Tooltip-DWDsgyx7.js} +2 -1
  46. package/dist/{Tooltip-CA3irJ2q.js.map → Tooltip-DWDsgyx7.js.map} +1 -1
  47. package/dist/{TreeSelect-Ct7qDBad.js → TreeSelect-wYDOZ5yD.js} +2 -1
  48. package/dist/TreeSelect-wYDOZ5yD.js.map +1 -0
  49. package/dist/cjs/{Alert-BdZVGiON.js → Alert-BTheamzj.js} +2 -2
  50. package/dist/cjs/{Alert-BdZVGiON.js.map → Alert-BTheamzj.js.map} +1 -1
  51. package/dist/cjs/{Avatar-DWuHnGh4.js → Avatar-DGuMcBnh.js} +3 -2
  52. package/dist/cjs/Avatar-DGuMcBnh.js.map +1 -0
  53. package/dist/cjs/{Badge-Dz_Kb49L.js → Badge-DPGWAq4H.js} +4 -1
  54. package/dist/cjs/Badge-DPGWAq4H.js.map +1 -0
  55. package/dist/cjs/{Button-8VH9p9RB.js → Button-DJSysuyG.js} +2 -2
  56. package/dist/cjs/{Button-8VH9p9RB.js.map → Button-DJSysuyG.js.map} +1 -1
  57. package/dist/cjs/{Callout-Cnsff-NS.js → Callout-Bci3POCo.js} +2 -1
  58. package/dist/cjs/{Callout-Cnsff-NS.js.map → Callout-Bci3POCo.js.map} +1 -1
  59. package/dist/cjs/{Checkbox-CymHP7QE.js → Checkbox-7lX2aMKA.js} +4 -2
  60. package/dist/cjs/Checkbox-7lX2aMKA.js.map +1 -0
  61. package/dist/cjs/{DataTable-CRDwhMUB.js → DataTable-ChgPVrRB.js} +197 -174
  62. package/dist/cjs/DataTable-ChgPVrRB.js.map +1 -0
  63. package/dist/cjs/{Empty-aQaWK0p4.js → Empty-Bqt-TucD.js} +19 -8
  64. package/dist/cjs/Empty-Bqt-TucD.js.map +1 -0
  65. package/dist/cjs/{HelpIcon-CIkKt2uy.js → HelpIcon-QpZY6Zmc.js} +3 -3
  66. package/dist/cjs/{HelpIcon-CIkKt2uy.js.map → HelpIcon-QpZY6Zmc.js.map} +1 -1
  67. package/dist/cjs/{Input-k6MkhSTc.js → Input-lWo0YoZ9.js} +2 -2
  68. package/dist/cjs/{Input-k6MkhSTc.js.map → Input-lWo0YoZ9.js.map} +1 -1
  69. package/dist/cjs/{Kbd-BvC3VSNb.js → Kbd--A8Gl8TV.js} +2 -2
  70. package/dist/cjs/Kbd--A8Gl8TV.js.map +1 -0
  71. package/dist/cjs/{Label-Dt7K54Ly.js → Label-D8RFE9hd.js} +2 -2
  72. package/dist/cjs/{Label-Dt7K54Ly.js.map → Label-D8RFE9hd.js.map} +1 -1
  73. package/dist/cjs/{MultiEmailInput-KmN2BSaX.js → MultiEmailInput-BlIqzq-o.js} +93 -86
  74. package/dist/cjs/MultiEmailInput-BlIqzq-o.js.map +1 -0
  75. package/dist/cjs/{Pagination-8yFg8xR2.js → Pagination-WyQlBpvK.js} +6 -4
  76. package/dist/cjs/{Pagination-8yFg8xR2.js.map → Pagination-WyQlBpvK.js.map} +1 -1
  77. package/dist/cjs/{Popover-DuRSsDHz.js → Popover-5BUgIW60.js} +2 -1
  78. package/dist/cjs/{Popover-DuRSsDHz.js.map → Popover-5BUgIW60.js.map} +1 -1
  79. package/dist/cjs/{Progress-yBpMAzIU.js → Progress-n_VwK9_E.js} +10 -2
  80. package/dist/cjs/{Progress-yBpMAzIU.js.map → Progress-n_VwK9_E.js.map} +1 -1
  81. package/dist/cjs/{Select-YtJKCZeT.js → Select-Bs5Fp3wj.js} +3 -6
  82. package/dist/cjs/Select-Bs5Fp3wj.js.map +1 -0
  83. package/dist/cjs/{Spinner-DzNBz8al.js → Spinner-DRoghJA8.js} +2 -1
  84. package/dist/cjs/{Spinner-DzNBz8al.js.map → Spinner-DRoghJA8.js.map} +1 -1
  85. package/dist/cjs/{Stepper-DZb25oBH.js → Stepper-BtZG_XmC.js} +2 -1
  86. package/dist/cjs/{Stepper-DZb25oBH.js.map → Stepper-BtZG_XmC.js.map} +1 -1
  87. package/dist/cjs/{Switch-DrSFyxis.js → Switch-DY7bdiEz.js} +3 -1
  88. package/dist/cjs/Switch-DY7bdiEz.js.map +1 -0
  89. package/dist/cjs/{Tabs-COMRjTVU.js → Tabs-CA0QAWp0.js} +7 -3
  90. package/dist/cjs/Tabs-CA0QAWp0.js.map +1 -0
  91. package/dist/cjs/{Textarea-yWv-66yX.js → Textarea-Cw7Uea82.js} +4 -3
  92. package/dist/cjs/{Textarea-yWv-66yX.js.map → Textarea-Cw7Uea82.js.map} +1 -1
  93. package/dist/cjs/{Tooltip-Dph_R3Ct.js → Tooltip-B6uv_2Jz.js} +2 -1
  94. package/dist/cjs/{Tooltip-Dph_R3Ct.js.map → Tooltip-B6uv_2Jz.js.map} +1 -1
  95. package/dist/cjs/{TreeSelect-Ck0takdS.js → TreeSelect-C9BSJt1d.js} +2 -1
  96. package/dist/cjs/TreeSelect-C9BSJt1d.js.map +1 -0
  97. package/dist/cjs/components/Alert.js +2 -2
  98. package/dist/cjs/components/Avatar.js +1 -1
  99. package/dist/cjs/components/Badge.js +1 -1
  100. package/dist/cjs/components/Button.js +1 -1
  101. package/dist/cjs/components/Callout.js +1 -1
  102. package/dist/cjs/components/Checkbox.js +4 -4
  103. package/dist/cjs/components/DataTable.js +3 -3
  104. package/dist/cjs/components/DatePicker.js +3 -3
  105. package/dist/cjs/components/DropdownMenu.js +2 -1
  106. package/dist/cjs/components/DropdownMenu.js.map +1 -1
  107. package/dist/cjs/components/Empty.js +2 -2
  108. package/dist/cjs/components/Input.js +4 -4
  109. package/dist/cjs/components/Kbd.js +1 -1
  110. package/dist/cjs/components/Label.js +4 -4
  111. package/dist/cjs/components/MultiEmailInput.js +4 -4
  112. package/dist/cjs/components/Pagination.js +1 -1
  113. package/dist/cjs/components/Popover.js +1 -1
  114. package/dist/cjs/components/Progress.js +1 -1
  115. package/dist/cjs/components/RadioGroup.js +3 -3
  116. package/dist/cjs/components/Select.js +5 -4
  117. package/dist/cjs/components/Select.js.map +1 -1
  118. package/dist/cjs/components/Slider.js +3 -3
  119. package/dist/cjs/components/Spinner.js +1 -1
  120. package/dist/cjs/components/Stepper.js +1 -1
  121. package/dist/cjs/components/Switch.js +4 -4
  122. package/dist/cjs/components/Tabs.js +2 -1
  123. package/dist/cjs/components/Tabs.js.map +1 -1
  124. package/dist/cjs/components/Textarea.js +4 -4
  125. package/dist/cjs/components/TimePicker.js +3 -3
  126. package/dist/cjs/components/Tooltip.js +1 -1
  127. package/dist/cjs/components/TreeSelect.js +4 -4
  128. package/dist/cjs/components/index.js +25 -24
  129. package/dist/cjs/components/index.js.map +1 -1
  130. package/dist/cjs/formik/ActionBlock.js +1 -1
  131. package/dist/cjs/formik/BlockNavigation.js +1 -1
  132. package/dist/cjs/formik/Button.js +1 -1
  133. package/dist/cjs/formik/Checkbox.js +4 -4
  134. package/dist/cjs/formik/Input.js +4 -4
  135. package/dist/cjs/formik/MultiEmailInput.js +4 -4
  136. package/dist/cjs/formik/RadioGroup.js +3 -3
  137. package/dist/cjs/formik/Select.js +5 -4
  138. package/dist/cjs/formik/Select.js.map +1 -1
  139. package/dist/cjs/formik/Slider.js +3 -3
  140. package/dist/cjs/formik/Switch.js +4 -4
  141. package/dist/cjs/formik/Textarea.js +4 -4
  142. package/dist/cjs/formik/TreeSelect.js +4 -4
  143. package/dist/cjs/formik/index.js +11 -10
  144. package/dist/cjs/formik/index.js.map +1 -1
  145. package/dist/cjs/hyphenize-B8IGPzjp.js +8 -0
  146. package/dist/cjs/hyphenize-B8IGPzjp.js.map +1 -0
  147. package/dist/cjs/index.js +25 -24
  148. package/dist/cjs/index.js.map +1 -1
  149. package/dist/cjs/primitives/Button.js +2 -0
  150. package/dist/cjs/primitives/Button.js.map +1 -1
  151. package/dist/cjs/primitives/Dialog.js +1 -0
  152. package/dist/cjs/primitives/Dialog.js.map +1 -1
  153. package/dist/cjs/primitives/Field.js +3 -3
  154. package/dist/cjs/primitives/Sheet.js +1 -0
  155. package/dist/cjs/primitives/Sheet.js.map +1 -1
  156. package/dist/cjs/primitives/index.js +3 -3
  157. package/dist/components/Alert.js +2 -2
  158. package/dist/components/Avatar.js +1 -1
  159. package/dist/components/Badge.js +1 -1
  160. package/dist/components/Button.js +1 -1
  161. package/dist/components/Callout.js +1 -1
  162. package/dist/components/Checkbox.js +4 -4
  163. package/dist/components/DataTable.js +3 -3
  164. package/dist/components/DatePicker.js +3 -3
  165. package/dist/components/DropdownMenu.js +2 -1
  166. package/dist/components/DropdownMenu.js.map +1 -1
  167. package/dist/components/Empty/Empty.d.ts +2 -0
  168. package/dist/components/Empty.js +2 -2
  169. package/dist/components/Input.js +4 -4
  170. package/dist/components/Kbd.js +1 -1
  171. package/dist/components/Label.js +4 -4
  172. package/dist/components/MultiEmailInput.js +4 -4
  173. package/dist/components/Pagination.js +1 -1
  174. package/dist/components/Popover.js +1 -1
  175. package/dist/components/Progress.js +1 -1
  176. package/dist/components/RadioGroup.js +3 -3
  177. package/dist/components/Select.js +5 -4
  178. package/dist/components/Select.js.map +1 -1
  179. package/dist/components/Slider.js +3 -3
  180. package/dist/components/Spinner.js +1 -1
  181. package/dist/components/Stepper.js +1 -1
  182. package/dist/components/Switch.js +4 -4
  183. package/dist/components/Tabs/Tabs.d.ts +2 -0
  184. package/dist/components/Tabs.js +2 -1
  185. package/dist/components/Tabs.js.map +1 -1
  186. package/dist/components/Textarea.js +4 -4
  187. package/dist/components/TimePicker.js +3 -3
  188. package/dist/components/Tooltip.js +1 -1
  189. package/dist/components/TreeSelect/types.d.ts +2 -0
  190. package/dist/components/TreeSelect.js +4 -4
  191. package/dist/components/index.js +25 -24
  192. package/dist/components/index.js.map +1 -1
  193. package/dist/formik/ActionBlock.js +1 -1
  194. package/dist/formik/BlockNavigation.js +1 -1
  195. package/dist/formik/Button.js +1 -1
  196. package/dist/formik/Checkbox.js +4 -4
  197. package/dist/formik/Input.js +4 -4
  198. package/dist/formik/MultiEmailInput.js +4 -4
  199. package/dist/formik/RadioGroup.js +3 -3
  200. package/dist/formik/Select.js +5 -4
  201. package/dist/formik/Select.js.map +1 -1
  202. package/dist/formik/Slider.js +3 -3
  203. package/dist/formik/Switch.js +4 -4
  204. package/dist/formik/Textarea.js +4 -4
  205. package/dist/formik/TreeSelect.js +4 -4
  206. package/dist/formik/index.js +11 -10
  207. package/dist/formik/index.js.map +1 -1
  208. package/dist/hyphenize-BU4K8zjb.js +6 -0
  209. package/dist/hyphenize-BU4K8zjb.js.map +1 -0
  210. package/dist/index.js +25 -24
  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/Dialog.js +1 -0
  215. package/dist/primitives/Dialog.js.map +1 -1
  216. package/dist/primitives/Field.js +3 -3
  217. package/dist/primitives/Sheet.js +1 -0
  218. package/dist/primitives/Sheet.js.map +1 -1
  219. package/dist/primitives/index.js +3 -3
  220. package/package.json +1 -1
  221. package/dist/Avatar-DxRDQDjh.js.map +0 -1
  222. package/dist/Badge-DC6zxOwS.js.map +0 -1
  223. package/dist/Checkbox-m4rEnxUz.js.map +0 -1
  224. package/dist/DataTable-BNMYEa_7.js.map +0 -1
  225. package/dist/Empty-Bfido_mq.js.map +0 -1
  226. package/dist/MultiEmailInput-Du1964Ka.js.map +0 -1
  227. package/dist/Select-SvphlEXA.js.map +0 -1
  228. package/dist/Switch-D_Xt6QgL.js.map +0 -1
  229. package/dist/Tabs-BCUdAnva.js.map +0 -1
  230. package/dist/TreeSelect-Ct7qDBad.js.map +0 -1
  231. package/dist/cjs/Avatar-DWuHnGh4.js.map +0 -1
  232. package/dist/cjs/Badge-Dz_Kb49L.js.map +0 -1
  233. package/dist/cjs/Checkbox-CymHP7QE.js.map +0 -1
  234. package/dist/cjs/DataTable-CRDwhMUB.js.map +0 -1
  235. package/dist/cjs/Empty-aQaWK0p4.js.map +0 -1
  236. package/dist/cjs/Kbd-BvC3VSNb.js.map +0 -1
  237. package/dist/cjs/MultiEmailInput-KmN2BSaX.js.map +0 -1
  238. package/dist/cjs/Select-YtJKCZeT.js.map +0 -1
  239. package/dist/cjs/Switch-DrSFyxis.js.map +0 -1
  240. package/dist/cjs/Tabs-COMRjTVU.js.map +0 -1
  241. package/dist/cjs/TreeSelect-Ck0takdS.js.map +0 -1
@@ -7,18 +7,26 @@ var primitives_Empty = require('./primitives/Empty.js');
7
7
  var primitives_Tooltip = require('./primitives/Tooltip.js');
8
8
  var renderIcon = require('./renderIcon-BRrpZu9a.js');
9
9
  var Typography = require('./Typography-BW6xEk10.js');
10
- var Button = require('./Button-8VH9p9RB.js');
10
+ var Button = require('./Button-DJSysuyG.js');
11
11
 
12
12
  function MaybeTooltipButton({
13
13
  buttonProps,
14
14
  showTooltipWhenDisabled,
15
- defaultVariant
15
+ defaultVariant,
16
+ dataTestid
16
17
  }) {
17
- const button = /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { variant: defaultVariant, ...buttonProps });
18
+ const button = /* @__PURE__ */ jsxRuntime.jsx(
19
+ Button.Button,
20
+ {
21
+ "data-testid": dataTestid,
22
+ variant: defaultVariant,
23
+ ...buttonProps
24
+ }
25
+ );
18
26
  if (showTooltipWhenDisabled && buttonProps.disabled && buttonProps.label) {
19
27
  return /* @__PURE__ */ jsxRuntime.jsx(primitives_Tooltip.TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxRuntime.jsxs(primitives_Tooltip.Tooltip, { children: [
20
28
  /* @__PURE__ */ jsxRuntime.jsx(primitives_Tooltip.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex", children: button }) }),
21
- /* @__PURE__ */ jsxRuntime.jsx(primitives_Tooltip.TooltipContent, { children: buttonProps.label })
29
+ /* @__PURE__ */ jsxRuntime.jsx(primitives_Tooltip.TooltipContent, { "data-testid": "tooltip-box", children: buttonProps.label })
22
30
  ] }) });
23
31
  }
24
32
  return button;
@@ -35,6 +43,7 @@ const Empty = React.forwardRef(
35
43
  buttonSeparatorText,
36
44
  showTooltipWhenButtonDisabled = false,
37
45
  className,
46
+ dataTestid,
38
47
  ...otherProps
39
48
  }, ref) => {
40
49
  const hasMedia = image || icon;
@@ -45,15 +54,16 @@ const Empty = React.forwardRef(
45
54
  image && /* @__PURE__ */ jsxRuntime.jsx(primitives_Empty.EmptyMedia, { children: typeof image === "string" ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: image, alt: title ?? "" }) : image }),
46
55
  !image && icon && /* @__PURE__ */ jsxRuntime.jsx(primitives_Empty.EmptyMedia, { variant: "icon", children: renderIcon.renderIcon(icon) })
47
56
  ] }),
48
- title && /* @__PURE__ */ jsxRuntime.jsx(Typography.Typography, { variant: "h4", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(primitives_Empty.EmptyTitle, { children: title }) }),
49
- description && /* @__PURE__ */ jsxRuntime.jsx(Typography.Typography, { variant: "body3", color: "muted", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(primitives_Empty.EmptyDescription, { children: description }) }),
50
- helpText && /* @__PURE__ */ jsxRuntime.jsx(Typography.Typography, { variant: "body3", color: "muted", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: helpText }) })
57
+ title && /* @__PURE__ */ jsxRuntime.jsx(Typography.Typography, { variant: "h4", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(primitives_Empty.EmptyTitle, { "data-testid": dataTestid ?? "empty-state-title", children: title }) }),
58
+ description && /* @__PURE__ */ jsxRuntime.jsx(Typography.Typography, { variant: "body3", color: "muted", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(primitives_Empty.EmptyDescription, { "data-testid": "empty-state-description", children: description }) }),
59
+ helpText && /* @__PURE__ */ jsxRuntime.jsx(Typography.Typography, { variant: "body3", color: "muted", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("p", { "data-testid": "empty-state-help-text", children: helpText }) })
51
60
  ] }),
52
61
  hasButtons && /* @__PURE__ */ jsxRuntime.jsx(primitives_Empty.EmptyContent, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-center gap-2", children: [
53
62
  primaryButtonProps && /* @__PURE__ */ jsxRuntime.jsx(
54
63
  MaybeTooltipButton,
55
64
  {
56
65
  buttonProps: primaryButtonProps,
66
+ dataTestid: "empty-state-primary-button",
57
67
  showTooltipWhenDisabled: showTooltipWhenButtonDisabled,
58
68
  defaultVariant: "default"
59
69
  }
@@ -63,6 +73,7 @@ const Empty = React.forwardRef(
63
73
  MaybeTooltipButton,
64
74
  {
65
75
  buttonProps: secondaryButtonProps,
76
+ dataTestid: "empty-state-secondary-button",
66
77
  showTooltipWhenDisabled: showTooltipWhenButtonDisabled,
67
78
  defaultVariant: "outline"
68
79
  }
@@ -74,4 +85,4 @@ const Empty = React.forwardRef(
74
85
  Empty.displayName = "Empty";
75
86
 
76
87
  exports.Empty = Empty;
77
- //# sourceMappingURL=Empty-aQaWK0p4.js.map
88
+ //# sourceMappingURL=Empty-Bqt-TucD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Empty-Bqt-TucD.js","sources":["../../src/components/Empty/Empty.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Empty as PrimitiveEmpty,\n EmptyHeader,\n EmptyTitle,\n EmptyDescription,\n EmptyContent,\n EmptyMedia,\n} from \"src/primitives/Empty\";\nimport { Button } from \"src/components/Button\";\nimport { Typography } from \"src/components/Typography\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\nimport { renderIcon, type IconProp } from \"src/shared/renderIcon\";\n\nexport interface EmptyProps extends React.ComponentProps<\"div\"> {\n /** Image URL or JSX for the media area. */\n image?: string | React.ReactNode;\n /** Icon for the media area (rendered inside EmptyMedia with variant=\"icon\"). */\n icon?: IconProp;\n /** Empty state title. */\n title?: string;\n /** Description text or JSX. */\n description?: React.ReactNode;\n /** Additional help text below the description. */\n helpText?: React.ReactNode;\n /** Props forwarded to the primary action Button. */\n primaryButtonProps?: React.ComponentProps<typeof Button>;\n /** Props forwarded to the secondary action Button. */\n secondaryButtonProps?: React.ComponentProps<typeof Button>;\n /** Text displayed between the primary and secondary buttons (e.g., \"or\"). */\n buttonSeparatorText?: string;\n /** Show tooltip on disabled buttons using their label as content. */\n showTooltipWhenButtonDisabled?: boolean;\n /** Additional CSS class names. */\n className?: string;\n /** Custom data-testid attribute for the title. */\n dataTestid?: string;\n /** Class applied to inner slots (header/content); overrides default max-width if a `max-w-*` token is provided. */\n innerClassName?: string;\n}\n\nfunction MaybeTooltipButton({\n buttonProps,\n showTooltipWhenDisabled,\n defaultVariant,\n dataTestid,\n}: {\n buttonProps: React.ComponentProps<typeof Button>;\n showTooltipWhenDisabled: boolean;\n defaultVariant: \"default\" | \"outline\";\n dataTestid: string;\n}) {\n const button = (\n <Button\n data-testid={dataTestid}\n variant={defaultVariant}\n {...buttonProps}\n />\n );\n\n if (showTooltipWhenDisabled && buttonProps.disabled && buttonProps.label) {\n return (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex\">{button}</span>\n </TooltipTrigger>\n <TooltipContent data-testid=\"tooltip-box\">\n {buttonProps.label}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n}\n\nconst Empty = forwardRef<HTMLDivElement, EmptyProps>(\n (\n {\n image,\n icon,\n title,\n description,\n helpText,\n primaryButtonProps,\n secondaryButtonProps,\n buttonSeparatorText,\n showTooltipWhenButtonDisabled = false,\n className,\n dataTestid,\n ...otherProps\n },\n ref\n ) => {\n const hasMedia = image || icon;\n const hasButtons = primaryButtonProps || secondaryButtonProps;\n\n return (\n <PrimitiveEmpty ref={ref} className={cn(className)} {...otherProps}>\n <EmptyHeader>\n {hasMedia && (\n <>\n {image && (\n <EmptyMedia>\n {typeof image === \"string\" ? (\n <img src={image} alt={title ?? \"\"} />\n ) : (\n image\n )}\n </EmptyMedia>\n )}\n {!image && icon && (\n <EmptyMedia variant=\"icon\">{renderIcon(icon)}</EmptyMedia>\n )}\n </>\n )}\n {title && (\n <Typography variant=\"h4\" asChild>\n <EmptyTitle data-testid={dataTestid ?? \"empty-state-title\"}>\n {title}\n </EmptyTitle>\n </Typography>\n )}\n {description && (\n <Typography variant=\"body3\" color=\"muted\" asChild>\n <EmptyDescription data-testid=\"empty-state-description\">\n {description}\n </EmptyDescription>\n </Typography>\n )}\n {helpText && (\n <Typography variant=\"body3\" color=\"muted\" asChild>\n <p data-testid=\"empty-state-help-text\">{helpText}</p>\n </Typography>\n )}\n </EmptyHeader>\n\n {hasButtons && (\n <EmptyContent>\n <div className=\"flex flex-wrap items-center justify-center gap-2\">\n {primaryButtonProps && (\n <MaybeTooltipButton\n buttonProps={primaryButtonProps}\n dataTestid=\"empty-state-primary-button\"\n showTooltipWhenDisabled={showTooltipWhenButtonDisabled}\n defaultVariant=\"default\"\n />\n )}\n {buttonSeparatorText &&\n primaryButtonProps &&\n secondaryButtonProps && (\n <Typography variant=\"body3\" color=\"muted\" asChild>\n <span>{buttonSeparatorText}</span>\n </Typography>\n )}\n {secondaryButtonProps && (\n <MaybeTooltipButton\n buttonProps={secondaryButtonProps}\n dataTestid=\"empty-state-secondary-button\"\n showTooltipWhenDisabled={showTooltipWhenButtonDisabled}\n defaultVariant=\"outline\"\n />\n )}\n </div>\n </EmptyContent>\n )}\n </PrimitiveEmpty>\n );\n }\n);\n\nEmpty.displayName = \"Empty\";\n\nexport { Empty };\n"],"names":["jsx","Button","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","forwardRef","jsxs","PrimitiveEmpty","cn","EmptyHeader","Fragment","EmptyMedia","renderIcon","Typography","EmptyTitle","EmptyDescription","EmptyContent"],"mappings":";;;;;;;;;;;AAgDA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,WAAA;AAAA,EACA,uBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,MAAA,mBACJA,cAAA;AAAA,IAACC,aAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAa,UAAA;AAAA,MACb,OAAA,EAAS,cAAA;AAAA,MACR,GAAG;AAAA;AAAA,GACN;AAGF,EAAA,IAAI,uBAAA,IAA2B,WAAA,CAAY,QAAA,IAAY,WAAA,CAAY,KAAA,EAAO;AACxE,IAAA,uBACED,cAAA,CAACE,kCAAA,EAAA,EAAgB,aAAA,EAAe,CAAA,EAC9B,0CAACC,0BAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,iCAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAAJ,cAAA,CAAC,UAAK,SAAA,EAAU,aAAA,EAAe,kBAAO,CAAA,EACxC,CAAA;AAAA,sBACAA,cAAA,CAACK,iCAAA,EAAA,EAAe,aAAA,EAAY,aAAA,EACzB,sBAAY,KAAA,EACf;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,MAAM,KAAA,GAAQC,gBAAA;AAAA,EACZ,CACE;AAAA,IACE,KAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,mBAAA;AAAA,IACA,6BAAA,GAAgC,KAAA;AAAA,IAChC,SAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,WAAW,KAAA,IAAS,IAAA;AAC1B,IAAA,MAAM,aAAa,kBAAA,IAAsB,oBAAA;AAEzC,IAAA,uBACEC,eAAA,CAACC,0BAAe,GAAA,EAAU,SAAA,EAAWC,SAAG,SAAS,CAAA,EAAI,GAAG,UAAA,EACtD,QAAA,EAAA;AAAA,sBAAAF,eAAA,CAACG,4BAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,QAAA,oBACCH,eAAA,CAAAI,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,KAAA,oBACCX,cAAA,CAACY,2BAAA,EAAA,EACE,QAAA,EAAA,OAAO,KAAA,KAAU,QAAA,mBAChBZ,cAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,KAAA,IAAS,EAAA,EAAI,IAEnC,KAAA,EAEJ,CAAA;AAAA,UAED,CAAC,SAAS,IAAA,oBACTA,cAAA,CAACY,+BAAW,OAAA,EAAQ,MAAA,EAAQ,QAAA,EAAAC,qBAAA,CAAW,IAAI,CAAA,EAAE;AAAA,SAAA,EAEjD,CAAA;AAAA,QAED,KAAA,oBACCb,cAAA,CAACc,qBAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,OAAA,EAAO,IAAA,EAC9B,QAAA,kBAAAd,cAAA,CAACe,2BAAA,EAAA,EAAW,aAAA,EAAa,UAAA,IAAc,mBAAA,EACpC,iBACH,CAAA,EACF,CAAA;AAAA,QAED,WAAA,oBACCf,cAAA,CAACc,qBAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAO,IAAA,EAC/C,QAAA,kBAAAd,cAAA,CAACgB,iCAAA,EAAA,EAAiB,aAAA,EAAY,yBAAA,EAC3B,uBACH,CAAA,EACF,CAAA;AAAA,QAED,QAAA,oBACChB,cAAA,CAACc,qBAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAO,IAAA,EAC/C,QAAA,kBAAAd,cAAA,CAAC,GAAA,EAAA,EAAE,aAAA,EAAY,uBAAA,EAAyB,oBAAS,CAAA,EACnD;AAAA,OAAA,EAEJ,CAAA;AAAA,MAEC,8BACCA,cAAA,CAACiB,6BAAA,EAAA,EACC,QAAA,kBAAAV,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kDAAA,EACZ,QAAA,EAAA;AAAA,QAAA,kBAAA,oBACCP,cAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAa,kBAAA;AAAA,YACb,UAAA,EAAW,4BAAA;AAAA,YACX,uBAAA,EAAyB,6BAAA;AAAA,YACzB,cAAA,EAAe;AAAA;AAAA,SACjB;AAAA,QAED,mBAAA,IACC,kBAAA,IACA,oBAAA,oBACEA,cAAA,CAACc,yBAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAO,IAAA,EAC/C,QAAA,kBAAAd,cAAA,CAAC,MAAA,EAAA,EAAM,+BAAoB,CAAA,EAC7B,CAAA;AAAA,QAEH,oBAAA,oBACCA,cAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAa,oBAAA;AAAA,YACb,UAAA,EAAW,8BAAA;AAAA,YACX,uBAAA,EAAyB,6BAAA;AAAA,YACzB,cAAA,EAAe;AAAA;AAAA;AACjB,OAAA,EAEJ,CAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA;;;;"}
@@ -5,8 +5,8 @@ var primitives_Tooltip = require('./primitives/Tooltip.js');
5
5
  var renderIcon = require('./renderIcon-BRrpZu9a.js');
6
6
  var utils = require('./utils-BhM0B89p.js');
7
7
  var createLucideIcon = require('./createLucideIcon-D0tRgV6l.js');
8
- var Popover = require('./Popover-DuRSsDHz.js');
9
- var Button = require('./Button-8VH9p9RB.js');
8
+ var Popover = require('./Popover-5BUgIW60.js');
9
+ var Button = require('./Button-DJSysuyG.js');
10
10
 
11
11
  /**
12
12
  * @license lucide-react v0.577.0 - ISC
@@ -72,4 +72,4 @@ const HelpIcon = (helpIconProps) => {
72
72
  };
73
73
 
74
74
  exports.HelpIcon = HelpIcon;
75
- //# sourceMappingURL=HelpIcon-CIkKt2uy.js.map
75
+ //# sourceMappingURL=HelpIcon-QpZY6Zmc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HelpIcon-CIkKt2uy.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js","../../src/shared/HelpIcon.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: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst CircleQuestionMark = createLucideIcon(\"circle-question-mark\", __iconNode);\n\nexport { __iconNode, CircleQuestionMark as default };\n//# sourceMappingURL=circle-question-mark.js.map\n","import type React from \"react\";\n\nimport { CircleHelpIcon } from \"lucide-react\";\n\nimport { Button, type ButtonProps } from \"src/components/Button\";\nimport { Popover } from \"src/components/Popover\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\nimport { renderIcon, type IconProp } from \"src/shared/renderIcon\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nconst SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n auto: \"top\",\n};\n\nexport interface HelpIconTooltipProps {\n /** Tooltip content. */\n content?: React.ReactNode;\n /** Tooltip position. */\n position?: string;\n}\n\nexport interface HelpIconPopoverProps {\n /** Popover title. */\n title?: React.ReactNode;\n /** Popover description. */\n description?: React.ReactNode;\n /** Props for an optional help link button inside the popover. */\n helpLinkProps?: ButtonProps;\n}\n\nexport interface HelpIconProps {\n /** Click handler on the help icon. */\n onClick?: () => void;\n /** Custom icon. Defaults to CircleHelpIcon. */\n icon?: IconProp;\n /** Show a tooltip on hover. */\n tooltipProps?: HelpIconTooltipProps;\n /** Show a popover on hover with title, description, and optional link. */\n popoverProps?: HelpIconPopoverProps;\n /** Additional class name for the help icon. */\n className?: string;\n}\n\nexport const HelpIcon = (helpIconProps: HelpIconProps) => {\n const icon = helpIconProps.icon ?? CircleHelpIcon;\n\n const iconElement = (\n <span\n className={cn(\n \"inline-flex cursor-help text-muted-foreground transition-colors hover:text-foreground\",\n helpIconProps.onClick && \"cursor-pointer\",\n helpIconProps.className\n )}\n onClick={helpIconProps.onClick}\n >\n {renderIcon(icon, \"size-3.5\")}\n </span>\n );\n\n if (helpIconProps.popoverProps) {\n const { title, description, helpLinkProps } = helpIconProps.popoverProps;\n\n return (\n <Popover trigger={iconElement}>\n {title && <Popover.Title>{title}</Popover.Title>}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n {helpLinkProps && (\n <Button\n variant=\"link\"\n size=\"sm\"\n className=\"mt-1 h-auto self-start p-0\"\n {...helpLinkProps}\n href={helpLinkProps.href}\n />\n )}\n </Popover>\n );\n }\n\n if (helpIconProps.tooltipProps?.content) {\n const side =\n SIDE_MAP[helpIconProps.tooltipProps.position ?? \"auto\"] ?? \"top\";\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{iconElement}</TooltipTrigger>\n <TooltipContent side={side}>\n {helpIconProps.tooltipProps.content}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return iconElement;\n};\n"],"names":["createLucideIcon","CircleHelpIcon","jsx","cn","renderIcon","jsxs","Popover","Button","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAM,UAAU,GAAG;AACnB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,sCAAsC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACxE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC7C,CAAC;AACD,MAAM,kBAAkB,GAAGA,iCAAgB,CAAC,sBAAsB,EAAE,UAAU,CAAC;;ACC/E,MAAM,QAAA,GAAgE;AAAA,EACpE,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AA+BO,MAAM,QAAA,GAAW,CAAC,aAAA,KAAiC;AACxD,EAAA,MAAM,IAAA,GAAO,cAAc,IAAA,IAAQC,kBAAA;AAEnC,EAAA,MAAM,WAAA,mBACJC,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,QAAA;AAAA,QACT,uFAAA;AAAA,QACA,cAAc,OAAA,IAAW,gBAAA;AAAA,QACzB,aAAA,CAAc;AAAA,OAChB;AAAA,MACA,SAAS,aAAA,CAAc,OAAA;AAAA,MAEtB,QAAA,EAAAC,qBAAA,CAAW,MAAM,UAAU;AAAA;AAAA,GAC9B;AAGF,EAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,aAAA,KAAkB,aAAA,CAAc,YAAA;AAE5D,IAAA,uBACEC,eAAA,CAACC,eAAA,EAAA,EAAQ,OAAA,EAAS,WAAA,EACf,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASJ,cAAA,CAACI,eAAA,CAAQ,KAAA,EAAR,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC/B,WAAA,oBACCJ,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,MAE3D,aAAA,oBACCA,cAAA;AAAA,QAACK,aAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,SAAA,EAAU,4BAAA;AAAA,UACT,GAAG,aAAA;AAAA,UACJ,MAAM,aAAA,CAAc;AAAA;AAAA;AACtB,KAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,aAAA,CAAc,cAAc,OAAA,EAAS;AACvC,IAAA,MAAM,OACJ,QAAA,CAAS,aAAA,CAAc,YAAA,CAAa,QAAA,IAAY,MAAM,CAAA,IAAK,KAAA;AAE7D,IAAA,uBACEL,cAAA,CAACM,kCAAA,EAAA,EACC,QAAA,kBAAAH,eAAA,CAACI,0BAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAP,cAAA,CAACQ,iCAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBACrCR,cAAA,CAACS,iCAAA,EAAA,EAAe,IAAA,EACb,QAAA,EAAA,aAAA,CAAc,aAAa,OAAA,EAC9B;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,WAAA;AACT;;;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"HelpIcon-QpZY6Zmc.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js","../../src/shared/HelpIcon.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: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst CircleQuestionMark = createLucideIcon(\"circle-question-mark\", __iconNode);\n\nexport { __iconNode, CircleQuestionMark as default };\n//# sourceMappingURL=circle-question-mark.js.map\n","import type React from \"react\";\n\nimport { CircleHelpIcon } from \"lucide-react\";\n\nimport { Button, type ButtonProps } from \"src/components/Button\";\nimport { Popover } from \"src/components/Popover\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\nimport { renderIcon, type IconProp } from \"src/shared/renderIcon\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nconst SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n auto: \"top\",\n};\n\nexport interface HelpIconTooltipProps {\n /** Tooltip content. */\n content?: React.ReactNode;\n /** Tooltip position. */\n position?: string;\n}\n\nexport interface HelpIconPopoverProps {\n /** Popover title. */\n title?: React.ReactNode;\n /** Popover description. */\n description?: React.ReactNode;\n /** Props for an optional help link button inside the popover. */\n helpLinkProps?: ButtonProps;\n}\n\nexport interface HelpIconProps {\n /** Click handler on the help icon. */\n onClick?: () => void;\n /** Custom icon. Defaults to CircleHelpIcon. */\n icon?: IconProp;\n /** Show a tooltip on hover. */\n tooltipProps?: HelpIconTooltipProps;\n /** Show a popover on hover with title, description, and optional link. */\n popoverProps?: HelpIconPopoverProps;\n /** Additional class name for the help icon. */\n className?: string;\n}\n\nexport const HelpIcon = (helpIconProps: HelpIconProps) => {\n const icon = helpIconProps.icon ?? CircleHelpIcon;\n\n const iconElement = (\n <span\n className={cn(\n \"inline-flex cursor-help text-muted-foreground transition-colors hover:text-foreground\",\n helpIconProps.onClick && \"cursor-pointer\",\n helpIconProps.className\n )}\n onClick={helpIconProps.onClick}\n >\n {renderIcon(icon, \"size-3.5\")}\n </span>\n );\n\n if (helpIconProps.popoverProps) {\n const { title, description, helpLinkProps } = helpIconProps.popoverProps;\n\n return (\n <Popover trigger={iconElement}>\n {title && <Popover.Title>{title}</Popover.Title>}\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n {helpLinkProps && (\n <Button\n variant=\"link\"\n size=\"sm\"\n className=\"mt-1 h-auto self-start p-0\"\n {...helpLinkProps}\n href={helpLinkProps.href}\n />\n )}\n </Popover>\n );\n }\n\n if (helpIconProps.tooltipProps?.content) {\n const side =\n SIDE_MAP[helpIconProps.tooltipProps.position ?? \"auto\"] ?? \"top\";\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{iconElement}</TooltipTrigger>\n <TooltipContent side={side}>\n {helpIconProps.tooltipProps.content}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return iconElement;\n};\n"],"names":["createLucideIcon","CircleHelpIcon","jsx","cn","renderIcon","jsxs","Popover","Button","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent"],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA,MAAM,UAAU,GAAG;AACnB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC5D,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,sCAAsC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACxE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE;AAC7C,CAAC;AACD,MAAM,kBAAkB,GAAGA,iCAAgB,CAAC,sBAAsB,EAAE,UAAU,CAAC;;ACC/E,MAAM,QAAA,GAAgE;AAAA,EACpE,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;AA+BO,MAAM,QAAA,GAAW,CAAC,aAAA,KAAiC;AACxD,EAAA,MAAM,IAAA,GAAO,cAAc,IAAA,IAAQC,kBAAA;AAEnC,EAAA,MAAM,WAAA,mBACJC,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,QAAA;AAAA,QACT,uFAAA;AAAA,QACA,cAAc,OAAA,IAAW,gBAAA;AAAA,QACzB,aAAA,CAAc;AAAA,OAChB;AAAA,MACA,SAAS,aAAA,CAAc,OAAA;AAAA,MAEtB,QAAA,EAAAC,qBAAA,CAAW,MAAM,UAAU;AAAA;AAAA,GAC9B;AAGF,EAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,IAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,aAAA,KAAkB,aAAA,CAAc,YAAA;AAE5D,IAAA,uBACEC,eAAA,CAACC,eAAA,EAAA,EAAQ,OAAA,EAAS,WAAA,EACf,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASJ,cAAA,CAACI,eAAA,CAAQ,KAAA,EAAR,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC/B,WAAA,oBACCJ,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,MAE3D,aAAA,oBACCA,cAAA;AAAA,QAACK,aAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,SAAA,EAAU,4BAAA;AAAA,UACT,GAAG,aAAA;AAAA,UACJ,MAAM,aAAA,CAAc;AAAA;AAAA;AACtB,KAAA,EAEJ,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,aAAA,CAAc,cAAc,OAAA,EAAS;AACvC,IAAA,MAAM,OACJ,QAAA,CAAS,aAAA,CAAc,YAAA,CAAa,QAAA,IAAY,MAAM,CAAA,IAAK,KAAA;AAE7D,IAAA,uBACEL,cAAA,CAACM,kCAAA,EAAA,EACC,QAAA,kBAAAH,eAAA,CAACI,0BAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAP,cAAA,CAACQ,iCAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EAAE,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBACrCR,cAAA,CAACS,iCAAA,EAAA,EAAe,IAAA,EACb,QAAA,EAAA,aAAA,CAAc,aAAa,OAAA,EAC9B;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,OAAO,WAAA;AACT;;;;","x_google_ignoreList":[0]}
@@ -241,7 +241,7 @@ const Input = React.forwardRef(
241
241
  ] }),
242
242
  /* @__PURE__ */ jsxRuntime.jsxs(primitives_Field.FieldContent, { children: [
243
243
  inputGroup,
244
- !!error && /* @__PURE__ */ jsxRuntime.jsx(primitives_Field.FieldError, { id: errorId, children: error }),
244
+ !!error && /* @__PURE__ */ jsxRuntime.jsx(primitives_Field.FieldError, { "data-testid": "input-error", id: errorId, children: error }),
245
245
  helpText && /* @__PURE__ */ jsxRuntime.jsx(primitives_Field.FieldDescription, { id: helpTextId, children: helpText })
246
246
  ] })
247
247
  ]
@@ -252,4 +252,4 @@ const Input = React.forwardRef(
252
252
  Input.displayName = "Input";
253
253
 
254
254
  exports.Input = Input;
255
- //# sourceMappingURL=Input-k6MkhSTc.js.map
255
+ //# sourceMappingURL=Input-lWo0YoZ9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Input-k6MkhSTc.js","sources":["../../src/components/Input/constants.ts","../../src/components/Input/utils.ts","../../src/components/Input/Input.tsx"],"sourcesContent":["// Mobile (<768px) uses 16px input font-size to prevent iOS Safari auto-zoom\n// on focus. Desktop (md+) keeps the original text sizes. Small variant also\n// bumps its height on mobile so 16px text doesn't look cramped in a 28px\n// container; medium and large keep their desktop heights.\nexport const SIZE_CONFIG = {\n small: {\n group: \"h-8 md:h-7\",\n input: \"text-base md:text-xs px-2\",\n addonStart: \"ps-1.5\",\n addonEnd: \"pe-1.5\",\n icon: \"size-3.5\",\n },\n medium: {\n group: \"h-8\",\n input: \"text-base md:text-sm\",\n addonStart: \"ps-2\",\n addonEnd: \"pe-2\",\n icon: \"size-4\",\n },\n large: {\n group: \"h-10\",\n input: \"text-base md:text-sm\",\n addonStart: \"ps-2.5\",\n addonEnd: \"pe-2.5\",\n icon: \"size-5\",\n },\n};\n","import React from \"react\";\n\nexport function toFixed(numStr: string, prec: number): string {\n const num = Number(numStr);\n if (Number.isNaN(num)) return numStr;\n\n return num.toFixed(prec);\n}\n\nexport function formatWithPrecision(\n value: string | number | undefined,\n precision: number\n): string | undefined {\n if (precision < 0 || !value) return value as string | undefined;\n\n const str = value.toString();\n const trimmed = str.trim();\n if (trimmed !== \"\" && !Number.isNaN(Number(trimmed)))\n return toFixed(str, precision);\n\n return str;\n}\n\nexport function enforceDecimalPrecision(\n value: string,\n precision: number\n): string {\n if (precision < 0 || !value) return value;\n\n const valueStr = value.toString();\n if (precision === 0) return valueStr.split(\".\")[0];\n\n const regex = new RegExp(`^\\\\d*\\\\.?\\\\d{0,${precision}}$`);\n if (regex.test(valueStr)) return value;\n\n const parts = valueStr.split(\".\");\n if (parts.length === 1) return parts[0];\n\n return `${parts[0]}.${parts[1].substring(0, precision)}`;\n}\n\nexport function formatWithRejectCharsRegex(\n value: string,\n rejectCharsRegex?: RegExp\n): string {\n if (!rejectCharsRegex) return value;\n\n const globalRegex = new RegExp(rejectCharsRegex, \"g\");\n\n return value.replace(globalRegex, \"\");\n}\n\nexport function getTrimmedValue(\n value: string | number,\n disableTrimOnBlur: boolean\n): string | number {\n if (disableTrimOnBlur || typeof value !== \"string\") return value;\n\n return value.trim();\n}\n\nexport function preserveCursor(\n e: React.ChangeEvent<HTMLInputElement>,\n updateValueFn: () => React.ChangeEvent<HTMLInputElement>\n) {\n const input = e.target;\n const prevCursor = input.selectionStart;\n const prevValue = input.value;\n\n const updatedEvent = updateValueFn();\n\n const lengthDiff = input.value.length - prevValue.length;\n const newCursor = Math.max(0, (prevCursor ?? 0) + lengthDiff);\n\n const restore = () => {\n if (document.activeElement !== input) return;\n if (input.type === \"number\") return;\n\n input.setSelectionRange(newCursor, newCursor);\n };\n\n // Schedule via microtask (fires before paint, before any other event handlers run)\n // and fall back to RAF only if the microtask didn't run for some reason.\n // Leaving both armed races stale RAFs against subsequent keystrokes' onChange,\n // which corrupts cursor position under fast typing (jsdom + user-event).\n const rafId = requestAnimationFrame(restore);\n queueMicrotask(() => {\n cancelAnimationFrame(rafId);\n restore();\n });\n\n return updatedEvent;\n}\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 {\n InputGroup,\n InputGroupAddon,\n InputGroupText,\n InputGroupInput,\n} from \"src/primitives/InputGroup\";\nimport { withIconSize, type IconLike } from \"src/utils/withIconSize\";\n\nimport { SIZE_CONFIG } from \"./constants\";\nimport {\n formatWithPrecision,\n enforceDecimalPrecision,\n formatWithRejectCharsRegex,\n getTrimmedValue,\n preserveCursor,\n} from \"./utils\";\n\ntype InputSize = \"small\" | \"medium\" | \"large\";\n\nexport interface InputProps extends Omit<\n React.ComponentProps<\"input\">,\n \"size\" | \"prefix\" | \"value\"\n> {\n /** Controlled value. */\n value?: string | number;\n /** Size of the input. */\n size?: InputSize;\n /** Input type. */\n type?: string;\n /** Label displayed above the input. */\n label?: string;\n /** Error message displayed below the input. */\n error?: string;\n /** Help text displayed below the input. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Content rendered before the input. Accepts an element, a component\n * reference (e.g. `Search` from lucide-react), or any other React node. */\n prefix?: IconLike;\n /** Content rendered after the input. Accepts an element, a component\n * reference (e.g. `Search` from lucide-react), or any other React node. */\n suffix?: IconLike;\n /** Removes borders from the input. */\n nakedInput?: boolean;\n /** HTML size attribute for the input element. */\n contentSize?: number;\n /** Maximum character limit. Counter visible at 85%. */\n maxLength?: number;\n /** Allow typing past maxLength, show error styling on count. */\n unlimitedChars?: boolean;\n /** Regex to reject matching characters from input. */\n rejectCharsRegex?: RegExp;\n /** Prevent trimming whitespace on blur. */\n disableTrimOnBlur?: boolean;\n /** Decimal places for number formatting. -1 to disable. */\n precision?: number;\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}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = \"medium\",\n type = \"text\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n prefix = null,\n suffix = null,\n disabled = false,\n nakedInput = false,\n contentSize,\n required = false,\n maxLength,\n unlimitedChars = false,\n rejectCharsRegex,\n disableTrimOnBlur = false,\n precision = -1,\n labelProps,\n className = \"\",\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\n // Controlled / uncontrolled value tracking\n const [valueInternal, setValueInternal] = useState(controlledValue);\n const isControlled = controlledValue !== undefined;\n\n const value =\n formatWithPrecision(controlledValue, precision) ?? 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 // --- Handlers ---\n\n const onChangeInternal = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setValueInternal(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (type === \"file\") {\n onChangeInternal(e);\n\n return;\n }\n\n let formattedValue = formatWithRejectCharsRegex(\n e.target.value,\n rejectCharsRegex\n );\n formattedValue = enforceDecimalPrecision(formattedValue, precision);\n\n if (formattedValue !== e.target.value) {\n preserveCursor(e, () => {\n const syntheticEvent = Object.create(e, {\n target: { value: { ...e.target, value: formattedValue } },\n });\n e.target.value = formattedValue;\n onChangeInternal(syntheticEvent);\n\n return syntheticEvent;\n });\n } else {\n onChangeInternal(e);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (type === \"file\") {\n onBlur?.(e);\n\n return;\n }\n\n const trimmedValue = getTrimmedValue(value, disableTrimOnBlur);\n const formattedValue = formatWithPrecision(trimmedValue, precision);\n\n if (formattedValue !== undefined && formattedValue !== value) {\n e.target.value = formattedValue.toString();\n handleChange(e as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n\n onBlur?.(e);\n };\n\n const handleWheel = (e: React.WheelEvent<HTMLInputElement>) => {\n if (type === \"number\") (e.target as HTMLInputElement).blur();\n };\n\n // --- aria-describedby ---\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n // --- Render ---\n\n const hasField = !!(label || error || helpText);\n const sizeConfig = SIZE_CONFIG[size];\n\n const inputGroup = (\n <InputGroup\n className={cn(\n sizeConfig.group,\n nakedInput &&\n \"border-0 shadow-none has-[[data-slot=input-group-control]:focus-visible]:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-transparent\",\n !!error &&\n !nakedInput &&\n \"border-destructive ring-destructive/20 ring-3\",\n !hasField && className\n )}\n >\n {prefix && (\n <InputGroupAddon\n align=\"inline-start\"\n className={sizeConfig.addonStart}\n >\n <InputGroupText>\n {withIconSize(prefix, sizeConfig.icon)}\n </InputGroupText>\n </InputGroupAddon>\n )}\n <InputGroupInput\n ref={ref}\n id={id}\n type={type}\n disabled={disabled}\n required={required}\n size={contentSize}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n className={cn(sizeConfig.input, nakedInput && \"px-0\")}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n onWheel={handleWheel}\n {...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {})}\n {...otherProps}\n />\n {suffix && (\n <InputGroupAddon align=\"inline-end\" className={sizeConfig.addonEnd}>\n <InputGroupText>\n {withIconSize(suffix, sizeConfig.icon)}\n </InputGroupText>\n </InputGroupAddon>\n )}\n </InputGroup>\n );\n\n if (!hasField) {\n return inputGroup;\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {(label || isCharacterLimitVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel htmlFor={id} {...labelProps}>\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 {inputGroup}\n {!!error && <FieldError id={errorId}>{error}</FieldError>}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input };\n"],"names":["forwardRef","useId","useState","jsxs","InputGroup","cn","jsx","InputGroupAddon","InputGroupText","withIconSize","InputGroupInput","Field","FieldLabel","FieldContent","FieldError","FieldDescription"],"mappings":"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"}
1
+ {"version":3,"file":"Input-lWo0YoZ9.js","sources":["../../src/components/Input/constants.ts","../../src/components/Input/utils.ts","../../src/components/Input/Input.tsx"],"sourcesContent":["// Mobile (<768px) uses 16px input font-size to prevent iOS Safari auto-zoom\n// on focus. Desktop (md+) keeps the original text sizes. Small variant also\n// bumps its height on mobile so 16px text doesn't look cramped in a 28px\n// container; medium and large keep their desktop heights.\nexport const SIZE_CONFIG = {\n small: {\n group: \"h-8 md:h-7\",\n input: \"text-base md:text-xs px-2\",\n addonStart: \"ps-1.5\",\n addonEnd: \"pe-1.5\",\n icon: \"size-3.5\",\n },\n medium: {\n group: \"h-8\",\n input: \"text-base md:text-sm\",\n addonStart: \"ps-2\",\n addonEnd: \"pe-2\",\n icon: \"size-4\",\n },\n large: {\n group: \"h-10\",\n input: \"text-base md:text-sm\",\n addonStart: \"ps-2.5\",\n addonEnd: \"pe-2.5\",\n icon: \"size-5\",\n },\n};\n","import React from \"react\";\n\nexport function toFixed(numStr: string, prec: number): string {\n const num = Number(numStr);\n if (Number.isNaN(num)) return numStr;\n\n return num.toFixed(prec);\n}\n\nexport function formatWithPrecision(\n value: string | number | undefined,\n precision: number\n): string | undefined {\n if (precision < 0 || !value) return value as string | undefined;\n\n const str = value.toString();\n const trimmed = str.trim();\n if (trimmed !== \"\" && !Number.isNaN(Number(trimmed)))\n return toFixed(str, precision);\n\n return str;\n}\n\nexport function enforceDecimalPrecision(\n value: string,\n precision: number\n): string {\n if (precision < 0 || !value) return value;\n\n const valueStr = value.toString();\n if (precision === 0) return valueStr.split(\".\")[0];\n\n const regex = new RegExp(`^\\\\d*\\\\.?\\\\d{0,${precision}}$`);\n if (regex.test(valueStr)) return value;\n\n const parts = valueStr.split(\".\");\n if (parts.length === 1) return parts[0];\n\n return `${parts[0]}.${parts[1].substring(0, precision)}`;\n}\n\nexport function formatWithRejectCharsRegex(\n value: string,\n rejectCharsRegex?: RegExp\n): string {\n if (!rejectCharsRegex) return value;\n\n const globalRegex = new RegExp(rejectCharsRegex, \"g\");\n\n return value.replace(globalRegex, \"\");\n}\n\nexport function getTrimmedValue(\n value: string | number,\n disableTrimOnBlur: boolean\n): string | number {\n if (disableTrimOnBlur || typeof value !== \"string\") return value;\n\n return value.trim();\n}\n\nexport function preserveCursor(\n e: React.ChangeEvent<HTMLInputElement>,\n updateValueFn: () => React.ChangeEvent<HTMLInputElement>\n) {\n const input = e.target;\n const prevCursor = input.selectionStart;\n const prevValue = input.value;\n\n const updatedEvent = updateValueFn();\n\n const lengthDiff = input.value.length - prevValue.length;\n const newCursor = Math.max(0, (prevCursor ?? 0) + lengthDiff);\n\n const restore = () => {\n if (document.activeElement !== input) return;\n if (input.type === \"number\") return;\n\n input.setSelectionRange(newCursor, newCursor);\n };\n\n // Schedule via microtask (fires before paint, before any other event handlers run)\n // and fall back to RAF only if the microtask didn't run for some reason.\n // Leaving both armed races stale RAFs against subsequent keystrokes' onChange,\n // which corrupts cursor position under fast typing (jsdom + user-event).\n const rafId = requestAnimationFrame(restore);\n queueMicrotask(() => {\n cancelAnimationFrame(rafId);\n restore();\n });\n\n return updatedEvent;\n}\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 {\n InputGroup,\n InputGroupAddon,\n InputGroupText,\n InputGroupInput,\n} from \"src/primitives/InputGroup\";\nimport { withIconSize, type IconLike } from \"src/utils/withIconSize\";\n\nimport { SIZE_CONFIG } from \"./constants\";\nimport {\n formatWithPrecision,\n enforceDecimalPrecision,\n formatWithRejectCharsRegex,\n getTrimmedValue,\n preserveCursor,\n} from \"./utils\";\n\ntype InputSize = \"small\" | \"medium\" | \"large\";\n\nexport interface InputProps extends Omit<\n React.ComponentProps<\"input\">,\n \"size\" | \"prefix\" | \"value\"\n> {\n /** Controlled value. */\n value?: string | number;\n /** Size of the input. */\n size?: InputSize;\n /** Input type. */\n type?: string;\n /** Label displayed above the input. */\n label?: string;\n /** Error message displayed below the input. */\n error?: string;\n /** Help text displayed below the input. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Content rendered before the input. Accepts an element, a component\n * reference (e.g. `Search` from lucide-react), or any other React node. */\n prefix?: IconLike;\n /** Content rendered after the input. Accepts an element, a component\n * reference (e.g. `Search` from lucide-react), or any other React node. */\n suffix?: IconLike;\n /** Removes borders from the input. */\n nakedInput?: boolean;\n /** HTML size attribute for the input element. */\n contentSize?: number;\n /** Maximum character limit. Counter visible at 85%. */\n maxLength?: number;\n /** Allow typing past maxLength, show error styling on count. */\n unlimitedChars?: boolean;\n /** Regex to reject matching characters from input. */\n rejectCharsRegex?: RegExp;\n /** Prevent trimming whitespace on blur. */\n disableTrimOnBlur?: boolean;\n /** Decimal places for number formatting. -1 to disable. */\n precision?: number;\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}\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = \"medium\",\n type = \"text\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n prefix = null,\n suffix = null,\n disabled = false,\n nakedInput = false,\n contentSize,\n required = false,\n maxLength,\n unlimitedChars = false,\n rejectCharsRegex,\n disableTrimOnBlur = false,\n precision = -1,\n labelProps,\n className = \"\",\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\n // Controlled / uncontrolled value tracking\n const [valueInternal, setValueInternal] = useState(controlledValue);\n const isControlled = controlledValue !== undefined;\n\n const value =\n formatWithPrecision(controlledValue, precision) ?? 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 // --- Handlers ---\n\n const onChangeInternal = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setValueInternal(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (type === \"file\") {\n onChangeInternal(e);\n\n return;\n }\n\n let formattedValue = formatWithRejectCharsRegex(\n e.target.value,\n rejectCharsRegex\n );\n formattedValue = enforceDecimalPrecision(formattedValue, precision);\n\n if (formattedValue !== e.target.value) {\n preserveCursor(e, () => {\n const syntheticEvent = Object.create(e, {\n target: { value: { ...e.target, value: formattedValue } },\n });\n e.target.value = formattedValue;\n onChangeInternal(syntheticEvent);\n\n return syntheticEvent;\n });\n } else {\n onChangeInternal(e);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n if (type === \"file\") {\n onBlur?.(e);\n\n return;\n }\n\n const trimmedValue = getTrimmedValue(value, disableTrimOnBlur);\n const formattedValue = formatWithPrecision(trimmedValue, precision);\n\n if (formattedValue !== undefined && formattedValue !== value) {\n e.target.value = formattedValue.toString();\n handleChange(e as unknown as React.ChangeEvent<HTMLInputElement>);\n }\n\n onBlur?.(e);\n };\n\n const handleWheel = (e: React.WheelEvent<HTMLInputElement>) => {\n if (type === \"number\") (e.target as HTMLInputElement).blur();\n };\n\n // --- aria-describedby ---\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n // --- Render ---\n\n const hasField = !!(label || error || helpText);\n const sizeConfig = SIZE_CONFIG[size];\n\n const inputGroup = (\n <InputGroup\n className={cn(\n sizeConfig.group,\n nakedInput &&\n \"border-0 shadow-none has-[[data-slot=input-group-control]:focus-visible]:ring-0 has-[[data-slot=input-group-control]:focus-visible]:border-transparent\",\n !!error &&\n !nakedInput &&\n \"border-destructive ring-destructive/20 ring-3\",\n !hasField && className\n )}\n >\n {prefix && (\n <InputGroupAddon\n align=\"inline-start\"\n className={sizeConfig.addonStart}\n >\n <InputGroupText>\n {withIconSize(prefix, sizeConfig.icon)}\n </InputGroupText>\n </InputGroupAddon>\n )}\n <InputGroupInput\n ref={ref}\n id={id}\n type={type}\n disabled={disabled}\n required={required}\n size={contentSize}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n className={cn(sizeConfig.input, nakedInput && \"px-0\")}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n onWheel={handleWheel}\n {...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {})}\n {...otherProps}\n />\n {suffix && (\n <InputGroupAddon align=\"inline-end\" className={sizeConfig.addonEnd}>\n <InputGroupText>\n {withIconSize(suffix, sizeConfig.icon)}\n </InputGroupText>\n </InputGroupAddon>\n )}\n </InputGroup>\n );\n\n if (!hasField) {\n return inputGroup;\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {(label || isCharacterLimitVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel htmlFor={id} {...labelProps}>\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 {inputGroup}\n {!!error && (\n <FieldError data-testid=\"input-error\" id={errorId}>\n {error}\n </FieldError>\n )}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nInput.displayName = \"Input\";\n\nexport { Input };\n"],"names":["forwardRef","useId","useState","jsxs","InputGroup","cn","jsx","InputGroupAddon","InputGroupText","withIconSize","InputGroupInput","Field","FieldLabel","FieldContent","FieldError","FieldDescription"],"mappings":"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"}
@@ -38,7 +38,7 @@ const Kbd = React.forwardRef(
38
38
  ...otherProps
39
39
  }
40
40
  ) }),
41
- /* @__PURE__ */ jsxRuntime.jsx(primitives_Tooltip.TooltipContent, { side, children: tooltipProps.content })
41
+ /* @__PURE__ */ jsxRuntime.jsx(primitives_Tooltip.TooltipContent, { "data-testid": "tooltip-box", side, children: tooltipProps.content })
42
42
  ] }) });
43
43
  }
44
44
  );
@@ -47,4 +47,4 @@ const KbdGroup = primitives_Kbd.KbdGroup;
47
47
  const KbdNamespace = Object.assign(Kbd, { Group: KbdGroup });
48
48
 
49
49
  exports.KbdNamespace = KbdNamespace;
50
- //# sourceMappingURL=Kbd-BvC3VSNb.js.map
50
+ //# sourceMappingURL=Kbd--A8Gl8TV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Kbd--A8Gl8TV.js","sources":["../../src/components/Kbd/constants.ts","../../src/components/Kbd/Kbd.tsx"],"sourcesContent":["export const SIDE_MAP: Record<string, \"top\" | \"right\" | \"bottom\" | \"left\"> = {\n top: \"top\",\n bottom: \"bottom\",\n left: \"left\",\n right: \"right\",\n \"top-start\": \"top\",\n \"top-end\": \"top\",\n \"bottom-start\": \"bottom\",\n \"bottom-end\": \"bottom\",\n \"left-start\": \"left\",\n \"left-end\": \"left\",\n \"right-start\": \"right\",\n \"right-end\": \"right\",\n auto: \"top\",\n};\n","import React, { forwardRef } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Kbd as PrimitiveKbd,\n KbdGroup as PrimitiveKbdGroup,\n} from \"src/primitives/Kbd\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"src/primitives/Tooltip\";\n\nimport { SIDE_MAP } from \"./constants\";\n\nexport interface KbdProps extends React.ComponentProps<typeof PrimitiveKbd> {\n /** Optional tooltip to display on hover. */\n tooltipProps?: {\n content?: React.ReactNode;\n position?: string;\n };\n /** Additional CSS class names. */\n className?: string;\n}\n\nconst Kbd = forwardRef<HTMLElement, KbdProps>(\n ({ tooltipProps, className, ...otherProps }, ref) => {\n if (!tooltipProps?.content) {\n return (\n <PrimitiveKbd ref={ref} className={cn(className)} {...otherProps} />\n );\n }\n\n const side = SIDE_MAP[tooltipProps.position ?? \"auto\"] ?? \"top\";\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <PrimitiveKbd\n ref={ref}\n tabIndex={0}\n className={cn(\"pointer-events-auto\", className)}\n {...otherProps}\n />\n </TooltipTrigger>\n <TooltipContent data-testid=\"tooltip-box\" side={side}>\n {tooltipProps.content}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n);\n\nKbd.displayName = \"Kbd\";\n\nconst KbdGroup = PrimitiveKbdGroup;\n\nconst KbdNamespace = Object.assign(Kbd, { Group: KbdGroup });\n\nexport { KbdNamespace as Kbd };\n"],"names":["forwardRef","jsx","PrimitiveKbd","cn","TooltipProvider","jsxs","Tooltip","TooltipTrigger","TooltipContent","PrimitiveKbdGroup"],"mappings":";;;;;;;;AAAO,MAAM,QAAA,GAAgE;AAAA,EAC3E,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,WAAA,EAAa,KAAA;AAAA,EACb,SAAA,EAAW,KAAA;AAAA,EACX,cAAA,EAAgB,QAAA;AAAA,EAChB,YAAA,EAAc,QAAA;AAAA,EACd,YAAA,EAAc,MAAA;AAAA,EACd,UAAA,EAAY,MAAA;AAAA,EACZ,aAAA,EAAe,OAAA;AAAA,EACf,WAAA,EAAa,OAAA;AAAA,EACb,IAAA,EAAM;AACR,CAAA;;ACYA,MAAM,GAAA,GAAMA,gBAAA;AAAA,EACV,CAAC,EAAE,YAAA,EAAc,WAAW,GAAG,UAAA,IAAc,GAAA,KAAQ;AACnD,IAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC1B,MAAA,uBACEC,cAAA,CAACC,sBAAa,GAAA,EAAU,SAAA,EAAWC,SAAG,SAAS,CAAA,EAAI,GAAG,UAAA,EAAY,CAAA;AAAA,IAEtE;AAEA,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,YAAA,CAAa,QAAA,IAAY,MAAM,CAAA,IAAK,KAAA;AAE1D,IAAA,uBACEF,cAAA,CAACG,kCAAA,EAAA,EACC,QAAA,kBAAAC,eAAA,CAACC,0BAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAL,cAAA,CAACM,iCAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAAN,cAAA;AAAA,QAACC,kBAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAWC,QAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,UAC7C,GAAG;AAAA;AAAA,OACN,EACF,CAAA;AAAA,qCACCK,iCAAA,EAAA,EAAe,aAAA,EAAY,aAAA,EAAc,IAAA,EACvC,uBAAa,OAAA,EAChB;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;AAEA,GAAA,CAAI,WAAA,GAAc,KAAA;AAElB,MAAM,QAAA,GAAWC,uBAAA;AAEjB,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,UAAU;;;;"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
- var HelpIcon = require('./HelpIcon-CIkKt2uy.js');
5
+ var HelpIcon = require('./HelpIcon-QpZY6Zmc.js');
6
6
  var primitives_Label = require('./primitives/Label.js');
7
7
  var utils = require('./utils-BhM0B89p.js');
8
8
 
@@ -16,4 +16,4 @@ const Label = React.forwardRef(
16
16
  Label.displayName = "Label";
17
17
 
18
18
  exports.Label = Label;
19
- //# sourceMappingURL=Label-Dt7K54Ly.js.map
19
+ //# sourceMappingURL=Label-D8RFE9hd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Label-Dt7K54Ly.js","sources":["../../src/components/Label/Label.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\n\nimport { HelpIcon, type HelpIconProps } from \"src/shared/HelpIcon\";\nimport { Label as PrimitiveLabel } from \"src/primitives/Label\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nexport type { HelpIconProps };\n\nexport interface LabelProps extends React.ComponentProps<\n typeof PrimitiveLabel\n> {\n /** Shows a red asterisk after the label text. */\n required?: boolean;\n /** Props for the help icon (tooltip or popover mode). */\n helpIconProps?: HelpIconProps;\n /** Additional CSS class names. */\n className?: string;\n}\n\nconst Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ required, helpIconProps, className, children, ...otherProps }, ref) => (\n <PrimitiveLabel ref={ref} className={cn(className)} {...otherProps}>\n {children}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n {helpIconProps && <HelpIcon {...helpIconProps} />}\n </PrimitiveLabel>\n )\n);\n\nLabel.displayName = \"Label\";\n\nexport { Label };\n"],"names":["forwardRef","jsxs","PrimitiveLabel","cn","jsx","HelpIcon"],"mappings":";;;;;;;;AAmBA,MAAM,KAAA,GAAQA,gBAAA;AAAA,EACZ,CAAC,EAAE,QAAA,EAAU,eAAe,SAAA,EAAW,QAAA,EAAU,GAAG,UAAA,EAAW,EAAG,GAAA,qBAChEC,eAAA,CAACC,0BAAe,GAAA,EAAU,SAAA,EAAWC,SAAG,SAAS,CAAA,EAAI,GAAG,UAAA,EACrD,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,4BACCC,cAAA,CAAC,MAAA,EAAA,EAAK,eAAY,MAAA,EAAO,SAAA,EAAU,oBAAmB,QAAA,EAAA,GAAA,EAEtD,CAAA;AAAA,IAED,aAAA,oBAAiBA,cAAA,CAACC,iBAAA,EAAA,EAAU,GAAG,aAAA,EAAe;AAAA,GAAA,EACjD;AAEJ;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA;;;;"}
1
+ {"version":3,"file":"Label-D8RFE9hd.js","sources":["../../src/components/Label/Label.tsx"],"sourcesContent":["import React, { forwardRef } from \"react\";\n\nimport { HelpIcon, type HelpIconProps } from \"src/shared/HelpIcon\";\nimport { Label as PrimitiveLabel } from \"src/primitives/Label\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\nexport type { HelpIconProps };\n\nexport interface LabelProps extends React.ComponentProps<\n typeof PrimitiveLabel\n> {\n /** Shows a red asterisk after the label text. */\n required?: boolean;\n /** Props for the help icon (tooltip or popover mode). */\n helpIconProps?: HelpIconProps;\n /** Additional CSS class names. */\n className?: string;\n}\n\nconst Label = forwardRef<HTMLLabelElement, LabelProps>(\n ({ required, helpIconProps, className, children, ...otherProps }, ref) => (\n <PrimitiveLabel ref={ref} className={cn(className)} {...otherProps}>\n {children}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n {helpIconProps && <HelpIcon {...helpIconProps} />}\n </PrimitiveLabel>\n )\n);\n\nLabel.displayName = \"Label\";\n\nexport { Label };\n"],"names":["forwardRef","jsxs","PrimitiveLabel","cn","jsx","HelpIcon"],"mappings":";;;;;;;;AAmBA,MAAM,KAAA,GAAQA,gBAAA;AAAA,EACZ,CAAC,EAAE,QAAA,EAAU,eAAe,SAAA,EAAW,QAAA,EAAU,GAAG,UAAA,EAAW,EAAG,GAAA,qBAChEC,eAAA,CAACC,0BAAe,GAAA,EAAU,SAAA,EAAWC,SAAG,SAAS,CAAA,EAAI,GAAG,UAAA,EACrD,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,4BACCC,cAAA,CAAC,MAAA,EAAA,EAAK,eAAY,MAAA,EAAO,SAAA,EAAU,oBAAmB,QAAA,EAAA,GAAA,EAEtD,CAAA;AAAA,IAED,aAAA,oBAAiBA,cAAA,CAACC,iBAAA,EAAA,EAAU,GAAG,aAAA,EAAe;AAAA,GAAA,EACjD;AAEJ;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA;;;;"}
@@ -170,96 +170,103 @@ const MultiEmailInput = React.forwardRef((props, ref) => {
170
170
  handleFilterInvalidEmails,
171
171
  duplicateEmails
172
172
  } = useMultiEmailState(props);
173
- return /* @__PURE__ */ jsxRuntime.jsxs(primitives_Field.Field, { className: utils.cn("flex flex-col gap-1.5", className), children: [
174
- (label || isCounterVisible) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
175
- label && /* @__PURE__ */ jsxRuntime.jsxs(primitives_Field.FieldLabel, { htmlFor: id, ...labelProps, children: [
176
- label,
177
- required && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-destructive", children: " *" })
178
- ] }),
179
- isCounterVisible && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-muted-foreground", children: [
180
- validCount,
181
- " ",
182
- typeof counter === "object" && counter?.label ? counter.label : pluralizeEmail(validCount)
183
- ] })
184
- ] }),
185
- /* @__PURE__ */ jsxRuntime.jsxs(
186
- "div",
187
- {
188
- className: utils.cn(
189
- CHIPS_CONTAINER,
190
- !!error && CHIPS_ERROR,
191
- disabled && "pointer-events-none opacity-50"
192
- ),
193
- style: { maxHeight: `${maxHeight}px`, overflowY: "auto" },
194
- children: [
195
- prefix && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 text-muted-foreground", children: withIconSize.withIconSize(prefix, "size-4") }),
196
- visibleEmails.map((email) => /* @__PURE__ */ jsxRuntime.jsxs(
197
- "span",
198
- {
199
- className: utils.cn(CHIP_BASE, !email.valid && CHIP_INVALID),
200
- children: [
201
- email.label,
202
- !disabled && /* @__PURE__ */ jsxRuntime.jsx(
203
- "button",
204
- {
205
- type: "button",
206
- tabIndex: -1,
207
- className: "-ms-0.5 rounded-xs opacity-50 hover:opacity-100",
208
- onMouseDown: (e) => e.preventDefault(),
209
- onClick: () => handleChipRemove(email.value),
210
- "aria-label": `Remove ${email.label}`,
211
- children: /* @__PURE__ */ jsxRuntime.jsx(x.X, { className: "size-3 pointer-events-none" })
212
- }
213
- )
214
- ]
215
- },
216
- email.value
217
- )),
218
- hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground", children: [
219
- "+",
220
- hiddenCount,
221
- " more"
173
+ return /* @__PURE__ */ jsxRuntime.jsxs(
174
+ primitives_Field.Field,
175
+ {
176
+ className: utils.cn("flex flex-col gap-1.5", className),
177
+ "data-testid": "email-input-wrapper",
178
+ children: [
179
+ (label || isCounterVisible) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
180
+ label && /* @__PURE__ */ jsxRuntime.jsxs(primitives_Field.FieldLabel, { htmlFor: id, ...labelProps, children: [
181
+ label,
182
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-destructive", children: " *" })
222
183
  ] }),
223
- /* @__PURE__ */ jsxRuntime.jsx(
224
- "input",
225
- {
226
- ref,
227
- id,
228
- type: "text",
229
- value: inputValue,
230
- onChange: (e) => setInputValue(e.target.value),
231
- onKeyDown: handleKeyDown,
232
- onPaste: handlePaste,
233
- onFocus: handleFocus,
234
- onBlur: handleBlur,
235
- placeholder: props.value?.length ? "" : placeholder,
236
- disabled,
237
- className: "min-w-16 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm"
238
- }
239
- ),
240
- suffix && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 text-muted-foreground", children: withIconSize.withIconSize(suffix, "size-4") })
241
- ]
242
- }
243
- ),
244
- /* @__PURE__ */ jsxRuntime.jsxs(primitives_Field.FieldContent, { children: [
245
- !!error && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-[0.8rem] text-destructive", children: [
246
- error,
247
- isFilterLinkVisible && /* @__PURE__ */ jsxRuntime.jsx(
248
- "button",
184
+ isCounterVisible && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-muted-foreground", children: [
185
+ validCount,
186
+ " ",
187
+ typeof counter === "object" && counter?.label ? counter.label : pluralizeEmail(validCount)
188
+ ] })
189
+ ] }),
190
+ /* @__PURE__ */ jsxRuntime.jsxs(
191
+ "div",
249
192
  {
250
- type: "button",
251
- className: "ml-1 cursor-pointer font-semibold underline",
252
- onClick: handleFilterInvalidEmails,
253
- children: filterInvalidEmails?.label ?? "Click here to remove invalid emails."
193
+ className: utils.cn(
194
+ CHIPS_CONTAINER,
195
+ !!error && CHIPS_ERROR,
196
+ disabled && "pointer-events-none opacity-50"
197
+ ),
198
+ style: { maxHeight: `${maxHeight}px`, overflowY: "auto" },
199
+ children: [
200
+ prefix && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 text-muted-foreground", children: withIconSize.withIconSize(prefix, "size-4") }),
201
+ visibleEmails.map((email) => /* @__PURE__ */ jsxRuntime.jsxs(
202
+ "span",
203
+ {
204
+ className: utils.cn(CHIP_BASE, !email.valid && CHIP_INVALID),
205
+ children: [
206
+ email.label,
207
+ !disabled && /* @__PURE__ */ jsxRuntime.jsx(
208
+ "button",
209
+ {
210
+ type: "button",
211
+ tabIndex: -1,
212
+ className: "-ms-0.5 rounded-xs opacity-50 hover:opacity-100",
213
+ onMouseDown: (e) => e.preventDefault(),
214
+ onClick: () => handleChipRemove(email.value),
215
+ "aria-label": `Remove ${email.label}`,
216
+ children: /* @__PURE__ */ jsxRuntime.jsx(x.X, { className: "size-3 pointer-events-none" })
217
+ }
218
+ )
219
+ ]
220
+ },
221
+ email.value
222
+ )),
223
+ hiddenCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex h-[calc(--spacing(5.25))] items-center rounded-sm bg-secondary px-1.5 text-xs font-medium text-secondary-foreground", children: [
224
+ "+",
225
+ hiddenCount,
226
+ " more"
227
+ ] }),
228
+ /* @__PURE__ */ jsxRuntime.jsx(
229
+ "input",
230
+ {
231
+ ref,
232
+ id,
233
+ type: "text",
234
+ value: inputValue,
235
+ onChange: (e) => setInputValue(e.target.value),
236
+ onKeyDown: handleKeyDown,
237
+ onPaste: handlePaste,
238
+ onFocus: handleFocus,
239
+ onBlur: handleBlur,
240
+ placeholder: props.value?.length ? "" : placeholder,
241
+ disabled,
242
+ className: "min-w-16 flex-1 bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm"
243
+ }
244
+ ),
245
+ suffix && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 text-muted-foreground", children: withIconSize.withIconSize(suffix, "size-4") })
246
+ ]
254
247
  }
255
- )
256
- ] }),
257
- !!helpText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.8rem] text-muted-foreground", children: helpText }),
258
- duplicateEmails.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.8rem] text-amber-600 dark:text-amber-400", children: formatDuplicateWarning(duplicateEmails) })
259
- ] })
260
- ] });
248
+ ),
249
+ /* @__PURE__ */ jsxRuntime.jsxs(primitives_Field.FieldContent, { children: [
250
+ !!error && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-[0.8rem] text-destructive", children: [
251
+ error,
252
+ isFilterLinkVisible && /* @__PURE__ */ jsxRuntime.jsx(
253
+ "button",
254
+ {
255
+ type: "button",
256
+ className: "ml-1 cursor-pointer font-semibold underline",
257
+ onClick: handleFilterInvalidEmails,
258
+ children: filterInvalidEmails?.label ?? "Click here to remove invalid emails."
259
+ }
260
+ )
261
+ ] }),
262
+ !!helpText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.8rem] text-muted-foreground", children: helpText }),
263
+ duplicateEmails.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-[0.8rem] text-amber-600 dark:text-amber-400", children: formatDuplicateWarning(duplicateEmails) })
264
+ ] })
265
+ ]
266
+ }
267
+ );
261
268
  });
262
269
  MultiEmailInput.displayName = "MultiEmailInput";
263
270
 
264
271
  exports.MultiEmailInput = MultiEmailInput;
265
- //# sourceMappingURL=MultiEmailInput-KmN2BSaX.js.map
272
+ //# sourceMappingURL=MultiEmailInput-BlIqzq-o.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MultiEmailInput-BlIqzq-o.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 { 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 } = props;\n const id = useId();\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 htmlFor={id} {...labelProps}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n {\" *\"}\n </span>\n )}\n </FieldLabel>\n )}\n {isCounterVisible && (\n <span className=\"text-xs text-muted-foreground\">\n {validCount}{\" \"}\n {typeof counter === \"object\" && counter?.label\n ? counter.label\n : pluralizeEmail(validCount)}\n </span>\n )}\n </div>\n )}\n <div\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 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 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 className=\"text-[0.8rem] text-destructive\">\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 className=\"text-[0.8rem] text-muted-foreground\">{helpText}</p>\n )}\n {duplicateEmails.length > 0 && (\n <p className=\"text-[0.8rem] text-amber-600 dark:text-amber-400\">\n {formatDuplicateWarning(duplicateEmails)}\n </p>\n )}\n </FieldContent>\n </Field>\n );\n});\nMultiEmailInput.displayName = \"MultiEmailInput\";\n"],"names":["useState","useCallback","useMemo","forwardRef","useId","jsxs","Field","cn","FieldLabel","jsx","withIconSize","XIcon","FieldContent"],"mappings":"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"}
@@ -88,10 +88,11 @@ const Pagination = React.forwardRef(
88
88
  {
89
89
  onClick: () => !isFirstPage && handleNavigate(pageNo - 1),
90
90
  "aria-disabled": isFirstPage,
91
- className: utils.cn(isFirstPage && "pointer-events-none opacity-50")
91
+ className: utils.cn(isFirstPage && "pointer-events-none opacity-50"),
92
+ "data-testid": "left-navigate-button"
92
93
  }
93
94
  ) }),
94
- paginationRange.map((page, index) => /* @__PURE__ */ jsxRuntime.jsx(primitives_Pagination.PaginationItem, { children: page === DOTS ? /* @__PURE__ */ jsxRuntime.jsx(primitives_Pagination.PaginationEllipsis, {}) : /* @__PURE__ */ jsxRuntime.jsx(
95
+ paginationRange.map((page, index) => /* @__PURE__ */ jsxRuntime.jsx(primitives_Pagination.PaginationItem, { children: page === DOTS ? /* @__PURE__ */ jsxRuntime.jsx(primitives_Pagination.PaginationEllipsis, { "data-testid": "dots" }) : /* @__PURE__ */ jsxRuntime.jsx(
95
96
  primitives_Pagination.PaginationLink,
96
97
  {
97
98
  isActive: page === pageNo,
@@ -104,7 +105,8 @@ const Pagination = React.forwardRef(
104
105
  {
105
106
  onClick: () => !isLastPage && handleNavigate(pageNo + 1),
106
107
  "aria-disabled": isLastPage,
107
- className: utils.cn(isLastPage && "pointer-events-none opacity-50")
108
+ className: utils.cn(isLastPage && "pointer-events-none opacity-50"),
109
+ "data-testid": "right-navigate-button"
108
110
  }
109
111
  ) })
110
112
  ] }) });
@@ -113,4 +115,4 @@ const Pagination = React.forwardRef(
113
115
  Pagination.displayName = "Pagination";
114
116
 
115
117
  exports.Pagination = Pagination;
116
- //# sourceMappingURL=Pagination-8yFg8xR2.js.map
118
+ //# sourceMappingURL=Pagination-WyQlBpvK.js.map