@avenue-ticketing/ui 0.4.0 → 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 (73) hide show
  1. package/dist/react/avatar.d.ts +42 -0
  2. package/dist/react/avatar.js +159 -0
  3. package/dist/react/avatar.js.map +1 -0
  4. package/dist/react/badge.d.ts +12 -0
  5. package/dist/react/badge.js +35 -1
  6. package/dist/react/badge.js.map +1 -1
  7. package/dist/react/button.d.ts +1 -1
  8. package/dist/react/button.js +3 -3
  9. package/dist/react/button.js.map +1 -1
  10. package/dist/react/calendar.d.ts +13 -0
  11. package/dist/react/calendar.js +4639 -0
  12. package/dist/react/calendar.js.map +1 -0
  13. package/dist/react/card.d.ts +11 -0
  14. package/dist/react/card.js +113 -0
  15. package/dist/react/card.js.map +1 -0
  16. package/dist/react/checkbox.d.ts +11 -0
  17. package/dist/react/checkbox.js +129 -0
  18. package/dist/react/checkbox.js.map +1 -0
  19. package/dist/react/datetime-picker.d.ts +21 -0
  20. package/dist/react/datetime-picker.js +6124 -0
  21. package/dist/react/datetime-picker.js.map +1 -0
  22. package/dist/react/dialog.js +1 -1
  23. package/dist/react/dialog.js.map +1 -1
  24. package/dist/react/dropdown.d.ts +34 -9
  25. package/dist/react/dropdown.js +295 -144
  26. package/dist/react/dropdown.js.map +1 -1
  27. package/dist/react/input.d.ts +7 -0
  28. package/dist/react/input.js +15 -2
  29. package/dist/react/input.js.map +1 -1
  30. package/dist/react/pagination.d.ts +28 -0
  31. package/dist/react/pagination.js +262 -0
  32. package/dist/react/pagination.js.map +1 -0
  33. package/dist/react/popover.d.ts +76 -0
  34. package/dist/react/popover.js +564 -0
  35. package/dist/react/popover.js.map +1 -0
  36. package/dist/react/scroll-header.js +13 -1
  37. package/dist/react/scroll-header.js.map +1 -1
  38. package/dist/react/scroll-wheel.d.ts +45 -0
  39. package/dist/react/scroll-wheel.js +557 -0
  40. package/dist/react/scroll-wheel.js.map +1 -0
  41. package/dist/react/select.d.ts +62 -0
  42. package/dist/react/select.js +889 -0
  43. package/dist/react/select.js.map +1 -0
  44. package/dist/react/sheet.js +1 -1
  45. package/dist/react/sheet.js.map +1 -1
  46. package/dist/react/switch.d.ts +38 -0
  47. package/dist/react/switch.js +117 -0
  48. package/dist/react/switch.js.map +1 -0
  49. package/dist/react/table-pagination.d.ts +15 -0
  50. package/dist/react/table-pagination.js +1153 -0
  51. package/dist/react/table-pagination.js.map +1 -0
  52. package/dist/react/table-view/column-menu.d.ts +15 -0
  53. package/dist/react/table-view/column-menu.js +955 -0
  54. package/dist/react/table-view/column-menu.js.map +1 -0
  55. package/dist/react/table-view/index.d.ts +70 -0
  56. package/dist/react/table-view/index.js +2190 -0
  57. package/dist/react/table-view/index.js.map +1 -0
  58. package/dist/react/table.d.ts +86 -0
  59. package/dist/react/table.js +414 -0
  60. package/dist/react/table.js.map +1 -0
  61. package/dist/react/tabs.d.ts +9 -3
  62. package/dist/react/tabs.js +204 -48
  63. package/dist/react/tabs.js.map +1 -1
  64. package/dist/react/textarea.d.ts +6 -0
  65. package/dist/react/textarea.js +33 -0
  66. package/dist/react/textarea.js.map +1 -0
  67. package/dist/react/time-picker.d.ts +22 -0
  68. package/dist/react/time-picker.js +856 -0
  69. package/dist/react/time-picker.js.map +1 -0
  70. package/dist/react/tooltip.d.ts +45 -0
  71. package/dist/react/tooltip.js +540 -0
  72. package/dist/react/tooltip.js.map +1 -0
  73. package/package.json +1 -1
