@avenue-ticketing/ui 0.6.0 → 0.8.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/switch.tsx"],"names":[],"mappings":"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","file":"switch.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState } from \"react\";\nimport { Loader2 } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\n/** small pad so the thumb sits close to the track edge like a hardware switch */\nconst switchSize = {\n sm: { outerW: 36, outerH: 20, thumb: 16, pad: 2 },\n md: { outerW: 44, outerH: 24, thumb: 19, pad: 2 },\n lg: { outerW: 52, outerH: 28, thumb: 22, pad: 2 },\n} as const;\n\nconst loaderIconClass: Record<keyof typeof switchSize, string> = {\n sm: \"size-4\",\n md: \"size-[1.125rem]\",\n lg: \"size-5\",\n};\n\nexport type SwitchSize = keyof typeof switchSize;\n\nexport type SwitchProps = Omit<\n React.ComponentProps<\"button\">,\n \"type\" | \"role\" | \"aria-checked\" | \"children\"\n> & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (next: boolean) => void;\n /** @default md */\n size?: SwitchSize;\n /** replaces the thumb with a spinner; clicks are ignored until false */\n loading?: boolean;\n /** merged onto the sliding thumb */\n thumbClassName?: string;\n};\n\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n disabled = false,\n loading = false,\n size = \"md\",\n className,\n thumbClassName,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const isControlled = checkedProp !== undefined;\n const [uncontrolledChecked, setUncontrolledChecked] = useState(\n defaultChecked,\n );\n const checked = isControlled ? Boolean(checkedProp) : uncontrolledChecked;\n\n const s = switchSize[size];\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n data-slot=\"switch\"\n data-size={size}\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-loading={loading ? \"\" : undefined}\n aria-checked={checked}\n aria-busy={loading || undefined}\n disabled={disabled}\n className={cn(\n \"ring-offset-background box-border inline-flex shrink-0 rounded-full border border-transparent p-0 shadow-sm outline-none select-none transition-colors\",\n \"focus-visible:ring-primary/40 focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n loading && \"cursor-wait\",\n !loading && !disabled && \"cursor-pointer\",\n checked ? \"bg-primary\" : \"bg-primary/10\",\n className,\n )}\n style={{\n width: s.outerW,\n height: s.outerH,\n }}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n if (loading) return;\n if (disabled) return;\n if (isControlled) {\n onCheckedChange?.(!checked);\n return;\n }\n setUncontrolledChecked((prev) => {\n const next = !prev;\n onCheckedChange?.(next);\n return next;\n });\n }}\n {...rest}\n >\n <span className=\"relative block h-full w-full overflow-hidden rounded-[inherit]\">\n <span\n aria-hidden\n className={cn(\n \"pointer-events-none absolute top-1/2 transition-[left] duration-150 ease-out\",\n loading\n ? \"flex items-center justify-center bg-transparent shadow-none ring-0\"\n : \"block rounded-full bg-background shadow-sm ring-0\",\n thumbClassName,\n )}\n style={{\n width: s.thumb,\n height: s.thumb,\n left: checked\n ? `calc(100% - ${s.thumb + s.pad}px)`\n : `${s.pad}px`,\n transform: \"translateY(-50%)\",\n }}\n >\n {loading ? (\n <Loader2\n className={cn(\n \"animate-spin\",\n checked ? \"text-background\" : \"text-primary\",\n loaderIconClass[size],\n )}\n />\n ) : null}\n </span>\n </span>\n </button>\n );\n },\n);\nSwitch.displayName = \"Switch\";\n\nexport { Switch };\n"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/switch.tsx"],"names":[],"mappings":"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","file":"switch.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useState } from \"react\";\nimport { Loader2 } from \"lucide-react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** small pad so the thumb sits close to the track edge like a hardware switch */\nconst switchSize = {\n sm: { outerW: 36, outerH: 20, thumb: 16, pad: 2 },\n md: { outerW: 44, outerH: 24, thumb: 19, pad: 2 },\n lg: { outerW: 52, outerH: 28, thumb: 22, pad: 2 },\n} as const;\n\nconst loaderIconClass: Record<keyof typeof switchSize, string> = {\n sm: \"size-4\",\n md: \"size-[1.125rem]\",\n lg: \"size-5\",\n};\n\nexport type SwitchSize = keyof typeof switchSize;\n\nexport type SwitchProps = Omit<\n React.ComponentProps<\"button\">,\n \"type\" | \"role\" | \"aria-checked\" | \"children\"\n> & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (next: boolean) => void;\n /** @default md */\n size?: SwitchSize;\n /** replaces the thumb with a spinner; clicks are ignored until false */\n loading?: boolean;\n /** merged onto the sliding thumb */\n thumbClassName?: string;\n};\n\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n disabled = false,\n loading = false,\n size = \"md\",\n className,\n thumbClassName,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const isControlled = checkedProp !== undefined;\n const [uncontrolledChecked, setUncontrolledChecked] = useState(\n defaultChecked,\n );\n const checked = isControlled ? Boolean(checkedProp) : uncontrolledChecked;\n\n const s = switchSize[size];\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n data-slot=\"switch\"\n data-size={size}\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-loading={loading ? \"\" : undefined}\n aria-checked={checked}\n aria-busy={loading || undefined}\n disabled={disabled}\n className={cn(\n \"ring-offset-background box-border inline-flex shrink-0 rounded-full border border-transparent p-0 shadow-sm outline-none select-none transition-colors\",\n \"focus-visible:ring-primary/40 focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n loading && \"cursor-wait\",\n !loading && !disabled && \"cursor-pointer\",\n checked ? \"bg-primary\" : \"bg-primary/10\",\n className,\n )}\n style={{\n width: s.outerW,\n height: s.outerH,\n }}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n if (loading) return;\n if (disabled) return;\n if (isControlled) {\n onCheckedChange?.(!checked);\n return;\n }\n setUncontrolledChecked((prev) => {\n const next = !prev;\n onCheckedChange?.(next);\n return next;\n });\n }}\n {...rest}\n >\n <span className=\"relative block h-full w-full overflow-hidden rounded-[inherit]\">\n <span\n aria-hidden\n className={cn(\n \"pointer-events-none absolute top-1/2 transition-[left] duration-150 ease-out\",\n loading\n ? \"flex items-center justify-center bg-transparent shadow-none ring-0\"\n : \"block rounded-full bg-background shadow-sm ring-0\",\n thumbClassName,\n )}\n style={{\n width: s.thumb,\n height: s.thumb,\n left: checked\n ? `calc(100% - ${s.thumb + s.pad}px)`\n : `${s.pad}px`,\n transform: \"translateY(-50%)\",\n }}\n >\n {loading ? (\n <Loader2\n className={cn(\n \"animate-spin\",\n checked ? \"text-background\" : \"text-primary\",\n loaderIconClass[size],\n )}\n />\n ) : null}\n </span>\n </span>\n </button>\n );\n },\n);\nSwitch.displayName = \"Switch\";\n\nexport { Switch };\n"]}
@@ -267,6 +267,7 @@ var MOBILE_SHEET_OUT = "cubic-bezier(0.85, 0, 1, 0.15)";
267
267
  var SLIDE_DEFAULT_PX = 120;
268
268
  var SHEET_MENU_TEXT = "max-[1024px]:text-base";
269
269
  var SHEET_MENU_SHORTCUT = "max-[1024px]:text-sm";
