@inshorts/glint-ui 0.5.4 → 0.6.1

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-5MEOZHJA.js +513 -0
  45. package/dist/chunk-5MEOZHJA.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-A6GRLKOO.js +85 -0
  49. package/dist/chunk-A6GRLKOO.js.map +1 -0
  50. package/dist/chunk-DS3QYIKL.js +90 -0
  51. package/dist/chunk-DS3QYIKL.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-ISPICB4W.js +70 -0
  67. package/dist/chunk-ISPICB4W.js.map +1 -0
  68. package/dist/chunk-JDE5XYPT.js +30 -0
  69. package/dist/chunk-JDE5XYPT.js.map +1 -0
  70. package/dist/chunk-JSJEEKR3.js +59 -0
  71. package/dist/chunk-JSJEEKR3.js.map +1 -0
  72. package/dist/chunk-KR3BCFP7.js +85 -0
  73. package/dist/chunk-KR3BCFP7.js.map +1 -0
  74. package/dist/chunk-MLRSOTFI.js +81 -0
  75. package/dist/chunk-MLRSOTFI.js.map +1 -0
  76. package/dist/chunk-MQT5RAQV.js +202 -0
  77. package/dist/chunk-MQT5RAQV.js.map +1 -0
  78. package/dist/chunk-MUPW2TFJ.js +102 -0
  79. package/dist/chunk-MUPW2TFJ.js.map +1 -0
  80. package/dist/chunk-OUYT6SPU.js +76 -0
  81. package/dist/chunk-OUYT6SPU.js.map +1 -0
  82. package/dist/chunk-PM2VE7DJ.js +100 -0
  83. package/dist/chunk-PM2VE7DJ.js.map +1 -0
  84. package/dist/chunk-PPYR3O3L.js +44 -0
  85. package/dist/chunk-PPYR3O3L.js.map +1 -0
  86. package/dist/chunk-PUTC52SI.js +98 -0
  87. package/dist/chunk-PUTC52SI.js.map +1 -0
  88. package/dist/chunk-PWAKTEXF.js +18 -0
  89. package/dist/chunk-PWAKTEXF.js.map +1 -0
  90. package/dist/chunk-QTFWORA7.js +26 -0
  91. package/dist/chunk-QTFWORA7.js.map +1 -0
  92. package/dist/chunk-RUPL2H6V.js +49 -0
  93. package/dist/chunk-RUPL2H6V.js.map +1 -0
  94. package/dist/chunk-S7PVZAPL.js +28 -0
  95. package/dist/chunk-S7PVZAPL.js.map +1 -0
  96. package/dist/chunk-SQDV2AKJ.js +49 -0
  97. package/dist/chunk-SQDV2AKJ.js.map +1 -0
  98. package/dist/chunk-T2KXVH3O.js +297 -0
  99. package/dist/chunk-T2KXVH3O.js.map +1 -0
  100. package/dist/chunk-T4WCCHJQ.js +29 -0
  101. package/dist/chunk-T4WCCHJQ.js.map +1 -0
  102. package/dist/chunk-UC3ZIQPE.js +93 -0
  103. package/dist/chunk-UC3ZIQPE.js.map +1 -0
  104. package/dist/chunk-UE7JY7VR.js +28 -0
  105. package/dist/chunk-UE7JY7VR.js.map +1 -0
  106. package/dist/chunk-Y5WCT6XN.js +93 -0
  107. package/dist/chunk-Y5WCT6XN.js.map +1 -0
  108. package/dist/chunk-YDICVETX.js +151 -0
  109. package/dist/chunk-YDICVETX.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 +3008 -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 +122 -0
  233. package/dist/segmented-control.cjs.map +1 -0
  234. package/dist/segmented-control.d.cts +58 -0
  235. package/dist/segmented-control.d.ts +58 -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 +391 -14
  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,9 @@
