@spark-ui/components 10.0.0

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 (296) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +19 -0
  4. package/dist/DialogTrigger-5SI4dvpK.d.mts +142 -0
  5. package/dist/DialogTrigger-5SI4dvpK.d.ts +142 -0
  6. package/dist/Input-g0LpWuv0.d.mts +17 -0
  7. package/dist/Input-g0LpWuv0.d.ts +17 -0
  8. package/dist/InputGroup-aoaZxCLk.d.mts +28 -0
  9. package/dist/InputGroup-aoaZxCLk.d.ts +28 -0
  10. package/dist/InputTrailingIcon-BBp7sE6D.d.mts +20 -0
  11. package/dist/InputTrailingIcon-ZZx8PoJy.d.ts +20 -0
  12. package/dist/LabelRequiredIndicator-DRnCzHMU.d.mts +19 -0
  13. package/dist/LabelRequiredIndicator-DRnCzHMU.d.ts +19 -0
  14. package/dist/accordion/index.d.mts +85 -0
  15. package/dist/accordion/index.d.ts +85 -0
  16. package/dist/accordion/index.js +461 -0
  17. package/dist/accordion/index.js.map +1 -0
  18. package/dist/accordion/index.mjs +249 -0
  19. package/dist/accordion/index.mjs.map +1 -0
  20. package/dist/alert-dialog/index.d.mts +119 -0
  21. package/dist/alert-dialog/index.d.ts +119 -0
  22. package/dist/alert-dialog/index.js +1451 -0
  23. package/dist/alert-dialog/index.js.map +1 -0
  24. package/dist/alert-dialog/index.mjs +177 -0
  25. package/dist/alert-dialog/index.mjs.map +1 -0
  26. package/dist/badge/index.d.mts +47 -0
  27. package/dist/badge/index.d.ts +47 -0
  28. package/dist/badge/index.js +122 -0
  29. package/dist/badge/index.js.map +1 -0
  30. package/dist/badge/index.mjs +95 -0
  31. package/dist/badge/index.mjs.map +1 -0
  32. package/dist/breadcrumb/index.d.mts +64 -0
  33. package/dist/breadcrumb/index.d.ts +64 -0
  34. package/dist/breadcrumb/index.js +326 -0
  35. package/dist/breadcrumb/index.js.map +1 -0
  36. package/dist/breadcrumb/index.mjs +149 -0
  37. package/dist/breadcrumb/index.mjs.map +1 -0
  38. package/dist/button/index.d.mts +40 -0
  39. package/dist/button/index.d.ts +40 -0
  40. package/dist/button/index.js +877 -0
  41. package/dist/button/index.js.map +1 -0
  42. package/dist/button/index.mjs +10 -0
  43. package/dist/button/index.mjs.map +1 -0
  44. package/dist/carousel/index.d.mts +253 -0
  45. package/dist/carousel/index.d.ts +253 -0
  46. package/dist/carousel/index.js +1678 -0
  47. package/dist/carousel/index.js.map +1 -0
  48. package/dist/carousel/index.mjs +716 -0
  49. package/dist/carousel/index.mjs.map +1 -0
  50. package/dist/checkbox/index.d.mts +120 -0
  51. package/dist/checkbox/index.d.ts +120 -0
  52. package/dist/checkbox/index.js +873 -0
  53. package/dist/checkbox/index.js.map +1 -0
  54. package/dist/checkbox/index.mjs +349 -0
  55. package/dist/checkbox/index.mjs.map +1 -0
  56. package/dist/chip/index.d.mts +97 -0
  57. package/dist/chip/index.d.ts +97 -0
  58. package/dist/chip/index.js +905 -0
  59. package/dist/chip/index.js.map +1 -0
  60. package/dist/chip/index.mjs +793 -0
  61. package/dist/chip/index.mjs.map +1 -0
  62. package/dist/chunk-2KPFQEAA.mjs +52 -0
  63. package/dist/chunk-2KPFQEAA.mjs.map +1 -0
  64. package/dist/chunk-4F5DOL57.mjs +26 -0
  65. package/dist/chunk-4F5DOL57.mjs.map +1 -0
  66. package/dist/chunk-6JOA37TZ.mjs +742 -0
  67. package/dist/chunk-6JOA37TZ.mjs.map +1 -0
  68. package/dist/chunk-7PMPYEHJ.mjs +379 -0
  69. package/dist/chunk-7PMPYEHJ.mjs.map +1 -0
  70. package/dist/chunk-AESXFMCC.mjs +68 -0
  71. package/dist/chunk-AESXFMCC.mjs.map +1 -0
  72. package/dist/chunk-B42LOFIZ.mjs +308 -0
  73. package/dist/chunk-B42LOFIZ.mjs.map +1 -0
  74. package/dist/chunk-FGOZHKBT.mjs +97 -0
  75. package/dist/chunk-FGOZHKBT.mjs.map +1 -0
  76. package/dist/chunk-HLXYG643.mjs +52 -0
  77. package/dist/chunk-HLXYG643.mjs.map +1 -0
  78. package/dist/chunk-JKNBJHD5.mjs +601 -0
  79. package/dist/chunk-JKNBJHD5.mjs.map +1 -0
  80. package/dist/chunk-K7VP7DH3.mjs +66 -0
  81. package/dist/chunk-K7VP7DH3.mjs.map +1 -0
  82. package/dist/chunk-MUNDKRAE.mjs +80 -0
  83. package/dist/chunk-MUNDKRAE.mjs.map +1 -0
  84. package/dist/chunk-NBZKMCHF.mjs +36 -0
  85. package/dist/chunk-NBZKMCHF.mjs.map +1 -0
  86. package/dist/chunk-PZWESKAR.mjs +314 -0
  87. package/dist/chunk-PZWESKAR.mjs.map +1 -0
  88. package/dist/collapsible/index.d.mts +60 -0
  89. package/dist/collapsible/index.d.ts +60 -0
  90. package/dist/collapsible/index.js +140 -0
  91. package/dist/collapsible/index.js.map +1 -0
  92. package/dist/collapsible/index.mjs +8 -0
  93. package/dist/collapsible/index.mjs.map +1 -0
  94. package/dist/combobox/index.d.mts +285 -0
  95. package/dist/combobox/index.d.ts +285 -0
  96. package/dist/combobox/index.js +2920 -0
  97. package/dist/combobox/index.js.map +1 -0
  98. package/dist/combobox/index.mjs +1267 -0
  99. package/dist/combobox/index.mjs.map +1 -0
  100. package/dist/dialog/index.d.mts +33 -0
  101. package/dist/dialog/index.d.ts +33 -0
  102. package/dist/dialog/index.js +1286 -0
  103. package/dist/dialog/index.js.map +1 -0
  104. package/dist/dialog/index.mjs +13 -0
  105. package/dist/dialog/index.mjs.map +1 -0
  106. package/dist/divider/index.d.mts +61 -0
  107. package/dist/divider/index.d.ts +61 -0
  108. package/dist/divider/index.js +223 -0
  109. package/dist/divider/index.js.map +1 -0
  110. package/dist/divider/index.mjs +196 -0
  111. package/dist/divider/index.mjs.map +1 -0
  112. package/dist/drawer/index.d.mts +148 -0
  113. package/dist/drawer/index.d.ts +148 -0
  114. package/dist/drawer/index.js +1266 -0
  115. package/dist/drawer/index.js.map +1 -0
  116. package/dist/drawer/index.mjs +299 -0
  117. package/dist/drawer/index.mjs.map +1 -0
  118. package/dist/dropdown/index.d.mts +233 -0
  119. package/dist/dropdown/index.d.ts +233 -0
  120. package/dist/dropdown/index.js +2402 -0
  121. package/dist/dropdown/index.js.map +1 -0
  122. package/dist/dropdown/index.mjs +741 -0
  123. package/dist/dropdown/index.mjs.map +1 -0
  124. package/dist/form-field/index.d.mts +176 -0
  125. package/dist/form-field/index.d.ts +176 -0
  126. package/dist/form-field/index.js +540 -0
  127. package/dist/form-field/index.js.map +1 -0
  128. package/dist/form-field/index.mjs +13 -0
  129. package/dist/form-field/index.mjs.map +1 -0
  130. package/dist/icon/index.d.mts +28 -0
  131. package/dist/icon/index.d.ts +28 -0
  132. package/dist/icon/index.js +127 -0
  133. package/dist/icon/index.js.map +1 -0
  134. package/dist/icon/index.mjs +9 -0
  135. package/dist/icon/index.mjs.map +1 -0
  136. package/dist/icon-button/index.d.mts +16 -0
  137. package/dist/icon-button/index.d.ts +16 -0
  138. package/dist/icon-button/index.js +921 -0
  139. package/dist/icon-button/index.js.map +1 -0
  140. package/dist/icon-button/index.mjs +11 -0
  141. package/dist/icon-button/index.mjs.map +1 -0
  142. package/dist/input/index.d.mts +78 -0
  143. package/dist/input/index.d.ts +78 -0
  144. package/dist/input/index.js +1119 -0
  145. package/dist/input/index.js.map +1 -0
  146. package/dist/input/index.mjs +16 -0
  147. package/dist/input/index.mjs.map +1 -0
  148. package/dist/kbd/index.d.mts +9 -0
  149. package/dist/kbd/index.d.ts +9 -0
  150. package/dist/kbd/index.js +46 -0
  151. package/dist/kbd/index.js.map +1 -0
  152. package/dist/kbd/index.mjs +19 -0
  153. package/dist/kbd/index.mjs.map +1 -0
  154. package/dist/label/index.d.mts +11 -0
  155. package/dist/label/index.d.ts +11 -0
  156. package/dist/label/index.js +78 -0
  157. package/dist/label/index.js.map +1 -0
  158. package/dist/label/index.mjs +7 -0
  159. package/dist/label/index.mjs.map +1 -0
  160. package/dist/link-box/index.d.mts +34 -0
  161. package/dist/link-box/index.d.ts +34 -0
  162. package/dist/link-box/index.js +92 -0
  163. package/dist/link-box/index.js.map +1 -0
  164. package/dist/link-box/index.mjs +58 -0
  165. package/dist/link-box/index.mjs.map +1 -0
  166. package/dist/pagination/index.d.mts +143 -0
  167. package/dist/pagination/index.d.ts +143 -0
  168. package/dist/pagination/index.js +1303 -0
  169. package/dist/pagination/index.js.map +1 -0
  170. package/dist/pagination/index.mjs +326 -0
  171. package/dist/pagination/index.mjs.map +1 -0
  172. package/dist/popover/index.d.mts +93 -0
  173. package/dist/popover/index.d.ts +93 -0
  174. package/dist/popover/index.js +1280 -0
  175. package/dist/popover/index.js.map +1 -0
  176. package/dist/popover/index.mjs +13 -0
  177. package/dist/popover/index.mjs.map +1 -0
  178. package/dist/portal/index.d.mts +13 -0
  179. package/dist/portal/index.d.ts +13 -0
  180. package/dist/portal/index.js +37 -0
  181. package/dist/portal/index.js.map +1 -0
  182. package/dist/portal/index.mjs +10 -0
  183. package/dist/portal/index.mjs.map +1 -0
  184. package/dist/progress/index.d.mts +48 -0
  185. package/dist/progress/index.d.ts +48 -0
  186. package/dist/progress/index.js +201 -0
  187. package/dist/progress/index.js.map +1 -0
  188. package/dist/progress/index.mjs +174 -0
  189. package/dist/progress/index.mjs.map +1 -0
  190. package/dist/progress-tracker/index.d.mts +81 -0
  191. package/dist/progress-tracker/index.d.ts +81 -0
  192. package/dist/progress-tracker/index.js +834 -0
  193. package/dist/progress-tracker/index.js.map +1 -0
  194. package/dist/progress-tracker/index.mjs +716 -0
  195. package/dist/progress-tracker/index.mjs.map +1 -0
  196. package/dist/radio-group/index.d.mts +100 -0
  197. package/dist/radio-group/index.d.ts +100 -0
  198. package/dist/radio-group/index.js +824 -0
  199. package/dist/radio-group/index.js.map +1 -0
  200. package/dist/radio-group/index.mjs +297 -0
  201. package/dist/radio-group/index.mjs.map +1 -0
  202. package/dist/rating/index.d.mts +78 -0
  203. package/dist/rating/index.d.ts +78 -0
  204. package/dist/rating/index.js +362 -0
  205. package/dist/rating/index.js.map +1 -0
  206. package/dist/rating/index.mjs +247 -0
  207. package/dist/rating/index.mjs.map +1 -0
  208. package/dist/scrolling-list/index.d.mts +105 -0
  209. package/dist/scrolling-list/index.d.ts +105 -0
  210. package/dist/scrolling-list/index.js +1367 -0
  211. package/dist/scrolling-list/index.js.map +1 -0
  212. package/dist/scrolling-list/index.mjs +407 -0
  213. package/dist/scrolling-list/index.mjs.map +1 -0
  214. package/dist/select/index.d.mts +167 -0
  215. package/dist/select/index.d.ts +167 -0
  216. package/dist/select/index.js +991 -0
  217. package/dist/select/index.js.map +1 -0
  218. package/dist/select/index.mjs +470 -0
  219. package/dist/select/index.mjs.map +1 -0
  220. package/dist/skeleton/index.d.mts +67 -0
  221. package/dist/skeleton/index.d.ts +67 -0
  222. package/dist/skeleton/index.js +206 -0
  223. package/dist/skeleton/index.js.map +1 -0
  224. package/dist/skeleton/index.mjs +147 -0
  225. package/dist/skeleton/index.mjs.map +1 -0
  226. package/dist/slider/index.d.mts +97 -0
  227. package/dist/slider/index.d.ts +97 -0
  228. package/dist/slider/index.js +209 -0
  229. package/dist/slider/index.js.map +1 -0
  230. package/dist/slider/index.mjs +182 -0
  231. package/dist/slider/index.mjs.map +1 -0
  232. package/dist/slot/index.d.mts +17 -0
  233. package/dist/slot/index.d.ts +17 -0
  234. package/dist/slot/index.js +51 -0
  235. package/dist/slot/index.js.map +1 -0
  236. package/dist/slot/index.mjs +11 -0
  237. package/dist/slot/index.mjs.map +1 -0
  238. package/dist/snackbar/index.d.mts +158 -0
  239. package/dist/snackbar/index.d.ts +158 -0
  240. package/dist/snackbar/index.js +1693 -0
  241. package/dist/snackbar/index.js.map +1 -0
  242. package/dist/snackbar/index.mjs +733 -0
  243. package/dist/snackbar/index.mjs.map +1 -0
  244. package/dist/spinner/index.d.mts +21 -0
  245. package/dist/spinner/index.d.ts +21 -0
  246. package/dist/spinner/index.js +139 -0
  247. package/dist/spinner/index.js.map +1 -0
  248. package/dist/spinner/index.mjs +9 -0
  249. package/dist/spinner/index.mjs.map +1 -0
  250. package/dist/stepper/index.d.mts +82 -0
  251. package/dist/stepper/index.d.ts +82 -0
  252. package/dist/stepper/index.js +2178 -0
  253. package/dist/stepper/index.js.map +1 -0
  254. package/dist/stepper/index.mjs +229 -0
  255. package/dist/stepper/index.mjs.map +1 -0
  256. package/dist/switch/index.d.mts +64 -0
  257. package/dist/switch/index.d.ts +64 -0
  258. package/dist/switch/index.js +768 -0
  259. package/dist/switch/index.js.map +1 -0
  260. package/dist/switch/index.mjs +245 -0
  261. package/dist/switch/index.mjs.map +1 -0
  262. package/dist/tabs/index.d.mts +103 -0
  263. package/dist/tabs/index.d.ts +103 -0
  264. package/dist/tabs/index.js +1315 -0
  265. package/dist/tabs/index.js.map +1 -0
  266. package/dist/tabs/index.mjs +391 -0
  267. package/dist/tabs/index.mjs.map +1 -0
  268. package/dist/tag/index.d.mts +27 -0
  269. package/dist/tag/index.d.ts +27 -0
  270. package/dist/tag/index.js +269 -0
  271. package/dist/tag/index.js.map +1 -0
  272. package/dist/tag/index.mjs +237 -0
  273. package/dist/tag/index.mjs.map +1 -0
  274. package/dist/text-link/index.d.mts +20 -0
  275. package/dist/text-link/index.d.ts +20 -0
  276. package/dist/text-link/index.js +99 -0
  277. package/dist/text-link/index.js.map +1 -0
  278. package/dist/text-link/index.mjs +8 -0
  279. package/dist/text-link/index.mjs.map +1 -0
  280. package/dist/textarea/index.d.mts +47 -0
  281. package/dist/textarea/index.d.ts +47 -0
  282. package/dist/textarea/index.js +1180 -0
  283. package/dist/textarea/index.js.map +1 -0
  284. package/dist/textarea/index.mjs +77 -0
  285. package/dist/textarea/index.mjs.map +1 -0
  286. package/dist/visually-hidden/index.d.mts +16 -0
  287. package/dist/visually-hidden/index.d.ts +16 -0
  288. package/dist/visually-hidden/index.js +67 -0
  289. package/dist/visually-hidden/index.js.map +1 -0
  290. package/dist/visually-hidden/index.mjs +8 -0
  291. package/dist/visually-hidden/index.mjs.map +1 -0
  292. package/global.d.ts +12 -0
  293. package/package.json +75 -0
  294. package/tsconfig.build.json +9 -0
  295. package/tsconfig.json +9 -0
  296. package/tsup.config.ts +11 -0
