@inshorts/glint-ui 0.5.4 → 0.6.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 (340) hide show
  1. package/README.md +3 -1
  2. package/dist/alert.cjs +96 -0
  3. package/dist/alert.cjs.map +1 -0
  4. package/dist/alert.d.cts +29 -0
  5. package/dist/alert.d.ts +29 -0
  6. package/dist/alert.js +10 -0
  7. package/dist/alert.js.map +1 -0
  8. package/dist/autocomplete.cjs +578 -0
  9. package/dist/autocomplete.cjs.map +1 -0
  10. package/dist/autocomplete.d.cts +56 -0
  11. package/dist/autocomplete.d.ts +56 -0
  12. package/dist/autocomplete.js +11 -0
  13. package/dist/autocomplete.js.map +1 -0
  14. package/dist/badge.cjs +89 -0
  15. package/dist/badge.cjs.map +1 -0
  16. package/dist/badge.d.cts +25 -0
  17. package/dist/badge.d.ts +25 -0
  18. package/dist/badge.js +10 -0
  19. package/dist/badge.js.map +1 -0
  20. package/dist/breadcrumb.cjs +88 -0
  21. package/dist/breadcrumb.cjs.map +1 -0
  22. package/dist/breadcrumb.d.cts +14 -0
  23. package/dist/breadcrumb.d.ts +14 -0
  24. package/dist/breadcrumb.js +8 -0
  25. package/dist/breadcrumb.js.map +1 -0
  26. package/dist/button.cjs +143 -0
  27. package/dist/button.cjs.map +1 -0
  28. package/dist/button.d.cts +34 -0
  29. package/dist/button.d.ts +34 -0
  30. package/dist/button.js +9 -0
  31. package/dist/button.js.map +1 -0
  32. package/dist/card.cjs +111 -0
  33. package/dist/card.cjs.map +1 -0
  34. package/dist/card.d.cts +15 -0
  35. package/dist/card.d.ts +15 -0
  36. package/dist/card.js +18 -0
  37. package/dist/card.js.map +1 -0
  38. package/dist/checkbox.cjs +66 -0
  39. package/dist/checkbox.cjs.map +1 -0
  40. package/{src/checkbox.tsx → dist/checkbox.d.cts} +5 -22
  41. package/dist/checkbox.d.ts +25 -0
  42. package/dist/checkbox.js +10 -0
  43. package/dist/checkbox.js.map +1 -0
  44. package/dist/chunk-43ZUFY63.js +85 -0
  45. package/dist/chunk-43ZUFY63.js.map +1 -0
  46. package/dist/chunk-67ACNS42.js +29 -0
  47. package/dist/chunk-67ACNS42.js.map +1 -0
  48. package/dist/chunk-6URKHMCF.js +76 -0
  49. package/dist/chunk-6URKHMCF.js.map +1 -0
  50. package/dist/chunk-ASU6CUTZ.js +85 -0
  51. package/dist/chunk-ASU6CUTZ.js.map +1 -0
  52. package/dist/chunk-EWSBFU54.js +53 -0
  53. package/dist/chunk-EWSBFU54.js.map +1 -0
  54. package/dist/chunk-G4ZQUSAJ.js +38 -0
  55. package/dist/chunk-G4ZQUSAJ.js.map +1 -0
  56. package/dist/chunk-GMCUXEFI.js +67 -0
  57. package/dist/chunk-GMCUXEFI.js.map +1 -0
  58. package/dist/chunk-HBBOR43A.js +85 -0
  59. package/dist/chunk-HBBOR43A.js.map +1 -0
  60. package/dist/chunk-HCA5ODCD.js +11 -0
  61. package/dist/chunk-HCA5ODCD.js.map +1 -0
  62. package/dist/chunk-HYRJYUPI.js +26 -0
  63. package/dist/chunk-HYRJYUPI.js.map +1 -0
  64. package/dist/chunk-IRCTGJQB.js +26 -0
  65. package/dist/chunk-IRCTGJQB.js.map +1 -0
  66. package/dist/chunk-JDE5XYPT.js +30 -0
  67. package/dist/chunk-JDE5XYPT.js.map +1 -0
  68. package/dist/chunk-JSJEEKR3.js +59 -0
  69. package/dist/chunk-JSJEEKR3.js.map +1 -0
  70. package/dist/chunk-KR3BCFP7.js +85 -0
  71. package/dist/chunk-KR3BCFP7.js.map +1 -0
  72. package/dist/chunk-MQT5RAQV.js +202 -0
  73. package/dist/chunk-MQT5RAQV.js.map +1 -0
  74. package/dist/chunk-MUPW2TFJ.js +102 -0
  75. package/dist/chunk-MUPW2TFJ.js.map +1 -0
  76. package/dist/chunk-PM2VE7DJ.js +100 -0
  77. package/dist/chunk-PM2VE7DJ.js.map +1 -0
  78. package/dist/chunk-PPYR3O3L.js +44 -0
  79. package/dist/chunk-PPYR3O3L.js.map +1 -0
  80. package/dist/chunk-PUTC52SI.js +98 -0
  81. package/dist/chunk-PUTC52SI.js.map +1 -0
  82. package/dist/chunk-PVK4WQJZ.js +513 -0
  83. package/dist/chunk-PVK4WQJZ.js.map +1 -0
  84. package/dist/chunk-PWAKTEXF.js +18 -0
  85. package/dist/chunk-PWAKTEXF.js.map +1 -0
  86. package/dist/chunk-QTFWORA7.js +26 -0
  87. package/dist/chunk-QTFWORA7.js.map +1 -0
  88. package/dist/chunk-RUPL2H6V.js +49 -0
  89. package/dist/chunk-RUPL2H6V.js.map +1 -0
  90. package/dist/chunk-S7PVZAPL.js +28 -0
  91. package/dist/chunk-S7PVZAPL.js.map +1 -0
  92. package/dist/chunk-SQDV2AKJ.js +49 -0
  93. package/dist/chunk-SQDV2AKJ.js.map +1 -0
  94. package/dist/chunk-T2KXVH3O.js +297 -0
  95. package/dist/chunk-T2KXVH3O.js.map +1 -0
  96. package/dist/chunk-T4WCCHJQ.js +29 -0
  97. package/dist/chunk-T4WCCHJQ.js.map +1 -0
  98. package/dist/chunk-UC3ZIQPE.js +93 -0
  99. package/dist/chunk-UC3ZIQPE.js.map +1 -0
  100. package/dist/chunk-UE7JY7VR.js +28 -0
  101. package/dist/chunk-UE7JY7VR.js.map +1 -0
  102. package/dist/chunk-WVNRFO5F.js +70 -0
  103. package/dist/chunk-WVNRFO5F.js.map +1 -0
  104. package/dist/chunk-Y5WCT6XN.js +93 -0
  105. package/dist/chunk-Y5WCT6XN.js.map +1 -0
  106. package/dist/chunk-YDICVETX.js +151 -0
  107. package/dist/chunk-YDICVETX.js.map +1 -0
  108. package/dist/chunk-YSU4VWRD.js +90 -0
  109. package/dist/chunk-YSU4VWRD.js.map +1 -0
  110. package/dist/chunk-ZFSQVMLJ.js +126 -0
  111. package/dist/chunk-ZFSQVMLJ.js.map +1 -0
  112. package/dist/chunk-ZHATD73Y.js +46 -0
  113. package/dist/chunk-ZHATD73Y.js.map +1 -0
  114. package/dist/chunk-ZLAA4DGG.js +111 -0
  115. package/dist/chunk-ZLAA4DGG.js.map +1 -0
  116. package/dist/chunk-ZP252OJZ.js +56 -0
  117. package/dist/chunk-ZP252OJZ.js.map +1 -0
  118. package/dist/clipboard.cjs +125 -0
  119. package/dist/clipboard.cjs.map +1 -0
  120. package/dist/clipboard.d.cts +52 -0
  121. package/dist/clipboard.d.ts +52 -0
  122. package/dist/clipboard.js +23 -0
  123. package/dist/clipboard.js.map +1 -0
  124. package/dist/collapsible.cjs +94 -0
  125. package/dist/collapsible.cjs.map +1 -0
  126. package/dist/collapsible.d.cts +21 -0
  127. package/dist/collapsible.d.ts +21 -0
  128. package/dist/collapsible.js +9 -0
  129. package/dist/collapsible.js.map +1 -0
  130. package/dist/confirm-dialog.cjs +369 -0
  131. package/dist/confirm-dialog.cjs.map +1 -0
  132. package/dist/confirm-dialog.d.cts +16 -0
  133. package/dist/confirm-dialog.d.ts +16 -0
  134. package/dist/confirm-dialog.js +13 -0
  135. package/dist/confirm-dialog.js.map +1 -0
  136. package/dist/copy-button.cjs +102 -0
  137. package/dist/copy-button.cjs.map +1 -0
  138. package/dist/copy-button.d.cts +18 -0
  139. package/dist/copy-button.d.ts +18 -0
  140. package/dist/copy-button.js +10 -0
  141. package/dist/copy-button.js.map +1 -0
  142. package/dist/data-table.cjs +140 -0
  143. package/dist/data-table.cjs.map +1 -0
  144. package/dist/data-table.d.cts +81 -0
  145. package/dist/data-table.d.ts +81 -0
  146. package/dist/data-table.js +8 -0
  147. package/dist/data-table.js.map +1 -0
  148. package/dist/date-range-picker/dateRange.cjs +138 -0
  149. package/dist/date-range-picker/dateRange.cjs.map +1 -0
  150. package/dist/date-range-picker/dateRange.d.cts +57 -0
  151. package/dist/date-range-picker/dateRange.d.ts +57 -0
  152. package/dist/date-range-picker/dateRange.js +31 -0
  153. package/dist/date-range-picker/dateRange.js.map +1 -0
  154. package/dist/date-range-picker/index.cjs +375 -0
  155. package/dist/date-range-picker/index.cjs.map +1 -0
  156. package/dist/date-range-picker/index.d.cts +18 -0
  157. package/dist/date-range-picker/index.d.ts +18 -0
  158. package/dist/date-range-picker/index.js +10 -0
  159. package/dist/date-range-picker/index.js.map +1 -0
  160. package/dist/dialogLayer.cjs +121 -0
  161. package/dist/dialogLayer.cjs.map +1 -0
  162. package/dist/dialogLayer.d.cts +11 -0
  163. package/dist/dialogLayer.d.ts +11 -0
  164. package/dist/dialogLayer.js +8 -0
  165. package/dist/dialogLayer.js.map +1 -0
  166. package/dist/feature-access-gate.cjs +160 -0
  167. package/dist/feature-access-gate.cjs.map +1 -0
  168. package/dist/feature-access-gate.d.cts +14 -0
  169. package/dist/feature-access-gate.d.ts +14 -0
  170. package/dist/feature-access-gate.js +11 -0
  171. package/dist/feature-access-gate.js.map +1 -0
  172. package/dist/field.cjs +58 -0
  173. package/dist/field.cjs.map +1 -0
  174. package/dist/field.d.cts +23 -0
  175. package/dist/field.d.ts +23 -0
  176. package/dist/field.js +8 -0
  177. package/dist/field.js.map +1 -0
  178. package/dist/image-uploader.cjs +293 -0
  179. package/dist/image-uploader.cjs.map +1 -0
  180. package/dist/image-uploader.d.cts +34 -0
  181. package/dist/image-uploader.d.ts +34 -0
  182. package/dist/image-uploader.js +12 -0
  183. package/dist/image-uploader.js.map +1 -0
  184. package/dist/index.cjs +3012 -0
  185. package/dist/index.cjs.map +1 -0
  186. package/dist/index.d.cts +41 -0
  187. package/dist/index.d.ts +41 -0
  188. package/dist/index.js +232 -0
  189. package/dist/index.js.map +1 -0
  190. package/dist/input.cjs +58 -0
  191. package/dist/input.cjs.map +1 -0
  192. package/dist/input.d.cts +7 -0
  193. package/dist/input.d.ts +7 -0
  194. package/dist/input.js +10 -0
  195. package/dist/input.js.map +1 -0
  196. package/dist/label.cjs +67 -0
  197. package/dist/label.cjs.map +1 -0
  198. package/dist/label.d.cts +7 -0
  199. package/dist/label.d.ts +7 -0
  200. package/dist/label.js +9 -0
  201. package/dist/label.js.map +1 -0
  202. package/dist/modal.cjs +212 -0
  203. package/dist/modal.cjs.map +1 -0
  204. package/dist/modal.d.cts +39 -0
  205. package/dist/modal.d.ts +39 -0
  206. package/dist/modal.js +12 -0
  207. package/dist/modal.js.map +1 -0
  208. package/dist/page-header.cjs +78 -0
  209. package/dist/page-header.cjs.map +1 -0
  210. package/dist/page-header.d.cts +35 -0
  211. package/dist/page-header.d.ts +35 -0
  212. package/dist/page-header.js +8 -0
  213. package/dist/page-header.js.map +1 -0
  214. package/dist/pagination.cjs +237 -0
  215. package/dist/pagination.cjs.map +1 -0
  216. package/dist/pagination.d.cts +15 -0
  217. package/dist/pagination.d.ts +15 -0
  218. package/dist/pagination.js +11 -0
  219. package/dist/pagination.js.map +1 -0
  220. package/dist/panel-brand-mark.cjs +59 -0
  221. package/dist/panel-brand-mark.cjs.map +1 -0
  222. package/dist/panel-brand-mark.d.cts +13 -0
  223. package/dist/panel-brand-mark.d.ts +13 -0
  224. package/dist/panel-brand-mark.js +8 -0
  225. package/dist/panel-brand-mark.js.map +1 -0
  226. package/dist/panel-sign-in.cjs +256 -0
  227. package/dist/panel-sign-in.cjs.map +1 -0
  228. package/dist/panel-sign-in.d.cts +31 -0
  229. package/dist/panel-sign-in.d.ts +31 -0
  230. package/dist/panel-sign-in.js +14 -0
  231. package/dist/panel-sign-in.js.map +1 -0
  232. package/dist/segmented-control.cjs +126 -0
  233. package/dist/segmented-control.cjs.map +1 -0
  234. package/dist/segmented-control.d.cts +60 -0
  235. package/dist/segmented-control.d.ts +60 -0
  236. package/dist/segmented-control.js +9 -0
  237. package/dist/segmented-control.js.map +1 -0
  238. package/dist/select.cjs +648 -0
  239. package/dist/select.cjs.map +1 -0
  240. package/dist/select.d.cts +30 -0
  241. package/dist/select.d.ts +30 -0
  242. package/dist/select.js +12 -0
  243. package/dist/select.js.map +1 -0
  244. package/dist/separator.cjs +70 -0
  245. package/dist/separator.cjs.map +1 -0
  246. package/dist/separator.d.cts +13 -0
  247. package/dist/separator.d.ts +13 -0
  248. package/dist/separator.js +9 -0
  249. package/dist/separator.js.map +1 -0
  250. package/dist/side-drawer.cjs +321 -0
  251. package/dist/side-drawer.cjs.map +1 -0
  252. package/dist/side-drawer.d.cts +21 -0
  253. package/dist/side-drawer.d.ts +21 -0
  254. package/dist/side-drawer.js +13 -0
  255. package/dist/side-drawer.js.map +1 -0
  256. package/dist/spinner.cjs +57 -0
  257. package/dist/spinner.cjs.map +1 -0
  258. package/{src/spinner.tsx → dist/spinner.d.cts} +11 -22
  259. package/dist/spinner.d.ts +27 -0
  260. package/dist/spinner.js +8 -0
  261. package/dist/spinner.js.map +1 -0
  262. package/dist/spreadsheet-grid.cjs +238 -0
  263. package/dist/spreadsheet-grid.cjs.map +1 -0
  264. package/dist/spreadsheet-grid.d.cts +48 -0
  265. package/dist/spreadsheet-grid.d.ts +48 -0
  266. package/dist/spreadsheet-grid.js +8 -0
  267. package/dist/spreadsheet-grid.js.map +1 -0
  268. package/dist/state-panel.cjs +86 -0
  269. package/dist/state-panel.cjs.map +1 -0
  270. package/dist/state-panel.d.cts +23 -0
  271. package/dist/state-panel.d.ts +23 -0
  272. package/dist/state-panel.js +9 -0
  273. package/dist/state-panel.js.map +1 -0
  274. package/dist/switch.cjs +87 -0
  275. package/dist/switch.cjs.map +1 -0
  276. package/dist/switch.d.cts +13 -0
  277. package/dist/switch.d.ts +13 -0
  278. package/dist/switch.js +9 -0
  279. package/dist/switch.js.map +1 -0
  280. package/dist/table.cjs +139 -0
  281. package/dist/table.cjs.map +1 -0
  282. package/dist/table.d.cts +16 -0
  283. package/dist/table.d.ts +16 -0
  284. package/dist/table.js +22 -0
  285. package/dist/table.js.map +1 -0
  286. package/dist/tabs.cjs +168 -0
  287. package/dist/tabs.cjs.map +1 -0
  288. package/dist/tabs.d.cts +59 -0
  289. package/dist/tabs.d.ts +59 -0
  290. package/dist/tabs.js +11 -0
  291. package/dist/tabs.js.map +1 -0
  292. package/dist/textarea.cjs +66 -0
  293. package/dist/textarea.cjs.map +1 -0
  294. package/dist/textarea.d.cts +18 -0
  295. package/dist/textarea.d.ts +18 -0
  296. package/dist/textarea.js +10 -0
  297. package/dist/textarea.js.map +1 -0
  298. package/dist/utils.cjs +35 -0
  299. package/dist/utils.cjs.map +1 -0
  300. package/dist/utils.d.cts +5 -0
  301. package/dist/utils.d.ts +5 -0
  302. package/dist/utils.js +7 -0
  303. package/dist/utils.js.map +1 -0
  304. package/package.json +390 -13
  305. package/src/alert.tsx +0 -74
  306. package/src/autocomplete.tsx +0 -666
  307. package/src/badge.tsx +0 -60
  308. package/src/breadcrumb.tsx +0 -71
  309. package/src/button.tsx +0 -113
  310. package/src/card.tsx +0 -79
  311. package/src/clipboard.ts +0 -144
  312. package/src/collapsible.tsx +0 -63
  313. package/src/confirm-dialog.tsx +0 -84
  314. package/src/copy-button.tsx +0 -58
  315. package/src/data-table.tsx +0 -190
  316. package/src/date-range-picker/dateRange.ts +0 -142
  317. package/src/date-range-picker/index.tsx +0 -366
  318. package/src/dialogLayer.ts +0 -142
  319. package/src/feature-access-gate.tsx +0 -38
  320. package/src/field.tsx +0 -56
  321. package/src/image-uploader.tsx +0 -181
  322. package/src/index.ts +0 -37
  323. package/src/input.tsx +0 -16
  324. package/src/label.tsx +0 -23
  325. package/src/modal.tsx +0 -117
  326. package/src/page-header.tsx +0 -75
  327. package/src/pagination.tsx +0 -116
  328. package/src/panel-brand-mark.tsx +0 -32
  329. package/src/panel-sign-in.tsx +0 -134
  330. package/src/segmented-control.tsx +0 -155
  331. package/src/select.tsx +0 -105
  332. package/src/separator.tsx +0 -32
  333. package/src/side-drawer.tsx +0 -87
  334. package/src/spreadsheet-grid.tsx +0 -264
  335. package/src/state-panel.tsx +0 -46
  336. package/src/switch.tsx +0 -47
  337. package/src/table.tsx +0 -110
  338. package/src/tabs.tsx +0 -201
  339. package/src/textarea.tsx +0 -32
  340. package/src/utils.ts +0 -6
