@customafk/lunas-ui 0.2.6 → 0.2.7
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.
- package/dist/{alert-DwdUOFaC.d.cts → alert-CA1RS1CG.d.cts} +5 -5
- package/dist/{alert-5MxGtf3j.d.mts → alert-DDL82_U3.d.mts} +5 -5
- package/dist/{badge-sL8O2yfv.d.mts → badge-Cg0e-djv.d.mts} +5 -5
- package/dist/{button-CEOQ3-82.d.cts → button-Bn54lPVz.d.cts} +3 -3
- package/dist/button-C6ybzxxj.mjs.map +1 -1
- package/dist/{button-BlQb81It.d.mts → button-C76drZpd.d.mts} +3 -3
- package/dist/button-CwDT3m4m.cjs.map +1 -1
- package/dist/data-display/statistic.d.mts +4 -4
- package/dist/{dialog-Bah7jLoO.d.cts → dialog-CNhwBcEl.d.cts} +12 -12
- package/dist/{dialog-DSg5IKmb.d.mts → dialog-D6ygAOSV.d.mts} +12 -12
- package/dist/dialogs/detail-dialog/components/sidebar.d.cts +1 -1
- package/dist/dialogs/detail-dialog/components/sidebar.d.mts +24 -24
- package/dist/features/descriptions/index.d.mts +1 -1
- package/dist/features/tables/index.cjs +1 -1
- package/dist/features/tables/index.d.cts +1 -1
- package/dist/features/tables/index.d.mts +1 -1
- package/dist/features/tables/index.mjs +1 -1
- package/dist/features/tanstack-form/index.d.cts +1 -1
- package/dist/features/tanstack-form/index.d.mts +1 -1
- package/dist/{index-Dktb6D35.d.mts → index-75nSAiSe.d.mts} +55 -55
- package/dist/{index-D4shnfqM.d.cts → index-aTMCQQms.d.cts} +55 -55
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.mts +6 -6
- package/dist/index.mjs +1 -1
- package/dist/{input-DAGzv97v.d.mts → input-D5dtkW6g.d.mts} +5 -5
- package/dist/{input-DPLvx5x8.d.cts → input-t2hpPP2K.d.cts} +3 -3
- package/dist/layouts/flex.d.cts +2 -2
- package/dist/layouts/flex.d.mts +4 -4
- package/dist/pages/FeatureDeveloping.d.cts +2 -2
- package/dist/pages/FeatureDeveloping.d.mts +2 -2
- package/dist/pages/FeatureFixing.d.cts +2 -2
- package/dist/pages/FeatureFixing.d.mts +2 -2
- package/dist/pages/NotAuthorized.d.mts +2 -2
- package/dist/pages/NotFound.d.mts +2 -2
- package/dist/tables-Cc3Wik4i.cjs +2 -0
- package/dist/tables-Cc3Wik4i.cjs.map +1 -0
- package/dist/tables-DrJKQPsT.mjs +2 -0
- package/dist/tables-DrJKQPsT.mjs.map +1 -0
- package/dist/tanstack-form-BmV2BXDz.cjs.map +1 -1
- package/dist/tanstack-form-CJ43hVb_.mjs.map +1 -1
- package/dist/typography/paragraph.d.cts +3 -3
- package/dist/typography/paragraph.d.mts +5 -5
- package/dist/typography/title.d.cts +2 -2
- package/dist/typography/title.d.mts +2 -2
- package/dist/ui/alert-dialog.d.cts +12 -12
- package/dist/ui/alert-dialog.d.mts +12 -12
- package/dist/ui/alert.d.cts +1 -1
- package/dist/ui/alert.d.mts +1 -1
- package/dist/ui/aspect-ratio.d.cts +2 -2
- package/dist/ui/aspect-ratio.d.mts +2 -2
- package/dist/ui/avatar.d.cts +4 -4
- package/dist/ui/avatar.d.mts +4 -4
- package/dist/ui/badge.d.mts +1 -1
- package/dist/ui/breadcrumb.d.cts +8 -8
- package/dist/ui/breadcrumb.d.mts +8 -8
- package/dist/ui/button-group.d.cts +4 -4
- package/dist/ui/button-group.d.mts +6 -6
- package/dist/ui/button.d.cts +1 -1
- package/dist/ui/button.d.mts +1 -1
- package/dist/ui/calendar.d.cts +4 -4
- package/dist/ui/calendar.d.mts +4 -4
- package/dist/ui/card.d.cts +8 -8
- package/dist/ui/card.d.mts +8 -8
- package/dist/ui/carousel.d.cts +1 -1
- package/dist/ui/carousel.d.mts +7 -7
- package/dist/ui/checkbox.d.cts +2 -2
- package/dist/ui/checkbox.d.mts +2 -2
- package/dist/ui/collapsible.d.mts +4 -4
- package/dist/ui/command.d.cts +11 -11
- package/dist/ui/command.d.mts +11 -11
- package/dist/ui/context-menu.d.cts +16 -16
- package/dist/ui/context-menu.d.mts +16 -16
- package/dist/ui/dialog.d.cts +1 -1
- package/dist/ui/dialog.d.mts +1 -1
- package/dist/ui/drawer.d.cts +11 -11
- package/dist/ui/drawer.d.mts +11 -11
- package/dist/ui/dropdown-menu.d.mts +16 -16
- package/dist/ui/empty.d.cts +9 -9
- package/dist/ui/empty.d.mts +7 -7
- package/dist/ui/field.d.cts +13 -13
- package/dist/ui/field.d.mts +24 -24
- package/dist/ui/file-uploader.d.cts +2 -2
- package/dist/ui/file-uploader.d.mts +2 -2
- package/dist/ui/form.d.cts +11 -11
- package/dist/ui/form.d.mts +11 -11
- package/dist/ui/hover-card.d.cts +4 -4
- package/dist/ui/hover-card.d.mts +4 -4
- package/dist/ui/input-otp.d.cts +5 -5
- package/dist/ui/input-otp.d.mts +5 -5
- package/dist/ui/input.d.cts +1 -1
- package/dist/ui/input.d.mts +1 -1
- package/dist/ui/inputs/search-input.d.cts +3 -3
- package/dist/ui/inputs/search-input.d.mts +3 -3
- package/dist/ui/item.d.cts +15 -15
- package/dist/ui/item.d.mts +15 -15
- package/dist/ui/label.d.cts +2 -2
- package/dist/ui/label.d.mts +2 -2
- package/dist/ui/menubar.d.cts +17 -17
- package/dist/ui/menubar.d.mts +17 -17
- package/dist/ui/multi-select.d.cts +2 -2
- package/dist/ui/multi-select.d.mts +3 -3
- package/dist/ui/navigation-menu.d.cts +11 -11
- package/dist/ui/navigation-menu.d.mts +11 -11
- package/dist/ui/pagination.d.cts +9 -9
- package/dist/ui/pagination.d.mts +9 -9
- package/dist/ui/popover.d.cts +6 -6
- package/dist/ui/popover.d.mts +6 -6
- package/dist/ui/progress.d.cts +2 -2
- package/dist/ui/progress.d.mts +2 -2
- package/dist/ui/radio-group.d.cts +3 -3
- package/dist/ui/radio-group.d.mts +3 -3
- package/dist/ui/resizable.d.cts +9 -9
- package/dist/ui/resizable.d.mts +9 -9
- package/dist/ui/scroll-area.d.cts +6 -6
- package/dist/ui/scroll-area.d.mts +6 -6
- package/dist/ui/select.d.cts +9 -9
- package/dist/ui/select.d.mts +9 -9
- package/dist/ui/separator.d.cts +2 -2
- package/dist/ui/separator.d.mts +2 -2
- package/dist/ui/sheet.d.cts +9 -9
- package/dist/ui/sheet.d.mts +9 -9
- package/dist/ui/sidebar.d.cts +28 -28
- package/dist/ui/sidebar.d.mts +28 -28
- package/dist/ui/skeleton.d.cts +2 -2
- package/dist/ui/skeleton.d.mts +2 -2
- package/dist/ui/slider.d.cts +2 -2
- package/dist/ui/slider.d.mts +2 -2
- package/dist/ui/sonner.d.cts +2 -2
- package/dist/ui/sonner.d.mts +2 -2
- package/dist/ui/spinner.d.cts +2 -2
- package/dist/ui/spinner.d.mts +2 -2
- package/dist/ui/switch.d.mts +2 -2
- package/dist/ui/table.d.cts +18 -18
- package/dist/ui/table.d.mts +18 -18
- package/dist/ui/tabs.d.cts +5 -5
- package/dist/ui/tabs.d.mts +5 -5
- package/dist/ui/textarea.d.cts +2 -2
- package/dist/ui/textarea.d.mts +2 -2
- package/dist/ui/toggle-group.d.cts +3 -3
- package/dist/ui/toggle-group.d.mts +3 -3
- package/dist/ui/toggle.d.cts +4 -4
- package/dist/ui/toggle.d.mts +4 -4
- package/dist/ui/tooltip.d.cts +5 -5
- package/dist/ui/tooltip.d.mts +5 -5
- package/package.json +1 -1
- package/dist/tables-CmOVrvXM.cjs +0 -2
- package/dist/tables-CmOVrvXM.cjs.map +0 -1
- package/dist/tables-cBo0_szt.mjs +0 -2
- package/dist/tables-cBo0_szt.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables-Cc3Wik4i.cjs","names":["UITableEmpty: React.FC","MinusIcon","UITableBadgeDisplay: React.FC<{\n /** The text or number to display inside the badge. */\n label: string | number | null | undefined;\n /** Optional callback fired when the badge itself is clicked. */\n onClick?: () => void;\n /** When provided, renders a remove (×) button and fires this callback on click. */\n onRemove?: () => void;\n}>","XIcon","UITableBooleanDisplay: React.FC<{\n /** The boolean value to visualise; `null`/`undefined` renders an empty state. */\n value: boolean | null | undefined;\n}>","XIcon","CheckIcon","UITableDateDisplay: React.FC<Props>","TooltipProvider","Tooltip","TooltipTrigger","Badge","DateDisplay","TooltipContent","UITableDescriptionDisplay: React.FC<{\n /** The text or numeric value to display; `null`/`undefined` renders an empty state. */\n content: string | null | undefined | number;\n}>","Tooltip","TooltipTrigger","Paragraph","TooltipContent","UITableMoreButton: React.FC<{\n /**\n * List of menu items to render inside the dropdown.\n * Each item must have a unique `id`, a display `label`, and an `onClick`\n * handler that receives the item's `id`.\n */\n items?: { id: string; label: string; onClick: (id: string) => void }[];\n /** Reserved for future use; currently unused by the component. */\n onClick?: () => void;\n}>","DropdownMenu","DropdownMenuTrigger","Button","MoreVerticalIcon","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","UITableNameDisplay: React.FC<NameDisplayProps>","Tooltip","TooltipTrigger","Paragraph","TooltipContent","UITablePermalink: React.FC<{\n /** The destination URL the anchor navigates to. */\n href: string;\n /** Optional display text; falls back to the raw `href` when omitted. */\n label?: string;\n}>","ExternalLinkIcon","UITablePhoneNumberDisplay: React.FC<\n React.PropsWithChildren<{\n /** The raw phone number string to format and display. */\n value: string;\n }>\n>","Tooltip","TooltipTrigger","TooltipContent","UITableRemoveButton: React.FC<{\n /** Tooltip label describing what will be removed; defaults to a generic message. */\n title?: string;\n /** Async-compatible callback invoked when the button is clicked. */\n onClick?: () => void | Promise<void>;\n}>","Tooltip","TooltipTrigger","Button","Trash2Icon","TooltipContent","options: Intl.NumberFormatOptions","Flex","UITableUserDataDisplay: React.FC<Props>","Flex","Avatar","AvatarFallback","UserRoundIcon","colorHashLight","Paragraph","DropdownMenu","DropdownMenuTrigger","EllipsisVerticalIcon","DropdownMenuContent","DropdownMenuGroup","Activity","DropdownMenuItem","DropdownMenuShortcut","PinOffIcon","MoveLeftIcon","MoveRightIcon","Checkbox","Spinner","BoxIcon","pinnedWidth: number","flexibleColumnsCount: number","fixedSizeTotal: number","width","ChevronDown","AlertTriangle","UITableContainer: React.FC<React.PropsWithChildren>","ResizablePanelGroup","ResizablePanel","ColumnVisibility: React.FC<{\n checked: boolean;\n title: string;\n onCheckedChange?: (checked: boolean) => void;\n}>","Checkbox","ResizablePanel","Activity","Separator","Button","ListFilterPlus","Columns4Icon","ListFilterIcon","rows","UITableTooltipFilter: React.FC<\n Omit<React.ComponentProps<typeof Input>, 'className'> & {\n onSearch?: (value: string) => void;\n }\n>","Input","SearchIcon","ArrowRightIcon","ActionButton: React.FC<React.PropsWithChildren<React.ComponentProps<'button'>>>","UITableTooltipActions: React.FC<{\n onCreate?: () => void;\n onRefresh?: () => void;\n onDownload?: () => void;\n}>","CirclePlus","RefreshCwIcon","DownloadIcon","UITableTooltip: React.FC<React.PropsWithChildren>"],"sources":["../packages/components/features/tables/components/atoms/empty.tsx","../packages/components/features/tables/components/atoms/badge-display.tsx","../packages/components/features/tables/components/atoms/boolean-display.tsx","../packages/components/features/tables/components/atoms/date-display.tsx","../packages/components/features/tables/components/atoms/description-display.tsx","../packages/components/features/tables/components/atoms/more-button.tsx","../packages/components/features/tables/components/atoms/name-display.tsx","../packages/components/features/tables/components/atoms/permalink.tsx","../packages/components/features/tables/components/atoms/phone-number.tsx","../packages/components/features/tables/components/atoms/remove-button.tsx","../packages/components/features/tables/components/atoms/statistic.tsx","../packages/components/features/tables/components/atoms/user.tsx","../packages/components/features/tables/constants.ts","../packages/components/features/tables/hooks/use-context.ts","../packages/components/features/tables/components/common.tsx","../packages/components/features/tables/components/table.tsx","../packages/components/features/tables/components/table/filter.tsx","../packages/components/features/tables/components/table/provider.tsx","../packages/components/features/tables/components/table/tooltip.tsx"],"sourcesContent":["import { MinusIcon } from 'lucide-react';\n\n/**\n * Renders a double-dash placeholder used across table atom components to\n * indicate that a cell has no data to display.\n *\n * @example\n * import { UITableEmpty } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableEmpty />\n */\nexport const UITableEmpty: React.FC = () => {\n return (\n <div className=\"flex gap-0 text-text-positive-weak\">\n <MinusIcon size={16} />\n <MinusIcon size={16} />\n </div>\n );\n};\n","import { XIcon } from 'lucide-react';\n\nimport { UITableEmpty } from './empty';\n\n/**\n * Renders a pill-shaped badge for a table cell that optionally supports a click\n * action and an inline remove button; falls back to {@link UITableEmpty} when\n * `label` is falsy.\n *\n * @example\n * import { UITableBadgeDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableBadgeDisplay\n * label=\"Active\"\n * onClick={() => console.log('badge clicked')}\n * onRemove={() => console.log('remove clicked')}\n * />\n */\nexport const UITableBadgeDisplay: React.FC<{\n /** The text or number to display inside the badge. */\n label: string | number | null | undefined;\n /** Optional callback fired when the badge itself is clicked. */\n onClick?: () => void;\n /** When provided, renders a remove (×) button and fires this callback on click. */\n onRemove?: () => void;\n}> = ({ label, onClick, onRemove }) => {\n if (!label) return <UITableEmpty />;\n if (onRemove) {\n return (\n <div\n className=\"flex w-fit gap-x-0.5 rounded-full border border-border py-1 pr-2 pl-3 text-text-positive text-xs shadow-xs\"\n onClick={e => {\n onClick?.();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {label}\n <button\n className=\"cursor-pointer text-text-positive-weak hover:text-text-positive-strong\"\n onClick={e => {\n onRemove?.();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n <XIcon size={12} />\n </button>\n </div>\n );\n }\n return (\n <button\n className=\"w-fit rounded-full border border-border px-3 py-1 text-text-positive text-xs shadow-xs\"\n onClick={e => {\n onClick?.();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {label}\n </button>\n );\n};\n","import { CheckIcon, XIcon } from 'lucide-react';\n\nimport { UITableEmpty } from './empty';\n\n/**\n * Displays a green check icon for `true`, a red X icon for `false`, and a\n * double-dash placeholder via {@link UITableEmpty} when the value is\n * `null` or `undefined`.\n *\n * @example\n * import { UITableBooleanDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableBooleanDisplay value={isActive} />\n */\nexport const UITableBooleanDisplay: React.FC<{\n /** The boolean value to visualise; `null`/`undefined` renders an empty state. */\n value: boolean | null | undefined;\n}> = ({ value }) => {\n if (value === null || value === undefined) return <UITableEmpty />;\n if (value === false) {\n return (\n <div className=\"text-danger-strong\">\n <XIcon />\n </div>\n );\n }\n return (\n <div className=\"text-success-strong\">\n <CheckIcon />\n </div>\n );\n};\n","import { Badge } from '@/components/ui/badge';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { DateDisplay } from '@/components/data-display/date';\nimport { UITableEmpty } from './empty';\n\n/** Props for the {@link UITableDateDisplay} component. */\ntype Props = {\n /** The date value to format and display; `null`/`undefined` renders an empty state. */\n date: Date | string | number | null | undefined;\n};\n\n/**\n * Displays a date as a compact badge in a table cell with a tooltip that shows\n * the full date and time on hover; renders {@link UITableEmpty} when `date` is\n * `null` or `undefined`.\n *\n * @example\n * import { UITableDateDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableDateDisplay date={new Date('2024-06-15T10:30:00Z')} />\n */\nexport const UITableDateDisplay: React.FC<Props> = ({ date }) => {\n if (typeof date === 'undefined' || date === null) return <UITableEmpty />;\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Badge className=\"h-fit\">\n <DateDisplay date={date} format=\"medium\" className=\"font-normal text-white\" />\n </Badge>\n </TooltipTrigger>\n <TooltipContent className=\"rounded px-2\">\n <DateDisplay date={date} format=\"full\" showTime className=\"font-medium text-text-negative text-xs\" />\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n","import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { UITableEmpty } from './empty';\nimport { Paragraph } from '@/components/typography/paragraph';\n\n/**\n * Renders a two-line-clamped description in a table cell with a tooltip that\n * reveals the full text and its character count; falls back to\n * {@link UITableEmpty} when `content` is `null` or `undefined`.\n *\n * @example\n * import { UITableDescriptionDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableDescriptionDisplay content=\"A detailed description of this record.\" />\n */\nexport const UITableDescriptionDisplay: React.FC<{\n /** The text or numeric value to display; `null`/`undefined` renders an empty state. */\n content: string | null | undefined | number;\n}> = ({ content }) => {\n if (content === undefined || content === null) {\n return <UITableEmpty />;\n }\n return (\n <Tooltip>\n <TooltipTrigger>\n <Paragraph variant=\"sm\" className=\"line-clamp-2 whitespace-pre-line break-all\">\n {content}\n </Paragraph>\n </TooltipTrigger>\n <TooltipContent align=\"start\" className=\"h-fit min-w-48 max-w-80 pt-4\">\n <div className=\"flex flex-col gap-y-2\">\n <Paragraph variant=\"xs\" className=\"whitespace-pre-line text-wrap break-keep text-text-negative-weak\">\n {content}\n </Paragraph>\n <p className=\"w-full text-end\">{content.toString().length} chars</p>\n </div>\n </TooltipContent>\n </Tooltip>\n );\n};\n","import { MoreVerticalIcon } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\n\n/**\n * A vertical-ellipsis icon button that opens a dropdown menu populated from the\n * `items` array; intended for use in table row action columns.\n *\n * @example\n * import { UITableMoreButton } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableMoreButton\n * items={[\n * { id: 'edit', label: 'Edit', onClick: (id) => console.log(id) },\n * { id: 'delete', label: 'Delete', onClick: (id) => console.log(id) },\n * ]}\n * />\n */\nexport const UITableMoreButton: React.FC<{\n /**\n * List of menu items to render inside the dropdown.\n * Each item must have a unique `id`, a display `label`, and an `onClick`\n * handler that receives the item's `id`.\n */\n items?: { id: string; label: string; onClick: (id: string) => void }[];\n /** Reserved for future use; currently unused by the component. */\n onClick?: () => void;\n}> = ({ items = [] }) => {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button size=\"sm\" variant=\"ghost\" color=\"secondary\" className=\"size-9 rounded-full\">\n <MoreVerticalIcon />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuGroup>\n {items.map(item => (\n <DropdownMenuItem\n key={item.id}\n className=\"px-3\"\n onSelect={e => {\n item.onClick(item.id);\n e.stopPropagation();\n }}\n >\n {item.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n};\n","import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\nimport { Paragraph } from '@/components/typography/paragraph';\nimport { UITableEmpty } from './empty';\n\n/** Props for the {@link UITableNameDisplay} component. */\ntype NameDisplayProps = {\n /** The name string to display; renders an empty placeholder when falsy. */\n name?: string | null | undefined;\n};\n\n/**\n * Renders a clamped, truncated name string inside a tooltip that shows the full\n * text and character count on hover; falls back to {@link UITableEmpty} when the\n * value is absent.\n *\n * @example\n * import { UITableNameDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableNameDisplay name=\"John Doe\" />\n */\nexport const UITableNameDisplay: React.FC<NameDisplayProps> = ({ name }) => {\n if (!name) return <UITableEmpty />;\n return (\n <Tooltip>\n <TooltipTrigger>\n <Paragraph variant=\"sm\" className=\"line-clamp-2 w-full truncate text-wrap pb-px text-start\">\n {name}\n </Paragraph>\n </TooltipTrigger>\n <TooltipContent align=\"start\" className=\"h-fit min-w-48 max-w-80 pt-4\">\n <div className=\"flex flex-col gap-y-2\">\n <p className=\"whitespace-pre-line text-wrap break-keep\">{name}</p>\n <p className=\"w-full text-end\">{name.length} chars</p>\n </div>\n </TooltipContent>\n </Tooltip>\n );\n};\n","import { ExternalLinkIcon } from 'lucide-react';\n\n/**\n * Renders an external-link anchor with an icon for use in table cells, opening\n * the target URL in a new tab with safe `rel` attributes.\n *\n * @example\n * import { UITablePermalink } from '@customafk/lunas-ui/features/tables';\n *\n * <UITablePermalink href=\"https://example.com/records/42\" label=\"View record\" />\n */\nexport const UITablePermalink: React.FC<{\n /** The destination URL the anchor navigates to. */\n href: string;\n /** Optional display text; falls back to the raw `href` when omitted. */\n label?: string;\n}> = ({ href, label }) => {\n return (\n <a href={href} target=\"_blank\" className=\"inline-flex items-center gap-1 truncate text-primary text-sm underline\" rel=\"noopener noreferrer\">\n <span>{label || href}</span>\n <ExternalLinkIcon size={14} />\n </a>\n );\n};\n","import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\n/**\n * Formats and displays a phone number string in a table cell using the\n * `(NXX) NXX-XXXX` pattern, with a tooltip that shows the full international\n * dialling representation.\n *\n * @example\n * import { UITablePhoneNumberDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITablePhoneNumberDisplay value=\"0843456789\" />\n */\nexport const UITablePhoneNumberDisplay: React.FC<\n React.PropsWithChildren<{\n /** The raw phone number string to format and display. */\n value: string;\n }>\n> = ({ value }) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"font-number text-secondary-foreground text-sm tabular-nums\">{value.replace(/(\\d{3})(\\d{3})(\\d{4})/, '($1) $2-$3')}</p>\n </TooltipTrigger>\n <TooltipContent align=\"start\">\n <p className=\"tabular-nums\">{value.slice(1).replace(/(\\d{2})(\\d{3})(\\d{4})/, '(00) (+84) ($1) $2-$3')}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n","import { useCallback } from 'react';\n\nimport { Trash2Icon } from 'lucide-react';\n\nimport { Button } from '@/components/ui/button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\n\n/**\n * A ghost danger icon button with a trash icon that triggers an async removal\n * handler; displays a descriptive tooltip on hover to confirm the action intent.\n *\n * @example\n * import { UITableRemoveButton } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableRemoveButton\n * title=\"Remove member from project\"\n * onClick={async () => await deleteRow(rowId)}\n * />\n */\nexport const UITableRemoveButton: React.FC<{\n /** Tooltip label describing what will be removed; defaults to a generic message. */\n title?: string;\n /** Async-compatible callback invoked when the button is clicked. */\n onClick?: () => void | Promise<void>;\n}> = ({ title, onClick }) => {\n const handleClick = useCallback<React.MouseEventHandler<HTMLButtonElement>>(\n async e => {\n e.preventDefault();\n e.stopPropagation();\n await onClick?.();\n },\n [onClick]\n );\n return (\n <Tooltip>\n <TooltipTrigger>\n <Button type=\"button\" variant=\"ghost\" color=\"danger\" size=\"icon\" onClick={handleClick}>\n <Trash2Icon />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{title || 'Remove item from list table'}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n","import { memo, useCallback, useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Flex } from '@/components/layouts/flex';\nimport { UITableEmpty } from './empty';\n\n/**\n * Applies the specified rounding mode to `num` at the given decimal precision.\n *\n * @param num - The number to round.\n * @param precisionValue - Number of decimal places to keep.\n * @param roundingMode - Rounding strategy: `'round'` (default), `'floor'`, or `'ceil'`.\n * @returns The rounded number.\n */\nconst applyRounding = (num: number, precisionValue: number, roundingMode?: 'round' | 'floor' | 'ceil') => {\n const multiplier = 10 ** precisionValue;\n\n switch (roundingMode) {\n case 'floor':\n return Math.floor(num * multiplier) / multiplier;\n case 'ceil':\n return Math.ceil(num * multiplier) / multiplier;\n default:\n return Math.round(num * multiplier) / multiplier;\n }\n};\n\n/** Props for the {@link UITableStatisticDisplay} component. */\ntype Props = {\n /** Character used to separate the integer and fractional parts (default: `'.'`). */\n decimalSeparator?: string;\n /** Character used to separate thousands groups (default: `','`). */\n groupSeparator?: string;\n /** Optional node rendered before the formatted number (e.g. a currency symbol). */\n prefix?: React.ReactNode;\n /** Optional node rendered after the formatted number (e.g. a unit label). */\n suffix?: React.ReactNode;\n /** Number of decimal digits to display. */\n precision?: number;\n /** Rounding strategy applied before formatting (default: `'round'`). */\n roundingMode?: 'round' | 'floor' | 'ceil';\n /** When `true`, pads the fractional part with trailing zeros up to `precision` digits. */\n showTrailingZeros?: boolean;\n /** Font-size variant for the displayed number (default: `'lg'`). */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** The numeric or string value to format; falsy / invalid values render an empty state. */\n value: number | string | null | undefined;\n};\n\n/**\n * A memoized table-cell component that formats a numeric value with configurable\n * separators, precision, rounding, and size; renders {@link UITableEmpty} when\n * the value is zero, invalid, or absent.\n *\n * @example\n * import { UITableStatisticDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableStatisticDisplay value={1234567.89} precision={2} prefix=\"$\" size=\"md\" />\n */\nexport const UITableStatisticDisplay = memo(\n ({\n decimalSeparator = '.',\n groupSeparator = ',',\n prefix: Prefix,\n suffix: Suffix,\n precision,\n roundingMode = 'round',\n showTrailingZeros = false,\n size = 'lg',\n value = 0,\n }: Props) => {\n // Memoize number formatting options\n const formatOptions = useMemo((): Intl.NumberFormatOptions => {\n const options: Intl.NumberFormatOptions = {};\n\n if (typeof precision === 'number' && precision >= 0 && showTrailingZeros) {\n options.minimumFractionDigits = precision;\n options.maximumFractionDigits = precision;\n } else {\n options.maximumFractionDigits = precision;\n }\n\n return options;\n }, [precision, showTrailingZeros]);\n\n const formatNumber = useCallback(\n (num: number): string => {\n let processedNum = num;\n\n // Áp dụng làm tròn nếu có precision\n if (typeof precision === 'number' && precision >= 0) {\n processedNum = applyRounding(num, precision, roundingMode);\n }\n\n return processedNum.toLocaleString('en-US', formatOptions);\n },\n [roundingMode, formatOptions, precision]\n );\n\n // Memoize value processing\n const processedValue = useMemo((): string => {\n // Xử lý giá trị number\n if (typeof value === 'number') {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 'N/A';\n }\n return formatNumber(value);\n }\n\n // Xử lý giá trị string\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n\n // Nếu là chuỗi rỗng\n if (!trimmedValue) {\n return 'N/A';\n }\n\n // Thử convert sang number\n const numValue = Number(trimmedValue);\n\n if (Number.isNaN(numValue) || !Number.isFinite(numValue)) {\n // Nếu không phải số, trả về string gốc\n return 'N/A';\n }\n\n return formatNumber(numValue);\n }\n\n return 'N/A';\n }, [value, formatNumber]);\n\n // Memoize separator replacement\n const finalFormattedValue = useMemo((): string => {\n // Chỉ thay thế separators nếu khác mặc định\n if (decimalSeparator === '.' && groupSeparator === ',') {\n return processedValue;\n }\n return processedValue.replace(/,/g, groupSeparator).replace(/\\./g, decimalSeparator);\n }, [processedValue, decimalSeparator, groupSeparator]);\n\n if (finalFormattedValue === '0' || finalFormattedValue === 'N/A' || !finalFormattedValue) {\n return <UITableEmpty />;\n }\n\n return (\n <Flex\n padding=\"none\"\n className={cn(\n 'font-number text-lg text-text-positive tabular-nums',\n size === 'xs' && 'text-xs',\n size === 'sm' && 'text-sm',\n size === 'md' && 'text-base',\n size === 'lg' && 'text-lg',\n size === 'xl' && 'text-xl'\n )}\n >\n {Prefix}\n <p>{finalFormattedValue}</p>\n {Suffix}\n </Flex>\n );\n }\n);\nUITableStatisticDisplay.displayName = 'UITableStatisticDisplay';\n","import { UserRoundIcon } from 'lucide-react';\n\nimport { colorHashLight } from '@customafk/react-toolkit/color-hash';\n\nimport { Avatar, AvatarFallback } from '@/components/ui/avatar';\n\nimport { Flex } from '@/components/layouts/flex';\nimport { Paragraph } from '@/components/typography/paragraph';\n\n/** Props for the {@link UITableUserDataDisplay} component. */\ntype Props = {\n /** Unique identifier used to deterministically generate the avatar background colour. */\n uuid?: string | null | undefined;\n /** Display name shown below the avatar; falls back to `'Unknown User'` when absent. */\n username?: string | null | undefined;\n /** Email address shown as secondary text beneath the username. */\n email?: string | null | undefined;\n};\n\n/**\n * Renders a user avatar paired with username and email for use in table cells;\n * derives a consistent avatar background colour from the user's `uuid` via a\n * colour-hash utility.\n *\n * @example\n * import { UITableUserDataDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableUserDataDisplay\n * uuid=\"a1b2c3d4-e5f6-7890-abcd-ef1234567890\"\n * username=\"Jane Smith\"\n * email=\"jane@example.com\"\n * />\n */\nexport const UITableUserDataDisplay: React.FC<Props> = ({ uuid, username, email }) => {\n return (\n <Flex wrap={false} gap=\"sm\" padding=\"none\">\n {!uuid && (\n <Avatar className=\"size-10 shadow-card\">\n <AvatarFallback className=\"bg-muted-weak\">\n <UserRoundIcon size={28} className=\"text-text-negative\" />\n </AvatarFallback>\n </Avatar>\n )}\n {uuid && (\n <Avatar className=\"size-10 shadow-card\">\n <AvatarFallback style={{ backgroundColor: colorHashLight.hex(uuid) }}>\n <UserRoundIcon size={28} className=\"text-white\" />\n </AvatarFallback>\n </Avatar>\n )}\n <Flex vertical padding=\"none\" gap=\"none\" align=\"start\">\n <Paragraph className=\"font-medium text-sm text-text-positive-weak\">{username ?? 'Unknown User'}</Paragraph>\n <Paragraph variant=\"sm\" className=\"mt-0! text-text-positive-weak text-xs\">\n {email}\n </Paragraph>\n </Flex>\n </Flex>\n );\n};\n","export const SELECT_WIDTH = 60;\nexport const ACTION_WIDTH = 60;\nexport const TABLE_HEADER_Z_INDEX = 20;\nexport const PINNED_COLUMN_Z_INDEX = 20;\n","import { createContext, use } from 'react';\n\nimport type { AnyEntity } from '@/types';\nimport type { TTableBodyContext, TTableContext, TTableHeadRowContext, TTableInnerTableContext, TTableInnerWrapperContext, TTableRowContext } from '../types';\n\nexport const TableInnerWrapperContext = createContext<TTableInnerWrapperContext | null>(null);\n\nexport const useUITableInnerWrapperContext = () => {\n const ctx = use(TableInnerWrapperContext);\n if (!ctx) {\n throw new Error('useTableInnerWrapperContext must be used within a TableInnerWrapperProvider');\n }\n return ctx;\n};\n\nexport const TableInnerTableContext = createContext<TTableInnerTableContext | null>(null);\n\nexport const useUITableInnerTableContext = () => {\n const ctx = use(TableInnerTableContext);\n if (!ctx) {\n throw new Error('useTableInnerTableContext must be used within a TableInnerTableProvider');\n }\n return ctx;\n};\n\nexport const TableHeadRowContext = createContext<TTableHeadRowContext | null>(null);\n\nexport const useUITableHeadRowContext = () => {\n const ctx = use(TableHeadRowContext);\n if (!ctx) {\n throw new Error('useTableHeaderRowContext must be used within a TableHeaderRowProvider');\n }\n return ctx;\n};\n\nexport const TableBodyContext = createContext<TTableBodyContext | null>(null);\n\nexport const useUITableBodyContext = () => {\n const ctx = use(TableBodyContext);\n if (!ctx) {\n throw new Error('useTableBodyContext must be used within a TableBodyProvider');\n }\n return ctx;\n};\n\nexport const TableRowContext = createContext<TTableRowContext<AnyEntity, AnyEntity> | null>(null);\n\nexport const useUITableRowContext = () => {\n const ctx = use(TableRowContext);\n if (!ctx) {\n throw new Error('useTableRowContext must be used within a TableRowProvider');\n }\n return ctx;\n};\n\nexport const TableContext = createContext<TTableContext<AnyEntity> | null>(null);\n\nexport const useUITableContext = () => {\n const context = use(TableContext);\n if (!context) {\n throw new Error('useTableContext must be used within a TableProvider');\n }\n return context;\n};\n","/**\n * @file common.tsx\n * Low-level, memoised building blocks that compose into a full UITable.\n *\n * Each component corresponds to a standard HTML table element (`<table>`,\n * `<thead>`, `<tbody>`, `<tr>`, `<td>`, `<th>`, `<tfoot>`) with additional\n * TanStack Table integration for column pinning, virtual scrolling, and\n * dynamic CSS-variable-based sizing.\n */\nimport { Activity, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { flexRender } from '@tanstack/react-table';\n\nimport { AlertTriangle, BoxIcon, ChevronDown, EllipsisVerticalIcon, MoveLeftIcon, MoveRightIcon, PinOffIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Checkbox } from '@/components/ui/checkbox';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\nimport { Spinner } from '@/components/ui/spinner';\n\nimport type { AnyEntity } from '@/types';\nimport { ACTION_WIDTH, PINNED_COLUMN_Z_INDEX, SELECT_WIDTH, TABLE_HEADER_Z_INDEX } from '../constants';\nimport {\n useUITableBodyContext,\n useUITableHeadRowContext,\n useUITableInnerTableContext,\n useUITableInnerWrapperContext,\n useUITableRowContext,\n} from '../hooks/use-context';\nimport type {\n TUITableBody,\n TUITableCell,\n TUITableCellActions,\n TUITableCellSelect,\n TUITableEmptyDisplay,\n TUITableFooter,\n TUITableHead,\n TUITableHeadCell,\n TUITableHeadCellOption,\n TUITableHeadCellSelect,\n TUITableHeadRow,\n TUITableInnerTable,\n TUITableInnerWrapper,\n TUITableLoadMore,\n TUITableRow,\n TUITableWrapper,\n} from '../types';\n\n/**\n * Ellipsis dropdown menu attached to a header cell that lets the user pin the\n * column to the left, pin it to the right, or unpin it.\n *\n * The trigger button is invisible until the parent `<th>` is hovered\n * (`group-hover:opacity-100`), keeping the header clean by default.\n *\n * @example\n * ```tsx\n * import { UITableHeadCellOption } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableHeadCellOption\n * isPinned=\"left\"\n * onLeftPin={col.pin}\n * onRightPin={col.pin}\n * onUnpin={col.pin}\n * />\n * ```\n */\nexport const UITableHeadCellOption = memo<TUITableHeadCellOption>(({ isPinned, onLeftPin, onRightPin, onUnpin, className }) => {\n const handleLeftPin = useCallback(() => {\n onLeftPin?.('left');\n }, [onLeftPin]);\n\n const handleRightPin = useCallback(() => {\n onRightPin?.('right');\n }, [onRightPin]);\n\n const handleUnpin = useCallback(() => {\n onUnpin?.(false);\n }, [onUnpin]);\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className={cn(\n 'absolute right-2 z-10 p-0.5 opacity-0 bg-card',\n 'cursor-pointer rounded-full transition-all',\n 'text-text-positive-weak',\n '[&>svg]:size-4',\n 'group-hover:opacity-100',\n 'hover:bg-muted-muted hover:text-text-positive',\n className\n )}\n >\n <EllipsisVerticalIcon />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-64 p-4\">\n <DropdownMenuGroup className=\"*:data-[slot=dropdown-menu-item]:rounded-xs *:data-[slot=dropdown-menu-item]:p-2\">\n <Activity mode={isPinned ? 'visible' : 'hidden'}>\n <DropdownMenuItem onClick={handleUnpin}>\n {!!isPinned && 'Unpin'}\n <DropdownMenuShortcut>\n <PinOffIcon className=\"size-4\" />\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n </Activity>\n <Activity mode={!isPinned ? 'visible' : 'hidden'}>\n <DropdownMenuItem onClick={handleLeftPin}>\n {isPinned ? 'Unpin' : 'Pin to Left'}\n <DropdownMenuShortcut>\n <MoveLeftIcon className=\"size-4\" />\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n <DropdownMenuItem onClick={handleRightPin}>\n {isPinned ? 'Unpin' : 'Pin to Right'}\n <DropdownMenuShortcut>\n <MoveRightIcon className=\"size-4\" />\n </DropdownMenuShortcut>\n </DropdownMenuItem>\n </Activity>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n});\nUITableHeadCellOption.displayName = 'UITableHeadCellOption';\n\n/**\n * Sticky `<th>` cell that renders a \"select all rows\" checkbox in the leftmost\n * header position.\n *\n * The cell is always pinned at `left: 0` and uses a fixed width of\n * `SELECT_WIDTH` to align with the corresponding body select cells.\n *\n * @example\n * ```tsx\n * import { UITableHeadCellSelect } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableHeadCellSelect\n * isPinned=\"left\"\n * isAllRowsSelected={table.getIsAllRowsSelected()}\n * onToggleAllRowsSelected={table.toggleAllRowsSelected}\n * />\n * ```\n */\nexport const UITableHeadCellSelect = memo<TUITableHeadCellSelect>(({ isPinned, isAllRowsSelected, style, onToggleAllRowsSelected, ...props }) => {\n const handleToggleAllRowsSelected = useCallback(\n (value: boolean | 'indeterminate') => {\n onToggleAllRowsSelected?.(!!value);\n },\n [onToggleAllRowsSelected]\n );\n return (\n <th\n slot=\"table-header-cell\"\n data-pinned={true}\n style={{ left: 0, zIndex: TABLE_HEADER_Z_INDEX, width: SELECT_WIDTH, maxWidth: SELECT_WIDTH }}\n className={cn(isPinned ? 'sticky' : 'relative')}\n {...props}\n >\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <Checkbox aria-label=\"Select All Rows\" checked={isAllRowsSelected} onCheckedChange={handleToggleAllRowsSelected} />\n </div>\n </th>\n );\n});\nUITableHeadCellSelect.displayName = 'UITableHeadCellSelect';\n\n/**\n * Overlay displayed in place of table rows when the table is loading data or\n * when the dataset is empty after a successful fetch.\n *\n * Returns `null` when neither `isEmpty` nor `isFetching` is true, so it adds\n * zero DOM overhead during normal rendering.\n *\n * @example\n * ```tsx\n * import { UITableEmptyDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableEmptyDisplay isFetching={isLoading} isEmpty={data.length === 0} />\n * ```\n */\nexport const UITableEmptyDisplay = memo<TUITableEmptyDisplay>(({ isEmpty, isFetching }) => {\n if (!isEmpty && !isFetching) return null;\n return (\n <div className=\"sticky left-0 flex min-h-96 flex-1 items-center justify-center bg-transparent text-text-positive-weak opacity-100\">\n {isFetching && (\n <div className=\"flex flex-col items-center gap-1\">\n <Spinner className=\"size-12\" />\n <p>Loading data...</p>\n </div>\n )}\n {isEmpty && !isFetching && (\n <div className=\"flex flex-col items-center gap-1\">\n <BoxIcon strokeWidth={1} size={48} />\n <p>No data available</p>\n </div>\n )}\n </div>\n );\n});\nUITableEmptyDisplay.displayName = 'UITableEmptyDisplay';\n\n/**\n * Outermost layout container for the entire UITable composition.\n *\n * Renders a full-width, full-height flex column that positions the toolbar,\n * the scrollable table area, and the footer in a single stack.\n *\n * @example\n * ```tsx\n * import { UITableWrapper } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableWrapper className=\"h-[600px]\">\n * {children}\n * </UITableWrapper>\n * ```\n */\nexport const UITableWrapper = memo<TUITableWrapper>(({ className, children, ...props }) => {\n return (\n <div slot=\"table-wrapper\" className={cn('relative m-0 flex size-full flex-col flex-nowrap items-start justify-start gap-2', className)} {...props}>\n {children}\n </div>\n );\n});\nUITableWrapper.displayName = 'UITableWrapper';\n\n/**\n * Scrollable `<div>` that wraps the `<table>` element and acts as the\n * viewport for both horizontal and vertical virtual scrolling.\n *\n * Reads its stable id from `UITableInnerWrapperContext` so that other\n * components (e.g. `UITableLoadMore`) can reference the DOM node via\n * `document.querySelector` without prop-drilling.\n *\n * @example\n * ```tsx\n * import { UITableInnerWrapper } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableInnerWrapper>\n * <UITableInnerTable>…</UITableInnerTable>\n * </UITableInnerWrapper>\n * ```\n */\nexport const UITableInnerWrapper = memo<TUITableInnerWrapper>(({ children, ...props }) => {\n const { innerWrapperId } = useUITableInnerWrapperContext();\n return (\n <div\n id={innerWrapperId}\n slot=\"table-inner-wrapper\"\n className=\"relative size-full overflow-auto border-b border-b-border border-l border-l-border bg-card\"\n {...props}\n >\n {children}\n </div>\n );\n});\nUITableInnerWrapper.displayName = 'UITableInnerWrapper';\n\n/**\n * The actual `<table>` element that drives the UITable layout.\n *\n * Attaches a `ResizeObserver` to the table element and calculates per-column\n * CSS custom properties (`--header-<id>-size`, `--col-<id>-size`) in a single\n * pass on every resize, avoiding expensive per-cell `column.getSize()` calls.\n * Flexible columns share the remaining width equally; fixed-size and pinned\n * columns are excluded from the distribution.\n *\n * @example\n * ```tsx\n * import { UITableInnerTable } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableInnerTable>\n * <UITableHead>…</UITableHead>\n * <UITableBody height=\"600px\">…</UITableBody>\n * </UITableInnerTable>\n * ```\n */\nexport const UITableInnerTable = memo<TUITableInnerTable>(({ children, ...props }) => {\n const { table, innerTableId, totalSize } = useUITableInnerTableContext();\n const tableRef = useRef<HTMLTableElement>(null);\n\n /**\n * Instead of calling `column.getSize()` on every render for every header\n * and especially every data cell (very expensive),\n * we will calculate all column sizes at once at the root table level in a useMemo\n * and pass the column sizes down as CSS variables to the <table> element.\n */\n // biome-ignore lint/correctness/useExhaustiveDependencies: table element.\n useEffect(() => {\n if (!tableRef.current) return;\n\n const headers = table.getFlatHeaders();\n\n const observer = new ResizeObserver(entries => {\n requestAnimationFrame(() => {\n const tableElement = entries[0].target;\n if (tableElement instanceof HTMLTableElement) {\n const tableEntry = entries[0];\n if (!tableEntry) return;\n const tableContentRectWidth = tableEntry.contentRect.width;\n\n const { left: leftColumnPinning = [], right: rightColumnPinning = [] } = table.getState().columnPinning;\n\n // --- 1. DUYỆT 1 LẦN DUYẾT ĐỂ LẤY TẤT CẢ THÔNG SỐ ---\n let pinnedWidth: number = 0;\n let flexibleColumnsCount: number = 0;\n let fixedSizeTotal: number = 0;\n const columnSpecs = headers.map(header => {\n const { id } = header;\n const isSpecial = id === 'select' || id === 'actions';\n const isPinned = leftColumnPinning.includes(id) || rightColumnPinning.includes(id);\n const size = header.getSize();\n const maxSize = header.column.columnDef.maxSize;\n\n // Tính toán chiều rộng cố định (pinned hoặc special)\n if (isSpecial) {\n const width = id === 'select' ? SELECT_WIDTH : ACTION_WIDTH;\n pinnedWidth += width;\n return { id, isFlex: false, width };\n }\n\n if (isPinned) {\n pinnedWidth += size;\n return { id, isFlex: false, width: size };\n }\n\n // Kiểm tra nếu cột có size cụ thể (khác mặc định 150)\n if (header.column.columnDef.size || size !== 150) {\n fixedSizeTotal += size;\n return { id, isFlex: false, width: size };\n }\n\n // Cột có thể co giãn\n flexibleColumnsCount++;\n return { id, isFlex: true, maxSize };\n });\n\n // --- 2. TÍNH TOÁN CHIỀU RỘNG CHIA ĐỀU (AVENGER WIDTH) ---\n const remainingWidth = tableContentRectWidth - pinnedWidth - fixedSizeTotal;\n const rawFlexWidth = flexibleColumnsCount > 0 ? Math.max(0, Math.floor(remainingWidth / flexibleColumnsCount)) : 0;\n\n // --- 3. ÁP DỤNG STYLE TRONG MỘT LẦN DUYỆT ---\n columnSpecs.forEach(col => {\n if (col.isFlex) {\n // Nếu có maxSize, đảm bảo không vượt quá\n const finalWidth = col.maxSize ? Math.min(rawFlexWidth, col.maxSize) : rawFlexWidth;\n tableElement.style.setProperty(`--header-${col.id}-size`, `${finalWidth}`);\n tableElement.style.setProperty(`--col-${col.id}-size`, `${finalWidth}`);\n if (col.maxSize) {\n tableElement.style.setProperty(`--col-${col.id}-maxSize`, `${col.maxSize}`);\n }\n } else {\n tableElement.style.setProperty(`--header-${col.id}-size`, `${col.width}`);\n tableElement.style.setProperty(`--col-${col.id}-size`, `${col.width}`);\n }\n });\n }\n });\n });\n observer.observe(tableRef.current);\n return () => observer.disconnect();\n }, [table.getState().columnSizingInfo, table.getState().columnSizing, table.getState().columnPinning]);\n\n return (\n <table\n id={innerTableId}\n ref={tableRef}\n slot=\"table-inner-table\"\n className=\"grid w-full table-fixed caption-bottom border-collapse border-spacing-0 flex-col content-start [&_tfoot_td]:border-t\"\n style={{ minWidth: totalSize }}\n {...props}\n >\n {children}\n </table>\n );\n});\nUITableInnerTable.displayName = 'UITableInnerTable';\n\n/**\n * Sticky `<thead>` element that stays fixed at the top of the scrollable\n * table area while the body scrolls beneath it.\n *\n * Applies column-border, background, and font styling uniformly to all\n * descendant `<th>` elements via Tailwind child selectors.\n *\n * @example\n * ```tsx\n * import { UITableHead } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableHead>\n * {table.getHeaderGroups().map(hg => (\n * <UITableHeadRow key={hg.id} headerGroup={hg} />\n * ))}\n * </UITableHead>\n * ```\n */\nexport const UITableHead = memo<TUITableHead>(({ className, children, ...props }) => {\n return (\n <thead\n slot=\"table-head\"\n className={cn(\n 'sticky top-0 z-20 h-9 w-full',\n 'grid select-none bg-muted-bg-subtle',\n 'border-b border-b-border shadow',\n 'font-medium text-[13px] text-text-positive-weak',\n\n '[&_tr:not(:last-child)_td]:border-b',\n\n '[&_th]:inline-flex',\n '[&_th]:items-center',\n '[&_th]:transition-all',\n '[&_th]:duration-300',\n '[&_th]:whitespace-nowrap',\n '[&_th]:border-border',\n '[&_th]:border-r',\n '[&_th]:last:border-r-0',\n '[&_th]:first:border-l-0',\n\n '[&_tr_th:not([data-pinned=false])]:bg-muted-bg-subtle',\n className\n )}\n {...props}\n >\n {children}\n </thead>\n );\n});\nUITableHead.displayName = 'UITableHead';\n\n/**\n * Renders a single `<tr>` for a TanStack `HeaderGroup`, mapping each header\n * to either `UITableHeadCellSelect` (for the `select` column) or\n * `UITableHeadCell` (for all other columns).\n *\n * Reads pinning state and \"select all\" handler from `UITableHeadRowContext`\n * so the row itself does not need to receive those as props.\n *\n * @example\n * ```tsx\n * import { UITableHeadRow } from '@customafk/lunas-ui/features/tables';\n *\n * {table.getHeaderGroups().map(hg => (\n * <UITableHeadRow key={hg.id} headerGroup={hg} />\n * ))}\n * ```\n */\nexport const UITableHeadRow = memo<TUITableHeadRow>(({ headerGroup, className, ...props }) => {\n const { isAllRowsSelected, columnPinningState, leftPinnedHeaders, rightPinnedHeaders, onToggleAllRowsSelected } = useUITableHeadRowContext();\n const firstRightPinnedHeaderId = rightPinnedHeaders[0]?.id;\n const lastLeftPinnedHeaderId = leftPinnedHeaders[leftPinnedHeaders.length - 1]?.id;\n return (\n <tr slot=\"table-head-row\" className={cn('flex', className)} {...props}>\n {headerGroup.headers.map((header, index) => {\n const isVisible = header.column.getIsVisible();\n const isPinned = columnPinningState.left?.includes(header.id) ? 'left' : columnPinningState.right?.includes(header.id) ? 'right' : false;\n if (header.id === 'select') {\n return (\n <UITableHeadCellSelect\n key={header.id}\n isPinned={isPinned}\n isAllRowsSelected={isAllRowsSelected}\n onToggleAllRowsSelected={onToggleAllRowsSelected}\n />\n );\n }\n return (\n <UITableHeadCell\n key={`${header.id}-${index}`}\n isVisible={isVisible}\n isPinned={isPinned}\n isFirstCell={header.id === firstRightPinnedHeaderId}\n isLastCell={header.id === lastLeftPinnedHeaderId}\n isOptionsVisible={!['select', 'actions'].includes(header.id)}\n headerId={header.id}\n headerColumn={header.column}\n colSpan={header.colSpan}\n onColumnPin={header.column.pin}\n onToggleVisibility={header.column.toggleVisibility}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n </UITableHeadCell>\n );\n })}\n </tr>\n );\n});\nUITableHeadRow.displayName = 'UITableHeadRow';\n\n/**\n * Individual `<th>` cell that supports left/right sticky pinning, dynamic\n * CSS-variable-driven width, min/max size constraints, and an optional\n * `UITableHeadCellOption` pin/unpin dropdown.\n *\n * Width is driven by the CSS custom property `--header-<headerId>-size` set\n * by `UITableInnerTable`, avoiding per-cell `column.getSize()` calls.\n *\n * @example\n * ```tsx\n * import { UITableHeadCell } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableHeadCell\n * headerId={header.id}\n * headerColumn={header.column}\n * isPinned=\"left\"\n * isLastCell\n * onColumnPin={header.column.pin}\n * >\n * {flexRender(header.column.columnDef.header, header.getContext())}\n * </UITableHeadCell>\n * ```\n */\nexport const UITableHeadCell = memo<TUITableHeadCell>(\n ({\n isVisible = true,\n isPinned = false,\n isFirstCell = false,\n isLastCell = false,\n isOptionsVisible = true,\n headerId,\n headerColumn,\n className,\n children,\n onColumnPin,\n onToggleVisibility,\n ...props\n }) => {\n const zIndex = useMemo(() => {\n return isPinned ? PINNED_COLUMN_Z_INDEX : undefined;\n }, [isPinned]);\n\n const left = useMemo(() => {\n const axis = headerColumn?.getStart?.('left');\n return isPinned === 'left' && typeof axis === 'number' ? `${axis}px` : undefined;\n }, [isPinned, headerColumn]);\n\n const right = useMemo(() => {\n const axis = headerColumn?.getAfter?.('right');\n return isPinned === 'right' && typeof axis === 'number' ? `${axis}px` : undefined;\n }, [isPinned, headerColumn]);\n\n const width = useMemo(() => {\n return `calc(var(--header-${headerId}-size) * 1px)`;\n }, [headerId]);\n\n const minSize = useMemo(() => {\n return headerColumn?.columnDef.minSize ? `calc(var(--col-${headerId}-minSize) * 1px)` : undefined;\n }, [headerId, headerColumn]);\n\n const maxSize = useMemo(() => {\n return headerColumn?.columnDef.maxSize ? `calc(var(--col-${headerId}-maxSize) * 1px)` : undefined;\n }, [headerId, headerColumn]);\n return (\n <th\n slot=\"table-head-cell\"\n data-pinned={isPinned}\n data-header={headerId}\n style={{\n zIndex,\n left,\n right,\n width: width,\n minWidth: minSize,\n maxWidth: maxSize,\n }}\n className={cn(\n 'group flex',\n headerId === 'actions' && 'border-r-0!',\n isPinned ? 'sticky' : 'relative',\n isPinned === 'left' && isLastCell && 'border-r border-r-border',\n isPinned === 'right' && isFirstCell && 'border-l border-l-border',\n (headerColumn?.columnDef.meta as AnyEntity)?.position === 'center' && 'justify-center',\n (headerColumn?.columnDef.meta as AnyEntity)?.position === 'end' && 'justify-end',\n (headerColumn?.columnDef.meta as AnyEntity)?.position === 'start' && 'justify-start',\n className\n )}\n {...props}\n >\n <div className=\"truncate px-4\">{children}</div>\n {isOptionsVisible && (\n <UITableHeadCellOption isPinned={isPinned} isVisible={isVisible} onLeftPin={onColumnPin} onRightPin={onColumnPin} onUnpin={onColumnPin} />\n )}\n </th>\n );\n }\n);\nUITableHeadCell.displayName = 'UITableHeadCell';\n\n/**\n * `<tbody>` element that acts as the virtual-scroll container.\n *\n * Renders `null` while data is loading or the table is empty (the\n * `UITableEmptyDisplay` overlay handles those states instead). The `height`\n * prop must be supplied as the total height of all virtual rows so that the\n * scroll track reflects the full dataset length.\n *\n * @example\n * ```tsx\n * import { UITableBody } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableBody height={`${rowVirtualizer.getTotalSize()}px`}>\n * {virtualItems.map(vRow => (\n * <UITableRow key={vRow.index} … />\n * ))}\n * </UITableBody>\n * ```\n */\nexport const UITableBody = memo<TUITableBody>(({ height, className, children, ...props }) => {\n const { isFetching, isEmpty } = useUITableBodyContext();\n if (isEmpty || isFetching) return null;\n return (\n <tbody\n slot=\"table-body\"\n style={{ height }}\n className={cn(\n 'relative w-full',\n 'grid',\n\n '[&_tr]:absolute',\n '[&_tr]:flex',\n '[&_tr]:flex-none',\n '[&_tr]:w-full',\n '[&_tr]:cursor-pointer [&_tr]:focus:outline-none',\n '[&_tr]:border-b [&_tr]:border-b-border',\n\n '[&_td]:z-10',\n '[&_td]:transition-all',\n '[&_td]:duration-300',\n '[&_td]:flex',\n '[&_td]:flex-none',\n '[&_td]:overflow-hidden',\n '[&_td]:whitespace-nowrap',\n '[&_td]:px-4',\n '[&_td]:py-2.5',\n '[&_td]:align-middle',\n '[&_td]:border-border',\n\n '[&_td]:data-[selected=true]:bg-muted-muted!',\n '[&_td]:data-[selected=true]:hover:bg-muted-muted!',\n\n '[&_td>div]:inline-flex',\n '[&_td>div]:items-center',\n '[&_td>div]:w-full',\n\n '[&_td:not([data-pinned=false])]:z-20',\n '[&_td:not([data-pinned=false])]:sticky',\n '[&_td:not([data-pinned=false])]:bg-card',\n\n // '**:data-lastcell:border-r',\n // '**:data-firstcell:border-l',\n className\n )}\n {...props}\n >\n {children}\n </tbody>\n );\n});\nUITableBody.displayName = 'UITableBody';\n\n/**\n * Virtualised `<tr>` that renders a single data row by translating itself to\n * the correct vertical position via a CSS `transform`.\n *\n * Iterates the row's visible cells and delegates to `UITableCellActions`,\n * `UITableCellSelect`, or `UITableCell` based on the column id. Click\n * handling, pinning state, and the \"select all\" flag are sourced from\n * `UITableRowContext`.\n *\n * @example\n * ```tsx\n * import { UITableRow } from '@customafk/lunas-ui/features/tables';\n *\n * {virtualItems.map(vRow => {\n * const row = rows[vRow.index];\n * return (\n * <UITableRow\n * key={row.id}\n * row={row}\n * isSelected={row.getIsSelected()}\n * virtualRowIndex={vRow.index}\n * virtualRowStart={vRow.start}\n * />\n * );\n * })}\n * ```\n */\nexport const UITableRow = memo<TUITableRow>(({ row, isSelected, virtualRowIndex, virtualRowStart, children, ...props }) => {\n const { keyOfClickRow, isAllRowsSelected, columnPinningState, leftPinnedHeaders, rightPinnedHeaders, onClickRow } = useUITableRowContext();\n\n const pinnedLeftColumns = useMemo(() => columnPinningState.left ?? [], [columnPinningState]);\n const pinnedRightColumns = useMemo(() => columnPinningState.right ?? [], [columnPinningState]);\n const firstRightPinnedHeaderId = useMemo(() => rightPinnedHeaders?.[0]?.id, [rightPinnedHeaders]);\n const lastLeftPinnedHeaderId = useMemo(() => leftPinnedHeaders?.[leftPinnedHeaders.length - 1]?.id, [leftPinnedHeaders]);\n\n const handleClick = useCallback<React.MouseEventHandler<HTMLTableRowElement>>(\n e => {\n const value = keyOfClickRow ? row.original?.[keyOfClickRow] : undefined;\n onClickRow?.(virtualRowIndex, typeof value === 'string' || typeof value === 'number' ? value : undefined);\n e.preventDefault();\n e.stopPropagation();\n },\n [keyOfClickRow, onClickRow, row, virtualRowIndex]\n );\n return (\n <tr\n slot=\"table-row\"\n data-index={virtualRowIndex}\n style={{\n transform: `translateY(${virtualRowStart}px)`,\n }}\n className=\"group [&_td]:border-r [&_td]:border-r-border [&_td]:last:border-r-0\"\n onClick={handleClick}\n {...props}\n >\n {row.getVisibleCells().map((cell, index) => {\n const isPinnedLeft = pinnedLeftColumns.includes(cell.column.id);\n const isPinnedRight = pinnedRightColumns.includes(cell.column.id);\n const isPinned = isPinnedLeft ? 'left' : isPinnedRight ? 'right' : false;\n if (cell.column.id === 'actions') {\n return (\n <UITableCellActions\n key={`${cell.id}-${index}`}\n data-col={cell.column.id}\n data-cell={virtualRowIndex}\n data-selected={isSelected || undefined}\n virtualRowIndex={virtualRowIndex}\n column={cell.column}\n getContext={cell.getContext}\n />\n );\n }\n if (cell.column.id === 'select') {\n return (\n <UITableCellSelect\n key={`${cell.id}-${index}`}\n data-col={cell.column.id}\n data-cell={virtualRowIndex}\n data-selected={isSelected || undefined}\n isPinned={isPinned}\n isSelected={isAllRowsSelected || isSelected}\n onToggleRowSelected={cell.row.toggleSelected}\n />\n );\n }\n return (\n <UITableCell\n key={`${cell.id}-${index}`}\n data-col={cell.column.id}\n data-cell={virtualRowIndex}\n data-selected={isSelected || undefined}\n isPinned={isPinned}\n isFirstCell={cell.column.id === firstRightPinnedHeaderId}\n isLastCell={cell.column.id === lastLeftPinnedHeaderId}\n colId={cell.column.id}\n position={(cell.column.columnDef.meta as AnyEntity)?.position ?? 'start'}\n column={cell.column}\n getContext={cell.getContext}\n />\n );\n })}\n </tr>\n );\n});\nUITableRow.displayName = 'UITableRow';\n\n/**\n * Sticky `<td>` cell in the leftmost column that renders a per-row selection\n * checkbox.\n *\n * The cell stops click-event propagation so that selecting a row does not also\n * trigger the row's `onClickRow` handler.\n *\n * @example\n * ```tsx\n * import { UITableCellSelect } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableCellSelect\n * isPinned=\"left\"\n * isSelected={row.getIsSelected()}\n * onToggleRowSelected={row.toggleSelected}\n * />\n * ```\n */\nexport const UITableCellSelect = memo<TUITableCellSelect>(({ isPinned, isSelected = false, className, onToggleRowSelected, ...props }) => {\n const handleToggleRowSelected = useCallback(\n (value: boolean | 'indeterminate') => {\n onToggleRowSelected?.(!!value);\n },\n [onToggleRowSelected]\n );\n return (\n <td\n slot=\"table-body-cell\"\n data-pinned={true}\n style={{ left: 0, zIndex: PINNED_COLUMN_Z_INDEX, width: SELECT_WIDTH, maxWidth: SELECT_WIDTH }}\n className={cn('group-hover:bg-muted-bg-subtle!', isPinned ? 'sticky' : 'relative', className)}\n {...props}\n >\n <div\n data-slot=\"table-cell-inner\"\n className=\"flex! w-full! items-center justify-center bg-transparent text-center align-middle\"\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <Checkbox aria-label=\"Select Row\" checked={isSelected} onCheckedChange={handleToggleRowSelected} />\n </div>\n </td>\n );\n});\nUITableCellSelect.displayName = 'UITableCellSelect';\n\n/**\n * Sticky `<td>` cell pinned to the right edge of each row that renders the\n * column's custom `cell` renderer (typically a row-action menu).\n *\n * The cell is always sticky (`right: 0`, `z-index: 50`) and gains a hover\n * background via the `group-hover` Tailwind variant on the parent `<tr>`.\n *\n * @example\n * ```tsx\n * import { UITableCellActions } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableCellActions\n * virtualRowIndex={vRow.index}\n * column={cell.column}\n * getContext={cell.getContext}\n * />\n * ```\n */\nexport const UITableCellActions = memo<TUITableCellActions>(({ virtualRowIndex, column, getContext, className, ...props }) => {\n const render = useMemo(() => {\n return flexRender(column?.columnDef.cell, getContext());\n }, [column, getContext]);\n return (\n <td\n data-col=\"actions\"\n data-cell={virtualRowIndex}\n className=\"sticky border-r-0! inset-y-0 right-0 z-50 flex items-center pr-4 group-hover:bg-muted-bg-subtle!\"\n {...props}\n >\n {render}\n </td>\n );\n});\nUITableCellActions.displayName = 'UITableCellActions';\n\n/**\n * Standard `<td>` data cell with support for left/right sticky pinning,\n * CSS-variable-driven width, content-fit auto-sizing, and configurable\n * horizontal alignment (`start` | `center` | `end`).\n *\n * A `ResizeObserver` on the inner content div measures actual rendered content\n * width and calls `table.setColumnSizing` when the content overflows the\n * column's current size, but only when the column definition has\n * `meta.fitContent: true`.\n *\n * @example\n * ```tsx\n * import { UITableCell } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableCell\n * colId={cell.column.id}\n * isPinned=\"left\"\n * position=\"start\"\n * column={cell.column}\n * getContext={cell.getContext}\n * />\n * ```\n */\nexport const UITableCell = memo<TUITableCell>(\n ({ isPinned = false, isFirstCell = false, isLastCell = false, colId, position = 'start', column, getContext, ...props }) => {\n const { innerTableId, table } = useUITableInnerTableContext();\n const tableRef = useRef<Element>(document.querySelector(`table[id=\"${innerTableId}\"]`));\n const cellRef = useRef<HTMLDivElement>(null);\n\n const left = useMemo(() => {\n const axis = column?.getStart('left');\n return isPinned === 'left' && typeof axis === 'number' ? `${axis}px` : undefined;\n }, [isPinned, column]);\n\n const right = useMemo(() => {\n const axis = column?.getAfter('right');\n return isPinned === 'right' && typeof axis === 'number' ? `${axis}px` : undefined;\n }, [isPinned, column]);\n\n const width = useMemo(() => {\n return `calc(var(--col-${colId}-size) * 1px)`;\n }, [colId]);\n\n const minSize = useMemo(() => {\n return column?.columnDef.minSize ? `calc(var(--col-${colId}-minSize) * 1px)` : undefined;\n }, [colId, column]);\n\n const maxSize = useMemo(() => {\n return column?.columnDef.maxSize ? `calc(var(--col-${colId}-maxSize) * 1px)` : undefined;\n }, [colId, column]);\n\n const render = useMemo(() => {\n return flexRender(column?.columnDef.cell, getContext());\n }, [column, getContext]);\n\n useEffect(() => {\n if (!cellRef.current) return;\n\n // Đo kích thước thực tế của nội dung bên trong\n const width = cellRef.current.scrollWidth;\n const currentSize = column?.getSize();\n\n // Nếu cell này dài hơn size hiện tại của cột, cập nhật lại size cho column\n if (!!currentSize && width > currentSize) {\n if (tableRef.current instanceof HTMLTableElement && typeof colId === 'string' && !!(column?.columnDef.meta as AnyEntity)?.['fitContent']) {\n table.setColumnSizing(old => ({\n ...old,\n [colId]: width + 32,\n }));\n }\n }\n }, [colId, column, table]); // Chạy lại khi data trong cell thay đổi\n\n return (\n <td\n slot=\"table-body-cell\"\n data-pinned={isPinned}\n data-lastcell={isLastCell || undefined}\n data-firstcell={isFirstCell || undefined}\n style={{\n left,\n right,\n width: width,\n minWidth: minSize,\n maxWidth: maxSize,\n }}\n className={cn(\n 'group-hover:bg-muted-bg-subtle!',\n isPinned === 'left' && isLastCell && 'border-r border-r-border',\n isPinned === 'right' && isFirstCell && 'border-l border-l-border'\n )}\n {...props}\n >\n <div\n ref={cellRef}\n slot=\"table-body-cell-inner\"\n className={cn(\n 'overflow-x-hidden',\n position === 'start' && 'justify-start',\n position === 'center' && 'justify-center',\n position === 'end' && 'justify-end'\n )}\n >\n {render}\n </div>\n </td>\n );\n }\n);\nUITableCell.displayName = 'UITableCell';\n\n/**\n * `<tfoot>` element rendered below the table body, typically used for\n * summary rows or pagination controls.\n *\n * @example\n * ```tsx\n * import { UITableFooter } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableFooter>\n * <tr><td>Total: {totalRows}</td></tr>\n * </UITableFooter>\n * ```\n */\nexport const UITableFooter = memo<TUITableFooter>(({ className, children, ...props }) => {\n return (\n <tfoot\n slot=\"table-footer\"\n className={cn('flex w-full justify-center border-border-weak border-t py-2 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n >\n {children}\n </tfoot>\n );\n});\nUITableFooter.displayName = 'UITableFooter';\n\n/**\n * Virtualised `<tr>` appended after the last data row that renders a\n * \"Load More\" / \"Loading…\" / \"Error! Retry?\" button.\n *\n * Returns `null` when `fetchMoreData` is not provided, making it safe to\n * include unconditionally in the row list. A `ResizeObserver` on the inner\n * wrapper ensures the row always matches the current table width.\n *\n * @example\n * ```tsx\n * import { UITableLoadMore } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableLoadMore\n * virtualRowIndex={rows.length}\n * virtualRowStart={rowVirtualizer.getTotalSize()}\n * fetchMoreData={fetchNextPage}\n * />\n * ```\n */\nexport const UITableLoadMore = memo<TUITableLoadMore>(({ virtualRowIndex, virtualRowStart, fetchMoreData }) => {\n const { innerWrapperId } = useUITableInnerWrapperContext();\n\n const tableWrapperRef = useRef<Element | null>(document.querySelector(`div[id=\"${innerWrapperId}\"]`));\n const rowRef = useRef<HTMLTableRowElement>(null);\n\n const [fetchingState, setFetchingState] = useState<'idle' | 'fetching' | 'error'>('idle');\n\n const [width, setWidth] = useState<number>(0);\n\n const handleFetchMoreData = useCallback(async () => {\n try {\n setFetchingState('fetching');\n await fetchMoreData?.();\n setFetchingState('idle');\n } catch (error) {\n console.error('Error fetching more data:', error);\n setFetchingState('error');\n } finally {\n // setFetchingState('idle');\n }\n }, [fetchMoreData]);\n\n useEffect(() => {\n if (!tableWrapperRef.current) return;\n\n const observer = new ResizeObserver(entries => {\n // Access width from contentRect\n setWidth(entries[0].contentRect.width);\n });\n\n observer.observe(tableWrapperRef.current);\n return () => observer.disconnect(); // Cleanup on unmount\n }, []);\n\n if (!fetchMoreData) return null;\n\n return (\n <tr\n ref={rowRef}\n data-index={virtualRowIndex}\n style={{\n transform: `translateY(${virtualRowStart}px)`,\n width,\n }}\n className=\"sticky! left-0 h-10\"\n >\n <td className=\"absolute left-0 flex w-full items-center justify-center text-xs\">\n <button\n type=\"button\"\n disabled={fetchingState === 'fetching'}\n className={cn(\n 'flex cursor-pointer gap-x-0.5',\n fetchingState === 'fetching' && 'cursor-not-allowed',\n fetchingState === 'idle' && 'text-text-positive-weak hover:text-text-positive',\n fetchingState === 'error' && 'text-danger hover:text-danger-strong'\n )}\n onClick={handleFetchMoreData}\n >\n {fetchingState === 'idle' && <ChevronDown className=\"size-4\" />}\n {fetchingState === 'fetching' && <Spinner className=\"size-4 animate-spin\" />}\n {fetchingState === 'error' && <AlertTriangle className=\"size-4 text-danger\" />}\n {fetchingState === 'idle' && 'Load More'}\n {fetchingState === 'fetching' && 'Loading...'}\n {fetchingState === 'error' && 'Error! Retry?'}\n </button>\n </td>\n </tr>\n );\n});\nUITableLoadMore.displayName = 'UITableLoadMore';\n","'use client';\nimport { useMemo, useRef } from 'react';\n\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\nimport { ResizablePanel, ResizablePanelGroup } from '@/components/ui/resizable';\n\nimport { useUITableBodyContext, useUITableContext } from '../hooks/use-context';\nimport { UITableBody, UITableEmptyDisplay, UITableHead, UITableHeadRow, UITableInnerTable, UITableInnerWrapper, UITableLoadMore, UITableRow } from './common';\n\nexport const UITableContainer: React.FC<React.PropsWithChildren> = () => {\n const { table, isEmpty, isFetching, fetchMoreData } = useUITableContext();\n const { rowSelectionState } = useUITableBodyContext();\n\n const tableContainerRef = useRef<HTMLDivElement | null>(null);\n\n const { rows } = table.getRowModel();\n\n // Important: Keep the row virtualizer in the lowest component possible to avoid unnecessary re-renders.\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length + 1,\n estimateSize: () => 40, // estimated row height\n getScrollElement: () => tableContainerRef.current,\n //measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1 ? element => element?.getBoundingClientRect().height : undefined,\n overscan: 2, // Render additional rows beyond viewport for smoother scrolling\n });\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: rowVirtualizer getTotalSize\n const tableBodyHeight = useMemo(() => {\n const totalSize = rowVirtualizer.getTotalSize();\n const containerHeight = tableContainerRef.current?.clientHeight || 0;\n return totalSize < containerHeight ? `${containerHeight}px` : `${totalSize}px`;\n }, [rowVirtualizer.getTotalSize()]);\n\n return (\n <ResizablePanelGroup\n direction=\"horizontal\"\n style={{ direction: table.options.columnResizeDirection }}\n className=\"relative flex w-full max-w-full flex-1 gap-1 overflow-auto border-t border-t-border border-r border-r-border bg-slate-50 p-0 text-sm\"\n >\n <ResizablePanel className=\"relative\">\n <UITableInnerWrapper ref={tableContainerRef}>\n <UITableInnerTable>\n <UITableHead>\n {table.getHeaderGroups().map(headerGroup => (\n <UITableHeadRow key={headerGroup.id} headerGroup={headerGroup} />\n ))}\n </UITableHead>\n <UITableBody height={tableBodyHeight}>\n {rowVirtualizer.getVirtualItems().map(virtualRow => {\n const row = rows[virtualRow.index];\n const isSelected = Object.entries(rowSelectionState).some(([k, v]) => k === `${row?.id}` && v);\n if (!row) {\n return (\n <UITableLoadMore\n key={virtualRow.index}\n virtualRowIndex={virtualRow.index}\n virtualRowStart={virtualRow.start}\n fetchMoreData={fetchMoreData}\n />\n );\n }\n return (\n <UITableRow\n key={virtualRow.index}\n ref={rowVirtualizer.measureElement}\n row={row}\n isSelected={isSelected}\n virtualRowIndex={virtualRow.index}\n virtualRowStart={virtualRow.start}\n />\n );\n })}\n </UITableBody>\n </UITableInnerTable>\n <UITableEmptyDisplay isEmpty={isEmpty} isFetching={isFetching} />\n </UITableInnerWrapper>\n </ResizablePanel>\n </ResizablePanelGroup>\n );\n};\n","/**\n * @file filter.tsx\n * Collapsible side-panel that exposes column-visibility toggles and a future\n * filter builder, rendered as a resizable panel alongside the main table.\n */\nimport { Activity, useState } from 'react';\n\nimport { Columns4Icon, ListFilterIcon, ListFilterPlus } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Button } from '@/components/ui/button';\nimport { Checkbox } from '@/components/ui/checkbox';\nimport { ResizablePanel } from '@/components/ui/resizable';\nimport { Separator } from '@/components/ui/separator';\n\nimport { useUITableContext } from '../../hooks/use-context';\n\nconst ColumnVisibility: React.FC<{\n checked: boolean;\n title: string;\n onCheckedChange?: (checked: boolean) => void;\n}> = ({ checked, title, onCheckedChange }) => {\n return (\n <div className=\"flex h-fit items-center gap-2\">\n <Checkbox checked={checked} onCheckedChange={onCheckedChange} />\n <p className=\"text-sm\">{title}</p>\n </div>\n );\n};\n\n/**\n * Collapsible side-panel that lets users toggle column visibility and (in\n * future) add row filters without leaving the table view.\n *\n * The panel collapses to a narrow icon strip when no tab is active and expands\n * to at least 64 units when the \"Columns\" or \"Filters\" tab is selected. The\n * `select` and `actions` columns are excluded from the visibility list.\n *\n * @example\n * ```tsx\n * import { UITableFilter } from '@customafk/lunas-ui/features/tables';\n *\n * // Render inside a ResizablePanelGroup alongside UITable\n * <ResizablePanelGroup direction=\"horizontal\">\n * <ResizablePanel>\n * <UITable />\n * </ResizablePanel>\n * <ResizableHandle />\n * <UITableFilter />\n * </ResizablePanelGroup>\n * ```\n */\nexport const UITableFilter = () => {\n const { table } = useUITableContext();\n const [tab, setTab] = useState<'columns' | 'filters' | null>(null);\n\n return (\n <ResizablePanel defaultSize={25} className={cn('bg-card', tab === null ? 'max-w-8!' : 'min-w-64')}>\n <div className=\"relative z-20 flex size-full bg-muted-bg-subtle\">\n <div className=\"flex-1\">\n <Activity mode={tab === 'columns' ? 'visible' : 'hidden'}>\n <div className=\"flex size-full flex-col gap-2 p-4\">\n <p className=\"px-2 font-medium\">Columns Visibility</p>\n <Separator />\n <div className=\"flex flex-col gap-4 pt-4\">\n {table.getAllColumns().map(column => {\n if (['select', 'actions'].includes(column.id)) return null;\n return (\n <ColumnVisibility\n key={column.id}\n checked={column.getIsVisible()}\n title={String(column.columnDef.header)}\n onCheckedChange={value => column.toggleVisibility(!!value)}\n />\n );\n })}\n </div>\n </div>\n </Activity>\n <Activity mode={tab === 'filters' ? 'visible' : 'hidden'}>\n <div className=\"flex size-full flex-col p-2\">\n <Button variant=\"outline\" color=\"muted\">\n <ListFilterPlus />\n Add Filter\n </Button>\n </div>\n </Activity>\n </div>\n <div className=\"flex h-full flex-col border-border border-l bg-muted-bg-subtle text-sm\">\n <button\n className={cn('flex h-32 cursor-pointer flex-col items-center gap-y-2 p-2 py-4', tab === 'columns' && 'bg-card')}\n onClick={() => setTab(tab === 'columns' ? null : 'columns')}\n >\n <Columns4Icon size={18} />\n <span className=\"text-nowrap [writing-mode:vertical-lr]\">Columns</span>\n </button>\n <Separator />\n <button\n className={cn('flex h-32 cursor-pointer flex-col items-center gap-y-2 p-2 py-4', tab === 'filters' && 'bg-card')}\n onClick={() => setTab(tab === 'filters' ? null : 'filters')}\n >\n <ListFilterIcon size={18} />\n <span className=\"text-nowrap [writing-mode:vertical-lr]\">Filters</span>\n </button>\n <Separator />\n </div>\n </div>\n </ResizablePanel>\n );\n};\n","/**\n * @file provider.tsx\n * Context providers that wire TanStack Table state into the UITable component tree.\n *\n * Each sub-provider is a memoised wrapper around a single React context so that\n * only the subtree that consumes a particular slice of state re-renders when that\n * slice changes.\n */\nimport { memo, useCallback, useId, useMemo, useState } from 'react';\n\nimport type { ColumnDef, ColumnPinningState, ExpandedState, RowSelectionState } from '@tanstack/react-table';\nimport { getCoreRowModel, getExpandedRowModel, getGroupedRowModel, useReactTable } from '@tanstack/react-table';\n\nimport type { AnyEntity } from '@/types';\nimport {\n TableBodyContext,\n TableContext,\n TableHeadRowContext,\n TableInnerTableContext,\n TableInnerWrapperContext,\n TableRowContext,\n} from '../../hooks/use-context';\nimport type {\n RowData,\n TableProviderProps,\n TTableBodyContext,\n TTableContext,\n TTableHeadRowContext,\n TTableInnerTableContext,\n TTableInnerWrapperContext,\n TTableRowContext,\n TUITableColumn,\n} from '../../types';\n\n/**\n * Provides the inner-wrapper DOM element id to all descendants via\n * `TableInnerWrapperContext`, enabling virtual-scroll sentinels to locate the\n * scrollable container without prop-drilling.\n */\nconst UITableInnerWrapperProvider = memo<React.PropsWithChildren<TTableInnerWrapperContext>>(({ innerWrapperId, children }) => {\n const value = useMemo<TTableInnerWrapperContext>(() => ({ innerWrapperId }), [innerWrapperId]);\n return <TableInnerWrapperContext.Provider value={value}>{children}</TableInnerWrapperContext.Provider>;\n});\nUITableInnerWrapperProvider.displayName = 'UITableInnerWrapperProvider';\n\n/**\n * Provides the TanStack `table` instance, the inner `<table>` element id, and\n * the pre-computed `totalSize` (sum of all column widths) to descendants via\n * `TableInnerTableContext`.\n */\nconst UITableInnerTableProvider = memo<React.PropsWithChildren<TTableInnerTableContext>>(({ table, innerTableId, totalSize, children }) => {\n const value = useMemo<TTableInnerTableContext>(() => ({ table, innerTableId, totalSize }), [table, innerTableId, totalSize]);\n return <TableInnerTableContext.Provider value={value}>{children}</TableInnerTableContext.Provider>;\n});\nUITableInnerTableProvider.displayName = 'UITableInnerTableProvider';\n\n/**\n * Provides column-pinning state and the \"select all\" toggle to the header-row\n * layer via `TableHeadRowContext`, preventing unnecessary re-renders in the body.\n */\nconst UITableHeadRowProvider = memo<React.PropsWithChildren<TTableHeadRowContext>>(\n ({ isAllRowsSelected, columnPinningState, leftPinnedHeaders, rightPinnedHeaders, onToggleAllRowsSelected, children }) => {\n const value = useMemo<TTableHeadRowContext>(\n () => ({ isAllRowsSelected, columnPinningState, leftPinnedHeaders, rightPinnedHeaders, onToggleAllRowsSelected }),\n [isAllRowsSelected, columnPinningState, leftPinnedHeaders, rightPinnedHeaders, onToggleAllRowsSelected]\n );\n return <TableHeadRowContext.Provider value={value}>{children}</TableHeadRowContext.Provider>;\n }\n);\nUITableHeadRowProvider.displayName = 'UITableHeadRowProvider';\n\n/**\n * Provides loading/empty state and the current row-selection map to the table\n * body layer via `TableBodyContext`.\n */\nconst UITableBodyProvider = memo<React.PropsWithChildren<TTableBodyContext>>(({ isFetching, isEmpty, rowSelectionState, children }) => {\n const value = useMemo<TTableBodyContext>(() => ({ isFetching, isEmpty, rowSelectionState }), [isFetching, isEmpty, rowSelectionState]);\n return <TableBodyContext.Provider value={value}>{children}</TableBodyContext.Provider>;\n});\nUITableBodyProvider.displayName = 'UITableBodyProvider';\n\n/**\n * Provides per-row interaction state — click handler, pinning, and the\n * \"select all\" flag — to individual row renderers via `TableRowContext`.\n */\nconst UITableRowProvider = memo<React.PropsWithChildren<TTableRowContext<AnyEntity, AnyEntity>>>(\n ({ keyOfClickRow, isAllRowsSelected, columnPinningState, leftPinnedHeaders, rightPinnedHeaders, onClickRow, children }) => {\n const value = useMemo<TTableRowContext<AnyEntity, AnyEntity>>(\n () => ({\n keyOfClickRow,\n isAllRowsSelected,\n columnPinningState,\n leftPinnedHeaders,\n rightPinnedHeaders,\n onClickRow,\n }),\n [keyOfClickRow, isAllRowsSelected, columnPinningState, leftPinnedHeaders, rightPinnedHeaders, onClickRow]\n );\n return <TableRowContext.Provider value={value}>{children}</TableRowContext.Provider>;\n }\n);\nUITableRowProvider.displayName = 'UITableRowProvider';\n\n/**\n * Root context provider for the UITable component family.\n *\n * Instantiates a TanStack Table instance with virtualisation-friendly settings\n * (column pinning, row selection, row grouping, row expansion) and propagates\n * all derived state through a nested set of memoised context providers so that\n * each layer only re-renders when its own slice of state changes.\n *\n * @example\n * ```tsx\n * import { UITableProvider } from '@customafk/lunas-ui/features/tables';\n *\n * const columns = [\n * { accessorKey: 'name', header: 'Name' },\n * { accessorKey: 'email', header: 'Email' },\n * ];\n *\n * function MyPage() {\n * return (\n * <UITableProvider\n * title=\"Users\"\n * data={users}\n * columns={columns}\n * isFetching={isLoading}\n * onClickRow={(index, id) => console.log(index, id)}\n * >\n * <UITable />\n * </UITableProvider>\n * );\n * }\n * ```\n */\nexport const UITableProvider = <\n TData extends RowData<TData> = RowData<AnyEntity>,\n TKey extends keyof TData = keyof TData,\n TColumns extends ReadonlyArray<TUITableColumn<TData>> = TUITableColumn<TData>[],\n>({\n title,\n\n isFetching = false,\n isRefetching = false,\n\n data,\n columns,\n totalRows,\n\n leftPinnedColumns = [],\n rightPinnedColumns = [],\n\n keyOfClickRow,\n onClickRow,\n onRowSelection,\n onColumnPinning,\n\n fetchMoreData,\n children,\n}: React.PropsWithChildren<TableProviderProps<TData, TKey, TColumns>>) => {\n const innerWrapperId = useId();\n const innerTableId = useId();\n\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [columnPinning, setColumnPinning] = useState<ColumnPinningState>({\n right: rightPinnedColumns as unknown as string[],\n left: ['select', ...leftPinnedColumns] as unknown as string[],\n });\n const [expanded, setExpanded] = useState<ExpandedState>({});\n\n const handleRowSelectionChange = useCallback<React.Dispatch<React.SetStateAction<RowSelectionState>>>(\n newRowSelection => {\n setRowSelection(newRowSelection);\n onRowSelection?.(newRowSelection instanceof Function ? newRowSelection(rowSelection) : newRowSelection);\n return newRowSelection;\n },\n [rowSelection, onRowSelection]\n );\n\n const handleColumnPinningChange = useCallback<React.Dispatch<React.SetStateAction<ColumnPinningState>>>(\n newColumnPinning => {\n setColumnPinning(newColumnPinning);\n onColumnPinning?.(newColumnPinning instanceof Function ? newColumnPinning(columnPinning) : newColumnPinning);\n },\n [columnPinning, onColumnPinning]\n );\n\n const table = useReactTable<TData>({\n data: data,\n columns: columns as unknown as ColumnDef<AnyEntity, unknown>[],\n state: {\n rowSelection,\n columnPinning,\n expanded,\n },\n defaultColumn: {\n enableResizing: false,\n size: undefined,\n minSize: undefined,\n maxSize: undefined,\n },\n columnResizeMode: 'onChange',\n columnResizeDirection: 'ltr',\n\n enableColumnPinning: true,\n enableRowSelection: true,\n enableColumnResizing: true,\n enableMultiRowSelection: true,\n\n autoResetAll: false,\n autoResetExpanded: false,\n autoResetPageIndex: false,\n\n getSubRows: row => row.subRows,\n getCoreRowModel: getCoreRowModel(),\n getGroupedRowModel: getGroupedRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n\n onRowSelectionChange: handleRowSelectionChange,\n onColumnPinningChange: handleColumnPinningChange,\n onExpandedChange: setExpanded,\n });\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: rows\n const rows = useMemo(() => {\n const { rows } = table.getRowModel();\n return rows;\n }, [table.getRowModel().rows, table.getState().columnPinning]);\n\n const isEmpty = useMemo<boolean>(() => {\n return !isFetching && rows.length === 0;\n }, [rows, isFetching]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: table get state\n const value = useMemo<TTableContext<TData>>(\n () => ({\n title,\n table,\n\n isEmpty,\n isFetching,\n isRefetching,\n\n totalRows,\n\n fetchMoreData,\n }),\n [\n title,\n table,\n\n isEmpty,\n isRefetching,\n isFetching,\n\n totalRows,\n\n fetchMoreData,\n table.getState().columnPinning,\n table.getState().expanded,\n ]\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: table get state\n const tableState = useMemo(() => {\n return table.getState();\n }, [table.getState()]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: table get state\n const isAllRowsSelected = useMemo(() => {\n return table.getIsAllRowsSelected();\n }, [table.getIsAllRowsSelected()]);\n\n const rowSelectionState = useMemo(() => {\n return tableState.rowSelection;\n }, [tableState.rowSelection]);\n\n const columnPinningState = useMemo(() => {\n return tableState.columnPinning;\n }, [tableState.columnPinning]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: table get state\n const leftPinnedHeaders = useMemo(() => {\n return table.getLeftHeaderGroups()[0]?.headers || [];\n }, [table.getState().columnPinning]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: table get state\n const rightPinnedHeaders = useMemo(() => {\n return table.getRightHeaderGroups()[0]?.headers || [];\n }, [table.getState().columnPinning]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: table get total size\n const totalSize = useMemo(() => {\n return table.getTotalSize();\n }, [table.getTotalSize()]);\n\n return (\n <TableContext.Provider value={value as TTableContext<TData>}>\n <UITableInnerWrapperProvider innerWrapperId={innerWrapperId}>\n <UITableInnerTableProvider table={table} innerTableId={innerTableId} totalSize={totalSize}>\n <UITableHeadRowProvider\n isAllRowsSelected={isAllRowsSelected}\n columnPinningState={columnPinningState}\n leftPinnedHeaders={leftPinnedHeaders}\n rightPinnedHeaders={rightPinnedHeaders}\n onToggleAllRowsSelected={table.toggleAllRowsSelected}\n >\n <UITableBodyProvider isFetching={isFetching} isEmpty={isEmpty} rowSelectionState={rowSelectionState}>\n <UITableRowProvider\n keyOfClickRow={keyOfClickRow}\n isAllRowsSelected={isAllRowsSelected}\n columnPinningState={columnPinningState}\n leftPinnedHeaders={leftPinnedHeaders}\n rightPinnedHeaders={rightPinnedHeaders}\n onClickRow={onClickRow}\n >\n {children}\n </UITableRowProvider>\n </UITableBodyProvider>\n </UITableHeadRowProvider>\n </UITableInnerTableProvider>\n </UITableInnerWrapperProvider>\n </TableContext.Provider>\n );\n};\n","/**\n * @file tooltip.tsx\n * Toolbar components rendered above the table: a debounced search input,\n * an action button group (create / refresh / download), and the outer\n * toolbar shell that displays the table title.\n */\nimport { ArrowRightIcon, CirclePlus, DownloadIcon, RefreshCwIcon, SearchIcon } from 'lucide-react';\n\nimport { useDebounceCallback } from '@customafk/react-toolkit/hooks/useDebounceCallback';\n\nimport { Input } from '@/components/ui/input';\n\nimport { useUITableContext } from '../../hooks/use-context';\n\n/**\n * Debounced search input rendered inside the table toolbar.\n *\n * Fires `onSearch` 500 ms after the user stops typing and delegates all other\n * native input events via the spread `props`.\n *\n * @example\n * ```tsx\n * import { UITableTooltipFilter } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableTooltipFilter\n * placeholder=\"Search users…\"\n * onSearch={value => setQuery(value)}\n * />\n * ```\n */\nexport const UITableTooltipFilter: React.FC<\n Omit<React.ComponentProps<typeof Input>, 'className'> & {\n onSearch?: (value: string) => void;\n }\n> = ({ onSearch, onChange, ...props }) => {\n const debouncedSearch = useDebounceCallback((value: string) => {\n onSearch?.(value);\n }, 500);\n return (\n <div className=\"relative w-full max-w-80 flex-1\">\n <Input\n {...props}\n size=\"lg\"\n type=\"search\"\n placeholder=\"Search records...\"\n className=\"flex-1 ps-9 pe-9\"\n onChange={e => {\n onChange?.(e);\n debouncedSearch(e.target.value ?? '');\n }}\n />\n <div className=\"pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center ps-3 text-text-positive-weak peer-disabled:opacity-50\">\n <SearchIcon size={16} />\n </div>\n <button\n className=\"absolute inset-y-0 end-0 flex h-full w-9 items-center justify-center rounded-e-md text-text-positive-weak outline-none transition-[color,box-shadow] hover:text-text-positive focus:z-10 focus-visible:border focus-visible:border-primary-strong focus-visible:ring-[3px] focus-visible:ring-primary-weak disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label=\"Submit search\"\n type=\"submit\"\n >\n <ArrowRightIcon size={16} aria-hidden=\"true\" />\n </button>\n </div>\n );\n};\n\nconst ActionButton: React.FC<React.PropsWithChildren<React.ComponentProps<'button'>>> = ({ children, disabled, onClick }) => {\n return (\n <button\n type=\"button\"\n disabled={disabled}\n className=\"flex cursor-pointer items-center gap-x-1 rounded-sm border border-border bg-background p-2.5 text-sm text-text-positive-weak outline-none transition-all hover:shadow-card focus:border-border-emphasis focus:bg-muted-muted active:border-border-emphasis active:bg-muted-muted active:text-text-positive disabled:pointer-events-none disabled:cursor-default disabled:opacity-60 [&_svg]:size-3.5\"\n onClick={onClick}\n >\n {children}\n </button>\n );\n};\n\n/**\n * Grouped action buttons (create, refresh, download) displayed in the table\n * toolbar.\n *\n * Each button is disabled automatically when the corresponding handler prop is\n * omitted, so only the actions relevant to a given table need to be provided.\n *\n * @example\n * ```tsx\n * import { UITableTooltipActions } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableTooltipActions\n * onCreate={() => setOpenCreate(true)}\n * onRefresh={() => refetch()}\n * />\n * ```\n */\nexport const UITableTooltipActions: React.FC<{\n onCreate?: () => void;\n onRefresh?: () => void;\n onDownload?: () => void;\n}> = ({ onCreate, onDownload, onRefresh }) => {\n return (\n <div className=\"flex [&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none\">\n <ActionButton\n disabled={!onCreate}\n onClick={e => {\n onCreate?.();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n <CirclePlus />\n </ActionButton>\n <ActionButton\n disabled={!onRefresh}\n onClick={e => {\n onRefresh?.();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n <RefreshCwIcon />\n </ActionButton>\n <ActionButton\n disabled={!onDownload}\n onClick={e => {\n onDownload?.();\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n <DownloadIcon />\n </ActionButton>\n </div>\n );\n};\n\n/**\n * Outer toolbar shell for the UITable component.\n *\n * Reads the table `title` from `UITableContext` and renders it as a heading\n * above the `children` slot, which typically contains a\n * `UITableTooltipFilter` and/or `UITableTooltipActions`.\n *\n * @example\n * ```tsx\n * import {\n * UITableTooltip,\n * UITableTooltipFilter,\n * UITableTooltipActions,\n * } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableTooltip>\n * <UITableTooltipFilter onSearch={setQuery} />\n * <UITableTooltipActions onCreate={handleCreate} onRefresh={refetch} />\n * </UITableTooltip>\n * ```\n */\nexport const UITableTooltip: React.FC<React.PropsWithChildren> = ({ children }) => {\n const { title } = useUITableContext();\n return (\n <div data-slot=\"table-tooltip\" className=\"relative m-0 flex w-full flex-0 flex-col flex-wrap items-start space-y-2 p-0 px-2 text-sm\">\n <h3 className=\"font-semibold text-base text-text-positive\">{title}</h3>\n <div className=\"flex w-full flex-1 justify-between gap-x-2\">{children}</div>\n </div>\n );\n};\nUITableTooltip.displayName = 'TableTooltip';\n"],"mappings":"kzBAWA,MAAaA,OAET,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,gDACb,EAAA,EAAA,KAACC,EAAAA,UAAAA,CAAU,KAAM,GAAA,CAAM,EACvB,EAAA,EAAA,KAACA,EAAAA,UAAAA,CAAU,KAAM,GAAA,CAAM,CAAA,EACnB,CCEGC,GAOP,CAAE,QAAO,UAAS,cACjB,EACD,GAEA,EAAA,EAAA,MAAC,MAAA,CACC,UAAU,6GACV,QAAS,GAAK,CACZ,KAAW,CACX,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,YAGnB,GACD,EAAA,EAAA,KAAC,SAAA,CACC,UAAU,yEACV,QAAS,GAAK,CACZ,KAAY,CACZ,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,YAGpB,EAAA,EAAA,KAACC,EAAAA,MAAAA,CAAM,KAAM,GAAA,CAAM,EACZ,CAAA,EACL,EAIR,EAAA,EAAA,KAAC,SAAA,CACC,UAAU,yFACV,QAAS,GAAK,CACZ,KAAW,CACX,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,WAGnB,GACM,EAnCQ,EAAA,EAAA,KAAC,EAAA,EAAA,CAAe,CCZxBC,GAGP,CAAE,WACF,GAAU,MAAoC,EAAA,EAAA,KAAC,EAAA,EAAA,CAAe,CAC9D,IAAU,IAEV,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,+BACb,EAAA,EAAA,KAACC,EAAAA,MAAAA,EAAAA,CAAQ,EACL,EAIR,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,gCACb,EAAA,EAAA,KAACC,EAAAA,UAAAA,EAAAA,CAAY,EACT,CCPGC,IAAuC,CAAE,UACzC,GAAiC,MAAa,EAAA,EAAA,KAAC,EAAA,EAAA,CAAe,EAEvE,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,QAAA,aACd,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAM,UAAU,kBACf,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAkB,OAAM,OAAO,SAAS,UAAU,0BAA2B,EACxE,EACO,EACjB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,UAAU,yBACxB,EAAA,EAAA,KAACD,EAAAA,EAAAA,CAAkB,OAAM,OAAO,OAAO,SAAA,GAAS,UAAU,0CAA2C,EACtF,CAAA,CAAA,CACT,CAAA,CACM,CCrBTE,GAGP,CAAE,aACF,GAAqC,MAChC,EAAA,EAAA,KAAC,EAAA,EAAA,CAAe,EAGvB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAU,QAAQ,KAAK,UAAU,sDAC/B,GACS,CAAA,CACG,EACjB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,MAAM,QAAQ,UAAU,yCACtC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,mCACb,EAAA,EAAA,KAACD,EAAAA,EAAAA,CAAU,QAAQ,KAAK,UAAU,4EAC/B,GACS,EACZ,EAAA,EAAA,MAAC,IAAA,CAAE,UAAU,4BAAmB,EAAQ,UAAU,CAAC,OAAO,SAAA,EAAU,CAAA,EAChE,EACS,CAAA,CAAA,CACT,CClBDE,GASP,CAAE,QAAQ,EAAE,KAEd,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAoB,QAAA,aACnB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAO,KAAK,KAAK,QAAQ,QAAQ,MAAM,YAAY,UAAU,gCAC5D,EAAA,EAAA,KAACC,EAAAA,iBAAAA,EAAAA,CAAmB,EACb,EACW,EACtB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,SACE,EAAM,IAAI,IACT,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAEC,UAAU,OACV,SAAU,GAAK,CACb,EAAK,QAAQ,EAAK,GAAG,CACrB,EAAE,iBAAiB,WAGpB,EAAK,OAPD,EAAK,GAQO,CACnB,CAAA,CACgB,CAAA,CACA,CAAA,CAAA,CACT,CC/BNC,GAAkD,CAAE,UAC1D,GAEH,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAU,QAAQ,KAAK,UAAU,mEAC/B,GACS,CAAA,CACG,EACjB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,MAAM,QAAQ,UAAU,yCACtC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,mCACb,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,oDAA4C,GAAS,EAClE,EAAA,EAAA,MAAC,IAAA,CAAE,UAAU,4BAAmB,EAAK,OAAO,SAAA,EAAU,CAAA,EAClD,EACS,CAAA,CAAA,CACT,EAdM,EAAA,EAAA,KAAC,EAAA,EAAA,CAAe,CCXvBC,GAKP,CAAE,OAAM,YAEV,EAAA,EAAA,MAAC,IAAA,CAAQ,OAAM,OAAO,SAAS,UAAU,yEAAyE,IAAI,iCACpH,EAAA,EAAA,KAAC,OAAA,CAAA,SAAM,GAAS,EAAA,CAAY,EAC5B,EAAA,EAAA,KAACC,EAAAA,iBAAAA,CAAiB,KAAM,GAAA,CAAM,CAAA,EAC5B,CCTKC,GAKR,CAAE,YAEH,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,QAAA,aACd,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,sEAA8D,EAAM,QAAQ,wBAAyB,aAAa,EAAK,EACrH,EACjB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,MAAM,kBACpB,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,wBAAgB,EAAM,MAAM,EAAE,CAAC,QAAQ,wBAAyB,wBAAwB,EAAK,EAC3F,CAAA,CAAA,CACT,CCPDC,GAKP,CAAE,QAAO,cAUX,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAO,KAAK,SAAS,QAAQ,QAAQ,MAAM,SAAS,KAAK,OAAO,SAAA,EAAA,EAAA,aAVrE,KAAM,IAAK,CACT,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,CACnB,MAAM,KAAW,EAEnB,CAAC,EAAQ,CACV,WAKO,EAAA,EAAA,KAACC,EAAAA,WAAAA,EAAAA,CAAa,EACP,CAAA,CACM,EACjB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,KAAC,IAAA,CAAA,SAAG,GAAS,8BAAA,CAAkC,CAAA,CAChC,CAAA,CAAA,CACT,CC5BR,GAAiB,EAAa,EAAwB,IAA8C,CACxG,IAAM,EAAa,IAAM,EAEzB,OAAQ,EAAR,CACE,IAAK,QACH,OAAO,KAAK,MAAM,EAAM,EAAW,CAAG,EACxC,IAAK,OACH,OAAO,KAAK,KAAK,EAAM,EAAW,CAAG,EACvC,QACE,OAAO,KAAK,MAAM,EAAM,EAAW,CAAG,IAoC/B,GAAA,EAAA,EAAA,OACV,CACC,mBAAmB,IACnB,iBAAiB,IACjB,OAAQ,EACR,OAAQ,EACR,YACA,eAAe,QACf,oBAAoB,GACpB,OAAO,KACP,QAAQ,KACG,CAEX,IAAM,GAAA,EAAA,EAAA,aAAwD,CAC5D,IAAMC,EAAoC,EAAE,CAS5C,OAPI,OAAO,GAAc,UAAY,GAAa,GAAK,IACrD,EAAQ,sBAAwB,GAGhC,EAAQ,sBAAwB,EAG3B,GACN,CAAC,EAAW,EAAkB,CAAC,CAE5B,GAAA,EAAA,EAAA,aACH,GAAwB,CACvB,IAAI,EAAe,EAOnB,OAJI,OAAO,GAAc,UAAY,GAAa,IAChD,EAAe,EAAc,EAAK,EAAW,EAAa,EAGrD,EAAa,eAAe,QAAS,EAAc,EAE5D,CAAC,EAAc,EAAe,EAAU,CACzC,CAGK,GAAA,EAAA,EAAA,aAAuC,CAE3C,GAAI,OAAO,GAAU,SAInB,OAHI,OAAO,MAAM,EAAM,EAAI,CAAC,OAAO,SAAS,EAAM,CACzC,MAEF,EAAa,EAAM,CAI5B,GAAI,OAAO,GAAU,SAAU,CAC7B,IAAM,EAAe,EAAM,MAAM,CAGjC,GAAI,CAAC,EACH,MAAO,MAIT,IAAM,EAAW,OAAO,EAAa,CAOrC,OALI,OAAO,MAAM,EAAS,EAAI,CAAC,OAAO,SAAS,EAAS,CAE/C,MAGF,EAAa,EAAS,CAG/B,MAAO,OACN,CAAC,EAAO,EAAa,CAAC,CAGnB,GAAA,EAAA,EAAA,aAEA,IAAqB,KAAO,IAAmB,IAC1C,EAEF,EAAe,QAAQ,KAAM,EAAe,CAAC,QAAQ,MAAO,EAAiB,CACnF,CAAC,EAAgB,EAAkB,EAAe,CAAC,CAMtD,OAJI,IAAwB,KAAO,IAAwB,OAAS,CAAC,GAC5D,EAAA,EAAA,KAAC,EAAA,EAAA,CAAe,EAIvB,EAAA,EAAA,MAACC,EAAAA,EAAAA,CACC,QAAQ,OACR,WAAA,EAAA,EAAA,IACE,sDACA,IAAS,MAAQ,UACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,YACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,UAClB,WAEA,GACD,EAAA,EAAA,KAAC,IAAA,CAAA,SAAG,EAAA,CAAwB,CAC3B,IACI,EAGZ,CACD,EAAwB,YAAc,0BCpItC,MAAaC,GAA2C,CAAE,OAAM,WAAU,YAEtE,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAK,KAAM,GAAO,IAAI,KAAK,QAAQ,iBACjC,CAAC,IACA,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAO,UAAU,gCAChB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,UAAU,0BACxB,EAAA,EAAA,KAACC,EAAAA,cAAAA,CAAc,KAAM,GAAI,UAAU,sBAAuB,EAC3C,EACV,CAEV,IACC,EAAA,EAAA,KAACF,EAAAA,EAAAA,CAAO,UAAU,gCAChB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,MAAO,CAAE,gBAAiBE,EAAAA,eAAe,IAAI,EAAK,CAAE,WAClE,EAAA,EAAA,KAACD,EAAAA,cAAAA,CAAc,KAAM,GAAI,UAAU,cAAe,EACnC,EACV,EAEX,EAAA,EAAA,MAACH,EAAAA,EAAAA,CAAK,SAAA,GAAS,QAAQ,OAAO,IAAI,OAAO,MAAM,mBAC7C,EAAA,EAAA,KAACK,EAAAA,EAAAA,CAAU,UAAU,uDAA+C,GAAY,gBAA2B,EAC3G,EAAA,EAAA,KAACA,EAAAA,EAAAA,CAAU,QAAQ,KAAK,UAAU,iDAC/B,GACS,CAAA,EACP,GACF,CCxDE,GAAe,GACf,GAAe,GACf,GAAuB,GACvB,GAAwB,GCExB,IAAA,EAAA,EAAA,eAA2E,KAAK,CAEhF,OAAsC,CACjD,IAAM,GAAA,EAAA,EAAA,KAAU,GAAyB,CACzC,GAAI,CAAC,EACH,MAAU,MAAM,8EAA8E,CAEhG,OAAO,GAGI,IAAA,EAAA,EAAA,eAAuE,KAAK,CAE5E,OAAoC,CAC/C,IAAM,GAAA,EAAA,EAAA,KAAU,GAAuB,CACvC,GAAI,CAAC,EACH,MAAU,MAAM,0EAA0E,CAE5F,OAAO,GAGI,IAAA,EAAA,EAAA,eAAiE,KAAK,CAEtE,OAAiC,CAC5C,IAAM,GAAA,EAAA,EAAA,KAAU,GAAoB,CACpC,GAAI,CAAC,EACH,MAAU,MAAM,wEAAwE,CAE1F,OAAO,GAGI,IAAA,EAAA,EAAA,eAA2D,KAAK,CAEhE,OAA8B,CACzC,IAAM,GAAA,EAAA,EAAA,KAAU,GAAiB,CACjC,GAAI,CAAC,EACH,MAAU,MAAM,8DAA8D,CAEhF,OAAO,GAGI,IAAA,EAAA,EAAA,eAA+E,KAAK,CAEpF,OAA6B,CACxC,IAAM,GAAA,EAAA,EAAA,KAAU,GAAgB,CAChC,GAAI,CAAC,EACH,MAAU,MAAM,4DAA4D,CAE9E,OAAO,GAGI,GAAA,EAAA,EAAA,eAA8D,KAAK,CAEnE,MAA0B,CACrC,IAAM,GAAA,EAAA,EAAA,KAAc,EAAa,CACjC,GAAI,CAAC,EACH,MAAU,MAAM,sDAAsD,CAExE,OAAO,GCaI,GAAA,EAAA,EAAA,OAAsD,CAAE,WAAU,YAAW,aAAY,UAAS,eAAgB,CAC7H,IAAM,GAAA,EAAA,EAAA,iBAAkC,CACtC,IAAY,OAAO,EAClB,CAAC,EAAU,CAAC,CAET,GAAA,EAAA,EAAA,iBAAmC,CACvC,IAAa,QAAQ,EACpB,CAAC,EAAW,CAAC,CAEV,GAAA,EAAA,EAAA,iBAAgC,CACpC,IAAU,GAAM,EACf,CAAC,EAAQ,CAAC,CAEb,OACE,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAAA,SAAAA,EACC,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAoB,QAAA,aACnB,EAAA,EAAA,KAAC,SAAA,CACC,WAAA,EAAA,EAAA,IACE,gDACA,6CACA,0BACA,iBACA,0BACA,gDACA,EACD,WAED,EAAA,EAAA,KAACC,EAAAA,qBAAAA,EAAAA,CAAuB,EACjB,EACW,EACtB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAoB,MAAM,MAAM,UAAU,qBACzC,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAkB,UAAU,8FAC3B,EAAA,EAAA,KAACC,EAAAA,SAAAA,CAAS,KAAM,EAAW,UAAY,mBACrC,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAiB,QAAS,YACxB,CAAC,CAAC,GAAY,SACf,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,KAACC,EAAAA,WAAAA,CAAW,UAAU,SAAA,CAAW,CAAA,CACZ,CAAA,EACN,EACV,EACX,EAAA,EAAA,MAACH,EAAAA,SAAAA,CAAS,KAAO,EAAuB,SAAZ,qBAC1B,EAAA,EAAA,MAACC,EAAAA,EAAAA,CAAiB,QAAS,YACxB,EAAW,QAAU,eACtB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,KAACE,EAAAA,aAAAA,CAAa,UAAU,SAAA,CAAW,CAAA,CACd,CAAA,EACN,EACnB,EAAA,EAAA,MAACH,EAAAA,EAAAA,CAAiB,QAAS,YACxB,EAAW,QAAU,gBACtB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAAA,UACC,EAAA,EAAA,KAACG,EAAAA,cAAAA,CAAc,UAAU,SAAA,CAAW,CAAA,CACf,CAAA,EACN,CAAA,EACV,CAAA,EACO,EACA,CAAA,CAAA,CACT,EAEjB,CACF,EAAsB,YAAc,wBAoBpC,MAAa,GAAA,EAAA,EAAA,OAAsD,CAAE,WAAU,oBAAmB,QAAO,0BAAyB,GAAG,KAAY,CAC/I,IAAM,GAAA,EAAA,EAAA,aACH,GAAqC,CACpC,IAA0B,CAAC,CAAC,EAAM,EAEpC,CAAC,EAAwB,CAC1B,CACD,OACE,EAAA,EAAA,KAAC,KAAA,CACC,KAAK,oBACL,cAAa,GACb,MAAO,CAAE,KAAM,EAAG,OAAQ,GAAsB,MAAO,GAAc,SAAU,GAAc,CAC7F,WAAA,EAAA,EAAA,IAAc,EAAW,SAAW,WAAW,CAC/C,GAAI,YAEJ,EAAA,EAAA,KAAC,MAAA,CACC,UAAU,oDACV,QAAS,GAAK,CACZ,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,YAGrB,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAS,aAAW,kBAAkB,QAAS,EAAmB,gBAAiB,GAA+B,EAC/G,EACH,EAEP,CACF,EAAsB,YAAc,wBAgBpC,MAAa,GAAA,EAAA,EAAA,OAAkD,CAAE,UAAS,gBACpE,CAAC,GAAW,CAAC,EAAmB,MAElC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,8HACZ,IACC,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,8CACb,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAQ,UAAU,UAAA,CAAY,EAC/B,EAAA,EAAA,KAAC,IAAA,CAAA,SAAE,kBAAA,CAAmB,CAAA,EAClB,CAEP,GAAW,CAAC,IACX,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,8CACb,EAAA,EAAA,KAACC,EAAAA,QAAAA,CAAQ,YAAa,EAAG,KAAM,IAAM,EACrC,EAAA,EAAA,KAAC,IAAA,CAAA,SAAE,oBAAA,CAAqB,CAAA,EACpB,CAAA,EAEJ,CAER,CACF,EAAoB,YAAc,sBAiBlC,MAAa,GAAA,EAAA,EAAA,OAAwC,CAAE,YAAW,WAAU,GAAG,MAE3E,EAAA,EAAA,KAAC,MAAA,CAAI,KAAK,gBAAgB,WAAA,EAAA,EAAA,IAAc,mFAAoF,EAAU,CAAE,GAAI,EACzI,YACG,CAER,CACF,EAAe,YAAc,iBAmB7B,MAAa,GAAA,EAAA,EAAA,OAAkD,CAAE,WAAU,GAAG,KAAY,CACxF,GAAM,CAAE,kBAAmB,IAA+B,CAC1D,OACE,EAAA,EAAA,KAAC,MAAA,CACC,GAAI,EACJ,KAAK,sBACL,UAAU,6FACV,GAAI,EAEH,YACG,EAER,CACF,EAAoB,YAAc,sBAqBlC,MAAa,GAAA,EAAA,EAAA,OAA8C,CAAE,WAAU,GAAG,KAAY,CACpF,GAAM,CAAE,QAAO,eAAc,aAAc,IAA6B,CAClE,GAAA,EAAA,EAAA,QAAoC,KAAK,CAoF/C,OA3EA,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,EAAS,QAAS,OAEvB,IAAM,EAAU,EAAM,gBAAgB,CAEhC,EAAW,IAAI,eAAe,GAAW,CAC7C,0BAA4B,CAC1B,IAAM,EAAe,EAAQ,GAAG,OAChC,GAAI,aAAwB,iBAAkB,CAC5C,IAAM,EAAa,EAAQ,GAC3B,GAAI,CAAC,EAAY,OACjB,IAAM,EAAwB,EAAW,YAAY,MAE/C,CAAE,KAAM,EAAoB,EAAE,CAAE,MAAO,EAAqB,EAAE,EAAK,EAAM,UAAU,CAAC,cAGtFC,EAAsB,EACtBC,EAA+B,EAC/BC,EAAyB,EACvB,EAAc,EAAQ,IAAI,GAAU,CACxC,GAAM,CAAE,MAAO,EACT,EAAY,IAAO,UAAY,IAAO,UACtC,EAAW,EAAkB,SAAS,EAAG,EAAI,EAAmB,SAAS,EAAG,CAC5E,EAAO,EAAO,SAAS,CACvB,EAAU,EAAO,OAAO,UAAU,QAsBxC,OAnBI,GAEF,GAAe,GACR,CAAE,KAAI,OAAQ,GAAO,SAAO,EAGjC,GACF,GAAe,EACR,CAAE,KAAI,OAAQ,GAAO,MAAO,EAAM,EAIvC,EAAO,OAAO,UAAU,MAAQ,IAAS,KAC3C,GAAkB,EACX,CAAE,KAAI,OAAQ,GAAO,MAAO,EAAM,GAI3C,IACO,CAAE,KAAI,OAAQ,GAAM,UAAS,GACpC,CAGI,EAAiB,EAAwB,EAAc,EACvD,EAAe,EAAuB,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAiB,EAAqB,CAAC,CAAG,EAGjH,EAAY,QAAQ,GAAO,CACzB,GAAI,EAAI,OAAQ,CAEd,IAAM,EAAa,EAAI,QAAU,KAAK,IAAI,EAAc,EAAI,QAAQ,CAAG,EACvE,EAAa,MAAM,YAAY,YAAY,EAAI,GAAG,OAAQ,GAAG,IAAa,CAC1E,EAAa,MAAM,YAAY,SAAS,EAAI,GAAG,OAAQ,GAAG,IAAa,CACnE,EAAI,SACN,EAAa,MAAM,YAAY,SAAS,EAAI,GAAG,UAAW,GAAG,EAAI,UAAU,MAG7E,EAAa,MAAM,YAAY,YAAY,EAAI,GAAG,OAAQ,GAAG,EAAI,QAAQ,CACzE,EAAa,MAAM,YAAY,SAAS,EAAI,GAAG,OAAQ,GAAG,EAAI,QAAQ,EAExE,GAEJ,EACF,CAEF,OADA,EAAS,QAAQ,EAAS,QAAQ,KACrB,EAAS,YAAY,EACjC,CAAC,EAAM,UAAU,CAAC,iBAAkB,EAAM,UAAU,CAAC,aAAc,EAAM,UAAU,CAAC,cAAc,CAAC,EAGpG,EAAA,EAAA,KAAC,QAAA,CACC,GAAI,EACJ,IAAK,EACL,KAAK,oBACL,UAAU,uHACV,MAAO,CAAE,SAAU,EAAW,CAC9B,GAAI,EAEH,YACK,EAEV,CACF,EAAkB,YAAc,oBAoBhC,MAAa,GAAA,EAAA,EAAA,OAAkC,CAAE,YAAW,WAAU,GAAG,MAErE,EAAA,EAAA,KAAC,QAAA,CACC,KAAK,aACL,WAAA,EAAA,EAAA,IACE,+BACA,sCACA,kCACA,kDAEA,sCAEA,qBACA,sBACA,wBACA,sBACA,2BACA,uBACA,kBACA,yBACA,0BAEA,wDACA,EACD,CACD,GAAI,EAEH,YACK,CAEV,CACF,EAAY,YAAc,cAmB1B,MAAa,GAAA,EAAA,EAAA,OAAwC,CAAE,cAAa,YAAW,GAAG,KAAY,CAC5F,GAAM,CAAE,oBAAmB,qBAAoB,oBAAmB,qBAAoB,2BAA4B,IAA0B,CACtI,EAA2B,EAAmB,IAAI,GAClD,EAAyB,EAAkB,EAAkB,OAAS,IAAI,GAChF,OACE,EAAA,EAAA,KAAC,KAAA,CAAG,KAAK,iBAAiB,WAAA,EAAA,EAAA,IAAc,OAAQ,EAAU,CAAE,GAAI,WAC7D,EAAY,QAAQ,KAAK,EAAQ,IAAU,CAC1C,IAAM,EAAY,EAAO,OAAO,cAAc,CACxC,EAAW,EAAmB,MAAM,SAAS,EAAO,GAAG,CAAG,OAAS,EAAmB,OAAO,SAAS,EAAO,GAAG,CAAG,QAAU,GAWnI,OAVI,EAAO,KAAO,UAEd,EAAA,EAAA,KAAC,EAAA,CAEW,WACS,oBACM,2BAHpB,EAAO,GAIZ,EAIJ,EAAA,EAAA,KAAC,EAAA,CAEY,YACD,WACV,YAAa,EAAO,KAAO,EAC3B,WAAY,EAAO,KAAO,EAC1B,iBAAkB,CAAC,CAAC,SAAU,UAAU,CAAC,SAAS,EAAO,GAAG,CAC5D,SAAU,EAAO,GACjB,aAAc,EAAO,OACrB,QAAS,EAAO,QAChB,YAAa,EAAO,OAAO,IAC3B,mBAAoB,EAAO,OAAO,2CAEtB,EAAO,OAAO,UAAU,OAAQ,EAAO,YAAY,CAAC,EAZ3D,GAAG,EAAO,GAAG,GAAG,IAaL,EAEpB,EACC,EAEP,CACF,EAAe,YAAc,iBAyB7B,MAAa,GAAA,EAAA,EAAA,OACV,CACC,YAAY,GACZ,WAAW,GACX,cAAc,GACd,aAAa,GACb,mBAAmB,GACnB,WACA,eACA,YACA,WACA,cACA,qBACA,GAAG,KACC,CACJ,IAAM,GAAA,EAAA,EAAA,aACG,EAAW,GAAwB,IAAA,GACzC,CAAC,EAAS,CAAC,CAER,GAAA,EAAA,EAAA,aAAqB,CACzB,IAAM,EAAO,GAAc,WAAW,OAAO,CAC7C,OAAO,IAAa,QAAU,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,IAAA,IACtE,CAAC,EAAU,EAAa,CAAC,CAEtB,GAAA,EAAA,EAAA,aAAsB,CAC1B,IAAM,EAAO,GAAc,WAAW,QAAQ,CAC9C,OAAO,IAAa,SAAW,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,IAAA,IACvE,CAAC,EAAU,EAAa,CAAC,CAEtB,GAAA,EAAA,EAAA,aACG,qBAAqB,EAAS,eACpC,CAAC,EAAS,CAAC,CAER,GAAA,EAAA,EAAA,aACG,GAAc,UAAU,QAAU,kBAAkB,EAAS,kBAAoB,IAAA,GACvF,CAAC,EAAU,EAAa,CAAC,CAEtB,GAAA,EAAA,EAAA,aACG,GAAc,UAAU,QAAU,kBAAkB,EAAS,kBAAoB,IAAA,GACvF,CAAC,EAAU,EAAa,CAAC,CAC5B,OACE,EAAA,EAAA,MAAC,KAAA,CACC,KAAK,kBACL,cAAa,EACb,cAAa,EACb,MAAO,CACL,SACA,OACA,QACO,QACP,SAAU,EACV,SAAU,EACX,CACD,WAAA,EAAA,EAAA,IACE,aACA,IAAa,WAAa,cAC1B,EAAW,SAAW,WACtB,IAAa,QAAU,GAAc,2BACrC,IAAa,SAAW,GAAe,2BACtC,GAAc,UAAU,MAAoB,WAAa,UAAY,iBACrE,GAAc,UAAU,MAAoB,WAAa,OAAS,cAClE,GAAc,UAAU,MAAoB,WAAa,SAAW,gBACrE,EACD,CACD,GAAI,aAEJ,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,gBAAiB,YAAe,CAC9C,IACC,EAAA,EAAA,KAAC,EAAA,CAAgC,WAAqB,YAAW,UAAW,EAAa,WAAY,EAAa,QAAS,GAAe,CAAA,EAEzI,EAGV,CACD,EAAgB,YAAc,kBAqB9B,MAAa,GAAA,EAAA,EAAA,OAAkC,CAAE,SAAQ,YAAW,WAAU,GAAG,KAAY,CAC3F,GAAM,CAAE,aAAY,WAAY,IAAuB,CAEvD,OADI,GAAW,EAAmB,MAEhC,EAAA,EAAA,KAAC,QAAA,CACC,KAAK,aACL,MAAO,CAAE,SAAQ,CACjB,WAAA,EAAA,EAAA,IACE,kBACA,OAEA,kBACA,cACA,mBACA,gBACA,kDACA,yCAEA,cACA,wBACA,sBACA,cACA,mBACA,yBACA,2BACA,cACA,gBACA,sBACA,uBAEA,8CACA,oDAEA,yBACA,0BACA,oBAEA,uCACA,yCACA,0CAIA,EACD,CACD,GAAI,EAEH,YACK,EAEV,CACF,EAAY,YAAc,cA6B1B,MAAa,GAAA,EAAA,EAAA,OAAgC,CAAE,MAAK,aAAY,kBAAiB,kBAAiB,WAAU,GAAG,KAAY,CACzH,GAAM,CAAE,gBAAe,oBAAmB,qBAAoB,oBAAmB,qBAAoB,cAAe,IAAsB,CAEpI,GAAA,EAAA,EAAA,aAAkC,EAAmB,MAAQ,EAAE,CAAE,CAAC,EAAmB,CAAC,CACtF,GAAA,EAAA,EAAA,aAAmC,EAAmB,OAAS,EAAE,CAAE,CAAC,EAAmB,CAAC,CACxF,GAAA,EAAA,EAAA,aAAyC,IAAqB,IAAI,GAAI,CAAC,EAAmB,CAAC,CAC3F,GAAA,EAAA,EAAA,aAAuC,IAAoB,EAAkB,OAAS,IAAI,GAAI,CAAC,EAAkB,CAAC,CAElH,GAAA,EAAA,EAAA,aACJ,GAAK,CACH,IAAM,EAAQ,EAAgB,EAAI,WAAW,GAAiB,IAAA,GAC9D,IAAa,EAAiB,OAAO,GAAU,UAAY,OAAO,GAAU,SAAW,EAAQ,IAAA,GAAU,CACzG,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,EAErB,CAAC,EAAe,EAAY,EAAK,EAAgB,CAClD,CACD,OACE,EAAA,EAAA,KAAC,KAAA,CACC,KAAK,YACL,aAAY,EACZ,MAAO,CACL,UAAW,cAAc,EAAgB,KAC1C,CACD,UAAU,sEACV,QAAS,EACT,GAAI,WAEH,EAAI,iBAAiB,CAAC,KAAK,EAAM,IAAU,CAC1C,IAAM,EAAe,EAAkB,SAAS,EAAK,OAAO,GAAG,CACzD,EAAgB,EAAmB,SAAS,EAAK,OAAO,GAAG,CAC3D,EAAW,EAAe,OAAS,EAAgB,QAAU,GA2BnE,OA1BI,EAAK,OAAO,KAAO,WAEnB,EAAA,EAAA,KAAC,EAAA,CAEC,WAAU,EAAK,OAAO,GACtB,YAAW,EACX,gBAAe,GAAc,IAAA,GACZ,kBACjB,OAAQ,EAAK,OACb,WAAY,EAAK,YANZ,GAAG,EAAK,GAAG,GAAG,IAOnB,CAGF,EAAK,OAAO,KAAO,UAEnB,EAAA,EAAA,KAAC,EAAA,CAEC,WAAU,EAAK,OAAO,GACtB,YAAW,EACX,gBAAe,GAAc,IAAA,GACnB,WACV,WAAY,GAAqB,EACjC,oBAAqB,EAAK,IAAI,gBANzB,GAAG,EAAK,GAAG,GAAG,IAOnB,EAIJ,EAAA,EAAA,KAAC,EAAA,CAEC,WAAU,EAAK,OAAO,GACtB,YAAW,EACX,gBAAe,GAAc,IAAA,GACnB,WACV,YAAa,EAAK,OAAO,KAAO,EAChC,WAAY,EAAK,OAAO,KAAO,EAC/B,MAAO,EAAK,OAAO,GACnB,SAAW,EAAK,OAAO,UAAU,MAAoB,UAAY,QACjE,OAAQ,EAAK,OACb,WAAY,EAAK,YAVZ,GAAG,EAAK,GAAG,GAAG,IAWnB,EAEJ,EACC,EAEP,CACF,EAAW,YAAc,aAoBzB,MAAa,GAAA,EAAA,EAAA,OAA8C,CAAE,WAAU,aAAa,GAAO,YAAW,sBAAqB,GAAG,KAAY,CACxI,IAAM,GAAA,EAAA,EAAA,aACH,GAAqC,CACpC,IAAsB,CAAC,CAAC,EAAM,EAEhC,CAAC,EAAoB,CACtB,CACD,OACE,EAAA,EAAA,KAAC,KAAA,CACC,KAAK,kBACL,cAAa,GACb,MAAO,CAAE,KAAM,EAAG,OAAQ,GAAuB,MAAO,GAAc,SAAU,GAAc,CAC9F,WAAA,EAAA,EAAA,IAAc,kCAAmC,EAAW,SAAW,WAAY,EAAU,CAC7F,GAAI,YAEJ,EAAA,EAAA,KAAC,MAAA,CACC,YAAU,mBACV,UAAU,oFACV,QAAS,GAAK,CACZ,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,YAGrB,EAAA,EAAA,KAACL,EAAAA,EAAAA,CAAS,aAAW,aAAa,QAAS,EAAY,gBAAiB,GAA2B,EAC/F,EACH,EAEP,CACF,EAAkB,YAAc,oBAoBhC,MAAa,GAAA,EAAA,EAAA,OAAgD,CAAE,kBAAiB,SAAQ,aAAY,YAAW,GAAG,KAAY,CAC5H,IAAM,GAAA,EAAA,EAAA,cACJ,EAAA,EAAA,YAAkB,GAAQ,UAAU,KAAM,GAAY,CAAC,CACtD,CAAC,EAAQ,EAAW,CAAC,CACxB,OACE,EAAA,EAAA,KAAC,KAAA,CACC,WAAS,UACT,YAAW,EACX,UAAU,mGACV,GAAI,WAEH,GACE,EAEP,CACF,EAAmB,YAAc,qBAyBjC,MAAa,GAAA,EAAA,EAAA,OACV,CAAE,WAAW,GAAO,cAAc,GAAO,aAAa,GAAO,QAAO,WAAW,QAAS,SAAQ,aAAY,GAAG,KAAY,CAC1H,GAAM,CAAE,eAAc,SAAU,IAA6B,CACvD,GAAA,EAAA,EAAA,QAA2B,SAAS,cAAc,aAAa,EAAa,IAAI,CAAC,CACjF,GAAA,EAAA,EAAA,QAAiC,KAAK,CAEtC,GAAA,EAAA,EAAA,aAAqB,CACzB,IAAM,EAAO,GAAQ,SAAS,OAAO,CACrC,OAAO,IAAa,QAAU,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,IAAA,IACtE,CAAC,EAAU,EAAO,CAAC,CAEhB,GAAA,EAAA,EAAA,aAAsB,CAC1B,IAAM,EAAO,GAAQ,SAAS,QAAQ,CACtC,OAAO,IAAa,SAAW,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,IAAA,IACvE,CAAC,EAAU,EAAO,CAAC,CAEhB,GAAA,EAAA,EAAA,aACG,kBAAkB,EAAM,eAC9B,CAAC,EAAM,CAAC,CAEL,GAAA,EAAA,EAAA,aACG,GAAQ,UAAU,QAAU,kBAAkB,EAAM,kBAAoB,IAAA,GAC9E,CAAC,EAAO,EAAO,CAAC,CAEb,GAAA,EAAA,EAAA,aACG,GAAQ,UAAU,QAAU,kBAAkB,EAAM,kBAAoB,IAAA,GAC9E,CAAC,EAAO,EAAO,CAAC,CAEb,GAAA,EAAA,EAAA,cACJ,EAAA,EAAA,YAAkB,GAAQ,UAAU,KAAM,GAAY,CAAC,CACtD,CAAC,EAAQ,EAAW,CAAC,CAoBxB,OAlBA,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,EAAQ,QAAS,OAGtB,IAAMM,EAAQ,EAAQ,QAAQ,YACxB,EAAc,GAAQ,SAAS,CAG/B,GAAeA,EAAQ,GACvB,EAAS,mBAAmB,kBAAoB,OAAO,GAAU,UAAe,GAAQ,UAAU,MAAqB,YACzH,EAAM,gBAAgB,IAAQ,CAC5B,GAAG,GACF,GAAQA,EAAQ,GAClB,EAAE,EAGN,CAAC,EAAO,EAAQ,EAAM,CAAC,EAGxB,EAAA,EAAA,KAAC,KAAA,CACC,KAAK,kBACL,cAAa,EACb,gBAAe,GAAc,IAAA,GAC7B,iBAAgB,GAAe,IAAA,GAC/B,MAAO,CACL,OACA,QACO,QACP,SAAU,EACV,SAAU,EACX,CACD,WAAA,EAAA,EAAA,IACE,kCACA,IAAa,QAAU,GAAc,2BACrC,IAAa,SAAW,GAAe,2BACxC,CACD,GAAI,YAEJ,EAAA,EAAA,KAAC,MAAA,CACC,IAAK,EACL,KAAK,wBACL,WAAA,EAAA,EAAA,IACE,oBACA,IAAa,SAAW,gBACxB,IAAa,UAAY,iBACzB,IAAa,OAAS,cACvB,UAEA,GACG,EACH,EAGV,CACD,EAAY,YAAc,cAe1B,MAAa,IAAA,EAAA,EAAA,OAAsC,CAAE,YAAW,WAAU,GAAG,MAEzE,EAAA,EAAA,KAAC,QAAA,CACC,KAAK,eACL,WAAA,EAAA,EAAA,IAAc,iGAAkG,EAAU,CAC1H,GAAI,EAEH,YACK,CAEV,CACF,GAAc,YAAc,gBAqB5B,MAAa,GAAA,EAAA,EAAA,OAA0C,CAAE,kBAAiB,kBAAiB,mBAAoB,CAC7G,GAAM,CAAE,kBAAmB,IAA+B,CAEpD,GAAA,EAAA,EAAA,QAAyC,SAAS,cAAc,WAAW,EAAe,IAAI,CAAC,CAC/F,GAAA,EAAA,EAAA,QAAqC,KAAK,CAE1C,CAAC,EAAe,IAAA,EAAA,EAAA,UAA4D,OAAO,CAEnF,CAAC,EAAO,IAAA,EAAA,EAAA,UAA6B,EAAE,CAEvC,GAAA,EAAA,EAAA,aAAkC,SAAY,CAClD,GAAI,CACF,EAAiB,WAAW,CAC5B,MAAM,KAAiB,CACvB,EAAiB,OAAO,OACjB,EAAO,CACd,QAAQ,MAAM,4BAA6B,EAAM,CACjD,EAAiB,QAAQ,GAI1B,CAAC,EAAc,CAAC,CAgBnB,OAdA,EAAA,EAAA,eAAgB,CACd,GAAI,CAAC,EAAgB,QAAS,OAE9B,IAAM,EAAW,IAAI,eAAe,GAAW,CAE7C,EAAS,EAAQ,GAAG,YAAY,MAAM,EACtC,CAGF,OADA,EAAS,QAAQ,EAAgB,QAAQ,KAC5B,EAAS,YAAY,EACjC,EAAE,CAAC,CAED,GAGH,EAAA,EAAA,KAAC,KAAA,CACC,IAAK,EACL,aAAY,EACZ,MAAO,CACL,UAAW,cAAc,EAAgB,KACzC,QACD,CACD,UAAU,gCAEV,EAAA,EAAA,KAAC,KAAA,CAAG,UAAU,4EACZ,EAAA,EAAA,MAAC,SAAA,CACC,KAAK,SACL,SAAU,IAAkB,WAC5B,WAAA,EAAA,EAAA,IACE,gCACA,IAAkB,YAAc,qBAChC,IAAkB,QAAU,mDAC5B,IAAkB,SAAW,uCAC9B,CACD,QAAS,YAER,IAAkB,SAAU,EAAA,EAAA,KAACC,EAAAA,YAAAA,CAAY,UAAU,SAAA,CAAW,CAC9D,IAAkB,aAAc,EAAA,EAAA,KAACN,EAAAA,EAAAA,CAAQ,UAAU,sBAAA,CAAwB,CAC3E,IAAkB,UAAW,EAAA,EAAA,KAACO,EAAAA,cAAAA,CAAc,UAAU,qBAAA,CAAuB,CAC7E,IAAkB,QAAU,YAC5B,IAAkB,YAAc,aAChC,IAAkB,SAAW,kBACvB,EACN,EACF,CAhCoB,MAkC3B,CACF,EAAgB,YAAc,kBCxjC9B,MAAaC,OAA4D,CACvE,GAAM,CAAE,QAAO,UAAS,aAAY,iBAAkB,GAAmB,CACnE,CAAE,qBAAsB,IAAuB,CAE/C,GAAA,EAAA,EAAA,QAAkD,KAAK,CAEvD,CAAE,QAAS,EAAM,aAAa,CAG9B,GAAA,EAAA,EAAA,gBAAqE,CACzE,MAAO,EAAK,OAAS,EACrB,iBAAoB,GACpB,qBAAwB,EAAkB,QAE1C,eACE,OAAO,OAAW,KAAe,UAAU,UAAU,QAAQ,UAAU,GAAK,GAAK,GAAW,GAAS,uBAAuB,CAAC,OAAS,IAAA,GACxI,SAAU,EACX,CAAC,CAGI,GAAA,EAAA,EAAA,aAAgC,CACpC,IAAM,EAAY,EAAe,cAAc,CACzC,EAAkB,EAAkB,SAAS,cAAgB,EACnE,OAAO,EAAY,EAAkB,GAAG,EAAgB,IAAM,GAAG,EAAU,KAC1E,CAAC,EAAe,cAAc,CAAC,CAAC,CAEnC,OACE,EAAA,EAAA,KAACC,EAAAA,EAAAA,CACC,UAAU,aACV,MAAO,CAAE,UAAW,EAAM,QAAQ,sBAAuB,CACzD,UAAU,iJAEV,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,UAAU,qBACxB,EAAA,EAAA,MAAC,EAAA,CAAoB,IAAK,aACxB,EAAA,EAAA,MAAC,EAAA,CAAA,SAAA,EACC,EAAA,EAAA,KAAC,EAAA,CAAA,SACE,EAAM,iBAAiB,CAAC,IAAI,IAC3B,EAAA,EAAA,KAAC,EAAA,CAAiD,cAAA,CAA7B,EAAY,GAAgC,CACjE,CAAA,CACU,EACd,EAAA,EAAA,KAAC,EAAA,CAAY,OAAQ,WAClB,EAAe,iBAAiB,CAAC,IAAI,GAAc,CAClD,IAAM,EAAM,EAAK,EAAW,OACtB,EAAa,OAAO,QAAQ,EAAkB,CAAC,MAAM,CAAC,EAAG,KAAO,IAAM,GAAG,GAAK,MAAQ,EAAE,CAW9F,OAVK,GAWH,EAAA,EAAA,KAAC,EAAA,CAEC,IAAK,EAAe,eACf,MACO,aACZ,gBAAiB,EAAW,MAC5B,gBAAiB,EAAW,OALvB,EAAW,MAMhB,EAhBA,EAAA,EAAA,KAAC,EAAA,CAEC,gBAAiB,EAAW,MAC5B,gBAAiB,EAAW,MACb,iBAHV,EAAW,MAIhB,EAaN,EACU,CAAA,CAAA,CACI,EACpB,EAAA,EAAA,KAAC,EAAA,CAA6B,UAAqB,cAAc,CAAA,EAC7C,EACP,EACG,EC9DpBC,IAIA,CAAE,UAAS,QAAO,sBAEpB,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,2CACb,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAkB,UAA0B,mBAAmB,EAChE,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,mBAAW,GAAU,CAAA,EAC9B,CA0BG,OAAsB,CACjC,GAAM,CAAE,SAAU,GAAmB,CAC/B,CAAC,EAAK,IAAA,EAAA,EAAA,UAAiD,KAAK,CAElE,OACE,EAAA,EAAA,KAACC,EAAAA,EAAAA,CAAe,YAAa,GAAI,WAAA,EAAA,EAAA,IAAc,UAAW,IAAQ,KAAO,WAAa,WAAW,WAC/F,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,6DACb,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,oBACb,EAAA,EAAA,KAACC,EAAAA,SAAAA,CAAS,KAAM,IAAQ,UAAY,UAAY,mBAC9C,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,+CACb,EAAA,EAAA,KAAC,IAAA,CAAE,UAAU,4BAAmB,sBAAsB,EACtD,EAAA,EAAA,KAACC,EAAAA,EAAAA,EAAAA,CAAY,EACb,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,oCACZ,EAAM,eAAe,CAAC,IAAI,GACrB,CAAC,SAAU,UAAU,CAAC,SAAS,EAAO,GAAG,CAAS,MAEpD,EAAA,EAAA,KAAC,GAAA,CAEC,QAAS,EAAO,cAAc,CAC9B,MAAO,OAAO,EAAO,UAAU,OAAO,CACtC,gBAAiB,GAAS,EAAO,iBAAiB,CAAC,CAAC,EAAM,EAHrD,EAAO,GAIZ,CAEJ,EACE,GACF,EACG,EACX,EAAA,EAAA,KAACD,EAAAA,SAAAA,CAAS,KAAM,IAAQ,UAAY,UAAY,mBAC9C,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,wCACb,EAAA,EAAA,MAACE,EAAAA,EAAAA,CAAO,QAAQ,UAAU,MAAM,mBAC9B,EAAA,EAAA,KAACC,EAAAA,eAAAA,EAAAA,CAAiB,CAAA,aAAA,EAEX,EACL,EACG,CAAA,EACP,EACN,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,oFACb,EAAA,EAAA,MAAC,SAAA,CACC,WAAA,EAAA,EAAA,IAAc,kEAAmE,IAAQ,WAAa,UAAU,CAChH,YAAe,EAAO,IAAQ,UAAY,KAAO,UAAU,YAE3D,EAAA,EAAA,KAACC,EAAAA,aAAAA,CAAa,KAAM,GAAA,CAAM,EAC1B,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,kDAAyC,WAAc,CAAA,EAChE,EACT,EAAA,EAAA,KAACH,EAAAA,EAAAA,EAAAA,CAAY,EACb,EAAA,EAAA,MAAC,SAAA,CACC,WAAA,EAAA,EAAA,IAAc,kEAAmE,IAAQ,WAAa,UAAU,CAChH,YAAe,EAAO,IAAQ,UAAY,KAAO,UAAU,YAE3D,EAAA,EAAA,KAACI,EAAAA,eAAAA,CAAe,KAAM,GAAA,CAAM,EAC5B,EAAA,EAAA,KAAC,OAAA,CAAK,UAAU,kDAAyC,WAAc,CAAA,EAChE,EACT,EAAA,EAAA,KAACJ,EAAAA,EAAAA,EAAAA,CAAY,GACT,CAAA,EACF,EACS,ECrEf,IAAA,EAAA,EAAA,OAAwF,CAAE,iBAAgB,cAAe,CAC7H,IAAM,GAAA,EAAA,EAAA,cAAkD,CAAE,iBAAgB,EAAG,CAAC,EAAe,CAAC,CAC9F,OAAO,EAAA,EAAA,KAAC,GAAyB,SAAA,CAAgB,QAAQ,YAA6C,EACtG,CACF,GAA4B,YAAc,8BAO1C,MAAM,IAAA,EAAA,EAAA,OAAoF,CAAE,QAAO,eAAc,YAAW,cAAe,CACzI,IAAM,GAAA,EAAA,EAAA,cAAgD,CAAE,QAAO,eAAc,YAAW,EAAG,CAAC,EAAO,EAAc,EAAU,CAAC,CAC5H,OAAO,EAAA,EAAA,KAAC,GAAuB,SAAA,CAAgB,QAAQ,YAA2C,EAClG,CACF,GAA0B,YAAc,4BAMxC,MAAM,IAAA,EAAA,EAAA,OACH,CAAE,oBAAmB,qBAAoB,oBAAmB,qBAAoB,0BAAyB,cAAe,CACvH,IAAM,GAAA,EAAA,EAAA,cACG,CAAE,oBAAmB,qBAAoB,oBAAmB,qBAAoB,0BAAyB,EAChH,CAAC,EAAmB,EAAoB,EAAmB,EAAoB,EAAwB,CACxG,CACD,OAAO,EAAA,EAAA,KAAC,GAAoB,SAAA,CAAgB,QAAQ,YAAwC,EAE/F,CACD,GAAuB,YAAc,yBAMrC,MAAM,IAAA,EAAA,EAAA,OAAwE,CAAE,aAAY,UAAS,oBAAmB,cAAe,CACrI,IAAM,GAAA,EAAA,EAAA,cAA0C,CAAE,aAAY,UAAS,oBAAmB,EAAG,CAAC,EAAY,EAAS,EAAkB,CAAC,CACtI,OAAO,EAAA,EAAA,KAAC,GAAiB,SAAA,CAAgB,QAAQ,YAAqC,EACtF,CACF,GAAoB,YAAc,sBAMlC,MAAM,GAAA,EAAA,EAAA,OACH,CAAE,gBAAe,oBAAmB,qBAAoB,oBAAmB,qBAAoB,aAAY,cAAe,CACzH,IAAM,GAAA,EAAA,EAAA,cACG,CACL,gBACA,oBACA,qBACA,oBACA,qBACA,aACD,EACD,CAAC,EAAe,EAAmB,EAAoB,EAAmB,EAAoB,EAAW,CAC1G,CACD,OAAO,EAAA,EAAA,KAAC,GAAgB,SAAA,CAAgB,QAAQ,YAAoC,EAEvF,CACD,EAAmB,YAAc,qBAkCjC,MAAa,IAIX,CACA,QAEA,aAAa,GACb,eAAe,GAEf,OACA,UACA,YAEA,oBAAoB,EAAE,CACtB,qBAAqB,EAAE,CAEvB,gBACA,aACA,iBACA,kBAEA,gBACA,cACwE,CACxE,IAAM,GAAA,EAAA,EAAA,QAAwB,CACxB,GAAA,EAAA,EAAA,QAAsB,CAEtB,CAAC,EAAc,IAAA,EAAA,EAAA,UAA+C,EAAE,CAAC,CACjE,CAAC,EAAe,IAAA,EAAA,EAAA,UAAiD,CACrE,MAAO,EACP,KAAM,CAAC,SAAU,GAAG,EAAkB,CACvC,CAAC,CACI,CAAC,EAAU,IAAA,EAAA,EAAA,UAAuC,EAAE,CAAC,CAErD,IAAA,EAAA,EAAA,aACJ,IACE,EAAgB,EAAgB,CAChC,IAAiB,aAA2B,SAAW,EAAgB,EAAa,CAAG,EAAgB,CAChG,GAET,CAAC,EAAc,EAAe,CAC/B,CAEK,GAAA,EAAA,EAAA,aACJ,GAAoB,CAClB,EAAiB,EAAiB,CAClC,IAAkB,aAA4B,SAAW,EAAiB,EAAc,CAAG,EAAiB,EAE9G,CAAC,EAAe,EAAgB,CACjC,CAEK,GAAA,EAAA,EAAA,eAA6B,CAC3B,OACG,UACT,MAAO,CACL,eACA,gBACA,WACD,CACD,cAAe,CACb,eAAgB,GAChB,KAAM,IAAA,GACN,QAAS,IAAA,GACT,QAAS,IAAA,GACV,CACD,iBAAkB,WAClB,sBAAuB,MAEvB,oBAAqB,GACrB,mBAAoB,GACpB,qBAAsB,GACtB,wBAAyB,GAEzB,aAAc,GACd,kBAAmB,GACnB,mBAAoB,GAEpB,WAAY,GAAO,EAAI,QACvB,iBAAA,EAAA,EAAA,kBAAkC,CAClC,oBAAA,EAAA,EAAA,qBAAwC,CACxC,qBAAA,EAAA,EAAA,sBAA0C,CAE1C,qBAAsB,GACtB,sBAAuB,EACvB,iBAAkB,EACnB,CAAC,CAGI,GAAA,EAAA,EAAA,aAAqB,CACzB,GAAM,CAAE,KAAA,GAAS,EAAM,aAAa,CACpC,OAAOK,GACN,CAAC,EAAM,aAAa,CAAC,KAAM,EAAM,UAAU,CAAC,cAAc,CAAC,CAExD,GAAA,EAAA,EAAA,aACG,CAAC,GAAc,EAAK,SAAW,EACrC,CAAC,EAAM,EAAW,CAAC,CAGhB,GAAA,EAAA,EAAA,cACG,CACL,QACA,QAEA,UACA,aACA,eAEA,YAEA,gBACD,EACD,CACE,EACA,EAEA,EACA,EACA,EAEA,EAEA,EACA,EAAM,UAAU,CAAC,cACjB,EAAM,UAAU,CAAC,SAClB,CACF,CAGK,GAAA,EAAA,EAAA,aACG,EAAM,UAAU,CACtB,CAAC,EAAM,UAAU,CAAC,CAAC,CAGhB,GAAA,EAAA,EAAA,aACG,EAAM,sBAAsB,CAClC,CAAC,EAAM,sBAAsB,CAAC,CAAC,CAE5B,GAAA,EAAA,EAAA,aACG,EAAW,aACjB,CAAC,EAAW,aAAa,CAAC,CAEvB,GAAA,EAAA,EAAA,aACG,EAAW,cACjB,CAAC,EAAW,cAAc,CAAC,CAGxB,IAAA,EAAA,EAAA,aACG,EAAM,qBAAqB,CAAC,IAAI,SAAW,EAAE,CACnD,CAAC,EAAM,UAAU,CAAC,cAAc,CAAC,CAG9B,IAAA,EAAA,EAAA,aACG,EAAM,sBAAsB,CAAC,IAAI,SAAW,EAAE,CACpD,CAAC,EAAM,UAAU,CAAC,cAAc,CAAC,CAG9B,IAAA,EAAA,EAAA,aACG,EAAM,cAAc,CAC1B,CAAC,EAAM,cAAc,CAAC,CAAC,CAE1B,OACE,EAAA,EAAA,KAAC,EAAa,SAAA,CAAgB,kBAC5B,EAAA,EAAA,KAAC,GAAA,CAA4C,2BAC3C,EAAA,EAAA,KAAC,GAAA,CAAiC,QAAqB,eAAyB,uBAC9E,EAAA,EAAA,KAAC,GAAA,CACoB,oBACC,qBACD,qBACC,sBACpB,wBAAyB,EAAM,gCAE/B,EAAA,EAAA,KAAC,GAAA,CAAgC,aAAqB,UAA4B,8BAChF,EAAA,EAAA,KAAC,EAAA,CACgB,gBACI,oBACC,qBACD,qBACC,sBACR,aAEX,YACkB,EACD,EACC,EACC,EACA,EACR,ECpSfC,IAIR,CAAE,WAAU,WAAU,GAAG,KAAY,CACxC,IAAM,GAAA,EAAA,EAAA,qBAAuC,GAAkB,CAC7D,IAAW,EAAM,EAChB,IAAI,CACP,OACE,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,6CACb,EAAA,EAAA,KAACC,EAAAA,EAAAA,CACC,GAAI,EACJ,KAAK,KACL,KAAK,SACL,YAAY,oBACZ,UAAU,mBACV,SAAU,GAAK,CACb,IAAW,EAAE,CACb,EAAgB,EAAE,OAAO,OAAS,GAAG,GAEvC,EACF,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,kJACb,EAAA,EAAA,KAACC,EAAAA,WAAAA,CAAW,KAAM,GAAA,CAAM,EACpB,EACN,EAAA,EAAA,KAAC,SAAA,CACC,UAAU,0XACV,aAAW,gBACX,KAAK,mBAEL,EAAA,EAAA,KAACC,EAAAA,eAAAA,CAAe,KAAM,GAAI,cAAY,QAAS,EACxC,GACL,EAIJC,GAAmF,CAAE,WAAU,WAAU,cAE3G,EAAA,EAAA,KAAC,SAAA,CACC,KAAK,SACK,WACV,UAAU,uYACD,UAER,YACM,CAqBAC,IAIP,CAAE,WAAU,aAAY,gBAE1B,EAAA,EAAA,MAAC,MAAA,CAAI,UAAU,kIACb,EAAA,EAAA,KAAC,EAAA,CACC,SAAU,CAAC,EACX,QAAS,GAAK,CACZ,KAAY,CACZ,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,YAGpB,EAAA,EAAA,KAACC,EAAAA,WAAAA,EAAAA,CAAa,EACD,EACf,EAAA,EAAA,KAAC,EAAA,CACC,SAAU,CAAC,EACX,QAAS,GAAK,CACZ,KAAa,CACb,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,YAGpB,EAAA,EAAA,KAACC,EAAAA,cAAAA,EAAAA,CAAgB,EACJ,EACf,EAAA,EAAA,KAAC,EAAA,CACC,SAAU,CAAC,EACX,QAAS,GAAK,CACZ,KAAc,CACd,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,YAGpB,EAAA,EAAA,KAACC,EAAAA,aAAAA,EAAAA,CAAe,EACH,GACX,CAyBGC,GAAqD,CAAE,cAAe,CACjF,GAAM,CAAE,SAAU,GAAmB,CACrC,OACE,EAAA,EAAA,MAAC,MAAA,CAAI,YAAU,gBAAgB,UAAU,uGACvC,EAAA,EAAA,KAAC,KAAA,CAAG,UAAU,sDAA8C,GAAW,EACvE,EAAA,EAAA,KAAC,MAAA,CAAI,UAAU,6CAA8C,YAAe,CAAA,EACxE,EAGV,EAAe,YAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{t as e}from"./button-C6ybzxxj.mjs";import{t}from"./paragraph-Ch5TvEqL.mjs";import{t as n}from"./flex-BLMTj7Ev.mjs";import{t as r}from"./date-CVz9xdCg.mjs";import{t as i}from"./badge-B8bw2UEY.mjs";import{i as a,n as o,r as s,t as c}from"./tooltip-Bj0iOG4s.mjs";import{n as l,t as u}from"./avatar-DbxqvCjT.mjs";import{t as d}from"./separator-BMsbHAVt.mjs";import{a as f,d as p,h as m,i as h,r as g,t as _}from"./dropdown-menu-DWSfXhHo.mjs";import{t as v}from"./checkbox-DJEdYOjA.mjs";import{t as y}from"./spinner-EgMJOaQi.mjs";import{n as b,r as ee}from"./resizable-DWh_mp5P.mjs";import{t as te}from"./input-Cd0G5y-9.mjs";import{AlertTriangle as ne,ArrowRightIcon as x,BoxIcon as S,CheckIcon as C,ChevronDown as re,CirclePlus as w,Columns4Icon as ie,DownloadIcon as ae,EllipsisVerticalIcon as T,ExternalLinkIcon as E,ListFilterIcon as D,ListFilterPlus as oe,MinusIcon as se,MoreVerticalIcon as ce,MoveLeftIcon as le,MoveRightIcon as ue,PinOffIcon as de,RefreshCwIcon as fe,SearchIcon as pe,Trash2Icon as me,UserRoundIcon as he,XIcon as ge}from"lucide-react";import{Activity as O,createContext as k,memo as A,use as j,useCallback as M,useEffect as N,useId as _e,useMemo as P,useRef as F,useState as I}from"react";import{jsx as L,jsxs as R}from"react/jsx-runtime";import{cn as z}from"@customafk/react-toolkit/utils";import{colorHashLight as ve}from"@customafk/react-toolkit/color-hash";import{flexRender as B,getCoreRowModel as ye,getExpandedRowModel as be,getGroupedRowModel as xe,useReactTable as Se}from"@tanstack/react-table";import{useVirtualizer as Ce}from"@tanstack/react-virtual";import{useDebounceCallback as we}from"@customafk/react-toolkit/hooks/useDebounceCallback";const V=()=>R(`div`,{className:`flex gap-0 text-text-positive-weak`,children:[L(se,{size:16}),L(se,{size:16})]}),Te=({label:e,onClick:t,onRemove:n})=>e?n?R(`div`,{className:`flex w-fit gap-x-0.5 rounded-full border border-border py-1 pr-2 pl-3 text-text-positive text-xs shadow-xs`,onClick:e=>{t?.(),e.stopPropagation(),e.preventDefault()},children:[e,L(`button`,{className:`cursor-pointer text-text-positive-weak hover:text-text-positive-strong`,onClick:e=>{n?.(),e.stopPropagation(),e.preventDefault()},children:L(ge,{size:12})})]}):L(`button`,{className:`w-fit rounded-full border border-border px-3 py-1 text-text-positive text-xs shadow-xs`,onClick:e=>{t?.(),e.stopPropagation(),e.preventDefault()},children:e}):L(V,{}),Ee=({value:e})=>e==null?L(V,{}):e===!1?L(`div`,{className:`text-danger-strong`,children:L(ge,{})}):L(`div`,{className:`text-success-strong`,children:L(C,{})}),De=({date:e})=>e==null?L(V,{}):L(s,{children:R(c,{children:[L(a,{asChild:!0,children:L(i,{className:`h-fit`,children:L(r,{date:e,format:`medium`,className:`font-normal text-white`})})}),L(o,{className:`rounded px-2`,children:L(r,{date:e,format:`full`,showTime:!0,className:`font-medium text-text-negative text-xs`})})]})}),Oe=({content:e})=>e==null?L(V,{}):R(c,{children:[L(a,{children:L(t,{variant:`sm`,className:`line-clamp-2 whitespace-pre-line break-all`,children:e})}),L(o,{align:`start`,className:`h-fit min-w-48 max-w-80 pt-4`,children:R(`div`,{className:`flex flex-col gap-y-2`,children:[L(t,{variant:`xs`,className:`whitespace-pre-line text-wrap break-keep text-text-negative-weak`,children:e}),R(`p`,{className:`w-full text-end`,children:[e.toString().length,` chars`]})]})})]}),ke=({items:t=[]})=>R(_,{children:[L(m,{asChild:!0,children:L(e,{size:`sm`,variant:`ghost`,color:`secondary`,className:`size-9 rounded-full`,children:L(ce,{})})}),L(g,{children:L(h,{children:t.map(e=>L(f,{className:`px-3`,onSelect:t=>{e.onClick(e.id),t.stopPropagation()},children:e.label},e.id))})})]}),Ae=({name:e})=>e?R(c,{children:[L(a,{children:L(t,{variant:`sm`,className:`line-clamp-2 w-full truncate text-wrap pb-px text-start`,children:e})}),L(o,{align:`start`,className:`h-fit min-w-48 max-w-80 pt-4`,children:R(`div`,{className:`flex flex-col gap-y-2`,children:[L(`p`,{className:`whitespace-pre-line text-wrap break-keep`,children:e}),R(`p`,{className:`w-full text-end`,children:[e.length,` chars`]})]})})]}):L(V,{}),je=({href:e,label:t})=>R(`a`,{href:e,target:`_blank`,className:`inline-flex items-center gap-1 truncate text-primary text-sm underline`,rel:`noopener noreferrer`,children:[L(`span`,{children:t||e}),L(E,{size:14})]}),Me=({value:e})=>R(c,{children:[L(a,{asChild:!0,children:L(`p`,{className:`font-number text-secondary-foreground text-sm tabular-nums`,children:e.replace(/(\d{3})(\d{3})(\d{4})/,`($1) $2-$3`)})}),L(o,{align:`start`,children:L(`p`,{className:`tabular-nums`,children:e.slice(1).replace(/(\d{2})(\d{3})(\d{4})/,`(00) (+84) ($1) $2-$3`)})})]}),Ne=({title:t,onClick:n})=>R(c,{children:[L(a,{children:L(e,{type:`button`,variant:`ghost`,color:`danger`,size:`icon`,onClick:M(async e=>{e.preventDefault(),e.stopPropagation(),await n?.()},[n]),children:L(me,{})})}),L(o,{children:L(`p`,{children:t||`Remove item from list table`})})]}),Pe=(e,t,n)=>{let r=10**t;switch(n){case`floor`:return Math.floor(e*r)/r;case`ceil`:return Math.ceil(e*r)/r;default:return Math.round(e*r)/r}},Fe=A(({decimalSeparator:e=`.`,groupSeparator:t=`,`,prefix:r,suffix:i,precision:a,roundingMode:o=`round`,showTrailingZeros:s=!1,size:c=`lg`,value:l=0})=>{let u=P(()=>{let e={};return typeof a==`number`&&a>=0&&s&&(e.minimumFractionDigits=a),e.maximumFractionDigits=a,e},[a,s]),d=M(e=>{let t=e;return typeof a==`number`&&a>=0&&(t=Pe(e,a,o)),t.toLocaleString(`en-US`,u)},[o,u,a]),f=P(()=>{if(typeof l==`number`)return Number.isNaN(l)||!Number.isFinite(l)?`N/A`:d(l);if(typeof l==`string`){let e=l.trim();if(!e)return`N/A`;let t=Number(e);return Number.isNaN(t)||!Number.isFinite(t)?`N/A`:d(t)}return`N/A`},[l,d]),p=P(()=>e===`.`&&t===`,`?f:f.replace(/,/g,t).replace(/\./g,e),[f,e,t]);return p===`0`||p===`N/A`||!p?L(V,{}):R(n,{padding:`none`,className:z(`font-number text-lg text-text-positive tabular-nums`,c===`xs`&&`text-xs`,c===`sm`&&`text-sm`,c===`md`&&`text-base`,c===`lg`&&`text-lg`,c===`xl`&&`text-xl`),children:[r,L(`p`,{children:p}),i]})});Fe.displayName=`UITableStatisticDisplay`;const Ie=({uuid:e,username:r,email:i})=>R(n,{wrap:!1,gap:`sm`,padding:`none`,children:[!e&&L(u,{className:`size-10 shadow-card`,children:L(l,{className:`bg-muted-weak`,children:L(he,{size:28,className:`text-text-negative`})})}),e&&L(u,{className:`size-10 shadow-card`,children:L(l,{style:{backgroundColor:ve.hex(e)},children:L(he,{size:28,className:`text-white`})})}),R(n,{vertical:!0,padding:`none`,gap:`none`,align:`start`,children:[L(t,{className:`font-medium text-sm text-text-positive-weak`,children:r??`Unknown User`}),L(t,{variant:`sm`,className:`mt-0! text-text-positive-weak text-xs`,children:i})]})]}),Le=k(null),Re=()=>{let e=j(Le);if(!e)throw Error(`useTableInnerWrapperContext must be used within a TableInnerWrapperProvider`);return e},ze=k(null),Be=()=>{let e=j(ze);if(!e)throw Error(`useTableInnerTableContext must be used within a TableInnerTableProvider`);return e},Ve=k(null),He=()=>{let e=j(Ve);if(!e)throw Error(`useTableHeaderRowContext must be used within a TableHeaderRowProvider`);return e},Ue=k(null),We=()=>{let e=j(Ue);if(!e)throw Error(`useTableBodyContext must be used within a TableBodyProvider`);return e},Ge=k(null),Ke=()=>{let e=j(Ge);if(!e)throw Error(`useTableRowContext must be used within a TableRowProvider`);return e},qe=k(null),H=()=>{let e=j(qe);if(!e)throw Error(`useTableContext must be used within a TableProvider`);return e},U=A(({isPinned:e,onLeftPin:t,onRightPin:n,onUnpin:r,className:i})=>{let a=M(()=>{t?.(`left`)},[t]),o=M(()=>{n?.(`right`)},[n]),s=M(()=>{r?.(!1)},[r]);return R(_,{children:[L(m,{asChild:!0,children:L(`button`,{className:z(`absolute right-2 z-10 p-0.5 opacity-0 bg-card`,`cursor-pointer rounded-full transition-all`,`text-text-positive-weak`,`[&>svg]:size-4`,`group-hover:opacity-100`,`hover:bg-muted-muted hover:text-text-positive`,i),children:L(T,{})})}),L(g,{align:`end`,className:`w-64 p-4`,children:R(h,{className:`*:data-[slot=dropdown-menu-item]:rounded-xs *:data-[slot=dropdown-menu-item]:p-2`,children:[L(O,{mode:e?`visible`:`hidden`,children:R(f,{onClick:s,children:[!!e&&`Unpin`,L(p,{children:L(de,{className:`size-4`})})]})}),R(O,{mode:e?`hidden`:`visible`,children:[R(f,{onClick:a,children:[e?`Unpin`:`Pin to Left`,L(p,{children:L(le,{className:`size-4`})})]}),R(f,{onClick:o,children:[e?`Unpin`:`Pin to Right`,L(p,{children:L(ue,{className:`size-4`})})]})]})]})})]})});U.displayName=`UITableHeadCellOption`;const W=A(({isPinned:e,isAllRowsSelected:t,style:n,onToggleAllRowsSelected:r,...i})=>{let a=M(e=>{r?.(!!e)},[r]);return L(`th`,{slot:`table-header-cell`,"data-pinned":!0,style:{left:0,zIndex:20,width:60,maxWidth:60},className:z(e?`sticky`:`relative`),...i,children:L(`div`,{className:`absolute inset-0 flex items-center justify-center`,onClick:e=>{e.preventDefault(),e.stopPropagation()},children:L(v,{"aria-label":`Select All Rows`,checked:t,onCheckedChange:a})})})});W.displayName=`UITableHeadCellSelect`;const G=A(({isEmpty:e,isFetching:t})=>!e&&!t?null:R(`div`,{className:`sticky left-0 flex min-h-96 flex-1 items-center justify-center bg-transparent text-text-positive-weak opacity-100`,children:[t&&R(`div`,{className:`flex flex-col items-center gap-1`,children:[L(y,{className:`size-12`}),L(`p`,{children:`Loading data...`})]}),e&&!t&&R(`div`,{className:`flex flex-col items-center gap-1`,children:[L(S,{strokeWidth:1,size:48}),L(`p`,{children:`No data available`})]})]}));G.displayName=`UITableEmptyDisplay`;const Je=A(({className:e,children:t,...n})=>L(`div`,{slot:`table-wrapper`,className:z(`relative m-0 flex size-full flex-col flex-nowrap items-start justify-start gap-2`,e),...n,children:t}));Je.displayName=`UITableWrapper`;const K=A(({children:e,...t})=>{let{innerWrapperId:n}=Re();return L(`div`,{id:n,slot:`table-inner-wrapper`,className:`relative size-full overflow-auto border-b border-b-border border-l border-l-border bg-card`,...t,children:e})});K.displayName=`UITableInnerWrapper`;const q=A(({children:e,...t})=>{let{table:n,innerTableId:r,totalSize:i}=Be(),a=F(null);return N(()=>{if(!a.current)return;let e=n.getFlatHeaders(),t=new ResizeObserver(t=>{requestAnimationFrame(()=>{let r=t[0].target;if(r instanceof HTMLTableElement){let i=t[0];if(!i)return;let a=i.contentRect.width,{left:o=[],right:s=[]}=n.getState().columnPinning,c=0,l=0,u=0,d=e.map(e=>{let{id:t}=e,n=t===`select`||t===`actions`,r=o.includes(t)||s.includes(t),i=e.getSize(),a=e.column.columnDef.maxSize;return n?(c+=60,{id:t,isFlex:!1,width:60}):r?(c+=i,{id:t,isFlex:!1,width:i}):e.column.columnDef.size||i!==150?(u+=i,{id:t,isFlex:!1,width:i}):(l++,{id:t,isFlex:!0,maxSize:a})}),f=a-c-u,p=l>0?Math.max(0,Math.floor(f/l)):0;d.forEach(e=>{if(e.isFlex){let t=e.maxSize?Math.min(p,e.maxSize):p;r.style.setProperty(`--header-${e.id}-size`,`${t}`),r.style.setProperty(`--col-${e.id}-size`,`${t}`),e.maxSize&&r.style.setProperty(`--col-${e.id}-maxSize`,`${e.maxSize}`)}else r.style.setProperty(`--header-${e.id}-size`,`${e.width}`),r.style.setProperty(`--col-${e.id}-size`,`${e.width}`)})}})});return t.observe(a.current),()=>t.disconnect()},[n.getState().columnSizingInfo,n.getState().columnSizing,n.getState().columnPinning]),L(`table`,{id:r,ref:a,slot:`table-inner-table`,className:`grid w-full table-fixed caption-bottom border-collapse border-spacing-0 flex-col content-start [&_tfoot_td]:border-t`,style:{minWidth:i},...t,children:e})});q.displayName=`UITableInnerTable`;const J=A(({className:e,children:t,...n})=>L(`thead`,{slot:`table-head`,className:z(`sticky top-0 z-20 h-9 w-full`,`grid select-none bg-muted-bg-subtle`,`border-b border-b-border shadow`,`font-medium text-[13px] text-text-positive-weak`,`[&_tr:not(:last-child)_td]:border-b`,`[&_th]:inline-flex`,`[&_th]:items-center`,`[&_th]:transition-all`,`[&_th]:duration-300`,`[&_th]:whitespace-nowrap`,`[&_th]:border-border`,`[&_th]:border-r`,`[&_th]:last:border-r-0`,`[&_th]:first:border-l-0`,`[&_tr_th:not([data-pinned=false])]:bg-muted-bg-subtle`,e),...n,children:t}));J.displayName=`UITableHead`;const Y=A(({headerGroup:e,className:t,...n})=>{let{isAllRowsSelected:r,columnPinningState:i,leftPinnedHeaders:a,rightPinnedHeaders:o,onToggleAllRowsSelected:s}=He(),c=o[0]?.id,l=a[a.length-1]?.id;return L(`tr`,{slot:`table-head-row`,className:z(`flex`,t),...n,children:e.headers.map((e,t)=>{let n=e.column.getIsVisible(),a=i.left?.includes(e.id)?`left`:i.right?.includes(e.id)?`right`:!1;return e.id===`select`?L(W,{isPinned:a,isAllRowsSelected:r,onToggleAllRowsSelected:s},e.id):L(X,{isVisible:n,isPinned:a,isFirstCell:e.id===c,isLastCell:e.id===l,isOptionsVisible:![`select`,`actions`].includes(e.id),headerId:e.id,headerColumn:e.column,colSpan:e.colSpan,onColumnPin:e.column.pin,onToggleVisibility:e.column.toggleVisibility,children:B(e.column.columnDef.header,e.getContext())},`${e.id}-${t}`)})})});Y.displayName=`UITableHeadRow`;const X=A(({isVisible:e=!0,isPinned:t=!1,isFirstCell:n=!1,isLastCell:r=!1,isOptionsVisible:i=!0,headerId:a,headerColumn:o,className:s,children:c,onColumnPin:l,onToggleVisibility:u,...d})=>{let f=P(()=>t?20:void 0,[t]),p=P(()=>{let e=o?.getStart?.(`left`);return t===`left`&&typeof e==`number`?`${e}px`:void 0},[t,o]),m=P(()=>{let e=o?.getAfter?.(`right`);return t===`right`&&typeof e==`number`?`${e}px`:void 0},[t,o]),h=P(()=>`calc(var(--header-${a}-size) * 1px)`,[a]),g=P(()=>o?.columnDef.minSize?`calc(var(--col-${a}-minSize) * 1px)`:void 0,[a,o]),_=P(()=>o?.columnDef.maxSize?`calc(var(--col-${a}-maxSize) * 1px)`:void 0,[a,o]);return R(`th`,{slot:`table-head-cell`,"data-pinned":t,"data-header":a,style:{zIndex:f,left:p,right:m,width:h,minWidth:g,maxWidth:_},className:z(`group flex`,a===`actions`&&`border-r-0!`,t?`sticky`:`relative`,t===`left`&&r&&`border-r border-r-border`,t===`right`&&n&&`border-l border-l-border`,o?.columnDef.meta?.position===`center`&&`justify-center`,o?.columnDef.meta?.position===`end`&&`justify-end`,o?.columnDef.meta?.position===`start`&&`justify-start`,s),...d,children:[L(`div`,{className:`truncate px-4`,children:c}),i&&L(U,{isPinned:t,isVisible:e,onLeftPin:l,onRightPin:l,onUnpin:l})]})});X.displayName=`UITableHeadCell`;const Z=A(({height:e,className:t,children:n,...r})=>{let{isFetching:i,isEmpty:a}=We();return a||i?null:L(`tbody`,{slot:`table-body`,style:{height:e},className:z(`relative w-full`,`grid`,`[&_tr]:absolute`,`[&_tr]:flex`,`[&_tr]:flex-none`,`[&_tr]:w-full`,`[&_tr]:cursor-pointer [&_tr]:focus:outline-none`,`[&_tr]:border-b [&_tr]:border-b-border`,`[&_td]:z-10`,`[&_td]:transition-all`,`[&_td]:duration-300`,`[&_td]:flex`,`[&_td]:flex-none`,`[&_td]:overflow-hidden`,`[&_td]:whitespace-nowrap`,`[&_td]:px-4`,`[&_td]:py-2.5`,`[&_td]:align-middle`,`[&_td]:border-border`,`[&_td]:data-[selected=true]:bg-muted-muted!`,`[&_td]:data-[selected=true]:hover:bg-muted-muted!`,`[&_td>div]:inline-flex`,`[&_td>div]:items-center`,`[&_td>div]:w-full`,`[&_td:not([data-pinned=false])]:z-20`,`[&_td:not([data-pinned=false])]:sticky`,`[&_td:not([data-pinned=false])]:bg-card`,t),...r,children:n})});Z.displayName=`UITableBody`;const Q=A(({row:e,isSelected:t,virtualRowIndex:n,virtualRowStart:r,children:i,...a})=>{let{keyOfClickRow:o,isAllRowsSelected:s,columnPinningState:c,leftPinnedHeaders:l,rightPinnedHeaders:u,onClickRow:d}=Ke(),f=P(()=>c.left??[],[c]),p=P(()=>c.right??[],[c]),m=P(()=>u?.[0]?.id,[u]),h=P(()=>l?.[l.length-1]?.id,[l]),g=M(t=>{let r=o?e.original?.[o]:void 0;d?.(n,typeof r==`string`||typeof r==`number`?r:void 0),t.preventDefault(),t.stopPropagation()},[o,d,e,n]);return L(`tr`,{slot:`table-row`,"data-index":n,style:{transform:`translateY(${r}px)`},className:`group [&_td]:border-r [&_td]:border-r-border [&_td]:last:border-r-0`,onClick:g,...a,children:e.getVisibleCells().map((e,r)=>{let i=f.includes(e.column.id),a=p.includes(e.column.id),o=i?`left`:a?`right`:!1;return e.column.id===`actions`?L(Ye,{"data-col":e.column.id,"data-cell":n,"data-selected":t||void 0,virtualRowIndex:n,column:e.column,getContext:e.getContext},`${e.id}-${r}`):e.column.id===`select`?L($,{"data-col":e.column.id,"data-cell":n,"data-selected":t||void 0,isPinned:o,isSelected:s||t,onToggleRowSelected:e.row.toggleSelected},`${e.id}-${r}`):L(Xe,{"data-col":e.column.id,"data-cell":n,"data-selected":t||void 0,isPinned:o,isFirstCell:e.column.id===m,isLastCell:e.column.id===h,colId:e.column.id,position:e.column.columnDef.meta?.position??`start`,column:e.column,getContext:e.getContext},`${e.id}-${r}`)})})});Q.displayName=`UITableRow`;const $=A(({isPinned:e,isSelected:t=!1,className:n,onToggleRowSelected:r,...i})=>{let a=M(e=>{r?.(!!e)},[r]);return L(`td`,{slot:`table-body-cell`,"data-pinned":!0,style:{left:0,zIndex:20,width:60,maxWidth:60},className:z(`group-hover:bg-muted-bg-subtle!`,e?`sticky`:`relative`,n),...i,children:L(`div`,{"data-slot":`table-cell-inner`,className:`flex! w-full! items-center justify-center bg-transparent text-center align-middle`,onClick:e=>{e.preventDefault(),e.stopPropagation()},children:L(v,{"aria-label":`Select Row`,checked:t,onCheckedChange:a})})})});$.displayName=`UITableCellSelect`;const Ye=A(({virtualRowIndex:e,column:t,getContext:n,className:r,...i})=>{let a=P(()=>B(t?.columnDef.cell,n()),[t,n]);return L(`td`,{"data-col":`actions`,"data-cell":e,className:`sticky border-r-0! inset-y-0 right-0 z-50 flex items-center pr-4 group-hover:bg-muted-bg-subtle!`,...i,children:a})});Ye.displayName=`UITableCellActions`;const Xe=A(({isPinned:e=!1,isFirstCell:t=!1,isLastCell:n=!1,colId:r,position:i=`start`,column:a,getContext:o,...s})=>{let{innerTableId:c,table:l}=Be(),u=F(document.querySelector(`table[id="${c}"]`)),d=F(null),f=P(()=>{let t=a?.getStart(`left`);return e===`left`&&typeof t==`number`?`${t}px`:void 0},[e,a]),p=P(()=>{let t=a?.getAfter(`right`);return e===`right`&&typeof t==`number`?`${t}px`:void 0},[e,a]),m=P(()=>`calc(var(--col-${r}-size) * 1px)`,[r]),h=P(()=>a?.columnDef.minSize?`calc(var(--col-${r}-minSize) * 1px)`:void 0,[r,a]),g=P(()=>a?.columnDef.maxSize?`calc(var(--col-${r}-maxSize) * 1px)`:void 0,[r,a]),_=P(()=>B(a?.columnDef.cell,o()),[a,o]);return N(()=>{if(!d.current)return;let e=d.current.scrollWidth,t=a?.getSize();t&&e>t&&u.current instanceof HTMLTableElement&&typeof r==`string`&&a?.columnDef.meta?.fitContent&&l.setColumnSizing(t=>({...t,[r]:e+32}))},[r,a,l]),L(`td`,{slot:`table-body-cell`,"data-pinned":e,"data-lastcell":n||void 0,"data-firstcell":t||void 0,style:{left:f,right:p,width:m,minWidth:h,maxWidth:g},className:z(`group-hover:bg-muted-bg-subtle!`,e===`left`&&n&&`border-r border-r-border`,e===`right`&&t&&`border-l border-l-border`),...s,children:L(`div`,{ref:d,slot:`table-body-cell-inner`,className:z(`overflow-x-hidden`,i===`start`&&`justify-start`,i===`center`&&`justify-center`,i===`end`&&`justify-end`),children:_})})});Xe.displayName=`UITableCell`;const Ze=A(({className:e,children:t,...n})=>L(`tfoot`,{slot:`table-footer`,className:z(`flex w-full justify-center border-border-weak border-t py-2 font-medium [&>tr]:last:border-b-0`,e),...n,children:t}));Ze.displayName=`UITableFooter`;const Qe=A(({virtualRowIndex:e,virtualRowStart:t,fetchMoreData:n})=>{let{innerWrapperId:r}=Re(),i=F(document.querySelector(`div[id="${r}"]`)),a=F(null),[o,s]=I(`idle`),[c,l]=I(0),u=M(async()=>{try{s(`fetching`),await n?.(),s(`idle`)}catch(e){console.error(`Error fetching more data:`,e),s(`error`)}},[n]);return N(()=>{if(!i.current)return;let e=new ResizeObserver(e=>{l(e[0].contentRect.width)});return e.observe(i.current),()=>e.disconnect()},[]),n?L(`tr`,{ref:a,"data-index":e,style:{transform:`translateY(${t}px)`,width:c},className:`sticky! left-0 h-10`,children:L(`td`,{className:`absolute left-0 flex w-full items-center justify-center text-xs`,children:R(`button`,{type:`button`,disabled:o===`fetching`,className:z(`flex cursor-pointer gap-x-0.5`,o===`fetching`&&`cursor-not-allowed`,o===`idle`&&`text-text-positive-weak hover:text-text-positive`,o===`error`&&`text-danger hover:text-danger-strong`),onClick:u,children:[o===`idle`&&L(re,{className:`size-4`}),o===`fetching`&&L(y,{className:`size-4 animate-spin`}),o===`error`&&L(ne,{className:`size-4 text-danger`}),o===`idle`&&`Load More`,o===`fetching`&&`Loading...`,o===`error`&&`Error! Retry?`]})})}):null});Qe.displayName=`UITableLoadMore`;const $e=()=>{let{table:e,isEmpty:t,isFetching:n,fetchMoreData:r}=H(),{rowSelectionState:i}=We(),a=F(null),{rows:o}=e.getRowModel(),s=Ce({count:o.length+1,estimateSize:()=>40,getScrollElement:()=>a.current,measureElement:typeof window<`u`&&navigator.userAgent.indexOf(`Firefox`)===-1?e=>e?.getBoundingClientRect().height:void 0,overscan:2}),c=P(()=>{let e=s.getTotalSize(),t=a.current?.clientHeight||0;return e<t?`${t}px`:`${e}px`},[s.getTotalSize()]);return L(ee,{direction:`horizontal`,style:{direction:e.options.columnResizeDirection},className:`relative flex w-full max-w-full flex-1 gap-1 overflow-auto border-t border-t-border border-r border-r-border bg-slate-50 p-0 text-sm`,children:L(b,{className:`relative`,children:R(K,{ref:a,children:[R(q,{children:[L(J,{children:e.getHeaderGroups().map(e=>L(Y,{headerGroup:e},e.id))}),L(Z,{height:c,children:s.getVirtualItems().map(e=>{let t=o[e.index],n=Object.entries(i).some(([e,n])=>e===`${t?.id}`&&n);return t?L(Q,{ref:s.measureElement,row:t,isSelected:n,virtualRowIndex:e.index,virtualRowStart:e.start},e.index):L(Qe,{virtualRowIndex:e.index,virtualRowStart:e.start,fetchMoreData:r},e.index)})})]}),L(G,{isEmpty:t,isFetching:n})]})})})},et=({checked:e,title:t,onCheckedChange:n})=>R(`div`,{className:`flex h-fit items-center gap-2`,children:[L(v,{checked:e,onCheckedChange:n}),L(`p`,{className:`text-sm`,children:t})]}),tt=()=>{let{table:t}=H(),[n,r]=I(null);return L(b,{defaultSize:25,className:z(`bg-card`,n===null?`max-w-8!`:`min-w-64`),children:R(`div`,{className:`relative z-20 flex size-full bg-muted-bg-subtle`,children:[R(`div`,{className:`flex-1`,children:[L(O,{mode:n===`columns`?`visible`:`hidden`,children:R(`div`,{className:`flex size-full flex-col gap-2 p-4`,children:[L(`p`,{className:`px-2 font-medium`,children:`Columns Visibility`}),L(d,{}),L(`div`,{className:`flex flex-col gap-4 pt-4`,children:t.getAllColumns().map(e=>[`select`,`actions`].includes(e.id)?null:L(et,{checked:e.getIsVisible(),title:String(e.columnDef.header),onCheckedChange:t=>e.toggleVisibility(!!t)},e.id))})]})}),L(O,{mode:n===`filters`?`visible`:`hidden`,children:L(`div`,{className:`flex size-full flex-col p-2`,children:R(e,{variant:`outline`,color:`muted`,children:[L(oe,{}),`Add Filter`]})})})]}),R(`div`,{className:`flex h-full flex-col border-border border-l bg-muted-bg-subtle text-sm`,children:[R(`button`,{className:z(`flex h-32 cursor-pointer flex-col items-center gap-y-2 p-2 py-4`,n===`columns`&&`bg-card`),onClick:()=>r(n===`columns`?null:`columns`),children:[L(ie,{size:18}),L(`span`,{className:`text-nowrap [writing-mode:vertical-lr]`,children:`Columns`})]}),L(d,{}),R(`button`,{className:z(`flex h-32 cursor-pointer flex-col items-center gap-y-2 p-2 py-4`,n===`filters`&&`bg-card`),onClick:()=>r(n===`filters`?null:`filters`),children:[L(D,{size:18}),L(`span`,{className:`text-nowrap [writing-mode:vertical-lr]`,children:`Filters`})]}),L(d,{})]})]})})},nt=A(({innerWrapperId:e,children:t})=>{let n=P(()=>({innerWrapperId:e}),[e]);return L(Le.Provider,{value:n,children:t})});nt.displayName=`UITableInnerWrapperProvider`;const rt=A(({table:e,innerTableId:t,totalSize:n,children:r})=>{let i=P(()=>({table:e,innerTableId:t,totalSize:n}),[e,t,n]);return L(ze.Provider,{value:i,children:r})});rt.displayName=`UITableInnerTableProvider`;const it=A(({isAllRowsSelected:e,columnPinningState:t,leftPinnedHeaders:n,rightPinnedHeaders:r,onToggleAllRowsSelected:i,children:a})=>{let o=P(()=>({isAllRowsSelected:e,columnPinningState:t,leftPinnedHeaders:n,rightPinnedHeaders:r,onToggleAllRowsSelected:i}),[e,t,n,r,i]);return L(Ve.Provider,{value:o,children:a})});it.displayName=`UITableHeadRowProvider`;const at=A(({isFetching:e,isEmpty:t,rowSelectionState:n,children:r})=>{let i=P(()=>({isFetching:e,isEmpty:t,rowSelectionState:n}),[e,t,n]);return L(Ue.Provider,{value:i,children:r})});at.displayName=`UITableBodyProvider`;const ot=A(({keyOfClickRow:e,isAllRowsSelected:t,columnPinningState:n,leftPinnedHeaders:r,rightPinnedHeaders:i,onClickRow:a,children:o})=>{let s=P(()=>({keyOfClickRow:e,isAllRowsSelected:t,columnPinningState:n,leftPinnedHeaders:r,rightPinnedHeaders:i,onClickRow:a}),[e,t,n,r,i,a]);return L(Ge.Provider,{value:s,children:o})});ot.displayName=`UITableRowProvider`;const st=({title:e,isFetching:t=!1,isRefetching:n=!1,data:r,columns:i,totalRows:a,leftPinnedColumns:o=[],rightPinnedColumns:s=[],keyOfClickRow:c,onClickRow:l,onRowSelection:u,onColumnPinning:d,fetchMoreData:f,children:p})=>{let m=_e(),h=_e(),[g,_]=I({}),[v,y]=I({right:s,left:[`select`,...o]}),[b,ee]=I({}),te=M(e=>(_(e),u?.(e instanceof Function?e(g):e),e),[g,u]),ne=M(e=>{y(e),d?.(e instanceof Function?e(v):e)},[v,d]),x=Se({data:r,columns:i,state:{rowSelection:g,columnPinning:v,expanded:b},defaultColumn:{enableResizing:!1,size:void 0,minSize:void 0,maxSize:void 0},columnResizeMode:`onChange`,columnResizeDirection:`ltr`,enableColumnPinning:!0,enableRowSelection:!0,enableColumnResizing:!0,enableMultiRowSelection:!0,autoResetAll:!1,autoResetExpanded:!1,autoResetPageIndex:!1,getSubRows:e=>e.subRows,getCoreRowModel:ye(),getGroupedRowModel:xe(),getExpandedRowModel:be(),onRowSelectionChange:te,onColumnPinningChange:ne,onExpandedChange:ee}),S=P(()=>{let{rows:e}=x.getRowModel();return e},[x.getRowModel().rows,x.getState().columnPinning]),C=P(()=>!t&&S.length===0,[S,t]),re=P(()=>({title:e,table:x,isEmpty:C,isFetching:t,isRefetching:n,totalRows:a,fetchMoreData:f}),[e,x,C,n,t,a,f,x.getState().columnPinning,x.getState().expanded]),w=P(()=>x.getState(),[x.getState()]),ie=P(()=>x.getIsAllRowsSelected(),[x.getIsAllRowsSelected()]),ae=P(()=>w.rowSelection,[w.rowSelection]),T=P(()=>w.columnPinning,[w.columnPinning]),E=P(()=>x.getLeftHeaderGroups()[0]?.headers||[],[x.getState().columnPinning]),D=P(()=>x.getRightHeaderGroups()[0]?.headers||[],[x.getState().columnPinning]),oe=P(()=>x.getTotalSize(),[x.getTotalSize()]);return L(qe.Provider,{value:re,children:L(nt,{innerWrapperId:m,children:L(rt,{table:x,innerTableId:h,totalSize:oe,children:L(it,{isAllRowsSelected:ie,columnPinningState:T,leftPinnedHeaders:E,rightPinnedHeaders:D,onToggleAllRowsSelected:x.toggleAllRowsSelected,children:L(at,{isFetching:t,isEmpty:C,rowSelectionState:ae,children:L(ot,{keyOfClickRow:c,isAllRowsSelected:ie,columnPinningState:T,leftPinnedHeaders:E,rightPinnedHeaders:D,onClickRow:l,children:p})})})})})})},ct=({onSearch:e,onChange:t,...n})=>{let r=we(t=>{e?.(t)},500);return R(`div`,{className:`relative w-full max-w-80 flex-1`,children:[L(te,{...n,size:`lg`,type:`search`,placeholder:`Search records...`,className:`flex-1 ps-9 pe-9`,onChange:e=>{t?.(e),r(e.target.value??``)}}),L(`div`,{className:`pointer-events-none absolute inset-y-0 start-0 flex items-center justify-center ps-3 text-text-positive-weak peer-disabled:opacity-50`,children:L(pe,{size:16})}),L(`button`,{className:`absolute inset-y-0 end-0 flex h-full w-9 items-center justify-center rounded-e-md text-text-positive-weak outline-none transition-[color,box-shadow] hover:text-text-positive focus:z-10 focus-visible:border focus-visible:border-primary-strong focus-visible:ring-[3px] focus-visible:ring-primary-weak disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50`,"aria-label":`Submit search`,type:`submit`,children:L(x,{size:16,"aria-hidden":`true`})})]})},lt=({children:e,disabled:t,onClick:n})=>L(`button`,{type:`button`,disabled:t,className:`flex cursor-pointer items-center gap-x-1 rounded-sm border border-border bg-background p-2.5 text-sm text-text-positive-weak outline-none transition-all hover:shadow-card focus:border-border-emphasis focus:bg-muted-muted active:border-border-emphasis active:bg-muted-muted active:text-text-positive disabled:pointer-events-none disabled:cursor-default disabled:opacity-60 [&_svg]:size-3.5`,onClick:n,children:e}),ut=({onCreate:e,onDownload:t,onRefresh:n})=>R(`div`,{className:`flex [&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none`,children:[L(lt,{disabled:!e,onClick:t=>{e?.(),t.stopPropagation(),t.preventDefault()},children:L(w,{})}),L(lt,{disabled:!n,onClick:e=>{n?.(),e.stopPropagation(),e.preventDefault()},children:L(fe,{})}),L(lt,{disabled:!t,onClick:e=>{t?.(),e.stopPropagation(),e.preventDefault()},children:L(ae,{})})]}),dt=({children:e})=>{let{title:t}=H();return R(`div`,{"data-slot":`table-tooltip`,className:`relative m-0 flex w-full flex-0 flex-col flex-wrap items-start space-y-2 p-0 px-2 text-sm`,children:[L(`h3`,{className:`font-semibold text-base text-text-positive`,children:t}),L(`div`,{className:`flex w-full flex-1 justify-between gap-x-2`,children:e})]})};dt.displayName=`TableTooltip`;export{Oe as A,Ie as C,je as D,Me as E,Ee as M,Te as N,Ae as O,Je as S,Ne as T,Y as _,tt as a,Qe as b,Xe as c,G as d,Ze as f,W as g,U as h,st as i,De as j,ke as k,Ye as l,X as m,ut as n,$e as o,J as p,ct as r,Z as s,dt as t,$ as u,q as v,Fe as w,Q as x,K as y};
|
|
2
|
+
//# sourceMappingURL=tables-DrJKQPsT.mjs.map
|