@avenue-ticketing/ui 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/react/avatar.d.ts +42 -0
  2. package/dist/react/avatar.js +159 -0
  3. package/dist/react/avatar.js.map +1 -0
  4. package/dist/react/badge.d.ts +12 -0
  5. package/dist/react/badge.js +35 -1
  6. package/dist/react/badge.js.map +1 -1
  7. package/dist/react/button.d.ts +1 -1
  8. package/dist/react/button.js +3 -3
  9. package/dist/react/button.js.map +1 -1
  10. package/dist/react/calendar.d.ts +13 -0
  11. package/dist/react/calendar.js +4639 -0
  12. package/dist/react/calendar.js.map +1 -0
  13. package/dist/react/card.d.ts +11 -0
  14. package/dist/react/card.js +113 -0
  15. package/dist/react/card.js.map +1 -0
  16. package/dist/react/checkbox.d.ts +11 -0
  17. package/dist/react/checkbox.js +129 -0
  18. package/dist/react/checkbox.js.map +1 -0
  19. package/dist/react/datetime-picker.d.ts +21 -0
  20. package/dist/react/datetime-picker.js +6124 -0
  21. package/dist/react/datetime-picker.js.map +1 -0
  22. package/dist/react/dialog.js +1 -1
  23. package/dist/react/dialog.js.map +1 -1
  24. package/dist/react/dropdown.d.ts +34 -9
  25. package/dist/react/dropdown.js +295 -144
  26. package/dist/react/dropdown.js.map +1 -1
  27. package/dist/react/input.d.ts +7 -0
  28. package/dist/react/input.js +15 -2
  29. package/dist/react/input.js.map +1 -1
  30. package/dist/react/pagination.d.ts +28 -0
  31. package/dist/react/pagination.js +262 -0
  32. package/dist/react/pagination.js.map +1 -0
  33. package/dist/react/popover.d.ts +76 -0
  34. package/dist/react/popover.js +564 -0
  35. package/dist/react/popover.js.map +1 -0
  36. package/dist/react/scroll-header.js +13 -1
  37. package/dist/react/scroll-header.js.map +1 -1
  38. package/dist/react/scroll-wheel.d.ts +45 -0
  39. package/dist/react/scroll-wheel.js +557 -0
  40. package/dist/react/scroll-wheel.js.map +1 -0
  41. package/dist/react/select.d.ts +62 -0
  42. package/dist/react/select.js +889 -0
  43. package/dist/react/select.js.map +1 -0
  44. package/dist/react/sheet.js +1 -1
  45. package/dist/react/sheet.js.map +1 -1
  46. package/dist/react/switch.d.ts +38 -0
  47. package/dist/react/switch.js +117 -0
  48. package/dist/react/switch.js.map +1 -0
  49. package/dist/react/table-pagination.d.ts +15 -0
  50. package/dist/react/table-pagination.js +1153 -0
  51. package/dist/react/table-pagination.js.map +1 -0
  52. package/dist/react/table-view/column-menu.d.ts +15 -0
  53. package/dist/react/table-view/column-menu.js +955 -0
  54. package/dist/react/table-view/column-menu.js.map +1 -0
  55. package/dist/react/table-view/index.d.ts +70 -0
  56. package/dist/react/table-view/index.js +2190 -0
  57. package/dist/react/table-view/index.js.map +1 -0
  58. package/dist/react/table.d.ts +86 -0
  59. package/dist/react/table.js +414 -0
  60. package/dist/react/table.js.map +1 -0
  61. package/dist/react/tabs.d.ts +9 -3
  62. package/dist/react/tabs.js +204 -48
  63. package/dist/react/tabs.js.map +1 -1
  64. package/dist/react/textarea.d.ts +6 -0
  65. package/dist/react/textarea.js +33 -0
  66. package/dist/react/textarea.js.map +1 -0
  67. package/dist/react/time-picker.d.ts +22 -0
  68. package/dist/react/time-picker.js +856 -0
  69. package/dist/react/time-picker.js.map +1 -0
  70. package/dist/react/tooltip.d.ts +45 -0
  71. package/dist/react/tooltip.js +540 -0
  72. package/dist/react/tooltip.js.map +1 -0
  73. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/react/table-view/meta.ts","../../../../../node_modules/@tanstack/react-table/src/index.tsx","../../../src/lib/utils.ts","../../../src/react/checkbox.tsx","../../../src/react/button.tsx","../../../src/react/dropdown.tsx","../../../src/react/table-view/helpers.ts","../../../src/react/table-view/column-menu.tsx","../../../src/react/table-view/persist.ts","../../../src/react/table.tsx","../../../src/react/table-view/sizing.ts","../../../src/react/table-view/index.tsx"],"names":["flexRender","Comp","props","isReactComponent","createElement","component","isClassComponent","isExoticComponent","proto","Object","getPrototypeOf","prototype","$$typeof","includes","description","React2","useState","React3","jsx","React","useRef","useLayoutEffect","forwardRef","ColumnHeaderMenuInner","jsxs","ChevronDown","useMemo","useEffect","TableColumnDragHandle","useCallback","React6","TableViewColumnHead","Fragment","TableViewDataRow"],"mappings":"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","file":"index.js","sourcesContent":["import type { Column, RowData } from \"@tanstack/react-table\";\n\n/* eslint-disable @typescript-eslint/no-unused-vars -- declaration merge generics */\ndeclare module \"@tanstack/react-table\" {\n interface ColumnMeta<TData extends RowData, TValue> {\n tableView?: {\n /** hides the reorder grip and blocks header-menu moves for this column */\n disableColumnReorder?: boolean;\n };\n }\n}\n/* eslint-enable @typescript-eslint/no-unused-vars */\n\nexport function getTableViewColumnDisableReorder<TData extends RowData>(\n column: Column<TData, unknown>,\n) {\n return Boolean(column.columnDef.meta?.tableView?.disableColumnReorder);\n}\n","import * as React from 'react'\nexport * from '@tanstack/table-core'\n\nimport {\n TableOptions,\n TableOptionsResolved,\n RowData,\n createTable,\n} from '@tanstack/table-core'\n\nexport type Renderable<TProps> = React.ReactNode | React.ComponentType<TProps>\n\n//\n\n/**\n * If rendering headers, cells, or footers with custom markup, use flexRender instead of `cell.getValue()` or `cell.renderValue()`.\n */\nexport function flexRender<TProps extends object>(\n Comp: Renderable<TProps>,\n props: TProps\n): React.ReactNode | React.JSX.Element {\n return !Comp ? null : isReactComponent<TProps>(Comp) ? (\n <Comp {...props} />\n ) : (\n Comp\n )\n}\n\nfunction isReactComponent<TProps>(\n component: unknown\n): component is React.ComponentType<TProps> {\n return (\n isClassComponent(component) ||\n typeof component === 'function' ||\n isExoticComponent(component)\n )\n}\n\nfunction isClassComponent(component: any) {\n return (\n typeof component === 'function' &&\n (() => {\n const proto = Object.getPrototypeOf(component)\n return proto.prototype && proto.prototype.isReactComponent\n })()\n )\n}\n\nfunction isExoticComponent(component: any) {\n return (\n typeof component === 'object' &&\n typeof component.$$typeof === 'symbol' &&\n ['react.memo', 'react.forward_ref'].includes(component.$$typeof.description)\n )\n}\n\nexport function useReactTable<TData extends RowData>(\n options: TableOptions<TData>\n) {\n // Compose in the generic options to the user options\n const resolvedOptions: TableOptionsResolved<TData> = {\n state: {}, // Dummy state\n onStateChange: () => {}, // noop\n renderFallbackValue: null,\n ...options,\n }\n\n // Create a new table and store it in state\n const [tableRef] = React.useState(() => ({\n current: createTable<TData>(resolvedOptions),\n }))\n\n // By default, manage table state here using the table's initial state\n const [state, setState] = React.useState(() => tableRef.current.initialState)\n\n // Compose the default state above with any user state. This will allow the user\n // to only control a subset of the state if desired.\n tableRef.current.setOptions(prev => ({\n ...prev,\n ...options,\n state: {\n ...state,\n ...options.state,\n },\n // Similarly, we'll maintain both our internal state and any user-provided\n // state.\n onStateChange: updater => {\n setState(updater)\n options.onStateChange?.(updater)\n },\n }))\n\n return tableRef.current\n}\n","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 { useLayoutEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst CHECKBOX_TICK_DELAY_MS = 60;\nconst CHECKBOX_TICK_DRAW_MS = 100;\n\nfunction CheckboxAnimatedCheckMark() {\n const lineRef = useRef<SVGPolylineElement>(null);\n\n useLayoutEffect(() => {\n const poly = lineRef.current;\n if (!poly || typeof poly.getTotalLength !== \"function\") return;\n const len = poly.getTotalLength();\n if (len <= 0) return;\n\n poly.style.strokeDasharray = `${len}`;\n poly.style.strokeDashoffset = `${len}`;\n\n if (typeof poly.animate !== \"function\") {\n poly.style.strokeDashoffset = \"0\";\n return;\n }\n\n const anim = poly.animate(\n [{ strokeDashoffset: len }, { strokeDashoffset: 0 }],\n {\n duration: CHECKBOX_TICK_DRAW_MS,\n delay: CHECKBOX_TICK_DELAY_MS,\n easing: \"cubic-bezier(0.45, 0, 0.2, 1)\",\n fill: \"forwards\",\n },\n );\n return () => anim.cancel();\n }, []);\n\n return (\n <svg\n className=\"size-4 shrink-0 overflow-visible\"\n viewBox=\"0 0 24 24\"\n aria-hidden\n >\n <polyline\n ref={lineRef}\n points=\"4 12 9 17 20 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport type CheckboxProps = Omit<\n React.ComponentProps<\"button\">,\n \"type\" | \"role\" | \"aria-checked\" | \"children\"\n> & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (next: boolean) => void;\n // tri-state: same frame as checked; center shows a visible “blank” (inner surface)\n indeterminate?: boolean;\n};\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n indeterminate = false,\n disabled = false,\n className,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const isControlled = checkedProp !== undefined;\n const [uncontrolledChecked, setUncontrolledChecked] =\n useState(defaultChecked);\n const checked = isControlled ? checkedProp : uncontrolledChecked;\n const ariaChecked: boolean | \"mixed\" = indeterminate\n ? \"mixed\"\n : checked\n ? true\n : false;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"checkbox\"\n data-slot=\"checkbox\"\n data-state={\n indeterminate ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\"\n }\n disabled={disabled}\n aria-checked={ariaChecked}\n className={cn(\n \"ring-offset-background focus-visible:ring-primary/40 inline-flex shrink-0 items-center justify-center rounded-md border border-transparent p-0 outline-none select-none\",\n \"focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed\",\n className,\n )}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) 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=\"pointer-events-none\">\n <span\n aria-hidden\n className={cn(\n \"flex size-5 shrink-0 items-center justify-center rounded-[4px] border\",\n !disabled &&\n (indeterminate\n ? \"border-primary bg-primary text-background\"\n : checked\n ? \"border-primary bg-primary text-background\"\n : \"border-primary/20 bg-background\"),\n disabled &&\n (indeterminate\n ? \"border-transparent bg-primary/45 text-primary-foreground\"\n : checked\n ? \"border-transparent bg-primary/45 text-primary-foreground\"\n : \"border-primary/10 bg-muted/25\"),\n )}\n >\n {indeterminate ? (\n <span\n className=\"size-2.5 shrink-0 rounded-[2px] border border-primary/20 bg-background\"\n aria-hidden\n />\n ) : checked ? (\n <CheckboxAnimatedCheckMark />\n ) : null}\n </span>\n </span>\n </button>\n );\n },\n);\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox };\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\";\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Check, ChevronDown, ChevronRight, X } from \"lucide-react\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Checkbox } from \"./checkbox\";\nimport { cn } from \"@/lib/utils\";\n\n/** Panel transform motion — matches `sheet.tsx` `PANEL_OPEN_EASING` / `PANEL_CLOSE_EASING`. */\nconst DROPDOWN_PANEL_OPEN_EASING = \"cubic-bezier(0,0.55,0.45,1)\";\nconst DROPDOWN_PANEL_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\n\n/** Floor for `minWidth=\"trigger\"` so narrow triggers don’t produce an overly tight menu (12rem). */\nconst DROPDOWN_MENU_MIN_WIDTH_PX = 192;\n\n/** Mobile menu as bottom sheet — matches `dialog.tsx` (`DIALOG_MOBILE_BOTTOM_SHEET_MAX_PX` + `DIALOG_MOTION_MS`). */\nconst DROPDOWN_MOBILE_SHEET_MAX_PX = 1024;\n/** Mobile sheet panel + backdrop (slightly under `DIALOG_MOTION_MS` for snappier feel). */\nconst DROPDOWN_MOBILE_SHEET_MOTION_MS = 175;\nconst DROPDOWN_MOBILE_SHEET_ENTRY_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DROPDOWN_MOBILE_SHEET_EXIT_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\n\n/** Default slide distance for mobile sheet when `slideEntrance` — matches `SLIDE_ENTRANCE_OFFSET_PX.full` in `dialog.tsx`. */\nconst DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX = 120;\n\n/**\n * Narrow-viewport (≤1024px) bottom-sheet options for {@link DropdownContent}\n * and {@link DropdownSubContent}. `className` merges onto the same panel as\n * `DropdownContent`’s root `className` (after base sheet styles); use it for\n * overrides such as `max-h-[…]`.\n */\nexport interface DropdownMobileSheetOptions {\n /** When `false`, keep the floating menu on narrow viewports. Default `true`. */\n sheet?: boolean;\n /** Optional header title on the same row as the close control. */\n title?: string;\n /** Extra classes on the sheet panel (merged after base sheet styles, before root `className`). */\n className?: string;\n /**\n * Extra classes on the scrollable body below the header (merged after the\n * default `pb-20` and safe-area bottom padding).\n */\n contentClassName?: string;\n}\n\nfunction resolveDropdownMobileSheet(\n mobileOptions: DropdownMobileSheetOptions | undefined,\n) {\n return {\n sheet: mobileOptions?.sheet ?? true,\n title: mobileOptions?.title,\n sheetExtraClassName: mobileOptions?.className,\n contentClassName: mobileOptions?.contentClassName,\n };\n}\n\n/** Mark portaled sub-menus so root outside-dismiss ignores clicks inside them. */\nconst DROPDOWN_SUB_CONTENT_ATTR = \"data-dropdown-sub-content\";\n\n/**\n * Reshaped-style \"elevated\" popover shadow — soft long shadow + tight contact\n * shadow gives depth without the harsh dark halo of `shadow-2xl`. Shared by\n * the root menu and sub-menu panels.\n */\nconst DROPDOWN_PANEL_SHADOW =\n \"shadow-[0_12px_32px_-8px_rgba(0,0,0,0.18),0_2px_6px_-2px_rgba(0,0,0,0.06)] dark:shadow-[0_12px_32px_-8px_rgba(0,0,0,0.55),0_2px_6px_-2px_rgba(0,0,0,0.35)]\";\n\n/**\n * Hide scrollbars and contain overscroll on every scrollable descendant.\n * Native `overscroll-behavior: contain` covers the touch / scrollable-inner\n * cases; {@link preventMenuWheelChain} handles wheel on non-scrollable\n * surfaces, which the CSS property can't reach (it only applies to actual\n * scroll containers).\n */\nconst DROPDOWN_PANEL_SCROLL =\n \"[&_*]:[scrollbar-width:none] [&_*::-webkit-scrollbar]:hidden [&_*]:overscroll-contain\";\n\n/**\n * Wheel handler attached to the menu surface. Walks up from the wheel target\n * looking for a scrollable ancestor inside `menu`; if one is found AND can\n * scroll in the wheel direction, lets the browser handle it. Otherwise calls\n * `preventDefault()` so the wheel never chains to the page. Covers both the\n * \"short menu with nothing to scroll\" case and the \"scrollable inner at\n * boundary\" case in one rule.\n */\nfunction preventMenuWheelChain(menu: HTMLElement, e: WheelEvent) {\n let el: HTMLElement | null = e.target as HTMLElement | null;\n while (el && menu.contains(el)) {\n const oy = getComputedStyle(el).overflowY;\n if (\n (oy === \"auto\" || oy === \"scroll\") &&\n el.scrollHeight > el.clientHeight\n ) {\n const atTop = el.scrollTop <= 0;\n const atBottom =\n el.scrollTop + el.clientHeight >= el.scrollHeight;\n if ((e.deltaY < 0 && !atTop) || (e.deltaY > 0 && !atBottom)) return;\n break;\n }\n el = el.parentElement;\n }\n e.preventDefault();\n}\n\n/**\n * Slightly larger menu copy when viewport ≤1024px — same cutoff as the mobile\n * bottom sheet (`DROPDOWN_MOBILE_SHEET_MAX_PX`). Padding unchanged.\n */\nconst DROPDOWN_SHEET_MENU_TEXT = \"max-[1024px]:text-base\";\nconst DROPDOWN_SHEET_MENU_SHORTCUT = \"max-[1024px]:text-sm\";\nconst DROPDOWN_SHEET_MENU_LABEL_TEXT = \"max-[1024px]:text-sm\";\n\n//////////////////////////////////////////////// Positioning helpers\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\ninterface Pos {\n top: number;\n left: number;\n side: Side;\n}\n\n/** `transformOrigin` / pre-mount transform for the root floating menu (not sub-menus). */\nconst DROPDOWN_CONTENT_ORIGIN: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right center\",\n right: \"left center\",\n};\nconst DROPDOWN_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\n/** Sub-menu flyout uses a different origin on the horizontal axis. */\nconst SUB_CONTENT_ORIGIN: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right top\",\n right: \"left top\",\n};\n\nfunction computePos(\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 vw = window.innerWidth;\n const vh = window.innerHeight;\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 calc = (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 calc(side);\n\n // flip\n if (side === \"bottom\" && top + mr.height > vh + sy - pad) {\n const ft = tr.top + sy - mr.height - offset;\n if (ft >= sy + pad) {\n effectiveSide = \"top\";\n top = ft;\n }\n } else if (side === \"top\" && top < sy + pad) {\n const ft = tr.bottom + sy + offset;\n if (ft + mr.height <= vh + sy - pad) {\n effectiveSide = \"bottom\";\n top = ft;\n }\n } else if (side === \"right\" && left + mr.width > vw + sx - pad) {\n const fl = tr.left + sx - mr.width - offset;\n if (fl >= sx + pad) {\n effectiveSide = \"left\";\n left = fl;\n }\n } else if (side === \"left\" && left < sx + pad) {\n const fl = tr.right + sx + offset;\n if (fl + mr.width <= vw + sx - pad) {\n effectiveSide = \"right\";\n left = fl;\n }\n }\n\n // clamp\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\n//////////////////////////////////////////////// Mobile detection\n\nfunction useIsMobile(breakpoint = 1025): boolean {\n // Read matchMedia synchronously on mount so the first render of a freshly\n // mounted sub-trigger already knows it's on a mobile viewport. Without this,\n // the synthetic `mouseenter` that fires when a sub-sheet slides under the\n // cursor (right after a tap on the parent trigger) would auto-open the row\n // beneath, because the `if (isMobile) return` guard would still see `false`\n // until the effect below runs on the next tick.\n const [isMobile, setIsMobile] = useState(() => {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches;\n });\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, [breakpoint]);\n return isMobile;\n}\n\n//////////////////////////////////////////////// Context\n\ntype DropdownCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n radioValues: Record<string, string>;\n setRadioValue: (group: string, value: string) => void;\n};\n\nconst DropdownContext = React.createContext<DropdownCtx | undefined>(undefined);\n\nfunction useDropdown() {\n const ctx = React.useContext(DropdownContext);\n if (!ctx)\n throw new Error(\"Dropdown components must be used within <Dropdown />\");\n return ctx;\n}\n\n// Sub-menu context (for nested menus)\ntype SubCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n /** When `false`, hover does not open/close the sub. See {@link DropdownSub}. */\n openOnHover: boolean;\n};\nconst SubContext = React.createContext<SubCtx | undefined>(undefined);\n\n//////////////////////////////////////////////// Root\n\ninterface DropdownProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n const triggerRef = useRef<HTMLElement | null>(null);\n const [radioValues, setRadioValues] = useState<Record<string, string>>({});\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (!isControlled) setInternalOpen(v);\n onOpenChange?.(v);\n },\n [isControlled, onOpenChange],\n );\n\n const setRadioValue = useCallback((group: string, value: string) => {\n setRadioValues((prev) => ({ ...prev, [group]: value }));\n }, []);\n\n const ctx = useMemo(\n () => ({ open, setOpen, triggerRef, radioValues, setRadioValue }),\n [open, setOpen, radioValues, setRadioValue],\n );\n\n return (\n <DropdownContext.Provider value={ctx}>{children}</DropdownContext.Provider>\n );\n};\n\n//////////////////////////////////////////////// Trigger\n\nexport type DropdownTriggerProps = Omit<ButtonProps, \"type\"> & {\n /**\n * Merge trigger behavior onto a single child (e.g. your own `Button`).\n * Without `asChild`, the trigger renders the shared `Button` primitive.\n */\n asChild?: boolean;\n};\n\nfunction mergeTriggerRef(\n triggerRef: React.RefObject<HTMLElement | null>,\n node: HTMLElement | null,\n childRef: React.Ref<HTMLElement> | undefined,\n) {\n triggerRef.current = node;\n if (typeof childRef === \"function\") childRef(node);\n else if (childRef && typeof childRef === \"object\")\n (childRef as React.MutableRefObject<HTMLElement | null>).current = node;\n}\n\nexport const DropdownTrigger = React.forwardRef<\n HTMLButtonElement,\n DropdownTriggerProps\n>(\n (\n {\n children,\n asChild,\n className,\n onClick: onClickProp,\n disabled,\n ...buttonProps\n },\n ref,\n ) => {\n const { open, setOpen, triggerRef } = useDropdown();\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n onClickProp?.(e as React.MouseEvent<HTMLButtonElement>);\n e.stopPropagation();\n if (disabled) return;\n setOpen(!open);\n },\n [disabled, onClickProp, open, setOpen],\n );\n\n const setButtonRef = useCallback(\n (el: HTMLButtonElement | null) => {\n triggerRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n },\n [ref, triggerRef],\n );\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler<HTMLElement>;\n ref?: React.Ref<HTMLElement>;\n className?: string;\n \"aria-expanded\"?: boolean;\n \"aria-haspopup\"?: string;\n \"data-state\"?: string;\n }>;\n return React.cloneElement(child, {\n ref: (node: HTMLElement | null) => {\n mergeTriggerRef(\n triggerRef,\n node,\n (\n child as React.ReactElement<unknown> & {\n ref?: React.Ref<HTMLElement>;\n }\n ).ref,\n );\n },\n className: cn(\"group\", child.props.className),\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n child.props.onClick?.(e);\n handleClick(e);\n },\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-state\": open ? \"open\" : \"closed\",\n ...(disabled !== undefined\n ? {\n disabled,\n }\n : {}),\n } as Partial<typeof child.props>);\n }\n\n return (\n <Button\n ref={setButtonRef}\n type=\"button\"\n {...buttonProps}\n disabled={disabled}\n className={cn(\"group\", className)}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n data-state={open ? \"open\" : \"closed\"}\n onClick={handleClick as React.MouseEventHandler<HTMLButtonElement>}\n >\n {children}\n </Button>\n );\n },\n);\nDropdownTrigger.displayName = \"DropdownTrigger\";\n\n/** Chevron for menu triggers; rotates 180° when the menu is open. */\nexport function DropdownChevron({\n className,\n ...props\n}: React.ComponentProps<typeof ChevronDown>) {\n const { open } = useDropdown();\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//////////////////////////////////////////////// Mobile sheet close\n\nexport interface DropdownMobileCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * Dismiss control for the mobile bottom-sheet menu. Styling matches\n * {@link DialogCloseButton} (circular hit target, X icon).\n */\nexport const DropdownMobileClose = React.forwardRef<\n HTMLButtonElement,\n DropdownMobileCloseProps\n>(({ className, type = \"button\", ...props }, ref) => {\n return (\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 {...props}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n );\n});\nDropdownMobileClose.displayName = \"DropdownMobileClose\";\n\n//////////////////////////////////////////////// Mobile bottom sheet (shared root + sub)\n\ninterface DropdownMobileBottomSheetPortalProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"ref\"\n> {\n children: React.ReactNode;\n open: boolean;\n isAnimating: boolean;\n slideEntrance: boolean;\n slideOffsetPx: number;\n sheetTitle?: string;\n /** Merged onto the sheet panel after base classes (from `mobileOptions.className`). */\n sheetExtraClassName?: string;\n /** Merged onto the scrollable region below the header. */\n contentClassName?: string;\n onRequestClose: () => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n /** Root menu uses `z-50`; nested sub-menu sheet should stack above (e.g. `z-[70]`). */\n portalZClassName?: string;\n /**\n * When `true`, marks the portal **wrapper** (which contains the scrim) with\n * `data-dropdown-sub-content` so outside-click handlers recognize a tap on\n * a stacked sub-sheet's scrim as \"still inside a sub\" and don't cascade-close\n * parent sheets. Root sheets leave this `false` so a tap on the root scrim\n * still closes the root.\n */\n isSubPortal?: boolean;\n}\n\nfunction DropdownMobileBottomSheetPortal({\n open,\n isAnimating,\n slideEntrance,\n slideOffsetPx,\n sheetTitle,\n sheetExtraClassName,\n contentClassName,\n onRequestClose,\n menuRef,\n portalZClassName = \"z-50\",\n isSubPortal = false,\n children,\n className,\n style,\n ...panelProps\n}: DropdownMobileBottomSheetPortalProps) {\n const sheetMotion = open\n ? DROPDOWN_MOBILE_SHEET_ENTRY_EASING\n : DROPDOWN_MOBILE_SHEET_EXIT_EASING;\n const sheetHiddenTransform = slideEntrance\n ? `translateY(${slideOffsetPx}px)`\n : \"translateY(100%)\";\n\n return createPortal(\n <div\n {...(isSubPortal ? { [DROPDOWN_SUB_CONTENT_ATTR]: \"\" } : {})}\n className={cn(\n \"fixed inset-0 flex items-end justify-center p-0\",\n portalZClassName,\n )}\n >\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 transitionProperty: \"opacity\",\n transitionDuration: `${DROPDOWN_MOBILE_SHEET_MOTION_MS}ms`,\n transitionTimingFunction: sheetMotion,\n }}\n onClick={onRequestClose}\n />\n <div\n {...panelProps}\n ref={menuRef}\n className={cn(\n \"bg-background border-primary/8 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 DROPDOWN_PANEL_SCROLL,\n sheetExtraClassName,\n className,\n )}\n style={{\n transform: isAnimating ? \"translateY(0)\" : sheetHiddenTransform,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DROPDOWN_MOBILE_SHEET_MOTION_MS}ms`,\n transitionTimingFunction: sheetMotion,\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 <DropdownMobileClose\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//////////////////////////////////////////////// Content\n\ninterface DropdownContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: Side;\n align?: Align;\n /** Gap in px between the trigger and the menu edge (default 10). */\n offset?: number;\n duration?: number;\n viewportPadding?: number;\n closeOnEscape?: boolean;\n /** Minimum width in px, or `\"trigger\"` to match the trigger (never below 192px). */\n minWidth?: number | \"trigger\";\n /** Loop keyboard focus at list boundaries */\n loop?: boolean;\n /**\n * Mobile (≤1024px) bottom-sheet configuration (`sheet`, `title`, panel\n * `className`, optional scroll body `contentClassName` after default `pb-20`\n * + safe area).\n */\n mobileOptions?: DropdownMobileSheetOptions;\n /**\n * Mobile bottom sheet only. When `true` (default), panel motion matches Dialog\n * `slideEntrance`: `translateY(slideEntranceOffsetPx)` + opacity, with the same\n * double-RAF open timing as `DialogContent`. When `false`, uses full\n * `translateY(100%)` like Dialog’s default narrow-viewport bottom sheet.\n */\n slideEntrance?: boolean;\n /** Mobile sheet only; defaults to 120px (same as Dialog `slideEntrance` for `size=\"full\"`). */\n slideEntranceOffsetPx?: number;\n}\n\nexport const DropdownContent: React.FC<DropdownContentProps> = ({\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: slideEntranceOffsetPxProp,\n className,\n style,\n ...props\n}) => {\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n const { open, setOpen, triggerRef } = useDropdown();\n const [shouldRender, setShouldRender] = useState(false);\n const [isAnimating, setIsAnimating] = 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\n const resolvedMobile = resolveDropdownMobileSheet(mobileOptions);\n const isMobileSheet = isMobile && resolvedMobile.sheet;\n const slideOffsetPx =\n slideEntranceOffsetPxProp ??\n DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX;\n\n // Desktop = instant unmount on close (Fresha/Reshaped — holding a fade\n // after a pick reads as lag). Mobile sheet keeps its slide-down + scrim\n // exit so the dismissal feels natural on touch.\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n return;\n }\n if (!isMobileSheet) {\n setShouldRender(false);\n return;\n }\n setIsAnimating(false);\n const t = setTimeout(\n () => setShouldRender(false),\n DROPDOWN_MOBILE_SHEET_MOTION_MS,\n );\n return () => clearTimeout(t);\n }, [open, isMobileSheet]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n // Position\n useLayoutEffect(() => {\n if (!shouldRender || !triggerRef.current || !menuRef.current) return;\n const update = () => {\n if (!triggerRef.current || !menuRef.current) return;\n setTriggerW(triggerRef.current.getBoundingClientRect().width);\n setPos(\n computePos(\n triggerRef.current,\n menuRef.current,\n side,\n align,\n offset,\n viewportPadding,\n ),\n );\n };\n update();\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"resize\", update);\n };\n }, [shouldRender, side, align, offset, viewportPadding]);\n\n // Close on outside scroll; the wheel handler below + CSS `overscroll-contain`\n // keep internal scrolls (including portaled sub-menus) from chaining out.\n useEffect(() => {\n if (!open || isMobileSheet) return;\n const isInsideMenu = (t: EventTarget | null) =>\n t instanceof Node &&\n (!!menuRef.current?.contains(t) ||\n !!triggerRef.current?.contains(t) ||\n (t instanceof Element &&\n !!t.closest(`[${DROPDOWN_SUB_CONTENT_ATTR}]`)));\n const onScroll = (e: Event) => {\n if (!isInsideMenu(e.target)) setOpen(false);\n };\n window.addEventListener(\"scroll\", onScroll, true);\n return () => window.removeEventListener(\"scroll\", onScroll, true);\n }, [open, isMobileSheet, setOpen, triggerRef]);\n\n // Contain wheel: never let scrolling inside the menu chain to the page,\n // whether or not anything inside actually scrolls.\n useEffect(() => {\n if (!shouldRender || isMobileSheet) return;\n const menu = menuRef.current;\n if (!menu) return;\n const onWheel = (e: WheelEvent) => preventMenuWheelChain(menu, e);\n menu.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => menu.removeEventListener(\"wheel\", onWheel);\n }, [shouldRender, isMobileSheet]);\n\n // Focus the menu surface on open (not the first item) so nothing looks\n // “selected” until the user arrows or hovers. ArrowDown moves to items[0].\n useEffect(() => {\n if (isAnimating && menuRef.current) {\n menuRef.current.focus();\n }\n }, [isAnimating]);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || triggerRef.current?.contains(t))\n return;\n const el = e.target instanceof Element ? e.target : null;\n if (el?.closest?.(`[${DROPDOWN_SUB_CONTENT_ATTR}]`)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, setOpen, triggerRef]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n const menu = menuRef.current;\n if (!menu) return;\n const focusedEl = document.activeElement as HTMLElement | null;\n // Sub-menus portal outside `menu`; don't hijack keys meant for them\n if (focusedEl && !menu.contains(focusedEl)) return;\n const items = getItems(menu);\n const idx = items.indexOf(focusedEl!);\n\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 === 0) break;\n if (idx === -1 || (idx === items.length - 1 && loop))\n items[0]?.focus();\n else if (idx < items.length - 1) items[idx + 1]?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx <= 0 && loop) items[items.length - 1]?.focus();\n else if (idx > 0) items[idx - 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 }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, closeOnEscape, loop, setOpen, triggerRef]);\n\n // Body scroll lock — only attaches when the mobile sheet is actually open.\n useEffect(() => {\n if (!open || !isMobileSheet) return;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [open, isMobileSheet]);\n\n if (!shouldRender || typeof document === \"undefined\") return null;\n\n // ─── Mobile bottom-sheet mode (chrome + motion match `Dialog` bottom sheet) ─\n if (isMobileSheet) {\n return (\n <DropdownMobileBottomSheetPortal\n {...props}\n open={open}\n isAnimating={isAnimating}\n slideEntrance={slideEntrance}\n slideOffsetPx={slideOffsetPx}\n sheetTitle={resolvedMobile.title}\n sheetExtraClassName={resolvedMobile.sheetExtraClassName}\n contentClassName={resolvedMobile.contentClassName}\n onRequestClose={() => setOpen(false)}\n menuRef={menuRef}\n portalZClassName=\"z-50\"\n className={className}\n style={style}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n >\n {children}\n </DropdownMobileBottomSheetPortal>\n );\n }\n\n // ─── Desktop floating menu mode ──────────────────────────────────────────\n const resolvedMinW =\n minWidth === \"trigger\"\n ? Math.max(triggerW, DROPDOWN_MENU_MIN_WIDTH_PX)\n : minWidth;\n\n return createPortal(\n <div\n {...props}\n ref={menuRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n className={cn(\n \"bg-background border-primary/8 absolute z-50 overflow-hidden rounded-xl border py-1.5 outline-none\",\n DROPDOWN_PANEL_SHADOW,\n DROPDOWN_PANEL_SCROLL,\n className,\n )}\n style={{\n position: \"absolute\",\n top: pos.top,\n left: pos.left,\n minWidth: resolvedMinW,\n transformOrigin: DROPDOWN_CONTENT_ORIGIN[pos.side],\n transform: isAnimating ? \"none\" : DROPDOWN_CONTENT_HIDDEN[pos.side],\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"opacity, transform\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: isAnimating\n ? DROPDOWN_PANEL_OPEN_EASING\n : DROPDOWN_PANEL_CLOSE_EASING,\n ...style,\n }}\n >\n {children}\n </div>,\n document.body,\n );\n};\n\n/** Returns all focusable menu items, excluding disabled ones */\nfunction getItems(menu: HTMLElement): HTMLElement[] {\n return Array.from(\n menu.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"]),' +\n '[role=\"menuitemcheckbox\"]:not([aria-disabled=\"true\"]),' +\n '[role=\"menuitemradio\"]:not([aria-disabled=\"true\"])',\n ),\n );\n}\n\n//////////////////////////////////////////////// Item\n\ninterface DropdownItemProps extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n destructive?: boolean;\n icon?: React.ReactNode;\n shortcut?: string;\n /** Close menu on click (default true) */\n closeOnSelect?: boolean;\n inset?: boolean;\n}\n\nexport const DropdownItem: React.FC<DropdownItemProps> = ({\n children,\n disabled = false,\n destructive = false,\n icon,\n shortcut,\n closeOnSelect = true,\n inset = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitem\"\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\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 DROPDOWN_SHEET_MENU_TEXT,\n inset && \"pl-9\",\n !disabled && \"cursor-pointer\",\n disabled && \"lg:cursor-not-allowed\",\n !disabled &&\n !destructive &&\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 destructive &&\n \"text-destructive hover:bg-destructive/10 focus-visible:bg-destructive/10 dark:text-destructive-foreground dark:hover:bg-destructive-foreground/18 dark:focus-visible:bg-destructive-foreground/18\",\n disabled &&\n !destructive &&\n \"text-foreground/45 dark:text-foreground/50\",\n disabled &&\n destructive &&\n \"bg-destructive/5 text-destructive/75 dark:bg-destructive-foreground/12 dark:text-destructive-foreground/78\",\n className,\n )}\n >\n {icon && (\n <span className=\"flex size-4 shrink-0 items-center justify-center\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">{children}</span>\n {shortcut ? (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest\",\n DROPDOWN_SHEET_MENU_SHORTCUT,\n destructive\n ? \"text-destructive/70 dark:text-destructive-foreground/80\"\n : \"opacity-40\",\n )}\n >\n {shortcut}\n </span>\n ) : null}\n </div>\n );\n};\n\n//////////////////////////////////////////////// Separator\n\nexport const DropdownSeparator: React.FC<\n React.HTMLAttributes<HTMLDivElement>\n> = ({ className, ...props }) => (\n <div\n role=\"separator\"\n className={cn(\"border-primary/10 my-1.5 border-t\", className)}\n {...props}\n />\n);\n\n//////////////////////////////////////////////// Label\n\nexport const DropdownLabel: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { inset?: boolean }\n> = ({ className, inset, ...props }) => (\n <div\n className={cn(\n \"text-primary/50 px-4 py-2 text-xs font-medium\",\n DROPDOWN_SHEET_MENU_LABEL_TEXT,\n inset && \"pl-9\",\n className,\n )}\n {...props}\n />\n);\n\n//////////////////////////////////////////////// Checkbox Item\n\ninterface DropdownCheckboxItemProps extends Omit<DropdownItemProps, \"icon\"> {\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const DropdownCheckboxItem: React.FC<DropdownCheckboxItemProps> = ({\n children,\n checked = false,\n onCheckedChange,\n disabled = false,\n shortcut,\n closeOnSelect = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onCheckedChange?.(!checked);\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n \"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 DROPDOWN_SHEET_MENU_TEXT,\n !disabled &&\n \"cursor-pointer 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 className,\n )}\n >\n <span className=\"mr-1 inline-flex shrink-0\" aria-hidden>\n <Checkbox\n checked={checked}\n disabled={disabled}\n tabIndex={-1}\n className=\"pointer-events-none\"\n />\n </span>\n <span className=\"min-w-0 flex-1\">{children}</span>\n {shortcut && (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest opacity-40\",\n DROPDOWN_SHEET_MENU_SHORTCUT,\n )}\n >\n {shortcut}\n </span>\n )}\n </div>\n );\n};\n\n//////////////////////////////////////////////// Radio Group + Item\n\nexport const DropdownRadioGroup: React.FC<{\n children: React.ReactNode;\n value?: string;\n onValueChange?: (value: string) => void;\n group: string;\n}> = ({ children, value, onValueChange, group }) => {\n const { setRadioValue, radioValues } = useDropdown();\n\n const resolvedValue = value ?? radioValues[group] ?? \"\";\n\n const handleValueChange = useCallback(\n (v: string) => {\n setRadioValue(group, v);\n onValueChange?.(v);\n },\n [group, onValueChange, setRadioValue],\n );\n\n const radioCtx = useMemo(\n () => ({\n group,\n value: resolvedValue,\n onValueChange: handleValueChange,\n }),\n [group, resolvedValue, handleValueChange],\n );\n\n return (\n <RadioGroupContext.Provider value={radioCtx}>\n {children}\n </RadioGroupContext.Provider>\n );\n};\n\ntype RadioGroupCtx = {\n group: string;\n value: string;\n onValueChange: (v: string) => void;\n};\nconst RadioGroupContext = React.createContext<RadioGroupCtx | undefined>(\n undefined,\n);\n\nfunction useRadioGroup() {\n const ctx = React.useContext(RadioGroupContext);\n if (!ctx)\n throw new Error(\"DropdownRadioItem must be inside DropdownRadioGroup\");\n return ctx;\n}\n\ninterface DropdownRadioItemProps extends Omit<DropdownItemProps, \"icon\"> {\n value: string;\n}\n\nexport const DropdownRadioItem: React.FC<DropdownRadioItemProps> = ({\n children,\n value,\n disabled = false,\n shortcut,\n closeOnSelect = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n const { value: groupValue, onValueChange } = useRadioGroup();\n const checked = groupValue === value;\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onValueChange(value);\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitemradio\"\n aria-checked={checked}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\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 DROPDOWN_SHEET_MENU_TEXT,\n !disabled &&\n \"cursor-pointer 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 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 DROPDOWN_SHEET_MENU_SHORTCUT,\n )}\n >\n {shortcut}\n </span>\n ) : null}\n <span\n className=\"flex size-4 shrink-0 items-center justify-center\"\n aria-hidden\n >\n {checked ? <Check className=\"size-3.5\" strokeWidth={2.5} /> : null}\n </span>\n </div>\n );\n};\n\n//////////////////////////////////////////////// Sub-menu\n\n/**\n * `openOnHover` (default `true`) controls whether moving a mouse onto the\n * `DropdownSubTrigger` (or off the `DropdownSubContent`) opens / closes the\n * sub. Set to `false` for menus rendered inside a scrollable container, where\n * rows passing under a stationary cursor would otherwise toggle the sub on\n * every scroll tick. Click, Enter, ArrowRight always open regardless.\n */\nexport const DropdownSub: React.FC<{\n children: React.ReactNode;\n openOnHover?: boolean;\n}> = ({ children, openOnHover = true }) => {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLElement | null>(null);\n const subCtx = useMemo(\n () => ({ open, setOpen, triggerRef, openOnHover }),\n [open, setOpen, openOnHover],\n );\n return <SubContext.Provider value={subCtx}>{children}</SubContext.Provider>;\n};\n\nexport const DropdownSubTrigger: React.FC<\n React.HTMLAttributes<HTMLDivElement> & {\n icon?: React.ReactNode;\n inset?: boolean;\n disabled?: boolean;\n }\n> = ({ children, icon, inset, disabled = false, className, ...props }) => {\n const sub = React.useContext(SubContext);\n if (!sub) throw new Error(\"DropdownSubTrigger must be inside DropdownSub\");\n const { open, setOpen, triggerRef, openOnHover } = sub;\n /** Same cutoff as mobile bottom sheet — touch / narrow viewports must not use hover. */\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n\n return (\n <div\n {...props}\n ref={(el) => {\n triggerRef.current = el;\n }}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onMouseEnter={() => {\n if (disabled || isMobile || !openOnHover) return;\n setOpen(true);\n }}\n onMouseLeave={() => {\n if (isMobile || !openOnHover) return;\n setOpen(false);\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === \"ArrowRight\" || e.key === \"Enter\") {\n e.preventDefault();\n setOpen(true);\n }\n }}\n onClick={() => {\n if (disabled) return;\n setOpen(!open);\n }}\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 DROPDOWN_SHEET_MENU_TEXT,\n inset && \"pl-9\",\n !disabled &&\n \"cursor-pointer 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 className,\n )}\n >\n {icon && (\n <span className=\"flex size-4 shrink-0 items-center justify-center\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">{children}</span>\n <ChevronRight className=\"ml-auto size-4 shrink-0 opacity-50\" />\n </div>\n );\n};\n\nexport const DropdownSubContent: React.FC<\n React.HTMLAttributes<HTMLDivElement> & {\n duration?: number;\n viewportPadding?: number;\n /** Same meaning as {@link DropdownContent}. */\n mobileOptions?: DropdownMobileSheetOptions;\n /** Same as {@link DropdownContent} slideEntrance; default true. */\n slideEntrance?: boolean;\n slideEntranceOffsetPx?: number;\n }\n> = ({\n children,\n duration = 80,\n viewportPadding = 8,\n mobileOptions,\n slideEntrance = true,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n className,\n style,\n onKeyDown: onKeyDownProp,\n ...props\n}) => {\n const sub = React.useContext(SubContext);\n if (!sub) throw new Error(\"DropdownSubContent must be inside DropdownSub\");\n const { open, setOpen, triggerRef, openOnHover } = sub;\n\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n const resolvedMobile = resolveDropdownMobileSheet(mobileOptions);\n const isMobileSheet = isMobile && resolvedMobile.sheet;\n const slideOffsetPx =\n slideEntranceOffsetPxProp ??\n DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX;\n\n const [shouldRender, setShouldRender] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const [pos, setPos] = useState<Pos>({\n top: -9999,\n left: -9999,\n side: \"right\",\n });\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Same lifecycle as `DropdownContent`: instant on desktop, animated on the\n // mobile sheet.\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n return;\n }\n if (!isMobileSheet) {\n setShouldRender(false);\n return;\n }\n setIsAnimating(false);\n const t = setTimeout(\n () => setShouldRender(false),\n DROPDOWN_MOBILE_SHEET_MOTION_MS,\n );\n return () => clearTimeout(t);\n }, [open, isMobileSheet]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n useLayoutEffect(() => {\n if (!shouldRender || isMobileSheet) return;\n if (!triggerRef.current || !menuRef.current) return;\n const update = () => {\n if (!triggerRef.current || !menuRef.current) return;\n setPos(\n computePos(\n triggerRef.current,\n menuRef.current,\n \"right\",\n \"start\",\n -8,\n viewportPadding,\n ),\n );\n };\n update();\n window.addEventListener(\"resize\", update);\n return () => {\n window.removeEventListener(\"resize\", update);\n };\n }, [shouldRender, viewportPadding, isMobileSheet]);\n\n // Close when a container that holds the sub-trigger scrolls — without this\n // the flyout would drift off its row. The root handles document/window\n // scrolls; the wheel handler below keeps internal scrolls from chaining\n // out, so a single `scroll` listener is enough.\n useEffect(() => {\n if (!open || isMobileSheet) return;\n const onScroll = (e: Event) => {\n const t = e.target;\n if (!(t instanceof Node) || menuRef.current?.contains(t)) return;\n const trigger = triggerRef.current;\n if (trigger && (t === trigger || t.contains(trigger))) setOpen(false);\n };\n window.addEventListener(\"scroll\", onScroll, true);\n return () => window.removeEventListener(\"scroll\", onScroll, true);\n }, [open, isMobileSheet, setOpen, triggerRef]);\n\n // Contain wheel inside the sub-panel; same rule as the root.\n useEffect(() => {\n if (!shouldRender || isMobileSheet) return;\n const menu = menuRef.current;\n if (!menu) return;\n const onWheel = (e: WheelEvent) => preventMenuWheelChain(menu, e);\n menu.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => menu.removeEventListener(\"wheel\", onWheel);\n }, [shouldRender, isMobileSheet]);\n\n useEffect(() => {\n if (isAnimating && menuRef.current) {\n menuRef.current.focus();\n }\n }, [isAnimating]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || triggerRef.current?.contains(t))\n return;\n const el = e.target instanceof Element ? e.target : null;\n const subPanel = el?.closest?.(`[${DROPDOWN_SUB_CONTENT_ATTR}]`);\n if (subPanel && subPanel !== menuRef.current) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, setOpen, triggerRef]);\n\n const handleSubMenuKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDownProp?.(e);\n if (e.defaultPrevented) return;\n const menu = menuRef.current;\n if (!menu) return;\n const items = getItems(menu);\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n switch (e.key) {\n case \"ArrowLeft\":\n case \"Escape\":\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx === -1 || idx === items.length - 1) items[0]?.focus();\n else items[idx + 1]?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx <= 0) items[items.length - 1]?.focus();\n else items[idx - 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 }\n },\n [onKeyDownProp, setOpen, triggerRef],\n );\n\n if (!shouldRender || typeof document === \"undefined\") return null;\n\n if (isMobileSheet) {\n return (\n <DropdownMobileBottomSheetPortal\n {...props}\n open={open}\n isAnimating={isAnimating}\n slideEntrance={slideEntrance}\n slideOffsetPx={slideOffsetPx}\n sheetTitle={resolvedMobile.title}\n sheetExtraClassName={resolvedMobile.sheetExtraClassName}\n contentClassName={resolvedMobile.contentClassName}\n onRequestClose={() => setOpen(false)}\n menuRef={menuRef}\n portalZClassName=\"z-[70]\"\n isSubPortal\n className={className}\n style={style}\n role=\"menu\"\n tabIndex={-1}\n onKeyDown={handleSubMenuKeyDown}\n data-dropdown-sub-content=\"\"\n >\n {children}\n </DropdownMobileBottomSheetPortal>\n );\n }\n\n return createPortal(\n <div\n {...props}\n ref={menuRef}\n role=\"menu\"\n tabIndex={-1}\n onMouseEnter={openOnHover ? () => setOpen(true) : undefined}\n onMouseLeave={openOnHover ? () => setOpen(false) : undefined}\n onKeyDown={handleSubMenuKeyDown}\n data-dropdown-sub-content=\"\"\n className={cn(\n \"bg-background border-primary/8 absolute z-60 overflow-hidden rounded-xl border py-1.5 outline-none\",\n DROPDOWN_PANEL_SHADOW,\n DROPDOWN_PANEL_SCROLL,\n className,\n )}\n style={{\n position: \"absolute\",\n top: pos.top,\n left: pos.left,\n minWidth: DROPDOWN_MENU_MIN_WIDTH_PX,\n transformOrigin: SUB_CONTENT_ORIGIN[pos.side],\n transform: isAnimating ? \"none\" : DROPDOWN_CONTENT_HIDDEN[pos.side],\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"opacity, transform\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: isAnimating\n ? DROPDOWN_PANEL_OPEN_EASING\n : DROPDOWN_PANEL_CLOSE_EASING,\n ...style,\n }}\n >\n {children}\n </div>,\n document.body,\n );\n};\n","import type {\n Column,\n RowData,\n Table as TanStackTable,\n} from \"@tanstack/react-table\";\nimport type { CSSProperties } from \"react\";\n\nexport function getSelectedRowIds<TData extends RowData>(\n table: TanStackTable<TData>,\n): string[] {\n return table.getSelectedRowModel().rows.map((r) => r.id);\n}\n\nexport function moveColumnInOrder(\n order: string[],\n sourceId: string,\n targetId: string,\n) {\n const from = order.indexOf(sourceId);\n const to = order.indexOf(targetId);\n if (from < 0 || to < 0 || from === to) return order;\n const next = [...order];\n const [moved] = next.splice(from, 1);\n if (moved) next.splice(to, 0, moved);\n return next;\n}\n\nexport function getColumnHeaderLabel(header: {\n column: { id: string; columnDef: { header?: unknown } };\n}): string {\n const h = header.column.columnDef.header;\n if (typeof h === \"string\") return h;\n return header.column.id;\n}\n\nexport function getTableLeafColumnOrderList<TData extends RowData>(\n table: TanStackTable<TData>,\n): string[] {\n const o = table.getState().columnOrder;\n if (o && o.length > 0) return [...o];\n return table.getVisibleLeafColumns().map((c) => c.id);\n}\n\nexport function moveTableColumnOneStep<TData extends RowData>(\n table: TanStackTable<TData>,\n columnId: string,\n direction: \"left\" | \"right\",\n) {\n const list = getTableLeafColumnOrderList(table);\n const i = list.indexOf(columnId);\n if (i < 0) return;\n const next = [...list];\n if (direction === \"left\" && i > 0) {\n [next[i - 1], next[i]] = [next[i]!, next[i - 1]!];\n } else if (direction === \"right\" && i < next.length - 1) {\n [next[i + 1], next[i]] = [next[i]!, next[i + 1]!];\n } else {\n return;\n }\n table.setColumnOrder(next);\n}\n\nexport function getColumnPinningStyle<TData extends RowData>(\n column: Column<TData, unknown>,\n): CSSProperties {\n const pin = column.getIsPinned();\n if (!pin) return {};\n const left = pin === \"left\" ? column.getStart(\"left\") : undefined;\n const right = pin === \"right\" ? column.getAfter(\"right\") : undefined;\n const zi = 20 + (column.getPinnedIndex() >= 0 ? column.getPinnedIndex() : 0);\n return {\n position: \"sticky\",\n left: left == null ? undefined : `${left}px`,\n right: right == null ? undefined : `${right}px`,\n zIndex: zi,\n };\n}\n\nexport function getColumnPinningClassName<TData extends RowData>(\n column: Column<TData, unknown>,\n) {\n return column.getIsPinned() ? \"bg-background\" : undefined;\n}\n","\"use client\";\n\nimport type { Header, RowData, Table as TanStackTable } from \"@tanstack/react-table\";\nimport {\n ArrowLeft,\n ArrowRight,\n ChevronDown,\n ChevronUp,\n EyeOff,\n MoreVertical,\n Pin,\n PinOff,\n} from \"lucide-react\";\nimport {\n forwardRef,\n memo,\n useImperativeHandle,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"../button\";\nimport {\n Dropdown,\n DropdownContent,\n DropdownItem,\n DropdownSeparator,\n DropdownTrigger,\n} from \"../dropdown\";\nimport { getTableLeafColumnOrderList, moveTableColumnOneStep } from \"./helpers\";\nimport { getTableViewColumnDisableReorder } from \"./meta\";\n\nexport type ColumnHeaderMenuHandle = {\n open: () => void;\n};\n\ntype ColumnHeaderMenuProps<TData extends RowData> = {\n table: TanStackTable<TData>;\n header: Header<TData, unknown>;\n columnSort: boolean;\n columnReorder: boolean;\n};\n\nconst ColumnHeaderMenuInner = forwardRef<\n ColumnHeaderMenuHandle,\n ColumnHeaderMenuProps<RowData>\n>(function ColumnHeaderMenuInner(\n { table, header, columnSort, columnReorder },\n ref,\n) {\n const [open, setOpen] = useState(false);\n useImperativeHandle(\n ref,\n () => ({\n open: () => {\n setOpen(true);\n },\n }),\n [],\n );\n\n const col = header.column;\n const id = col.id;\n const canPin = col.getCanPin();\n const pin = col.getIsPinned();\n const list = getTableLeafColumnOrderList(table);\n const idx = list.indexOf(id);\n const reorderLocked = getTableViewColumnDisableReorder(col);\n const canMoveLeft = columnReorder && !reorderLocked && idx > 0;\n const canMoveRight =\n columnReorder && !reorderLocked && idx >= 0 && idx < list.length - 1;\n const canSort = columnSort && col.getCanSort();\n const hasMoveSection = canMoveLeft || canMoveRight;\n const hasSortSection = !!canSort;\n const hasPinSection = canPin;\n const hasHideSection = col.getCanHide();\n\n if (!hasMoveSection && !hasSortSection && !hasPinSection && !hasHideSection) {\n return null;\n }\n\n const showSepBeforeHide =\n hasHideSection && (hasMoveSection || hasSortSection || hasPinSection);\n\n return (\n <div\n className={cn(\n \"flex shrink-0 self-stretch items-center\",\n \"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100 has-[[data-state=open]]:opacity-100\",\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <Dropdown open={open} onOpenChange={setOpen}>\n <DropdownTrigger asChild>\n <Button\n type=\"button\"\n size=\"xs\"\n iconOnly\n rounded=\"full\"\n className=\"touch-manipulation border-none bg-transparent shadow-none\"\n aria-label=\"Column options\"\n >\n <MoreVertical className=\"size-3.5\" strokeWidth={2.25} aria-hidden />\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\" side=\"bottom\" offset={4}>\n {hasMoveSection ? (\n <>\n <DropdownItem\n disabled={!canMoveLeft}\n icon={\n <ArrowLeft\n className=\"size-3.5\"\n strokeWidth={2.25}\n aria-hidden\n />\n }\n onClick={() => {\n if (canMoveLeft) moveTableColumnOneStep(table, id, \"left\");\n }}\n >\n Move to the left\n </DropdownItem>\n <DropdownItem\n disabled={!canMoveRight}\n icon={\n <ArrowRight\n className=\"size-3.5\"\n strokeWidth={2.25}\n aria-hidden\n />\n }\n onClick={() => {\n if (canMoveRight) moveTableColumnOneStep(table, id, \"right\");\n }}\n >\n Move to the right\n </DropdownItem>\n </>\n ) : null}\n {hasMoveSection && (hasSortSection || hasPinSection) ? (\n <DropdownSeparator />\n ) : null}\n {hasSortSection ? (\n <>\n <DropdownItem\n icon={\n <ChevronUp\n className=\"size-3.5\"\n strokeWidth={2.25}\n aria-hidden\n />\n }\n onClick={() => {\n col.toggleSorting(false);\n }}\n >\n Sort ascending\n </DropdownItem>\n <DropdownItem\n icon={\n <ChevronDown\n className=\"size-3.5\"\n strokeWidth={2.25}\n aria-hidden\n />\n }\n onClick={() => {\n col.toggleSorting(true);\n }}\n >\n Sort descending\n </DropdownItem>\n </>\n ) : null}\n {hasSortSection && hasPinSection ? <DropdownSeparator /> : null}\n {hasPinSection ? (\n <>\n {pin !== \"left\" ? (\n <DropdownItem\n icon={\n <Pin className=\"size-3.5\" strokeWidth={2.25} aria-hidden />\n }\n onClick={() => {\n col.pin(\"left\");\n }}\n >\n Pin to the left\n </DropdownItem>\n ) : null}\n {pin !== \"right\" ? (\n <DropdownItem\n icon={\n <Pin\n className=\"size-3.5 -scale-x-100\"\n strokeWidth={2.25}\n aria-hidden\n />\n }\n onClick={() => {\n col.pin(\"right\");\n }}\n >\n Pin to the right\n </DropdownItem>\n ) : null}\n {pin ? (\n <DropdownItem\n icon={\n <PinOff\n className=\"size-3.5\"\n strokeWidth={2.25}\n aria-hidden\n />\n }\n onClick={() => {\n col.pin(false);\n }}\n >\n Unpin column\n </DropdownItem>\n ) : null}\n </>\n ) : null}\n {showSepBeforeHide ? <DropdownSeparator /> : null}\n {hasHideSection ? (\n <DropdownItem\n icon={\n <EyeOff className=\"size-3.5\" strokeWidth={2.25} aria-hidden />\n }\n onClick={() => {\n col.toggleVisibility(false);\n setOpen(false);\n }}\n >\n Hide column\n </DropdownItem>\n ) : null}\n </DropdownContent>\n </Dropdown>\n </div>\n );\n});\nColumnHeaderMenuInner.displayName = \"ColumnHeaderMenuInner\";\n\nexport const ColumnHeaderMenu = memo(ColumnHeaderMenuInner);\nColumnHeaderMenu.displayName = \"ColumnHeaderMenu\";\n","import type {\n ColumnPinningState,\n ColumnSizingState,\n RowData,\n Table as TanStackTable,\n VisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from \"react\";\n\ntype PersistFeatureGates = {\n columnResize: boolean;\n columnHeaderMenu: boolean;\n};\n\n/** one localStorage key; value is `{ tables: { [persistKey]: snapshot } }` */\nexport const TABLE_VIEW_PERSIST_STORAGE_KEY = \"@avenueticket/ui/table-view\";\n\nconst TABLE_VIEW_PERSIST_DEBOUNCE_MS = 200;\n\ntype PersistedRoot = {\n tables: Record<string, TableViewPersistedSnapshotV1>;\n};\n\nfunction emptyRoot(): PersistedRoot {\n return { tables: {} };\n}\n\nfunction readRoot(): PersistedRoot {\n if (typeof window === \"undefined\") return emptyRoot();\n try {\n const raw = localStorage.getItem(TABLE_VIEW_PERSIST_STORAGE_KEY);\n if (!raw) return emptyRoot();\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\") return emptyRoot();\n const tables = (parsed as { tables?: unknown }).tables;\n if (!tables || typeof tables !== \"object\") return emptyRoot();\n const out: Record<string, TableViewPersistedSnapshotV1> = {};\n for (const [k, v] of Object.entries(tables as Record<string, unknown>)) {\n if (\n v &&\n typeof v === \"object\" &&\n (v as TableViewPersistedSnapshotV1).v === 1\n ) {\n out[k] = v as TableViewPersistedSnapshotV1;\n }\n }\n return { tables: out };\n } catch {\n return emptyRoot();\n }\n}\n\nfunction writeRoot(root: PersistedRoot) {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(TABLE_VIEW_PERSIST_STORAGE_KEY, JSON.stringify(root));\n } catch {\n // quota / private mode\n }\n}\n\n/** layout-only; sorting is not persisted (use URL / server state so reloads do not re-trigger queries from stored sort). */\nexport type TableViewPersistedSnapshotV1 = {\n v: 1;\n columnOrder?: string[];\n columnSizing?: ColumnSizingState;\n columnPinning?: ColumnPinningState;\n /** false = hidden; keys only for hidden columns (TanStack columnVisibility) */\n columnVisibility?: VisibilityState;\n};\n\nfunction readSnapshot(\n persistKey: string,\n): TableViewPersistedSnapshotV1 | null {\n const row = readRoot().tables[persistKey];\n return row?.v === 1 ? row : null;\n}\n\nfunction writeSnapshot(\n persistKey: string,\n snapshot: TableViewPersistedSnapshotV1,\n) {\n const root = readRoot();\n root.tables[persistKey] = snapshot;\n writeRoot(root);\n}\n\nfunction mergePersistedColumnOrder(\n persisted: string[] | undefined,\n defaultOrder: string[],\n): string[] {\n if (!persisted?.length) return defaultOrder;\n const allowed = new Set(defaultOrder);\n const seen = new Set<string>();\n const next: string[] = [];\n for (const id of persisted) {\n if (allowed.has(id) && !seen.has(id)) {\n next.push(id);\n seen.add(id);\n }\n }\n for (const id of defaultOrder) {\n if (!seen.has(id)) {\n next.push(id);\n seen.add(id);\n }\n }\n return next;\n}\n\nfunction filterColumnSizingForIds(\n sizing: ColumnSizingState | undefined,\n allowed: Set<string>,\n): ColumnSizingState {\n if (!sizing) return {};\n const next: ColumnSizingState = {};\n for (const [id, w] of Object.entries(sizing)) {\n if (allowed.has(id) && typeof w === \"number\" && Number.isFinite(w)) {\n next[id] = w;\n }\n }\n return next;\n}\n\nfunction normalizePersistedPinning(\n raw: ColumnPinningState | undefined,\n allowed: Set<string>,\n): ColumnPinningState {\n return {\n left: (raw?.left ?? []).filter((id) => allowed.has(id)),\n right: (raw?.right ?? []).filter((id) => allowed.has(id)),\n };\n}\n\nfunction filterColumnVisibilityForIds(\n visibility: VisibilityState | undefined,\n allowed: Set<string>,\n): VisibilityState {\n if (!visibility) return {};\n const next: VisibilityState = {};\n for (const [id, vis] of Object.entries(visibility)) {\n if (allowed.has(id) && vis === false) {\n next[id] = false;\n }\n }\n return next;\n}\n\nfunction shallowEqualColumnOrder(a: string[], b: string[]) {\n if (a.length !== b.length) return false;\n return a.every((id, i) => id === b[i]);\n}\n\nexport function useTableViewPersistence<TData extends RowData>(\n table: TanStackTable<TData>,\n persistKey: string | undefined,\n opts: PersistFeatureGates,\n) {\n const { columnResize, columnHeaderMenu } = opts;\n const hydratedRef = useRef(false);\n const skipNextSaveRef = useRef(false);\n const prevPersistKeyRef = useRef<string | undefined>(undefined);\n const prevLeafIdsKeyRef = useRef<string>(\"\");\n const prevGatesKeyRef = useRef<string>(\"\");\n\n const leafIdsKey = useMemo(\n () =>\n table\n .getAllLeafColumns()\n .map((c) => c.id)\n .join(\"\\0\"),\n [table],\n );\n\n const gatesKey = `${columnResize}\\0${columnHeaderMenu}`;\n\n useLayoutEffect(() => {\n if (!persistKey) {\n hydratedRef.current = true;\n prevPersistKeyRef.current = undefined;\n return;\n }\n\n const persistChanged = prevPersistKeyRef.current !== persistKey;\n const leafChanged = prevLeafIdsKeyRef.current !== leafIdsKey;\n const gatesChanged = prevGatesKeyRef.current !== gatesKey;\n\n if (\n !persistChanged &&\n !leafChanged &&\n !gatesChanged &&\n hydratedRef.current\n ) {\n return;\n }\n\n prevPersistKeyRef.current = persistKey;\n prevLeafIdsKeyRef.current = leafIdsKey;\n prevGatesKeyRef.current = gatesKey;\n skipNextSaveRef.current = true;\n\n const allowed = new Set(table.getAllLeafColumns().map((c) => c.id));\n if (allowed.size === 0) {\n hydratedRef.current = true;\n return;\n }\n\n const saved = readSnapshot(persistKey);\n const defaultOrder = table.getAllLeafColumns().map((c) => c.id);\n const cur = table.getState();\n const curPin = cur.columnPinning ?? { left: [], right: [] };\n\n if (saved) {\n const nextOrder = mergePersistedColumnOrder(\n saved.columnOrder,\n defaultOrder,\n );\n if (!shallowEqualColumnOrder(nextOrder, cur.columnOrder)) {\n table.setColumnOrder(nextOrder);\n }\n\n if (columnHeaderMenu && saved.columnPinning) {\n const nextPin = normalizePersistedPinning(saved.columnPinning, allowed);\n const pinEq =\n shallowEqualColumnOrder(nextPin.left ?? [], curPin.left ?? []) &&\n shallowEqualColumnOrder(nextPin.right ?? [], curPin.right ?? []);\n if (!pinEq) {\n table.setColumnPinning(nextPin);\n }\n }\n\n if (columnResize && saved.columnSizing) {\n const nextSizing = filterColumnSizingForIds(\n saved.columnSizing,\n allowed,\n );\n if (JSON.stringify(nextSizing) !== JSON.stringify(cur.columnSizing)) {\n table.setColumnSizing(nextSizing);\n }\n }\n\n if (columnHeaderMenu && saved.columnVisibility != null) {\n const nextVis = filterColumnVisibilityForIds(\n saved.columnVisibility,\n allowed,\n );\n const curVis = cur.columnVisibility ?? {};\n if (JSON.stringify(nextVis) !== JSON.stringify(curVis)) {\n table.setColumnVisibility(nextVis);\n }\n }\n }\n\n hydratedRef.current = true;\n }, [\n persistKey,\n table,\n leafIdsKey,\n gatesKey,\n columnResize,\n columnHeaderMenu,\n ]);\n\n const s = table.getState();\n const persistSerial =\n persistKey == null\n ? \"\"\n : JSON.stringify({\n columnOrder: s.columnOrder,\n columnSizing: columnResize ? s.columnSizing : null,\n columnPinning: columnHeaderMenu ? s.columnPinning : null,\n columnVisibility: columnHeaderMenu ? s.columnVisibility : null,\n });\n\n useEffect(() => {\n if (!persistKey || !hydratedRef.current) return;\n\n if (skipNextSaveRef.current) {\n skipNextSaveRef.current = false;\n return;\n }\n\n const id = window.setTimeout(() => {\n const st = table.getState();\n writeSnapshot(persistKey, {\n v: 1,\n columnOrder: st.columnOrder,\n ...(columnResize ? { columnSizing: st.columnSizing } : {}),\n ...(columnHeaderMenu\n ? {\n columnPinning: st.columnPinning,\n columnVisibility: st.columnVisibility,\n }\n : {}),\n });\n }, TABLE_VIEW_PERSIST_DEBOUNCE_MS);\n\n return () => window.clearTimeout(id);\n }, [\n persistKey,\n persistSerial,\n table,\n columnResize,\n columnHeaderMenu,\n ]);\n}\n","\"use client\";\n\nimport { ArrowDown, ArrowUp, GripVertical } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nexport type TableColumnDragState = {\n /** column id you are currently dragging, or `null` */\n draggingId: string | null;\n /** id of the th under the cursor, or `null` */\n dropTargetId: string | null;\n};\n\nexport type TableConfigValue = {\n sortableColumnIds: ReadonlySet<string>;\n enableColumnSort: boolean;\n enableColumnReorder: boolean;\n enableColumnResize: boolean;\n /**\n * when set (usually from host table state), `TableHead` / `TableCell` with\n * matching `columnId` get consistent column-drag visuals\n */\n columnDragState: TableColumnDragState | null;\n};\n\nconst defaultTableConfig: TableConfigValue = {\n sortableColumnIds: new Set(),\n enableColumnSort: true,\n enableColumnReorder: false,\n enableColumnResize: false,\n columnDragState: null,\n};\n\nconst TableConfigContext = React.createContext<TableConfigValue | null>(null);\nTableConfigContext.displayName = \"TableConfigContext\";\n\n/**\n * a compact card under the cursor so a column grab feels like moving the column, not\n * a tiny icon. call from `onDragStart` of {@link TableColumnDragHandle} or your handle.\n */\nexport function setColumnDragPreview(\n e: React.DragEvent,\n options: { title: string; width?: number; height?: number; hotspotX?: number; hotspotY?: number },\n) {\n if (!e.dataTransfer) return;\n e.dataTransfer.effectAllowed = \"move\";\n const width = options.width ?? 80;\n const height = options.height ?? 100;\n const el = document.createElement(\"div\");\n el.setAttribute(\"data-table-drag-preview\", \"\");\n const dark =\n typeof window !== \"undefined\" &&\n window.matchMedia &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n const bg = dark ? \"rgba(24,24,26,0.95)\" : \"rgba(255,255,255,0.96)\";\n const fg = dark ? \"rgba(250,250,250,0.95)\" : \"rgba(10,10,10,0.92)\";\n const border = dark\n ? \"1px solid rgba(255,255,255,0.12)\"\n : \"1px solid rgba(0,0,0,0.1)\";\n const shadow = \"0 12px 32px rgba(0,0,0,0.2),0 0 0 1px rgba(0,0,0,0.04)\";\n el.style.cssText = [\n \"position:fixed\",\n \"left:0\",\n \"top:0\",\n \"z-index:100000\",\n \"pointer-events:none\",\n \"box-sizing:border-box\",\n `width:${width}px`,\n `min-height:${height}px`,\n \"display:flex\",\n \"flex-direction:column\",\n \"align-items:center\",\n \"justify-content:flex-start\",\n \"gap:8px\",\n `padding:10px 8px 12px`,\n `color:${fg}`,\n `background:${bg}`,\n `border:${border}`,\n \"border-radius:8px\",\n `box-shadow:${shadow}`,\n ].join(\";\");\n const bar = document.createElement(\"div\");\n bar.style.cssText = `width:3px;flex:1;min-height:32px;border-radius:2px;background:${\n dark ? \"rgba(80,200,150,0.4)\" : \"rgba(20,80,200,0.2)\"\n };align-self:stretch;`;\n const t = document.createElement(\"div\");\n t.textContent = options.title;\n t.style.cssText =\n \"font:600 11px/1.2 system-ui,-apple-system,sans-serif;text-align:center;word-break:break-word;max-width:100%;\";\n el.appendChild(t);\n el.appendChild(bar);\n el.style.minHeight = `${height}px`;\n document.body.appendChild(el);\n void el.offsetWidth;\n e.dataTransfer.setDragImage(\n el,\n options.hotspotX ?? width / 2,\n options.hotspotY ?? 28,\n );\n requestAnimationFrame(() => {\n if (el.parentNode) el.parentNode.removeChild(el);\n });\n}\n\n/** source column (being dragged) and drop target use the same strip treatment */\nconst COLUMN_DRAG_TH_STRIP =\n \"relative z-20 box-border overflow-hidden rounded-t-lg border border-primary/20 bg-primary/8 opacity-70 shadow-sm\";\nconst COLUMN_DRAG_TD_STRIP =\n \"overflow-hidden border-x border-primary/15 bg-primary/5 opacity-70\";\n\nconst columnDragThClasses = (config: TableConfigValue, columnId: string) => {\n if (!config.enableColumnReorder || !config.columnDragState) return undefined;\n const d = config.columnDragState;\n const isSource = d.draggingId === columnId;\n const isDrop =\n d.dropTargetId === columnId &&\n d.draggingId != null &&\n d.draggingId !== columnId;\n if (isSource || isDrop) {\n return COLUMN_DRAG_TH_STRIP;\n }\n return undefined;\n};\n\nconst columnDragTdClasses = (config: TableConfigValue, columnId: string) => {\n if (!config.enableColumnReorder || !config.columnDragState) return undefined;\n const d = config.columnDragState;\n const isSource = d.draggingId === columnId;\n const isDrop =\n d.dropTargetId === columnId &&\n d.draggingId != null &&\n d.draggingId !== columnId;\n if (isSource || isDrop) {\n return COLUMN_DRAG_TD_STRIP;\n }\n return undefined;\n};\n\nexport type TableLayoutProps = {\n containerClassName?: string;\n sortableColumns?: readonly string[];\n enableColumnSort?: boolean;\n enableColumnReorder?: boolean;\n enableColumnResize?: boolean;\n /** pass `columnDragState` from the host (e.g. which column is being reordered) */\n columnDragState?: TableColumnDragState | null;\n};\n\nconst Table = React.forwardRef<\n HTMLTableElement,\n React.ComponentProps<\"table\"> & TableLayoutProps\n>(\n (\n {\n className,\n containerClassName,\n sortableColumns,\n enableColumnSort: enableColumnSortFromProps,\n enableColumnReorder: enableColumnReorderFromProps,\n enableColumnResize: enableColumnResizeFromProps,\n columnDragState: columnDragStateFromProps,\n ...props\n },\n ref,\n ) => {\n const config = React.useMemo<TableConfigValue>(() => {\n const sortableColumnIds = new Set(sortableColumns ?? []);\n return {\n sortableColumnIds,\n enableColumnSort: enableColumnSortFromProps ?? true,\n enableColumnReorder: enableColumnReorderFromProps ?? false,\n enableColumnResize: enableColumnResizeFromProps ?? false,\n columnDragState: columnDragStateFromProps ?? null,\n };\n }, [\n sortableColumns,\n enableColumnSortFromProps,\n enableColumnReorderFromProps,\n enableColumnResizeFromProps,\n columnDragStateFromProps,\n ]);\n\n return (\n <div\n data-slot=\"table-container\"\n data-table-sort={config.enableColumnSort ? \"on\" : \"off\"}\n data-table-reorder={config.enableColumnReorder ? \"on\" : \"off\"}\n data-table-resize={config.enableColumnResize ? \"on\" : \"off\"}\n className={cn(\"relative w-full overflow-x-auto\", containerClassName)}\n >\n <TableConfigContext.Provider value={config}>\n <table\n ref={ref}\n data-slot=\"table\"\n className={cn(\n \"min-w-full w-max caption-bottom text-sm\",\n className,\n )}\n {...props}\n />\n </TableConfigContext.Provider>\n </div>\n );\n },\n);\nTable.displayName = \"Table\";\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentProps<\"thead\">\n>(({ className, ...props }, ref) => {\n const config = React.useContext(TableConfigContext) ?? defaultTableConfig;\n const hasSortableColumns =\n config.enableColumnSort && config.sortableColumnIds.size > 0;\n\n return (\n <thead\n ref={ref}\n data-slot=\"table-header\"\n className={cn(\n hasSortableColumns && \"[&_tr:hover]:bg-transparent!\",\n className,\n )}\n {...props}\n />\n );\n});\nTableHeader.displayName = \"TableHeader\";\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentProps<\"tbody\">\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n data-slot=\"table-body\"\n className={cn(\n \"[&>tr:last-child>td:not([data-table-column-drag-strip])]:border-b-0\",\n className,\n )}\n {...props}\n />\n));\nTableBody.displayName = \"TableBody\";\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentProps<\"tfoot\">\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n data-slot=\"table-footer\"\n className={cn(\n \"border-t border-primary/10 bg-primary/5 font-medium\",\n className,\n )}\n {...props}\n />\n));\nTableFooter.displayName = \"TableFooter\";\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.ComponentProps<\"tr\">\n>(({ className, ...props }, ref) => (\n <tr\n ref={ref}\n data-slot=\"table-row\"\n className={cn(\n \"transition-colors duration-0 hover:bg-primary/3 data-[state=selected]:bg-primary/10\",\n className,\n )}\n {...props}\n />\n));\nTableRow.displayName = \"TableRow\";\n\n/** same idea as sort chevrons: icon only, slightly larger than the 3.5 sort arrows */\nconst columnDragHandleIconClass = cn(\n \"text-primary/55 hover:text-primary/80\",\n \"cursor-grab active:cursor-grabbing touch-none\",\n \"shrink-0\",\n);\n\nexport type TableColumnDragHandleProps = Omit<\n React.ComponentProps<\"span\">,\n \"onDragStart\" | \"onDragEnd\"\n> & {\n /** must match the column & `dataTransfer` / tanstack `columnId` */\n columnId: string;\n onDragStart?: (e: React.DragEvent<HTMLSpanElement>) => void;\n onDragEnd?: (e: React.DragEvent<HTMLSpanElement>) => void;\n /**\n * label on the custom drag “card” under the cursor; omit for a default “Column”\n * placeholder (still more readable than the default browser ghost)\n */\n previewLabel?: string;\n};\n\nconst TableColumnDragHandle = React.forwardRef<\n HTMLSpanElement,\n TableColumnDragHandleProps\n>(function TableColumnDragHandle(\n { columnId, previewLabel, className, onDragStart, onDragEnd, title, ...rest },\n ref,\n) {\n return (\n <span\n ref={ref}\n className={cn(\n \"inline-flex select-none items-center justify-center\",\n columnDragHandleIconClass,\n className,\n )}\n title={title ?? \"Drag to reorder this column\"}\n tabIndex={-1}\n aria-label=\"Drag to reorder this column\"\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData(\"text/plain\", columnId);\n setColumnDragPreview(e, { title: previewLabel ?? \"Column\" });\n onDragStart?.(e);\n }}\n onDragEnd={onDragEnd}\n onClick={(ev) => ev.stopPropagation()}\n onKeyDown={(ev) => {\n if (ev.key === \" \" || ev.key === \"Enter\") {\n ev.preventDefault();\n }\n ev.stopPropagation();\n }}\n data-slot=\"table-column-drag-handle\"\n {...rest}\n >\n <GripVertical\n className=\"size-4 pointer-events-none\"\n strokeWidth={2.25}\n aria-hidden\n />\n </span>\n );\n});\nTableColumnDragHandle.displayName = \"TableColumnDragHandle\";\n\nexport type TableHeaderSortControlProps = {\n activeSort?: \"asc\" | \"desc\" | null;\n onRequest?: (e: React.MouseEvent) => void;\n className?: string;\n};\n\n/** chevron / sort control — place in the same row as the title (e.g. inside a narrow `inline-flex` with `gap-1`) */\nexport function TableHeaderSortControl({\n activeSort,\n onRequest,\n className,\n}: TableHeaderSortControlProps) {\n const isActiveSort = activeSort === \"asc\" || activeSort === \"desc\";\n return (\n <span\n className={cn(\"inline-flex shrink-0 items-stretch pl-0\", className)}\n >\n {onRequest ? (\n <span className=\"flex shrink-0 items-stretch\">\n <button\n type=\"button\"\n className=\"text-primary/90 hover:text-primary/95 inline-flex min-h-10 w-8 min-w-8 touch-manipulation items-center justify-center self-center rounded p-0 md:min-h-12\"\n onClick={(e) => {\n e.stopPropagation();\n onRequest(e);\n }}\n title=\"Change sort\"\n aria-label=\"Change sort order\"\n >\n {isActiveSort ? (\n activeSort === \"desc\" ? (\n <ArrowDown\n className=\"size-3.5 shrink-0\"\n strokeWidth={2.25}\n aria-hidden\n />\n ) : (\n <ArrowUp\n className=\"size-3.5 shrink-0\"\n strokeWidth={2.25}\n aria-hidden\n />\n )\n ) : (\n <ArrowUp\n className=\"text-primary/85 size-3.5 shrink-0 opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n strokeWidth={2.25}\n aria-hidden\n />\n )}\n </button>\n </span>\n ) : isActiveSort ? (\n <span className=\"inline-flex shrink-0 items-center\">\n {activeSort === \"desc\" ? (\n <ArrowDown\n className=\"size-3.5 shrink-0 self-center text-primary/90\"\n strokeWidth={2.25}\n aria-hidden\n />\n ) : (\n <ArrowUp\n className=\"size-3.5 shrink-0 self-center text-primary/90\"\n strokeWidth={2.25}\n aria-hidden\n />\n )}\n </span>\n ) : (\n <span className=\"inline-flex shrink-0 items-center\">\n <ArrowUp\n className=\"text-primary/85 size-3.5 shrink-0 self-center opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n strokeWidth={2.25}\n aria-hidden\n />\n </span>\n )}\n </span>\n );\n}\n\nexport type TableHeadProps = React.ComponentProps<\"th\"> & {\n columnId?: string;\n activeSort?: \"asc\" | \"desc\" | null;\n onColumnResizeStart?: (\n e: React.MouseEvent | React.TouchEvent | HTMLDivElement,\n ) => void;\n isColumnResizing?: boolean;\n /**\n * rendered at the far right of the head (e.g. column menu), after the label\n * and sort chevrons\n */\n headerEnd?: React.ReactNode;\n};\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n (\n {\n className,\n columnId,\n children,\n activeSort,\n onColumnResizeStart,\n isColumnResizing,\n style,\n headerEnd,\n ...props\n },\n ref,\n ) => {\n const config = React.useContext(TableConfigContext) ?? defaultTableConfig;\n const showSortUI =\n config.enableColumnSort &&\n columnId !== undefined &&\n config.sortableColumnIds.has(columnId);\n const isActiveSort =\n showSortUI && (activeSort === \"asc\" || activeSort === \"desc\");\n const hasHeaderEnd = headerEnd != null && headerEnd !== false;\n const showResizer =\n config.enableColumnResize && typeof onColumnResizeStart === \"function\";\n const drag = columnId ? columnDragThClasses(config, columnId) : undefined;\n\n return (\n <th\n ref={ref}\n data-resizing={isColumnResizing ? 1 : undefined}\n data-slot=\"table-head\"\n data-column-id={columnId}\n data-sortable={showSortUI ? \"true\" : undefined}\n data-sorted={isActiveSort ? (activeSort ?? undefined) : undefined}\n aria-sort={\n isActiveSort && activeSort\n ? activeSort === \"desc\"\n ? \"descending\"\n : \"ascending\"\n : showSortUI\n ? \"none\"\n : undefined\n }\n className={cn(\n \"h-10 min-w-0 px-3 text-left align-middle text-sm font-bold text-primary transition-colors duration-0 md:h-12 md:px-4 [&:has([role=checkbox])]:pr-0\",\n !drag && \"border-b border-primary/10\",\n showResizer && \"relative\",\n // th cursor-pointer is often overridden by child button default cursor\n (showSortUI || hasHeaderEnd) &&\n \"group hover:bg-primary/5 [&_button]:cursor-pointer\",\n drag,\n isColumnResizing && \"opacity-100\",\n className,\n )}\n style={style}\n {...props}\n >\n {showSortUI ? (\n <span className=\"inline-flex h-full w-full min-h-0 min-w-0 max-w-full items-center justify-start gap-0.5\">\n <span className=\"min-h-0 min-w-0 flex-1 text-left [&_[data-slot=table-column-drag-handle]]:cursor-grab [&_[data-slot=table-column-drag-handle]]:active:cursor-grabbing\">\n {children}\n </span>\n {hasHeaderEnd ? (\n <span className=\"inline-flex min-h-0 min-w-0 shrink-0 items-center\">\n {headerEnd}\n </span>\n ) : null}\n </span>\n ) : hasHeaderEnd ? (\n <span className=\"inline-flex h-full w-full min-h-0 min-w-0 max-w-full items-center justify-start gap-0.5\">\n <span className=\"min-h-0 min-w-0 flex-1 text-left [&_[data-slot=table-column-drag-handle]]:cursor-grab [&_[data-slot=table-column-drag-handle]]:active:cursor-grabbing\">\n {children}\n </span>\n <span className=\"inline-flex min-h-0 min-w-0 shrink-0 items-center\">\n {headerEnd}\n </span>\n </span>\n ) : (\n children\n )}\n {showResizer && (\n <div\n role=\"separator\"\n title=\"Drag to resize\"\n onMouseDown={onColumnResizeStart as React.MouseEventHandler}\n onTouchStart={onColumnResizeStart as React.TouchEventHandler}\n className={cn(\n // keep handle inside this th — negative right overlapped the next cell (bad with sticky/pinned columns)\n \"absolute top-0 right-0 z-1 h-full w-2.5 min-w-2.5 max-w-2.5 touch-none\",\n \"cursor-col-resize select-none\",\n isColumnResizing\n ? \"bg-primary/35\"\n : \"bg-primary/0 hover:bg-primary/25\",\n )}\n data-slot=\"table-column-resize-handle\"\n aria-hidden\n />\n )}\n </th>\n );\n },\n);\nTableHead.displayName = \"TableHead\";\n\nexport type TableCellProps = React.ComponentProps<\"td\"> & {\n /**\n * same `columnId` as `TableHead` in that column so body cells pick up\n * {@link TableConfigValue.columnDragState} styling\n */\n columnId?: string;\n};\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, style, columnId, ...props }, ref) => {\n const config = React.useContext(TableConfigContext) ?? defaultTableConfig;\n const drag = columnId ? columnDragTdClasses(config, columnId) : undefined;\n const columnDragStrip = Boolean(drag);\n\n return (\n <td\n ref={ref}\n data-slot=\"table-cell\"\n data-table-column-drag-strip={columnDragStrip ? \"\" : undefined}\n className={cn(\n \"min-w-0 border-b border-primary/10 p-3 align-middle text-sm text-primary/90 md:p-4 [&:has([role=checkbox])]:pr-0\",\n drag,\n className,\n )}\n style={style}\n data-column-id={columnId}\n {...props}\n />\n );\n },\n);\nTableCell.displayName = \"TableCell\";\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableColumnDragHandle,\n TableHead,\n TableCell,\n};\n\nexport type { TableLayoutProps as TableProps };","import type { ColumnSizingState, Updater } from \"@tanstack/react-table\";\nimport type { Dispatch, SetStateAction } from \"react\";\nimport {\n useCallback,\n useEffect,\n useRef,\n startTransition,\n} from \"react\";\n\nfunction sizingUpdaterToFn(\n updater: Updater<ColumnSizingState>,\n): (prev: ColumnSizingState) => ColumnSizingState {\n return typeof updater === \"function\" ? updater : () => updater;\n}\n\nexport function useRafBatchedColumnSizing(\n setColumnSizing: Dispatch<SetStateAction<ColumnSizingState>>,\n) {\n const rafRef = useRef<number | null>(null);\n const queueRef = useRef<Array<(p: ColumnSizingState) => ColumnSizingState>>(\n [],\n );\n\n useEffect(\n () => () => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n },\n [],\n );\n\n return useCallback(\n (updater: Updater<ColumnSizingState>) => {\n queueRef.current.push(sizingUpdaterToFn(updater));\n if (rafRef.current != null) return;\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n const fns = queueRef.current;\n queueRef.current = [];\n if (fns.length === 0) return;\n setColumnSizing((prev) => fns.reduce((acc, f) => f(acc), prev));\n });\n },\n [setColumnSizing],\n );\n}\n\nexport function useTransitionColumnSizing(\n setColumnSizing: Dispatch<SetStateAction<ColumnSizingState>>,\n) {\n return useCallback(\n (updater: Updater<ColumnSizingState>) => {\n startTransition(() => {\n setColumnSizing(updater);\n });\n },\n [setColumnSizing],\n );\n}\n","\"use client\";\n\nimport \"./meta\";\n\nimport {\n flexRender,\n type Header,\n type Row,\n type RowData,\n type Table as TanStackTable,\n} from \"@tanstack/react-table\";\nimport * as React from \"react\";\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Checkbox } from \"../checkbox\";\nimport {\n ColumnHeaderMenu,\n type ColumnHeaderMenuHandle,\n} from \"./column-menu\";\nimport {\n getColumnHeaderLabel,\n getColumnPinningClassName,\n getColumnPinningStyle,\n moveColumnInOrder,\n} from \"./helpers\";\nimport { getTableViewColumnDisableReorder } from \"./meta\";\nimport { useTableViewPersistence } from \"./persist\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableColumnDragHandle,\n TableHeaderSortControl,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../table\";\n\nexport type { TableViewPersistedSnapshotV1 } from \"./persist\";\nexport { TABLE_VIEW_PERSIST_STORAGE_KEY } from \"./persist\";\nexport {\n getSelectedRowIds,\n moveColumnInOrder,\n getColumnHeaderLabel,\n} from \"./helpers\";\nexport {\n useRafBatchedColumnSizing,\n useTransitionColumnSizing,\n} from \"./sizing\";\n\nconst EMPTY_STRING_ARRAY: readonly string[] = [];\n\nexport type TableViewOptions = {\n columnSort: boolean;\n columnReorder: boolean;\n columnResize: boolean;\n rowSelection: boolean;\n columnHeaderMenu: boolean;\n};\n\nconst tableViewColumnRoundTop = \"overflow-hidden rounded-t-lg\";\nconst tableViewColumnRoundBottom = \"overflow-hidden rounded-b-lg\";\n\ntype TableViewColumnHeadProps = {\n header: Header<RowData, unknown>;\n table: TanStackTable<RowData>;\n options: TableViewOptions;\n getColumnMinClassName?: (columnId: string) => string | undefined;\n draggedId: string | null;\n onHeaderCellDragOver: (e: React.DragEvent<HTMLTableCellElement>) => void;\n onHeaderCellDrop: (e: React.DragEvent<HTMLTableCellElement>) => void;\n onHeaderContextMenu: (e: React.MouseEvent<HTMLTableCellElement>) => void;\n setDraggedId: (id: string | null) => void;\n setDropTargetId: (id: string | null) => void;\n endColumnDrag: () => void;\n registerColumnMenu: (\n columnId: string,\n h: ColumnHeaderMenuHandle | null,\n ) => void;\n};\n\nconst TableViewColumnHead = React.memo(\n function TableViewColumnHead(props: TableViewColumnHeadProps) {\n const {\n header,\n table,\n options,\n getColumnMinClassName,\n onHeaderCellDragOver,\n onHeaderCellDrop,\n onHeaderContextMenu,\n setDraggedId,\n setDropTargetId,\n endColumnDrag,\n registerColumnMenu,\n } = props;\n const id = header.column.id;\n const canSort = header.column.getCanSort() && options.columnSort;\n const isSorted = header.column.getIsSorted();\n const hSize = header.getSize();\n const canResize = options.columnResize && header.column.getCanResize();\n const resizer = header.getResizeHandler();\n const onSort = header.column.getToggleSortingHandler();\n const runSort = useCallback(\n (e: React.MouseEvent) => {\n onSort?.(e);\n },\n [onSort],\n );\n\n const setMenuRef = useCallback(\n (h: ColumnHeaderMenuHandle | null) => {\n registerColumnMenu(id, h);\n },\n [id, registerColumnMenu],\n );\n\n const onDragStartReorder = useCallback(() => {\n setDraggedId(id);\n setDropTargetId(null);\n }, [id, setDraggedId, setDropTargetId]);\n\n const disableColumnReorder = getTableViewColumnDisableReorder(\n header.column,\n );\n const showReorderHandle = options.columnReorder && !disableColumnReorder;\n const headerInnerGap = showReorderHandle ? \"gap-2\" : \"gap-1.5\";\n\n const pinStyle = getColumnPinningStyle(header.column);\n const sizeStyle: React.CSSProperties | undefined = options.columnResize\n ? {\n width: hSize,\n minWidth: header.column.columnDef.minSize,\n maxWidth: header.column.columnDef.maxSize,\n }\n : undefined;\n return (\n <TableHead\n colSpan={header.colSpan}\n className={cn(\n tableViewColumnRoundTop,\n !options.columnResize && getColumnMinClassName?.(id),\n getColumnPinningClassName(header.column),\n header.column.getIsPinned() &&\n \"hover:bg-[color-mix(in_oklab,var(--color-primary)_5%,var(--color-background))]\",\n options.columnHeaderMenu && !header.isPlaceholder && \"group\",\n )}\n style={{ ...pinStyle, ...sizeStyle }}\n columnId={id}\n activeSort={\n canSort\n ? isSorted === \"asc\" || isSorted === \"desc\"\n ? isSorted\n : null\n : null\n }\n onColumnResizeStart={canResize ? resizer : undefined}\n isColumnResizing={header.column.getIsResizing()}\n headerEnd={\n options.columnHeaderMenu && !header.isPlaceholder ? (\n <ColumnHeaderMenu\n ref={setMenuRef}\n table={table}\n header={header}\n columnSort={options.columnSort}\n columnReorder={options.columnReorder}\n />\n ) : undefined\n }\n onContextMenu={\n options.columnHeaderMenu && !header.isPlaceholder\n ? onHeaderContextMenu\n : undefined\n }\n onDragOver={onHeaderCellDragOver}\n onDrop={options.columnReorder ? onHeaderCellDrop : undefined}\n >\n <span\n className={cn(\n \"box-border flex h-full min-h-0 w-full min-w-0 max-w-full flex-1 items-center\",\n headerInnerGap,\n )}\n >\n {showReorderHandle ? (\n <TableColumnDragHandle\n className=\"shrink-0 self-center\"\n columnId={id}\n previewLabel={getColumnHeaderLabel(header)}\n onDragStart={onDragStartReorder}\n onDragEnd={endColumnDrag}\n />\n ) : null}\n {header.isPlaceholder ? null : canSort ? (\n <>\n <span className=\"inline-flex w-max min-w-0 max-w-full shrink-0 items-center gap-1\">\n <button\n type=\"button\"\n className=\"text-primary hover:text-primary/90 m-0 min-h-10 min-w-0 max-w-full cursor-pointer truncate border-0 bg-transparent py-0 pr-0 pl-0 text-left text-sm font-bold leading-snug md:min-h-12\"\n onClick={runSort}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </button>\n <TableHeaderSortControl\n activeSort={\n isSorted === \"asc\" || isSorted === \"desc\" ? isSorted : null\n }\n onRequest={runSort}\n />\n </span>\n <button\n type=\"button\"\n className=\"m-0 min-h-10 min-w-0 flex-1 cursor-pointer self-stretch border-0 bg-transparent p-0 shadow-none md:min-h-12 focus-visible:ring-2 focus-visible:ring-primary/20 focus-visible:ring-offset-0\"\n aria-label=\"Change sort\"\n title=\"Change sort\"\n onClick={runSort}\n />\n </>\n ) : (\n <span className=\"min-w-0 flex-1 self-center text-left\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </span>\n )}\n </span>\n </TableHead>\n );\n },\n (prev, next) => {\n if (prev.header.id !== next.header.id) return false;\n if (\n prev.header.column.getIsResizing() !== next.header.column.getIsResizing()\n ) {\n return false;\n }\n if (prev.header.column.getIsSorted() !== next.header.column.getIsSorted()) {\n return false;\n }\n if (prev.header.getSize() !== next.header.getSize()) return false;\n if (prev.header.column.getIsPinned() !== next.header.column.getIsPinned()) {\n return false;\n }\n if (prev.header.isPlaceholder !== next.header.isPlaceholder) return false;\n if (\n getTableViewColumnDisableReorder(prev.header.column) !==\n getTableViewColumnDisableReorder(next.header.column)\n ) {\n return false;\n }\n if (prev.options.columnSort !== next.options.columnSort) return false;\n if (prev.options.columnReorder !== next.options.columnReorder) return false;\n if (prev.options.columnResize !== next.options.columnResize) return false;\n if (prev.options.columnHeaderMenu !== next.options.columnHeaderMenu) {\n return false;\n }\n if (prev.getColumnMinClassName !== next.getColumnMinClassName) {\n return false;\n }\n if (prev.draggedId !== next.draggedId) {\n return false;\n }\n if (prev.table !== next.table) return false;\n if (prev.onHeaderCellDragOver !== next.onHeaderCellDragOver) return false;\n if (prev.onHeaderCellDrop !== next.onHeaderCellDrop) return false;\n if (prev.onHeaderContextMenu !== next.onHeaderContextMenu) return false;\n if (prev.setDraggedId !== next.setDraggedId) return false;\n if (prev.setDropTargetId !== next.setDropTargetId) return false;\n if (prev.endColumnDrag !== next.endColumnDrag) return false;\n if (prev.registerColumnMenu !== next.registerColumnMenu) return false;\n return true;\n },\n);\n\ntype TableViewDataRowProps = {\n row: Row<RowData>;\n getColumnMinClassName?: (columnId: string) => string | undefined;\n options: Pick<TableViewOptions, \"columnResize\" | \"rowSelection\">;\n isLastRow: boolean;\n};\n\nconst TableViewDataRow = React.memo(function TableViewDataRow({\n row,\n getColumnMinClassName,\n options,\n isLastRow,\n}: TableViewDataRowProps) {\n return (\n <TableRow\n className=\"relative isolate\"\n data-state={row.getIsSelected() ? \"selected\" : undefined}\n >\n {options.rowSelection ? (\n <TableCell\n className={cn(\n \"w-10 min-w-10 max-w-12 shrink-0 !px-2 !py-3 text-center align-middle md:!px-2.5 md:!py-4\",\n isLastRow && tableViewColumnRoundBottom,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n <span className=\"inline-flex w-full items-center justify-center\">\n <Checkbox\n className=\"scale-90\"\n checked={row.getIsSelected()}\n disabled={!row.getCanSelect()}\n onCheckedChange={(next) => {\n if (!row.getCanSelect()) return;\n row.toggleSelected(!!next);\n }}\n aria-label=\"Select this row\"\n />\n </span>\n </TableCell>\n ) : null}\n {row.getVisibleCells().map((cell) => {\n const cid = cell.column.id;\n const cSize = cell.column.getSize();\n const cellPin = getColumnPinningStyle(cell.column);\n const cellSize: React.CSSProperties = options.columnResize\n ? {\n width: cSize,\n minWidth: cell.column.columnDef.minSize,\n maxWidth: cell.column.columnDef.maxSize,\n }\n : {};\n return (\n <TableCell\n key={cell.id}\n columnId={cid}\n className={cn(\n !options.columnResize ? getColumnMinClassName?.(cid) : undefined,\n getColumnPinningClassName(cell.column),\n isLastRow && tableViewColumnRoundBottom,\n )}\n style={{ ...cellPin, ...cellSize }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n );\n })}\n </TableRow>\n );\n});\n\n/**\n * Renders your TanStack `table` with shared chrome (`options`). Rich cells (badges,\n * images, links, row actions) belong in each column’s `columnDef.cell` / `header` —\n * `TableView` only `flexRender`s those. Header menu “Hide column” uses\n * `column.toggleVisibility(false)` (TanStack column visibility). For a different shell\n * (no column reorder UI, custom `tr`/`td` only), compose `Table`, `TableRow`, `TableCell`\n * from `@repo/ui/table`.\n */\nexport type TableViewProps<TData extends RowData> = {\n table: TanStackTable<TData>;\n sortableColumnIds: readonly string[];\n /** feature toggles; omitted keys use built-in defaults */\n options?: Partial<TableViewOptions>;\n getColumnMinClassName?: (columnId: string) => string | undefined;\n containerClassName?: string;\n /**\n * when set, persists layout-only TanStack UI state into the shared localStorage document (see `TABLE_VIEW_PERSIST_STORAGE_KEY`); this id picks the row inside `tables`\n * (column order; column sizing / pinning / column visibility when those features are enabled). sorting is not persisted — drive it from URL or your data layer so reloads do not re-apply stored sort and duplicate requests.\n */\n persistKey?: string;\n};\n\nexport function TableView<TData extends RowData>({\n table,\n sortableColumnIds: sortableColumns,\n options: optionsProp,\n getColumnMinClassName,\n containerClassName,\n persistKey,\n}: TableViewProps<TData>) {\n const options = useMemo(\n (): TableViewOptions => ({\n columnSort: optionsProp?.columnSort ?? true,\n columnReorder: optionsProp?.columnReorder ?? false,\n columnResize: optionsProp?.columnResize ?? false,\n rowSelection: optionsProp?.rowSelection ?? false,\n columnHeaderMenu: optionsProp?.columnHeaderMenu ?? false,\n }),\n [\n optionsProp?.columnSort,\n optionsProp?.columnReorder,\n optionsProp?.columnResize,\n optionsProp?.rowSelection,\n optionsProp?.columnHeaderMenu,\n ],\n );\n\n useTableViewPersistence(table, persistKey, {\n columnResize: options.columnResize,\n columnHeaderMenu: options.columnHeaderMenu,\n });\n\n const [draggedId, setDraggedId] = useState<string | null>(null);\n const [dropTargetId, setDropTargetId] = useState<string | null>(null);\n const columnMenuByIdRef = useRef<\n Record<string, ColumnHeaderMenuHandle | null>\n >({});\n const tableForMenu = table as TanStackTable<RowData>;\n\n const endColumnDrag = useCallback(() => {\n setDraggedId(null);\n setDropTargetId(null);\n }, []);\n\n const onDragOverCell = useCallback(\n (e: React.DragEvent<HTMLTableCellElement>) => e.preventDefault(),\n [],\n );\n\n const onHeaderContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n const t = e.currentTarget;\n const colId = t.getAttribute(\"data-column-id\");\n if (!colId) return;\n e.preventDefault();\n e.stopPropagation();\n columnMenuByIdRef.current[colId]?.open();\n },\n [],\n );\n\n const onHeaderCellDrop = useCallback(\n (e: React.DragEvent<HTMLTableCellElement>) => {\n e.preventDefault();\n const toId = e.currentTarget.getAttribute(\"data-column-id\");\n if (!toId) return;\n const from = e.dataTransfer.getData(\"text/plain\");\n if (!from || from === toId) return;\n table.setColumnOrder((o) => moveColumnInOrder([...o], from, toId));\n endColumnDrag();\n },\n [table, endColumnDrag],\n );\n\n const onHeaderCellDragOver = useCallback(\n (e: React.DragEvent<HTMLTableCellElement>) => {\n onDragOverCell(e);\n if (!options.columnReorder || !draggedId) return;\n const colId = e.currentTarget.getAttribute(\"data-column-id\");\n if (colId) setDropTargetId(colId);\n },\n [onDragOverCell, options.columnReorder, draggedId, setDropTargetId],\n );\n\n const registerColumnMenu = useCallback(\n (columnId: string, h: ColumnHeaderMenuHandle | null) => {\n if (h) columnMenuByIdRef.current[columnId] = h;\n else delete columnMenuByIdRef.current[columnId];\n },\n [],\n );\n\n const sortableForTable = useMemo(\n () => (options.columnSort ? sortableColumns : EMPTY_STRING_ARRAY),\n [options.columnSort, sortableColumns],\n );\n\n const columnDragState = useMemo(\n () =>\n options.columnReorder ? { draggingId: draggedId, dropTargetId } : null,\n [options.columnReorder, draggedId, dropTargetId],\n );\n\n const pageRows = table.getRowModel().rows;\n\n const dataRowOptions = useMemo(\n () => ({\n columnResize: options.columnResize,\n rowSelection: options.rowSelection,\n }),\n [options.columnResize, options.rowSelection],\n );\n\n return (\n <Table\n className=\"border-separate border-spacing-0\"\n sortableColumns={sortableForTable}\n enableColumnSort={options.columnSort}\n enableColumnReorder={options.columnReorder}\n enableColumnResize={options.columnResize}\n columnDragState={columnDragState}\n containerClassName={containerClassName ?? \"min-w-0\"}\n >\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => {\n const allPageSelected = table.getIsAllPageRowsSelected();\n const somePageSelected = table.getIsSomePageRowsSelected();\n return (\n <TableRow key={headerGroup.id} className=\"relative isolate\">\n {options.rowSelection ? (\n <TableHead\n className={cn(\n \"w-10 min-w-10 max-w-12 shrink-0 !px-2 text-center align-middle md:!px-2.5\",\n tableViewColumnRoundTop,\n )}\n onDragOver={onDragOverCell}\n scope=\"col\"\n >\n <span className=\"inline-flex w-full items-center justify-center\">\n <Checkbox\n className=\"scale-90\"\n checked={allPageSelected}\n indeterminate={!allPageSelected && somePageSelected}\n onClick={(e) => {\n e.stopPropagation();\n table.getToggleAllPageRowsSelectedHandler()(e);\n e.preventDefault();\n }}\n title=\"Select all on this page\"\n aria-label=\"Select all rows on this page\"\n />\n </span>\n </TableHead>\n ) : null}\n {headerGroup.headers.map((header) => (\n <TableViewColumnHead\n key={header.id}\n table={tableForMenu}\n header={header as Header<RowData, unknown>}\n options={options}\n getColumnMinClassName={getColumnMinClassName}\n draggedId={draggedId}\n onHeaderCellDragOver={onHeaderCellDragOver}\n onHeaderCellDrop={onHeaderCellDrop}\n onHeaderContextMenu={onHeaderContextMenu}\n setDraggedId={setDraggedId}\n setDropTargetId={setDropTargetId}\n endColumnDrag={endColumnDrag}\n registerColumnMenu={registerColumnMenu}\n />\n ))}\n </TableRow>\n );\n })}\n </TableHeader>\n <TableBody>\n {pageRows.map((row, rowIndex) => (\n <TableViewDataRow\n key={row.id}\n row={row as Row<RowData>}\n getColumnMinClassName={getColumnMinClassName}\n options={dataRowOptions}\n isLastRow={rowIndex === pageRows.length - 1}\n />\n ))}\n </TableBody>\n </Table>\n );\n}\n"]}