@@ -0,0 +1,1153 @@
1
+ import { ChevronLeft, MoreHorizontal, ChevronRight, X, Loader2, ChevronDown, Check } from 'lucide-react';
2
+ import * as React2 from 'react';
3
+ import { useCallback, useState, useRef, useMemo, useLayoutEffect, useEffect } from 'react';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
+ import { createPortal } from 'react-dom';
8
+
9
+ function cn(...inputs) {
10
+ return twMerge(clsx(inputs));
11
+ }
12
+ var sizeClass = {
13
+ xs: "h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3",
14
+ default: "h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4",
15
+ lg: "h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5"
16
+ };
17
+ var iconOnlySizeClass = {
18
+ xs: "size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3",
19
+ default: "size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4",
20
+ lg: "size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5"
21
+ };
22
+ var roundedClass = {
23
+ full: "rounded-full",
24
+ lg: "rounded-lg",
25
+ md: "rounded-md"
26
+ };
27
+ var variantClass = {
28
+ primary: "bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85",
29
+ secondary: "bg-background text-primary border border-primary/10 hover:bg-primary/5",
30
+ destructive: "bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5",
31
+ success: "bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5"
32
+ };
33
+ var Button = React2.forwardRef(
34
+ ({
35
+ className,
36
+ type = "button",
37
+ variant = "secondary",
38
+ rounded: roundedProp,
39
+ size = "default",
40
+ iconOnly = false,
41
+ disabled,
42
+ ...props
43
+ }, ref) => {
44
+ const rounded = roundedProp ?? (iconOnly ? "md" : "full");
45
+ return /* @__PURE__ */ jsx(
46
+ "button",
47
+ {
48
+ type,
49
+ disabled,
50
+ "data-slot": "button",
51
+ "data-icon-only": iconOnly ? "" : void 0,
52
+ className: cn(
53
+ "inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none scale-100 transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] active:duration-100 active:ease-linear [&_svg]:pointer-events-none [&_svg]:shrink-0",
54
+ "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
55
+ "focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]",
56
+ iconOnly ? iconOnlySizeClass[size] : sizeClass[size],
57
+ roundedClass[rounded],
58
+ variantClass[variant],
59
+ className
60
+ ),
61
+ ref,
62
+ ...props
63
+ }
64
+ );
65
+ }
66
+ );
67
+ Button.displayName = "Button";
68
+ var PaginationInner = React2.forwardRef(
69
+ function Pagination({
70
+ meta,
71
+ onPageChange,
72
+ className,
73
+ maxVisibleButtons = 3,
74
+ disabled = false,
75
+ size = "default",
76
+ rounded = "full"
77
+ }, ref) {
78
+ const handlePageChange = React2.useCallback(
79
+ (page) => {
80
+ onPageChange?.(page);
81
+ },
82
+ [onPageChange]
83
+ );
84
+ const totalPages = React2.useMemo(() => {
85
+ const totalItems = Math.max(0, Number(meta.totalItems) || 0);
86
+ const itemsPerPage = Math.max(1, Number(meta.itemsPerPage) || 16);
87
+ if (meta.totalPages != null && Number.isFinite(meta.totalPages)) {
88
+ return Math.max(1, Math.floor(Number(meta.totalPages)));
89
+ }
90
+ return Math.max(1, Math.ceil(totalItems / itemsPerPage));
91
+ }, [meta.totalItems, meta.itemsPerPage, meta.totalPages]);
92
+ const currentPage = React2.useMemo(
93
+ () => Math.max(1, Number(meta.currentPage) || 1),
94
+ [meta.currentPage]
95
+ );
96
+ const { endPage, adjustedStart } = React2.useMemo(() => {
97
+ const sp = Math.max(1, currentPage - Math.floor(maxVisibleButtons / 2));
98
+ const ep = Math.min(totalPages, sp + maxVisibleButtons - 1);
99
+ const adj = ep - sp + 1 < maxVisibleButtons ? Math.max(1, ep - maxVisibleButtons + 1) : sp;
100
+ return { endPage: ep, adjustedStart: adj };
101
+ }, [currentPage, totalPages, maxVisibleButtons]);
102
+ const middlePageNumbers = React2.useMemo(
103
+ () => Array.from({ length: endPage - adjustedStart + 1 }, (_, i) => adjustedStart + i),
104
+ [endPage, adjustedStart]
105
+ );
106
+ const navButtonSize = React2.useMemo(
107
+ () => size === "xs" ? "default" : "lg",
108
+ [size]
109
+ );
110
+ const ellipsisClassName = React2.useMemo(
111
+ () => cn(
112
+ "inline-flex shrink-0 items-center justify-center",
113
+ navButtonSize === "lg" ? "size-11 min-h-11 min-w-11" : "size-10 min-h-10 min-w-10",
114
+ rounded === "full" ? "rounded-full" : rounded === "lg" ? "rounded-lg" : "rounded-md"
115
+ ),
116
+ [navButtonSize, rounded]
117
+ );
118
+ const gapIconClassName = React2.useMemo(
119
+ () => cn(
120
+ "mx-auto shrink-0 text-primary/45",
121
+ navButtonSize === "lg" ? "size-[18px]" : "size-4"
122
+ ),
123
+ [navButtonSize]
124
+ );
125
+ if (totalPages <= 1) return null;
126
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("flex w-full justify-center", className), children: /* @__PURE__ */ jsxs(
127
+ "nav",
128
+ {
129
+ role: "navigation",
130
+ "aria-label": "Pagination",
131
+ className: "text-primary flex items-center justify-center gap-0.5 text-base font-medium tabular-nums tracking-tight",
132
+ children: [
133
+ /* @__PURE__ */ jsx(
134
+ Button,
135
+ {
136
+ type: "button",
137
+ rounded,
138
+ iconOnly: true,
139
+ size: navButtonSize,
140
+ className: "border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0",
141
+ disabled: disabled || currentPage <= 1,
142
+ onClick: () => handlePageChange(currentPage - 1),
143
+ "aria-label": "Previous page",
144
+ children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": true, className: "size-5 shrink-0 mr-0.5" })
145
+ }
146
+ ),
147
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5", children: [
148
+ adjustedStart > 1 && /* @__PURE__ */ jsxs(Fragment, { children: [
149
+ currentPage === 1 ? /* @__PURE__ */ jsx(
150
+ Button,
151
+ {
152
+ type: "button",
153
+ variant: "primary",
154
+ rounded,
155
+ iconOnly: true,
156
+ size: navButtonSize,
157
+ className: "tracking-tight",
158
+ "aria-current": "page",
159
+ tabIndex: -1,
160
+ children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: 1 })
161
+ }
162
+ ) : /* @__PURE__ */ jsx(
163
+ Button,
164
+ {
165
+ type: "button",
166
+ rounded,
167
+ iconOnly: true,
168
+ size: navButtonSize,
169
+ className: "border-none tracking-tight",
170
+ disabled,
171
+ onClick: () => handlePageChange(1),
172
+ "aria-label": "Go to page 1",
173
+ children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: "1" })
174
+ }
175
+ ),
176
+ adjustedStart > 2 && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: ellipsisClassName, children: /* @__PURE__ */ jsx(MoreHorizontal, { className: gapIconClassName, "aria-hidden": true }) })
177
+ ] }),
178
+ middlePageNumbers.map(
179
+ (page) => currentPage === page ? /* @__PURE__ */ jsx(
180
+ Button,
181
+ {
182
+ type: "button",
183
+ variant: "primary",
184
+ rounded,
185
+ iconOnly: true,
186
+ size: navButtonSize,
187
+ className: "tracking-tight",
188
+ "aria-current": "page",
189
+ tabIndex: -1,
190
+ children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: page })
191
+ },
192
+ page
193
+ ) : /* @__PURE__ */ jsx(
194
+ Button,
195
+ {
196
+ type: "button",
197
+ rounded,
198
+ iconOnly: true,
199
+ size: navButtonSize,
200
+ className: "border-none tracking-tight",
201
+ disabled,
202
+ onClick: () => handlePageChange(page),
203
+ "aria-label": `Go to page ${page}`,
204
+ children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: page })
205
+ },
206
+ page
207
+ )
208
+ ),
209
+ endPage < totalPages && /* @__PURE__ */ jsxs(Fragment, { children: [
210
+ endPage < totalPages - 1 && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: ellipsisClassName, children: /* @__PURE__ */ jsx(MoreHorizontal, { className: gapIconClassName, "aria-hidden": true }) }),
211
+ currentPage === totalPages ? /* @__PURE__ */ jsx(
212
+ Button,
213
+ {
214
+ type: "button",
215
+ variant: "primary",
216
+ rounded,
217
+ iconOnly: true,
218
+ size: navButtonSize,
219
+ className: "tracking-tight",
220
+ "aria-current": "page",
221
+ tabIndex: -1,
222
+ children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: totalPages })
223
+ }
224
+ ) : /* @__PURE__ */ jsx(
225
+ Button,
226
+ {
227
+ type: "button",
228
+ rounded,
229
+ iconOnly: true,
230
+ size: navButtonSize,
231
+ className: "border-none tracking-tight",
232
+ disabled,
233
+ onClick: () => handlePageChange(totalPages),
234
+ "aria-label": `Go to page ${totalPages}`,
235
+ children: /* @__PURE__ */ jsx("span", { className: "tabular-nums", children: totalPages })
236
+ }
237
+ )
238
+ ] })
239
+ ] }),
240
+ /* @__PURE__ */ jsx(
241
+ Button,
242
+ {
243
+ type: "button",
244
+ rounded,
245
+ iconOnly: true,
246
+ size: navButtonSize,
247
+ className: "border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0",
248
+ disabled: disabled || currentPage >= totalPages,
249
+ onClick: () => handlePageChange(currentPage + 1),
250
+ "aria-label": "Next page",
251
+ children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": true, className: "size-5 shrink-0 ml-0.5" })
252
+ }
253
+ )
254
+ ]
255
+ }
256
+ ) });
257
+ }
258
+ );
259
+ PaginationInner.displayName = "Pagination";
260
+ var Pagination2 = React2.memo(PaginationInner);
261
+ var PANEL_OPEN_EASING = "cubic-bezier(0,0.55,0.45,1)";
262
+ var PANEL_CLOSE_EASING = "cubic-bezier(0.55,0,1,0.45)";
263
+ var MOBILE_SHEET_MAX_PX = 1024;
264
+ var MOBILE_SHEET_MS = 175;
265
+ var MOBILE_SHEET_IN = "cubic-bezier(0.85, 0, 0.15, 1)";
266
+ var MOBILE_SHEET_OUT = "cubic-bezier(0.85, 0, 1, 0.15)";
267
+ var SLIDE_DEFAULT_PX = 120;
268
+ var SHEET_MENU_TEXT = "max-[1024px]:text-base";
269
+ var SHEET_MENU_SHORTCUT = "max-[1024px]:text-sm";
270
+ var CONTENT_ORIGIN = {
271
+ bottom: "top center",
272
+ top: "bottom center",
273
+ left: "right center",
274
+ right: "left center"
275
+ };
276
+ var CONTENT_HIDDEN = {
277
+ bottom: "translateY(-4px) scale(0.97)",
278
+ top: "translateY(4px) scale(0.97)",
279
+ left: "translateX(4px) scale(0.97)",
280
+ right: "translateX(-4px) scale(0.97)"
281
+ };
282
+ function computeMenuPosition(trigger, menu, side, align, offset, pad) {
283
+ const tr = trigger.getBoundingClientRect();
284
+ const mr = menu.getBoundingClientRect();
285
+ const vh = window.innerHeight;
286
+ const vw = window.innerWidth;
287
+ const sx = window.scrollX;
288
+ const sy = window.scrollY;
289
+ let top = 0;
290
+ let left = 0;
291
+ let effectiveSide = side;
292
+ const place = (s) => {
293
+ switch (s) {
294
+ case "bottom":
295
+ top = tr.bottom + sy + offset;
296
+ if (align === "start") left = tr.left + sx;
297
+ else if (align === "end") left = tr.right + sx - mr.width;
298
+ else left = tr.left + sx + tr.width / 2 - mr.width / 2;
299
+ break;
300
+ case "top":
301
+ top = tr.top + sy - mr.height - offset;
302
+ if (align === "start") left = tr.left + sx;
303
+ else if (align === "end") left = tr.right + sx - mr.width;
304
+ else left = tr.left + sx + tr.width / 2 - mr.width / 2;
305
+ break;
306
+ case "right":
307
+ left = tr.right + sx + offset;
308
+ if (align === "start") top = tr.top + sy;
309
+ else if (align === "end") top = tr.bottom + sy - mr.height;
310
+ else top = tr.top + sy + tr.height / 2 - mr.height / 2;
311
+ break;
312
+ case "left":
313
+ left = tr.left + sx - mr.width - offset;
314
+ if (align === "start") top = tr.top + sy;
315
+ else if (align === "end") top = tr.bottom + sy - mr.height;
316
+ else top = tr.top + sy + tr.height / 2 - mr.height / 2;
317
+ break;
318
+ }
319
+ };
320
+ place(side);
321
+ if (side === "bottom" && top + mr.height > vh + sy - pad) {
322
+ const flip = tr.top + sy - mr.height - offset;
323
+ if (flip >= sy + pad) {
324
+ effectiveSide = "top";
325
+ top = flip;
326
+ }
327
+ } else if (side === "top" && top < sy + pad) {
328
+ const flip = tr.bottom + sy + offset;
329
+ if (flip + mr.height <= vh + sy - pad) {
330
+ effectiveSide = "bottom";
331
+ top = flip;
332
+ }
333
+ } else if (side === "right" && left + mr.width > vw + sx - pad) {
334
+ const flip = tr.left + sx - mr.width - offset;
335
+ if (flip >= sx + pad) {
336
+ effectiveSide = "left";
337
+ left = flip;
338
+ }
339
+ } else if (side === "left" && left < sx + pad) {
340
+ const flip = tr.right + sx + offset;
341
+ if (flip + mr.width <= vw + sx - pad) {
342
+ effectiveSide = "right";
343
+ left = flip;
344
+ }
345
+ }
346
+ left = Math.max(sx + pad, Math.min(left, vw + sx - mr.width - pad));
347
+ top = Math.max(sy + pad, Math.min(top, vh + sy - mr.height - pad));
348
+ return { top, left, side: effectiveSide };
349
+ }
350
+ function useNarrowSheetViewport(breakpoint = 1025) {
351
+ const [narrow, setNarrow] = useState(false);
352
+ useEffect(() => {
353
+ const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);
354
+ setNarrow(mq.matches);
355
+ const h = (e) => setNarrow(e.matches);
356
+ mq.addEventListener("change", h);
357
+ return () => mq.removeEventListener("change", h);
358
+ }, [breakpoint]);
359
+ return narrow;
360
+ }
361
+ function plainTextFromNode(node) {
362
+ if (node == null || node === false || node === true) return "";
363
+ if (typeof node === "string" || typeof node === "number")
364
+ return String(node);
365
+ if (Array.isArray(node)) return node.map(plainTextFromNode).join("");
366
+ if (React2.isValidElement(node)) {
367
+ return plainTextFromNode(
368
+ node.props.children
369
+ );
370
+ }
371
+ return "";
372
+ }
373
+ var ValueContext = React2.createContext(null);
374
+ function useSelectValue() {
375
+ const c = React2.useContext(ValueContext);
376
+ if (!c) throw new Error("Select subcomponents must be used within <Select>");
377
+ return c;
378
+ }
379
+ var OpenContext = React2.createContext(null);
380
+ function useSelectOpen() {
381
+ const c = React2.useContext(OpenContext);
382
+ if (!c)
383
+ throw new Error(
384
+ "Select.Trigger, SelectContent, and SelectItem need <Select> without native"
385
+ );
386
+ return c;
387
+ }
388
+ var Select = ({
389
+ children,
390
+ className,
391
+ value: valueProp,
392
+ defaultValue = "",
393
+ onValueChange,
394
+ native: nativeProp = false,
395
+ disabled = false,
396
+ name,
397
+ id: idAttr,
398
+ placeholder = "Select",
399
+ open: openProp,
400
+ onOpenChange
401
+ }) => {
402
+ const isValueControlled = valueProp !== void 0;
403
+ const [internalValue, setInternalValue] = useState(defaultValue);
404
+ const value = isValueControlled ? valueProp : internalValue;
405
+ const [labels, setLabels] = useState({});
406
+ const [nativeMeta, setNativeMeta] = useState({});
407
+ const [nativeOrder, setNativeOrder] = useState([]);
408
+ const setValue = useCallback(
409
+ (v) => {
410
+ if (!isValueControlled) setInternalValue(v);
411
+ onValueChange?.(v);
412
+ },
413
+ [isValueControlled, onValueChange]
414
+ );
415
+ const setLabel = useCallback((v, n) => {
416
+ setLabels((p) => p[v] === n ? p : { ...p, [v]: n });
417
+ }, []);
418
+ const clearLabel = useCallback((v) => {
419
+ setLabels((p) => {
420
+ if (!(v in p)) return p;
421
+ const n = { ...p };
422
+ delete n[v];
423
+ return n;
424
+ });
425
+ }, []);
426
+ const labelsRef = useRef(labels);
427
+ labelsRef.current = labels;
428
+ const labelFor = useCallback(
429
+ (v) => labelsRef.current[v],
430
+ []
431
+ );
432
+ const registerNativeItem = useCallback(
433
+ (e) => {
434
+ setLabel(e.value, e.label);
435
+ setNativeMeta((p) => ({ ...p, [e.value]: { label: e.label, disabled: e.disabled } }));
436
+ setNativeOrder((o) => o.includes(e.value) ? o : [...o, e.value]);
437
+ },
438
+ [setLabel]
439
+ );
440
+ const unregisterNativeItem = useCallback(
441
+ (v) => {
442
+ setNativeMeta((p) => {
443
+ if (!(v in p)) return p;
444
+ const n = { ...p };
445
+ delete n[v];
446
+ return n;
447
+ });
448
+ setNativeOrder((o) => o.filter((x) => x !== v));
449
+ clearLabel(v);
450
+ },
451
+ [clearLabel]
452
+ );
453
+ const valueCtx = useMemo(
454
+ () => ({
455
+ native: nativeProp,
456
+ value,
457
+ setValue,
458
+ disabled,
459
+ setLabel,
460
+ clearLabel,
461
+ registerNativeItem,
462
+ unregisterNativeItem,
463
+ labelFor,
464
+ placeholder
465
+ }),
466
+ [
467
+ nativeProp,
468
+ value,
469
+ setValue,
470
+ disabled,
471
+ labels,
472
+ setLabel,
473
+ clearLabel,
474
+ registerNativeItem,
475
+ unregisterNativeItem,
476
+ labelFor,
477
+ placeholder
478
+ ]
479
+ );
480
+ if (nativeProp) {
481
+ return /* @__PURE__ */ jsxs(ValueContext.Provider, { value: valueCtx, children: [
482
+ /* @__PURE__ */ jsxs(
483
+ "div",
484
+ {
485
+ className: cn(
486
+ "group relative inline-block w-max min-w-0 max-w-full",
487
+ className
488
+ ),
489
+ children: [
490
+ /* @__PURE__ */ jsxs(
491
+ "select",
492
+ {
493
+ id: idAttr,
494
+ name,
495
+ className: cn(
496
+ "peer",
497
+ "border-primary/10 bg-background text-primary w-full min-w-0 max-w-full cursor-pointer appearance-none border pr-9 pl-3 outline-none",
498
+ "h-10 min-h-10 text-sm font-medium",
499
+ "rounded-full transition-[color,background-color,box-shadow,transform] duration-150",
500
+ "focus-visible:ring-ring/50 focus-visible:ring-[3px]",
501
+ "active:scale-[0.99]",
502
+ "disabled:cursor-not-allowed disabled:opacity-50"
503
+ ),
504
+ value,
505
+ disabled,
506
+ onChange: (ev) => setValue(ev.target.value),
507
+ children: [
508
+ /* @__PURE__ */ jsx("option", { value: "", disabled: true, children: placeholder }),
509
+ nativeOrder.map((key) => {
510
+ const m = nativeMeta[key];
511
+ if (!m) return null;
512
+ return /* @__PURE__ */ jsx("option", { value: key, disabled: m.disabled, children: plainTextFromNode(m.label) }, key);
513
+ })
514
+ ]
515
+ }
516
+ ),
517
+ /* @__PURE__ */ jsx(
518
+ ChevronDown,
519
+ {
520
+ "aria-hidden": true,
521
+ className: "text-primary/50 pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 peer-disabled:opacity-50"
522
+ }
523
+ )
524
+ ]
525
+ }
526
+ ),
527
+ children
528
+ ] });
529
+ }
530
+ return /* @__PURE__ */ jsx(ValueContext.Provider, { value: valueCtx, children: /* @__PURE__ */ jsx(SelectOpenBridge, { open: openProp, onOpenChange, children: /* @__PURE__ */ jsx("div", { className: cn("inline-block min-w-0 max-w-full", className), children }) }) });
531
+ };
532
+ function SelectOpenBridge({
533
+ children,
534
+ open: controlled,
535
+ onOpenChange
536
+ }) {
537
+ const [inner, setInner] = useState(false);
538
+ const isControlled = controlled !== void 0;
539
+ const open = isControlled ? controlled : inner;
540
+ const setOpen = useCallback(
541
+ (o) => {
542
+ if (!isControlled) setInner(o);
543
+ onOpenChange?.(o);
544
+ },
545
+ [isControlled, onOpenChange]
546
+ );
547
+ const triggerRef = useRef(null);
548
+ const ctx = useMemo(
549
+ () => ({ open, setOpen, triggerRef }),
550
+ [open, setOpen]
551
+ );
552
+ return /* @__PURE__ */ jsx(OpenContext.Provider, { value: ctx, children });
553
+ }
554
+ var SheetClose = React2.forwardRef(({ className, type = "button", ...p }, ref) => /* @__PURE__ */ jsxs(
555
+ "button",
556
+ {
557
+ ref,
558
+ type,
559
+ className: cn(
560
+ "z-100 flex size-12 shrink-0 cursor-pointer items-center justify-center rounded-full transition-all hover:bg-secondary-background active:scale-[0.96]",
561
+ className
562
+ ),
563
+ ...p,
564
+ children: [
565
+ /* @__PURE__ */ jsx(X, { className: "size-5.5" }),
566
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
567
+ ]
568
+ }
569
+ ));
570
+ SheetClose.displayName = "SelectSheetClose";
571
+ function resolveSheetOpts(o) {
572
+ return {
573
+ sheet: o?.sheet ?? true,
574
+ title: o?.title,
575
+ panelClass: o?.className,
576
+ bodyClass: o?.contentClassName
577
+ };
578
+ }
579
+ function MobileSheetPortal({
580
+ open,
581
+ isAnimating,
582
+ slideEntrance,
583
+ slideOffsetPx,
584
+ sheetTitle,
585
+ sheetPanelClassName,
586
+ contentClassName,
587
+ onRequestClose,
588
+ menuRef,
589
+ children,
590
+ className,
591
+ style,
592
+ ...rest
593
+ }) {
594
+ const ease = open ? MOBILE_SHEET_IN : MOBILE_SHEET_OUT;
595
+ const hiddenY = slideEntrance ? `translateY(${slideOffsetPx}px)` : "translateY(100%)";
596
+ return createPortal(
597
+ /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex items-end justify-center p-0", children: [
598
+ /* @__PURE__ */ jsx(
599
+ "div",
600
+ {
601
+ className: cn(
602
+ "fixed inset-0 bg-black/40 dark:bg-black/60",
603
+ isAnimating ? "opacity-100" : "opacity-0"
604
+ ),
605
+ style: {
606
+ transition: `opacity ${MOBILE_SHEET_MS}ms ${ease}`
607
+ },
608
+ onClick: onRequestClose
609
+ }
610
+ ),
611
+ /* @__PURE__ */ jsxs(
612
+ "div",
613
+ {
614
+ ...rest,
615
+ ref: menuRef,
616
+ className: cn(
617
+ "bg-background border-primary/10 relative z-10 flex w-full max-h-[min(90dvh,calc(100dvh-env(safe-area-inset-bottom,0px)))] flex-col overflow-hidden shadow-2xl outline-none",
618
+ "rounded-t-2xl rounded-b-none border-x-0 border-b-0 border-t",
619
+ sheetPanelClassName,
620
+ className
621
+ ),
622
+ style: {
623
+ transform: isAnimating ? "translateY(0)" : hiddenY,
624
+ opacity: isAnimating ? 1 : 0,
625
+ transition: `transform ${MOBILE_SHEET_MS}ms ${ease}, opacity ${MOBILE_SHEET_MS}ms ${ease}`,
626
+ ...style
627
+ },
628
+ children: [
629
+ /* @__PURE__ */ jsxs(
630
+ "div",
631
+ {
632
+ className: cn(
633
+ "flex w-full shrink-0 items-center py-2 pl-4 pr-2",
634
+ sheetTitle ? "justify-between gap-3" : "justify-end"
635
+ ),
636
+ children: [
637
+ sheetTitle ? /* @__PURE__ */ jsx("p", { className: "text-foreground min-w-0 flex-1 truncate text-base font-semibold", children: sheetTitle }) : null,
638
+ /* @__PURE__ */ jsx(
639
+ SheetClose,
640
+ {
641
+ onClick: (e) => {
642
+ e.stopPropagation();
643
+ onRequestClose();
644
+ }
645
+ }
646
+ )
647
+ ]
648
+ }
649
+ ),
650
+ /* @__PURE__ */ jsx(
651
+ "div",
652
+ {
653
+ className: cn(
654
+ "min-h-0 flex-1 overflow-y-auto pb-[calc(5rem+env(safe-area-inset-bottom,0px))]",
655
+ contentClassName
656
+ ),
657
+ children
658
+ }
659
+ )
660
+ ]
661
+ }
662
+ )
663
+ ] }),
664
+ document.body
665
+ );
666
+ }
667
+ function listFocusableItems(host) {
668
+ return Array.from(
669
+ host.querySelectorAll(
670
+ '[data-select-item="true"]:not([aria-disabled="true"])'
671
+ )
672
+ );
673
+ }
674
+ var SelectContent = ({
675
+ children,
676
+ side = "bottom",
677
+ align = "start",
678
+ offset = 10,
679
+ duration = 80,
680
+ viewportPadding = 8,
681
+ closeOnEscape = true,
682
+ minWidth = "trigger",
683
+ loop = true,
684
+ mobileOptions,
685
+ slideEntrance = true,
686
+ slideEntranceOffsetPx: slidePxProp,
687
+ className,
688
+ style,
689
+ ...rest
690
+ }) => {
691
+ const narrow = useNarrowSheetViewport(MOBILE_SHEET_MAX_PX + 1);
692
+ const { open, setOpen, triggerRef } = useSelectOpen();
693
+ const [show, setShow] = useState(false);
694
+ const [anim, setAnim] = useState(false);
695
+ const [pos, setPos] = useState({ top: -9999, left: -9999, side });
696
+ const [triggerW, setTriggerW] = useState(0);
697
+ const menuRef = useRef(null);
698
+ const sheet = useMemo(() => resolveSheetOpts(mobileOptions), [mobileOptions]);
699
+ const slidePx = slidePxProp ?? SLIDE_DEFAULT_PX;
700
+ const closeMs = narrow && sheet.sheet ? MOBILE_SHEET_MS : duration;
701
+ const close = useCallback(() => setOpen(false), [setOpen]);
702
+ const [portalReady, setPortalReady] = useState(false);
703
+ useLayoutEffect(() => {
704
+ setPortalReady(true);
705
+ }, []);
706
+ useEffect(() => {
707
+ if (open) {
708
+ setShow(true);
709
+ } else {
710
+ setAnim(false);
711
+ const t = setTimeout(() => setShow(false), closeMs);
712
+ return () => clearTimeout(t);
713
+ }
714
+ }, [open, closeMs]);
715
+ useEffect(() => {
716
+ if (!show || !open) return;
717
+ let r2 = 0;
718
+ const r1 = requestAnimationFrame(() => {
719
+ r2 = requestAnimationFrame(() => setAnim(true));
720
+ });
721
+ return () => {
722
+ cancelAnimationFrame(r1);
723
+ if (r2) cancelAnimationFrame(r2);
724
+ };
725
+ }, [show, open]);
726
+ useLayoutEffect(() => {
727
+ if (!triggerRef.current || !menuRef.current) return;
728
+ if (!open && !show) return;
729
+ const run = () => {
730
+ if (!triggerRef.current || !menuRef.current) return;
731
+ setTriggerW(triggerRef.current.getBoundingClientRect().width);
732
+ setPos(
733
+ computeMenuPosition(
734
+ triggerRef.current,
735
+ menuRef.current,
736
+ side,
737
+ align,
738
+ offset,
739
+ viewportPadding
740
+ )
741
+ );
742
+ };
743
+ run();
744
+ window.addEventListener("resize", run);
745
+ window.addEventListener("scroll", run, true);
746
+ return () => {
747
+ window.removeEventListener("resize", run);
748
+ window.removeEventListener("scroll", run, true);
749
+ };
750
+ }, [open, show, side, align, offset, viewportPadding, triggerRef]);
751
+ useEffect(() => {
752
+ if (anim && menuRef.current) menuRef.current.focus();
753
+ }, [anim]);
754
+ useEffect(() => {
755
+ if (!open) return;
756
+ const onDoc = (e) => {
757
+ const t = e.target;
758
+ if (menuRef.current?.contains(t) || triggerRef.current?.contains(t)) return;
759
+ setOpen(false);
760
+ };
761
+ document.addEventListener("mousedown", onDoc);
762
+ return () => document.removeEventListener("mousedown", onDoc);
763
+ }, [open, setOpen, triggerRef]);
764
+ useEffect(() => {
765
+ if (!open) return;
766
+ const onKey = (e) => {
767
+ const m = menuRef.current;
768
+ if (!m) return;
769
+ const active = document.activeElement;
770
+ if (active && !m.contains(active) && !triggerRef.current?.contains(active))
771
+ return;
772
+ const items = listFocusableItems(m);
773
+ const i = items.indexOf(active);
774
+ switch (e.key) {
775
+ case "Escape":
776
+ if (closeOnEscape) {
777
+ e.preventDefault();
778
+ setOpen(false);
779
+ triggerRef.current?.focus();
780
+ }
781
+ break;
782
+ case "ArrowDown":
783
+ e.preventDefault();
784
+ if (!items.length) break;
785
+ if (i === -1 || i === items.length - 1 && loop) items[0]?.focus();
786
+ else if (i < items.length - 1) items[i + 1]?.focus();
787
+ break;
788
+ case "ArrowUp":
789
+ e.preventDefault();
790
+ if (!items.length) break;
791
+ if (i <= 0 && loop) items[items.length - 1]?.focus();
792
+ else if (i > 0) items[i - 1]?.focus();
793
+ break;
794
+ case "Home":
795
+ e.preventDefault();
796
+ items[0]?.focus();
797
+ break;
798
+ case "End":
799
+ e.preventDefault();
800
+ items[items.length - 1]?.focus();
801
+ break;
802
+ case "Tab":
803
+ setOpen(false);
804
+ break;
805
+ }
806
+ };
807
+ window.addEventListener("keydown", onKey);
808
+ return () => window.removeEventListener("keydown", onKey);
809
+ }, [open, closeOnEscape, loop, setOpen, triggerRef]);
810
+ const lockBodyScroll = (open || show) && narrow && sheet.sheet;
811
+ useEffect(() => {
812
+ if (!lockBodyScroll) return;
813
+ const prev = document.body.style.overflow;
814
+ document.body.style.overflow = "hidden";
815
+ return () => {
816
+ document.body.style.overflow = prev;
817
+ };
818
+ }, [lockBodyScroll]);
819
+ if (narrow && sheet.sheet) {
820
+ if (!open && !show) {
821
+ const registrationSlot = /* @__PURE__ */ jsx("div", { className: "sr-only pointer-events-none", "aria-hidden": true, children });
822
+ if (!portalReady) return registrationSlot;
823
+ return createPortal(registrationSlot, document.body);
824
+ }
825
+ return /* @__PURE__ */ jsx(
826
+ MobileSheetPortal,
827
+ {
828
+ ...rest,
829
+ open,
830
+ isAnimating: anim,
831
+ slideEntrance,
832
+ slideOffsetPx: slidePx,
833
+ sheetTitle: sheet.title,
834
+ sheetPanelClassName: sheet.panelClass,
835
+ contentClassName: sheet.bodyClass,
836
+ onRequestClose: close,
837
+ menuRef,
838
+ className,
839
+ style,
840
+ role: "listbox",
841
+ tabIndex: -1,
842
+ "aria-label": sheet.title,
843
+ children
844
+ }
845
+ );
846
+ }
847
+ const resolvedMin = minWidth === "trigger" ? triggerW > 0 ? triggerW : void 0 : minWidth;
848
+ const listbox = /* @__PURE__ */ jsx(
849
+ "div",
850
+ {
851
+ ...rest,
852
+ ref: menuRef,
853
+ role: "listbox",
854
+ tabIndex: -1,
855
+ "aria-hidden": !open,
856
+ className: cn(
857
+ "bg-background border-primary/10 absolute z-50 overflow-hidden rounded-xl border py-1.5 shadow-xl outline-none",
858
+ className
859
+ ),
860
+ style: {
861
+ position: "absolute",
862
+ top: pos.top,
863
+ left: pos.left,
864
+ ...typeof resolvedMin === "number" ? { minWidth: resolvedMin } : {},
865
+ transformOrigin: CONTENT_ORIGIN[pos.side],
866
+ transform: anim ? "none" : CONTENT_HIDDEN[pos.side],
867
+ opacity: anim ? 1 : 0,
868
+ pointerEvents: !open ? "none" : "auto",
869
+ transitionProperty: "opacity, transform",
870
+ transitionDuration: `${duration}ms`,
871
+ transitionTimingFunction: anim ? PANEL_OPEN_EASING : PANEL_CLOSE_EASING,
872
+ ...style
873
+ },
874
+ children
875
+ }
876
+ );
877
+ if (!portalReady) {
878
+ return listbox;
879
+ }
880
+ return createPortal(listbox, document.body);
881
+ };
882
+ function mergeRef(store, node, fromChild) {
883
+ store.current = node;
884
+ if (typeof fromChild === "function") fromChild(node);
885
+ else if (fromChild && typeof fromChild === "object")
886
+ fromChild.current = node;
887
+ }
888
+ var SelectTrigger = React2.forwardRef(
889
+ function SelectTrigger2({ children, asChild, className, onClick, disabled, ...buttonProps }, ref) {
890
+ const { open, setOpen, triggerRef } = useSelectOpen();
891
+ const triggerVariant = buttonProps.variant ?? "secondary";
892
+ const onPress = useCallback(
893
+ (e) => {
894
+ onClick?.(
895
+ e
896
+ );
897
+ e.stopPropagation();
898
+ if (disabled) return;
899
+ setOpen(!open);
900
+ },
901
+ [onClick, disabled, open, setOpen]
902
+ );
903
+ const setBtnRef = useCallback(
904
+ (el) => {
905
+ mergeRef(triggerRef, el, null);
906
+ if (typeof ref === "function") ref(el);
907
+ else if (ref) ref.current = el;
908
+ },
909
+ [ref, triggerRef]
910
+ );
911
+ if (asChild && React2.isValidElement(children)) {
912
+ const ch = children;
913
+ const childRef = ch.ref;
914
+ return React2.cloneElement(ch, {
915
+ ref: (n) => mergeRef(triggerRef, n, childRef),
916
+ className: cn("group w-fit max-w-full min-w-0 justify-start gap-2", ch.props.className),
917
+ onClick: (e) => {
918
+ ch.props.onClick?.(e);
919
+ onPress(e);
920
+ },
921
+ "aria-expanded": open,
922
+ "aria-haspopup": "listbox",
923
+ "data-state": open ? "open" : "closed",
924
+ "data-variant": triggerVariant,
925
+ ...disabled !== void 0 ? { "aria-disabled": disabled } : {}
926
+ });
927
+ }
928
+ return /* @__PURE__ */ jsx(
929
+ Button,
930
+ {
931
+ ref: setBtnRef,
932
+ type: "button",
933
+ ...buttonProps,
934
+ disabled,
935
+ className: cn("group w-fit max-w-full min-w-0 justify-start gap-2", className),
936
+ "aria-expanded": open,
937
+ "aria-haspopup": "listbox",
938
+ "data-state": open ? "open" : "closed",
939
+ "data-variant": triggerVariant,
940
+ onClick: onPress,
941
+ children
942
+ }
943
+ );
944
+ }
945
+ );
946
+ SelectTrigger.displayName = "SelectTrigger";
947
+ var SelectChevron = ({
948
+ className,
949
+ ...props
950
+ }) => {
951
+ const { open } = useSelectOpen();
952
+ return /* @__PURE__ */ jsx(
953
+ ChevronDown,
954
+ {
955
+ "aria-hidden": true,
956
+ className: cn("size-4 shrink-0", open && "rotate-180", className),
957
+ ...props
958
+ }
959
+ );
960
+ };
961
+ var SelectValue = ({ placeholder, className }) => {
962
+ const c = useSelectValue();
963
+ if (c.native) return null;
964
+ const ph = placeholder ?? c.placeholder;
965
+ const text = c.value ? c.labelFor(c.value) : void 0;
966
+ const isEmpty = !c.value;
967
+ return /* @__PURE__ */ jsx(
968
+ "span",
969
+ {
970
+ "data-slot": "select-value",
971
+ className: cn(
972
+ "min-w-0 flex-1 truncate text-left",
973
+ isEmpty && cn(
974
+ "group-data-[variant=primary]:!text-background/50",
975
+ "group-data-[variant=secondary]:!text-primary/50",
976
+ "group-data-[variant=destructive]:!text-red-500/50",
977
+ "group-data-[variant=success]:!text-green-500/50"
978
+ ),
979
+ className
980
+ ),
981
+ children: text != null ? text : ph
982
+ }
983
+ );
984
+ };
985
+ var SelectItemRow = ({
986
+ value: v,
987
+ children,
988
+ disabled,
989
+ shortcut,
990
+ className,
991
+ onClick: userClick,
992
+ ...divProps
993
+ }) => {
994
+ const c = useSelectValue();
995
+ const { setOpen } = useSelectOpen();
996
+ const selected = c.value === v;
997
+ const click = (e) => {
998
+ if (disabled) return;
999
+ c.setValue(v);
1000
+ userClick?.(e);
1001
+ setOpen(false);
1002
+ };
1003
+ const keyDown = (e) => {
1004
+ if (e.key === "Enter" || e.key === " ") {
1005
+ e.preventDefault();
1006
+ click(e);
1007
+ }
1008
+ };
1009
+ return /* @__PURE__ */ jsxs(
1010
+ "div",
1011
+ {
1012
+ ...divProps,
1013
+ "data-select-item": "true",
1014
+ role: "option",
1015
+ "aria-selected": selected,
1016
+ tabIndex: disabled ? void 0 : -1,
1017
+ "aria-disabled": disabled,
1018
+ onClick: click,
1019
+ onKeyDown: keyDown,
1020
+ className: cn(
1021
+ "relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none",
1022
+ SHEET_MENU_TEXT,
1023
+ !disabled && "text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4",
1024
+ disabled && "lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50",
1025
+ !disabled && "cursor-pointer",
1026
+ className
1027
+ ),
1028
+ children: [
1029
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1", children }),
1030
+ shortcut ? /* @__PURE__ */ jsx(
1031
+ "span",
1032
+ {
1033
+ className: cn(
1034
+ "shrink-0 text-xs tracking-widest opacity-40",
1035
+ SHEET_MENU_SHORTCUT
1036
+ ),
1037
+ children: shortcut
1038
+ }
1039
+ ) : null,
1040
+ /* @__PURE__ */ jsx("span", { className: "flex size-4 shrink-0 items-center justify-center", "aria-hidden": true, children: selected ? /* @__PURE__ */ jsx(Check, { className: "size-3.5", strokeWidth: 2.5 }) : null })
1041
+ ]
1042
+ }
1043
+ );
1044
+ };
1045
+ var SelectItem = ({
1046
+ value: v,
1047
+ children,
1048
+ disabled,
1049
+ ...rest
1050
+ }) => {
1051
+ const {
1052
+ native,
1053
+ setLabel,
1054
+ clearLabel,
1055
+ registerNativeItem,
1056
+ unregisterNativeItem
1057
+ } = useSelectValue();
1058
+ useLayoutEffect(() => {
1059
+ setLabel(v, children);
1060
+ if (native) registerNativeItem({ value: v, label: children, disabled });
1061
+ return () => {
1062
+ clearLabel(v);
1063
+ if (native) unregisterNativeItem(v);
1064
+ };
1065
+ }, [
1066
+ v,
1067
+ children,
1068
+ disabled,
1069
+ native,
1070
+ setLabel,
1071
+ clearLabel,
1072
+ registerNativeItem,
1073
+ unregisterNativeItem
1074
+ ]);
1075
+ if (native) return null;
1076
+ return /* @__PURE__ */ jsx(SelectItemRow, { value: v, disabled, ...rest, children });
1077
+ };
1078
+ SelectItem.displayName = "SelectItem";
1079
+ function TablePagination({
1080
+ currentPage = 1,
1081
+ totalPages = 1,
1082
+ paginationItemsToDisplay = 10,
1083
+ currentItems,
1084
+ totalItems,
1085
+ onPageChange,
1086
+ onLimitChange,
1087
+ className
1088
+ }) {
1089
+ const itemsPerPage = Math.max(1, paginationItemsToDisplay);
1090
+ const paginationMeta = React2.useMemo(
1091
+ () => ({
1092
+ currentPage,
1093
+ totalItems: totalItems ?? Math.max(0, totalPages * itemsPerPage),
1094
+ itemsPerPage,
1095
+ totalPages
1096
+ }),
1097
+ [currentPage, totalItems, totalPages, itemsPerPage]
1098
+ );
1099
+ return /* @__PURE__ */ jsxs(
1100
+ "div",
1101
+ {
1102
+ className: cn(
1103
+ "flex max-sm:flex-col items-center justify-between gap-3",
1104
+ className
1105
+ ),
1106
+ children: [
1107
+ /* @__PURE__ */ jsx(
1108
+ "p",
1109
+ {
1110
+ className: "text-primary/60 flex-1 text-sm whitespace-nowrap",
1111
+ "aria-live": "polite",
1112
+ children: /* @__PURE__ */ jsxs("span", { className: "ml-2", children: [
1113
+ "Showing",
1114
+ " ",
1115
+ /* @__PURE__ */ jsx("span", { className: "text-primary", children: currentItems ?? paginationItemsToDisplay }),
1116
+ " ",
1117
+ "out of",
1118
+ " ",
1119
+ /* @__PURE__ */ jsx("span", { className: "text-primary", children: totalItems ?? /* @__PURE__ */ jsx(Loader2, { className: "mb-[3px] inline h-4 w-4 animate-spin" }) }),
1120
+ " ",
1121
+ "results"
1122
+ ] })
1123
+ }
1124
+ ),
1125
+ /* @__PURE__ */ jsx("div", { className: "grow", children: /* @__PURE__ */ jsx(Pagination2, { meta: paginationMeta, onPageChange }) }),
1126
+ /* @__PURE__ */ jsx("div", { className: "flex flex-1 justify-end", children: /* @__PURE__ */ jsxs(
1127
+ Select,
1128
+ {
1129
+ value: paginationItemsToDisplay.toString(),
1130
+ onValueChange: (value) => {
1131
+ onLimitChange(parseInt(value, 10));
1132
+ },
1133
+ children: [
1134
+ /* @__PURE__ */ jsxs(SelectTrigger, { className: "w-fit rounded-full whitespace-nowrap", children: [
1135
+ /* @__PURE__ */ jsx(SelectValue, { placeholder: "Select number of results" }),
1136
+ /* @__PURE__ */ jsx(SelectChevron, { className: "opacity-60" })
1137
+ ] }),
1138
+ /* @__PURE__ */ jsx(SelectContent, { children: [10, 25, 50, 100].map((pageSize) => /* @__PURE__ */ jsxs(SelectItem, { value: pageSize.toString(), children: [
1139
+ pageSize,
1140
+ " / page"
1141
+ ] }, pageSize)) })
1142
+ ]
1143
+ }
1144
+ ) })
1145
+ ]
1146
+ }
1147
+ );
1148
+ }
1149
+ var table_pagination_default = TablePagination;
1150
+
1151
+ export { TablePagination, table_pagination_default as default };
1152
+ //# sourceMappingURL=table-pagination.js.map
1153
+ //# sourceMappingURL=table-pagination.js.map