270
+ var SELECT_FLIP_MIN_SPACE_PX = 100;
270
271
  var CONTENT_ORIGIN = {
271
272
  bottom: "top center",
272
273
  top: "bottom center",
@@ -282,6 +283,7 @@ var CONTENT_HIDDEN = {
282
283
  function computeMenuPosition(trigger, menu, side, align, offset, pad) {
283
284
  const tr = trigger.getBoundingClientRect();
284
285
  const mr = menu.getBoundingClientRect();
286
+ const contentHeight = menu.scrollHeight;
285
287
  const vh = window.innerHeight;
286
288
  const vw = window.innerWidth;
287
289
  const sx = window.scrollX;
@@ -289,19 +291,19 @@ function computeMenuPosition(trigger, menu, side, align, offset, pad) {
289
291
  let top = 0;
290
292
  let left = 0;
291
293
  let effectiveSide = side;
292
- const place = (s) => {
294
+ let maxHeight;
295
+ const placeVertical = (s, height) => {
296
+ if (s === "bottom") top = tr.bottom + sy + offset;
297
+ else top = tr.top + sy - height - offset;
298
+ if (align === "start") left = tr.left + sx;
299
+ else if (align === "end") left = tr.right + sx - mr.width;
300
+ else left = tr.left + sx + tr.width / 2 - mr.width / 2;
301
+ };
302
+ const place = (s, height = contentHeight) => {
293
303
  switch (s) {
294
304
  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
305
  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;
306
+ placeVertical(s, height);
305
307
  break;
306
308
  case "right":
307
309
  left = tr.right + sx + offset;
@@ -318,17 +320,20 @@ function computeMenuPosition(trigger, menu, side, align, offset, pad) {
318
320
  }
319
321
  };
320
322
  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;
323
+ const spaceBelow = Math.max(0, vh - pad - tr.bottom - offset);
324
+ const spaceAbove = Math.max(0, tr.top - offset - pad);
325
+ if (side === "bottom" || side === "top") {
326
+ const primarySpace = side === "bottom" ? spaceBelow : spaceAbove;
327
+ const alternateSpace = side === "bottom" ? spaceAbove : spaceBelow;
328
+ const alternateSide = side === "bottom" ? "top" : "bottom";
329
+ if (contentHeight > primarySpace) {
330
+ maxHeight = Math.min(contentHeight, primarySpace);
331
+ place(side, maxHeight);
326
332
  }
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;
333
+ if (contentHeight > primarySpace && primarySpace < SELECT_FLIP_MIN_SPACE_PX && alternateSpace > primarySpace) {
334
+ effectiveSide = alternateSide;
335
+ maxHeight = Math.min(contentHeight, alternateSpace);
336
+ place(alternateSide, maxHeight);
332
337
  }
333
338
  } else if (side === "right" && left + mr.width > vw + sx - pad) {
334
339
  const flip = tr.left + sx - mr.width - offset;
@@ -343,9 +348,10 @@ function computeMenuPosition(trigger, menu, side, align, offset, pad) {
343
348
  left = flip;
344
349
  }
345
350
  }
351
+ const layoutHeight = maxHeight ?? contentHeight;
346
352
  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 };
353
+ top = Math.max(sy + pad, Math.min(top, vh + sy - layoutHeight - pad));
354
+ return { top, left, side: effectiveSide, maxHeight };
349
355
  }
350
356
  function useNarrowSheetViewport(breakpoint = 1025) {
351
357
  const [narrow, setNarrow] = useState(false);
@@ -854,14 +860,16 @@ var SelectContent = ({
854
860
  tabIndex: -1,
855
861
  "aria-hidden": !open,
856
862
  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
863
+ "bg-background border-primary/10 absolute z-50 rounded-xl border py-1.5 shadow-xl outline-none",
864
+ className,
865
+ pos.maxHeight != null ? "overflow-y-auto overscroll-contain" : "overflow-hidden"
859
866
  ),
860
867
  style: {
861
868
  position: "absolute",
862
869
  top: pos.top,
863
870
  left: pos.left,
864
871
  ...typeof resolvedMin === "number" ? { minWidth: resolvedMin } : {},
872
+ maxHeight: pos.maxHeight,
865
873
  transformOrigin: CONTENT_ORIGIN[pos.side],
866
874
  transform: anim ? "none" : CONTENT_HIDDEN[pos.side],
867
875
  opacity: anim ? 1 : 0,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/button.tsx","../../src/react/pagination.tsx","../../src/react/select.tsx","../../src/react/table-pagination.tsx"],"names":["React","jsx","Pagination","React3","useCallback","useMemo","jsxs","SelectTrigger","React4"],"mappings":"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","file":"table-pagination.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst sizeClass = {\n xs: \"h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\n/** Square hit targets for `iconOnly` — same keys as `sizeClass` (`default` | `lg`). */\nconst iconOnlySizeClass = {\n xs: \"size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\nconst roundedClass = {\n full: \"rounded-full\",\n lg: \"rounded-lg\",\n md: \"rounded-md\",\n} as const;\n\nconst variantClass = {\n primary:\n \"bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85\",\n secondary:\n \"bg-background text-primary border border-primary/10 hover:bg-primary/5\",\n destructive:\n \"bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5\",\n success:\n \"bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5\",\n} as const;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> & {\n /**\n * Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,\n * `success`) using Tailwind `red-500` / `green-500` text and matching borders on\n * `bg-background` (no solid fill).\n */\n variant?: keyof typeof variantClass;\n /**\n * Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons\n * default to `md` (square corners) unless you pass `rounded` explicitly.\n */\n rounded?: keyof typeof roundedClass;\n /** Height and horizontal padding: `default` or `lg` only. */\n size?: keyof typeof sizeClass;\n /**\n * Square icon-only control; same `size` presets (`default` | `lg`). Pair with\n * `aria-label` (or `title`) when there is no visible text.\n */\n iconOnly?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n type = \"button\",\n variant = \"secondary\",\n rounded: roundedProp,\n size = \"default\",\n iconOnly = false,\n disabled,\n ...props\n },\n ref,\n ) => {\n const rounded = roundedProp ?? (iconOnly ? \"md\" : \"full\");\n\n return (\n <button\n type={type}\n disabled={disabled}\n data-slot=\"button\"\n data-icon-only={iconOnly ? \"\" : undefined}\n className={cn(\n \"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\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n iconOnly ? iconOnlySizeClass[size] : sizeClass[size],\n roundedClass[rounded],\n variantClass[variant],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","\"use client\";\n\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button, type ButtonProps } from \"./button\";\n\nexport type PaginationMeta = {\n currentPage: number;\n totalItems: number;\n itemsPerPage: number;\n /** omit to derive `ceil(totalItems / itemsPerPage)` (minimum 1) */\n totalPages?: number;\n};\n\nexport type PaginationProps = {\n meta: PaginationMeta;\n onPageChange?: (page: number) => void;\n className?: string;\n /** max page numbers in the sliding window (excluding first/last when ellipses show; default 3) */\n maxVisibleButtons?: number;\n disabled?: boolean;\n /**\n * density preset → resolved `Button` size for every control (`xs` → `default`;\n * `default` / `lg` → `lg`) so chevrons and page cells share one hit grid.\n */\n size?: ButtonProps[\"size\"];\n /** same as `Button` `rounded`; pagination defaults to `full` */\n rounded?: NonNullable<ButtonProps[\"rounded\"]>;\n};\n\nconst PaginationInner = React.forwardRef<HTMLDivElement, PaginationProps>(\n function Pagination(\n {\n meta,\n onPageChange,\n className,\n maxVisibleButtons = 3,\n disabled = false,\n size = \"default\",\n rounded = \"full\",\n },\n ref,\n ) {\n const handlePageChange = React.useCallback(\n (page: number) => {\n onPageChange?.(page);\n },\n [onPageChange],\n );\n\n const totalPages = React.useMemo(() => {\n const totalItems = Math.max(0, Number(meta.totalItems) || 0);\n const itemsPerPage = Math.max(1, Number(meta.itemsPerPage) || 16);\n if (meta.totalPages != null && Number.isFinite(meta.totalPages)) {\n return Math.max(1, Math.floor(Number(meta.totalPages)));\n }\n return Math.max(1, Math.ceil(totalItems / itemsPerPage));\n }, [meta.totalItems, meta.itemsPerPage, meta.totalPages]);\n\n const currentPage = React.useMemo(\n () => Math.max(1, Number(meta.currentPage) || 1),\n [meta.currentPage],\n );\n\n const { endPage, adjustedStart } = React.useMemo(() => {\n const sp = Math.max(1, currentPage - Math.floor(maxVisibleButtons / 2));\n const ep = Math.min(totalPages, sp + maxVisibleButtons - 1);\n const adj =\n ep - sp + 1 < maxVisibleButtons ? Math.max(1, ep - maxVisibleButtons + 1) : sp;\n return { endPage: ep, adjustedStart: adj };\n }, [currentPage, totalPages, maxVisibleButtons]);\n\n const middlePageNumbers = React.useMemo(\n () =>\n Array.from({ length: endPage - adjustedStart + 1 }, (_, i) => adjustedStart + i),\n [endPage, adjustedStart],\n );\n\n const navButtonSize = React.useMemo(\n (): NonNullable<ButtonProps[\"size\"]> => (size === \"xs\" ? \"default\" : \"lg\"),\n [size],\n );\n\n const ellipsisClassName = React.useMemo(\n () =>\n cn(\n \"inline-flex shrink-0 items-center justify-center\",\n navButtonSize === \"lg\"\n ? \"size-11 min-h-11 min-w-11\"\n : \"size-10 min-h-10 min-w-10\",\n rounded === \"full\"\n ? \"rounded-full\"\n : rounded === \"lg\"\n ? \"rounded-lg\"\n : \"rounded-md\",\n ),\n [navButtonSize, rounded],\n );\n\n const gapIconClassName = React.useMemo(\n () =>\n cn(\n \"mx-auto shrink-0 text-primary/45\",\n navButtonSize === \"lg\" ? \"size-[18px]\" : \"size-4\",\n ),\n [navButtonSize],\n );\n\n if (totalPages <= 1) return null;\n\n return (\n <div ref={ref} className={cn(\"flex w-full justify-center\", className)}>\n <nav\n role=\"navigation\"\n aria-label=\"Pagination\"\n className=\"text-primary flex items-center justify-center gap-0.5 text-base font-medium tabular-nums tracking-tight\"\n >\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0\"\n disabled={disabled || currentPage <= 1}\n onClick={() => handlePageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n <ChevronLeft aria-hidden className=\"size-5 shrink-0 mr-0.5\" />\n </Button>\n <div className=\"flex items-center gap-0.5\">\n {adjustedStart > 1 && (\n <>\n {currentPage === 1 ? (\n <Button\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{1}</span>\n </Button>\n ) : (\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(1)}\n aria-label=\"Go to page 1\"\n >\n <span className=\"tabular-nums\">1</span>\n </Button>\n )}\n {adjustedStart > 2 && (\n <span aria-hidden className={ellipsisClassName}>\n <MoreHorizontal className={gapIconClassName} aria-hidden />\n </span>\n )}\n </>\n )}\n {middlePageNumbers.map((page) =>\n currentPage === page ? (\n <Button\n key={page}\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{page}</span>\n </Button>\n ) : (\n <Button\n key={page}\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(page)}\n aria-label={`Go to page ${page}`}\n >\n <span className=\"tabular-nums\">{page}</span>\n </Button>\n ),\n )}\n {endPage < totalPages && (\n <>\n {endPage < totalPages - 1 && (\n <span aria-hidden className={ellipsisClassName}>\n <MoreHorizontal className={gapIconClassName} aria-hidden />\n </span>\n )}\n {currentPage === totalPages ? (\n <Button\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{totalPages}</span>\n </Button>\n ) : (\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(totalPages)}\n aria-label={`Go to page ${totalPages}`}\n >\n <span className=\"tabular-nums\">{totalPages}</span>\n </Button>\n )}\n </>\n )}\n </div>\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0\"\n disabled={disabled || currentPage >= totalPages}\n onClick={() => handlePageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n <ChevronRight aria-hidden className=\"size-5 shrink-0 ml-0.5\" />\n </Button>\n </nav>\n </div>\n );\n },\n);\n\nPaginationInner.displayName = \"Pagination\";\n\nexport const Pagination = React.memo(PaginationInner);\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Check, ChevronDown, X } from \"lucide-react\";\n\nimport { Button, type ButtonProps } from \"./button\";\nimport { cn } from \"@/lib/utils\";\n\nconst PANEL_OPEN_EASING = \"cubic-bezier(0,0.55,0.45,1)\";\nconst PANEL_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\nconst MOBILE_SHEET_MAX_PX = 1024;\nconst MOBILE_SHEET_MS = 175;\nconst MOBILE_SHEET_IN = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst MOBILE_SHEET_OUT = \"cubic-bezier(0.85, 0, 1, 0.15)\";\nconst SLIDE_DEFAULT_PX = 120;\nconst SHEET_MENU_TEXT = \"max-[1024px]:text-base\";\nconst SHEET_MENU_SHORTCUT = \"max-[1024px]:text-sm\";\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\ntype Pos = { top: number; left: number; side: Side };\n\nconst CONTENT_ORIGIN: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right center\",\n right: \"left center\",\n};\n\nconst CONTENT_HIDDEN: Record<Side, string> = {\n bottom: \"translateY(-4px) scale(0.97)\",\n top: \"translateY(4px) scale(0.97)\",\n left: \"translateX(4px) scale(0.97)\",\n right: \"translateX(-4px) scale(0.97)\",\n};\n\nfunction computeMenuPosition(\n trigger: HTMLElement,\n menu: HTMLElement,\n side: Side,\n align: Align,\n offset: number,\n pad: number,\n): Pos {\n const tr = trigger.getBoundingClientRect();\n const mr = menu.getBoundingClientRect();\n const vh = window.innerHeight;\n const vw = window.innerWidth;\n const sx = window.scrollX;\n const sy = window.scrollY;\n\n let top = 0;\n let left = 0;\n let effectiveSide = side;\n\n const place = (s: Side) => {\n switch (s) {\n case \"bottom\":\n top = tr.bottom + sy + offset;\n if (align === \"start\") left = tr.left + sx;\n else if (align === \"end\") left = tr.right + sx - mr.width;\n else left = tr.left + sx + tr.width / 2 - mr.width / 2;\n break;\n case \"top\":\n top = tr.top + sy - mr.height - offset;\n if (align === \"start\") left = tr.left + sx;\n else if (align === \"end\") left = tr.right + sx - mr.width;\n else left = tr.left + sx + tr.width / 2 - mr.width / 2;\n break;\n case \"right\":\n left = tr.right + sx + offset;\n if (align === \"start\") top = tr.top + sy;\n else if (align === \"end\") top = tr.bottom + sy - mr.height;\n else top = tr.top + sy + tr.height / 2 - mr.height / 2;\n break;\n case \"left\":\n left = tr.left + sx - mr.width - offset;\n if (align === \"start\") top = tr.top + sy;\n else if (align === \"end\") top = tr.bottom + sy - mr.height;\n else top = tr.top + sy + tr.height / 2 - mr.height / 2;\n break;\n }\n };\n\n place(side);\n\n if (side === \"bottom\" && top + mr.height > vh + sy - pad) {\n const flip = tr.top + sy - mr.height - offset;\n if (flip >= sy + pad) {\n effectiveSide = \"top\";\n top = flip;\n }\n } else if (side === \"top\" && top < sy + pad) {\n const flip = tr.bottom + sy + offset;\n if (flip + mr.height <= vh + sy - pad) {\n effectiveSide = \"bottom\";\n top = flip;\n }\n } else if (side === \"right\" && left + mr.width > vw + sx - pad) {\n const flip = tr.left + sx - mr.width - offset;\n if (flip >= sx + pad) {\n effectiveSide = \"left\";\n left = flip;\n }\n } else if (side === \"left\" && left < sx + pad) {\n const flip = tr.right + sx + offset;\n if (flip + mr.width <= vw + sx - pad) {\n effectiveSide = \"right\";\n left = flip;\n }\n }\n\n left = Math.max(sx + pad, Math.min(left, vw + sx - mr.width - pad));\n top = Math.max(sy + pad, Math.min(top, vh + sy - mr.height - pad));\n\n return { top, left, side: effectiveSide };\n}\n\nfunction useNarrowSheetViewport(breakpoint = 1025) {\n const [narrow, setNarrow] = useState(false);\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n setNarrow(mq.matches);\n const h = (e: MediaQueryListEvent) => setNarrow(e.matches);\n mq.addEventListener(\"change\", h);\n return () => mq.removeEventListener(\"change\", h);\n }, [breakpoint]);\n return narrow;\n}\n\nfunction plainTextFromNode(node: React.ReactNode): string {\n if (node == null || node === false || node === true) return \"\";\n if (typeof node === \"string\" || typeof node === \"number\")\n return String(node);\n if (Array.isArray(node)) return node.map(plainTextFromNode).join(\"\");\n if (React.isValidElement(node)) {\n return plainTextFromNode(\n (node.props as { children?: React.ReactNode }).children,\n );\n }\n return \"\";\n}\n\n// ----- value context -----\n\ntype ItemRegistration = { value: string; label: React.ReactNode; disabled?: boolean };\n\ntype ValueCtx = {\n native: boolean;\n value: string;\n setValue: (v: string) => void;\n disabled: boolean;\n setLabel: (v: string, n: React.ReactNode) => void;\n clearLabel: (v: string) => void;\n registerNativeItem: (e: ItemRegistration) => void;\n unregisterNativeItem: (v: string) => void;\n labelFor: (v: string) => React.ReactNode | undefined;\n placeholder: string;\n};\n\nconst ValueContext = React.createContext<ValueCtx | null>(null);\n\nfunction useSelectValue() {\n const c = React.useContext(ValueContext);\n if (!c) throw new Error(\"Select subcomponents must be used within <Select>\");\n return c;\n}\n\n// ----- open context (custom mode only) -----\n\ntype OpenCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n};\n\nconst OpenContext = React.createContext<OpenCtx | null>(null);\n\nfunction useSelectOpen() {\n const c = React.useContext(OpenContext);\n if (!c)\n throw new Error(\n \"Select.Trigger, SelectContent, and SelectItem need <Select> without native\",\n );\n return c;\n}\n\n// ----- root -----\n\nexport type SelectProps = {\n children: React.ReactNode;\n className?: string;\n value?: string;\n defaultValue?: string;\n onValueChange?: (v: string) => void;\n /** native `<select>`; default `false` — custom trigger + list / sheet. */\n native?: boolean;\n disabled?: boolean;\n name?: string;\n id?: string;\n placeholder?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n};\n\nexport const Select = ({\n children,\n className,\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n native: nativeProp = false,\n disabled = false,\n name,\n id: idAttr,\n placeholder = \"Select\",\n open: openProp,\n onOpenChange,\n}: SelectProps) => {\n const isValueControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const value = isValueControlled ? (valueProp as string) : internalValue;\n\n const [labels, setLabels] = useState<Record<string, React.ReactNode>>({});\n const [nativeMeta, setNativeMeta] = useState<\n Record<string, { label: React.ReactNode; disabled?: boolean }>\n >({});\n const [nativeOrder, setNativeOrder] = useState<string[]>([]);\n\n const setValue = useCallback(\n (v: string) => {\n if (!isValueControlled) setInternalValue(v);\n onValueChange?.(v);\n },\n [isValueControlled, onValueChange],\n );\n\n const setLabel = useCallback((v: string, n: React.ReactNode) => {\n setLabels((p) => (p[v] === n ? p : { ...p, [v]: n }));\n }, []);\n\n const clearLabel = useCallback((v: string) => {\n setLabels((p) => {\n if (!(v in p)) return p;\n const n = { ...p };\n delete n[v];\n return n;\n });\n }, []);\n\n // labelFor keeps [] deps and reads labelsRef so selectitem effect deps stay stable;\n // valueCtx still lists `labels` so provider value updates and selectvalue re-renders\n const labelsRef = useRef(labels);\n labelsRef.current = labels;\n const labelFor = useCallback(\n (v: string) => labelsRef.current[v] as React.ReactNode | undefined,\n [],\n );\n\n const registerNativeItem = useCallback(\n (e: ItemRegistration) => {\n setLabel(e.value, e.label);\n setNativeMeta((p) => ({ ...p, [e.value]: { label: e.label, disabled: e.disabled } }));\n setNativeOrder((o) => (o.includes(e.value) ? o : [...o, e.value]));\n },\n [setLabel],\n );\n\n const unregisterNativeItem = useCallback(\n (v: string) => {\n setNativeMeta((p) => {\n if (!(v in p)) return p;\n const n = { ...p };\n delete n[v];\n return n;\n });\n setNativeOrder((o) => o.filter((x) => x !== v));\n clearLabel(v);\n },\n [clearLabel],\n );\n\n const valueCtx: ValueCtx = useMemo(\n () => ({\n native: nativeProp,\n value,\n setValue,\n disabled,\n setLabel,\n clearLabel,\n registerNativeItem,\n unregisterNativeItem,\n labelFor,\n placeholder,\n }),\n [\n nativeProp,\n value,\n setValue,\n disabled,\n labels,\n setLabel,\n clearLabel,\n registerNativeItem,\n unregisterNativeItem,\n labelFor,\n placeholder,\n ],\n );\n\n if (nativeProp) {\n return (\n <ValueContext.Provider value={valueCtx}>\n <div\n className={cn(\n \"group relative inline-block w-max min-w-0 max-w-full\",\n className,\n )}\n >\n <select\n id={idAttr}\n name={name}\n className={cn(\n \"peer\",\n \"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\",\n \"h-10 min-h-10 text-sm font-medium\",\n \"rounded-full transition-[color,background-color,box-shadow,transform] duration-150\",\n \"focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"active:scale-[0.99]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n value={value}\n disabled={disabled}\n onChange={(ev) => setValue(ev.target.value)}\n >\n <option value=\"\" disabled>\n {placeholder}\n </option>\n {nativeOrder.map((key) => {\n const m = nativeMeta[key];\n if (!m) return null;\n return (\n <option key={key} value={key} disabled={m.disabled}>\n {plainTextFromNode(m.label)}\n </option>\n );\n })}\n </select>\n <ChevronDown\n aria-hidden\n className=\"text-primary/50 pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 peer-disabled:opacity-50\"\n />\n </div>\n {children}\n </ValueContext.Provider>\n );\n }\n\n return (\n <ValueContext.Provider value={valueCtx}>\n <SelectOpenBridge open={openProp} onOpenChange={onOpenChange}>\n <div className={cn(\"inline-block min-w-0 max-w-full\", className)}>{children}</div>\n </SelectOpenBridge>\n </ValueContext.Provider>\n );\n};\n\nfunction SelectOpenBridge({\n children,\n open: controlled,\n onOpenChange,\n}: {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (o: boolean) => void;\n}) {\n const [inner, setInner] = useState(false);\n const isControlled = controlled !== undefined;\n const open = isControlled ? (controlled as boolean) : inner;\n const setOpen = useCallback(\n (o: boolean) => {\n if (!isControlled) setInner(o);\n onOpenChange?.(o);\n },\n [isControlled, onOpenChange],\n );\n const triggerRef = useRef<HTMLElement | null>(null);\n const ctx = useMemo(\n () => ({ open, setOpen, triggerRef }) satisfies OpenCtx,\n [open, setOpen],\n );\n return <OpenContext.Provider value={ctx}>{children}</OpenContext.Provider>;\n}\n\n// ----- mobile sheet -----\n\nconst SheetClose = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, type = \"button\", ...p }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"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]\",\n className,\n )}\n {...p}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n));\nSheetClose.displayName = \"SelectSheetClose\";\n\nexport type SelectMobileSheetOptions = {\n sheet?: boolean;\n title?: string;\n className?: string;\n contentClassName?: string;\n};\n\nfunction resolveSheetOpts(o?: SelectMobileSheetOptions) {\n return {\n sheet: o?.sheet ?? true,\n title: o?.title,\n panelClass: o?.className,\n bodyClass: o?.contentClassName,\n };\n}\n\ntype SheetPortalProps = React.HTMLAttributes<HTMLDivElement> & {\n open: boolean;\n isAnimating: boolean;\n slideEntrance: boolean;\n slideOffsetPx: number;\n sheetTitle?: string;\n sheetPanelClassName?: string;\n contentClassName?: string;\n onRequestClose: () => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n};\n\nfunction MobileSheetPortal({\n open,\n isAnimating,\n slideEntrance,\n slideOffsetPx,\n sheetTitle,\n sheetPanelClassName,\n contentClassName,\n onRequestClose,\n menuRef,\n children,\n className,\n style,\n ...rest\n}: SheetPortalProps) {\n const ease = open ? MOBILE_SHEET_IN : MOBILE_SHEET_OUT;\n const hiddenY = slideEntrance ? `translateY(${slideOffsetPx}px)` : \"translateY(100%)\";\n return createPortal(\n <div className=\"fixed inset-0 z-50 flex items-end justify-center p-0\">\n <div\n className={cn(\n \"fixed inset-0 bg-black/40 dark:bg-black/60\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n )}\n style={{\n transition: `opacity ${MOBILE_SHEET_MS}ms ${ease}`,\n }}\n onClick={onRequestClose}\n />\n <div\n {...rest}\n ref={menuRef}\n className={cn(\n \"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\",\n \"rounded-t-2xl rounded-b-none border-x-0 border-b-0 border-t\",\n sheetPanelClassName,\n className,\n )}\n style={{\n transform: isAnimating ? \"translateY(0)\" : hiddenY,\n opacity: isAnimating ? 1 : 0,\n transition: `transform ${MOBILE_SHEET_MS}ms ${ease}, opacity ${MOBILE_SHEET_MS}ms ${ease}`,\n ...style,\n }}\n >\n <div\n className={cn(\n \"flex w-full shrink-0 items-center py-2 pl-4 pr-2\",\n sheetTitle ? \"justify-between gap-3\" : \"justify-end\",\n )}\n >\n {sheetTitle ? (\n <p className=\"text-foreground min-w-0 flex-1 truncate text-base font-semibold\">\n {sheetTitle}\n </p>\n ) : null}\n <SheetClose\n onClick={(e) => {\n e.stopPropagation();\n onRequestClose();\n }}\n />\n </div>\n <div\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto pb-[calc(5rem+env(safe-area-inset-bottom,0px))]\",\n contentClassName,\n )}\n >\n {children}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\n// ----- list helpers -----\n\nfunction listFocusableItems(host: HTMLElement): HTMLElement[] {\n return Array.from(\n host.querySelectorAll<HTMLElement>(\n '[data-select-item=\"true\"]:not([aria-disabled=\"true\"])',\n ),\n );\n}\n\n// ----- content -----\n\nexport type SelectContentProps = React.HTMLAttributes<HTMLDivElement> & {\n side?: Side;\n align?: Align;\n offset?: number;\n duration?: number;\n viewportPadding?: number;\n closeOnEscape?: boolean;\n minWidth?: number | \"trigger\";\n loop?: boolean;\n mobileOptions?: SelectMobileSheetOptions;\n slideEntrance?: boolean;\n slideEntranceOffsetPx?: number;\n};\n\nexport const SelectContent: React.FC<SelectContentProps> = ({\n children,\n side = \"bottom\",\n align = \"start\",\n offset = 10,\n duration = 80,\n viewportPadding = 8,\n closeOnEscape = true,\n minWidth = \"trigger\",\n loop = true,\n mobileOptions,\n slideEntrance = true,\n slideEntranceOffsetPx: slidePxProp,\n className,\n style,\n ...rest\n}) => {\n const narrow = useNarrowSheetViewport(MOBILE_SHEET_MAX_PX + 1);\n const { open, setOpen, triggerRef } = useSelectOpen();\n const [show, setShow] = useState(false);\n const [anim, setAnim] = useState(false);\n const [pos, setPos] = useState<Pos>({ top: -9999, left: -9999, side });\n const [triggerW, setTriggerW] = useState(0);\n const menuRef = useRef<HTMLDivElement>(null);\n const sheet = useMemo(() => resolveSheetOpts(mobileOptions), [mobileOptions]);\n const slidePx = slidePxProp ?? SLIDE_DEFAULT_PX;\n const closeMs = narrow && sheet.sheet ? MOBILE_SHEET_MS : duration;\n const close = useCallback(() => setOpen(false), [setOpen]);\n const [portalReady, setPortalReady] = useState(false);\n useLayoutEffect(() => {\n setPortalReady(true);\n }, []);\n\n useEffect(() => {\n if (open) {\n setShow(true);\n } else {\n setAnim(false);\n const t = setTimeout(() => setShow(false), closeMs);\n return () => clearTimeout(t);\n }\n }, [open, closeMs]);\n\n useEffect(() => {\n if (!show || !open) return;\n let r2 = 0;\n const r1 = requestAnimationFrame(() => {\n r2 = requestAnimationFrame(() => setAnim(true));\n });\n return () => {\n cancelAnimationFrame(r1);\n if (r2) cancelAnimationFrame(r2);\n };\n }, [show, open]);\n\n useLayoutEffect(() => {\n if (!triggerRef.current || !menuRef.current) return;\n if (!open && !show) return;\n const run = () => {\n if (!triggerRef.current || !menuRef.current) return;\n setTriggerW(triggerRef.current.getBoundingClientRect().width);\n setPos(\n computeMenuPosition(\n triggerRef.current,\n menuRef.current,\n side,\n align,\n offset,\n viewportPadding,\n ),\n );\n };\n run();\n window.addEventListener(\"resize\", run);\n window.addEventListener(\"scroll\", run, true);\n return () => {\n window.removeEventListener(\"resize\", run);\n window.removeEventListener(\"scroll\", run, true);\n };\n }, [open, show, side, align, offset, viewportPadding, triggerRef]);\n\n useEffect(() => {\n if (anim && menuRef.current) menuRef.current.focus();\n }, [anim]);\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || triggerRef.current?.contains(t)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open, setOpen, triggerRef]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n const m = menuRef.current;\n if (!m) return;\n const active = document.activeElement as HTMLElement | null;\n if (active && !m.contains(active) && !triggerRef.current?.contains(active))\n return;\n const items = listFocusableItems(m);\n const i = items.indexOf(active!);\n switch (e.key) {\n case \"Escape\":\n if (closeOnEscape) {\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n }\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (!items.length) break;\n if (i === -1 || (i === items.length - 1 && loop)) items[0]?.focus();\n else if (i < items.length - 1) items[i + 1]?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (!items.length) break;\n if (i <= 0 && loop) items[items.length - 1]?.focus();\n else if (i > 0) items[i - 1]?.focus();\n break;\n case \"Home\":\n e.preventDefault();\n items[0]?.focus();\n break;\n case \"End\":\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n case \"Tab\":\n setOpen(false);\n break;\n default:\n break;\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, closeOnEscape, loop, setOpen, triggerRef]);\n\n const lockBodyScroll = (open || show) && narrow && sheet.sheet;\n useEffect(() => {\n if (!lockBodyScroll) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, [lockBodyScroll]);\n\n if (narrow && sheet.sheet) {\n if (!open && !show) {\n const registrationSlot = (\n <div className=\"sr-only pointer-events-none\" aria-hidden>\n {children}\n </div>\n );\n if (!portalReady) return registrationSlot;\n return createPortal(registrationSlot, document.body);\n }\n return (\n <MobileSheetPortal\n {...rest}\n open={open}\n isAnimating={anim}\n slideEntrance={slideEntrance}\n slideOffsetPx={slidePx}\n sheetTitle={sheet.title}\n sheetPanelClassName={sheet.panelClass}\n contentClassName={sheet.bodyClass}\n onRequestClose={close}\n menuRef={menuRef}\n className={className}\n style={style}\n role=\"listbox\"\n tabIndex={-1}\n aria-label={sheet.title}\n >\n {children}\n </MobileSheetPortal>\n );\n }\n\n const resolvedMin =\n minWidth === \"trigger\" ? (triggerW > 0 ? triggerW : undefined) : minWidth;\n\n const listbox = (\n <div\n {...rest}\n ref={menuRef}\n role=\"listbox\"\n tabIndex={-1}\n aria-hidden={!open}\n className={cn(\n \"bg-background border-primary/10 absolute z-50 overflow-hidden rounded-xl border py-1.5 shadow-xl outline-none\",\n className,\n )}\n style={{\n position: \"absolute\",\n top: pos.top,\n left: pos.left,\n ...(typeof resolvedMin === \"number\" ? { minWidth: resolvedMin } : {}),\n transformOrigin: CONTENT_ORIGIN[pos.side],\n transform: anim ? \"none\" : CONTENT_HIDDEN[pos.side],\n opacity: anim ? 1 : 0,\n pointerEvents: !open ? \"none\" : \"auto\",\n transitionProperty: \"opacity, transform\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: anim ? PANEL_OPEN_EASING : PANEL_CLOSE_EASING,\n ...style,\n }}\n >\n {children}\n </div>\n );\n\n if (!portalReady) {\n return listbox;\n }\n return createPortal(listbox, document.body);\n};\n\n// ----- trigger + chevron -----\n\nexport type SelectTriggerProps = Omit<ButtonProps, \"type\"> & { asChild?: boolean };\n\nfunction mergeRef(\n store: React.RefObject<HTMLElement | null>,\n node: HTMLElement | null,\n fromChild?: React.Ref<HTMLElement> | null,\n) {\n store.current = node;\n if (typeof fromChild === \"function\") fromChild(node);\n else if (fromChild && typeof fromChild === \"object\")\n (fromChild as React.MutableRefObject<HTMLElement | null>).current = node;\n}\n\nexport const SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n function SelectTrigger(\n { children, asChild, className, onClick, disabled, ...buttonProps },\n ref,\n ) {\n const { open, setOpen, triggerRef } = useSelectOpen();\n const triggerVariant =\n (buttonProps as { variant?: ButtonProps[\"variant\"] }).variant ?? \"secondary\";\n\n const onPress = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n (onClick as React.MouseEventHandler<HTMLButtonElement> | undefined)?.(\n e as React.MouseEvent<HTMLButtonElement>,\n );\n e.stopPropagation();\n if (disabled) return;\n setOpen(!open);\n },\n [onClick, disabled, open, setOpen],\n );\n\n const setBtnRef = useCallback(\n (el: HTMLButtonElement | null) => {\n mergeRef(triggerRef, el, null);\n if (typeof ref === \"function\") ref(el);\n else if (ref) (ref as React.MutableRefObject<HTMLButtonElement | null>).current = el;\n },\n [ref, triggerRef],\n );\n\n if (asChild && React.isValidElement(children)) {\n const ch = children as React.ReactElement<{\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n }>;\n const childRef = (ch as { ref?: React.Ref<HTMLElement> | null }).ref;\n return React.cloneElement(ch, {\n ref: (n: HTMLElement | null) => mergeRef(triggerRef, n, childRef),\n className: cn(\"group w-fit max-w-full min-w-0 justify-start gap-2\", ch.props.className),\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n ch.props.onClick?.(e);\n onPress(e);\n },\n \"aria-expanded\": open,\n \"aria-haspopup\": \"listbox\",\n \"data-state\": open ? \"open\" : \"closed\",\n \"data-variant\": triggerVariant,\n ...((disabled !== undefined\n ? { \"aria-disabled\": disabled }\n : {}) as Record<string, unknown>),\n } as Partial<typeof ch.props>);\n }\n\n return (\n <Button\n ref={setBtnRef}\n type=\"button\"\n {...buttonProps}\n disabled={disabled}\n className={cn(\"group w-fit max-w-full min-w-0 justify-start gap-2\", className)}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n data-state={open ? \"open\" : \"closed\"}\n data-variant={triggerVariant}\n onClick={onPress as React.MouseEventHandler<HTMLButtonElement>}\n >\n {children}\n </Button>\n );\n },\n);\nSelectTrigger.displayName = \"SelectTrigger\";\n\nexport const SelectChevron: React.FC<React.ComponentProps<typeof ChevronDown>> = ({\n className,\n ...props\n}) => {\n const { open } = useSelectOpen();\n return (\n <ChevronDown\n aria-hidden\n className={cn(\"size-4 shrink-0\", open && \"rotate-180\", className)}\n {...props}\n />\n );\n};\n\n// ----- value display -----\n\nexport const SelectValue: React.FC<{\n placeholder?: string;\n className?: string;\n}> = ({ placeholder, className }) => {\n const c = useSelectValue();\n if (c.native) return null;\n const ph = placeholder ?? c.placeholder;\n const text = c.value ? c.labelFor(c.value) : undefined;\n const isEmpty = !c.value;\n // trigger sets `data-variant` so we can override the button’s full-strength `text-*`\n return (\n <span\n data-slot=\"select-value\"\n className={cn(\n \"min-w-0 flex-1 truncate text-left\",\n isEmpty &&\n cn(\n \"group-data-[variant=primary]:!text-background/50\",\n \"group-data-[variant=secondary]:!text-primary/50\",\n \"group-data-[variant=destructive]:!text-red-500/50\",\n \"group-data-[variant=success]:!text-green-500/50\",\n ),\n className,\n )}\n >\n {text != null ? text : ph}\n </span>\n );\n};\n\n// ----- items -----\n\nexport type SelectItemProps = React.HTMLAttributes<HTMLDivElement> & {\n value: string;\n children: React.ReactNode;\n disabled?: boolean;\n shortcut?: string;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n};\n\nconst SelectItemRow: React.FC<SelectItemProps> = ({\n value: v,\n children,\n disabled,\n shortcut,\n className,\n onClick: userClick,\n ...divProps\n}) => {\n const c = useSelectValue();\n const { setOpen } = useSelectOpen();\n const selected = c.value === v;\n\n const click: React.MouseEventHandler<HTMLDivElement> = (e) => {\n if (disabled) return;\n c.setValue(v);\n userClick?.(e);\n setOpen(false);\n };\n\n const keyDown: React.KeyboardEventHandler<HTMLDivElement> = (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n click(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...divProps}\n data-select-item=\"true\"\n role=\"option\"\n aria-selected={selected}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={click}\n onKeyDown={keyDown}\n className={cn(\n \"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\",\n SHEET_MENU_TEXT,\n !disabled &&\n \"text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n disabled &&\n \"lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50\",\n !disabled && \"cursor-pointer\",\n className,\n )}\n >\n <span className=\"min-w-0 flex-1\">{children}</span>\n {shortcut ? (\n <span\n className={cn(\n \"shrink-0 text-xs tracking-widest opacity-40\",\n SHEET_MENU_SHORTCUT,\n )}\n >\n {shortcut}\n </span>\n ) : null}\n <span className=\"flex size-4 shrink-0 items-center justify-center\" aria-hidden>\n {selected ? <Check className=\"size-3.5\" strokeWidth={2.5} /> : null}\n </span>\n </div>\n );\n};\n\nexport const SelectItem: React.FC<SelectItemProps> = ({\n value: v,\n children,\n disabled,\n ...rest\n}) => {\n const {\n native,\n setLabel,\n clearLabel,\n registerNativeItem,\n unregisterNativeItem,\n } = useSelectValue();\n useLayoutEffect(() => {\n setLabel(v, children);\n if (native) registerNativeItem({ value: v, label: children, disabled });\n return () => {\n clearLabel(v);\n if (native) unregisterNativeItem(v);\n };\n }, [\n v,\n children,\n disabled,\n native,\n setLabel,\n clearLabel,\n registerNativeItem,\n unregisterNativeItem,\n ]);\n\n if (native) return null;\n return (\n <SelectItemRow value={v} disabled={disabled} {...rest}>\n {children}\n </SelectItemRow>\n );\n};\nSelectItem.displayName = \"SelectItem\";\n","\"use client\";\n\nimport { Loader2 } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Pagination, type PaginationMeta } from \"./pagination\";\nimport {\n Select,\n SelectChevron,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\";\n\nexport type TablePaginationProps = {\n currentPage?: number;\n totalPages?: number;\n paginationItemsToDisplay?: number;\n currentItems?: number;\n totalItems?: number;\n onPageChange: (page: number) => void;\n onLimitChange: (limit: number) => void;\n className?: string;\n};\n\nexport function TablePagination({\n currentPage = 1,\n totalPages = 1,\n paginationItemsToDisplay = 10,\n currentItems,\n totalItems,\n onPageChange,\n onLimitChange,\n className,\n}: TablePaginationProps) {\n const itemsPerPage = Math.max(1, paginationItemsToDisplay);\n\n const paginationMeta = React.useMemo<PaginationMeta>(\n () => ({\n currentPage,\n totalItems: totalItems ?? Math.max(0, totalPages * itemsPerPage),\n itemsPerPage,\n totalPages,\n }),\n [currentPage, totalItems, totalPages, itemsPerPage],\n );\n\n return (\n <div\n className={cn(\n \"flex max-sm:flex-col items-center justify-between gap-3\",\n className,\n )}\n >\n <p\n className=\"text-primary/60 flex-1 text-sm whitespace-nowrap\"\n aria-live=\"polite\"\n >\n <span className=\"ml-2\">\n Showing{\" \"}\n <span className=\"text-primary\">\n {currentItems ?? paginationItemsToDisplay}\n </span>{\" \"}\n out of{\" \"}\n <span className=\"text-primary\">\n {totalItems ?? (\n <Loader2 className=\"mb-[3px] inline h-4 w-4 animate-spin\" />\n )}\n </span>{\" \"}\n results\n </span>\n </p>\n\n <div className=\"grow\">\n <Pagination meta={paginationMeta} onPageChange={onPageChange} />\n </div>\n\n <div className=\"flex flex-1 justify-end\">\n <Select\n value={paginationItemsToDisplay.toString()}\n onValueChange={(value) => {\n onLimitChange(parseInt(value, 10));\n }}\n >\n <SelectTrigger className=\"w-fit rounded-full whitespace-nowrap\">\n <SelectValue placeholder=\"Select number of results\" />\n <SelectChevron className=\"opacity-60\" />\n </SelectTrigger>\n <SelectContent>\n {[10, 25, 50, 100].map((pageSize) => (\n <SelectItem key={pageSize} value={pageSize.toString()}>\n {pageSize} / page\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n );\n}\n\nexport default TablePagination;\n"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/button.tsx","../../src/react/pagination.tsx","../../src/react/select.tsx","../../src/react/table-pagination.tsx"],"names":["React","jsx","Pagination","React3","useCallback","useMemo","jsxs","SelectTrigger","React4"],"mappings":"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","file":"table-pagination.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst sizeClass = {\n xs: \"h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\n/** Square hit targets for `iconOnly` — same keys as `sizeClass` (`default` | `lg`). */\nconst iconOnlySizeClass = {\n xs: \"size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\nconst roundedClass = {\n full: \"rounded-full\",\n lg: \"rounded-lg\",\n md: \"rounded-md\",\n} as const;\n\nconst variantClass = {\n primary:\n \"bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85\",\n secondary:\n \"bg-background text-primary border border-primary/10 hover:bg-primary/5\",\n destructive:\n \"bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5\",\n success:\n \"bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5\",\n} as const;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> & {\n /**\n * Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,\n * `success`) using Tailwind `red-500` / `green-500` text and matching borders on\n * `bg-background` (no solid fill).\n */\n variant?: keyof typeof variantClass;\n /**\n * Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons\n * default to `md` (square corners) unless you pass `rounded` explicitly.\n */\n rounded?: keyof typeof roundedClass;\n /** Height and horizontal padding: `default` or `lg` only. */\n size?: keyof typeof sizeClass;\n /**\n * Square icon-only control; same `size` presets (`default` | `lg`). Pair with\n * `aria-label` (or `title`) when there is no visible text.\n */\n iconOnly?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n type = \"button\",\n variant = \"secondary\",\n rounded: roundedProp,\n size = \"default\",\n iconOnly = false,\n disabled,\n ...props\n },\n ref,\n ) => {\n const rounded = roundedProp ?? (iconOnly ? \"md\" : \"full\");\n\n return (\n <button\n type={type}\n disabled={disabled}\n data-slot=\"button\"\n data-icon-only={iconOnly ? \"\" : undefined}\n className={cn(\n \"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\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n iconOnly ? iconOnlySizeClass[size] : sizeClass[size],\n roundedClass[rounded],\n variantClass[variant],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","\"use client\";\n\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Button, type ButtonProps } from \"./button\";\n\nexport type PaginationMeta = {\n currentPage: number;\n totalItems: number;\n itemsPerPage: number;\n /** omit to derive `ceil(totalItems / itemsPerPage)` (minimum 1) */\n totalPages?: number;\n};\n\nexport type PaginationProps = {\n meta: PaginationMeta;\n onPageChange?: (page: number) => void;\n className?: string;\n /** max page numbers in the sliding window (excluding first/last when ellipses show; default 3) */\n maxVisibleButtons?: number;\n disabled?: boolean;\n /**\n * density preset → resolved `Button` size for every control (`xs` → `default`;\n * `default` / `lg` → `lg`) so chevrons and page cells share one hit grid.\n */\n size?: ButtonProps[\"size\"];\n /** same as `Button` `rounded`; pagination defaults to `full` */\n rounded?: NonNullable<ButtonProps[\"rounded\"]>;\n};\n\nconst PaginationInner = React.forwardRef<HTMLDivElement, PaginationProps>(\n function Pagination(\n {\n meta,\n onPageChange,\n className,\n maxVisibleButtons = 3,\n disabled = false,\n size = \"default\",\n rounded = \"full\",\n },\n ref,\n ) {\n const handlePageChange = React.useCallback(\n (page: number) => {\n onPageChange?.(page);\n },\n [onPageChange],\n );\n\n const totalPages = React.useMemo(() => {\n const totalItems = Math.max(0, Number(meta.totalItems) || 0);\n const itemsPerPage = Math.max(1, Number(meta.itemsPerPage) || 16);\n if (meta.totalPages != null && Number.isFinite(meta.totalPages)) {\n return Math.max(1, Math.floor(Number(meta.totalPages)));\n }\n return Math.max(1, Math.ceil(totalItems / itemsPerPage));\n }, [meta.totalItems, meta.itemsPerPage, meta.totalPages]);\n\n const currentPage = React.useMemo(\n () => Math.max(1, Number(meta.currentPage) || 1),\n [meta.currentPage],\n );\n\n const { endPage, adjustedStart } = React.useMemo(() => {\n const sp = Math.max(1, currentPage - Math.floor(maxVisibleButtons / 2));\n const ep = Math.min(totalPages, sp + maxVisibleButtons - 1);\n const adj =\n ep - sp + 1 < maxVisibleButtons ? Math.max(1, ep - maxVisibleButtons + 1) : sp;\n return { endPage: ep, adjustedStart: adj };\n }, [currentPage, totalPages, maxVisibleButtons]);\n\n const middlePageNumbers = React.useMemo(\n () =>\n Array.from({ length: endPage - adjustedStart + 1 }, (_, i) => adjustedStart + i),\n [endPage, adjustedStart],\n );\n\n const navButtonSize = React.useMemo(\n (): NonNullable<ButtonProps[\"size\"]> => (size === \"xs\" ? \"default\" : \"lg\"),\n [size],\n );\n\n const ellipsisClassName = React.useMemo(\n () =>\n cn(\n \"inline-flex shrink-0 items-center justify-center\",\n navButtonSize === \"lg\"\n ? \"size-11 min-h-11 min-w-11\"\n : \"size-10 min-h-10 min-w-10\",\n rounded === \"full\"\n ? \"rounded-full\"\n : rounded === \"lg\"\n ? \"rounded-lg\"\n : \"rounded-md\",\n ),\n [navButtonSize, rounded],\n );\n\n const gapIconClassName = React.useMemo(\n () =>\n cn(\n \"mx-auto shrink-0 text-primary/45\",\n navButtonSize === \"lg\" ? \"size-[18px]\" : \"size-4\",\n ),\n [navButtonSize],\n );\n\n if (totalPages <= 1) return null;\n\n return (\n <div ref={ref} className={cn(\"flex w-full justify-center\", className)}>\n <nav\n role=\"navigation\"\n aria-label=\"Pagination\"\n className=\"text-primary flex items-center justify-center gap-0.5 text-base font-medium tabular-nums tracking-tight\"\n >\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0\"\n disabled={disabled || currentPage <= 1}\n onClick={() => handlePageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n <ChevronLeft aria-hidden className=\"size-5 shrink-0 mr-0.5\" />\n </Button>\n <div className=\"flex items-center gap-0.5\">\n {adjustedStart > 1 && (\n <>\n {currentPage === 1 ? (\n <Button\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{1}</span>\n </Button>\n ) : (\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(1)}\n aria-label=\"Go to page 1\"\n >\n <span className=\"tabular-nums\">1</span>\n </Button>\n )}\n {adjustedStart > 2 && (\n <span aria-hidden className={ellipsisClassName}>\n <MoreHorizontal className={gapIconClassName} aria-hidden />\n </span>\n )}\n </>\n )}\n {middlePageNumbers.map((page) =>\n currentPage === page ? (\n <Button\n key={page}\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{page}</span>\n </Button>\n ) : (\n <Button\n key={page}\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(page)}\n aria-label={`Go to page ${page}`}\n >\n <span className=\"tabular-nums\">{page}</span>\n </Button>\n ),\n )}\n {endPage < totalPages && (\n <>\n {endPage < totalPages - 1 && (\n <span aria-hidden className={ellipsisClassName}>\n <MoreHorizontal className={gapIconClassName} aria-hidden />\n </span>\n )}\n {currentPage === totalPages ? (\n <Button\n type=\"button\"\n variant=\"primary\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"tracking-tight\"\n aria-current=\"page\"\n tabIndex={-1}\n >\n <span className=\"tabular-nums\">{totalPages}</span>\n </Button>\n ) : (\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-none tracking-tight\"\n disabled={disabled}\n onClick={() => handlePageChange(totalPages)}\n aria-label={`Go to page ${totalPages}`}\n >\n <span className=\"tabular-nums\">{totalPages}</span>\n </Button>\n )}\n </>\n )}\n </div>\n <Button\n type=\"button\"\n rounded={rounded}\n iconOnly\n size={navButtonSize}\n className=\"border-0 tracking-tight focus-visible:border-transparent focus-visible:ring-0\"\n disabled={disabled || currentPage >= totalPages}\n onClick={() => handlePageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n <ChevronRight aria-hidden className=\"size-5 shrink-0 ml-0.5\" />\n </Button>\n </nav>\n </div>\n );\n },\n);\n\nPaginationInner.displayName = \"Pagination\";\n\nexport const Pagination = React.memo(PaginationInner);\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Check, ChevronDown, X } from \"lucide-react\";\n\nimport { Button, type ButtonProps } from \"./button\";\nimport { cn } from \"../lib/utils\";\n\nconst PANEL_OPEN_EASING = \"cubic-bezier(0,0.55,0.45,1)\";\nconst PANEL_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\nconst MOBILE_SHEET_MAX_PX = 1024;\nconst MOBILE_SHEET_MS = 175;\nconst MOBILE_SHEET_IN = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst MOBILE_SHEET_OUT = \"cubic-bezier(0.85, 0, 1, 0.15)\";\nconst SLIDE_DEFAULT_PX = 120;\nconst SHEET_MENU_TEXT = \"max-[1024px]:text-base\";\nconst SHEET_MENU_SHORTCUT = \"max-[1024px]:text-sm\";\n/** Shrink on the preferred side until space drops below ~2 rows; then allow flip. */\nconst SELECT_FLIP_MIN_SPACE_PX = 100;\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\ntype Pos = {\n top: number;\n left: number;\n side: Side;\n maxHeight?: number;\n};\n\nconst CONTENT_ORIGIN: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right center\",\n right: \"left center\",\n};\n\nconst CONTENT_HIDDEN: Record<Side, string> = {\n bottom: \"translateY(-4px) scale(0.97)\",\n top: \"translateY(4px) scale(0.97)\",\n left: \"translateX(4px) scale(0.97)\",\n right: \"translateX(-4px) scale(0.97)\",\n};\n\nfunction computeMenuPosition(\n trigger: HTMLElement,\n menu: HTMLElement,\n side: Side,\n align: Align,\n offset: number,\n pad: number,\n): Pos {\n const tr = trigger.getBoundingClientRect();\n const mr = menu.getBoundingClientRect();\n const contentHeight = menu.scrollHeight;\n const vh = window.innerHeight;\n const vw = window.innerWidth;\n const sx = window.scrollX;\n const sy = window.scrollY;\n\n let top = 0;\n let left = 0;\n let effectiveSide = side;\n let maxHeight: number | undefined;\n\n const placeVertical = (s: Side, height: number) => {\n if (s === \"bottom\") top = tr.bottom + sy + offset;\n else top = tr.top + sy - height - offset;\n if (align === \"start\") left = tr.left + sx;\n else if (align === \"end\") left = tr.right + sx - mr.width;\n else left = tr.left + sx + tr.width / 2 - mr.width / 2;\n };\n\n const place = (s: Side, height = contentHeight) => {\n switch (s) {\n case \"bottom\":\n case \"top\":\n placeVertical(s, height);\n break;\n case \"right\":\n left = tr.right + sx + offset;\n if (align === \"start\") top = tr.top + sy;\n else if (align === \"end\") top = tr.bottom + sy - mr.height;\n else top = tr.top + sy + tr.height / 2 - mr.height / 2;\n break;\n case \"left\":\n left = tr.left + sx - mr.width - offset;\n if (align === \"start\") top = tr.top + sy;\n else if (align === \"end\") top = tr.bottom + sy - mr.height;\n else top = tr.top + sy + tr.height / 2 - mr.height / 2;\n break;\n }\n };\n\n place(side);\n\n const spaceBelow = Math.max(0, vh - pad - tr.bottom - offset);\n const spaceAbove = Math.max(0, tr.top - offset - pad);\n\n if (side === \"bottom\" || side === \"top\") {\n const primarySpace = side === \"bottom\" ? spaceBelow : spaceAbove;\n const alternateSpace = side === \"bottom\" ? spaceAbove : spaceBelow;\n const alternateSide: Side = side === \"bottom\" ? \"top\" : \"bottom\";\n\n if (contentHeight > primarySpace) {\n maxHeight = Math.min(contentHeight, primarySpace);\n place(side, maxHeight);\n }\n\n if (\n contentHeight > primarySpace &&\n primarySpace < SELECT_FLIP_MIN_SPACE_PX &&\n alternateSpace > primarySpace\n ) {\n effectiveSide = alternateSide;\n maxHeight = Math.min(contentHeight, alternateSpace);\n place(alternateSide, maxHeight);\n }\n } else if (side === \"right\" && left + mr.width > vw + sx - pad) {\n const flip = tr.left + sx - mr.width - offset;\n if (flip >= sx + pad) {\n effectiveSide = \"left\";\n left = flip;\n }\n } else if (side === \"left\" && left < sx + pad) {\n const flip = tr.right + sx + offset;\n if (flip + mr.width <= vw + sx - pad) {\n effectiveSide = \"right\";\n left = flip;\n }\n }\n\n const layoutHeight = maxHeight ?? contentHeight;\n left = Math.max(sx + pad, Math.min(left, vw + sx - mr.width - pad));\n top = Math.max(sy + pad, Math.min(top, vh + sy - layoutHeight - pad));\n\n return { top, left, side: effectiveSide, maxHeight };\n}\n\nfunction useNarrowSheetViewport(breakpoint = 1025) {\n const [narrow, setNarrow] = useState(false);\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n setNarrow(mq.matches);\n const h = (e: MediaQueryListEvent) => setNarrow(e.matches);\n mq.addEventListener(\"change\", h);\n return () => mq.removeEventListener(\"change\", h);\n }, [breakpoint]);\n return narrow;\n}\n\nfunction plainTextFromNode(node: React.ReactNode): string {\n if (node == null || node === false || node === true) return \"\";\n if (typeof node === \"string\" || typeof node === \"number\")\n return String(node);\n if (Array.isArray(node)) return node.map(plainTextFromNode).join(\"\");\n if (React.isValidElement(node)) {\n return plainTextFromNode(\n (node.props as { children?: React.ReactNode }).children,\n );\n }\n return \"\";\n}\n\n// ----- value context -----\n\ntype ItemRegistration = { value: string; label: React.ReactNode; disabled?: boolean };\n\ntype ValueCtx = {\n native: boolean;\n value: string;\n setValue: (v: string) => void;\n disabled: boolean;\n setLabel: (v: string, n: React.ReactNode) => void;\n clearLabel: (v: string) => void;\n registerNativeItem: (e: ItemRegistration) => void;\n unregisterNativeItem: (v: string) => void;\n labelFor: (v: string) => React.ReactNode | undefined;\n placeholder: string;\n};\n\nconst ValueContext = React.createContext<ValueCtx | null>(null);\n\nfunction useSelectValue() {\n const c = React.useContext(ValueContext);\n if (!c) throw new Error(\"Select subcomponents must be used within <Select>\");\n return c;\n}\n\n// ----- open context (custom mode only) -----\n\ntype OpenCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n};\n\nconst OpenContext = React.createContext<OpenCtx | null>(null);\n\nfunction useSelectOpen() {\n const c = React.useContext(OpenContext);\n if (!c)\n throw new Error(\n \"Select.Trigger, SelectContent, and SelectItem need <Select> without native\",\n );\n return c;\n}\n\n// ----- root -----\n\nexport type SelectProps = {\n children: React.ReactNode;\n className?: string;\n value?: string;\n defaultValue?: string;\n onValueChange?: (v: string) => void;\n /** native `<select>`; default `false` — custom trigger + list / sheet. */\n native?: boolean;\n disabled?: boolean;\n name?: string;\n id?: string;\n placeholder?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n};\n\nexport const Select = ({\n children,\n className,\n value: valueProp,\n defaultValue = \"\",\n onValueChange,\n native: nativeProp = false,\n disabled = false,\n name,\n id: idAttr,\n placeholder = \"Select\",\n open: openProp,\n onOpenChange,\n}: SelectProps) => {\n const isValueControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const value = isValueControlled ? (valueProp as string) : internalValue;\n\n const [labels, setLabels] = useState<Record<string, React.ReactNode>>({});\n const [nativeMeta, setNativeMeta] = useState<\n Record<string, { label: React.ReactNode; disabled?: boolean }>\n >({});\n const [nativeOrder, setNativeOrder] = useState<string[]>([]);\n\n const setValue = useCallback(\n (v: string) => {\n if (!isValueControlled) setInternalValue(v);\n onValueChange?.(v);\n },\n [isValueControlled, onValueChange],\n );\n\n const setLabel = useCallback((v: string, n: React.ReactNode) => {\n setLabels((p) => (p[v] === n ? p : { ...p, [v]: n }));\n }, []);\n\n const clearLabel = useCallback((v: string) => {\n setLabels((p) => {\n if (!(v in p)) return p;\n const n = { ...p };\n delete n[v];\n return n;\n });\n }, []);\n\n // labelFor keeps [] deps and reads labelsRef so selectitem effect deps stay stable;\n // valueCtx still lists `labels` so provider value updates and selectvalue re-renders\n const labelsRef = useRef(labels);\n labelsRef.current = labels;\n const labelFor = useCallback(\n (v: string) => labelsRef.current[v] as React.ReactNode | undefined,\n [],\n );\n\n const registerNativeItem = useCallback(\n (e: ItemRegistration) => {\n setLabel(e.value, e.label);\n setNativeMeta((p) => ({ ...p, [e.value]: { label: e.label, disabled: e.disabled } }));\n setNativeOrder((o) => (o.includes(e.value) ? o : [...o, e.value]));\n },\n [setLabel],\n );\n\n const unregisterNativeItem = useCallback(\n (v: string) => {\n setNativeMeta((p) => {\n if (!(v in p)) return p;\n const n = { ...p };\n delete n[v];\n return n;\n });\n setNativeOrder((o) => o.filter((x) => x !== v));\n clearLabel(v);\n },\n [clearLabel],\n );\n\n const valueCtx: ValueCtx = useMemo(\n () => ({\n native: nativeProp,\n value,\n setValue,\n disabled,\n setLabel,\n clearLabel,\n registerNativeItem,\n unregisterNativeItem,\n labelFor,\n placeholder,\n }),\n [\n nativeProp,\n value,\n setValue,\n disabled,\n labels,\n setLabel,\n clearLabel,\n registerNativeItem,\n unregisterNativeItem,\n labelFor,\n placeholder,\n ],\n );\n\n if (nativeProp) {\n return (\n <ValueContext.Provider value={valueCtx}>\n <div\n className={cn(\n \"group relative inline-block w-max min-w-0 max-w-full\",\n className,\n )}\n >\n <select\n id={idAttr}\n name={name}\n className={cn(\n \"peer\",\n \"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\",\n \"h-10 min-h-10 text-sm font-medium\",\n \"rounded-full transition-[color,background-color,box-shadow,transform] duration-150\",\n \"focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"active:scale-[0.99]\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n value={value}\n disabled={disabled}\n onChange={(ev) => setValue(ev.target.value)}\n >\n <option value=\"\" disabled>\n {placeholder}\n </option>\n {nativeOrder.map((key) => {\n const m = nativeMeta[key];\n if (!m) return null;\n return (\n <option key={key} value={key} disabled={m.disabled}>\n {plainTextFromNode(m.label)}\n </option>\n );\n })}\n </select>\n <ChevronDown\n aria-hidden\n className=\"text-primary/50 pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 peer-disabled:opacity-50\"\n />\n </div>\n {children}\n </ValueContext.Provider>\n );\n }\n\n return (\n <ValueContext.Provider value={valueCtx}>\n <SelectOpenBridge open={openProp} onOpenChange={onOpenChange}>\n <div className={cn(\"inline-block min-w-0 max-w-full\", className)}>{children}</div>\n </SelectOpenBridge>\n </ValueContext.Provider>\n );\n};\n\nfunction SelectOpenBridge({\n children,\n open: controlled,\n onOpenChange,\n}: {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (o: boolean) => void;\n}) {\n const [inner, setInner] = useState(false);\n const isControlled = controlled !== undefined;\n const open = isControlled ? (controlled as boolean) : inner;\n const setOpen = useCallback(\n (o: boolean) => {\n if (!isControlled) setInner(o);\n onOpenChange?.(o);\n },\n [isControlled, onOpenChange],\n );\n const triggerRef = useRef<HTMLElement | null>(null);\n const ctx = useMemo(\n () => ({ open, setOpen, triggerRef }) satisfies OpenCtx,\n [open, setOpen],\n );\n return <OpenContext.Provider value={ctx}>{children}</OpenContext.Provider>;\n}\n\n// ----- mobile sheet -----\n\nconst SheetClose = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, type = \"button\", ...p }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"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]\",\n className,\n )}\n {...p}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n));\nSheetClose.displayName = \"SelectSheetClose\";\n\nexport type SelectMobileSheetOptions = {\n sheet?: boolean;\n title?: string;\n className?: string;\n contentClassName?: string;\n};\n\nfunction resolveSheetOpts(o?: SelectMobileSheetOptions) {\n return {\n sheet: o?.sheet ?? true,\n title: o?.title,\n panelClass: o?.className,\n bodyClass: o?.contentClassName,\n };\n}\n\ntype SheetPortalProps = React.HTMLAttributes<HTMLDivElement> & {\n open: boolean;\n isAnimating: boolean;\n slideEntrance: boolean;\n slideOffsetPx: number;\n sheetTitle?: string;\n sheetPanelClassName?: string;\n contentClassName?: string;\n onRequestClose: () => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n};\n\nfunction MobileSheetPortal({\n open,\n isAnimating,\n slideEntrance,\n slideOffsetPx,\n sheetTitle,\n sheetPanelClassName,\n contentClassName,\n onRequestClose,\n menuRef,\n children,\n className,\n style,\n ...rest\n}: SheetPortalProps) {\n const ease = open ? MOBILE_SHEET_IN : MOBILE_SHEET_OUT;\n const hiddenY = slideEntrance ? `translateY(${slideOffsetPx}px)` : \"translateY(100%)\";\n return createPortal(\n <div className=\"fixed inset-0 z-50 flex items-end justify-center p-0\">\n <div\n className={cn(\n \"fixed inset-0 bg-black/40 dark:bg-black/60\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n )}\n style={{\n transition: `opacity ${MOBILE_SHEET_MS}ms ${ease}`,\n }}\n onClick={onRequestClose}\n />\n <div\n {...rest}\n ref={menuRef}\n className={cn(\n \"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\",\n \"rounded-t-2xl rounded-b-none border-x-0 border-b-0 border-t\",\n sheetPanelClassName,\n className,\n )}\n style={{\n transform: isAnimating ? \"translateY(0)\" : hiddenY,\n opacity: isAnimating ? 1 : 0,\n transition: `transform ${MOBILE_SHEET_MS}ms ${ease}, opacity ${MOBILE_SHEET_MS}ms ${ease}`,\n ...style,\n }}\n >\n <div\n className={cn(\n \"flex w-full shrink-0 items-center py-2 pl-4 pr-2\",\n sheetTitle ? \"justify-between gap-3\" : \"justify-end\",\n )}\n >\n {sheetTitle ? (\n <p className=\"text-foreground min-w-0 flex-1 truncate text-base font-semibold\">\n {sheetTitle}\n </p>\n ) : null}\n <SheetClose\n onClick={(e) => {\n e.stopPropagation();\n onRequestClose();\n }}\n />\n </div>\n <div\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto pb-[calc(5rem+env(safe-area-inset-bottom,0px))]\",\n contentClassName,\n )}\n >\n {children}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\n// ----- list helpers -----\n\nfunction listFocusableItems(host: HTMLElement): HTMLElement[] {\n return Array.from(\n host.querySelectorAll<HTMLElement>(\n '[data-select-item=\"true\"]:not([aria-disabled=\"true\"])',\n ),\n );\n}\n\n// ----- content -----\n\nexport type SelectContentProps = React.HTMLAttributes<HTMLDivElement> & {\n side?: Side;\n align?: Align;\n offset?: number;\n duration?: number;\n viewportPadding?: number;\n closeOnEscape?: boolean;\n minWidth?: number | \"trigger\";\n loop?: boolean;\n mobileOptions?: SelectMobileSheetOptions;\n slideEntrance?: boolean;\n slideEntranceOffsetPx?: number;\n};\n\nexport const SelectContent: React.FC<SelectContentProps> = ({\n children,\n side = \"bottom\",\n align = \"start\",\n offset = 10,\n duration = 80,\n viewportPadding = 8,\n closeOnEscape = true,\n minWidth = \"trigger\",\n loop = true,\n mobileOptions,\n slideEntrance = true,\n slideEntranceOffsetPx: slidePxProp,\n className,\n style,\n ...rest\n}) => {\n const narrow = useNarrowSheetViewport(MOBILE_SHEET_MAX_PX + 1);\n const { open, setOpen, triggerRef } = useSelectOpen();\n const [show, setShow] = useState(false);\n const [anim, setAnim] = useState(false);\n const [pos, setPos] = useState<Pos>({ top: -9999, left: -9999, side });\n const [triggerW, setTriggerW] = useState(0);\n const menuRef = useRef<HTMLDivElement>(null);\n const sheet = useMemo(() => resolveSheetOpts(mobileOptions), [mobileOptions]);\n const slidePx = slidePxProp ?? SLIDE_DEFAULT_PX;\n const closeMs = narrow && sheet.sheet ? MOBILE_SHEET_MS : duration;\n const close = useCallback(() => setOpen(false), [setOpen]);\n const [portalReady, setPortalReady] = useState(false);\n useLayoutEffect(() => {\n setPortalReady(true);\n }, []);\n\n useEffect(() => {\n if (open) {\n setShow(true);\n } else {\n setAnim(false);\n const t = setTimeout(() => setShow(false), closeMs);\n return () => clearTimeout(t);\n }\n }, [open, closeMs]);\n\n useEffect(() => {\n if (!show || !open) return;\n let r2 = 0;\n const r1 = requestAnimationFrame(() => {\n r2 = requestAnimationFrame(() => setAnim(true));\n });\n return () => {\n cancelAnimationFrame(r1);\n if (r2) cancelAnimationFrame(r2);\n };\n }, [show, open]);\n\n useLayoutEffect(() => {\n if (!triggerRef.current || !menuRef.current) return;\n if (!open && !show) return;\n const run = () => {\n if (!triggerRef.current || !menuRef.current) return;\n setTriggerW(triggerRef.current.getBoundingClientRect().width);\n setPos(\n computeMenuPosition(\n triggerRef.current,\n menuRef.current,\n side,\n align,\n offset,\n viewportPadding,\n ),\n );\n };\n run();\n window.addEventListener(\"resize\", run);\n window.addEventListener(\"scroll\", run, true);\n return () => {\n window.removeEventListener(\"resize\", run);\n window.removeEventListener(\"scroll\", run, true);\n };\n }, [open, show, side, align, offset, viewportPadding, triggerRef]);\n\n useEffect(() => {\n if (anim && menuRef.current) menuRef.current.focus();\n }, [anim]);\n\n useEffect(() => {\n if (!open) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || triggerRef.current?.contains(t)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", onDoc);\n return () => document.removeEventListener(\"mousedown\", onDoc);\n }, [open, setOpen, triggerRef]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n const m = menuRef.current;\n if (!m) return;\n const active = document.activeElement as HTMLElement | null;\n if (active && !m.contains(active) && !triggerRef.current?.contains(active))\n return;\n const items = listFocusableItems(m);\n const i = items.indexOf(active!);\n switch (e.key) {\n case \"Escape\":\n if (closeOnEscape) {\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n }\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (!items.length) break;\n if (i === -1 || (i === items.length - 1 && loop)) items[0]?.focus();\n else if (i < items.length - 1) items[i + 1]?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (!items.length) break;\n if (i <= 0 && loop) items[items.length - 1]?.focus();\n else if (i > 0) items[i - 1]?.focus();\n break;\n case \"Home\":\n e.preventDefault();\n items[0]?.focus();\n break;\n case \"End\":\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n case \"Tab\":\n setOpen(false);\n break;\n default:\n break;\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, closeOnEscape, loop, setOpen, triggerRef]);\n\n const lockBodyScroll = (open || show) && narrow && sheet.sheet;\n useEffect(() => {\n if (!lockBodyScroll) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = prev;\n };\n }, [lockBodyScroll]);\n\n if (narrow && sheet.sheet) {\n if (!open && !show) {\n const registrationSlot = (\n <div className=\"sr-only pointer-events-none\" aria-hidden>\n {children}\n </div>\n );\n if (!portalReady) return registrationSlot;\n return createPortal(registrationSlot, document.body);\n }\n return (\n <MobileSheetPortal\n {...rest}\n open={open}\n isAnimating={anim}\n slideEntrance={slideEntrance}\n slideOffsetPx={slidePx}\n sheetTitle={sheet.title}\n sheetPanelClassName={sheet.panelClass}\n contentClassName={sheet.bodyClass}\n onRequestClose={close}\n menuRef={menuRef}\n className={className}\n style={style}\n role=\"listbox\"\n tabIndex={-1}\n aria-label={sheet.title}\n >\n {children}\n </MobileSheetPortal>\n );\n }\n\n const resolvedMin =\n minWidth === \"trigger\" ? (triggerW > 0 ? triggerW : undefined) : minWidth;\n\n const listbox = (\n <div\n {...rest}\n ref={menuRef}\n role=\"listbox\"\n tabIndex={-1}\n aria-hidden={!open}\n className={cn(\n \"bg-background border-primary/10 absolute z-50 rounded-xl border py-1.5 shadow-xl outline-none\",\n className,\n pos.maxHeight != null ? \"overflow-y-auto overscroll-contain\" : \"overflow-hidden\",\n )}\n style={{\n position: \"absolute\",\n top: pos.top,\n left: pos.left,\n ...(typeof resolvedMin === \"number\" ? { minWidth: resolvedMin } : {}),\n maxHeight: pos.maxHeight,\n transformOrigin: CONTENT_ORIGIN[pos.side],\n transform: anim ? \"none\" : CONTENT_HIDDEN[pos.side],\n opacity: anim ? 1 : 0,\n pointerEvents: !open ? \"none\" : \"auto\",\n transitionProperty: \"opacity, transform\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: anim ? PANEL_OPEN_EASING : PANEL_CLOSE_EASING,\n ...style,\n }}\n >\n {children}\n </div>\n );\n\n if (!portalReady) {\n return listbox;\n }\n return createPortal(listbox, document.body);\n};\n\n// ----- trigger + chevron -----\n\nexport type SelectTriggerProps = Omit<ButtonProps, \"type\"> & { asChild?: boolean };\n\nfunction mergeRef(\n store: React.RefObject<HTMLElement | null>,\n node: HTMLElement | null,\n fromChild?: React.Ref<HTMLElement> | null,\n) {\n store.current = node;\n if (typeof fromChild === \"function\") fromChild(node);\n else if (fromChild && typeof fromChild === \"object\")\n (fromChild as React.MutableRefObject<HTMLElement | null>).current = node;\n}\n\nexport const SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n function SelectTrigger(\n { children, asChild, className, onClick, disabled, ...buttonProps },\n ref,\n ) {\n const { open, setOpen, triggerRef } = useSelectOpen();\n const triggerVariant =\n (buttonProps as { variant?: ButtonProps[\"variant\"] }).variant ?? \"secondary\";\n\n const onPress = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n (onClick as React.MouseEventHandler<HTMLButtonElement> | undefined)?.(\n e as React.MouseEvent<HTMLButtonElement>,\n );\n e.stopPropagation();\n if (disabled) return;\n setOpen(!open);\n },\n [onClick, disabled, open, setOpen],\n );\n\n const setBtnRef = useCallback(\n (el: HTMLButtonElement | null) => {\n mergeRef(triggerRef, el, null);\n if (typeof ref === \"function\") ref(el);\n else if (ref) (ref as React.MutableRefObject<HTMLButtonElement | null>).current = el;\n },\n [ref, triggerRef],\n );\n\n if (asChild && React.isValidElement(children)) {\n const ch = children as React.ReactElement<{\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n }>;\n const childRef = (ch as { ref?: React.Ref<HTMLElement> | null }).ref;\n return React.cloneElement(ch, {\n ref: (n: HTMLElement | null) => mergeRef(triggerRef, n, childRef),\n className: cn(\"group w-fit max-w-full min-w-0 justify-start gap-2\", ch.props.className),\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n ch.props.onClick?.(e);\n onPress(e);\n },\n \"aria-expanded\": open,\n \"aria-haspopup\": \"listbox\",\n \"data-state\": open ? \"open\" : \"closed\",\n \"data-variant\": triggerVariant,\n ...((disabled !== undefined\n ? { \"aria-disabled\": disabled }\n : {}) as Record<string, unknown>),\n } as Partial<typeof ch.props>);\n }\n\n return (\n <Button\n ref={setBtnRef}\n type=\"button\"\n {...buttonProps}\n disabled={disabled}\n className={cn(\"group w-fit max-w-full min-w-0 justify-start gap-2\", className)}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n data-state={open ? \"open\" : \"closed\"}\n data-variant={triggerVariant}\n onClick={onPress as React.MouseEventHandler<HTMLButtonElement>}\n >\n {children}\n </Button>\n );\n },\n);\nSelectTrigger.displayName = \"SelectTrigger\";\n\nexport const SelectChevron: React.FC<React.ComponentProps<typeof ChevronDown>> = ({\n className,\n ...props\n}) => {\n const { open } = useSelectOpen();\n return (\n <ChevronDown\n aria-hidden\n className={cn(\"size-4 shrink-0\", open && \"rotate-180\", className)}\n {...props}\n />\n );\n};\n\n// ----- value display -----\n\nexport const SelectValue: React.FC<{\n placeholder?: string;\n className?: string;\n}> = ({ placeholder, className }) => {\n const c = useSelectValue();\n if (c.native) return null;\n const ph = placeholder ?? c.placeholder;\n const text = c.value ? c.labelFor(c.value) : undefined;\n const isEmpty = !c.value;\n // trigger sets `data-variant` so we can override the button’s full-strength `text-*`\n return (\n <span\n data-slot=\"select-value\"\n className={cn(\n \"min-w-0 flex-1 truncate text-left\",\n isEmpty &&\n cn(\n \"group-data-[variant=primary]:!text-background/50\",\n \"group-data-[variant=secondary]:!text-primary/50\",\n \"group-data-[variant=destructive]:!text-red-500/50\",\n \"group-data-[variant=success]:!text-green-500/50\",\n ),\n className,\n )}\n >\n {text != null ? text : ph}\n </span>\n );\n};\n\n// ----- items -----\n\nexport type SelectItemProps = React.HTMLAttributes<HTMLDivElement> & {\n value: string;\n children: React.ReactNode;\n disabled?: boolean;\n shortcut?: string;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n};\n\nconst SelectItemRow: React.FC<SelectItemProps> = ({\n value: v,\n children,\n disabled,\n shortcut,\n className,\n onClick: userClick,\n ...divProps\n}) => {\n const c = useSelectValue();\n const { setOpen } = useSelectOpen();\n const selected = c.value === v;\n\n const click: React.MouseEventHandler<HTMLDivElement> = (e) => {\n if (disabled) return;\n c.setValue(v);\n userClick?.(e);\n setOpen(false);\n };\n\n const keyDown: React.KeyboardEventHandler<HTMLDivElement> = (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n click(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...divProps}\n data-select-item=\"true\"\n role=\"option\"\n aria-selected={selected}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={click}\n onKeyDown={keyDown}\n className={cn(\n \"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\",\n SHEET_MENU_TEXT,\n !disabled &&\n \"text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n disabled &&\n \"lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50\",\n !disabled && \"cursor-pointer\",\n className,\n )}\n >\n <span className=\"min-w-0 flex-1\">{children}</span>\n {shortcut ? (\n <span\n className={cn(\n \"shrink-0 text-xs tracking-widest opacity-40\",\n SHEET_MENU_SHORTCUT,\n )}\n >\n {shortcut}\n </span>\n ) : null}\n <span className=\"flex size-4 shrink-0 items-center justify-center\" aria-hidden>\n {selected ? <Check className=\"size-3.5\" strokeWidth={2.5} /> : null}\n </span>\n </div>\n );\n};\n\nexport const SelectItem: React.FC<SelectItemProps> = ({\n value: v,\n children,\n disabled,\n ...rest\n}) => {\n const {\n native,\n setLabel,\n clearLabel,\n registerNativeItem,\n unregisterNativeItem,\n } = useSelectValue();\n useLayoutEffect(() => {\n setLabel(v, children);\n if (native) registerNativeItem({ value: v, label: children, disabled });\n return () => {\n clearLabel(v);\n if (native) unregisterNativeItem(v);\n };\n }, [\n v,\n children,\n disabled,\n native,\n setLabel,\n clearLabel,\n registerNativeItem,\n unregisterNativeItem,\n ]);\n\n if (native) return null;\n return (\n <SelectItemRow value={v} disabled={disabled} {...rest}>\n {children}\n </SelectItemRow>\n );\n};\nSelectItem.displayName = \"SelectItem\";\n","\"use client\";\n\nimport { Loader2 } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\nimport { Pagination, type PaginationMeta } from \"./pagination\";\nimport {\n Select,\n SelectChevron,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\";\n\nexport type TablePaginationProps = {\n currentPage?: number;\n totalPages?: number;\n paginationItemsToDisplay?: number;\n currentItems?: number;\n totalItems?: number;\n onPageChange: (page: number) => void;\n onLimitChange: (limit: number) => void;\n className?: string;\n};\n\nexport function TablePagination({\n currentPage = 1,\n totalPages = 1,\n paginationItemsToDisplay = 10,\n currentItems,\n totalItems,\n onPageChange,\n onLimitChange,\n className,\n}: TablePaginationProps) {\n const itemsPerPage = Math.max(1, paginationItemsToDisplay);\n\n const paginationMeta = React.useMemo<PaginationMeta>(\n () => ({\n currentPage,\n totalItems: totalItems ?? Math.max(0, totalPages * itemsPerPage),\n itemsPerPage,\n totalPages,\n }),\n [currentPage, totalItems, totalPages, itemsPerPage],\n );\n\n return (\n <div\n className={cn(\n \"flex max-sm:flex-col items-center justify-between gap-3\",\n className,\n )}\n >\n <p\n className=\"text-primary/60 flex-1 text-sm whitespace-nowrap\"\n aria-live=\"polite\"\n >\n <span className=\"ml-2\">\n Showing{\" \"}\n <span className=\"text-primary\">\n {currentItems ?? paginationItemsToDisplay}\n </span>{\" \"}\n out of{\" \"}\n <span className=\"text-primary\">\n {totalItems ?? (\n <Loader2 className=\"mb-[3px] inline h-4 w-4 animate-spin\" />\n )}\n </span>{\" \"}\n results\n </span>\n </p>\n\n <div className=\"grow\">\n <Pagination meta={paginationMeta} onPageChange={onPageChange} />\n </div>\n\n <div className=\"flex flex-1 justify-end\">\n <Select\n value={paginationItemsToDisplay.toString()}\n onValueChange={(value) => {\n onLimitChange(parseInt(value, 10));\n }}\n >\n <SelectTrigger className=\"w-fit rounded-full whitespace-nowrap\">\n <SelectValue placeholder=\"Select number of results\" />\n <SelectChevron className=\"opacity-60\" />\n </SelectTrigger>\n <SelectContent>\n {[10, 25, 50, 100].map((pageSize) => (\n <SelectItem key={pageSize} value={pageSize.toString()}>\n {pageSize} / page\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n );\n}\n\nexport default TablePagination;\n"]}