@@ -0,0 +1,86 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ type TableColumnDragState = {
5
+ /** column id you are currently dragging, or `null` */
6
+ draggingId: string | null;
7
+ /** id of the th under the cursor, or `null` */
8
+ dropTargetId: string | null;
9
+ };
10
+ type TableConfigValue = {
11
+ sortableColumnIds: ReadonlySet<string>;
12
+ enableColumnSort: boolean;
13
+ enableColumnReorder: boolean;
14
+ enableColumnResize: boolean;
15
+ /**
16
+ * when set (usually from host table state), `TableHead` / `TableCell` with
17
+ * matching `columnId` get consistent column-drag visuals
18
+ */
19
+ columnDragState: TableColumnDragState | null;
20
+ };
21
+ /**
22
+ * a compact card under the cursor so a column grab feels like moving the column, not
23
+ * a tiny icon. call from `onDragStart` of {@link TableColumnDragHandle} or your handle.
24
+ */
25
+ declare function setColumnDragPreview(e: React.DragEvent, options: {
26
+ title: string;
27
+ width?: number;
28
+ height?: number;
29
+ hotspotX?: number;
30
+ hotspotY?: number;
31
+ }): void;
32
+ type TableLayoutProps = {
33
+ containerClassName?: string;
34
+ sortableColumns?: readonly string[];
35
+ enableColumnSort?: boolean;
36
+ enableColumnReorder?: boolean;
37
+ enableColumnResize?: boolean;
38
+ /** pass `columnDragState` from the host (e.g. which column is being reordered) */
39
+ columnDragState?: TableColumnDragState | null;
40
+ };
41
+ declare const Table: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLTableElement> & React.TableHTMLAttributes<HTMLTableElement> & TableLayoutProps, "ref"> & React.RefAttributes<HTMLTableElement>>;
42
+ declare const TableHeader: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & React.RefAttributes<HTMLTableSectionElement>>;
43
+ declare const TableBody: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & React.RefAttributes<HTMLTableSectionElement>>;
44
+ declare const TableFooter: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "ref"> & React.RefAttributes<HTMLTableSectionElement>>;
45
+ declare const TableRow: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, "ref"> & React.RefAttributes<HTMLTableRowElement>>;
46
+ type TableColumnDragHandleProps = Omit<React.ComponentProps<"span">, "onDragStart" | "onDragEnd"> & {
47
+ /** must match the column & `dataTransfer` / tanstack `columnId` */
48
+ columnId: string;
49
+ onDragStart?: (e: React.DragEvent<HTMLSpanElement>) => void;
50
+ onDragEnd?: (e: React.DragEvent<HTMLSpanElement>) => void;
51
+ /**
52
+ * label on the custom drag “card” under the cursor; omit for a default “Column”
53
+ * placeholder (still more readable than the default browser ghost)
54
+ */
55
+ previewLabel?: string;
56
+ };
57
+ declare const TableColumnDragHandle: React.ForwardRefExoticComponent<Omit<TableColumnDragHandleProps, "ref"> & React.RefAttributes<HTMLSpanElement>>;
58
+ type TableHeaderSortControlProps = {
59
+ activeSort?: "asc" | "desc" | null;
60
+ onRequest?: (e: React.MouseEvent) => void;
61
+ className?: string;
62
+ };
63
+ /** chevron / sort control — place in the same row as the title (e.g. inside a narrow `inline-flex` with `gap-1`) */
64
+ declare function TableHeaderSortControl({ activeSort, onRequest, className, }: TableHeaderSortControlProps): react_jsx_runtime.JSX.Element;
65
+ type TableHeadProps = React.ComponentProps<"th"> & {
66
+ columnId?: string;
67
+ activeSort?: "asc" | "desc" | null;
68
+ onColumnResizeStart?: (e: React.MouseEvent | React.TouchEvent | HTMLDivElement) => void;
69
+ isColumnResizing?: boolean;
70
+ /**
71
+ * rendered at the far right of the head (e.g. column menu), after the label
72
+ * and sort chevrons
73
+ */
74
+ headerEnd?: React.ReactNode;
75
+ };
76
+ declare const TableHead: React.ForwardRefExoticComponent<Omit<TableHeadProps, "ref"> & React.RefAttributes<HTMLTableCellElement>>;
77
+ type TableCellProps = React.ComponentProps<"td"> & {
78
+ /**
79
+ * same `columnId` as `TableHead` in that column so body cells pick up
80
+ * {@link TableConfigValue.columnDragState} styling
81
+ */
82
+ columnId?: string;
83
+ };
84
+ declare const TableCell: React.ForwardRefExoticComponent<Omit<TableCellProps, "ref"> & React.RefAttributes<HTMLTableCellElement>>;
85
+
86
+ export { Table, TableBody, TableCell, type TableCellProps, TableColumnDragHandle, type TableColumnDragHandleProps, type TableColumnDragState, type TableConfigValue, TableFooter, TableHead, type TableHeadProps, TableHeader, TableHeaderSortControl, type TableHeaderSortControlProps, type TableLayoutProps, type TableLayoutProps as TableProps, TableRow, setColumnDragPreview };