1
+ "use client";
2
+ import {
3
+ SegmentedControl
4
+ } from "./chunk-MLRSOTFI.js";
5
+ import "./chunk-HCA5ODCD.js";
6
+ export {
7
+ SegmentedControl
8
+ };
9
+ //# sourceMappingURL=segmented-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,648 @@
1
+ "use client";
2
+ "use strict";
3
+ "use client";
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __export = (target, all) => {
11
+ for (var name in all)
12
+ __defProp(target, name, { get: all[name], enumerable: true });
13
+ };
14
+ var __copyProps = (to, from, except, desc) => {
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from))
17
+ if (!__hasOwnProp.call(to, key) && key !== except)
18
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
19
+ }
20
+ return to;
21
+ };
22
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
+ // If the importer is in node compatibility mode or this is not an ESM
24
+ // file that has been converted to a CommonJS file using a Babel-
25
+ // compatible transform (i.e. "__esModule" has not been set), then set
26
+ // "default" to the CommonJS "module.exports" for node compatibility.
27
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
28
+ mod
29
+ ));
30
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
31
+
32
+ // src/select.tsx
33
+ var select_exports = {};
34
+ __export(select_exports, {
35
+ Select: () => Select
36
+ });
37
+ module.exports = __toCommonJS(select_exports);
38
+ var React3 = __toESM(require("react"), 1);
39
+
40
+ // src/autocomplete.tsx
41
+ var React2 = __toESM(require("react"), 1);
42
+ var import_react_dom2 = require("react-dom");
43
+ var import_lucide_react = require("lucide-react");
44
+
45
+ // src/modal.tsx
46
+ var React = __toESM(require("react"), 1);
47
+ var import_react_dom = require("react-dom");
48
+
49
+ // src/utils.ts
50
+ var import_clsx = require("clsx");
51
+ var import_tailwind_merge = require("tailwind-merge");
52
+ function cn(...inputs) {
53
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
54
+ }
55
+
56
+ // src/modal.tsx
57
+ var import_jsx_runtime = (
58
+ /*
59
+ `overflow-y-auto` on the overlay, `my-auto` on the panel — not
60
+ `items-center`. A flex item centred with `align-items` overflows equally
61
+ in both directions once it is taller than its container, and the half
62
+ above the top edge cannot be scrolled to: with the page behind it locked,
63
+ an over-tall dialog was simply unreachable at both ends. Auto margins
64
+ centre a short panel the same way and collapse to zero on a tall one,
65
+ which scrolls.
66
+ */
67
+ require("react/jsx-runtime")
68
+ );
69
+ var emptySubscribe = () => () => {
70
+ };
71
+ function useHasMounted() {
72
+ return React.useSyncExternalStore(
73
+ emptySubscribe,
74
+ () => true,
75
+ () => false
76
+ );
77
+ }
78
+
79
+ // src/autocomplete.tsx
80
+ var import_jsx_runtime2 = require("react/jsx-runtime");
81
+ var PREFERRED_LIST_HEIGHT = 224;
82
+ var MIN_LIST_HEIGHT = 120;
83
+ var VIEWPORT_MARGIN = 8;
84
+ var ANCHOR_GAP = 4;
85
+ function normalizeQuery(query) {
86
+ return query.trim().toLowerCase();
87
+ }
88
+ function filterOptions(options, query) {
89
+ const normalized = normalizeQuery(query);
90
+ if (!normalized) return options;
91
+ return options.filter(
92
+ (option) => option.label.toLowerCase().includes(normalized) || option.value.toLowerCase().includes(normalized)
93
+ );
94
+ }
95
+ function getOptionLabel(options, value) {
96
+ return options.find((option) => option.value === value)?.label ?? value;
97
+ }
98
+ function parseTagTokens(raw) {
99
+ const seen = /* @__PURE__ */ new Set();
100
+ const tokens = [];
101
+ for (const part of raw.split(/[\s,]+/)) {
102
+ const token = part.trim();
103
+ if (!token || seen.has(token)) continue;
104
+ seen.add(token);
105
+ tokens.push(token);
106
+ }
107
+ return tokens;
108
+ }
109
+ function Autocomplete(props) {
110
+ const {
111
+ options,
112
+ placeholder = "Search\u2026",
113
+ disabled = false,
114
+ className,
115
+ emptyMessage = "No results found",
116
+ id,
117
+ ariaLabel,
118
+ size = "default",
119
+ creatable = false,
120
+ clearable = true
121
+ } = props;
122
+ const multiple = props.multiple ?? false;
123
+ const singleValue = multiple ? void 0 : props.value;
124
+ const multipleValue = multiple ? props.value : void 0;
125
+ const selectedValues = React2.useMemo(() => {
126
+ if (multiple) return multipleValue ?? [];
127
+ return singleValue ? [singleValue] : [];
128
+ }, [multiple, multipleValue, singleValue]);
129
+ const onSingleChange = !multiple ? props.onChange : void 0;
130
+ const onMultipleChange = multiple ? props.onChange : void 0;
131
+ const containerRef = React2.useRef(null);
132
+ const dropdownRef = React2.useRef(null);
133
+ const inputRef = React2.useRef(null);
134
+ const listRef = React2.useRef(null);
135
+ const ignoreBlurRef = React2.useRef(false);
136
+ const mounted = useHasMounted();
137
+ const [open, setOpen] = React2.useState(false);
138
+ const [position, setPosition] = React2.useState(null);
139
+ const [query, setQuery] = React2.useState("");
140
+ const [highlightedIndex, setHighlightedIndex] = React2.useState(0);
141
+ const filteredOptions = React2.useMemo(
142
+ () => filterOptions(options, query),
143
+ [options, query]
144
+ );
145
+ const safeHighlightedIndex = highlightedIndex >= filteredOptions.length ? Math.max(filteredOptions.length - 1, 0) : highlightedIndex;
146
+ const close = React2.useCallback(() => {
147
+ setOpen(false);
148
+ setQuery("");
149
+ setHighlightedIndex(0);
150
+ }, []);
151
+ const openDropdown = React2.useCallback(() => {
152
+ if (disabled) return;
153
+ setOpen(true);
154
+ setHighlightedIndex(0);
155
+ }, [disabled]);
156
+ const commitSingleValue = React2.useCallback(
157
+ (value) => {
158
+ if (!multiple) {
159
+ onSingleChange?.(value);
160
+ close();
161
+ }
162
+ },
163
+ [close, multiple, onSingleChange]
164
+ );
165
+ const toggleMultipleValue = React2.useCallback(
166
+ (value) => {
167
+ if (!multiple || !onMultipleChange) return;
168
+ onMultipleChange(
169
+ selectedValues.includes(value) ? selectedValues.filter((item) => item !== value) : [...selectedValues, value]
170
+ );
171
+ setQuery("");
172
+ setHighlightedIndex(0);
173
+ },
174
+ [multiple, onMultipleChange, selectedValues]
175
+ );
176
+ const commitCustomValues = React2.useCallback(
177
+ (raw) => {
178
+ if (!creatable) return;
179
+ if (!multiple) {
180
+ const value = raw.trim();
181
+ if (!value) return;
182
+ commitSingleValue(value);
183
+ return;
184
+ }
185
+ if (!onMultipleChange) return;
186
+ const tokens = parseTagTokens(raw);
187
+ if (!tokens.length) return;
188
+ const next = [...selectedValues];
189
+ for (const token of tokens) {
190
+ if (!next.includes(token)) next.push(token);
191
+ }
192
+ onMultipleChange(next);
193
+ setQuery("");
194
+ setHighlightedIndex(0);
195
+ },
196
+ [commitSingleValue, creatable, multiple, onMultipleChange, selectedValues]
197
+ );
198
+ const removeValue = React2.useCallback(
199
+ (value) => {
200
+ if (!multiple || !onMultipleChange) return;
201
+ onMultipleChange(selectedValues.filter((item) => item !== value));
202
+ window.requestAnimationFrame(() => inputRef.current?.focus());
203
+ },
204
+ [multiple, onMultipleChange, selectedValues]
205
+ );
206
+ const selectOption = React2.useCallback(
207
+ (option) => {
208
+ if (option.disabled) return;
209
+ ignoreBlurRef.current = true;
210
+ window.setTimeout(() => {
211
+ ignoreBlurRef.current = false;
212
+ }, 0);
213
+ if (multiple) {
214
+ toggleMultipleValue(option.value);
215
+ window.requestAnimationFrame(() => inputRef.current?.focus());
216
+ return;
217
+ }
218
+ commitSingleValue(option.value);
219
+ },
220
+ [commitSingleValue, multiple, toggleMultipleValue]
221
+ );
222
+ const selectHighlighted = React2.useCallback(() => {
223
+ const option = filteredOptions[safeHighlightedIndex];
224
+ if (!option) return;
225
+ selectOption(option);
226
+ }, [filteredOptions, safeHighlightedIndex, selectOption]);
227
+ React2.useEffect(() => {
228
+ if (!open) return;
229
+ function handlePointerDown(event) {
230
+ const target = event.target;
231
+ if (containerRef.current?.contains(target) || dropdownRef.current?.contains(target)) {
232
+ return;
233
+ }
234
+ close();
235
+ }
236
+ document.addEventListener("pointerdown", handlePointerDown);
237
+ return () => document.removeEventListener("pointerdown", handlePointerDown);
238
+ }, [close, open]);
239
+ React2.useLayoutEffect(() => {
240
+ if (!open) return;
241
+ const update = () => {
242
+ const anchor = containerRef.current;
243
+ if (!anchor) return;
244
+ const rect = anchor.getBoundingClientRect();
245
+ const below = window.innerHeight - rect.bottom - ANCHOR_GAP - VIEWPORT_MARGIN;
246
+ const above = rect.top - ANCHOR_GAP - VIEWPORT_MARGIN;
247
+ const flip = below < Math.min(PREFERRED_LIST_HEIGHT, MIN_LIST_HEIGHT) && above > below;
248
+ const room = flip ? above : below;
249
+ const width = Math.max(rect.width, size === "compact" ? 220 : 0);
250
+ const left = Math.max(
251
+ VIEWPORT_MARGIN,
252
+ Math.min(rect.left, window.innerWidth - width - VIEWPORT_MARGIN)
253
+ );
254
+ setPosition({
255
+ left,
256
+ width,
257
+ maxHeight: Math.max(
258
+ MIN_LIST_HEIGHT,
259
+ Math.min(PREFERRED_LIST_HEIGHT, room)
260
+ ),
261
+ ...flip ? { bottom: window.innerHeight - rect.top + ANCHOR_GAP } : { top: rect.bottom + ANCHOR_GAP }
262
+ });
263
+ };
264
+ update();
265
+ window.addEventListener("scroll", update, true);
266
+ window.addEventListener("resize", update);
267
+ return () => {
268
+ window.removeEventListener("scroll", update, true);
269
+ window.removeEventListener("resize", update);
270
+ };
271
+ }, [open, size]);
272
+ React2.useEffect(() => {
273
+ if (!open || !listRef.current) return;
274
+ const highlighted = listRef.current.children[safeHighlightedIndex];
275
+ highlighted?.scrollIntoView({ block: "nearest" });
276
+ }, [safeHighlightedIndex, open]);
277
+ function handleInputKeyDown(event) {
278
+ if (disabled) return;
279
+ switch (event.key) {
280
+ case "ArrowDown":
281
+ event.preventDefault();
282
+ if (!open) {
283
+ openDropdown();
284
+ return;
285
+ }
286
+ setHighlightedIndex(
287
+ Math.min(safeHighlightedIndex + 1, filteredOptions.length - 1)
288
+ );
289
+ break;
290
+ case "ArrowUp":
291
+ event.preventDefault();
292
+ if (!open) {
293
+ openDropdown();
294
+ return;
295
+ }
296
+ setHighlightedIndex(Math.max(safeHighlightedIndex - 1, 0));
297
+ break;
298
+ case "Enter":
299
+ event.preventDefault();
300
+ if (creatable && query.trim()) {
301
+ if (multiple || filteredOptions.length === 0) {
302
+ commitCustomValues(query);
303
+ return;
304
+ }
305
+ }
306
+ if (!open) {
307
+ openDropdown();
308
+ return;
309
+ }
310
+ selectHighlighted();
311
+ break;
312
+ case ",":
313
+ if (creatable && multiple && query.trim()) {
314
+ event.preventDefault();
315
+ commitCustomValues(query);
316
+ }
317
+ break;
318
+ case "Escape":
319
+ event.preventDefault();
320
+ close();
321
+ break;
322
+ case "Backspace":
323
+ if (multiple && query.length === 0 && selectedValues.length > 0) {
324
+ event.preventDefault();
325
+ removeValue(selectedValues[selectedValues.length - 1]);
326
+ }
327
+ break;
328
+ case "Tab":
329
+ close();
330
+ break;
331
+ default:
332
+ break;
333
+ }
334
+ }
335
+ const displayValue = !multiple && !open && !query && selectedValues[0] ? getOptionLabel(options, selectedValues[0]) : query;
336
+ const inputPlaceholder = multiple && selectedValues.length > 0 ? "" : placeholder;
337
+ const createLabel = query.trim();
338
+ const canCreate = creatable && Boolean(createLabel) && !selectedValues.includes(createLabel);
339
+ const listboxId = id ? `${id}-listbox` : void 0;
340
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
341
+ "div",
342
+ {
343
+ ref: containerRef,
344
+ className: cn(
345
+ "relative",
346
+ size === "compact" ? "w-auto min-w-24" : "w-full",
347
+ className
348
+ ),
349
+ children: [
350
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
351
+ "div",
352
+ {
353
+ className: cn(
354
+ "border-border bg-background flex w-full cursor-pointer items-center rounded-md border transition-colors",
355
+ "focus-within:border-ring focus-within:ring-ring/30 focus-within:ring-2",
356
+ 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",
357
+ disabled && "cursor-not-allowed opacity-50",
358
+ open && "border-ring ring-ring/30 ring-2"
359
+ ),
360
+ onPointerDown: (event) => {
361
+ if (disabled) return;
362
+ if (event.target.closest("[data-option]")) return;
363
+ if (event.target.closest("[data-chip-remove]"))
364
+ return;
365
+ if (!event.target.closest("input")) {
366
+ event.preventDefault();
367
+ inputRef.current?.focus();
368
+ }
369
+ openDropdown();
370
+ },
371
+ children: [
372
+ size === "compact" ? null : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.Search, { className: "text-muted-foreground size-4 shrink-0" }),
373
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex min-w-0 flex-1 flex-wrap items-center gap-1", children: [
374
+ multiple && selectedValues.map((value) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
375
+ "span",
376
+ {
377
+ 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",
378
+ children: [
379
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "truncate", children: getOptionLabel(options, value) }),
380
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
381
+ "button",
382
+ {
383
+ type: "button",
384
+ "data-chip-remove": true,
385
+ className: "text-primary/70 hover:bg-primary/15 hover:text-primary rounded-sm transition",
386
+ onPointerDown: (event) => {
387
+ event.preventDefault();
388
+ event.stopPropagation();
389
+ removeValue(value);
390
+ },
391
+ "aria-label": `Remove ${getOptionLabel(options, value)}`,
392
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.X, { className: "size-3" })
393
+ }
394
+ )
395
+ ]
396
+ },
397
+ value
398
+ )),
399
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
400
+ "input",
401
+ {
402
+ ref: inputRef,
403
+ id,
404
+ type: "text",
405
+ role: "combobox",
406
+ "aria-label": ariaLabel,
407
+ "aria-expanded": open,
408
+ "aria-controls": listboxId,
409
+ "aria-autocomplete": "list",
410
+ disabled,
411
+ value: displayValue,
412
+ placeholder: inputPlaceholder,
413
+ className: cn(
414
+ "placeholder:text-muted-foreground flex-1 bg-transparent outline-none",
415
+ size === "compact" ? "min-w-0" : "min-w-[6rem]"
416
+ ),
417
+ onFocus: openDropdown,
418
+ onBlur: () => {
419
+ if (ignoreBlurRef.current) return;
420
+ close();
421
+ },
422
+ onChange: (event) => {
423
+ setQuery(event.target.value);
424
+ setHighlightedIndex(0);
425
+ if (!open) setOpen(true);
426
+ },
427
+ onKeyDown: handleInputKeyDown,
428
+ onPaste: (event) => {
429
+ if (!creatable || !multiple) return;
430
+ const text = event.clipboardData.getData("text");
431
+ if (!/[\s,]/.test(text)) return;
432
+ event.preventDefault();
433
+ commitCustomValues(text);
434
+ }
435
+ }
436
+ )
437
+ ] }),
438
+ clearable && !multiple && selectedValues[0] && !disabled && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
439
+ "button",
440
+ {
441
+ type: "button",
442
+ className: "text-muted-foreground hover:bg-muted hover:text-foreground rounded-sm p-0.5 transition",
443
+ onPointerDown: (event) => {
444
+ event.preventDefault();
445
+ event.stopPropagation();
446
+ onSingleChange?.("");
447
+ setQuery("");
448
+ inputRef.current?.focus();
449
+ },
450
+ "aria-label": "Clear selection",
451
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.X, { className: "size-3.5" })
452
+ }
453
+ ),
454
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
455
+ import_lucide_react.ChevronDown,
456
+ {
457
+ className: cn(
458
+ "text-muted-foreground shrink-0 transition-transform",
459
+ size === "compact" ? "size-3" : "size-4",
460
+ open && "rotate-180"
461
+ )
462
+ }
463
+ )
464
+ ]
465
+ }
466
+ ),
467
+ open && mounted && position ? (0, import_react_dom2.createPortal)(
468
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
469
+ "div",
470
+ {
471
+ ref: dropdownRef,
472
+ "data-autocomplete-dropdown": true,
473
+ style: {
474
+ position: "fixed",
475
+ left: position.left,
476
+ width: position.width,
477
+ top: position.top,
478
+ bottom: position.bottom,
479
+ // Above the modal shell (z-100) it is usually opened inside.
480
+ zIndex: 200
481
+ },
482
+ className: "border-border bg-background overflow-hidden rounded-md border shadow-lg",
483
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
484
+ "ul",
485
+ {
486
+ ref: listRef,
487
+ id: listboxId,
488
+ role: "listbox",
489
+ "aria-multiselectable": multiple || void 0,
490
+ className: "overflow-y-auto p-1",
491
+ style: { maxHeight: position.maxHeight },
492
+ children: filteredOptions.length === 0 && !canCreate ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("li", { className: "text-muted-foreground px-3 py-6 text-center text-sm", children: emptyMessage }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
493
+ filteredOptions.map((option, index) => {
494
+ const isSelected = selectedValues.includes(option.value);
495
+ const isHighlighted = index === safeHighlightedIndex;
496
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
497
+ "li",
498
+ {
499
+ "data-option": true,
500
+ role: "option",
501
+ "aria-selected": isSelected,
502
+ "aria-disabled": option.disabled || void 0,
503
+ className: cn(
504
+ "flex cursor-pointer items-center gap-2 rounded-sm transition-colors",
505
+ size === "compact" ? "px-2 py-1 text-xs" : "px-2.5 py-2 text-sm",
506
+ isHighlighted && "bg-muted",
507
+ option.disabled && "cursor-not-allowed opacity-50"
508
+ ),
509
+ onMouseEnter: () => setHighlightedIndex(index),
510
+ onPointerDown: (event) => {
511
+ event.preventDefault();
512
+ event.stopPropagation();
513
+ selectOption(option);
514
+ },
515
+ children: [
516
+ multiple ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
517
+ "span",
518
+ {
519
+ className: cn(
520
+ "border-border flex size-4 shrink-0 items-center justify-center rounded border",
521
+ isSelected && "border-primary bg-primary text-primary-foreground"
522
+ ),
523
+ children: isSelected ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.Check, { className: "size-3" }) : null
524
+ }
525
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
526
+ import_lucide_react.Check,
527
+ {
528
+ className: cn(
529
+ "text-primary size-4 shrink-0",
530
+ isSelected ? "opacity-100" : "opacity-0"
531
+ )
532
+ }
533
+ ),
534
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "truncate", children: option.label })
535
+ ]
536
+ },
537
+ option.value
538
+ );
539
+ }),
540
+ canCreate ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
541
+ "li",
542
+ {
543
+ "data-option": true,
544
+ role: "option",
545
+ "aria-selected": false,
546
+ className: "hover:bg-muted flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-2 text-sm transition-colors",
547
+ onPointerDown: (event) => {
548
+ event.preventDefault();
549
+ event.stopPropagation();
550
+ ignoreBlurRef.current = true;
551
+ window.setTimeout(() => {
552
+ ignoreBlurRef.current = false;
553
+ }, 0);
554
+ commitCustomValues(query);
555
+ window.requestAnimationFrame(
556
+ () => inputRef.current?.focus()
557
+ );
558
+ },
559
+ children: [
560
+ "Add \u201C",
561
+ createLabel,
562
+ "\u201D"
563
+ ]
564
+ }
565
+ ) : null
566
+ ] })
567
+ }
568
+ )
569
+ }
570
+ ),
571
+ document.body
572
+ ) : null
573
+ ]
574
+ }
575
+ );
576
+ }
577
+
578
+ // src/select.tsx
579
+ var import_jsx_runtime3 = require("react/jsx-runtime");
580
+ function optionText(node) {
581
+ if (node == null || typeof node === "boolean") return "";
582
+ if (typeof node === "string" || typeof node === "number") return String(node);
583
+ if (Array.isArray(node)) return node.map(optionText).join("");
584
+ if (React3.isValidElement(node)) {
585
+ return optionText(node.props.children);
586
+ }
587
+ return "";
588
+ }
589
+ function optionsFromChildren(children) {
590
+ const options = [];
591
+ React3.Children.forEach(children, (child) => {
592
+ if (!React3.isValidElement(child)) return;
593
+ if (child.type === React3.Fragment) {
594
+ options.push(
595
+ ...optionsFromChildren(
596
+ child.props.children
597
+ )
598
+ );
599
+ return;
600
+ }
601
+ const props = child.props;
602
+ const value = props.value == null ? "" : String(props.value);
603
+ options.push({
604
+ value,
605
+ label: optionText(props.children).trim() || value,
606
+ disabled: Boolean(props.disabled)
607
+ });
608
+ });
609
+ return options;
610
+ }
611
+ function Select({
612
+ id,
613
+ className,
614
+ disabled,
615
+ value,
616
+ placeholder,
617
+ children,
618
+ onChange,
619
+ size = "default",
620
+ "aria-label": ariaLabel
621
+ }) {
622
+ const options = optionsFromChildren(children);
623
+ const current = Array.isArray(value) ? String(value[0] ?? "") : value == null ? "" : String(value);
624
+ const blank = options.find((option) => option.value === "");
625
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
626
+ Autocomplete,
627
+ {
628
+ id,
629
+ className,
630
+ disabled: Boolean(disabled),
631
+ ariaLabel,
632
+ size,
633
+ options,
634
+ value: current,
635
+ clearable: false,
636
+ placeholder: placeholder ?? blank?.label ?? "Search\u2026",
637
+ onChange: (next) => onChange?.({
638
+ target: { value: next },
639
+ currentTarget: { value: next }
640
+ })
641
+ }
642
+ );
643
+ }
644
+ // Annotate the CommonJS export names for ESM import in node:
645
+ 0 && (module.exports = {
646
+ Select
647
+ });
648
+ //# sourceMappingURL=select.cjs.map