@@ -0,0 +1,2920 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/combobox/index.ts
21
+ var combobox_exports = {};
22
+ __export(combobox_exports, {
23
+ Combobox: () => Combobox2,
24
+ ComboboxProvider: () => ComboboxProvider,
25
+ useComboboxContext: () => useComboboxContext
26
+ });
27
+ module.exports = __toCommonJS(combobox_exports);
28
+
29
+ // src/combobox/ComboboxContext.tsx
30
+ var import_use_combined_state = require("@spark-ui/use-combined-state");
31
+ var import_downshift3 = require("downshift");
32
+ var import_react12 = require("react");
33
+
34
+ // src/form-field/FormField.tsx
35
+ var import_class_variance_authority = require("class-variance-authority");
36
+ var import_react4 = require("react");
37
+
38
+ // src/slot/Slot.tsx
39
+ var import_radix_ui = require("radix-ui");
40
+ var import_react = require("react");
41
+ var import_jsx_runtime = require("react/jsx-runtime");
42
+ var Slottable = import_radix_ui.Slot.Slottable;
43
+ var Slot = ({ ref, ...props }) => {
44
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Slot.Root, { ref, ...props });
45
+ };
46
+ var wrapPolymorphicSlot = (asChild, children, callback) => {
47
+ if (!asChild) return callback(children);
48
+ return (0, import_react.isValidElement)(children) ? (0, import_react.cloneElement)(
49
+ children,
50
+ void 0,
51
+ callback(children.props.children)
52
+ ) : null;
53
+ };
54
+
55
+ // src/form-field/FormFieldContext.tsx
56
+ var import_react2 = require("react");
57
+ var FormFieldContext = (0, import_react2.createContext)(null);
58
+ var ID_PREFIX = ":form-field";
59
+ var useFormField = () => {
60
+ const context = (0, import_react2.useContext)(FormFieldContext);
61
+ if (!context) {
62
+ throw Error("useFormField must be used within a FormField provider");
63
+ }
64
+ return context;
65
+ };
66
+
67
+ // src/form-field/FormFieldProvider.tsx
68
+ var import_react3 = require("react");
69
+ var import_jsx_runtime2 = require("react/jsx-runtime");
70
+ var FormFieldProvider = ({
71
+ id,
72
+ name,
73
+ disabled = false,
74
+ readOnly = false,
75
+ state,
76
+ isRequired,
77
+ children
78
+ }) => {
79
+ const labelId = `${ID_PREFIX}-label-${(0, import_react3.useId)()}`;
80
+ const [messageIds, setMessageIds] = (0, import_react3.useState)([]);
81
+ const description = messageIds.length > 0 ? messageIds.join(" ") : void 0;
82
+ const handleMessageIdAdd = (0, import_react3.useCallback)((msgId) => {
83
+ setMessageIds((ids) => [...ids, msgId]);
84
+ }, []);
85
+ const handleMessageIdRemove = (0, import_react3.useCallback)((msgId) => {
86
+ setMessageIds((ids) => ids.filter((current) => current !== msgId));
87
+ }, []);
88
+ const value = (0, import_react3.useMemo)(() => {
89
+ const isInvalid = state === "error";
90
+ return {
91
+ id,
92
+ labelId,
93
+ name,
94
+ disabled,
95
+ readOnly,
96
+ state,
97
+ isRequired,
98
+ isInvalid,
99
+ description,
100
+ onMessageIdAdd: handleMessageIdAdd,
101
+ onMessageIdRemove: handleMessageIdRemove
102
+ };
103
+ }, [
104
+ id,
105
+ labelId,
106
+ name,
107
+ disabled,
108
+ readOnly,
109
+ description,
110
+ state,
111
+ isRequired,
112
+ handleMessageIdAdd,
113
+ handleMessageIdRemove
114
+ ]);
115
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(FormFieldContext.Provider, { value, children });
116
+ };
117
+ FormFieldProvider.displayName = "FormFieldProvider";
118
+
119
+ // src/form-field/FormField.tsx
120
+ var import_jsx_runtime3 = require("react/jsx-runtime");
121
+ var FormField = ({
122
+ className,
123
+ disabled = false,
124
+ readOnly = false,
125
+ name,
126
+ state,
127
+ isRequired = false,
128
+ asChild = false,
129
+ ref,
130
+ ...others
131
+ }) => {
132
+ const id = `${ID_PREFIX}-${(0, import_react4.useId)()}`;
133
+ const Component = asChild ? Slot : "div";
134
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
135
+ FormFieldProvider,
136
+ {
137
+ id,
138
+ name,
139
+ isRequired,
140
+ disabled,
141
+ readOnly,
142
+ state,
143
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
144
+ Component,
145
+ {
146
+ ref,
147
+ "data-spark-component": "form-field",
148
+ className: (0, import_class_variance_authority.cx)(className, "gap-sm flex flex-col"),
149
+ ...others
150
+ }
151
+ )
152
+ }
153
+ );
154
+ };
155
+ FormField.displayName = "FormField";
156
+
157
+ // src/form-field/FormFieldStateMessage.tsx
158
+ var import_AlertOutline = require("@spark-ui/icons/AlertOutline");
159
+ var import_Check = require("@spark-ui/icons/Check");
160
+ var import_WarningOutline = require("@spark-ui/icons/WarningOutline");
161
+ var import_class_variance_authority4 = require("class-variance-authority");
162
+
163
+ // src/icon/Icon.tsx
164
+ var import_react5 = require("react");
165
+
166
+ // src/visually-hidden/VisuallyHidden.tsx
167
+ var import_jsx_runtime4 = require("react/jsx-runtime");
168
+ var VisuallyHidden = ({ asChild = false, ref, ...props }) => {
169
+ const Component = asChild ? Slot : "span";
170
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
171
+ Component,
172
+ {
173
+ ...props,
174
+ ref,
175
+ style: {
176
+ // See: https://github.com/twbs/bootstrap/blob/main/scss/mixins/_visually-hidden.scss
177
+ position: "absolute",
178
+ border: 0,
179
+ width: 1,
180
+ height: 1,
181
+ padding: 0,
182
+ margin: -1,
183
+ overflow: "hidden",
184
+ clip: "rect(0, 0, 0, 0)",
185
+ whiteSpace: "nowrap",
186
+ wordWrap: "normal",
187
+ ...props.style
188
+ }
189
+ }
190
+ );
191
+ };
192
+ VisuallyHidden.displayName = "VisuallyHidden";
193
+
194
+ // src/icon/Icon.styles.tsx
195
+ var import_internal_utils = require("@spark-ui/internal-utils");
196
+ var import_class_variance_authority2 = require("class-variance-authority");
197
+ var iconStyles = (0, import_class_variance_authority2.cva)(["fill-current shrink-0"], {
198
+ variants: {
199
+ /**
200
+ * Color scheme of the icon.
201
+ */
202
+ intent: (0, import_internal_utils.makeVariants)({
203
+ current: ["text-current"],
204
+ main: ["text-main"],
205
+ support: ["text-support"],
206
+ accent: ["text-accent"],
207
+ basic: ["text-basic"],
208
+ success: ["text-success"],
209
+ alert: ["text-alert"],
210
+ error: ["text-error"],
211
+ info: ["text-info"],
212
+ neutral: ["text-neutral"]
213
+ }),
214
+ /**
215
+ * Sets the size of the icon.
216
+ */
217
+ size: (0, import_internal_utils.makeVariants)({
218
+ current: ["u-current-font-size"],
219
+ sm: ["w-sz-16", "h-sz-16"],
220
+ md: ["w-sz-24", "h-sz-24"],
221
+ lg: ["w-sz-32", "h-sz-32"],
222
+ xl: ["w-sz-40", "h-sz-40"]
223
+ })
224
+ }
225
+ });
226
+
227
+ // src/icon/Icon.tsx
228
+ var import_jsx_runtime5 = require("react/jsx-runtime");
229
+ var Icon = ({
230
+ label,
231
+ className,
232
+ size = "current",
233
+ intent = "current",
234
+ children,
235
+ ...others
236
+ }) => {
237
+ const child = import_react5.Children.only(children);
238
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
239
+ (0, import_react5.cloneElement)(child, {
240
+ className: iconStyles({ className, size, intent }),
241
+ "data-spark-component": "icon",
242
+ "aria-hidden": "true",
243
+ focusable: "false",
244
+ ...others
245
+ }),
246
+ label && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(VisuallyHidden, { children: label })
247
+ ] });
248
+ };
249
+ Icon.displayName = "Icon";
250
+
251
+ // src/form-field/FormFieldMessage.tsx
252
+ var import_class_variance_authority3 = require("class-variance-authority");
253
+ var import_react6 = require("react");
254
+ var import_jsx_runtime6 = require("react/jsx-runtime");
255
+ var FormFieldMessage = ({
256
+ id: idProp,
257
+ className,
258
+ ref,
259
+ ...others
260
+ }) => {
261
+ const { onMessageIdAdd, onMessageIdRemove } = useFormField();
262
+ const currentId = `${ID_PREFIX}-message-${(0, import_react6.useId)()}`;
263
+ const id = idProp || currentId;
264
+ (0, import_react6.useEffect)(() => {
265
+ onMessageIdAdd(id);
266
+ return () => {
267
+ onMessageIdRemove(id);
268
+ };
269
+ }, [id, onMessageIdAdd, onMessageIdRemove]);
270
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
271
+ "span",
272
+ {
273
+ ref,
274
+ id,
275
+ "data-spark-component": "form-field-message",
276
+ className: (0, import_class_variance_authority3.cx)(className, "text-caption"),
277
+ ...others
278
+ }
279
+ );
280
+ };
281
+ FormFieldMessage.displayName = "FormField.Message";
282
+
283
+ // src/form-field/FormFieldStateMessage.tsx
284
+ var import_jsx_runtime7 = require("react/jsx-runtime");
285
+ var FormFieldStateMessage = ({
286
+ className,
287
+ state,
288
+ children,
289
+ ref,
290
+ ...others
291
+ }) => {
292
+ const field = useFormField();
293
+ if (field.state !== state) {
294
+ return null;
295
+ }
296
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
297
+ FormFieldMessage,
298
+ {
299
+ ref,
300
+ "data-spark-component": "form-field-state-message",
301
+ "aria-live": "polite",
302
+ className: (0, import_class_variance_authority4.cx)(
303
+ "gap-sm flex items-center",
304
+ state === "error" ? "text-error" : "text-on-surface/dim-1",
305
+ className
306
+ ),
307
+ ...others,
308
+ children: [
309
+ state === "alert" && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_WarningOutline.WarningOutline, {}) }),
310
+ state === "error" && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Icon, { size: "sm", intent: "error", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_AlertOutline.AlertOutline, {}) }),
311
+ state === "success" && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_Check.Check, {}) }),
312
+ children
313
+ ]
314
+ }
315
+ );
316
+ };
317
+ FormFieldStateMessage.displayName = "FormField.StateMessage";
318
+
319
+ // src/form-field/FormFieldAlertMessage.tsx
320
+ var import_jsx_runtime8 = require("react/jsx-runtime");
321
+ var FormFieldAlertMessage = ({ ref, ...props }) => {
322
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
323
+ FormFieldStateMessage,
324
+ {
325
+ ref,
326
+ "data-spark-component": "form-field-alert-message",
327
+ state: "alert",
328
+ ...props
329
+ }
330
+ );
331
+ };
332
+ FormFieldAlertMessage.displayName = "FormField.AlertMessage";
333
+
334
+ // src/form-field/FormFieldCharactersCount.tsx
335
+ var import_class_variance_authority5 = require("class-variance-authority");
336
+ var import_jsx_runtime9 = require("react/jsx-runtime");
337
+ var FormFieldCharactersCount = ({
338
+ className,
339
+ value = "",
340
+ maxLength,
341
+ ref,
342
+ ...others
343
+ }) => {
344
+ const displayValue = `${value.length}/${maxLength}`;
345
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
346
+ "span",
347
+ {
348
+ ref,
349
+ "data-spark-component": "form-field-characters-count",
350
+ className: (0, import_class_variance_authority5.cx)(className, "text-caption", "text-neutral"),
351
+ ...others,
352
+ children: displayValue
353
+ }
354
+ );
355
+ };
356
+ FormFieldCharactersCount.displayName = "FormField.CharactersCount";
357
+
358
+ // src/form-field/FormFieldControl.tsx
359
+ var import_react7 = require("react");
360
+ var import_jsx_runtime10 = require("react/jsx-runtime");
361
+ var useFormFieldControl = () => {
362
+ const { id, name, description, disabled, readOnly, state, labelId, isInvalid, isRequired } = (0, import_react7.useContext)(FormFieldContext) || {};
363
+ return {
364
+ id,
365
+ name,
366
+ description,
367
+ disabled,
368
+ readOnly,
369
+ state,
370
+ labelId,
371
+ isInvalid,
372
+ isRequired
373
+ };
374
+ };
375
+ var FormFieldControl = ({ children }) => {
376
+ const props = useFormFieldControl();
377
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, { children: children(props) });
378
+ };
379
+ FormFieldControl.displayName = "FormField.Control";
380
+
381
+ // src/form-field/FormFieldErrorMessage.tsx
382
+ var import_jsx_runtime11 = require("react/jsx-runtime");
383
+ var FormFieldErrorMessage = ({ ref, ...props }) => {
384
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
385
+ FormFieldStateMessage,
386
+ {
387
+ ref,
388
+ "data-spark-component": "form-field-error-message",
389
+ state: "error",
390
+ ...props
391
+ }
392
+ );
393
+ };
394
+ FormFieldErrorMessage.displayName = "FormField.ErrorMessage";
395
+
396
+ // src/form-field/FormFieldHelperMessage.tsx
397
+ var import_class_variance_authority6 = require("class-variance-authority");
398
+ var import_jsx_runtime12 = require("react/jsx-runtime");
399
+ var FormFieldHelperMessage = ({
400
+ className,
401
+ ref,
402
+ ...others
403
+ }) => {
404
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
405
+ FormFieldMessage,
406
+ {
407
+ ref,
408
+ "data-spark-component": "form-field-helper-message",
409
+ className: (0, import_class_variance_authority6.cx)("text-on-surface/dim-1", className),
410
+ ...others
411
+ }
412
+ );
413
+ };
414
+ FormFieldHelperMessage.displayName = "FormField.HelperMessage";
415
+
416
+ // src/form-field/FormFieldLabel.tsx
417
+ var import_class_variance_authority10 = require("class-variance-authority");
418
+
419
+ // src/label/Label.tsx
420
+ var import_class_variance_authority7 = require("class-variance-authority");
421
+ var import_radix_ui2 = require("radix-ui");
422
+ var import_jsx_runtime13 = require("react/jsx-runtime");
423
+ var Label = ({ className, ref, ...others }) => {
424
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
425
+ import_radix_ui2.Label.Label,
426
+ {
427
+ ref,
428
+ "data-spark-component": "label",
429
+ className: (0, import_class_variance_authority7.cx)("text-body-1", className),
430
+ ...others
431
+ }
432
+ );
433
+ };
434
+ Label.displayName = "Label";
435
+
436
+ // src/label/LabelRequiredIndicator.tsx
437
+ var import_class_variance_authority8 = require("class-variance-authority");
438
+ var import_jsx_runtime14 = require("react/jsx-runtime");
439
+ var LabelRequiredIndicator = ({
440
+ className,
441
+ children = "*",
442
+ ref,
443
+ ...others
444
+ }) => {
445
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
446
+ "span",
447
+ {
448
+ ref,
449
+ "data-spark-component": "label-required-indicator",
450
+ role: "presentation",
451
+ "aria-hidden": "true",
452
+ className: (0, import_class_variance_authority8.cx)(className, "text-caption text-on-surface/dim-1"),
453
+ ...others,
454
+ children
455
+ }
456
+ );
457
+ };
458
+ LabelRequiredIndicator.displayName = "Label.RequiredIndicator";
459
+
460
+ // src/label/index.ts
461
+ var Label2 = Object.assign(Label, {
462
+ RequiredIndicator: LabelRequiredIndicator
463
+ });
464
+ Label2.displayName = "Label";
465
+ LabelRequiredIndicator.displayName = "Label.RequiredIndicator";
466
+
467
+ // src/form-field/FormFieldRequiredIndicator.tsx
468
+ var import_class_variance_authority9 = require("class-variance-authority");
469
+ var import_jsx_runtime15 = require("react/jsx-runtime");
470
+ var FormFieldRequiredIndicator = ({
471
+ className,
472
+ ref,
473
+ ...props
474
+ }) => {
475
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Label2.RequiredIndicator, { ref, className: (0, import_class_variance_authority9.cx)("ml-sm", className), ...props });
476
+ };
477
+ FormFieldRequiredIndicator.displayName = "FormField.RequiredIndicator";
478
+
479
+ // src/form-field/FormFieldLabel.tsx
480
+ var import_jsx_runtime16 = require("react/jsx-runtime");
481
+ var FormFieldLabel = ({
482
+ htmlFor: htmlForProp,
483
+ className,
484
+ children,
485
+ requiredIndicator = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(FormFieldRequiredIndicator, {}),
486
+ asChild,
487
+ ref,
488
+ ...others
489
+ }) => {
490
+ const control = useFormField();
491
+ const { disabled, labelId, isRequired } = control;
492
+ const htmlFor = asChild ? void 0 : htmlForProp || control.id;
493
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
494
+ Label2,
495
+ {
496
+ ref,
497
+ id: labelId,
498
+ "data-spark-component": "form-field-label",
499
+ htmlFor,
500
+ className: (0, import_class_variance_authority10.cx)(className, disabled ? "text-on-surface/dim-3 pointer-events-none" : void 0),
501
+ asChild,
502
+ ...others,
503
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
504
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Slottable, { children }),
505
+ isRequired && requiredIndicator
506
+ ] })
507
+ }
508
+ );
509
+ };
510
+ FormFieldLabel.displayName = "FormField.Label";
511
+
512
+ // src/form-field/FormFieldSuccessMessage.tsx
513
+ var import_jsx_runtime17 = require("react/jsx-runtime");
514
+ var FormFieldSuccessMessage = ({ ref, ...props }) => {
515
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
516
+ FormFieldStateMessage,
517
+ {
518
+ ref,
519
+ "data-spark-component": "form-field-success-message",
520
+ state: "success",
521
+ ...props
522
+ }
523
+ );
524
+ };
525
+ FormFieldSuccessMessage.displayName = "FormField.SuccessMessage";
526
+
527
+ // src/form-field/index.ts
528
+ var FormField2 = Object.assign(FormField, {
529
+ Label: FormFieldLabel,
530
+ Control: FormFieldControl,
531
+ StateMessage: FormFieldStateMessage,
532
+ SuccessMessage: FormFieldSuccessMessage,
533
+ AlertMessage: FormFieldAlertMessage,
534
+ ErrorMessage: FormFieldErrorMessage,
535
+ HelperMessage: FormFieldHelperMessage,
536
+ RequiredIndicator: FormFieldRequiredIndicator,
537
+ CharactersCount: FormFieldCharactersCount
538
+ });
539
+ FormField2.displayName = "FormField";
540
+ FormFieldLabel.displayName = "FormField.Label";
541
+ FormFieldControl.displayName = "FormField.Control";
542
+ FormFieldStateMessage.displayName = "FormField.StateMessage";
543
+ FormFieldSuccessMessage.displayName = "FormField.SuccessMessage";
544
+ FormFieldAlertMessage.displayName = "FormField.AlertMessage";
545
+ FormFieldErrorMessage.displayName = "FormField.ErrorMessage";
546
+ FormFieldHelperMessage.displayName = "FormField.HelperMessage";
547
+ FormFieldRequiredIndicator.displayName = "FormField.RequiredIndicator";
548
+ FormFieldCharactersCount.displayName = "FormField.CharactersCount";
549
+
550
+ // src/popover/Popover.tsx
551
+ var import_radix_ui3 = require("radix-ui");
552
+
553
+ // src/popover/PopoverContext.tsx
554
+ var import_react8 = require("react");
555
+ var import_jsx_runtime18 = require("react/jsx-runtime");
556
+ var PopoverContext = (0, import_react8.createContext)(null);
557
+ var ID_PREFIX2 = ":popover";
558
+ var PopoverProvider = ({
559
+ children,
560
+ intent
561
+ }) => {
562
+ const [headerId, setHeaderId] = (0, import_react8.useState)(null);
563
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
564
+ PopoverContext.Provider,
565
+ {
566
+ value: {
567
+ headerId,
568
+ setHeaderId,
569
+ intent
570
+ },
571
+ children
572
+ }
573
+ );
574
+ };
575
+ var usePopover = () => {
576
+ const context = (0, import_react8.useContext)(PopoverContext);
577
+ if (!context) {
578
+ throw Error("usePopover must be used within a Popover provider");
579
+ }
580
+ return context;
581
+ };
582
+
583
+ // src/popover/Popover.tsx
584
+ var import_jsx_runtime19 = require("react/jsx-runtime");
585
+ var Popover = ({ children, intent = "surface", modal = false, ...rest }) => {
586
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(PopoverProvider, { intent, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_radix_ui3.Popover.Root, { "data-spark-component": "popover", modal, ...rest, children }) });
587
+ };
588
+ Popover.displayName = "Popover";
589
+
590
+ // src/popover/PopoverAnchor.tsx
591
+ var import_radix_ui4 = require("radix-ui");
592
+ var import_jsx_runtime20 = require("react/jsx-runtime");
593
+ var Anchor = ({ asChild = false, children, ref, ...rest }) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_radix_ui4.Popover.Anchor, { "data-spark-component": "popover-anchor", ref, asChild, ...rest, children });
594
+ Anchor.displayName = "Popover.Anchor";
595
+
596
+ // src/popover/PopoverArrow.tsx
597
+ var import_class_variance_authority11 = require("class-variance-authority");
598
+ var import_radix_ui5 = require("radix-ui");
599
+ var import_jsx_runtime21 = require("react/jsx-runtime");
600
+ var Arrow = ({
601
+ asChild = false,
602
+ width = 16,
603
+ height = 8,
604
+ className,
605
+ ref,
606
+ ...rest
607
+ }) => {
608
+ const { intent } = usePopover();
609
+ const styles4 = (0, import_class_variance_authority11.cva)("visible", {
610
+ variants: {
611
+ intent: {
612
+ surface: "fill-surface",
613
+ main: "fill-main-container",
614
+ support: "fill-support-container",
615
+ accent: "fill-accent-container",
616
+ basic: "fill-basic-container",
617
+ success: "fill-success-container",
618
+ alert: "fill-alert-container",
619
+ danger: "fill-error-container",
620
+ info: "fill-info-container",
621
+ neutral: "fill-neutral-container"
622
+ }
623
+ },
624
+ defaultVariants: {
625
+ intent: "surface"
626
+ }
627
+ });
628
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
629
+ import_radix_ui5.Popover.Arrow,
630
+ {
631
+ "data-spark-component": "popover-arrow",
632
+ ref,
633
+ className: styles4({ intent, className }),
634
+ asChild,
635
+ width,
636
+ height,
637
+ ...rest
638
+ }
639
+ );
640
+ };
641
+ Arrow.displayName = "Popover.Arrow";
642
+
643
+ // src/popover/PopoverCloseButton.tsx
644
+ var import_Close = require("@spark-ui/icons/Close");
645
+ var import_class_variance_authority16 = require("class-variance-authority");
646
+ var import_radix_ui6 = require("radix-ui");
647
+
648
+ // src/button/Button.tsx
649
+ var import_class_variance_authority14 = require("class-variance-authority");
650
+ var import_react9 = require("react");
651
+
652
+ // src/spinner/Spinner.styles.tsx
653
+ var import_internal_utils2 = require("@spark-ui/internal-utils");
654
+ var import_class_variance_authority12 = require("class-variance-authority");
655
+ var defaultVariants = {
656
+ intent: "current",
657
+ size: "current",
658
+ isBackgroundVisible: false
659
+ };
660
+ var spinnerStyles = (0, import_class_variance_authority12.cva)(
661
+ ["inline-block", "border-solid", "rounded-full", "border-md", "animate-spin"],
662
+ {
663
+ variants: {
664
+ /**
665
+ * Use `size` prop to set the size of the spinner. If you want to set the full size for the spinner, don't forget to add a wrapping container with its own size.
666
+ */
667
+ size: {
668
+ current: ["u-current-font-size"],
669
+ sm: ["w-sz-20", "h-sz-20"],
670
+ md: ["w-sz-28", "h-sz-28"],
671
+ full: ["w-full", "h-full"]
672
+ },
673
+ /**
674
+ * Color scheme of the spinner.
675
+ */
676
+ intent: (0, import_internal_utils2.makeVariants)({
677
+ current: ["border-current"],
678
+ main: ["border-main"],
679
+ support: ["border-support"],
680
+ accent: ["border-accent"],
681
+ basic: ["border-basic"],
682
+ success: ["border-success"],
683
+ alert: ["border-alert"],
684
+ error: ["border-error"],
685
+ info: ["border-info"],
686
+ neutral: ["border-neutral"]
687
+ }),
688
+ /**
689
+ * Size of the button.
690
+ */
691
+ isBackgroundVisible: {
692
+ true: ["border-b-neutral-container", "border-l-neutral-container"],
693
+ false: ["border-b-transparent", "border-l-transparent"]
694
+ }
695
+ },
696
+ defaultVariants
697
+ }
698
+ );
699
+
700
+ // src/spinner/Spinner.tsx
701
+ var import_jsx_runtime22 = require("react/jsx-runtime");
702
+ var Spinner = ({
703
+ className,
704
+ size = "current",
705
+ intent = "current",
706
+ label,
707
+ isBackgroundVisible,
708
+ ref,
709
+ ...others
710
+ }) => {
711
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
712
+ "span",
713
+ {
714
+ role: "status",
715
+ "data-spark-component": "spinner",
716
+ ref,
717
+ className: spinnerStyles({ className, size, intent, isBackgroundVisible }),
718
+ ...others,
719
+ children: label && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(VisuallyHidden, { children: label })
720
+ }
721
+ );
722
+ };
723
+
724
+ // src/button/Button.styles.tsx
725
+ var import_internal_utils8 = require("@spark-ui/internal-utils");
726
+ var import_class_variance_authority13 = require("class-variance-authority");
727
+
728
+ // src/button/variants/filled.ts
729
+ var import_internal_utils3 = require("@spark-ui/internal-utils");
730
+ var filledVariants = [
731
+ // Main
732
+ {
733
+ intent: "main",
734
+ design: "filled",
735
+ class: (0, import_internal_utils3.tw)([
736
+ "bg-main",
737
+ "text-on-main",
738
+ "hover:bg-main-hovered",
739
+ "enabled:active:bg-main-hovered",
740
+ "focus-visible:bg-main-hovered"
741
+ ])
742
+ },
743
+ // Support
744
+ {
745
+ intent: "support",
746
+ design: "filled",
747
+ class: (0, import_internal_utils3.tw)([
748
+ "bg-support",
749
+ "text-on-support",
750
+ "hover:bg-support-hovered",
751
+ "enabled:active:bg-support-hovered",
752
+ "focus-visible:bg-support-hovered"
753
+ ])
754
+ },
755
+ // Accent
756
+ {
757
+ intent: "accent",
758
+ design: "filled",
759
+ class: (0, import_internal_utils3.tw)([
760
+ "bg-accent",
761
+ "text-on-accent",
762
+ "hover:bg-accent-hovered",
763
+ "enabled:active:bg-accent-hovered",
764
+ "focus-visible:bg-accent-hovered"
765
+ ])
766
+ },
767
+ // Basic
768
+ {
769
+ intent: "basic",
770
+ design: "filled",
771
+ class: (0, import_internal_utils3.tw)([
772
+ "bg-basic",
773
+ "text-on-basic",
774
+ "hover:bg-basic-hovered",
775
+ "enabled:active:bg-basic-hovered",
776
+ "focus-visible:bg-basic-hovered"
777
+ ])
778
+ },
779
+ // Success
780
+ {
781
+ intent: "success",
782
+ design: "filled",
783
+ class: (0, import_internal_utils3.tw)([
784
+ "bg-success",
785
+ "text-on-success",
786
+ "hover:bg-success-hovered",
787
+ "enabled:active:bg-success-hovered",
788
+ "focus-visible:bg-success-hovered"
789
+ ])
790
+ },
791
+ // Alert
792
+ {
793
+ intent: "alert",
794
+ design: "filled",
795
+ class: (0, import_internal_utils3.tw)([
796
+ "bg-alert",
797
+ "text-on-alert",
798
+ "hover:bg-alert-hovered",
799
+ "enabled:active:bg-alert-hovered",
800
+ "focus-visible:bg-alert-hovered"
801
+ ])
802
+ },
803
+ // Danger
804
+ {
805
+ intent: "danger",
806
+ design: "filled",
807
+ class: (0, import_internal_utils3.tw)([
808
+ "text-on-error bg-error",
809
+ "hover:bg-error-hovered enabled:active:bg-error-hovered",
810
+ "focus-visible:bg-error-hovered"
811
+ ])
812
+ },
813
+ // Info
814
+ {
815
+ intent: "info",
816
+ design: "filled",
817
+ class: (0, import_internal_utils3.tw)([
818
+ "text-on-error bg-info",
819
+ "hover:bg-info-hovered enabled:active:bg-info-hovered",
820
+ "focus-visible:bg-info-hovered"
821
+ ])
822
+ },
823
+ // Neutral
824
+ {
825
+ intent: "neutral",
826
+ design: "filled",
827
+ class: (0, import_internal_utils3.tw)([
828
+ "bg-neutral",
829
+ "text-on-neutral",
830
+ "hover:bg-neutral-hovered",
831
+ "enabled:active:bg-neutral-hovered",
832
+ "focus-visible:bg-neutral-hovered"
833
+ ])
834
+ },
835
+ // Surface
836
+ {
837
+ intent: "surface",
838
+ design: "filled",
839
+ class: (0, import_internal_utils3.tw)([
840
+ "bg-surface",
841
+ "text-on-surface",
842
+ "hover:bg-surface-hovered",
843
+ "enabled:active:bg-surface-hovered",
844
+ "focus-visible:bg-surface-hovered"
845
+ ])
846
+ }
847
+ ];
848
+
849
+ // src/button/variants/ghost.ts
850
+ var import_internal_utils4 = require("@spark-ui/internal-utils");
851
+ var ghostVariants = [
852
+ {
853
+ intent: "main",
854
+ design: "ghost",
855
+ class: (0, import_internal_utils4.tw)([
856
+ "text-main",
857
+ "hover:bg-main/dim-5",
858
+ "enabled:active:bg-main/dim-5",
859
+ "focus-visible:bg-main/dim-5"
860
+ ])
861
+ },
862
+ {
863
+ intent: "support",
864
+ design: "ghost",
865
+ class: (0, import_internal_utils4.tw)([
866
+ "text-support",
867
+ "hover:bg-support/dim-5",
868
+ "enabled:active:bg-support/dim-5",
869
+ "focus-visible:bg-support/dim-5"
870
+ ])
871
+ },
872
+ {
873
+ intent: "accent",
874
+ design: "ghost",
875
+ class: (0, import_internal_utils4.tw)([
876
+ "text-accent",
877
+ "hover:bg-accent/dim-5",
878
+ "enabled:active:bg-accent/dim-5",
879
+ "focus-visible:bg-accent/dim-5"
880
+ ])
881
+ },
882
+ {
883
+ intent: "basic",
884
+ design: "ghost",
885
+ class: (0, import_internal_utils4.tw)([
886
+ "text-basic",
887
+ "hover:bg-basic/dim-5",
888
+ "enabled:active:bg-basic/dim-5",
889
+ "focus-visible:bg-basic/dim-5"
890
+ ])
891
+ },
892
+ {
893
+ intent: "success",
894
+ design: "ghost",
895
+ class: (0, import_internal_utils4.tw)([
896
+ "text-success",
897
+ "hover:bg-success/dim-5",
898
+ "enabled:active:bg-success/dim-5",
899
+ "focus-visible:bg-success/dim-5"
900
+ ])
901
+ },
902
+ {
903
+ intent: "alert",
904
+ design: "ghost",
905
+ class: (0, import_internal_utils4.tw)([
906
+ "text-alert",
907
+ "hover:bg-alert/dim-5",
908
+ "enabled:active:bg-alert/dim-5",
909
+ "focus-visible:bg-alert/dim-5"
910
+ ])
911
+ },
912
+ {
913
+ intent: "danger",
914
+ design: "ghost",
915
+ class: (0, import_internal_utils4.tw)([
916
+ "text-error",
917
+ "hover:bg-error/dim-5",
918
+ "enabled:active:bg-error/dim-5",
919
+ "focus-visible:bg-error/dim-5"
920
+ ])
921
+ },
922
+ {
923
+ intent: "info",
924
+ design: "ghost",
925
+ class: (0, import_internal_utils4.tw)([
926
+ "text-info",
927
+ "hover:bg-info/dim-5",
928
+ "enabled:active:bg-info/dim-5",
929
+ "focus-visible:bg-info/dim-5"
930
+ ])
931
+ },
932
+ {
933
+ intent: "neutral",
934
+ design: "ghost",
935
+ class: (0, import_internal_utils4.tw)([
936
+ "text-neutral",
937
+ "hover:bg-neutral/dim-5",
938
+ "enabled:active:bg-neutral/dim-5",
939
+ "focus-visible:bg-neutral/dim-5"
940
+ ])
941
+ },
942
+ {
943
+ intent: "surface",
944
+ design: "ghost",
945
+ class: (0, import_internal_utils4.tw)([
946
+ "text-surface",
947
+ "hover:bg-surface/dim-5",
948
+ "enabled:active:bg-surface/dim-5",
949
+ "focus-visible:bg-surface/dim-5"
950
+ ])
951
+ }
952
+ ];
953
+
954
+ // src/button/variants/outlined.ts
955
+ var import_internal_utils5 = require("@spark-ui/internal-utils");
956
+ var outlinedVariants = [
957
+ {
958
+ intent: "main",
959
+ design: "outlined",
960
+ class: (0, import_internal_utils5.tw)([
961
+ "hover:bg-main/dim-5",
962
+ "enabled:active:bg-main/dim-5",
963
+ "focus-visible:bg-main/dim-5",
964
+ "text-main"
965
+ ])
966
+ },
967
+ {
968
+ intent: "support",
969
+ design: "outlined",
970
+ class: (0, import_internal_utils5.tw)([
971
+ "hover:bg-support/dim-5",
972
+ "enabled:active:bg-support/dim-5",
973
+ "focus-visible:bg-support/dim-5",
974
+ "text-support"
975
+ ])
976
+ },
977
+ {
978
+ intent: "accent",
979
+ design: "outlined",
980
+ class: (0, import_internal_utils5.tw)([
981
+ "hover:bg-accent/dim-5",
982
+ "enabled:active:bg-accent/dim-5",
983
+ "focus-visible:bg-accent/dim-5",
984
+ "text-accent"
985
+ ])
986
+ },
987
+ {
988
+ intent: "basic",
989
+ design: "outlined",
990
+ class: (0, import_internal_utils5.tw)([
991
+ "hover:bg-basic/dim-5",
992
+ "enabled:active:bg-basic/dim-5",
993
+ "focus-visible:bg-basic/dim-5",
994
+ "text-basic"
995
+ ])
996
+ },
997
+ {
998
+ intent: "success",
999
+ design: "outlined",
1000
+ class: (0, import_internal_utils5.tw)([
1001
+ "hover:bg-success/dim-5",
1002
+ "enabled:active:bg-success/dim-5",
1003
+ "focus-visible:bg-success/dim-5",
1004
+ "text-success"
1005
+ ])
1006
+ },
1007
+ {
1008
+ intent: "alert",
1009
+ design: "outlined",
1010
+ class: (0, import_internal_utils5.tw)([
1011
+ "hover:bg-alert/dim-5",
1012
+ "enabled:active:bg-alert/dim-5",
1013
+ "focus-visible:bg-alert/dim-5",
1014
+ "text-alert"
1015
+ ])
1016
+ },
1017
+ {
1018
+ intent: "danger",
1019
+ design: "outlined",
1020
+ class: (0, import_internal_utils5.tw)([
1021
+ "hover:bg-error/dim-5",
1022
+ "enabled:active:bg-error/dim-5",
1023
+ "focus-visible:bg-error/dim-5",
1024
+ "text-error"
1025
+ ])
1026
+ },
1027
+ {
1028
+ intent: "info",
1029
+ design: "outlined",
1030
+ class: (0, import_internal_utils5.tw)([
1031
+ "hover:bg-info/dim-5",
1032
+ "enabled:active:bg-info/dim-5",
1033
+ "focus-visible:bg-info/dim-5",
1034
+ "text-info"
1035
+ ])
1036
+ },
1037
+ {
1038
+ intent: "neutral",
1039
+ design: "outlined",
1040
+ class: (0, import_internal_utils5.tw)([
1041
+ "hover:bg-neutral/dim-5",
1042
+ "enabled:active:bg-neutral/dim-5",
1043
+ "focus-visible:bg-neutral/dim-5",
1044
+ "text-neutral"
1045
+ ])
1046
+ },
1047
+ {
1048
+ intent: "surface",
1049
+ design: "outlined",
1050
+ class: (0, import_internal_utils5.tw)([
1051
+ "hover:bg-surface/dim-5",
1052
+ "enabled:active:bg-surface/dim-5",
1053
+ "focus-visible:bg-surface/dim-5",
1054
+ "text-surface"
1055
+ ])
1056
+ }
1057
+ ];
1058
+
1059
+ // src/button/variants/tinted.ts
1060
+ var import_internal_utils6 = require("@spark-ui/internal-utils");
1061
+ var tintedVariants = [
1062
+ {
1063
+ intent: "main",
1064
+ design: "tinted",
1065
+ class: (0, import_internal_utils6.tw)([
1066
+ "bg-main-container",
1067
+ "text-on-main-container",
1068
+ "hover:bg-main-container-hovered",
1069
+ "enabled:active:bg-main-container-hovered",
1070
+ "focus-visible:bg-main-container-hovered"
1071
+ ])
1072
+ },
1073
+ {
1074
+ intent: "support",
1075
+ design: "tinted",
1076
+ class: (0, import_internal_utils6.tw)([
1077
+ "bg-support-container",
1078
+ "text-on-support-container",
1079
+ "hover:bg-support-container-hovered",
1080
+ "enabled:active:bg-support-container-hovered",
1081
+ "focus-visible:bg-support-container-hovered"
1082
+ ])
1083
+ },
1084
+ {
1085
+ intent: "accent",
1086
+ design: "tinted",
1087
+ class: (0, import_internal_utils6.tw)([
1088
+ "bg-accent-container",
1089
+ "text-on-accent-container",
1090
+ "hover:bg-accent-container-hovered",
1091
+ "enabled:active:bg-accent-container-hovered",
1092
+ "focus-visible:bg-accent-container-hovered"
1093
+ ])
1094
+ },
1095
+ {
1096
+ intent: "basic",
1097
+ design: "tinted",
1098
+ class: (0, import_internal_utils6.tw)([
1099
+ "bg-basic-container",
1100
+ "text-on-basic-container",
1101
+ "hover:bg-basic-container-hovered",
1102
+ "enabled:active:bg-basic-container-hovered",
1103
+ "focus-visible:bg-basic-container-hovered"
1104
+ ])
1105
+ },
1106
+ {
1107
+ intent: "success",
1108
+ design: "tinted",
1109
+ class: (0, import_internal_utils6.tw)([
1110
+ "bg-success-container",
1111
+ "text-on-success-container",
1112
+ "hover:bg-success-container-hovered",
1113
+ "enabled:active:bg-success-container-hovered",
1114
+ "focus-visible:bg-success-container-hovered"
1115
+ ])
1116
+ },
1117
+ {
1118
+ intent: "alert",
1119
+ design: "tinted",
1120
+ class: (0, import_internal_utils6.tw)([
1121
+ "bg-alert-container",
1122
+ "text-on-alert-container",
1123
+ "hover:bg-alert-container-hovered",
1124
+ "enabled:active:bg-alert-container-hovered",
1125
+ "focus-visible:bg-alert-container-hovered"
1126
+ ])
1127
+ },
1128
+ {
1129
+ intent: "danger",
1130
+ design: "tinted",
1131
+ class: (0, import_internal_utils6.tw)([
1132
+ "bg-error-container",
1133
+ "text-on-error-container",
1134
+ "hover:bg-error-container-hovered",
1135
+ "enabled:active:bg-error-container-hovered",
1136
+ "focus-visible:bg-error-container-hovered"
1137
+ ])
1138
+ },
1139
+ {
1140
+ intent: "info",
1141
+ design: "tinted",
1142
+ class: (0, import_internal_utils6.tw)([
1143
+ "bg-info-container",
1144
+ "text-on-info-container",
1145
+ "hover:bg-info-container-hovered",
1146
+ "enabled:active:bg-info-container-hovered",
1147
+ "focus-visible:bg-info-container-hovered"
1148
+ ])
1149
+ },
1150
+ {
1151
+ intent: "neutral",
1152
+ design: "tinted",
1153
+ class: (0, import_internal_utils6.tw)([
1154
+ "bg-neutral-container",
1155
+ "text-on-neutral-container",
1156
+ "hover:bg-neutral-container-hovered",
1157
+ "enabled:active:bg-neutral-container-hovered",
1158
+ "focus-visible:bg-neutral-container-hovered"
1159
+ ])
1160
+ },
1161
+ {
1162
+ intent: "surface",
1163
+ design: "tinted",
1164
+ class: (0, import_internal_utils6.tw)([
1165
+ "bg-surface",
1166
+ "text-on-surface",
1167
+ "hover:bg-surface-hovered",
1168
+ "enabled:active:bg-surface-hovered",
1169
+ "focus-visible:bg-surface-hovered"
1170
+ ])
1171
+ }
1172
+ ];
1173
+
1174
+ // src/button/variants/contrast.ts
1175
+ var import_internal_utils7 = require("@spark-ui/internal-utils");
1176
+ var contrastVariants = [
1177
+ {
1178
+ intent: "main",
1179
+ design: "contrast",
1180
+ class: (0, import_internal_utils7.tw)([
1181
+ "text-main",
1182
+ "hover:bg-main-container-hovered",
1183
+ "enabled:active:bg-main-container-hovered",
1184
+ "focus-visible:bg-main-container-hovered"
1185
+ ])
1186
+ },
1187
+ {
1188
+ intent: "support",
1189
+ design: "contrast",
1190
+ class: (0, import_internal_utils7.tw)([
1191
+ "text-support",
1192
+ "hover:bg-support-container-hovered",
1193
+ "enabled:active:bg-support-container-hovered",
1194
+ "focus-visible:bg-support-container-hovered"
1195
+ ])
1196
+ },
1197
+ {
1198
+ intent: "accent",
1199
+ design: "contrast",
1200
+ class: (0, import_internal_utils7.tw)([
1201
+ "text-accent",
1202
+ "hover:bg-accent-container-hovered",
1203
+ "enabled:active:bg-accent-container-hovered",
1204
+ "focus-visible:bg-accent-container-hovered"
1205
+ ])
1206
+ },
1207
+ {
1208
+ intent: "basic",
1209
+ design: "contrast",
1210
+ class: (0, import_internal_utils7.tw)([
1211
+ "text-basic",
1212
+ "hover:bg-basic-container-hovered",
1213
+ "enabled:active:bg-basic-container-hovered",
1214
+ "focus-visible:bg-basic-container-hovered"
1215
+ ])
1216
+ },
1217
+ {
1218
+ intent: "success",
1219
+ design: "contrast",
1220
+ class: (0, import_internal_utils7.tw)([
1221
+ "text-success",
1222
+ "hover:bg-success-container-hovered",
1223
+ "enabled:active:bg-success-container-hovered",
1224
+ "focus-visible:bg-success-container-hovered"
1225
+ ])
1226
+ },
1227
+ {
1228
+ intent: "alert",
1229
+ design: "contrast",
1230
+ class: (0, import_internal_utils7.tw)([
1231
+ "text-alert",
1232
+ "hover:bg-alert-container-hovered",
1233
+ "enabled:active:bg-alert-container-hovered",
1234
+ "focus-visible:bg-alert-container-hovered"
1235
+ ])
1236
+ },
1237
+ {
1238
+ intent: "danger",
1239
+ design: "contrast",
1240
+ class: (0, import_internal_utils7.tw)([
1241
+ "text-error",
1242
+ "hover:bg-error-container-hovered",
1243
+ "enabled:active:bg-error-container-hovered",
1244
+ "focus-visible:bg-error-container-hovered"
1245
+ ])
1246
+ },
1247
+ {
1248
+ intent: "info",
1249
+ design: "contrast",
1250
+ class: (0, import_internal_utils7.tw)([
1251
+ "text-info",
1252
+ "hover:bg-info-container-hovered",
1253
+ "enabled:active:bg-info-container-hovered",
1254
+ "focus-visible:bg-info-container-hovered"
1255
+ ])
1256
+ },
1257
+ {
1258
+ intent: "neutral",
1259
+ design: "contrast",
1260
+ class: (0, import_internal_utils7.tw)([
1261
+ "text-neutral",
1262
+ "hover:bg-neutral-container-hovered",
1263
+ "enabled:active:bg-neutral-container-hovered",
1264
+ "focus-visible:bg-neutral-container-hovered"
1265
+ ])
1266
+ },
1267
+ {
1268
+ intent: "surface",
1269
+ design: "contrast",
1270
+ class: (0, import_internal_utils7.tw)([
1271
+ "text-on-surface",
1272
+ "hover:bg-surface-hovered",
1273
+ "enabled:active:bg-surface-hovered",
1274
+ "focus-visible:bg-surface-hovered"
1275
+ ])
1276
+ }
1277
+ ];
1278
+
1279
+ // src/button/Button.styles.tsx
1280
+ var buttonStyles = (0, import_class_variance_authority13.cva)(
1281
+ [
1282
+ "u-shadow-border-transition",
1283
+ "box-border inline-flex items-center justify-center gap-md whitespace-nowrap",
1284
+ "px-lg",
1285
+ "text-body-1 font-bold",
1286
+ "focus-visible:u-outline"
1287
+ ],
1288
+ {
1289
+ variants: {
1290
+ /**
1291
+ * Main style of the button.
1292
+ *
1293
+ * - `filled`: Button will be plain.
1294
+ *
1295
+ * - `outlined`: Button will be transparent with an outline.
1296
+ *
1297
+ * - `tinted`: Button will be filled but using a lighter color scheme.
1298
+ *
1299
+ * - `ghost`: Button will look like a link. No borders, plain text.
1300
+ *
1301
+ * - `contrast`: Button will be surface filled. No borders, plain text.
1302
+ *
1303
+ */
1304
+ design: (0, import_internal_utils8.makeVariants)({
1305
+ filled: [],
1306
+ outlined: ["bg-transparent", "border-sm", "border-current"],
1307
+ tinted: [],
1308
+ ghost: [],
1309
+ contrast: ["bg-surface"]
1310
+ }),
1311
+ /**
1312
+ * Color scheme of the button.
1313
+ */
1314
+ intent: (0, import_internal_utils8.makeVariants)({
1315
+ main: [],
1316
+ support: [],
1317
+ accent: [],
1318
+ basic: [],
1319
+ success: [],
1320
+ alert: [],
1321
+ danger: [],
1322
+ info: [],
1323
+ neutral: [],
1324
+ surface: []
1325
+ }),
1326
+ /**
1327
+ * Size of the button.
1328
+ */
1329
+ size: (0, import_internal_utils8.makeVariants)({
1330
+ sm: ["min-w-sz-32", "h-sz-32"],
1331
+ md: ["min-w-sz-44", "h-sz-44"],
1332
+ lg: ["min-w-sz-56", "h-sz-56"]
1333
+ }),
1334
+ /**
1335
+ * Shape of the button.
1336
+ */
1337
+ shape: (0, import_internal_utils8.makeVariants)({
1338
+ rounded: ["rounded-lg"],
1339
+ square: ["rounded-0"],
1340
+ pill: ["rounded-full"]
1341
+ }),
1342
+ /**
1343
+ * Disable the button, preventing user interaction and adding opacity.
1344
+ */
1345
+ disabled: {
1346
+ true: ["cursor-not-allowed", "opacity-dim-3"],
1347
+ false: ["cursor-pointer"]
1348
+ }
1349
+ },
1350
+ compoundVariants: [
1351
+ ...filledVariants,
1352
+ ...outlinedVariants,
1353
+ ...tintedVariants,
1354
+ ...ghostVariants,
1355
+ ...contrastVariants
1356
+ ],
1357
+ defaultVariants: {
1358
+ design: "filled",
1359
+ intent: "main",
1360
+ size: "md",
1361
+ shape: "rounded"
1362
+ }
1363
+ }
1364
+ );
1365
+
1366
+ // src/button/Button.tsx
1367
+ var import_jsx_runtime23 = require("react/jsx-runtime");
1368
+ var blockedEventHandlers = [
1369
+ "onClick",
1370
+ "onMouseDown",
1371
+ "onMouseUp",
1372
+ "onMouseEnter",
1373
+ "onMouseLeave",
1374
+ "onMouseOver",
1375
+ "onMouseOut",
1376
+ "onKeyDown",
1377
+ "onKeyPress",
1378
+ "onKeyUp",
1379
+ "onSubmit"
1380
+ ];
1381
+ var Button = ({
1382
+ children,
1383
+ design = "filled",
1384
+ disabled = false,
1385
+ intent = "main",
1386
+ isLoading = false,
1387
+ loadingLabel,
1388
+ loadingText,
1389
+ shape = "rounded",
1390
+ size = "md",
1391
+ asChild,
1392
+ className,
1393
+ ref,
1394
+ ...others
1395
+ }) => {
1396
+ const Component = asChild ? Slot : "button";
1397
+ const shouldNotInteract = !!disabled || isLoading;
1398
+ const disabledEventHandlers = (0, import_react9.useMemo)(() => {
1399
+ const result = {};
1400
+ if (shouldNotInteract) {
1401
+ blockedEventHandlers.forEach((eventHandler) => result[eventHandler] = void 0);
1402
+ }
1403
+ return result;
1404
+ }, [shouldNotInteract]);
1405
+ const spinnerProps = {
1406
+ size: "current",
1407
+ className: loadingText ? "inline-block" : "absolute",
1408
+ ...loadingLabel && { "aria-label": loadingLabel }
1409
+ };
1410
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1411
+ Component,
1412
+ {
1413
+ "data-spark-component": "button",
1414
+ ...Component === "button" && { type: "button" },
1415
+ ref,
1416
+ className: buttonStyles({
1417
+ className,
1418
+ design,
1419
+ disabled: shouldNotInteract,
1420
+ intent,
1421
+ shape,
1422
+ size
1423
+ }),
1424
+ disabled: !!disabled,
1425
+ "aria-busy": isLoading,
1426
+ "aria-live": isLoading ? "assertive" : "off",
1427
+ ...others,
1428
+ ...disabledEventHandlers,
1429
+ children: wrapPolymorphicSlot(
1430
+ asChild,
1431
+ children,
1432
+ (slotted) => isLoading ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_jsx_runtime23.Fragment, { children: [
1433
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Spinner, { ...spinnerProps }),
1434
+ loadingText && loadingText,
1435
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1436
+ "div",
1437
+ {
1438
+ "aria-hidden": true,
1439
+ className: (0, import_class_variance_authority14.cx)("gap-md", loadingText ? "hidden" : "inline-flex opacity-0"),
1440
+ children: slotted
1441
+ }
1442
+ )
1443
+ ] }) : slotted
1444
+ )
1445
+ }
1446
+ );
1447
+ };
1448
+ Button.displayName = "Button";
1449
+
1450
+ // src/icon-button/IconButton.styles.tsx
1451
+ var import_internal_utils9 = require("@spark-ui/internal-utils");
1452
+ var import_class_variance_authority15 = require("class-variance-authority");
1453
+ var iconButtonStyles = (0, import_class_variance_authority15.cva)(["pl-0 pr-0"], {
1454
+ variants: {
1455
+ /**
1456
+ * Sets the size of the icon.
1457
+ */
1458
+ size: (0, import_internal_utils9.makeVariants)({
1459
+ sm: ["text-body-1"],
1460
+ md: ["text-body-1"],
1461
+ lg: ["text-display-3"]
1462
+ })
1463
+ }
1464
+ });
1465
+
1466
+ // src/icon-button/IconButton.tsx
1467
+ var import_jsx_runtime24 = require("react/jsx-runtime");
1468
+ var IconButton = ({
1469
+ design = "filled",
1470
+ disabled = false,
1471
+ intent = "main",
1472
+ shape = "rounded",
1473
+ size = "md",
1474
+ className,
1475
+ ref,
1476
+ ...others
1477
+ }) => {
1478
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1479
+ Button,
1480
+ {
1481
+ ref,
1482
+ className: iconButtonStyles({ size, className }),
1483
+ design,
1484
+ disabled,
1485
+ intent,
1486
+ shape,
1487
+ size,
1488
+ ...others
1489
+ }
1490
+ );
1491
+ };
1492
+ IconButton.displayName = "IconButton";
1493
+
1494
+ // src/popover/PopoverCloseButton.tsx
1495
+ var import_jsx_runtime25 = require("react/jsx-runtime");
1496
+ var CloseButton = ({
1497
+ "aria-label": ariaLabel,
1498
+ className,
1499
+ ref,
1500
+ ...rest
1501
+ }) => {
1502
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1503
+ import_radix_ui6.Popover.Close,
1504
+ {
1505
+ "data-spark-component": "popover-close-button",
1506
+ ref,
1507
+ className: (0, import_class_variance_authority16.cx)("right-md top-md absolute", className),
1508
+ asChild: true,
1509
+ ...rest,
1510
+ children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(IconButton, { size: "sm", intent: "neutral", design: "ghost", "aria-label": ariaLabel, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Icon, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_Close.Close, {}) }) })
1511
+ }
1512
+ );
1513
+ };
1514
+ CloseButton.displayName = "Popover.CloseButton";
1515
+
1516
+ // src/popover/PopoverContent.tsx
1517
+ var import_radix_ui7 = require("radix-ui");
1518
+
1519
+ // src/popover/PopoverContent.styles.ts
1520
+ var import_class_variance_authority17 = require("class-variance-authority");
1521
+ var styles = (0, import_class_variance_authority17.cva)(
1522
+ [
1523
+ "rounded-md",
1524
+ "shadow-sm",
1525
+ "focus-visible:outline-hidden focus-visible:u-outline",
1526
+ "max-h-(--radix-popper-available-height) overflow-y-auto"
1527
+ ],
1528
+ {
1529
+ variants: {
1530
+ intent: {
1531
+ surface: "bg-surface text-on-surface",
1532
+ main: "bg-main-container text-on-main-container",
1533
+ support: "bg-support-container text-on-support-container",
1534
+ accent: "bg-accent-container text-on-accent-container",
1535
+ basic: "bg-basic-container text-on-basic-container",
1536
+ success: "bg-success-container text-on-success-container",
1537
+ alert: "bg-alert-container text-on-alert-container",
1538
+ danger: "bg-error-container text-on-error-container",
1539
+ info: "bg-info-container text-on-info-container",
1540
+ neutral: "bg-neutral-container text-on-neutral-container"
1541
+ },
1542
+ matchTriggerWidth: {
1543
+ true: "w-(--radix-popper-anchor-width)"
1544
+ },
1545
+ enforceBoundaries: {
1546
+ true: ["max-w-(--radix-popper-available-width)"]
1547
+ },
1548
+ inset: {
1549
+ true: "overflow-hidden",
1550
+ false: "p-lg"
1551
+ },
1552
+ elevation: {
1553
+ dropdown: "z-dropdown",
1554
+ popover: "z-popover"
1555
+ }
1556
+ },
1557
+ compoundVariants: [
1558
+ {
1559
+ inset: false,
1560
+ /**
1561
+ * When there is a close button, padding to the right side must be adjusted to avoid content overlapping with it.
1562
+ */
1563
+ class: "has-data-[spark-component=popover-close-button]:pr-3xl"
1564
+ },
1565
+ {
1566
+ enforceBoundaries: false,
1567
+ matchTriggerWidth: false,
1568
+ class: "max-w-[min(var(--spacing-sz-384),100vw)]"
1569
+ }
1570
+ ],
1571
+ defaultVariants: {
1572
+ matchTriggerWidth: false,
1573
+ enforceBoundaries: false,
1574
+ inset: false,
1575
+ intent: "surface",
1576
+ elevation: "popover"
1577
+ }
1578
+ }
1579
+ );
1580
+
1581
+ // src/popover/PopoverContent.tsx
1582
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1583
+ var Content = ({
1584
+ // Spark props
1585
+ className,
1586
+ children,
1587
+ matchTriggerWidth = false,
1588
+ // Radix props
1589
+ align = "center",
1590
+ arrowPadding = 16,
1591
+ // In order not to overlap the arrow on the rounded corners of the popover.
1592
+ asChild = false,
1593
+ avoidCollisions = true,
1594
+ "aria-labelledby": ariaLabelledBy,
1595
+ collisionBoundary,
1596
+ collisionPadding = 0,
1597
+ hideWhenDetached = false,
1598
+ side = "bottom",
1599
+ sideOffset = 8,
1600
+ sticky = "partial",
1601
+ inset = false,
1602
+ elevation = "popover",
1603
+ ref,
1604
+ ...rest
1605
+ }) => {
1606
+ const { headerId, intent } = usePopover();
1607
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1608
+ import_radix_ui7.Popover.Content,
1609
+ {
1610
+ "aria-labelledby": headerId || ariaLabelledBy,
1611
+ className: styles({
1612
+ enforceBoundaries: !!collisionBoundary,
1613
+ matchTriggerWidth,
1614
+ inset,
1615
+ elevation,
1616
+ intent,
1617
+ className
1618
+ }),
1619
+ "data-spark-component": "popover-content",
1620
+ ref,
1621
+ ...{
1622
+ align,
1623
+ arrowPadding,
1624
+ asChild,
1625
+ avoidCollisions,
1626
+ collisionBoundary,
1627
+ collisionPadding,
1628
+ hideWhenDetached,
1629
+ side,
1630
+ sideOffset,
1631
+ sticky
1632
+ },
1633
+ ...rest,
1634
+ children
1635
+ }
1636
+ );
1637
+ };
1638
+ Content.displayName = "Popover.Content";
1639
+
1640
+ // src/popover/PopoverHeader.tsx
1641
+ var import_class_variance_authority18 = require("class-variance-authority");
1642
+ var import_react10 = require("react");
1643
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1644
+ var Header = ({ children, className, ref, ...rest }) => {
1645
+ const id = `${ID_PREFIX2}-header-${(0, import_react10.useId)()}`;
1646
+ const { setHeaderId } = usePopover();
1647
+ (0, import_react10.useLayoutEffect)(() => {
1648
+ setHeaderId(id);
1649
+ return () => setHeaderId(null);
1650
+ }, [id, setHeaderId]);
1651
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("header", { id, ref, className: (0, import_class_variance_authority18.cx)("mb-md text-headline-2", className), ...rest, children });
1652
+ };
1653
+ Header.displayName = "Popover.Header";
1654
+
1655
+ // src/popover/PopoverPortal.tsx
1656
+ var import_radix_ui8 = require("radix-ui");
1657
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1658
+ var Portal = ({ children, ...rest }) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_radix_ui8.Popover.Portal, { ...rest, children });
1659
+ Portal.displayName = "Popover.Portal";
1660
+
1661
+ // src/popover/PopoverTrigger.tsx
1662
+ var import_radix_ui9 = require("radix-ui");
1663
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1664
+ var Trigger = ({ asChild = false, children, ref, ...rest }) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1665
+ import_radix_ui9.Popover.Trigger,
1666
+ {
1667
+ "data-spark-component": "popover-trigger",
1668
+ ref,
1669
+ asChild,
1670
+ ...rest,
1671
+ children
1672
+ }
1673
+ );
1674
+ Trigger.displayName = "Popover.Trigger";
1675
+
1676
+ // src/popover/index.ts
1677
+ var Popover2 = Object.assign(Popover, {
1678
+ Anchor,
1679
+ Arrow,
1680
+ CloseButton,
1681
+ Content,
1682
+ Header,
1683
+ Portal,
1684
+ Trigger
1685
+ });
1686
+ Popover2.displayName = "Popover";
1687
+ Anchor.displayName = "Popover.Anchor";
1688
+ Arrow.displayName = "Popover.Arrow";
1689
+ CloseButton.displayName = "Popover.CloseButton";
1690
+ Content.displayName = "Popover.Content";
1691
+ Header.displayName = "Popover.Header";
1692
+ Portal.displayName = "Popover.Portal";
1693
+ Trigger.displayName = "Popover.Trigger";
1694
+
1695
+ // src/combobox/useCombobox/multipleSelectionReducer.ts
1696
+ var import_downshift = require("downshift");
1697
+
1698
+ // src/combobox/utils/index.ts
1699
+ var import_react11 = require("react");
1700
+ function getIndexByKey(map, targetKey) {
1701
+ let index = 0;
1702
+ for (const [key] of map.entries()) {
1703
+ if (key === targetKey) {
1704
+ return index;
1705
+ }
1706
+ index++;
1707
+ }
1708
+ return -1;
1709
+ }
1710
+ var getKeyAtIndex = (map, index) => {
1711
+ let i = 0;
1712
+ for (const key of map.keys()) {
1713
+ if (i === index) return key;
1714
+ i++;
1715
+ }
1716
+ return void 0;
1717
+ };
1718
+ var getElementByIndex = (map, index) => {
1719
+ const key = getKeyAtIndex(map, index);
1720
+ return key !== void 0 ? map.get(key) : void 0;
1721
+ };
1722
+ var getElementDisplayName = (element) => {
1723
+ return element ? element.type.displayName : "";
1724
+ };
1725
+ var getOrderedItems = (children, result = []) => {
1726
+ import_react11.Children.forEach(children, (child) => {
1727
+ if (!(0, import_react11.isValidElement)(child)) return;
1728
+ if (getElementDisplayName(child) === "Combobox.Item") {
1729
+ const childProps = child.props;
1730
+ result.push({
1731
+ value: childProps.value,
1732
+ disabled: !!childProps.disabled,
1733
+ text: getItemText(childProps.children)
1734
+ });
1735
+ }
1736
+ if (child.props.children) {
1737
+ getOrderedItems(child.props.children, result);
1738
+ }
1739
+ });
1740
+ return result;
1741
+ };
1742
+ var findNestedItemText = (children) => {
1743
+ if (!children) return "";
1744
+ for (const child of import_react11.Children.toArray(children)) {
1745
+ if ((0, import_react11.isValidElement)(child)) {
1746
+ const childElement = child;
1747
+ if (getElementDisplayName(childElement) === "Combobox.ItemText") {
1748
+ return childElement.props.children;
1749
+ }
1750
+ const foundText = findNestedItemText(childElement.props.children);
1751
+ if (foundText) return foundText;
1752
+ }
1753
+ }
1754
+ return "";
1755
+ };
1756
+ var getItemText = (children) => {
1757
+ return typeof children === "string" ? children : findNestedItemText(children);
1758
+ };
1759
+ var getItemsFromChildren = (children) => {
1760
+ const newMap = /* @__PURE__ */ new Map();
1761
+ getOrderedItems(children).forEach((itemData) => {
1762
+ newMap.set(itemData.value, itemData);
1763
+ });
1764
+ return newMap;
1765
+ };
1766
+ var hasChildComponent = (children, displayName) => {
1767
+ return import_react11.Children.toArray(children).some((child) => {
1768
+ if (!(0, import_react11.isValidElement)(child)) return false;
1769
+ if (getElementDisplayName(child) === displayName) {
1770
+ return true;
1771
+ } else if (child.props.children) {
1772
+ return hasChildComponent(child.props.children, displayName);
1773
+ }
1774
+ return false;
1775
+ });
1776
+ };
1777
+ var findElement = (children, value) => {
1778
+ return import_react11.Children.toArray(children).filter(import_react11.isValidElement).find((child) => value === getElementDisplayName(child) || "");
1779
+ };
1780
+
1781
+ // src/combobox/useCombobox/multipleSelectionReducer.ts
1782
+ var multipleSelectionReducer = ({
1783
+ multiselect,
1784
+ selectedItems,
1785
+ allowCustomValue = false,
1786
+ setSelectedItems,
1787
+ triggerAreaRef,
1788
+ items
1789
+ }) => {
1790
+ const reducer = (_, { changes, type }) => {
1791
+ const isFocusInsideTriggerArea = triggerAreaRef.current?.contains?.(document.activeElement);
1792
+ switch (type) {
1793
+ case import_downshift.useCombobox.stateChangeTypes.InputClick:
1794
+ return {
1795
+ ...changes,
1796
+ isOpen: true
1797
+ // keep menu opened
1798
+ };
1799
+ case import_downshift.useCombobox.stateChangeTypes.InputKeyDownEnter:
1800
+ case import_downshift.useCombobox.stateChangeTypes.ItemClick: {
1801
+ const newState = { ...changes };
1802
+ if (changes.selectedItem != null) {
1803
+ newState.inputValue = "";
1804
+ newState.isOpen = true;
1805
+ const highlightedIndex = getIndexByKey(items, changes.selectedItem.value);
1806
+ newState.highlightedIndex = highlightedIndex;
1807
+ const isAlreadySelected = multiselect.selectedItems.some(
1808
+ (selectedItem) => selectedItem.value === changes.selectedItem?.value
1809
+ );
1810
+ const updatedItems = isAlreadySelected ? selectedItems.filter((item) => item.value !== changes.selectedItem?.value) : [...selectedItems, changes.selectedItem];
1811
+ setSelectedItems(updatedItems);
1812
+ }
1813
+ return newState;
1814
+ }
1815
+ case import_downshift.useCombobox.stateChangeTypes.ToggleButtonClick:
1816
+ return {
1817
+ ...changes,
1818
+ inputValue: allowCustomValue ? changes.inputValue : ""
1819
+ };
1820
+ case import_downshift.useCombobox.stateChangeTypes.InputChange:
1821
+ return {
1822
+ ...changes,
1823
+ selectedItem: changes.highlightedIndex === -1 ? null : changes.selectedItem
1824
+ };
1825
+ case import_downshift.useCombobox.stateChangeTypes.InputBlur:
1826
+ return {
1827
+ ...changes,
1828
+ inputValue: allowCustomValue ? changes.inputValue : "",
1829
+ isOpen: isFocusInsideTriggerArea
1830
+ };
1831
+ default:
1832
+ return changes;
1833
+ }
1834
+ };
1835
+ return reducer;
1836
+ };
1837
+
1838
+ // src/combobox/useCombobox/singleSelectionReducer.ts
1839
+ var import_downshift2 = require("downshift");
1840
+ var singleSelectionReducer = ({
1841
+ filteredItems,
1842
+ allowCustomValue = false,
1843
+ setSelectedItem
1844
+ }) => {
1845
+ const reducer = (state, { changes, type }) => {
1846
+ const exactMatch = filteredItems.find(
1847
+ (item) => item.text.toLowerCase() === state.inputValue.toLowerCase()
1848
+ );
1849
+ switch (type) {
1850
+ case import_downshift2.useCombobox.stateChangeTypes.InputKeyDownEscape:
1851
+ if (!changes.selectedItem) {
1852
+ setSelectedItem(null);
1853
+ }
1854
+ return changes;
1855
+ case import_downshift2.useCombobox.stateChangeTypes.ItemClick:
1856
+ case import_downshift2.useCombobox.stateChangeTypes.InputKeyDownEnter:
1857
+ if (changes.selectedItem) {
1858
+ setSelectedItem(changes.selectedItem);
1859
+ }
1860
+ return changes;
1861
+ case import_downshift2.useCombobox.stateChangeTypes.InputClick:
1862
+ return { ...changes, isOpen: true };
1863
+ case import_downshift2.useCombobox.stateChangeTypes.ToggleButtonClick:
1864
+ case import_downshift2.useCombobox.stateChangeTypes.InputBlur:
1865
+ if (allowCustomValue) return changes;
1866
+ if (state.inputValue === "") {
1867
+ setSelectedItem(null);
1868
+ return { ...changes, selectedItem: null };
1869
+ }
1870
+ if (exactMatch) {
1871
+ setSelectedItem(exactMatch);
1872
+ return { ...changes, selectedItem: exactMatch, inputValue: exactMatch.text };
1873
+ }
1874
+ if (state.selectedItem) {
1875
+ return { ...changes, inputValue: state.selectedItem.text };
1876
+ }
1877
+ return { ...changes, inputValue: "" };
1878
+ default:
1879
+ return changes;
1880
+ }
1881
+ };
1882
+ return reducer;
1883
+ };
1884
+
1885
+ // src/combobox/ComboboxContext.tsx
1886
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1887
+ var ComboboxContext = (0, import_react12.createContext)(null);
1888
+ var getFilteredItemsMap = (map, inputValue) => {
1889
+ if (!inputValue) return map;
1890
+ return new Map(
1891
+ Array.from(map).filter(([_, { text }]) => text.toLowerCase().includes(inputValue.toLowerCase()))
1892
+ );
1893
+ };
1894
+ var ID_PREFIX3 = ":combobox";
1895
+ var ComboboxProvider = ({
1896
+ children,
1897
+ state: stateProp,
1898
+ allowCustomValue = false,
1899
+ filtering = "auto",
1900
+ disabled: disabledProp = false,
1901
+ multiple = false,
1902
+ readOnly: readOnlyProp = false,
1903
+ wrap = true,
1904
+ // Value
1905
+ value: controlledValue,
1906
+ defaultValue,
1907
+ onValueChange,
1908
+ // Open
1909
+ open: controlledOpen,
1910
+ defaultOpen,
1911
+ onOpenChange,
1912
+ isLoading
1913
+ }) => {
1914
+ const isMounted = (0, import_react12.useRef)(false);
1915
+ const [inputValue, setInputValue] = (0, import_react12.useState)("");
1916
+ const [isTyping, setIsTyping] = (0, import_react12.useState)(filtering === "strict");
1917
+ const triggerAreaRef = (0, import_react12.useRef)(null);
1918
+ const innerInputRef = (0, import_react12.useRef)(null);
1919
+ const [onInputValueChange, setOnInputValueChange] = (0, import_react12.useState)(null);
1920
+ const [comboboxValue] = (0, import_use_combined_state.useCombinedState)(controlledValue, defaultValue);
1921
+ const shouldFilterItems = filtering === "strict" || filtering === "auto" && isTyping;
1922
+ const [itemsMap, setItemsMap] = (0, import_react12.useState)(getItemsFromChildren(children));
1923
+ const [filteredItemsMap, setFilteredItems] = (0, import_react12.useState)(
1924
+ shouldFilterItems ? getFilteredItemsMap(itemsMap, inputValue) : itemsMap
1925
+ );
1926
+ const [selectedItem, setSelectedItem] = (0, import_react12.useState)(
1927
+ itemsMap.get(comboboxValue) || null
1928
+ );
1929
+ const [selectedItems, setSelectedItems] = (0, import_react12.useState)(
1930
+ comboboxValue ? [...itemsMap.values()].filter((item) => comboboxValue.includes(item.value)) : []
1931
+ );
1932
+ const onInternalSelectedItemChange = (item) => {
1933
+ setIsTyping(false);
1934
+ if (item?.value !== selectedItem?.value) {
1935
+ setSelectedItem(item);
1936
+ setTimeout(() => {
1937
+ onValueChange?.(item?.value);
1938
+ }, 0);
1939
+ }
1940
+ };
1941
+ const onInternalSelectedItemsChange = (items) => {
1942
+ setSelectedItems(items);
1943
+ setTimeout(() => {
1944
+ onValueChange?.(items.map((i) => i.value));
1945
+ }, 0);
1946
+ };
1947
+ (0, import_react12.useEffect)(() => {
1948
+ if (!isMounted.current) {
1949
+ isMounted.current = true;
1950
+ return;
1951
+ }
1952
+ if (multiple) {
1953
+ const newSelectedItems = comboboxValue.reduce(
1954
+ (accum, value) => {
1955
+ const match = itemsMap.get(value);
1956
+ return match ? [...accum, match] : accum;
1957
+ },
1958
+ []
1959
+ );
1960
+ setSelectedItems(comboboxValue ? newSelectedItems : []);
1961
+ } else {
1962
+ setSelectedItem(itemsMap.get(comboboxValue) || null);
1963
+ }
1964
+ }, [multiple ? JSON.stringify(comboboxValue) : comboboxValue]);
1965
+ const field = useFormFieldControl();
1966
+ const internalFieldLabelID = `${ID_PREFIX3}-label-${(0, import_react12.useId)()}`;
1967
+ const internalFieldID = `${ID_PREFIX3}-field-${(0, import_react12.useId)()}`;
1968
+ const id = field.id || internalFieldID;
1969
+ const labelId = field.labelId || internalFieldLabelID;
1970
+ const state = field.state || stateProp;
1971
+ const disabled = field.disabled ?? disabledProp;
1972
+ const readOnly = field.readOnly ?? readOnlyProp;
1973
+ const [hasPopover, setHasPopover] = (0, import_react12.useState)(
1974
+ hasChildComponent(children, "Combobox.Popover")
1975
+ );
1976
+ const [lastInteractionType, setLastInteractionType] = (0, import_react12.useState)("mouse");
1977
+ (0, import_react12.useEffect)(() => {
1978
+ setFilteredItems(shouldFilterItems ? getFilteredItemsMap(itemsMap, inputValue) : itemsMap);
1979
+ }, [inputValue, itemsMap]);
1980
+ const multiselect = (0, import_downshift3.useMultipleSelection)({
1981
+ selectedItems,
1982
+ stateReducer: (state2, { type, changes }) => {
1983
+ const types = import_downshift3.useMultipleSelection.stateChangeTypes;
1984
+ switch (type) {
1985
+ case types.SelectedItemKeyDownBackspace:
1986
+ case types.SelectedItemKeyDownDelete: {
1987
+ onInternalSelectedItemsChange(changes.selectedItems || []);
1988
+ let activeIndex;
1989
+ if (type === types.SelectedItemKeyDownDelete) {
1990
+ const isLastItem = state2?.activeIndex === changes.selectedItems?.length;
1991
+ activeIndex = isLastItem ? -1 : state2.activeIndex;
1992
+ } else {
1993
+ const hasItemBefore = (changes?.activeIndex || 0) - 1 >= 0;
1994
+ activeIndex = hasItemBefore ? state2.activeIndex - 1 : changes?.activeIndex;
1995
+ }
1996
+ return {
1997
+ ...changes,
1998
+ activeIndex
1999
+ };
2000
+ }
2001
+ case types.SelectedItemClick:
2002
+ if (innerInputRef.current) {
2003
+ innerInputRef.current.focus();
2004
+ }
2005
+ return {
2006
+ ...changes,
2007
+ activeIndex: -1
2008
+ // the focus will remain on the input
2009
+ };
2010
+ case types.FunctionRemoveSelectedItem:
2011
+ return {
2012
+ ...changes,
2013
+ activeIndex: -1
2014
+ // the focus will remain on the input
2015
+ };
2016
+ case types.DropdownKeyDownNavigationPrevious:
2017
+ downshift.closeMenu();
2018
+ return changes;
2019
+ default:
2020
+ return changes;
2021
+ }
2022
+ }
2023
+ });
2024
+ const filteredItems = Array.from(filteredItemsMap.values());
2025
+ (0, import_react12.useEffect)(() => {
2026
+ onInputValueChange?.(inputValue || "");
2027
+ }, [inputValue]);
2028
+ const downshift = (0, import_downshift3.useCombobox)({
2029
+ inputId: id,
2030
+ items: filteredItems,
2031
+ selectedItem: multiple ? void 0 : selectedItem,
2032
+ id,
2033
+ labelId,
2034
+ // Input
2035
+ inputValue,
2036
+ onInputValueChange: ({ inputValue: newInputValue }) => {
2037
+ setInputValue(newInputValue);
2038
+ if (shouldFilterItems) {
2039
+ const filtered = getFilteredItemsMap(itemsMap, newInputValue || "");
2040
+ setFilteredItems(filtered);
2041
+ }
2042
+ },
2043
+ // Open
2044
+ initialIsOpen: defaultOpen,
2045
+ ...controlledOpen != null && { isOpen: controlledOpen },
2046
+ onIsOpenChange: (changes) => {
2047
+ if (changes.isOpen != null) {
2048
+ onOpenChange?.(changes.isOpen);
2049
+ }
2050
+ },
2051
+ // Custom Spark item object parsing
2052
+ itemToString: (item) => {
2053
+ return item?.text;
2054
+ },
2055
+ isItemDisabled: (item) => {
2056
+ const isFilteredOut = !!inputValue && !filteredItems.some((filteredItem) => {
2057
+ return item.value === filteredItem.value;
2058
+ });
2059
+ return item.disabled || isFilteredOut;
2060
+ },
2061
+ // Main reducer
2062
+ stateReducer: multiple ? multipleSelectionReducer({
2063
+ multiselect,
2064
+ selectedItems,
2065
+ allowCustomValue,
2066
+ setSelectedItems: onInternalSelectedItemsChange,
2067
+ triggerAreaRef,
2068
+ items: itemsMap
2069
+ }) : singleSelectionReducer({
2070
+ allowCustomValue,
2071
+ setSelectedItem: onInternalSelectedItemChange,
2072
+ filteredItems: [...filteredItemsMap.values()]
2073
+ }),
2074
+ /**
2075
+ * Downshift default behaviour is to scroll into view the highlighted item when the dropdown opens. This behaviour is not stable and scrolls the dropdown to the bottom of the screen.
2076
+ */
2077
+ scrollIntoView: (node) => {
2078
+ if (node) {
2079
+ node.scrollIntoView({ block: "nearest" });
2080
+ }
2081
+ return void 0;
2082
+ }
2083
+ });
2084
+ (0, import_react12.useEffect)(() => {
2085
+ const newMap = getItemsFromChildren(children);
2086
+ const previousItems = [...itemsMap.values()];
2087
+ const newItems = [...newMap.values()];
2088
+ const hasItemsChanges = previousItems.length !== newItems.length || previousItems.some((item, index) => {
2089
+ const hasUpdatedValue = item.value !== newItems[index]?.value;
2090
+ const hasUpdatedText = item.text !== newItems[index]?.text;
2091
+ return hasUpdatedValue || hasUpdatedText;
2092
+ });
2093
+ if (hasItemsChanges) {
2094
+ setItemsMap(newMap);
2095
+ }
2096
+ }, [children]);
2097
+ const [WrapperComponent, wrapperProps] = hasPopover ? [Popover2, { open: true }] : [import_react12.Fragment, {}];
2098
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2099
+ ComboboxContext.Provider,
2100
+ {
2101
+ value: {
2102
+ // Data
2103
+ itemsMap,
2104
+ filteredItemsMap,
2105
+ highlightedItem: getElementByIndex(filteredItemsMap, downshift.highlightedIndex),
2106
+ // State
2107
+ multiple,
2108
+ disabled,
2109
+ readOnly,
2110
+ hasPopover,
2111
+ setHasPopover,
2112
+ state,
2113
+ lastInteractionType,
2114
+ setLastInteractionType,
2115
+ wrap,
2116
+ // Refs
2117
+ innerInputRef,
2118
+ triggerAreaRef,
2119
+ // Downshift state
2120
+ ...downshift,
2121
+ ...multiselect,
2122
+ setInputValue,
2123
+ selectItem: onInternalSelectedItemChange,
2124
+ setSelectedItems: onInternalSelectedItemsChange,
2125
+ isLoading,
2126
+ setOnInputValueChange,
2127
+ isTyping,
2128
+ setIsTyping
2129
+ },
2130
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(WrapperComponent, { ...wrapperProps, children })
2131
+ }
2132
+ );
2133
+ };
2134
+ var useComboboxContext = () => {
2135
+ const context = (0, import_react12.useContext)(ComboboxContext);
2136
+ if (!context) {
2137
+ throw Error("useComboboxContext must be used within a Combobox provider");
2138
+ }
2139
+ return context;
2140
+ };
2141
+
2142
+ // src/combobox/Combobox.tsx
2143
+ var import_jsx_runtime31 = require("react/jsx-runtime");
2144
+ var Combobox = ({ children, ...props }) => {
2145
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ComboboxProvider, { ...props, children });
2146
+ };
2147
+ Combobox.displayName = "Combobox";
2148
+
2149
+ // src/combobox/ComboboxClearButton.tsx
2150
+ var import_DeleteOutline = require("@spark-ui/icons/DeleteOutline");
2151
+ var import_class_variance_authority19 = require("class-variance-authority");
2152
+ var import_jsx_runtime32 = require("react/jsx-runtime");
2153
+ var ClearButton = ({
2154
+ className,
2155
+ tabIndex = -1,
2156
+ onClick,
2157
+ ref,
2158
+ ...others
2159
+ }) => {
2160
+ const ctx = useComboboxContext();
2161
+ const handleClick = (event) => {
2162
+ event.stopPropagation();
2163
+ if (ctx.multiple) {
2164
+ ctx.setSelectedItems([]);
2165
+ } else {
2166
+ ctx.selectItem(null);
2167
+ }
2168
+ ctx.setInputValue("");
2169
+ if (ctx.innerInputRef.current) {
2170
+ ctx.innerInputRef.current.focus();
2171
+ }
2172
+ if (onClick) {
2173
+ onClick(event);
2174
+ }
2175
+ };
2176
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
2177
+ "button",
2178
+ {
2179
+ ref,
2180
+ className: (0, import_class_variance_authority19.cx)(className, "h-sz-44 text-neutral hover:text-neutral-hovered"),
2181
+ tabIndex,
2182
+ onClick: handleClick,
2183
+ type: "button",
2184
+ ...others,
2185
+ children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_DeleteOutline.DeleteOutline, {}) })
2186
+ }
2187
+ );
2188
+ };
2189
+ ClearButton.displayName = "Combobox.ClearButton";
2190
+
2191
+ // src/combobox/ComboboxDisclosure.tsx
2192
+ var import_ArrowHorizontalDown = require("@spark-ui/icons/ArrowHorizontalDown");
2193
+ var import_use_merge_refs = require("@spark-ui/use-merge-refs");
2194
+ var import_class_variance_authority20 = require("class-variance-authority");
2195
+ var import_jsx_runtime33 = require("react/jsx-runtime");
2196
+ var Disclosure = ({
2197
+ className,
2198
+ closedLabel,
2199
+ openedLabel,
2200
+ intent = "neutral",
2201
+ design = "ghost",
2202
+ size = "sm",
2203
+ ref: forwardedRef,
2204
+ ...props
2205
+ }) => {
2206
+ const ctx = useComboboxContext();
2207
+ const { ref: downshiftRef, ...downshiftDisclosureProps } = ctx.getToggleButtonProps({
2208
+ disabled: ctx.disabled || ctx.readOnly,
2209
+ onClick: (event) => {
2210
+ event.stopPropagation();
2211
+ }
2212
+ });
2213
+ const isExpanded = downshiftDisclosureProps["aria-expanded"];
2214
+ const ref = (0, import_use_merge_refs.useMergeRefs)(forwardedRef, downshiftRef);
2215
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2216
+ IconButton,
2217
+ {
2218
+ ref,
2219
+ className: (0, import_class_variance_authority20.cx)(className, "mt-[calc((44px-32px)/2)]"),
2220
+ intent,
2221
+ design,
2222
+ size,
2223
+ ...downshiftDisclosureProps,
2224
+ ...props,
2225
+ "aria-label": isExpanded ? openedLabel : closedLabel,
2226
+ disabled: ctx.disabled,
2227
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2228
+ Icon,
2229
+ {
2230
+ className: (0, import_class_variance_authority20.cx)("shrink-0", "rotate-0 transition duration-100 ease-in", {
2231
+ "rotate-180": isExpanded
2232
+ }),
2233
+ size: "sm",
2234
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_ArrowHorizontalDown.ArrowHorizontalDown, {})
2235
+ }
2236
+ )
2237
+ }
2238
+ );
2239
+ };
2240
+ Disclosure.displayName = "Combobox.Disclosure";
2241
+
2242
+ // src/combobox/ComboboxEmpty.tsx
2243
+ var import_class_variance_authority21 = require("class-variance-authority");
2244
+ var import_jsx_runtime34 = require("react/jsx-runtime");
2245
+ var Empty = ({ className, children, ref: forwardedRef }) => {
2246
+ const ctx = useComboboxContext();
2247
+ const hasNoItemVisible = ctx.filteredItemsMap.size === 0;
2248
+ return hasNoItemVisible ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
2249
+ "div",
2250
+ {
2251
+ ref: forwardedRef,
2252
+ className: (0, import_class_variance_authority21.cx)("px-lg py-md text-body-1 text-on-surface/dim-1", className),
2253
+ children
2254
+ }
2255
+ ) : null;
2256
+ };
2257
+ Empty.displayName = "Combobox.Empty";
2258
+
2259
+ // src/combobox/ComboboxGroup.tsx
2260
+ var import_class_variance_authority22 = require("class-variance-authority");
2261
+ var import_react14 = require("react");
2262
+
2263
+ // src/combobox/ComboboxItemsGroupContext.tsx
2264
+ var import_react13 = require("react");
2265
+ var import_jsx_runtime35 = require("react/jsx-runtime");
2266
+ var ComboboxGroupContext = (0, import_react13.createContext)(null);
2267
+ var ComboboxGroupProvider = ({ children }) => {
2268
+ const groupLabelId = `${ID_PREFIX3}-group-label-${(0, import_react13.useId)()}`;
2269
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(ComboboxGroupContext.Provider, { value: { groupLabelId }, children });
2270
+ };
2271
+ var useComboboxGroupContext = () => {
2272
+ const context = (0, import_react13.useContext)(ComboboxGroupContext);
2273
+ if (!context) {
2274
+ throw Error("useComboboxGroupContext must be used within a ComboboxGroup provider");
2275
+ }
2276
+ return context;
2277
+ };
2278
+
2279
+ // src/combobox/ComboboxGroup.tsx
2280
+ var import_jsx_runtime36 = require("react/jsx-runtime");
2281
+ var Group = ({ children, ref: forwardedRef, ...props }) => {
2282
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(ComboboxGroupProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(GroupContent, { ref: forwardedRef, ...props, children }) });
2283
+ };
2284
+ var GroupContent = ({ children, className, ref: forwardedRef }) => {
2285
+ const ctx = useComboboxContext();
2286
+ const groupCtx = useComboboxGroupContext();
2287
+ const hasVisibleOptions = import_react14.Children.toArray(children).some((child) => {
2288
+ return (0, import_react14.isValidElement)(child) && ctx.filteredItemsMap.get(child.props.value);
2289
+ });
2290
+ return hasVisibleOptions ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2291
+ "div",
2292
+ {
2293
+ ref: forwardedRef,
2294
+ role: "group",
2295
+ "aria-labelledby": groupCtx.groupLabelId,
2296
+ className: (0, import_class_variance_authority22.cx)(className),
2297
+ children
2298
+ }
2299
+ ) : null;
2300
+ };
2301
+ Group.displayName = "Combobox.Group";
2302
+
2303
+ // src/combobox/ComboboxInput.tsx
2304
+ var import_use_combined_state2 = require("@spark-ui/use-combined-state");
2305
+ var import_use_merge_refs2 = require("@spark-ui/use-merge-refs");
2306
+ var import_class_variance_authority23 = require("class-variance-authority");
2307
+ var import_react15 = require("react");
2308
+ var import_jsx_runtime37 = require("react/jsx-runtime");
2309
+ var Input = ({
2310
+ "aria-label": ariaLabel,
2311
+ className,
2312
+ placeholder,
2313
+ value,
2314
+ defaultValue,
2315
+ onValueChange,
2316
+ ref: forwardedRef,
2317
+ ...props
2318
+ }) => {
2319
+ const ctx = useComboboxContext();
2320
+ const [inputValue] = (0, import_use_combined_state2.useCombinedState)(value, defaultValue);
2321
+ (0, import_react15.useEffect)(() => {
2322
+ if (inputValue != null) {
2323
+ ctx.setInputValue(inputValue);
2324
+ }
2325
+ }, [inputValue]);
2326
+ (0, import_react15.useEffect)(() => {
2327
+ if (onValueChange) {
2328
+ ctx.setOnInputValueChange(() => onValueChange);
2329
+ }
2330
+ if (!ctx.multiple && ctx.selectedItem) {
2331
+ ctx.setInputValue(ctx.selectedItem.text);
2332
+ }
2333
+ }, []);
2334
+ const [PopoverTrigger, popoverTriggerProps] = ctx.hasPopover ? [Popover2.Trigger, { asChild: true, type: void 0 }] : [import_react15.Fragment, {}];
2335
+ const multiselectInputProps = ctx.getDropdownProps();
2336
+ const inputRef = (0, import_use_merge_refs2.useMergeRefs)(forwardedRef, ctx.innerInputRef, multiselectInputProps.ref);
2337
+ const downshiftInputProps = ctx.getInputProps({
2338
+ disabled: ctx.disabled || ctx.readOnly,
2339
+ ...multiselectInputProps,
2340
+ onKeyDown: (event) => {
2341
+ multiselectInputProps.onKeyDown?.(event);
2342
+ ctx.setLastInteractionType("keyboard");
2343
+ ctx.setIsTyping(true);
2344
+ },
2345
+ /**
2346
+ *
2347
+ * Important:
2348
+ * - without this, the input cursor is moved to the end after every change.
2349
+ * @see https://github.com/downshift-js/downshift/issues/1108#issuecomment-674180157
2350
+ */
2351
+ onChange: (e) => {
2352
+ ctx.setInputValue(e.target.value);
2353
+ },
2354
+ ref: inputRef
2355
+ });
2356
+ const hasPlaceholder = ctx.multiple ? ctx.selectedItems.length === 0 : ctx.selectedItem === null;
2357
+ function mergeHandlers(handlerA, handlerB) {
2358
+ return (event) => {
2359
+ handlerA?.(event);
2360
+ handlerB?.(event);
2361
+ };
2362
+ }
2363
+ const mergedEventProps = {
2364
+ onBlur: mergeHandlers(props.onBlur, downshiftInputProps.onBlur),
2365
+ onChange: mergeHandlers(props.onChange, downshiftInputProps.onChange),
2366
+ onClick: mergeHandlers(props.onClick, downshiftInputProps.onClick),
2367
+ onKeyDown: mergeHandlers(props.onKeyDown, downshiftInputProps.onKeyDown)
2368
+ };
2369
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [
2370
+ ariaLabel && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("label", { ...ctx.getLabelProps(), children: ariaLabel }) }),
2371
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(PopoverTrigger, { ...popoverTriggerProps, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2372
+ "input",
2373
+ {
2374
+ "data-spark-component": "combobox-input",
2375
+ type: "text",
2376
+ ...hasPlaceholder && { placeholder },
2377
+ className: (0, import_class_variance_authority23.cx)(
2378
+ "max-w-full shrink-0 grow basis-[80px]",
2379
+ "h-sz-28 bg-surface px-sm text-body-1 text-ellipsis outline-hidden",
2380
+ "disabled:text-on-surface/dim-3 disabled:cursor-not-allowed disabled:bg-transparent",
2381
+ "read-only:text-on-surface read-only:cursor-default read-only:bg-transparent",
2382
+ className
2383
+ ),
2384
+ ...props,
2385
+ ...downshiftInputProps,
2386
+ ...mergedEventProps,
2387
+ value: ctx.inputValue,
2388
+ "aria-label": ariaLabel,
2389
+ disabled: ctx.disabled,
2390
+ readOnly: ctx.readOnly
2391
+ }
2392
+ ) })
2393
+ ] });
2394
+ };
2395
+ Input.displayName = "Combobox.Input";
2396
+
2397
+ // src/combobox/ComboboxItem.tsx
2398
+ var import_use_merge_refs3 = require("@spark-ui/use-merge-refs");
2399
+ var import_class_variance_authority24 = require("class-variance-authority");
2400
+
2401
+ // src/combobox/ComboboxItemContext.tsx
2402
+ var import_react16 = require("react");
2403
+ var import_jsx_runtime38 = require("react/jsx-runtime");
2404
+ var ComboboxItemContext = (0, import_react16.createContext)(null);
2405
+ var ComboboxItemProvider = ({
2406
+ value,
2407
+ disabled = false,
2408
+ children
2409
+ }) => {
2410
+ const ctx = useComboboxContext();
2411
+ const [textId, setTextId] = (0, import_react16.useState)(void 0);
2412
+ const index = getIndexByKey(ctx.filteredItemsMap, value);
2413
+ const itemData = { disabled, value, text: getItemText(children) };
2414
+ const isSelected = ctx.multiple ? ctx.selectedItems.some((selectedItem) => selectedItem.value === value) : ctx.selectedItem?.value === value;
2415
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2416
+ ComboboxItemContext.Provider,
2417
+ {
2418
+ value: { textId, setTextId, isSelected, itemData, index, disabled },
2419
+ children
2420
+ }
2421
+ );
2422
+ };
2423
+ var useComboboxItemContext = () => {
2424
+ const context = (0, import_react16.useContext)(ComboboxItemContext);
2425
+ if (!context) {
2426
+ throw Error("useComboboxItemContext must be used within a ComboboxItem provider");
2427
+ }
2428
+ return context;
2429
+ };
2430
+
2431
+ // src/combobox/ComboboxItem.tsx
2432
+ var import_jsx_runtime39 = require("react/jsx-runtime");
2433
+ var Item = ({ children, ref: forwardedRef, ...props }) => {
2434
+ const { value, disabled } = props;
2435
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(ComboboxItemProvider, { value, disabled, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(ItemContent, { ref: forwardedRef, ...props, children }) });
2436
+ };
2437
+ var styles2 = (0, import_class_variance_authority24.cva)("px-lg py-md text-body-1", {
2438
+ variants: {
2439
+ selected: {
2440
+ true: "font-bold"
2441
+ },
2442
+ disabled: {
2443
+ true: "opacity-dim-3 cursor-not-allowed",
2444
+ false: "cursor-pointer"
2445
+ },
2446
+ highlighted: {
2447
+ true: ""
2448
+ },
2449
+ interactionType: {
2450
+ mouse: "",
2451
+ keyboard: ""
2452
+ }
2453
+ },
2454
+ compoundVariants: [
2455
+ {
2456
+ highlighted: true,
2457
+ interactionType: "mouse",
2458
+ class: "bg-surface-hovered"
2459
+ },
2460
+ {
2461
+ highlighted: true,
2462
+ interactionType: "keyboard",
2463
+ class: "u-outline"
2464
+ }
2465
+ ]
2466
+ });
2467
+ var ItemContent = ({
2468
+ className,
2469
+ disabled = false,
2470
+ value,
2471
+ children,
2472
+ ref: forwardedRef
2473
+ }) => {
2474
+ const ctx = useComboboxContext();
2475
+ const itemCtx = useComboboxItemContext();
2476
+ const isVisible = !!ctx.filteredItemsMap.get(value);
2477
+ const { ref: downshiftRef, ...downshiftItemProps } = ctx.getItemProps({
2478
+ item: itemCtx.itemData,
2479
+ index: itemCtx.index
2480
+ });
2481
+ const ref = (0, import_use_merge_refs3.useMergeRefs)(forwardedRef, downshiftRef);
2482
+ if (!isVisible) return null;
2483
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2484
+ "li",
2485
+ {
2486
+ ref,
2487
+ className: (0, import_class_variance_authority24.cx)(
2488
+ styles2({
2489
+ selected: itemCtx.isSelected,
2490
+ disabled,
2491
+ highlighted: ctx.highlightedItem?.value === value,
2492
+ interactionType: ctx.lastInteractionType,
2493
+ className
2494
+ })
2495
+ ),
2496
+ ...downshiftItemProps,
2497
+ "aria-selected": itemCtx.isSelected,
2498
+ "aria-labelledby": itemCtx.textId,
2499
+ children
2500
+ },
2501
+ value
2502
+ );
2503
+ };
2504
+ Item.displayName = "Combobox.Item";
2505
+
2506
+ // src/combobox/ComboboxItemIndicator.tsx
2507
+ var import_Check2 = require("@spark-ui/icons/Check");
2508
+ var import_class_variance_authority25 = require("class-variance-authority");
2509
+ var import_jsx_runtime40 = require("react/jsx-runtime");
2510
+ var ItemIndicator = ({
2511
+ className,
2512
+ children,
2513
+ label,
2514
+ ref: forwardedRef
2515
+ }) => {
2516
+ const { disabled, isSelected } = useComboboxItemContext();
2517
+ const childElement = children || /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_Check2.Check, { "aria-label": label }) });
2518
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2519
+ "span",
2520
+ {
2521
+ ref: forwardedRef,
2522
+ className: (0, import_class_variance_authority25.cx)("min-h-sz-16 min-w-sz-16 flex", disabled && "opacity-dim-3", className),
2523
+ children: isSelected && childElement
2524
+ }
2525
+ );
2526
+ };
2527
+ ItemIndicator.displayName = "Combobox.ItemIndicator";
2528
+
2529
+ // src/combobox/ComboboxItems.tsx
2530
+ var import_use_merge_refs4 = require("@spark-ui/use-merge-refs");
2531
+ var import_class_variance_authority26 = require("class-variance-authority");
2532
+ var import_react17 = require("react");
2533
+ var import_jsx_runtime41 = require("react/jsx-runtime");
2534
+ var Items = ({ children, className, ref: forwardedRef, ...props }) => {
2535
+ const ctx = useComboboxContext();
2536
+ const { ref: downshiftRef, ...downshiftMenuProps } = ctx.getMenuProps({
2537
+ onMouseMove: () => {
2538
+ ctx.setLastInteractionType("mouse");
2539
+ }
2540
+ });
2541
+ const innerRef = (0, import_react17.useRef)(null);
2542
+ const ref = (0, import_use_merge_refs4.useMergeRefs)(forwardedRef, downshiftRef, innerRef);
2543
+ const isOpen = ctx.hasPopover ? ctx.isOpen : true;
2544
+ const isPointerEventsDisabled = ctx.hasPopover && !isOpen;
2545
+ (0, import_react17.useLayoutEffect)(() => {
2546
+ if (innerRef.current?.parentElement) {
2547
+ innerRef.current.parentElement.style.pointerEvents = isPointerEventsDisabled ? "none" : "";
2548
+ innerRef.current.style.pointerEvents = isPointerEventsDisabled ? "none" : "";
2549
+ }
2550
+ }, [isPointerEventsDisabled]);
2551
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2552
+ "ul",
2553
+ {
2554
+ ref,
2555
+ className: (0, import_class_variance_authority26.cx)(
2556
+ className,
2557
+ "flex flex-col",
2558
+ isOpen ? "block" : "pointer-events-none invisible opacity-0",
2559
+ ctx.hasPopover && "p-lg",
2560
+ ctx.isLoading && "items-center overflow-y-auto"
2561
+ ),
2562
+ ...props,
2563
+ ...downshiftMenuProps,
2564
+ "aria-busy": ctx.isLoading,
2565
+ "data-spark-component": "combobox-items",
2566
+ children: ctx.isLoading ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Spinner, { size: "sm" }) : children
2567
+ }
2568
+ );
2569
+ };
2570
+ Items.displayName = "Combobox.Items";
2571
+
2572
+ // src/combobox/ComboboxItemText.tsx
2573
+ var import_class_variance_authority27 = require("class-variance-authority");
2574
+ var import_react18 = require("react");
2575
+ var import_jsx_runtime42 = require("react/jsx-runtime");
2576
+ var ItemText = ({ children, className, ref: forwardedRef }) => {
2577
+ const id = `${ID_PREFIX3}-item-text-${(0, import_react18.useId)()}`;
2578
+ const { setTextId } = useComboboxItemContext();
2579
+ (0, import_react18.useEffect)(() => {
2580
+ setTextId(id);
2581
+ return () => setTextId(void 0);
2582
+ });
2583
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { id, className: (0, import_class_variance_authority27.cx)("inline", className), ref: forwardedRef, children });
2584
+ };
2585
+ ItemText.displayName = "Combobox.ItemText";
2586
+
2587
+ // src/combobox/ComboboxLabel.tsx
2588
+ var import_class_variance_authority28 = require("class-variance-authority");
2589
+ var import_jsx_runtime43 = require("react/jsx-runtime");
2590
+ var Label3 = ({ children, className, ref: forwardedRef }) => {
2591
+ const groupCtx = useComboboxGroupContext();
2592
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
2593
+ "div",
2594
+ {
2595
+ ref: forwardedRef,
2596
+ id: groupCtx.groupLabelId,
2597
+ className: (0, import_class_variance_authority28.cx)("px-md py-sm text-body-2 text-neutral italic", className),
2598
+ children
2599
+ }
2600
+ );
2601
+ };
2602
+ Label3.displayName = "Combobox.Label";
2603
+
2604
+ // src/combobox/ComboboxLeadingIcon.tsx
2605
+ var import_jsx_runtime44 = require("react/jsx-runtime");
2606
+ var LeadingIcon = ({ children }) => {
2607
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Icon, { size: "sm", className: "h-sz-44 shrink-0", children });
2608
+ };
2609
+ LeadingIcon.displayName = "Combobox.LeadingIcon";
2610
+
2611
+ // src/combobox/ComboboxPopover.tsx
2612
+ var import_class_variance_authority29 = require("class-variance-authority");
2613
+ var import_react19 = require("react");
2614
+ var import_jsx_runtime45 = require("react/jsx-runtime");
2615
+ var Popover3 = ({
2616
+ children,
2617
+ matchTriggerWidth = true,
2618
+ sideOffset = 4,
2619
+ className,
2620
+ ref: forwardedRef,
2621
+ ...props
2622
+ }) => {
2623
+ const ctx = useComboboxContext();
2624
+ (0, import_react19.useEffect)(() => {
2625
+ ctx.setHasPopover(true);
2626
+ return () => ctx.setHasPopover(false);
2627
+ }, []);
2628
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
2629
+ Popover2.Content,
2630
+ {
2631
+ ref: forwardedRef,
2632
+ inset: true,
2633
+ asChild: true,
2634
+ matchTriggerWidth,
2635
+ className: (0, import_class_variance_authority29.cx)("z-dropdown! relative", className),
2636
+ sideOffset,
2637
+ onOpenAutoFocus: (e) => {
2638
+ e.preventDefault();
2639
+ },
2640
+ ...props,
2641
+ "data-spark-component": "combobox-popover",
2642
+ children
2643
+ }
2644
+ );
2645
+ };
2646
+ Popover3.displayName = "Combobox.Popover";
2647
+
2648
+ // src/combobox/ComboboxPortal.tsx
2649
+ var import_jsx_runtime46 = require("react/jsx-runtime");
2650
+ var Portal2 = ({ children, ...rest }) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Popover2.Portal, { ...rest, children });
2651
+ Portal2.displayName = "Combobox.Portal";
2652
+
2653
+ // src/combobox/ComboboxSelectedItems.tsx
2654
+ var import_DeleteOutline2 = require("@spark-ui/icons/DeleteOutline");
2655
+ var import_class_variance_authority30 = require("class-variance-authority");
2656
+ var import_jsx_runtime47 = require("react/jsx-runtime");
2657
+ var SelectedItem = ({ item: selectedItem, index }) => {
2658
+ const ctx = useComboboxContext();
2659
+ const isCleanable = !ctx.disabled && !ctx.readOnly;
2660
+ const handleFocus = (e) => {
2661
+ const element = e.target;
2662
+ if (ctx.lastInteractionType === "keyboard") {
2663
+ element.scrollIntoView({
2664
+ behavior: "smooth",
2665
+ block: "nearest",
2666
+ inline: "nearest"
2667
+ });
2668
+ }
2669
+ };
2670
+ const { disabled, ...selectedItemProps } = ctx.getSelectedItemProps({
2671
+ disabled: ctx.disabled || ctx.readOnly,
2672
+ selectedItem,
2673
+ index
2674
+ });
2675
+ const Element = disabled ? "button" : "span";
2676
+ return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(
2677
+ Element,
2678
+ {
2679
+ role: "presentation",
2680
+ "data-spark-component": "combobox-selected-item",
2681
+ className: (0, import_class_variance_authority30.cx)(
2682
+ "h-sz-28 bg-neutral-container flex items-center rounded-md align-middle",
2683
+ "text-body-2 text-on-neutral-container",
2684
+ "disabled:opacity-dim-3 disabled:cursor-not-allowed",
2685
+ "focus-visible:u-outline-inset outline-hidden",
2686
+ { "px-md": !isCleanable, "pl-md": isCleanable }
2687
+ ),
2688
+ ...selectedItemProps,
2689
+ tabIndex: -1,
2690
+ ...disabled && { disabled: true },
2691
+ onFocus: handleFocus,
2692
+ children: [
2693
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
2694
+ "span",
2695
+ {
2696
+ className: (0, import_class_variance_authority30.cx)("line-clamp-1 overflow-x-hidden leading-normal break-all text-ellipsis", {
2697
+ "w-max": !ctx.wrap
2698
+ }),
2699
+ children: selectedItem.text
2700
+ }
2701
+ ),
2702
+ ctx.disabled,
2703
+ isCleanable && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
2704
+ "button",
2705
+ {
2706
+ type: "button",
2707
+ tabIndex: -1,
2708
+ "aria-hidden": true,
2709
+ className: "px-md h-full cursor-pointer",
2710
+ onClick: (e) => {
2711
+ e.stopPropagation();
2712
+ const updatedSelectedItems = ctx.selectedItems.filter(
2713
+ (item) => item.value !== selectedItem.value
2714
+ );
2715
+ ctx.setSelectedItems(updatedSelectedItems);
2716
+ if (ctx.innerInputRef.current) {
2717
+ ctx.innerInputRef.current.focus({ preventScroll: true });
2718
+ }
2719
+ },
2720
+ children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_DeleteOutline2.DeleteOutline, {}) })
2721
+ }
2722
+ )
2723
+ ]
2724
+ },
2725
+ `selected-item-${index}`
2726
+ );
2727
+ };
2728
+ var SelectedItems = () => {
2729
+ const ctx = useComboboxContext();
2730
+ return ctx.multiple && ctx.selectedItems.length ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_jsx_runtime47.Fragment, { children: ctx.selectedItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(SelectedItem, { item, index }, item.value)) }) : null;
2731
+ };
2732
+ SelectedItems.displayName = "Combobox.SelectedItems";
2733
+
2734
+ // src/combobox/ComboboxTrigger.tsx
2735
+ var import_use_merge_refs5 = require("@spark-ui/use-merge-refs");
2736
+ var import_class_variance_authority32 = require("class-variance-authority");
2737
+ var import_react21 = require("react");
2738
+
2739
+ // src/combobox/ComboboxTrigger.styles.tsx
2740
+ var import_class_variance_authority31 = require("class-variance-authority");
2741
+ var styles3 = (0, import_class_variance_authority31.cva)(
2742
+ [
2743
+ "flex items-start gap-md min-h-sz-44 text-body-1",
2744
+ "h-fit rounded-lg px-lg",
2745
+ // outline styles
2746
+ "ring-1 outline-hidden ring-inset focus-within:ring-2"
2747
+ ],
2748
+ {
2749
+ variants: {
2750
+ allowWrap: {
2751
+ true: "",
2752
+ false: "h-sz-44"
2753
+ },
2754
+ state: {
2755
+ undefined: "ring-outline focus-within:ring-outline-high",
2756
+ error: "ring-error",
2757
+ alert: "ring-alert",
2758
+ success: "ring-success"
2759
+ },
2760
+ disabled: {
2761
+ true: "cursor-not-allowed border-outline bg-on-surface/dim-5 text-on-surface/dim-3"
2762
+ },
2763
+ readOnly: {
2764
+ true: "cursor-default bg-on-surface/dim-5 text-on-surface"
2765
+ }
2766
+ },
2767
+ compoundVariants: [
2768
+ {
2769
+ disabled: false,
2770
+ state: void 0,
2771
+ class: "hover:ring-outline-high"
2772
+ },
2773
+ {
2774
+ disabled: false,
2775
+ readOnly: false,
2776
+ class: "bg-surface text-on-surface cursor-text"
2777
+ }
2778
+ ],
2779
+ defaultVariants: {
2780
+ state: void 0,
2781
+ disabled: false,
2782
+ readOnly: false
2783
+ }
2784
+ }
2785
+ );
2786
+
2787
+ // src/combobox/utils/useWidthIncreaseCallback.ts
2788
+ var import_react20 = require("react");
2789
+ var useWidthIncreaseCallback = (elementRef, callback) => {
2790
+ const prevWidthRef = (0, import_react20.useRef)(null);
2791
+ (0, import_react20.useEffect)(() => {
2792
+ const checkWidthIncrease = () => {
2793
+ const currentWidth = elementRef.current?.scrollWidth || null;
2794
+ if (prevWidthRef.current && currentWidth && currentWidth > prevWidthRef.current) {
2795
+ callback();
2796
+ }
2797
+ prevWidthRef.current = currentWidth;
2798
+ requestAnimationFrame(checkWidthIncrease);
2799
+ };
2800
+ const interval = requestAnimationFrame(checkWidthIncrease);
2801
+ return () => cancelAnimationFrame(interval);
2802
+ }, [elementRef]);
2803
+ };
2804
+
2805
+ // src/combobox/ComboboxTrigger.tsx
2806
+ var import_jsx_runtime48 = require("react/jsx-runtime");
2807
+ var Trigger2 = ({ className, children, ref: forwardedRef }) => {
2808
+ const ctx = useComboboxContext();
2809
+ const field = useFormFieldControl();
2810
+ const leadingIcon = findElement(children, "Combobox.LeadingIcon");
2811
+ const selectedItems = findElement(children, "Combobox.SelectedItems");
2812
+ const input = findElement(children, "Combobox.Input");
2813
+ const clearButton = findElement(children, "Combobox.ClearButton");
2814
+ const disclosure = findElement(children, "Combobox.Disclosure");
2815
+ const [PopoverAnchor, popoverAnchorProps] = ctx.hasPopover ? [Popover2.Anchor, { asChild: true, type: void 0 }] : [import_react21.Fragment, {}];
2816
+ const ref = (0, import_use_merge_refs5.useMergeRefs)(forwardedRef, ctx.triggerAreaRef);
2817
+ const scrollableAreaRef = (0, import_react21.useRef)(null);
2818
+ const disabled = field.disabled || ctx.disabled;
2819
+ const readOnly = field.readOnly || ctx.readOnly;
2820
+ const hasClearButton = !!clearButton && !disabled && !readOnly;
2821
+ const scrollToRight = () => {
2822
+ if (scrollableAreaRef.current && !ctx.wrap) {
2823
+ const { scrollWidth, clientWidth } = scrollableAreaRef.current;
2824
+ scrollableAreaRef.current.scrollLeft = scrollWidth - clientWidth;
2825
+ }
2826
+ };
2827
+ useWidthIncreaseCallback(scrollableAreaRef, scrollToRight);
2828
+ (0, import_react21.useEffect)(() => {
2829
+ const resizeObserver = new ResizeObserver(scrollToRight);
2830
+ if (scrollableAreaRef.current) {
2831
+ resizeObserver.observe(scrollableAreaRef.current);
2832
+ }
2833
+ return () => {
2834
+ resizeObserver.disconnect();
2835
+ };
2836
+ }, []);
2837
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_jsx_runtime48.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(PopoverAnchor, { ...popoverAnchorProps, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
2838
+ "div",
2839
+ {
2840
+ ref,
2841
+ className: styles3({
2842
+ className,
2843
+ state: ctx.state,
2844
+ disabled,
2845
+ readOnly,
2846
+ allowWrap: ctx.wrap
2847
+ }),
2848
+ onClick: () => {
2849
+ if (!ctx.isOpen && !disabled && !readOnly) {
2850
+ ctx.openMenu();
2851
+ if (ctx.innerInputRef.current) {
2852
+ ctx.innerInputRef.current.focus();
2853
+ }
2854
+ }
2855
+ },
2856
+ children: [
2857
+ leadingIcon,
2858
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
2859
+ "div",
2860
+ {
2861
+ ref: scrollableAreaRef,
2862
+ className: (0, import_class_variance_authority32.cx)(
2863
+ "min-w-none gap-sm py-md inline-flex grow items-start",
2864
+ ctx.wrap ? "flex-wrap" : "u-no-scrollbar overflow-x-auto p-[2px]"
2865
+ ),
2866
+ children: [
2867
+ selectedItems,
2868
+ input
2869
+ ]
2870
+ }
2871
+ ),
2872
+ hasClearButton && clearButton,
2873
+ disclosure
2874
+ ]
2875
+ }
2876
+ ) }) });
2877
+ };
2878
+ Trigger2.displayName = "Combobox.Trigger";
2879
+
2880
+ // src/combobox/index.ts
2881
+ var Combobox2 = Object.assign(Combobox, {
2882
+ Group,
2883
+ Item,
2884
+ Items,
2885
+ ItemText,
2886
+ ItemIndicator,
2887
+ Label: Label3,
2888
+ Popover: Popover3,
2889
+ Trigger: Trigger2,
2890
+ LeadingIcon,
2891
+ Empty,
2892
+ Input,
2893
+ Disclosure,
2894
+ SelectedItems,
2895
+ ClearButton,
2896
+ Portal: Portal2
2897
+ });
2898
+ Combobox2.displayName = "Combobox";
2899
+ Group.displayName = "Combobox.Group";
2900
+ Items.displayName = "Combobox.Items";
2901
+ Item.displayName = "Combobox.Item";
2902
+ ItemText.displayName = "Combobox.ItemText";
2903
+ ItemIndicator.displayName = "Combobox.ItemIndicator";
2904
+ Label3.displayName = "Combobox.Label";
2905
+ Popover3.displayName = "Combobox.Popover";
2906
+ Trigger2.displayName = "Combobox.Trigger";
2907
+ LeadingIcon.displayName = "Combobox.LeadingIcon";
2908
+ Empty.displayName = "Combobox.Empty";
2909
+ Input.displayName = "Combobox.Input";
2910
+ Disclosure.displayName = "Combobox.Disclosure";
2911
+ SelectedItems.displayName = "Combobox.SelectedItems";
2912
+ ClearButton.displayName = "Combobox.ClearButton";
2913
+ Portal2.displayName = "Combobox.Portal";
2914
+ // Annotate the CommonJS export names for ESM import in node:
2915
+ 0 && (module.exports = {
2916
+ Combobox,
2917
+ ComboboxProvider,
2918
+ useComboboxContext
2919
+ });
2920
+ //# sourceMappingURL=index.js.map