@@ -0,0 +1,98 @@
1
+ import {
2
+ Button
3
+ } from "./chunk-KR3BCFP7.js";
4
+
5
+ // src/pagination.tsx
6
+ import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
7
+ import * as React from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ function Pagination({
10
+ currentPage,
11
+ totalPages,
12
+ onPageChange,
13
+ loading = false,
14
+ showPageInfo = true
15
+ }) {
16
+ const visiblePages = React.useMemo(() => {
17
+ const delta = 2;
18
+ const range = [];
19
+ const rangeWithDots = [];
20
+ for (let i = Math.max(2, currentPage - delta); i <= Math.min(totalPages - 1, currentPage + delta); i++) {
21
+ range.push(i);
22
+ }
23
+ if (currentPage - delta > 2) {
24
+ rangeWithDots.push(1, "...");
25
+ } else {
26
+ rangeWithDots.push(1);
27
+ }
28
+ rangeWithDots.push(...range);
29
+ if (currentPage + delta < totalPages - 1) {
30
+ rangeWithDots.push("...", totalPages);
31
+ } else if (totalPages > 1) {
32
+ rangeWithDots.push(totalPages);
33
+ }
34
+ return rangeWithDots;
35
+ }, [currentPage, totalPages]);
36
+ if (totalPages <= 1) return null;
37
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-between gap-4 sm:flex-row", children: [
38
+ showPageInfo ? /* @__PURE__ */ jsxs("div", { className: "text-muted-foreground order-2 text-sm sm:order-1", children: [
39
+ "Page ",
40
+ currentPage,
41
+ " of ",
42
+ totalPages
43
+ ] }) : null,
44
+ /* @__PURE__ */ jsxs("div", { className: "order-1 flex items-center space-x-1 sm:order-2 sm:space-x-2", children: [
45
+ /* @__PURE__ */ jsx(
46
+ Button,
47
+ {
48
+ variant: "outline",
49
+ size: "sm",
50
+ onClick: () => onPageChange(currentPage - 1),
51
+ disabled: currentPage <= 1 || loading,
52
+ className: "h-8 min-w-8 px-2",
53
+ "aria-label": "Previous page",
54
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" })
55
+ }
56
+ ),
57
+ /* @__PURE__ */ jsx("div", { className: "flex max-w-[200px] items-center space-x-1 overflow-x-auto sm:max-w-none", children: visiblePages.map(
58
+ (page, index) => page === "..." ? /* @__PURE__ */ jsx(
59
+ "div",
60
+ {
61
+ className: "flex h-8 w-8 shrink-0 items-center justify-center",
62
+ children: /* @__PURE__ */ jsx(MoreHorizontal, { className: "h-4 w-4" })
63
+ },
64
+ `dots-${index}`
65
+ ) : /* @__PURE__ */ jsx(
66
+ Button,
67
+ {
68
+ variant: page === currentPage ? "default" : "outline",
69
+ size: "sm",
70
+ onClick: () => onPageChange(page),
71
+ disabled: loading,
72
+ className: "h-8 min-w-8 shrink-0 px-2",
73
+ "aria-current": page === currentPage ? "page" : void 0,
74
+ children: page
75
+ },
76
+ page
77
+ )
78
+ ) }),
79
+ /* @__PURE__ */ jsx(
80
+ Button,
81
+ {
82
+ variant: "outline",
83
+ size: "sm",
84
+ onClick: () => onPageChange(currentPage + 1),
85
+ disabled: currentPage >= totalPages || loading,
86
+ className: "h-8 min-w-8 px-2",
87
+ "aria-label": "Next page",
88
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" })
89
+ }
90
+ )
91
+ ] })
92
+ ] });
93
+ }
94
+
95
+ export {
96
+ Pagination
97
+ };
98
+ //# sourceMappingURL=chunk-PUTC52SI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pagination.tsx"],"sourcesContent":["\"use client\";\n\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { Button } from \"./button\";\n\nexport type PaginationProps = {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n loading?: boolean;\n showPageInfo?: boolean;\n};\n\n/**\n * Numbered pager for list panels. Hides itself when there is only one page.\n */\nexport function Pagination({\n currentPage,\n totalPages,\n onPageChange,\n loading = false,\n showPageInfo = true,\n}: PaginationProps) {\n const visiblePages = React.useMemo(() => {\n const delta = 2;\n const range: number[] = [];\n const rangeWithDots: Array<number | \"...\"> = [];\n\n for (\n let i = Math.max(2, currentPage - delta);\n i <= Math.min(totalPages - 1, currentPage + delta);\n i++\n ) {\n range.push(i);\n }\n\n if (currentPage - delta > 2) {\n rangeWithDots.push(1, \"...\");\n } else {\n rangeWithDots.push(1);\n }\n\n rangeWithDots.push(...range);\n\n if (currentPage + delta < totalPages - 1) {\n rangeWithDots.push(\"...\", totalPages);\n } else if (totalPages > 1) {\n rangeWithDots.push(totalPages);\n }\n\n return rangeWithDots;\n }, [currentPage, totalPages]);\n\n if (totalPages <= 1) return null;\n\n return (\n <div className=\"flex flex-col items-center justify-between gap-4 sm:flex-row\">\n {showPageInfo ? (\n <div className=\"text-muted-foreground order-2 text-sm sm:order-1\">\n Page {currentPage} of {totalPages}\n </div>\n ) : null}\n\n <div className=\"order-1 flex items-center space-x-1 sm:order-2 sm:space-x-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1 || loading}\n className=\"h-8 min-w-8 px-2\"\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n\n <div className=\"flex max-w-[200px] items-center space-x-1 overflow-x-auto sm:max-w-none\">\n {visiblePages.map((page, index) =>\n page === \"...\" ? (\n <div\n key={`dots-${index}`}\n className=\"flex h-8 w-8 shrink-0 items-center justify-center\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </div>\n ) : (\n <Button\n key={page}\n variant={page === currentPage ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => onPageChange(page)}\n disabled={loading}\n className=\"h-8 min-w-8 shrink-0 px-2\"\n aria-current={page === currentPage ? \"page\" : undefined}\n >\n {page}\n </Button>\n ),\n )}\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages || loading}\n className=\"h-8 min-w-8 px-2\"\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAEA,SAAS,aAAa,cAAc,sBAAsB;AAC1D,YAAY,WAAW;AAyDf,SAcE,KAdF;AA1CD,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AACjB,GAAoB;AAClB,QAAM,eAAqB,cAAQ,MAAM;AACvC,UAAM,QAAQ;AACd,UAAM,QAAkB,CAAC;AACzB,UAAM,gBAAuC,CAAC;AAE9C,aACM,IAAI,KAAK,IAAI,GAAG,cAAc,KAAK,GACvC,KAAK,KAAK,IAAI,aAAa,GAAG,cAAc,KAAK,GACjD,KACA;AACA,YAAM,KAAK,CAAC;AAAA,IACd;AAEA,QAAI,cAAc,QAAQ,GAAG;AAC3B,oBAAc,KAAK,GAAG,KAAK;AAAA,IAC7B,OAAO;AACL,oBAAc,KAAK,CAAC;AAAA,IACtB;AAEA,kBAAc,KAAK,GAAG,KAAK;AAE3B,QAAI,cAAc,QAAQ,aAAa,GAAG;AACxC,oBAAc,KAAK,OAAO,UAAU;AAAA,IACtC,WAAW,aAAa,GAAG;AACzB,oBAAc,KAAK,UAAU;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,UAAU,CAAC;AAE5B,MAAI,cAAc,EAAG,QAAO;AAE5B,SACE,qBAAC,SAAI,WAAU,gEACZ;AAAA,mBACC,qBAAC,SAAI,WAAU,oDAAmD;AAAA;AAAA,MAC1D;AAAA,MAAY;AAAA,MAAK;AAAA,OACzB,IACE;AAAA,IAEJ,qBAAC,SAAI,WAAU,+DACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,cAAc,CAAC;AAAA,UAC3C,UAAU,eAAe,KAAK;AAAA,UAC9B,WAAU;AAAA,UACV,cAAW;AAAA,UAEX,8BAAC,eAAY,WAAU,WAAU;AAAA;AAAA,MACnC;AAAA,MAEA,oBAAC,SAAI,WAAU,2EACZ,uBAAa;AAAA,QAAI,CAAC,MAAM,UACvB,SAAS,QACP;AAAA,UAAC;AAAA;AAAA,YAEC,WAAU;AAAA,YAEV,8BAAC,kBAAe,WAAU,WAAU;AAAA;AAAA,UAH/B,QAAQ,KAAK;AAAA,QAIpB,IAEA;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,SAAS,cAAc,YAAY;AAAA,YAC5C,MAAK;AAAA,YACL,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,UAAU;AAAA,YACV,WAAU;AAAA,YACV,gBAAc,SAAS,cAAc,SAAS;AAAA,YAE7C;AAAA;AAAA,UARI;AAAA,QASP;AAAA,MAEJ,GACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,cAAc,CAAC;AAAA,UAC3C,UAAU,eAAe,cAAc;AAAA,UACvC,WAAU;AAAA,UACV,cAAW;AAAA,UAEX,8BAAC,gBAAa,WAAU,WAAU;AAAA;AAAA,MACpC;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,513 @@
1
+ import {
2
+ useHasMounted
3
+ } from "./chunk-YSU4VWRD.js";
4
+ import {
5
+ cn
6
+ } from "./chunk-HCA5ODCD.js";
7
+
8
+ // src/autocomplete.tsx
9
+ import * as React from "react";
10
+ import { createPortal } from "react-dom";
11
+ import { Check, ChevronDown, Search, X } from "lucide-react";
12
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
+ var PREFERRED_LIST_HEIGHT = 224;
14
+ var MIN_LIST_HEIGHT = 120;
15
+ var VIEWPORT_MARGIN = 8;
16
+ var ANCHOR_GAP = 4;
17
+ function normalizeQuery(query) {
18
+ return query.trim().toLowerCase();
19
+ }
20
+ function filterOptions(options, query) {
21
+ const normalized = normalizeQuery(query);
22
+ if (!normalized) return options;
23
+ return options.filter(
24
+ (option) => option.label.toLowerCase().includes(normalized) || option.value.toLowerCase().includes(normalized)
25
+ );
26
+ }
27
+ function getOptionLabel(options, value) {
28
+ return options.find((option) => option.value === value)?.label ?? value;
29
+ }
30
+ function parseTagTokens(raw) {
31
+ const seen = /* @__PURE__ */ new Set();
32
+ const tokens = [];
33
+ for (const part of raw.split(/[\s,]+/)) {
34
+ const token = part.trim();
35
+ if (!token || seen.has(token)) continue;
36
+ seen.add(token);
37
+ tokens.push(token);
38
+ }
39
+ return tokens;
40
+ }
41
+ function Autocomplete(props) {
42
+ const {
43
+ options,
44
+ placeholder = "Search\u2026",
45
+ disabled = false,
46
+ className,
47
+ emptyMessage = "No results found",
48
+ id,
49
+ ariaLabel,
50
+ size = "default",
51
+ creatable = false,
52
+ clearable = true
53
+ } = props;
54
+ const multiple = props.multiple ?? false;
55
+ const singleValue = multiple ? void 0 : props.value;
56
+ const multipleValue = multiple ? props.value : void 0;
57
+ const selectedValues = React.useMemo(() => {
58
+ if (multiple) return multipleValue ?? [];
59
+ return singleValue ? [singleValue] : [];
60
+ }, [multiple, multipleValue, singleValue]);
61
+ const onSingleChange = !multiple ? props.onChange : void 0;
62
+ const onMultipleChange = multiple ? props.onChange : void 0;
63
+ const containerRef = React.useRef(null);
64
+ const dropdownRef = React.useRef(null);
65
+ const inputRef = React.useRef(null);
66
+ const listRef = React.useRef(null);
67
+ const ignoreBlurRef = React.useRef(false);
68
+ const mounted = useHasMounted();
69
+ const [open, setOpen] = React.useState(false);
70
+ const [position, setPosition] = React.useState(null);
71
+ const [query, setQuery] = React.useState("");
72
+ const [highlightedIndex, setHighlightedIndex] = React.useState(0);
73
+ const filteredOptions = React.useMemo(
74
+ () => filterOptions(options, query),
75
+ [options, query]
76
+ );
77
+ const safeHighlightedIndex = highlightedIndex >= filteredOptions.length ? Math.max(filteredOptions.length - 1, 0) : highlightedIndex;
78
+ const close = React.useCallback(() => {
79
+ setOpen(false);
80
+ setQuery("");
81
+ setHighlightedIndex(0);
82
+ }, []);
83
+ const openDropdown = React.useCallback(() => {
84
+ if (disabled) return;
85
+ setOpen(true);
86
+ setHighlightedIndex(0);
87
+ }, [disabled]);
88
+ const commitSingleValue = React.useCallback(
89
+ (value) => {
90
+ if (!multiple) {
91
+ onSingleChange?.(value);
92
+ close();
93
+ }
94
+ },
95
+ [close, multiple, onSingleChange]
96
+ );
97
+ const toggleMultipleValue = React.useCallback(
98
+ (value) => {
99
+ if (!multiple || !onMultipleChange) return;
100
+ onMultipleChange(
101
+ selectedValues.includes(value) ? selectedValues.filter((item) => item !== value) : [...selectedValues, value]
102
+ );
103
+ setQuery("");
104
+ setHighlightedIndex(0);
105
+ },
106
+ [multiple, onMultipleChange, selectedValues]
107
+ );
108
+ const commitCustomValues = React.useCallback(
109
+ (raw) => {
110
+ if (!creatable) return;
111
+ if (!multiple) {
112
+ const value = raw.trim();
113
+ if (!value) return;
114
+ commitSingleValue(value);
115
+ return;
116
+ }
117
+ if (!onMultipleChange) return;
118
+ const tokens = parseTagTokens(raw);
119
+ if (!tokens.length) return;
120
+ const next = [...selectedValues];
121
+ for (const token of tokens) {
122
+ if (!next.includes(token)) next.push(token);
123
+ }
124
+ onMultipleChange(next);
125
+ setQuery("");
126
+ setHighlightedIndex(0);
127
+ },
128
+ [commitSingleValue, creatable, multiple, onMultipleChange, selectedValues]
129
+ );
130
+ const removeValue = React.useCallback(
131
+ (value) => {
132
+ if (!multiple || !onMultipleChange) return;
133
+ onMultipleChange(selectedValues.filter((item) => item !== value));
134
+ window.requestAnimationFrame(() => inputRef.current?.focus());
135
+ },
136
+ [multiple, onMultipleChange, selectedValues]
137
+ );
138
+ const selectOption = React.useCallback(
139
+ (option) => {
140
+ if (option.disabled) return;
141
+ ignoreBlurRef.current = true;
142
+ window.setTimeout(() => {
143
+ ignoreBlurRef.current = false;
144
+ }, 0);
145
+ if (multiple) {
146
+ toggleMultipleValue(option.value);
147
+ window.requestAnimationFrame(() => inputRef.current?.focus());
148
+ return;
149
+ }
150
+ commitSingleValue(option.value);
151
+ },
152
+ [commitSingleValue, multiple, toggleMultipleValue]
153
+ );
154
+ const selectHighlighted = React.useCallback(() => {
155
+ const option = filteredOptions[safeHighlightedIndex];
156
+ if (!option) return;
157
+ selectOption(option);
158
+ }, [filteredOptions, safeHighlightedIndex, selectOption]);
159
+ React.useEffect(() => {
160
+ if (!open) return;
161
+ function handlePointerDown(event) {
162
+ const target = event.target;
163
+ if (containerRef.current?.contains(target) || dropdownRef.current?.contains(target)) {
164
+ return;
165
+ }
166
+ close();
167
+ }
168
+ document.addEventListener("pointerdown", handlePointerDown);
169
+ return () => document.removeEventListener("pointerdown", handlePointerDown);
170
+ }, [close, open]);
171
+ React.useLayoutEffect(() => {
172
+ if (!open) return;
173
+ const update = () => {
174
+ const anchor = containerRef.current;
175
+ if (!anchor) return;
176
+ const rect = anchor.getBoundingClientRect();
177
+ const below = window.innerHeight - rect.bottom - ANCHOR_GAP - VIEWPORT_MARGIN;
178
+ const above = rect.top - ANCHOR_GAP - VIEWPORT_MARGIN;
179
+ const flip = below < Math.min(PREFERRED_LIST_HEIGHT, MIN_LIST_HEIGHT) && above > below;
180
+ const room = flip ? above : below;
181
+ const width = Math.max(rect.width, size === "compact" ? 220 : 0);
182
+ const left = Math.max(
183
+ VIEWPORT_MARGIN,
184
+ Math.min(rect.left, window.innerWidth - width - VIEWPORT_MARGIN)
185
+ );
186
+ setPosition({
187
+ left,
188
+ width,
189
+ maxHeight: Math.max(
190
+ MIN_LIST_HEIGHT,
191
+ Math.min(PREFERRED_LIST_HEIGHT, room)
192
+ ),
193
+ ...flip ? { bottom: window.innerHeight - rect.top + ANCHOR_GAP } : { top: rect.bottom + ANCHOR_GAP }
194
+ });
195
+ };
196
+ update();
197
+ window.addEventListener("scroll", update, true);
198
+ window.addEventListener("resize", update);
199
+ return () => {
200
+ window.removeEventListener("scroll", update, true);
201
+ window.removeEventListener("resize", update);
202
+ };
203
+ }, [open, size]);
204
+ React.useEffect(() => {
205
+ if (!open || !listRef.current) return;
206
+ const highlighted = listRef.current.children[safeHighlightedIndex];
207
+ highlighted?.scrollIntoView({ block: "nearest" });
208
+ }, [safeHighlightedIndex, open]);
209
+ function handleInputKeyDown(event) {
210
+ if (disabled) return;
211
+ switch (event.key) {
212
+ case "ArrowDown":
213
+ event.preventDefault();
214
+ if (!open) {
215
+ openDropdown();
216
+ return;
217
+ }
218
+ setHighlightedIndex(
219
+ Math.min(safeHighlightedIndex + 1, filteredOptions.length - 1)
220
+ );
221
+ break;
222
+ case "ArrowUp":
223
+ event.preventDefault();
224
+ if (!open) {
225
+ openDropdown();
226
+ return;
227
+ }
228
+ setHighlightedIndex(Math.max(safeHighlightedIndex - 1, 0));
229
+ break;
230
+ case "Enter":
231
+ event.preventDefault();
232
+ if (creatable && query.trim()) {
233
+ if (multiple || filteredOptions.length === 0) {
234
+ commitCustomValues(query);
235
+ return;
236
+ }
237
+ }
238
+ if (!open) {
239
+ openDropdown();
240
+ return;
241
+ }
242
+ selectHighlighted();
243
+ break;
244
+ case ",":
245
+ if (creatable && multiple && query.trim()) {
246
+ event.preventDefault();
247
+ commitCustomValues(query);
248
+ }
249
+ break;
250
+ case "Escape":
251
+ event.preventDefault();
252
+ close();
253
+ break;
254
+ case "Backspace":
255
+ if (multiple && query.length === 0 && selectedValues.length > 0) {
256
+ event.preventDefault();
257
+ removeValue(selectedValues[selectedValues.length - 1]);
258
+ }
259
+ break;
260
+ case "Tab":
261
+ close();
262
+ break;
263
+ default:
264
+ break;
265
+ }
266
+ }
267
+ const displayValue = !multiple && !open && !query && selectedValues[0] ? getOptionLabel(options, selectedValues[0]) : query;
268
+ const inputPlaceholder = multiple && selectedValues.length > 0 ? "" : placeholder;
269
+ const createLabel = query.trim();
270
+ const canCreate = creatable && Boolean(createLabel) && !selectedValues.includes(createLabel);
271
+ const listboxId = id ? `${id}-listbox` : void 0;
272
+ return /* @__PURE__ */ jsxs(
273
+ "div",
274
+ {
275
+ ref: containerRef,
276
+ className: cn(
277
+ "relative",
278
+ size === "compact" ? "w-auto min-w-24" : "w-full",
279
+ className
280
+ ),
281
+ children: [
282
+ /* @__PURE__ */ jsxs(
283
+ "div",
284
+ {
285
+ className: cn(
286
+ "border-border bg-background flex w-full cursor-pointer items-center rounded-md border transition-colors",
287
+ "focus-within:border-ring focus-within:ring-ring/30 focus-within:ring-2",
288
+ size === "compact" ? "min-h-0 gap-0.5 border-transparent bg-transparent px-1 py-0.5 text-xs shadow-none" : "min-h-9 gap-1.5 px-2 py-1.5 text-sm shadow-sm",
289
+ disabled && "cursor-not-allowed opacity-50",
290
+ open && "border-ring ring-ring/30 ring-2"
291
+ ),
292
+ onPointerDown: (event) => {
293
+ if (disabled) return;
294
+ if (event.target.closest("[data-option]")) return;
295
+ if (event.target.closest("[data-chip-remove]"))
296
+ return;
297
+ if (!event.target.closest("input")) {
298
+ event.preventDefault();
299
+ inputRef.current?.focus();
300
+ }
301
+ openDropdown();
302
+ },
303
+ children: [
304
+ size === "compact" ? null : /* @__PURE__ */ jsx(Search, { className: "text-muted-foreground size-4 shrink-0" }),
305
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-1", children: [
306
+ multiple && selectedValues.map((value) => /* @__PURE__ */ jsxs(
307
+ "span",
308
+ {
309
+ className: "bg-primary/10 text-primary inline-flex max-w-full items-center gap-1 rounded-md px-2 py-0.5 text-xs font-medium",
310
+ children: [
311
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: getOptionLabel(options, value) }),
312
+ /* @__PURE__ */ jsx(
313
+ "button",
314
+ {
315
+ type: "button",
316
+ "data-chip-remove": true,
317
+ className: "text-primary/70 hover:bg-primary/15 hover:text-primary rounded-sm transition",
318
+ onPointerDown: (event) => {
319
+ event.preventDefault();
320
+ event.stopPropagation();
321
+ removeValue(value);
322
+ },
323
+ "aria-label": `Remove ${getOptionLabel(options, value)}`,
324
+ children: /* @__PURE__ */ jsx(X, { className: "size-3" })
325
+ }
326
+ )
327
+ ]
328
+ },
329
+ value
330
+ )),
331
+ /* @__PURE__ */ jsx(
332
+ "input",
333
+ {
334
+ ref: inputRef,
335
+ id,
336
+ type: "text",
337
+ role: "combobox",
338
+ "aria-label": ariaLabel,
339
+ "aria-expanded": open,
340
+ "aria-controls": listboxId,
341
+ "aria-autocomplete": "list",
342
+ disabled,
343
+ value: displayValue,
344
+ placeholder: inputPlaceholder,
345
+ className: cn(
346
+ "placeholder:text-muted-foreground flex-1 bg-transparent outline-none",
347
+ size === "compact" ? "min-w-0" : "min-w-[6rem]"
348
+ ),
349
+ onFocus: openDropdown,
350
+ onBlur: () => {
351
+ if (ignoreBlurRef.current) return;
352
+ close();
353
+ },
354
+ onChange: (event) => {
355
+ setQuery(event.target.value);
356
+ setHighlightedIndex(0);
357
+ if (!open) setOpen(true);
358
+ },
359
+ onKeyDown: handleInputKeyDown,
360
+ onPaste: (event) => {
361
+ if (!creatable || !multiple) return;
362
+ const text = event.clipboardData.getData("text");
363
+ if (!/[\s,]/.test(text)) return;
364
+ event.preventDefault();
365
+ commitCustomValues(text);
366
+ }
367
+ }
368
+ )
369
+ ] }),
370
+ clearable && !multiple && selectedValues[0] && !disabled && /* @__PURE__ */ jsx(
371
+ "button",
372
+ {
373
+ type: "button",
374
+ className: "text-muted-foreground hover:bg-muted hover:text-foreground rounded-sm p-0.5 transition",
375
+ onPointerDown: (event) => {
376
+ event.preventDefault();
377
+ event.stopPropagation();
378
+ onSingleChange?.("");
379
+ setQuery("");
380
+ inputRef.current?.focus();
381
+ },
382
+ "aria-label": "Clear selection",
383
+ children: /* @__PURE__ */ jsx(X, { className: "size-3.5" })
384
+ }
385
+ ),
386
+ /* @__PURE__ */ jsx(
387
+ ChevronDown,
388
+ {
389
+ className: cn(
390
+ "text-muted-foreground shrink-0 transition-transform",
391
+ size === "compact" ? "size-3" : "size-4",
392
+ open && "rotate-180"
393
+ )
394
+ }
395
+ )
396
+ ]
397
+ }
398
+ ),
399
+ open && mounted && position ? createPortal(
400
+ /* @__PURE__ */ jsx(
401
+ "div",
402
+ {
403
+ ref: dropdownRef,
404
+ "data-autocomplete-dropdown": true,
405
+ style: {
406
+ position: "fixed",
407
+ left: position.left,
408
+ width: position.width,
409
+ top: position.top,
410
+ bottom: position.bottom,
411
+ // Above the modal shell (z-100) it is usually opened inside.
412
+ zIndex: 200
413
+ },
414
+ className: "border-border bg-background overflow-hidden rounded-md border shadow-lg",
415
+ children: /* @__PURE__ */ jsx(
416
+ "ul",
417
+ {
418
+ ref: listRef,
419
+ id: listboxId,
420
+ role: "listbox",
421
+ "aria-multiselectable": multiple || void 0,
422
+ className: "overflow-y-auto p-1",
423
+ style: { maxHeight: position.maxHeight },
424
+ children: filteredOptions.length === 0 && !canCreate ? /* @__PURE__ */ jsx("li", { className: "text-muted-foreground px-3 py-6 text-center text-sm", children: emptyMessage }) : /* @__PURE__ */ jsxs(Fragment, { children: [
425
+ filteredOptions.map((option, index) => {
426
+ const isSelected = selectedValues.includes(option.value);
427
+ const isHighlighted = index === safeHighlightedIndex;
428
+ return /* @__PURE__ */ jsxs(
429
+ "li",
430
+ {
431
+ "data-option": true,
432
+ role: "option",
433
+ "aria-selected": isSelected,
434
+ "aria-disabled": option.disabled || void 0,
435
+ className: cn(
436
+ "flex cursor-pointer items-center gap-2 rounded-sm transition-colors",
437
+ size === "compact" ? "px-2 py-1 text-xs" : "px-2.5 py-2 text-sm",
438
+ isHighlighted && "bg-muted",
439
+ option.disabled && "cursor-not-allowed opacity-50"
440
+ ),
441
+ onMouseEnter: () => setHighlightedIndex(index),
442
+ onPointerDown: (event) => {
443
+ event.preventDefault();
444
+ event.stopPropagation();
445
+ selectOption(option);
446
+ },
447
+ children: [
448
+ multiple ? /* @__PURE__ */ jsx(
449
+ "span",
450
+ {
451
+ className: cn(
452
+ "border-border flex size-4 shrink-0 items-center justify-center rounded border",
453
+ isSelected && "border-primary bg-primary text-primary-foreground"
454
+ ),
455
+ children: isSelected ? /* @__PURE__ */ jsx(Check, { className: "size-3" }) : null
456
+ }
457
+ ) : /* @__PURE__ */ jsx(
458
+ Check,
459
+ {
460
+ className: cn(
461
+ "text-primary size-4 shrink-0",
462
+ isSelected ? "opacity-100" : "opacity-0"
463
+ )
464
+ }
465
+ ),
466
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: option.label })
467
+ ]
468
+ },
469
+ option.value
470
+ );
471
+ }),
472
+ canCreate ? /* @__PURE__ */ jsxs(
473
+ "li",
474
+ {
475
+ "data-option": true,
476
+ role: "option",
477
+ "aria-selected": false,
478
+ className: "hover:bg-muted flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-2 text-sm transition-colors",
479
+ onPointerDown: (event) => {
480
+ event.preventDefault();
481
+ event.stopPropagation();
482
+ ignoreBlurRef.current = true;
483
+ window.setTimeout(() => {
484
+ ignoreBlurRef.current = false;
485
+ }, 0);
486
+ commitCustomValues(query);
487
+ window.requestAnimationFrame(
488
+ () => inputRef.current?.focus()
489
+ );
490
+ },
491
+ children: [
492
+ "Add \u201C",
493
+ createLabel,
494
+ "\u201D"
495
+ ]
496
+ }
497
+ ) : null
498
+ ] })
499
+ }
500
+ )
501
+ }
502
+ ),
503
+ document.body
504
+ ) : null
505
+ ]
506
+ }
507
+ );
508
+ }
509
+
510
+ export {
511
+ Autocomplete
512
+ };
513
+ //# sourceMappingURL=chunk-PVK4WQJZ.js.map