@customafk/lunas-ui 0.2.19 → 0.2.20
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-Beqe8m7q.d.cts → alert-CwIH3Hkd.d.mts} +8 -8
- package/dist/{alert-XpHbQl4p.d.mts → alert-iwPuxYjG.d.cts} +8 -8
- package/dist/{badge-CSIbd6Ib.d.cts → badge-CINaZwOW.d.mts} +7 -7
- package/dist/{badge-cDG94TBd.d.mts → badge-DBsYYM8d.d.cts} +7 -7
- package/dist/{button-D_PwLu6A.d.cts → button-DdwLbwWQ.d.mts} +7 -7
- package/dist/{button-Bu1wgqhO.d.mts → button-UgIAM1cP.d.cts} +7 -7
- package/dist/cards/simple-card.d.mts +2 -2
- package/dist/data-display/statistic.d.mts +6 -6
- package/dist/{dialog-CtO9ie0P.d.cts → dialog-CfbtCisP.d.mts} +12 -12
- package/dist/{dialog-DtknheXI.d.mts → dialog-HXH3FYKH.d.cts} +12 -12
- package/dist/dialogs/detail-dialog/components/sidebar.d.cts +27 -27
- package/dist/dialogs/detail-dialog/components/sidebar.d.mts +25 -25
- package/dist/features/descriptions/index.d.cts +1 -1
- package/dist/features/descriptions/index.d.mts +5 -5
- package/dist/features/search-modal/index.d.cts +2 -2
- package/dist/features/search-modal/index.d.mts +2 -2
- package/dist/features/tables/index.cjs +1 -1
- package/dist/features/tables/index.d.cts +2 -2
- package/dist/features/tables/index.d.mts +3 -3
- 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/features/text-editor/index.d.mts +1 -1
- package/dist/{index-tr2ndIm-.d.mts → index-3ZBP9XKI.d.mts} +4 -4
- package/dist/{index-DgO3fRA8.d.mts → index-BreahdZP.d.mts} +35 -31
- package/dist/{index-6R0zla55.d.cts → index-D09-9eQ8.d.cts} +110 -110
- package/dist/{index-CDGAuUDu.d.cts → index-DWGlOnex.d.cts} +9 -5
- package/dist/{index-D8a6GRB2.d.mts → index-DXXR4oq-.d.mts} +352 -352
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +8 -8
- package/dist/index.d.mts +9 -9
- package/dist/index.mjs +1 -1
- package/dist/{input-CsTijTsW.d.cts → input-BpTmuYnJ.d.mts} +5 -5
- package/dist/{input-BFD3ecVI.d.mts → input-DjEul_uK.d.cts} +6 -6
- package/dist/layouts/flex.d.cts +9 -9
- package/dist/layouts/flex.d.mts +9 -9
- 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.cts +2 -2
- package/dist/pages/NotAuthorized.d.mts +2 -2
- package/dist/pages/NotFound.d.cts +2 -2
- package/dist/pages/NotFound.d.mts +2 -2
- package/dist/{tables-BhX5FzM4.cjs → tables--hUSBZFP.cjs} +4 -4
- package/dist/tables--hUSBZFP.cjs.map +1 -0
- package/dist/tables-BZ5jLRGG.mjs +4 -0
- package/dist/tables-BZ5jLRGG.mjs.map +1 -0
- package/dist/typography/paragraph.d.cts +5 -5
- 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.cts +1 -1
- 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 +7 -7
- package/dist/ui/button-group.d.mts +7 -7
- 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 +7 -7
- 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.cts +4 -4
- 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.cts +16 -16
- package/dist/ui/dropdown-menu.d.mts +16 -16
- package/dist/ui/empty.d.cts +9 -9
- package/dist/ui/empty.d.mts +9 -9
- package/dist/ui/field.d.cts +25 -25
- package/dist/ui/field.d.mts +25 -25
- 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 +13 -13
- package/dist/ui/item.d.mts +16 -16
- 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 +1 -1
- 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 +29 -29
- package/dist/ui/sidebar.d.mts +27 -27
- 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.cts +2 -2
- package/dist/ui/switch.d.mts +2 -2
- package/dist/ui/table.d.cts +18 -18
- package/dist/ui/table.d.mts +9 -9
- 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 +5 -5
- package/dist/ui/toggle.d.mts +5 -5
- package/dist/ui/tooltip.d.cts +5 -5
- package/dist/ui/tooltip.d.mts +5 -5
- package/package.json +1 -1
- package/dist/tables-BhX5FzM4.cjs.map +0 -1
- package/dist/tables-D2za3DdW.mjs +0 -4
- package/dist/tables-D2za3DdW.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tables-BZ5jLRGG.mjs","names":["UITableEmpty: React.FC","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}>","UITableBooleanDisplay: React.FC<{\n /** The boolean value to visualise; `null`/`undefined` renders an empty state. */\n value: boolean | null | undefined;\n}>","UITableDateDisplay: React.FC<Props>","UITableDescriptionDisplay: React.FC<{\n /** The text or numeric value to display; `null`/`undefined` renders an empty state. */\n content: string | null | undefined | number;\n}>","UITableEmailDisplay: React.FC<Props>","UITableListDisplay: React.FC<Props>","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}>","UITableNameDisplay: React.FC<NameDisplayProps>","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}>","UITablePhoneNumberDisplay: React.FC<\n React.PropsWithChildren<{\n /** The raw phone number string to format and display. */\n value: string;\n }>\n>","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}>","options: Intl.NumberFormatOptions","UITableStatusDisplay: React.FC<Props>","UITableUserDataDisplay: React.FC<Props>","width","rafId: number | undefined","pinnedWidth: number","flexibleColumnsCount: number","fixedSizeTotal: number","UITableContainer: React.FC<React.PropsWithChildren>","TYPE_ICONS: Record<FilterType, React.ReactNode>","NUMBER_OPERATORS: { value: NumberFilterValue['operator']; label: string }[]","TEXT_OPERATORS: { value: TextFilterValue['operator']; label: string }[]","TagFilterEditor: React.FC<{\n value: TagFilterValue;\n definition: FilterDefinition;\n onChange: (v: TagFilterValue) => void;\n}>","SingleTagFilterEditor: React.FC<{\n value: SingleTagFilterValue;\n definition: FilterDefinition;\n onChange: (v: SingleTagFilterValue) => void;\n}>","DateRangeFilterEditor: React.FC<{\n value: DateRangeFilterValue;\n onChange: (v: DateRangeFilterValue) => void;\n}>","NumberFilterEditor: React.FC<{\n value: NumberFilterValue;\n onChange: (v: NumberFilterValue) => void;\n}>","TextFilterEditor: React.FC<{\n value: TextFilterValue;\n onChange: (v: TextFilterValue) => void;\n}>","BooleanFilterEditor: React.FC<{\n value: BooleanFilterValue;\n onChange: (v: BooleanFilterValue) => void;\n}>","FilterItem: React.FC<{\n filter: ActiveFilter;\n definition: FilterDefinition;\n onRemove: () => void;\n onUpdate: (value: FilterValue) => void;\n}>","newFilter: ActiveFilter","rows","UITableTooltipFilter: React.FC<\n Omit<React.ComponentProps<typeof Input>, 'className'> & {\n onSearch?: (value: string) => void;\n }\n>","ActionButton: React.FC<React.PropsWithChildren<React.ComponentProps<'button'>>>","UITableTooltipActions: React.FC<{\n onCreate?: () => void;\n onRefresh?: () => void;\n onDownload?: () => void;\n}>","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/currency-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/email-display.tsx","../packages/components/features/tables/components/atoms/list-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/progress-display.tsx","../packages/components/features/tables/components/atoms/remove-button.tsx","../packages/components/features/tables/components/atoms/statistic.tsx","../packages/components/features/tables/components/atoms/status-display.tsx","../packages/components/features/tables/components/atoms/user.tsx","../packages/components/features/tables/hooks/use-context.ts","../packages/components/features/tables/components/table.variants.ts","../packages/components/features/tables/components/commons/body.tsx","../packages/components/features/tables/components/commons/cell.tsx","../packages/components/features/tables/components/commons/cell-actions.tsx","../packages/components/features/tables/constants.ts","../packages/components/features/tables/components/commons/cell-select.tsx","../packages/components/features/tables/components/commons/empty-display.tsx","../packages/components/features/tables/components/commons/footer.tsx","../packages/components/features/tables/components/commons/head.tsx","../packages/components/features/tables/components/commons/head-cell-option.tsx","../packages/components/features/tables/components/commons/head-cell.tsx","../packages/components/features/tables/components/commons/head-cell-select.tsx","../packages/components/features/tables/components/commons/head-row.tsx","../packages/components/features/tables/components/commons/inner-table.tsx","../packages/components/features/tables/components/commons/inner-wrapper.tsx","../packages/components/features/tables/components/commons/load-more.tsx","../packages/components/features/tables/components/commons/row.tsx","../packages/components/features/tables/components/commons/wrapper.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/utils/csv.ts","../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","'use client';\n\nimport { memo, useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { UITableEmpty } from './empty';\n\n/** Props for the {@link UITableCurrencyDisplay} component. */\ntype Props = {\n /** The numeric value to format as currency; falsy / `NaN` renders an empty state. */\n value: number | string | null | undefined;\n /** ISO 4217 currency code (default: `'USD'`). */\n currency?: string;\n /**\n * BCP 47 locale used for number formatting (default: `'en-US'`).\n * Controls digit grouping and decimal separators.\n */\n locale?: string;\n /** How to display the currency symbol — `'symbol'` (default), `'code'`, or `'name'`. */\n display?: 'symbol' | 'code' | 'name';\n /** Font-size variant (default: `'md'`). */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** When `true`, applies a green tint for positive and red tint for negative values. */\n colorize?: boolean;\n};\n\n/**\n * Formats a numeric value as a locale-aware currency string in a table cell.\n * Always shows exactly two decimal places and uses the browser's `Intl` API for\n * symbol placement. Renders {@link UITableEmpty} when the value is absent or\n * invalid.\n *\n * @example\n * import { UITableCurrencyDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableCurrencyDisplay value={1234.5} currency=\"USD\" colorize />\n */\nexport const UITableCurrencyDisplay = memo(({ value, currency = 'USD', locale = 'en-US', display = 'symbol', size = 'md', colorize = false }: Props) => {\n const formatted = useMemo(() => {\n const num = typeof value === 'string' ? Number(value.trim()) : value;\n if (num === null || num === undefined || Number.isNaN(num) || !Number.isFinite(num)) return null;\n\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n currencyDisplay: display,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(num);\n }, [value, currency, locale, display]);\n\n const isNegative = useMemo(() => {\n const num = typeof value === 'string' ? Number(value.trim()) : value;\n return typeof num === 'number' && num < 0;\n }, [value]);\n\n if (!formatted) return <UITableEmpty />;\n\n return (\n <p\n className={cn(\n 'font-number 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 !colorize && 'text-text-positive',\n colorize && isNegative && 'text-danger-strong',\n colorize && !isNegative && 'text-success-strong'\n )}\n >\n {formatted}\n </p>\n );\n});\nUITableCurrencyDisplay.displayName = 'UITableCurrencyDisplay';\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","'use client';\n\nimport { useState } from 'react';\n\nimport { CheckIcon, CopyIcon, MailIcon } from 'lucide-react';\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { UITableEmpty } from './empty';\n\n/** Props for the {@link UITableEmailDisplay} component. */\ntype Props = {\n /** The email address to display; `null`/`undefined`/empty renders an empty state. */\n email: string | null | undefined;\n /** When `true`, a `mailto:` anchor wraps the address (default: `true`). */\n linkable?: boolean;\n};\n\n/**\n * Displays an email address in a table cell with a copy-to-clipboard button.\n * Shows a brief checkmark confirmation after copying. Optionally wraps the\n * address in a `mailto:` link. Renders {@link UITableEmpty} when `email` is\n * absent.\n *\n * @example\n * import { UITableEmailDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableEmailDisplay email=\"jane@example.com\" />\n */\nexport const UITableEmailDisplay: React.FC<Props> = ({ email, linkable = true }) => {\n const [copied, setCopied] = useState(false);\n\n if (!email) return <UITableEmpty />;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n navigator.clipboard.writeText(email).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n });\n };\n\n return (\n <TooltipProvider>\n <div className=\"group flex items-center gap-x-1.5\">\n <MailIcon size={13} className=\"shrink-0 text-text-positive-weak\" />\n\n {linkable ? (\n <a href={`mailto:${email}`} className=\"truncate text-primary text-sm underline-offset-2 hover:underline\" onClick={e => e.stopPropagation()}>\n {email}\n </a>\n ) : (\n <span className=\"truncate text-text-positive text-sm\">{email}</span>\n )}\n\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={handleCopy}\n className=\"shrink-0 cursor-pointer text-text-positive-weak opacity-0 transition-opacity group-hover:opacity-100 hover:text-text-positive\"\n >\n {copied ? <CheckIcon size={13} className=\"text-success-strong\" /> : <CopyIcon size={13} />}\n </button>\n </TooltipTrigger>\n <TooltipContent>{copied ? 'Copied!' : 'Copy email'}</TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n );\n};\n","'use client';\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';\nimport { UITableEmpty } from './empty';\n\n/** Props for the {@link UITableListDisplay} component. */\ntype Props = {\n /** Array of strings or numbers to render as inline pills. */\n items: (string | number)[] | null | undefined;\n /**\n * Maximum number of pills shown before a `+N more` overflow badge appears\n * (default: `3`).\n */\n maxVisible?: number;\n};\n\n/**\n * Renders an array of values as compact inline pills in a table cell. When the\n * list exceeds `maxVisible`, a `+N more` badge is shown; hovering it reveals all\n * remaining items in a tooltip. Renders {@link UITableEmpty} for empty or absent\n * arrays.\n *\n * @example\n * import { UITableListDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableListDisplay items={['React', 'TypeScript', 'TailwindCSS', 'Vite']} maxVisible={3} />\n */\nexport const UITableListDisplay: React.FC<Props> = ({ items, maxVisible = 3 }) => {\n if (!items || items.length === 0) return <UITableEmpty />;\n\n const visible = items.slice(0, maxVisible);\n const overflow = items.slice(maxVisible);\n\n return (\n <div className=\"flex flex-wrap gap-1\">\n {visible.map((item, i) => (\n <span key={i} className=\"inline-flex items-center rounded-full border border-border bg-muted-weak px-2 py-0.5 text-text-positive text-xs\">\n {item}\n </span>\n ))}\n\n {overflow.length > 0 && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex cursor-default items-center rounded-full bg-primary-bg-subtle px-2 py-0.5 text-primary-intense text-xs\">\n +{overflow.length} more\n </span>\n </TooltipTrigger>\n <TooltipContent align=\"start\" className=\"flex max-w-64 flex-wrap gap-1 p-2\">\n {overflow.map((item, i) => (\n <span key={i} className=\"inline-flex items-center rounded-full border border-border px-2 py-0.5 text-text-negative text-xs\">\n {item}\n </span>\n ))}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\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-text-positive 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","'use client';\n\nimport { memo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Progress } from '@/components/ui/progress';\nimport { UITableEmpty } from './empty';\n\n/** Props for the {@link UITableProgressDisplay} component. */\ntype Props = {\n /** Percentage value between 0 and 100; `null`/`undefined` renders an empty state. */\n value: number | null | undefined;\n /** When `true`, shows the numeric percentage next to the bar (default: `true`). */\n showLabel?: boolean;\n /**\n * Color thresholds applied to the progress indicator.\n * - `≥ successThreshold` → green\n * - `≥ warningThreshold` → yellow\n * - otherwise → red\n *\n * Defaults: `successThreshold = 70`, `warningThreshold = 40`.\n */\n successThreshold?: number;\n warningThreshold?: number;\n};\n\n/**\n * Renders a horizontal progress bar with an optional percentage label for a\n * table cell. The bar color shifts from red → yellow → green based on\n * configurable thresholds. Renders {@link UITableEmpty} when `value` is absent.\n *\n * @example\n * import { UITableProgressDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableProgressDisplay value={75} />\n */\nexport const UITableProgressDisplay = memo(({ value, showLabel = true, successThreshold = 70, warningThreshold = 40 }: Props) => {\n if (value === null || value === undefined) return <UITableEmpty />;\n\n const clamped = Math.min(100, Math.max(0, value));\n\n const indicatorClass =\n clamped >= successThreshold\n ? '[&>[data-slot=progress-indicator]]:bg-success'\n : clamped >= warningThreshold\n ? '[&>[data-slot=progress-indicator]]:bg-warning'\n : '[&>[data-slot=progress-indicator]]:bg-danger';\n\n return (\n <div className=\"flex w-full min-w-24 items-center gap-x-2\">\n <Progress value={clamped} className={cn('flex-1', indicatorClass)} />\n {showLabel && <span className=\"w-9 shrink-0 text-right font-number text-text-positive-weak text-xs tabular-nums\">{clamped}%</span>}\n </div>\n );\n});\nUITableProgressDisplay.displayName = 'UITableProgressDisplay';\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","'use client';\n\nimport { Badge } from '@/components/ui/badge';\nimport { UITableEmpty } from './empty';\n\ntype BadgeColor = 'primary' | 'secondary' | 'muted' | 'accent' | 'info' | 'success' | 'warning' | 'danger';\n\n/** Props for the {@link UITableStatusDisplay} component. */\ntype Props = {\n /** The status string to display; `null`/`undefined` renders an empty state. */\n value: string | null | undefined;\n /**\n * Maps each status string to a badge color. Any key not present in the map\n * falls back to `defaultColor`.\n */\n colorMap?: Record<string, BadgeColor>;\n /** Color used when `value` is not found in `colorMap` (default: `'muted'`). */\n defaultColor?: BadgeColor;\n /** Badge variant forwarded to the underlying {@link Badge} (default: `'soft'`). */\n variant?: 'solid' | 'soft' | 'outline';\n};\n\n/**\n * Renders a color-coded status badge for a table cell. The mapping from status\n * string to badge color is fully configurable via `colorMap`; unknown statuses\n * fall back to `defaultColor`.\n *\n * @example\n * import { UITableStatusDisplay } from '@customafk/lunas-ui/features/tables';\n *\n * <UITableStatusDisplay\n * value=\"active\"\n * colorMap={{ active: 'success', inactive: 'danger', pending: 'warning' }}\n * />\n */\nexport const UITableStatusDisplay: React.FC<Props> = ({ value, colorMap, defaultColor = 'muted', variant = 'soft' }) => {\n if (value === null || value === undefined || value === '') return <UITableEmpty />;\n\n const color: BadgeColor = (colorMap && colorMap[value]) ?? defaultColor;\n const label = value.charAt(0).toUpperCase() + value.slice(1).replace(/_/g, ' ');\n\n return (\n <Badge variant={variant} color={color} className=\"min-w-16 justify-center capitalize\">\n {label}\n </Badge>\n );\n};\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","import { createContext, use } from 'react';\n\nimport type { AnyEntity } from '@/types';\nimport type {\n TTableBodyContext,\n TTableContext,\n TTableFilterContext,\n TTableHeadRowContext,\n TTableInnerTableContext,\n TTableInnerWrapperContext,\n TTableRowContext,\n} 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\nexport const TableFilterContext = createContext<TTableFilterContext | null>(null);\n\nexport const useUITableFilterContext = () => {\n const ctx = use(TableFilterContext);\n if (!ctx) {\n throw new Error('useUITableFilterContext must be used within a UITableProvider');\n }\n return ctx;\n};\n","import { cva, type VariantProps } from 'class-variance-authority';\n\nexport const tableHeadCellOptionTriggerVariants = cva([\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]);\n\nexport const tableEmptyDisplayVariants = cva(['sticky left-0 flex flex-1 items-center justify-center bg-transparent text-text-positive-weak opacity-100']);\n\nexport const tableWrapperVariants = cva(['relative m-0 flex size-full flex-col flex-nowrap items-start justify-start gap-2']);\n\nexport const tableInnerWrapperVariants = cva(['relative size-full overflow-auto border-b border-b-border border-l border-l-border bg-card']);\n\nexport const tableInnerTableVariants = cva([\n 'grid w-full table-fixed caption-bottom border-collapse border-spacing-0 flex-col content-start [&_tfoot_td]:border-t',\n]);\n\nexport const tableHeadVariants = cva([\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 '[&_tr:not(:last-child)_td]:border-b',\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 '[&_tr_th:not([data-pinned=false])]:bg-muted-bg-subtle',\n]);\n\nexport const tableHeadRowVariants = cva(['flex']);\n\nexport const tableHeadCellVariants = cva(['group flex'], {\n variants: {\n isPinned: {\n left: 'sticky',\n right: 'sticky',\n false: 'relative',\n },\n isActions: {\n true: 'border-r-0!',\n false: '',\n },\n isLastCell: {\n true: '',\n false: '',\n },\n isFirstCell: {\n true: '',\n false: '',\n },\n position: {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n },\n },\n compoundVariants: [\n { isPinned: 'left', isLastCell: undefined, className: 'border-r border-r-border' },\n { isPinned: 'right', isFirstCell: undefined, className: 'border-l border-l-border' },\n ],\n});\n\nexport const tableBodyVariants = cva([\n 'relative w-full',\n 'grid',\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 '[&_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 '[&_td]:data-[selected=true]:bg-muted-muted!',\n '[&_td]:data-[selected=true]:hover:bg-muted-muted!',\n '[&_td>div]:inline-flex',\n '[&_td>div]:items-center',\n '[&_td>div]:w-full',\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\nexport const tableRowVariants = cva(['group [&_td]:border-r [&_td]:border-r-border [&_td]:last:border-r-0']);\n\nexport const tableCellSelectVariants = cva(['group-hover:bg-muted-bg-subtle!'], {\n variants: {\n isPinned: {\n left: 'sticky',\n right: 'sticky',\n false: 'relative',\n },\n },\n defaultVariants: {\n isPinned: undefined,\n },\n});\n\nexport const tableCellActionsVariants = cva(['sticky border-r-0! inset-y-0 right-0 z-50 flex items-center pr-4 group-hover:bg-muted-bg-subtle!']);\n\nexport const tableCellVariants = cva(['group-hover:bg-muted-bg-subtle!'], {\n variants: {\n isPinned: {\n left: '',\n right: '',\n false: '',\n },\n isLastCell: {\n true: '',\n false: '',\n },\n isFirstCell: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n { isPinned: 'left', isLastCell: undefined, className: 'border-r border-r-border' },\n { isPinned: 'right', isFirstCell: undefined, className: 'border-l border-l-border' },\n ],\n});\n\nexport const tableCellInnerVariants = cva(['overflow-x-hidden'], {\n variants: {\n position: {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n },\n },\n defaultVariants: {\n position: 'start',\n },\n});\n\nexport const tableFooterVariants = cva(['flex w-full justify-center border-border-weak border-t py-2 font-medium [&>tr]:last:border-b-0']);\n\nexport const tableLoadMoreButtonVariants = cva(['flex cursor-pointer gap-x-0.5'], {\n variants: {\n state: {\n idle: 'text-text-positive-weak hover:text-text-positive',\n fetching: 'cursor-not-allowed',\n error: 'text-danger hover:text-danger-strong',\n },\n },\n defaultVariants: {\n state: 'idle',\n },\n});\n\nexport type TableHeadCellVariantProps = VariantProps<typeof tableHeadCellVariants>;\nexport type TableCellSelectVariantProps = VariantProps<typeof tableCellSelectVariants>;\nexport type TableCellVariantProps = VariantProps<typeof tableCellVariants>;\nexport type TableCellInnerVariantProps = VariantProps<typeof tableCellInnerVariants>;\nexport type TableLoadMoreButtonVariantProps = VariantProps<typeof tableLoadMoreButtonVariants>;\n","'use client';\nimport { memo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { useUITableBodyContext } from '../../hooks/use-context';\nimport type { TUITableBody } from '../../types';\nimport { tableBodyVariants } from '../table.variants';\n\nexport const UITableBody = memo<TUITableBody>(({ height, className, children, ...props }) => {\n const { isFetching, isRefetching, isEmpty } = useUITableBodyContext();\n if (isEmpty || isFetching || isRefetching) return null;\n return (\n <tbody slot=\"table-body\" style={{ height }} className={cn(tableBodyVariants(), className)} {...props}>\n {children}\n </tbody>\n );\n});\nUITableBody.displayName = 'UITableBody';\n","'use client';\nimport { memo, useEffect, useMemo, useRef } from 'react';\n\nimport { flexRender } from '@tanstack/react-table';\n\nimport type { AnyEntity } from '@/types';\n\nimport { useUITableInnerTableContext } from '../../hooks/use-context';\nimport type { TUITableCell } from '../../types';\nimport { tableCellInnerVariants, tableCellVariants } from '../table.variants';\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<HTMLTableElement | null>(null);\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 tableRef.current = document.querySelector(`table[id=\"${innerTableId}\"]`);\n }, [innerTableId]);\n\n useEffect(() => {\n if (!cellRef.current) return;\n\n const width = cellRef.current.scrollWidth;\n const currentSize = column?.getSize();\n\n if (currentSize != null && 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]);\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={{ left, right, width, minWidth: minSize, maxWidth: maxSize }}\n className={tableCellVariants({ isPinned: isPinned || undefined, isLastCell, isFirstCell })}\n {...props}\n >\n <div ref={cellRef} slot=\"table-body-cell-inner\" className={tableCellInnerVariants({ position })}>\n {render}\n </div>\n </td>\n );\n }\n);\nUITableCell.displayName = 'UITableCell';\n","'use client';\nimport { memo, useMemo } from 'react';\n\nimport { flexRender } from '@tanstack/react-table';\n\nimport type { TUITableCellActions } from '../../types';\nimport { tableCellActionsVariants } from '../table.variants';\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 data-col=\"actions\" data-cell={virtualRowIndex} className={tableCellActionsVariants()} {...props}>\n {render}\n </td>\n );\n});\nUITableCellActions.displayName = 'UITableCellActions';\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","'use client';\nimport { memo, useCallback } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Checkbox } from '@/components/ui/checkbox';\n\nimport { PINNED_COLUMN_Z_INDEX, SELECT_WIDTH } from '../../constants';\nimport type { TUITableCellSelect } from '../../types';\nimport { tableCellSelectVariants } from '../table.variants';\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(tableCellSelectVariants({ isPinned }), 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","'use client';\nimport { memo } from 'react';\n\nimport { BoxIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { useUITableContext } from '../../hooks/use-context';\nimport type { TUITableEmptyDisplay } from '../../types';\nimport {\n tableBodyVariants,\n tableCellActionsVariants,\n tableCellInnerVariants,\n tableCellSelectVariants,\n tableCellVariants,\n tableEmptyDisplayVariants,\n tableRowVariants,\n} from '../table.variants';\nimport { PINNED_COLUMN_Z_INDEX, SELECT_WIDTH } from '../../constants';\nimport type { AnyEntity } from '@/types';\n\nexport const UITableLoadingDisplay = memo<TUITableEmptyDisplay>(() => {\n const { table, isFetching, isRefetching, loadingDisplayRow = 3 } = useUITableContext();\n if (!isFetching && !isRefetching) return null;\n return (\n <tbody className={cn(tableBodyVariants(), 'pointer-events-none')}>\n {Array.from({ length: loadingDisplayRow }).map((_, index) => (\n <tr key={index} data-slot=\"table-row\" data-index={index} className={cn(tableRowVariants(), 'animate-pulse relative!')}>\n {table.getAllColumns().map((column, _index) => {\n const isPinned = column.getIsPinned();\n const leftAxis = column.getStart('left');\n const rightAxis = column.getAfter('right');\n if (column.id === 'actions') {\n return (\n <td\n key={`${column.id}-${_index}`}\n data-slot=\"table-body-cell\"\n data-col={column.id}\n data-cell={_index}\n style={{\n width: 60,\n }}\n className={tableCellActionsVariants()}\n >\n <div className=\"w-full h-4 bg-muted-muted rounded-full\" />\n </td>\n );\n }\n if (column.id === 'select') {\n return (\n <td\n key={`${column.id}-${index}`}\n data-slot=\"table-body-cell\"\n data-col={column.id}\n data-cell={_index}\n data-pinned={true}\n style={{\n left: 0,\n zIndex: 20,\n width: SELECT_WIDTH,\n maxWidth: SELECT_WIDTH,\n }}\n className={tableCellSelectVariants({ isPinned: 'left' })}\n >\n <div className=\"w-full flex justify-center\">\n <div className=\"size-4 bg-muted-muted rounded-full\" />\n </div>\n </td>\n );\n }\n return (\n <td\n key={`${column.id}-${_index}`}\n data-col={column.id}\n data-cell={_index}\n data-selected={undefined}\n data-lastcell={column.id === table.getAllColumns()[table.getAllColumns().length - 1].id || undefined}\n data-firstcell={column.id === table.getAllColumns()[0].id || undefined}\n style={{\n zIndex: isPinned ? PINNED_COLUMN_Z_INDEX : 0,\n left: isPinned === 'left' && typeof leftAxis === 'number' ? `${leftAxis}px` : undefined,\n right: isPinned === 'right' && typeof rightAxis === 'number' ? `${rightAxis}px` : undefined,\n width: `calc(var(--col-${column.id}-size) * 1px)`,\n minWidth: column.columnDef.minSize ? `calc(var(--col-${column.id}-minSize) * 1px)` : undefined,\n maxWidth: column.columnDef.maxSize ? `calc(var(--col-${column.id}-maxSize) * 1px)` : undefined,\n }}\n className={tableCellVariants({\n isPinned: column.getIsPinned(),\n isFirstCell: column.id === table.getRightHeaderGroups()[0]?.headers[0]?.id,\n isLastCell: column.id === table.getLeftHeaderGroups()[0]?.headers[table.getLeftHeaderGroups()[0].headers.length - 1]?.id,\n })}\n >\n <div\n className={tableCellInnerVariants({\n position: (column.columnDef.meta as AnyEntity)?.position ?? 'start',\n })}\n >\n <div className=\"w-full h-4 bg-muted-muted rounded-full\" />\n </div>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n );\n});\n\nexport const UITableEmptyDisplay = memo<TUITableEmptyDisplay>(() => {\n const { isEmpty, emptyDisplayHeight } = useUITableContext();\n if (!isEmpty) return null;\n return (\n <>\n {isEmpty && (\n <div className={tableEmptyDisplayVariants()} style={{ minHeight: emptyDisplayHeight ?? '24rem' }}>\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 </div>\n )}\n </>\n );\n});\nUITableEmptyDisplay.displayName = 'UITableEmptyDisplay';\n","'use client';\nimport { memo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport type { TUITableFooter } from '../../types';\nimport { tableFooterVariants } from '../table.variants';\n\nexport const UITableFooter = memo<TUITableFooter>(({ className, children, ...props }) => {\n return (\n <tfoot slot=\"table-footer\" className={cn(tableFooterVariants(), className)} {...props}>\n {children}\n </tfoot>\n );\n});\nUITableFooter.displayName = 'UITableFooter';\n","'use client';\nimport { memo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport type { TUITableHead } from '../../types';\nimport { tableHeadVariants } from '../table.variants';\n\nexport const UITableHead = memo<TUITableHead>(({ className, children, ...props }) => {\n return (\n <thead slot=\"table-head\" className={cn(tableHeadVariants(), className)} {...props}>\n {children}\n </thead>\n );\n});\nUITableHead.displayName = 'UITableHead';\n","'use client';\nimport { Activity, memo, useCallback } from 'react';\n\nimport { EllipsisVerticalIcon, MoveLeftIcon, MoveRightIcon, PinOffIcon } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu';\n\nimport type { TUITableHeadCellOption } from '../../types';\nimport { tableHeadCellOptionTriggerVariants } from '../table.variants';\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 type=\"button\" className={cn(tableHeadCellOptionTriggerVariants(), className)}>\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","'use client';\nimport { memo, useMemo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport type { AnyEntity } from '@/types';\n\nimport { PINNED_COLUMN_Z_INDEX } from '../../constants';\nimport type { TUITableHeadCell } from '../../types';\nimport { tableHeadCellVariants } from '../table.variants';\nimport { UITableHeadCellOption } from './head-cell-option';\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 position = (headerColumn?.columnDef.meta as AnyEntity)?.position as 'start' | 'center' | 'end' | undefined;\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\n return (\n <th\n slot=\"table-head-cell\"\n data-pinned={isPinned}\n data-header={headerId}\n style={{ zIndex, left, right, width, minWidth: minSize, maxWidth: maxSize }}\n className={cn(\n tableHeadCellVariants({\n isPinned: isPinned || 'false',\n isActions: headerId === 'actions',\n isLastCell,\n isFirstCell,\n position,\n }),\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","'use client';\nimport { memo, useCallback } from 'react';\n\nimport { Checkbox } from '@/components/ui/checkbox';\n\nimport { SELECT_WIDTH, TABLE_HEADER_Z_INDEX } from '../../constants';\nimport type { TUITableHeadCellSelect } from '../../types';\nimport { tableCellSelectVariants } from '../table.variants';\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={tableCellSelectVariants({ isPinned })}\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","'use client';\nimport { memo } from 'react';\n\nimport { flexRender } from '@tanstack/react-table';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { useUITableHeadRowContext } from '../../hooks/use-context';\nimport type { TUITableHeadRow } from '../../types';\nimport { tableHeadRowVariants } from '../table.variants';\nimport { UITableHeadCell } from './head-cell';\nimport { UITableHeadCellSelect } from './head-cell-select';\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(tableHeadRowVariants(), 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","'use client';\nimport { memo, useEffect, useRef } from 'react';\n\nimport { ACTION_WIDTH, SELECT_WIDTH } from '../../constants';\nimport { useUITableInnerTableContext } from '../../hooks/use-context';\nimport type { TUITableInnerTable } from '../../types';\nimport { tableInnerTableVariants } from '../table.variants';\n\nexport const UITableInnerTable = memo<TUITableInnerTable>(({ children, ...props }) => {\n const { table, innerTableId, totalSize } = useUITableInnerTableContext();\n const tableRef = useRef<HTMLTableElement>(null);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: table element.\n useEffect(() => {\n if (!tableRef.current) return;\n\n const headers = table.getFlatHeaders();\n\n let rafId: number | undefined;\n const observer = new ResizeObserver(entries => {\n if (rafId !== undefined) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => {\n const entry = entries[0];\n if (!entry) return;\n const tableElement = entry.target;\n if (!(tableElement instanceof HTMLTableElement)) return;\n const tableContentRectWidth = entry.contentRect.width;\n\n const { left: leftColumnPinning = [], right: rightColumnPinning = [] } = table.getState().columnPinning;\n\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 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 if (header.column.columnDef.size || size !== 150) {\n fixedSizeTotal += size;\n return { id, isFlex: false, width: size };\n }\n\n flexibleColumnsCount++;\n return { id, isFlex: true, maxSize };\n });\n\n const remainingWidth = tableContentRectWidth - pinnedWidth - fixedSizeTotal;\n const rawFlexWidth = flexibleColumnsCount > 0 ? Math.max(0, Math.floor(remainingWidth / flexibleColumnsCount)) : 0;\n\n columnSpecs.forEach(col => {\n if (col.isFlex) {\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 observer.observe(tableRef.current);\n return () => {\n if (rafId !== undefined) cancelAnimationFrame(rafId);\n observer.disconnect();\n };\n }, [table.getState().columnSizingInfo, table.getState().columnSizing, table.getState().columnPinning]);\n\n return (\n <table id={innerTableId} ref={tableRef} slot=\"table-inner-table\" className={tableInnerTableVariants()} style={{ minWidth: totalSize }} {...props}>\n {children}\n </table>\n );\n});\nUITableInnerTable.displayName = 'UITableInnerTable';\n","'use client';\nimport { memo } from 'react';\n\nimport { useUITableInnerWrapperContext } from '../../hooks/use-context';\nimport type { TUITableInnerWrapper } from '../../types';\nimport { tableInnerWrapperVariants } from '../table.variants';\n\nexport const UITableInnerWrapper = memo<TUITableInnerWrapper>(({ children, ...props }) => {\n const { innerWrapperId } = useUITableInnerWrapperContext();\n return (\n <div id={innerWrapperId} slot=\"table-inner-wrapper\" className={tableInnerWrapperVariants()} {...props}>\n {children}\n </div>\n );\n});\nUITableInnerWrapper.displayName = 'UITableInnerWrapper';\n","'use client';\nimport { memo, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { AlertTriangle, ChevronDown } from 'lucide-react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport { Spinner } from '@/components/ui/spinner';\n\nimport { useUITableInnerWrapperContext } from '../../hooks/use-context';\nimport type { TUITableLoadMore } from '../../types';\nimport { tableLoadMoreButtonVariants } from '../table.variants';\n\nexport const UITableLoadMore = memo<TUITableLoadMore>(({ virtualRowIndex, virtualRowStart, fetchMoreData }) => {\n const { innerWrapperId } = useUITableInnerWrapperContext();\n\n const tableWrapperRef = useRef<Element | null>(null);\n const rowRef = useRef<HTMLTableRowElement>(null);\n\n const [fetchingState, setFetchingState] = useState<'idle' | 'fetching' | 'error'>('idle');\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 }\n }, [fetchMoreData]);\n\n useEffect(() => {\n tableWrapperRef.current = document.querySelector(`div[id=\"${innerWrapperId}\"]`);\n if (!tableWrapperRef.current) return;\n\n const observer = new ResizeObserver(entries => {\n setWidth(entries[0].contentRect.width);\n });\n\n observer.observe(tableWrapperRef.current);\n return () => observer.disconnect();\n }, [innerWrapperId]);\n\n if (!fetchMoreData) return null;\n\n return (\n <tr ref={rowRef} data-index={virtualRowIndex} style={{ transform: `translateY(${virtualRowStart}px)`, width }} className=\"sticky! left-0 h-10\">\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={tableLoadMoreButtonVariants({ state: fetchingState })}\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 { memo, useCallback, useMemo } from 'react';\n\nimport type { AnyEntity } from '@/types';\n\nimport { useUITableRowContext } from '../../hooks/use-context';\nimport type { TUITableRow } from '../../types';\nimport { tableRowVariants } from '../table.variants';\nimport { UITableCell } from './cell';\nimport { UITableCellActions } from './cell-actions';\nimport { UITableCellSelect } from './cell-select';\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\n return (\n <tr\n slot=\"table-row\"\n data-index={virtualRowIndex}\n style={{ transform: `translateY(${virtualRowStart}px)` }}\n className={tableRowVariants()}\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","'use client';\nimport { memo } from 'react';\n\nimport { cn } from '@customafk/react-toolkit/utils';\n\nimport type { TUITableWrapper } from '../../types';\nimport { tableWrapperVariants } from '../table.variants';\n\nexport const UITableWrapper = memo<TUITableWrapper>(({ className, children, ...props }) => {\n return (\n <div slot=\"table-wrapper\" className={cn(tableWrapperVariants(), className)} {...props}>\n {children}\n </div>\n );\n});\nUITableWrapper.displayName = 'UITableWrapper';\n","'use client';\nimport { useMemo, useRef } from 'react';\n\nimport { useVirtualizer } from '@tanstack/react-virtual';\n\nimport { ResizableHandle, 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';\nimport { UITableLoadingDisplay } from './commons/empty-display';\n\nexport const UITableContainer: React.FC<React.PropsWithChildren> = ({ children }) => {\n const { table, fetchMoreData } = useUITableContext();\n const { rowSelectionState } = useUITableBodyContext();\n\n const tableContainerRef = useRef<HTMLDivElement | null>(null);\n\n const { rows } = table.getRowModel();\n\n // Keep the row virtualizer in the lowest component possible to avoid unnecessary re-renders.\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n // Only add the extra load-more slot when pagination is active; otherwise the\n // virtualizer allocates a phantom 40 px gap at the bottom of every table.\n count: rows.length + (fetchMoreData ? 1 : 0),\n estimateSize: () => 40,\n getScrollElement: () => tableContainerRef.current,\n // Measure dynamic row height, except in Firefox which measures table border height incorrectly.\n measureElement:\n typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') === -1 ? element => element?.getBoundingClientRect().height : undefined,\n overscan: 2,\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 `${Math.max(totalSize, containerHeight)}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\n // Load-more sentinel: row is undefined when index === rows.length.\n // Guard isSelected here to avoid matching rowSelectionState[\"undefined\"].\n if (!row && fetchMoreData) {\n return (\n <UITableLoadMore key={virtualRow.key} virtualRowIndex={virtualRow.index} virtualRowStart={virtualRow.start} fetchMoreData={fetchMoreData} />\n );\n }\n\n // O(1) lookup; TanStack row ids are already strings.\n const isSelected = rowSelectionState[row.id] === true;\n\n return (\n <UITableRow\n key={virtualRow.key}\n ref={rowVirtualizer.measureElement}\n row={row}\n isSelected={isSelected}\n virtualRowIndex={virtualRow.index}\n virtualRowStart={virtualRow.start}\n />\n );\n })}\n </UITableBody>\n <UITableLoadingDisplay />\n </UITableInnerTable>\n <UITableEmptyDisplay />\n </UITableInnerWrapper>\n </ResizablePanel>\n {children && (\n <>\n <ResizableHandle />\n {children}\n </>\n )}\n </ResizablePanelGroup>\n );\n};\n","/**\n * @file filter.tsx\n * Collapsible side-panel with column-visibility toggles and a dynamic filter builder.\n *\n * - \"Columns\" tab: toggle individual column visibility.\n * - \"Filters\" tab: \"Add Filter\" dropdown → active filter chips → per-filter Popover editor.\n */\nimport { Activity, useState } from 'react';\n\nimport { CalendarIcon, HashIcon, ListFilterIcon, ListFilterPlus, TagIcon, ToggleLeftIcon, Trash2Icon, TypeIcon } 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 { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu';\nimport { Input } from '@/components/ui/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';\nimport { ResizablePanel } from '@/components/ui/resizable';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';\nimport { Separator } from '@/components/ui/separator';\n\nimport { useUITableFilterContext } from '../../hooks/use-context';\nimport type {\n ActiveFilter,\n BooleanFilterValue,\n DateRangeFilterValue,\n FilterDefinition,\n FilterType,\n FilterValue,\n NumberFilterValue,\n SingleTagFilterValue,\n TagFilterValue,\n TextFilterValue,\n} from '../../types';\nimport { Label } from '@/components/ui/label';\n\n// ── icons per filter type ──────────────────────────────────────────────────────\n\nconst TYPE_ICONS: Record<FilterType, React.ReactNode> = {\n tag: <TagIcon size={14} />,\n 'single-tag': <TagIcon size={14} />,\n 'date-range': <CalendarIcon size={14} />,\n number: <HashIcon size={14} />,\n text: <TypeIcon size={14} />,\n boolean: <ToggleLeftIcon size={14} />,\n};\n\n// ── operator options ───────────────────────────────────────────────────────────\n\nconst NUMBER_OPERATORS: { value: NumberFilterValue['operator']; label: string }[] = [\n { value: 'eq', label: 'Equals (=)' },\n { value: 'ne', label: 'not equals (≠)' },\n { value: 'gt', label: 'greater than (>)' },\n { value: 'gte', label: 'At least (≥)' },\n { value: 'lt', label: 'less than (<)' },\n { value: 'lte', label: 'at most (≤)' },\n { value: 'between', label: 'Between' },\n];\n\nconst TEXT_OPERATORS: { value: TextFilterValue['operator']; label: string }[] = [\n { value: 'contains', label: 'Contains' },\n { value: 'equals', label: 'Equals' },\n { value: 'starts-with', label: 'Starts with' },\n { value: 'ends-with', label: 'Ends with' },\n];\n\n// ── summary label ──────────────────────────────────────────────────────────────\n\nfunction formatFilterValue(value: FilterValue, def: FilterDefinition): string {\n switch (value.type) {\n case 'single-tag': {\n if (!value.value) return 'Unset';\n return def.options?.find(o => o.value === value.value)?.label ?? value.value;\n }\n case 'tag': {\n if (!value.values.length) return 'Unset';\n return value.values.map(v => def.options?.find(o => o.value === v)?.label ?? v).join(', ');\n }\n case 'date-range': {\n if (!value.from && !value.to) return 'Unknow date';\n if (value.from && value.to) return `${value.from} → ${value.to}`;\n if (value.from) return `from ${value.from}`;\n return `until ${value.to}`;\n }\n case 'number': {\n const op = { eq: '=', ne: '≠', gt: '>', gte: '≥', lt: '<', lte: '≤', between: 'between' }[value.operator];\n if (value.value === undefined) return op;\n if (value.operator === 'between') return `${op} ${value.value} – ${value.valueTo ?? '?'}`;\n return `${op} ${value.value}`;\n }\n case 'text': {\n const op = {\n contains: 'contains',\n equals: 'is',\n 'starts-with': 'starts with',\n 'ends-with': 'ends with',\n }[value.operator];\n return value.value ? `${op} \"${value.value}\"` : op;\n }\n case 'boolean':\n if (value.value === null) return 'Unknow';\n return value.value ? 'Yes' : 'No';\n }\n}\n\n// ── filter editors ─────────────────────────────────────────────────────────────\n\nconst TagFilterEditor: React.FC<{\n value: TagFilterValue;\n definition: FilterDefinition;\n onChange: (v: TagFilterValue) => void;\n}> = ({ value, definition, onChange }) => (\n <div className=\"flex flex-col gap-1 p-3\">\n {(definition.options ?? []).length === 0 ? (\n <p className=\"text-xs text-text-positive-muted\">No options defined</p>\n ) : (\n definition.options!.map(option => (\n <Label\n key={option.value}\n className={cn(\n 'flex items-center gap-2 bg-secondary-bg-subtle hover:bg-secondary-muted px-4 py-2 rounded transition-colors',\n value.values.includes(option.value) && 'bg-primary-muted hover:bg-primary-subtle'\n )}\n >\n <Checkbox\n checked={value.values.includes(option.value)}\n onCheckedChange={checked => {\n const next = checked ? [...value.values, option.value] : value.values.filter(v => v !== option.value);\n onChange({ type: 'tag', values: next });\n }}\n />\n <span className=\"text-sm\">{option.label}</span>\n </Label>\n ))\n )}\n </div>\n);\n\nconst SingleTagFilterEditor: React.FC<{\n value: SingleTagFilterValue;\n definition: FilterDefinition;\n onChange: (v: SingleTagFilterValue) => void;\n}> = ({ value, definition, onChange }) => (\n <div className=\"flex flex-col gap-1 p-3\">\n {(definition.options ?? []).length === 0 ? (\n <p className=\"text-xs text-text-positive-muted\">No options defined</p>\n ) : (\n definition.options!.map(option => (\n <Label\n key={option.value}\n className={cn(\n 'flex items-center gap-2 bg-secondary-bg-subtle hover:bg-secondary-muted px-4 py-2 rounded transition-colors',\n value.value === option.value && 'bg-primary-muted hover:bg-primary-subtle'\n )}\n >\n <Checkbox\n checked={value.value === option.value}\n onCheckedChange={checked => {\n onChange({ type: 'single-tag', value: checked ? option.value : null });\n }}\n />\n <span className=\"text-sm\">{option.label}</span>\n </Label>\n ))\n )}\n </div>\n);\n\nconst DateRangeFilterEditor: React.FC<{\n value: DateRangeFilterValue;\n onChange: (v: DateRangeFilterValue) => void;\n}> = ({ value, onChange }) => (\n <div className=\"flex flex-col gap-3 p-3\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xs text-text-positive-muted\">From</span>\n <Input type=\"date\" size=\"md\" value={value.from ?? ''} onValueChange={v => onChange({ ...value, from: v || undefined })} />\n </div>\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xs text-text-positive-muted\">To</span>\n <Input type=\"date\" size=\"md\" value={value.to ?? ''} onValueChange={v => onChange({ ...value, to: v || undefined })} />\n </div>\n </div>\n);\n\nconst NumberFilterEditor: React.FC<{\n value: NumberFilterValue;\n onChange: (v: NumberFilterValue) => void;\n}> = ({ value, onChange }) => (\n <div className=\"flex flex-col gap-3 p-3\">\n <Select value={value.operator} onValueChange={op => onChange({ ...value, operator: op as NumberFilterValue['operator'] })}>\n <SelectTrigger size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {NUMBER_OPERATORS.map(op => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Input\n type=\"number\"\n size=\"md\"\n placeholder=\"Value\"\n value={value.value ?? ''}\n onValueChange={v => onChange({ ...value, value: v ? Number(v) : undefined })}\n />\n {value.operator === 'between' && (\n <Input\n type=\"number\"\n size=\"md\"\n placeholder=\"To value\"\n value={value.valueTo ?? ''}\n onValueChange={v => onChange({ ...value, valueTo: v ? Number(v) : undefined })}\n />\n )}\n </div>\n);\n\nconst TextFilterEditor: React.FC<{\n value: TextFilterValue;\n onChange: (v: TextFilterValue) => void;\n}> = ({ value, onChange }) => (\n <div className=\"flex flex-col gap-3 p-3\">\n <Select value={value.operator} onValueChange={op => onChange({ ...value, operator: op as TextFilterValue['operator'] })}>\n <SelectTrigger size=\"sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TEXT_OPERATORS.map(op => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Input type=\"text\" size=\"md\" placeholder=\"Enter text...\" value={value.value} onValueChange={v => onChange({ ...value, value: v })} />\n </div>\n);\n\nconst BOOLEAN_OPTIONS = [\n { label: 'Yes', value: true as boolean | null },\n { label: 'No', value: false as boolean | null },\n { label: 'Unknow', value: null as boolean | null },\n];\n\nconst BooleanFilterEditor: React.FC<{\n value: BooleanFilterValue;\n onChange: (v: BooleanFilterValue) => void;\n}> = ({ value, onChange }) => (\n <div className=\"flex flex-col gap-1 p-3\">\n {BOOLEAN_OPTIONS.map(({ label, value: v }) => (\n <Button\n key={label}\n type=\"button\"\n tabIndex={-1}\n variant=\"outline\"\n className={cn(\n 'rounded px-3 py-1.5 text-left text-sm transition-colors',\n value.value === v ? 'bg-primary-muted font-medium' : 'hover:bg-muted-bg-subtle'\n )}\n onClick={() => onChange({ type: 'boolean', value: v })}\n >\n {label}\n </Button>\n ))}\n </div>\n);\n\nfunction FilterEditor({ value, definition, onChange }: { value: FilterValue; definition: FilterDefinition; onChange: (v: FilterValue) => void }) {\n switch (value.type) {\n case 'tag':\n return <TagFilterEditor value={value} definition={definition} onChange={onChange} />;\n case 'single-tag':\n return <SingleTagFilterEditor value={value} definition={definition} onChange={onChange} />;\n case 'date-range':\n return <DateRangeFilterEditor value={value} onChange={onChange} />;\n case 'number':\n return <NumberFilterEditor value={value} onChange={onChange} />;\n case 'text':\n return <TextFilterEditor value={value} onChange={onChange} />;\n case 'boolean':\n return <BooleanFilterEditor value={value} onChange={onChange} />;\n }\n}\n\n// ── filter item chip ───────────────────────────────────────────────────────────\n\nconst FilterItem: React.FC<{\n filter: ActiveFilter;\n definition: FilterDefinition;\n onRemove: () => void;\n onUpdate: (value: FilterValue) => void;\n}> = ({ filter, definition, onRemove, onUpdate }) => (\n <div className=\"flex items-center gap-1\">\n <Popover>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n color=\"muted\"\n className=\"flex-1 bg-white max-w-[calc(100%-32px)] justify-start\"\n innerClassName=\"flex truncate gap-1.5\"\n >\n <span className=\"shrink-0 text-text-positive font-medium\">{definition.label}</span>\n <span className=\"truncate text-xs text-text-positive-weak\">{formatFilterValue(filter.value, definition)}</span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-64 p-0\" align=\"start\" side=\"bottom\">\n <div className=\"border-b border-border px-3 py-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-text-positive-muted\">{TYPE_ICONS[definition.type]}</span>\n <p className=\"font-medium\">{definition.label}</p>\n </div>\n </div>\n <FilterEditor value={filter.value} definition={definition} onChange={onUpdate} />\n </PopoverContent>\n </Popover>\n <Button type=\"button\" size=\"icon\" variant=\"soft\" color=\"danger\" className=\"shrink\" onClick={onRemove}>\n <Trash2Icon size={13} />\n </Button>\n </div>\n);\n\n// ── column visibility row ──────────────────────────────────────────────────────\n\n// const ColumnVisibility: React.FC<{\n// checked: boolean;\n// title: string;\n// onCheckedChange?: (checked: boolean) => void;\n// }> = ({ checked, title, onCheckedChange }) => (\n// <Label>\n// <Checkbox checked={checked} onCheckedChange={onCheckedChange} />\n// <p className=\"text-sm\">{title}</p>\n// </Label>\n// );\n\n// ── main component ─────────────────────────────────────────────────────────────\n\n/**\n * Collapsible side-panel that lets users toggle column visibility and build\n * 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.\n *\n * Wire filter capability by passing `filterDefinitions` and `onFilterChange` to\n * the parent `UITableProvider`.\n *\n * @example\n * ```tsx\n * <UITableProvider\n * filterDefinitions={[\n * { id: 'status', label: 'Status', type: 'tag', options: [{ label: 'Active', value: 'active' }] },\n * { id: 'created', label: 'Created At', type: 'date-range' },\n * { id: 'amount', label: 'Amount', type: 'number' },\n * ]}\n * onFilterChange={filters => console.log(filters)}\n * >\n * <ResizablePanelGroup direction=\"horizontal\">\n * <ResizablePanel><UITable /></ResizablePanel>\n * <ResizableHandle />\n * <UITableFilter />\n * </ResizablePanelGroup>\n * </UITableProvider>\n * ```\n */\nexport const UITableFilter = () => {\n // const { table } = useUITableContext();\n const { filterDefinitions, activeFilters, addFilter, removeFilter, updateFilter } = useUITableFilterContext();\n\n const [tab, setTab] = useState<'columns' | 'filters' | null>(null);\n\n const availableDefinitions = filterDefinitions.filter(def => !activeFilters.some(f => f.definitionId === def.id));\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=\"min-w-0 flex-1 overflow-hidden\">\n {/* Columns tab */}\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\n {/* Filters tab */}\n <Activity mode={tab === 'filters' ? 'visible' : 'hidden'}>\n <div className=\"flex size-full flex-col gap-2 p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"font-medium\">Filters</p>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" color=\"muted\" disabled={availableDefinitions.length === 0}>\n <ListFilterPlus size={13} />\n Add Filter\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {availableDefinitions.map(def => (\n <DropdownMenuItem key={def.id} className=\"flex items-center gap-2\" onClick={() => addFilter(def.id)}>\n {TYPE_ICONS[def.type]}\n {def.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n <Separator />\n {activeFilters.length === 0 ? (\n <p className=\"py-6 text-center text-xs text-text-positive-muted\">No active filters</p>\n ) : (\n <div className=\"flex flex-col gap-2 pt-1\">\n {activeFilters.map(filter => {\n const def = filterDefinitions.find(d => d.id === filter.definitionId);\n if (!def) return null;\n return (\n <FilterItem\n key={filter.id}\n filter={filter}\n definition={def}\n onRemove={() => removeFilter(filter.id)}\n onUpdate={value => updateFilter(filter.id, value)}\n />\n );\n })}\n </div>\n )}\n </div>\n </Activity>\n </div>\n\n {/* Vertical tab strip */}\n <div className=\"flex h-full flex-col border-l border-border bg-muted-bg-subtle text-sm\">\n {/*<button\n type=\"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 type=\"button\"\n className={cn('relative 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 {activeFilters.length > 0 && (\n <span className=\"absolute top-2 right-1.5 flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[10px] leading-none text-primary-foreground\">\n {activeFilters.length}\n </span>\n )}\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 TableFilterContext,\n TableHeadRowContext,\n TableInnerTableContext,\n TableInnerWrapperContext,\n TableRowContext,\n} from '../../hooks/use-context';\nimport type {\n ActiveFilter,\n FilterDefinition,\n FilterType,\n FilterValue,\n RowData,\n TableProviderProps,\n TTableBodyContext,\n TTableContext,\n TTableFilterContext,\n TTableHeadRowContext,\n TTableInnerTableContext,\n TTableInnerWrapperContext,\n TTableRowContext,\n TUITableColumn,\n} from '../../types';\n\nfunction createDefaultFilterValue(type: FilterType): FilterValue {\n switch (type) {\n case 'tag':\n return { type: 'tag', values: [] };\n case 'single-tag':\n return { type: 'single-tag', value: null };\n case 'date-range':\n return { type: 'date-range' };\n case 'number':\n return { type: 'number', operator: 'eq' };\n case 'text':\n return { type: 'text', operator: 'contains', value: '' };\n case 'boolean':\n return { type: 'boolean', value: null };\n }\n}\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, isRefetching, isEmpty, rowSelectionState, children }) => {\n const value = useMemo<TTableBodyContext>(() => ({ isFetching, isRefetching, 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 isLoading = false,\n loadingDisplayRow = 3,\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 emptyDisplayHeight,\n csvData,\n csvFileName,\n\n filterDefinitions = [],\n onFilterChange,\n\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 const [activeFilters, setActiveFilters] = useState<ActiveFilter[]>([]);\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 addFilter = useCallback(\n (definitionId: string) => {\n const def = (filterDefinitions as FilterDefinition[]).find(d => d.id === definitionId);\n if (!def) return;\n const newFilter: ActiveFilter = {\n id: `${definitionId}-${crypto.randomUUID()}`,\n definitionId,\n value: createDefaultFilterValue(def.type),\n };\n setActiveFilters(prev => {\n const next = [...prev, newFilter];\n onFilterChange?.(next);\n return next;\n });\n },\n [filterDefinitions, onFilterChange]\n );\n\n const removeFilter = useCallback(\n (filterId: string) => {\n setActiveFilters(prev => {\n const next = prev.filter(f => f.id !== filterId);\n onFilterChange?.(next);\n return next;\n });\n },\n [onFilterChange]\n );\n\n const updateFilter = useCallback(\n (filterId: string, value: FilterValue) => {\n setActiveFilters(prev => {\n const next = prev.map(f => (f.id === filterId ? { ...f, value } : f));\n onFilterChange?.(next);\n return next;\n });\n },\n [onFilterChange]\n );\n\n const filterContextValue = useMemo<TTableFilterContext>(\n () => ({\n filterDefinitions: filterDefinitions as FilterDefinition[],\n activeFilters,\n addFilter,\n removeFilter,\n updateFilter,\n }),\n [filterDefinitions, activeFilters, addFilter, removeFilter, updateFilter]\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 && !isRefetching && rows.length === 0;\n }, [rows, isFetching, isRefetching]);\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 isLoading,\n loadingDisplayRow,\n\n totalRows,\n\n fetchMoreData,\n emptyDisplayHeight,\n\n csvData,\n csvFileName,\n }),\n [\n title,\n table,\n\n isEmpty,\n isRefetching,\n isFetching,\n isLoading,\n loadingDisplayRow,\n\n totalRows,\n\n fetchMoreData,\n emptyDisplayHeight,\n table.getState().columnPinning,\n table.getState().expanded,\n\n csvData,\n csvFileName,\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 <TableFilterContext.Provider value={filterContextValue}>\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} isRefetching={isRefetching} 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 </TableFilterContext.Provider>\n );\n};\n","'use client';\n\nimport type { CsvCell } from '../types';\n\nfunction formatCell(value: CsvCell['value']): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n const str = String(value);\n if (str.includes(',') || str.includes('\"') || str.includes('\\n') || str.includes('\\r')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\n\nexport function buildCsvContent(rows: CsvCell[][]): string {\n if (rows.length === 0) return '';\n const headers = rows[0].map(cell => formatCell(cell.label));\n const dataRows = rows.map(row => row.map(cell => formatCell(cell.value)).join(','));\n return [headers.join(','), ...dataRows].join('\\n');\n}\n\nexport function downloadCsv(rows: CsvCell[][], fileName: string): void {\n const content = buildCsvContent(rows);\n if (!content) return;\n const blob = new Blob([content], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `${fileName}.csv`;\n link.click();\n URL.revokeObjectURL(url);\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 { useCallback } from 'react';\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';\nimport { downloadCsv } from '../../utils/csv';\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 inset-s-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 inset-e-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 const { table, csvData, csvFileName, title } = useUITableContext();\n\n const handleDownload = useCallback(() => {\n if (onDownload) {\n onDownload();\n return;\n }\n if (!csvData || csvData.length === 0) return;\n const selectedRows = table.getSelectedRowModel().flatRows;\n const rows = selectedRows.length > 0 ? selectedRows.map(row => csvData[row.index]).filter(Boolean) : csvData;\n downloadCsv(rows, csvFileName || title);\n }, [onDownload, csvData, csvFileName, table, title]);\n\n const isDownloadEnabled = !!(onDownload || (csvData && csvData.length > 0));\n\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={!isDownloadEnabled}\n onClick={e => {\n handleDownload();\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":"4gEAWA,MAAaA,MAET,EAAC,MAAA,CAAI,UAAU,+CACb,EAAC,GAAA,CAAU,KAAM,GAAA,CAAM,CACvB,EAAC,GAAA,CAAU,KAAM,GAAA,CAAM,CAAA,EACnB,CCEGC,IAOP,CAAE,QAAO,UAAS,cACjB,EACD,EAEA,EAAC,MAAA,CACC,UAAU,6GACV,QAAS,GAAK,CACZ,KAAW,CACX,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,YAGnB,EACD,EAAC,SAAA,CACC,UAAU,yEACV,QAAS,GAAK,CACZ,KAAY,CACZ,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,WAGpB,EAAC,GAAA,CAAM,KAAM,GAAA,CAAM,EACZ,CAAA,EACL,CAIR,EAAC,SAAA,CACC,UAAU,yFACV,QAAS,GAAK,CACZ,KAAW,CACX,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,WAGnB,GACM,CAnCQ,EAAC,EAAA,EAAA,CAAe,CCZxBC,IAGP,CAAE,WACF,GAAU,KAAoC,EAAC,EAAA,EAAA,CAAe,CAC9D,IAAU,GAEV,EAAC,MAAA,CAAI,UAAU,8BACb,EAAC,GAAA,EAAA,CAAQ,EACL,CAIR,EAAC,MAAA,CAAI,UAAU,+BACb,EAAC,EAAA,EAAA,CAAY,EACT,CCSG,GAAyB,GAAM,CAAE,QAAO,WAAW,MAAO,SAAS,QAAS,UAAU,SAAU,OAAO,KAAM,WAAW,MAAmB,CACtJ,IAAM,EAAY,MAAc,CAC9B,IAAM,EAAM,OAAO,GAAU,SAAW,OAAO,EAAM,MAAM,CAAC,CAAG,EAG/D,OAFI,GAAQ,MAA6B,OAAO,MAAM,EAAI,EAAI,CAAC,OAAO,SAAS,EAAI,CAAS,KAErF,IAAI,KAAK,aAAa,EAAQ,CACnC,MAAO,WACP,WACA,gBAAiB,EACjB,sBAAuB,EACvB,sBAAuB,EACxB,CAAC,CAAC,OAAO,EAAI,EACb,CAAC,EAAO,EAAU,EAAQ,EAAQ,CAAC,CAEhC,EAAa,MAAc,CAC/B,IAAM,EAAM,OAAO,GAAU,SAAW,OAAO,EAAM,MAAM,CAAC,CAAG,EAC/D,OAAO,OAAO,GAAQ,UAAY,EAAM,GACvC,CAAC,EAAM,CAAC,CAIX,OAFK,EAGH,EAAC,IAAA,CACC,UAAW,EACT,2BACA,IAAS,MAAQ,UACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,YACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,UACjB,CAAC,GAAY,qBACb,GAAY,GAAc,qBAC1B,GAAY,CAAC,GAAc,sBAC5B,UAEA,GACC,CAjBiB,EAAC,EAAA,EAAA,CAAe,EAmBvC,CACF,GAAuB,YAAc,yBCvDrC,MAAaC,IAAuC,CAAE,UACzC,GAAiC,KAAa,EAAC,EAAA,EAAA,CAAe,CAEvE,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAe,QAAA,YACd,EAAC,EAAA,CAAM,UAAU,iBACf,EAAC,EAAA,CAAkB,OAAM,OAAO,SAAS,UAAU,0BAA2B,EACxE,EACO,CACjB,EAAC,EAAA,CAAe,UAAU,wBACxB,EAAC,EAAA,CAAkB,OAAM,OAAO,OAAO,SAAA,GAAS,UAAU,0CAA2C,EACtF,CAAA,CAAA,CACT,CAAA,CACM,CCrBTC,IAGP,CAAE,aACF,GAAqC,KAChC,EAAC,EAAA,EAAA,CAAe,CAGvB,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAU,QAAQ,KAAK,UAAU,sDAC/B,GACS,CAAA,CACG,CACjB,EAAC,EAAA,CAAe,MAAM,QAAQ,UAAU,wCACtC,EAAC,MAAA,CAAI,UAAU,kCACb,EAAC,EAAA,CAAU,QAAQ,KAAK,UAAU,4EAC/B,GACS,CACZ,EAAC,IAAA,CAAE,UAAU,4BAAmB,EAAQ,UAAU,CAAC,OAAO,SAAA,EAAU,CAAA,EAChE,EACS,CAAA,CAAA,CACT,CCTDC,IAAwC,CAAE,QAAO,WAAW,MAAW,CAClF,GAAM,CAAC,EAAQ,GAAa,EAAS,GAAM,CAa3C,OAXK,EAYH,EAAC,EAAA,CAAA,SACC,EAAC,MAAA,CAAI,UAAU,8CACb,EAAC,GAAA,CAAS,KAAM,GAAI,UAAU,oCAAqC,CAElE,EACC,EAAC,IAAA,CAAE,KAAM,UAAU,IAAS,UAAU,mEAAmE,QAAS,GAAK,EAAE,iBAAiB,UACvI,GACC,CAEJ,EAAC,OAAA,CAAK,UAAU,+CAAuC,GAAa,CAGtE,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAe,QAAA,YACd,EAAC,SAAA,CACC,QAzBQ,GAAwB,CAC1C,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,CAClB,UAAU,UAAU,UAAU,EAAM,CAAC,SAAW,CAC9C,EAAU,GAAK,CACf,eAAiB,EAAU,GAAM,CAAE,KAAK,EACxC,EAoBQ,UAAU,yIAET,EAAS,EAAC,EAAA,CAAU,KAAM,GAAI,UAAU,uBAAwB,CAAG,EAAC,EAAA,CAAS,KAAM,GAAA,CAAM,EACnF,EACM,CACjB,EAAC,EAAA,CAAA,SAAgB,EAAS,UAAY,aAAA,CAA8B,CAAA,CAAA,CAC5D,GACN,CAAA,CACU,CApCD,EAAC,EAAA,EAAA,CAAe,ECJxBC,IAAuC,CAAE,QAAO,aAAa,KAAQ,CAChF,GAAI,CAAC,GAAS,EAAM,SAAW,EAAG,OAAO,EAAC,EAAA,EAAA,CAAe,CAEzD,IAAM,EAAU,EAAM,MAAM,EAAG,EAAW,CACpC,EAAW,EAAM,MAAM,EAAW,CAExC,OACE,EAAC,MAAA,CAAI,UAAU,iCACZ,EAAQ,KAAK,EAAM,IAClB,EAAC,OAAA,CAAa,UAAU,2HACrB,GADQ,EAEJ,CACP,CAED,EAAS,OAAS,GACjB,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAe,QAAA,YACd,EAAC,OAAA,CAAK,UAAU,+HAAqH,IACjI,EAAS,OAAO,UACb,EACQ,CACjB,EAAC,EAAA,CAAe,MAAM,QAAQ,UAAU,6CACrC,EAAS,KAAK,EAAM,IACnB,EAAC,OAAA,CAAa,UAAU,6GACrB,GADQ,EAEJ,CACP,EACa,CAAA,CAAA,CACT,CAAA,CACM,CAAA,EAEhB,ECxCGC,IASP,CAAE,QAAQ,EAAE,IAEd,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAoB,QAAA,YACnB,EAAC,EAAA,CAAO,KAAK,KAAK,QAAQ,QAAQ,MAAM,YAAY,UAAU,+BAC5D,EAAC,GAAA,EAAA,CAAmB,EACb,EACW,CACtB,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAA,SACE,EAAM,IAAI,GACT,EAAC,EAAA,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,IAAkD,CAAE,UAC1D,EAEH,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAU,QAAQ,KAAK,UAAU,mEAC/B,GACS,CAAA,CACG,CACjB,EAAC,EAAA,CAAe,MAAM,QAAQ,UAAU,wCACtC,EAAC,MAAA,CAAI,UAAU,kCACb,EAAC,IAAA,CAAE,UAAU,oDAA4C,GAAS,CAClE,EAAC,IAAA,CAAE,UAAU,4BAAmB,EAAK,OAAO,SAAA,EAAU,CAAA,EAClD,EACS,CAAA,CAAA,CACT,CAdM,EAAC,EAAA,EAAA,CAAe,CCXvBC,IAKP,CAAE,OAAM,WAEV,EAAC,IAAA,CAAQ,OAAM,OAAO,SAAS,UAAU,yEAAyE,IAAI,gCACpH,EAAC,OAAA,CAAA,SAAM,GAAS,EAAA,CAAY,CAC5B,EAAC,GAAA,CAAiB,KAAM,GAAA,CAAM,CAAA,EAC5B,CCTKC,IAKR,CAAE,WAEH,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAe,QAAA,YACd,EAAC,IAAA,CAAE,UAAU,+DAAuD,EAAM,QAAQ,wBAAyB,aAAa,EAAK,EAC9G,CACjB,EAAC,EAAA,CAAe,MAAM,iBACpB,EAAC,IAAA,CAAE,UAAU,wBAAgB,EAAM,MAAM,EAAE,CAAC,QAAQ,wBAAyB,wBAAwB,EAAK,EAC3F,CAAA,CAAA,CACT,CCWD,GAAyB,GAAM,CAAE,QAAO,YAAY,GAAM,mBAAmB,GAAI,mBAAmB,MAAgB,CAC/H,GAAI,GAAU,KAA6B,OAAO,EAAC,EAAA,EAAA,CAAe,CAElE,IAAM,EAAU,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,EAAM,CAAC,CASjD,OACE,EAAC,MAAA,CAAI,UAAU,sDACb,EAAC,EAAA,CAAS,MAAO,EAAS,UAAW,EAAG,SAR1C,GAAW,EACP,gDACA,GAAW,EACT,gDACA,+CAI6D,EAAI,CACpE,GAAa,EAAC,OAAA,CAAK,UAAU,6FAAoF,EAAQ,IAAA,EAAQ,CAAA,EAC9H,EAER,CACF,GAAuB,YAAc,yBCrCrC,MAAaC,IAKP,CAAE,QAAO,aAUX,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAA,SACC,EAAC,EAAA,CAAO,KAAK,SAAS,QAAQ,QAAQ,MAAM,SAAS,KAAK,OAAO,QAXnD,EAClB,KAAM,IAAK,CACT,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,CACnB,MAAM,KAAW,EAEnB,CAAC,EAAQ,CACV,UAKO,EAAC,GAAA,EAAA,CAAa,EACP,CAAA,CACM,CACjB,EAAC,EAAA,CAAA,SACC,EAAC,IAAA,CAAA,SAAG,GAAS,8BAAA,CAAkC,CAAA,CAChC,CAAA,CAAA,CACT,CC5BR,IAAiB,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,GAA0B,GACpC,CACC,mBAAmB,IACnB,iBAAiB,IACjB,OAAQ,EACR,OAAQ,EACR,YACA,eAAe,QACf,oBAAoB,GACpB,OAAO,KACP,QAAQ,KACG,CAEX,IAAM,EAAgB,MAAwC,CAC5D,IAAMC,EAAoC,EAAE,CAS5C,OAPI,OAAO,GAAc,UAAY,GAAa,GAAK,IACrD,EAAQ,sBAAwB,GAGhC,EAAQ,sBAAwB,EAG3B,GACN,CAAC,EAAW,EAAkB,CAAC,CAE5B,EAAe,EAClB,GAAwB,CACvB,IAAI,EAAe,EAOnB,OAJI,OAAO,GAAc,UAAY,GAAa,IAChD,EAAe,GAAc,EAAK,EAAW,EAAa,EAGrD,EAAa,eAAe,QAAS,EAAc,EAE5D,CAAC,EAAc,EAAe,EAAU,CACzC,CAGK,EAAiB,MAAsB,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,EAAsB,MAEtB,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,EAC5D,EAAC,EAAA,EAAA,CAAe,CAIvB,EAAC,EAAA,CACC,QAAQ,OACR,UAAW,EACT,sDACA,IAAS,MAAQ,UACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,YACjB,IAAS,MAAQ,UACjB,IAAS,MAAQ,UAClB,WAEA,EACD,EAAC,IAAA,CAAA,SAAG,EAAA,CAAwB,CAC3B,IACI,EAGZ,CACD,GAAwB,YAAc,0BClItC,MAAaC,IAAyC,CAAE,QAAO,WAAU,eAAe,QAAS,UAAU,UACrG,GAAU,MAA+B,IAAU,GAAW,EAAC,EAAA,EAAA,CAAe,CAMhF,EAAC,EAAA,CAAe,UAAS,OAJA,GAAY,EAAS,KAAW,EAIlB,UAAU,8CAHrC,EAAM,OAAO,EAAE,CAAC,aAAa,CAAG,EAAM,MAAM,EAAE,CAAC,QAAQ,KAAM,IAAI,EAKrE,CCXCC,IAA2C,CAAE,OAAM,WAAU,WAEtE,EAAC,EAAA,CAAK,KAAM,GAAO,IAAI,KAAK,QAAQ,iBACjC,CAAC,GACA,EAAC,EAAA,CAAO,UAAU,+BAChB,EAAC,EAAA,CAAe,UAAU,yBACxB,EAAC,GAAA,CAAc,KAAM,GAAI,UAAU,sBAAuB,EAC3C,EACV,CAEV,GACC,EAAC,EAAA,CAAO,UAAU,+BAChB,EAAC,EAAA,CAAe,MAAO,CAAE,gBAAiB,GAAe,IAAI,EAAK,CAAE,UAClE,EAAC,GAAA,CAAc,KAAM,GAAI,UAAU,cAAe,EACnC,EACV,CAEX,EAAC,EAAA,CAAK,SAAA,GAAS,QAAQ,OAAO,IAAI,OAAO,MAAM,kBAC7C,EAAC,EAAA,CAAU,UAAU,uDAA+C,GAAY,gBAA2B,CAC3G,EAAC,EAAA,CAAU,QAAQ,KAAK,UAAU,iDAC/B,GACS,CAAA,EACP,GACF,CC3CE,GAA2B,EAAgD,KAAK,CAEhF,OAAsC,CACjD,IAAM,EAAM,EAAI,GAAyB,CACzC,GAAI,CAAC,EACH,MAAU,MAAM,8EAA8E,CAEhG,OAAO,GAGI,GAAyB,EAA8C,KAAK,CAE5E,OAAoC,CAC/C,IAAM,EAAM,EAAI,GAAuB,CACvC,GAAI,CAAC,EACH,MAAU,MAAM,0EAA0E,CAE5F,OAAO,GAGI,GAAsB,EAA2C,KAAK,CAEtE,OAAiC,CAC5C,IAAM,EAAM,EAAI,GAAoB,CACpC,GAAI,CAAC,EACH,MAAU,MAAM,wEAAwE,CAE1F,OAAO,GAGI,GAAmB,EAAwC,KAAK,CAEhE,OAA8B,CACzC,IAAM,EAAM,EAAI,GAAiB,CACjC,GAAI,CAAC,EACH,MAAU,MAAM,8DAA8D,CAEhF,OAAO,GAGI,GAAkB,EAA6D,KAAK,CAEpF,OAA6B,CACxC,IAAM,EAAM,EAAI,GAAgB,CAChC,GAAI,CAAC,EACH,MAAU,MAAM,4DAA4D,CAE9E,OAAO,GAGI,GAAe,EAA+C,KAAK,CAEnE,MAA0B,CACrC,IAAM,EAAU,EAAI,GAAa,CACjC,GAAI,CAAC,EACH,MAAU,MAAM,sDAAsD,CAExE,OAAO,GAGI,GAAqB,EAA0C,KAAK,CAEpE,OAAgC,CAC3C,IAAM,EAAM,EAAI,GAAmB,CACnC,GAAI,CAAC,EACH,MAAU,MAAM,gEAAgE,CAElF,OAAO,GC9EI,GAAqC,EAAI,CACpD,gDACA,6CACA,0BACA,iBACA,0BACA,gDACD,CAAC,CAEW,GAA4B,EAAI,CAAC,2GAA2G,CAAC,CAE7I,GAAuB,EAAI,CAAC,mFAAmF,CAAC,CAEhH,GAA4B,EAAI,CAAC,6FAA6F,CAAC,CAE/H,GAA0B,EAAI,CACzC,uHACD,CAAC,CAEW,GAAoB,EAAI,CACnC,+BACA,sCACA,kCACA,kDACA,sCACA,qBACA,sBACA,wBACA,sBACA,2BACA,uBACA,kBACA,yBACA,0BACA,wDACD,CAAC,CAEW,GAAuB,EAAI,CAAC,OAAO,CAAC,CAEpC,GAAwB,EAAI,CAAC,aAAa,CAAE,CACvD,SAAU,CACR,SAAU,CACR,KAAM,SACN,MAAO,SACP,MAAO,WACR,CACD,UAAW,CACT,KAAM,cACN,MAAO,GACR,CACD,WAAY,CACV,KAAM,GACN,MAAO,GACR,CACD,YAAa,CACX,KAAM,GACN,MAAO,GACR,CACD,SAAU,CACR,MAAO,gBACP,OAAQ,iBACR,IAAK,cACN,CACF,CACD,iBAAkB,CAChB,CAAE,SAAU,OAAQ,WAAY,IAAA,GAAW,UAAW,2BAA4B,CAClF,CAAE,SAAU,QAAS,YAAa,IAAA,GAAW,UAAW,2BAA4B,CACrF,CACF,CAAC,CAEW,GAAoB,EAAI,4oBA4BpC,CAAC,CAEW,GAAmB,EAAI,CAAC,sEAAsE,CAAC,CAE/F,GAA0B,EAAI,CAAC,kCAAkC,CAAE,CAC9E,SAAU,CACR,SAAU,CACR,KAAM,SACN,MAAO,SACP,MAAO,WACR,CACF,CACD,gBAAiB,CACf,SAAU,IAAA,GACX,CACF,CAAC,CAEW,GAA2B,EAAI,CAAC,mGAAmG,CAAC,CAEpI,GAAoB,EAAI,CAAC,kCAAkC,CAAE,CACxE,SAAU,CACR,SAAU,CACR,KAAM,GACN,MAAO,GACP,MAAO,GACR,CACD,WAAY,CACV,KAAM,GACN,MAAO,GACR,CACD,YAAa,CACX,KAAM,GACN,MAAO,GACR,CACF,CACD,iBAAkB,CAChB,CAAE,SAAU,OAAQ,WAAY,IAAA,GAAW,UAAW,2BAA4B,CAClF,CAAE,SAAU,QAAS,YAAa,IAAA,GAAW,UAAW,2BAA4B,CACrF,CACF,CAAC,CAEW,GAAyB,EAAI,CAAC,oBAAoB,CAAE,CAC/D,SAAU,CACR,SAAU,CACR,MAAO,gBACP,OAAQ,iBACR,IAAK,cACN,CACF,CACD,gBAAiB,CACf,SAAU,QACX,CACF,CAAC,CAEW,GAAsB,EAAI,CAAC,iGAAiG,CAAC,CAE7H,GAA8B,EAAI,CAAC,gCAAgC,CAAE,CAChF,SAAU,CACR,MAAO,CACL,KAAM,mDACN,SAAU,qBACV,MAAO,uCACR,CACF,CACD,gBAAiB,CACf,MAAO,OACR,CACF,CAAC,CC9JW,GAAc,GAAoB,CAAE,SAAQ,YAAW,WAAU,GAAG,KAAY,CAC3F,GAAM,CAAE,aAAY,eAAc,WAAY,IAAuB,CAErE,OADI,GAAW,GAAc,EAAqB,KAEhD,EAAC,QAAA,CAAM,KAAK,aAAa,MAAO,CAAE,SAAQ,CAAE,UAAW,EAAG,IAAmB,CAAE,EAAU,CAAE,GAAI,EAC5F,YACK,EAEV,CACF,GAAY,YAAc,cCP1B,MAAa,GAAc,GACxB,CAAE,WAAW,GAAO,cAAc,GAAO,aAAa,GAAO,QAAO,WAAW,QAAS,SAAQ,aAAY,GAAG,KAAY,CAC1H,GAAM,CAAE,eAAc,SAAU,IAA6B,CACvD,EAAW,EAAgC,KAAK,CAChD,EAAU,EAAuB,KAAK,CAEtC,EAAO,MAAc,CACzB,IAAM,EAAO,GAAQ,SAAS,OAAO,CACrC,OAAO,IAAa,QAAU,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,IAAA,IACtE,CAAC,EAAU,EAAO,CAAC,CAEhB,EAAQ,MAAc,CAC1B,IAAM,EAAO,GAAQ,SAAS,QAAQ,CACtC,OAAO,IAAa,SAAW,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,IAAA,IACvE,CAAC,EAAU,EAAO,CAAC,CAEhB,EAAQ,MACL,kBAAkB,EAAM,eAC9B,CAAC,EAAM,CAAC,CAEL,EAAU,MACP,GAAQ,UAAU,QAAU,kBAAkB,EAAM,kBAAoB,IAAA,GAC9E,CAAC,EAAO,EAAO,CAAC,CAEb,EAAU,MACP,GAAQ,UAAU,QAAU,kBAAkB,EAAM,kBAAoB,IAAA,GAC9E,CAAC,EAAO,EAAO,CAAC,CAEb,EAAS,MACN,GAAW,GAAQ,UAAU,KAAM,GAAY,CAAC,CACtD,CAAC,EAAQ,EAAW,CAAC,CAsBxB,OApBA,MAAgB,CACd,EAAS,QAAU,SAAS,cAAc,aAAa,EAAa,IAAI,EACvE,CAAC,EAAa,CAAC,CAElB,MAAgB,CACd,GAAI,CAAC,EAAQ,QAAS,OAEtB,IAAMC,EAAQ,EAAQ,QAAQ,YACxB,EAAc,GAAQ,SAAS,CAEjC,GAAe,MAAQA,EAAQ,GAC7B,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,CAGxB,EAAC,KAAA,CACC,KAAK,kBACL,cAAa,EACb,gBAAe,GAAc,IAAA,GAC7B,iBAAgB,GAAe,IAAA,GAC/B,MAAO,CAAE,OAAM,QAAO,QAAO,SAAU,EAAS,SAAU,EAAS,CACnE,UAAW,GAAkB,CAAE,SAAU,GAAY,IAAA,GAAW,aAAY,cAAa,CAAC,CAC1F,GAAI,WAEJ,EAAC,MAAA,CAAI,IAAK,EAAS,KAAK,wBAAwB,UAAW,GAAuB,CAAE,WAAU,CAAC,UAC5F,GACG,EACH,EAGV,CACD,GAAY,YAAc,cCxE1B,MAAa,GAAqB,GAA2B,CAAE,kBAAiB,SAAQ,aAAY,YAAW,GAAG,KAAY,CAC5H,IAAM,EAAS,MACN,GAAW,GAAQ,UAAU,KAAM,GAAY,CAAC,CACtD,CAAC,EAAQ,EAAW,CAAC,CACxB,OACE,EAAC,KAAA,CAAG,WAAS,UAAU,YAAW,EAAiB,UAAW,IAA0B,CAAE,GAAI,WAC3F,GACE,EAEP,CACF,GAAmB,YAAc,qBClBjC,MCWa,GAAoB,GAA0B,CAAE,WAAU,aAAa,GAAO,YAAW,sBAAqB,GAAG,KAAY,CACxI,IAAM,EAA0B,EAC7B,GAAqC,CACpC,IAAsB,CAAC,CAAC,EAAM,EAEhC,CAAC,EAAoB,CACtB,CACD,OACE,EAAC,KAAA,CACC,KAAK,kBACL,cAAa,GACb,MAAO,CAAE,KAAM,EAAG,OAAQ,GAAuB,MAAO,GAAc,SAAU,GAAc,CAC9F,UAAW,EAAG,GAAwB,CAAE,WAAU,CAAC,CAAE,EAAU,CAC/D,GAAI,WAEJ,EAAC,MAAA,CACC,YAAU,mBACV,UAAU,oFACV,QAAS,GAAK,CACZ,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,WAGrB,EAAC,EAAA,CAAS,aAAW,aAAa,QAAS,EAAY,gBAAiB,GAA2B,EAC/F,EACH,EAEP,CACF,GAAkB,YAAc,oBClBhC,MAAa,GAAwB,MAAiC,CACpE,GAAM,CAAE,QAAO,aAAY,eAAc,oBAAoB,GAAM,GAAmB,CAEtF,MADI,CAAC,GAAc,CAAC,EAAqB,KAEvC,EAAC,QAAA,CAAM,UAAW,EAAG,IAAmB,CAAE,sBAAsB,UAC7D,MAAM,KAAK,CAAE,OAAQ,EAAmB,CAAC,CAAC,KAAK,EAAG,IACjD,EAAC,KAAA,CAAe,YAAU,YAAY,aAAY,EAAO,UAAW,EAAG,IAAkB,CAAE,0BAA0B,UAClH,EAAM,eAAe,CAAC,KAAK,EAAQ,IAAW,CAC7C,IAAM,EAAW,EAAO,aAAa,CAC/B,EAAW,EAAO,SAAS,OAAO,CAClC,EAAY,EAAO,SAAS,QAAQ,CAuC1C,OAtCI,EAAO,KAAO,UAEd,EAAC,KAAA,CAEC,YAAU,kBACV,WAAU,EAAO,GACjB,YAAW,EACX,MAAO,CACL,MAAO,GACR,CACD,UAAW,IAA0B,UAErC,EAAC,MAAA,CAAI,UAAU,yCAAA,CAA2C,EATrD,GAAG,EAAO,GAAG,GAAG,IAUlB,CAGL,EAAO,KAAO,SAEd,EAAC,KAAA,CAEC,YAAU,kBACV,WAAU,EAAO,GACjB,YAAW,EACX,cAAa,GACb,MAAO,CACL,KAAM,EACN,OAAQ,GACR,MAAO,GACP,SAAU,GACX,CACD,UAAW,GAAwB,CAAE,SAAU,OAAQ,CAAC,UAExD,EAAC,MAAA,CAAI,UAAU,sCACb,EAAC,MAAA,CAAI,UAAU,qCAAA,CAAuC,EAClD,EAfD,GAAG,EAAO,GAAG,GAAG,IAgBlB,CAIP,EAAC,KAAA,CAEC,WAAU,EAAO,GACjB,YAAW,EACX,gBAAe,IAAA,GACf,gBAAe,EAAO,KAAO,EAAM,eAAe,CAAC,EAAM,eAAe,CAAC,OAAS,GAAG,IAAM,IAAA,GAC3F,iBAAgB,EAAO,KAAO,EAAM,eAAe,CAAC,GAAG,IAAM,IAAA,GAC7D,MAAO,CACL,OAAQ,EAAW,GAAwB,EAC3C,KAAM,IAAa,QAAU,OAAO,GAAa,SAAW,GAAG,EAAS,IAAM,IAAA,GAC9E,MAAO,IAAa,SAAW,OAAO,GAAc,SAAW,GAAG,EAAU,IAAM,IAAA,GAClF,MAAO,kBAAkB,EAAO,GAAG,eACnC,SAAU,EAAO,UAAU,QAAU,kBAAkB,EAAO,GAAG,kBAAoB,IAAA,GACrF,SAAU,EAAO,UAAU,QAAU,kBAAkB,EAAO,GAAG,kBAAoB,IAAA,GACtF,CACD,UAAW,GAAkB,CAC3B,SAAU,EAAO,aAAa,CAC9B,YAAa,EAAO,KAAO,EAAM,sBAAsB,CAAC,IAAI,QAAQ,IAAI,GACxE,WAAY,EAAO,KAAO,EAAM,qBAAqB,CAAC,IAAI,QAAQ,EAAM,qBAAqB,CAAC,GAAG,QAAQ,OAAS,IAAI,GACvH,CAAC,UAEF,EAAC,MAAA,CACC,UAAW,GAAuB,CAChC,SAAW,EAAO,UAAU,MAAoB,UAAY,QAC7D,CAAC,UAEF,EAAC,MAAA,CAAI,UAAU,yCAAA,CAA2C,EACtD,EA1BD,GAAG,EAAO,GAAG,GAAG,IA2BlB,EAEP,EA1EK,EA2EJ,CACL,EACI,EAEV,CAEW,GAAsB,MAAiC,CAClE,GAAM,CAAE,UAAS,sBAAuB,GAAmB,CAE3D,OADK,EAEH,EAAA,GAAA,CAAA,SACG,GACC,EAAC,MAAA,CAAI,UAAW,IAA2B,CAAE,MAAO,CAAE,UAAW,GAAsB,QAAS,UAC9F,EAAC,MAAA,CAAI,UAAU,6CACb,EAAC,GAAA,CAAQ,YAAa,EAAG,KAAM,IAAM,CACrC,EAAC,IAAA,CAAA,SAAE,oBAAA,CAAqB,CAAA,EACpB,EACF,CAAA,CAEP,CAXgB,MAarB,CACF,GAAoB,YAAc,sBCpHlC,MAAa,GAAgB,GAAsB,CAAE,YAAW,WAAU,GAAG,KAEzE,EAAC,QAAA,CAAM,KAAK,eAAe,UAAW,EAAG,IAAqB,CAAE,EAAU,CAAE,GAAI,EAC7E,YACK,CAEV,CACF,GAAc,YAAc,gBCP5B,MAAa,GAAc,GAAoB,CAAE,YAAW,WAAU,GAAG,KAErE,EAAC,QAAA,CAAM,KAAK,aAAa,UAAW,EAAG,IAAmB,CAAE,EAAU,CAAE,GAAI,EACzE,YACK,CAEV,CACF,GAAY,YAAc,cCI1B,MAAa,GAAwB,GAA8B,CAAE,WAAU,YAAW,aAAY,UAAS,eAAgB,CAC7H,IAAM,EAAgB,MAAkB,CACtC,IAAY,OAAO,EAClB,CAAC,EAAU,CAAC,CAET,EAAiB,MAAkB,CACvC,IAAa,QAAQ,EACpB,CAAC,EAAW,CAAC,CAEV,EAAc,MAAkB,CACpC,IAAU,GAAM,EACf,CAAC,EAAQ,CAAC,CAEb,OACE,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAoB,QAAA,YACnB,EAAC,SAAA,CAAO,KAAK,SAAS,UAAW,EAAG,IAAoC,CAAE,EAAU,UAClF,EAAC,GAAA,EAAA,CAAuB,EACjB,EACW,CACtB,EAAC,EAAA,CAAoB,MAAM,MAAM,UAAU,oBACzC,EAAC,EAAA,CAAkB,UAAU,6FAC3B,EAAC,EAAA,CAAS,KAAM,EAAW,UAAY,kBACrC,EAAC,EAAA,CAAiB,QAAS,YACxB,CAAC,CAAC,GAAY,QACf,EAAC,EAAA,CAAA,SACC,EAAC,GAAA,CAAW,UAAU,SAAA,CAAW,CAAA,CACZ,CAAA,EACN,EACV,CACX,EAAC,EAAA,CAAS,KAAO,EAAuB,SAAZ,oBAC1B,EAAC,EAAA,CAAiB,QAAS,YACxB,EAAW,QAAU,cACtB,EAAC,EAAA,CAAA,SACC,EAAC,GAAA,CAAa,UAAU,SAAA,CAAW,CAAA,CACd,CAAA,EACN,CACnB,EAAC,EAAA,CAAiB,QAAS,YACxB,EAAW,QAAU,eACtB,EAAC,EAAA,CAAA,SACC,EAAC,GAAA,CAAc,UAAU,SAAA,CAAW,CAAA,CACf,CAAA,EACN,CAAA,EACV,CAAA,EACO,EACA,CAAA,CAAA,CACT,EAEjB,CACF,GAAsB,YAAc,wBCxDpC,MAAa,GAAkB,GAC5B,CACC,YAAY,GACZ,WAAW,GACX,cAAc,GACd,aAAa,GACb,mBAAmB,GACnB,WACA,eACA,YACA,WACA,cACA,qBACA,GAAG,KACC,CACJ,IAAM,EAAY,GAAc,UAAU,MAAoB,SAExD,EAAS,MACN,EAAW,GAAwB,IAAA,GACzC,CAAC,EAAS,CAAC,CAER,EAAO,MAAc,CACzB,IAAM,EAAO,GAAc,WAAW,OAAO,CAC7C,OAAO,IAAa,QAAU,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,IAAA,IACtE,CAAC,EAAU,EAAa,CAAC,CAEtB,EAAQ,MAAc,CAC1B,IAAM,EAAO,GAAc,WAAW,QAAQ,CAC9C,OAAO,IAAa,SAAW,OAAO,GAAS,SAAW,GAAG,EAAK,IAAM,IAAA,IACvE,CAAC,EAAU,EAAa,CAAC,CAEtB,EAAQ,MACL,qBAAqB,EAAS,eACpC,CAAC,EAAS,CAAC,CAER,EAAU,MACP,GAAc,UAAU,QAAU,kBAAkB,EAAS,kBAAoB,IAAA,GACvF,CAAC,EAAU,EAAa,CAAC,CAEtB,EAAU,MACP,GAAc,UAAU,QAAU,kBAAkB,EAAS,kBAAoB,IAAA,GACvF,CAAC,EAAU,EAAa,CAAC,CAE5B,OACE,EAAC,KAAA,CACC,KAAK,kBACL,cAAa,EACb,cAAa,EACb,MAAO,CAAE,SAAQ,OAAM,QAAO,QAAO,SAAU,EAAS,SAAU,EAAS,CAC3E,UAAW,EACT,GAAsB,CACpB,SAAU,GAAY,QACtB,UAAW,IAAa,UACxB,aACA,cACA,WACD,CAAC,CACF,EACD,CACD,GAAI,YAEJ,EAAC,MAAA,CAAI,UAAU,gBAAiB,YAAe,CAC9C,GACC,EAAC,GAAA,CAAgC,WAAqB,YAAW,UAAW,EAAa,WAAY,EAAa,QAAS,GAAe,CAAA,EAEzI,EAGV,CACD,GAAgB,YAAc,kBCxE9B,MAAa,GAAwB,GAA8B,CAAE,WAAU,oBAAmB,QAAO,0BAAyB,GAAG,KAAY,CAC/I,IAAM,EAA8B,EACjC,GAAqC,CACpC,IAA0B,CAAC,CAAC,EAAM,EAEpC,CAAC,EAAwB,CAC1B,CACD,OACE,EAAC,KAAA,CACC,KAAK,oBACL,cAAa,GACb,MAAO,CAAE,KAAM,EAAG,OAAQ,GAAsB,MAAO,GAAc,SAAU,GAAc,CAC7F,UAAW,GAAwB,CAAE,WAAU,CAAC,CAChD,GAAI,WAEJ,EAAC,MAAA,CACC,UAAU,oDACV,QAAS,GAAK,CACZ,EAAE,gBAAgB,CAClB,EAAE,iBAAiB,WAGrB,EAAC,EAAA,CAAS,aAAW,kBAAkB,QAAS,EAAmB,gBAAiB,GAA+B,EAC/G,EACH,EAEP,CACF,GAAsB,YAAc,wBCvBpC,MAAa,GAAiB,GAAuB,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,EAAC,KAAA,CAAG,KAAK,iBAAiB,UAAW,EAAG,IAAsB,CAAE,EAAU,CAAE,GAAI,WAC7E,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,SAEd,EAAC,GAAA,CAEW,WACS,oBACM,2BAHpB,EAAO,GAIZ,CAIJ,EAAC,GAAA,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,0BAEjC,GAAW,EAAO,OAAO,UAAU,OAAQ,EAAO,YAAY,CAAC,EAZ3D,GAAG,EAAO,GAAG,GAAG,IAaL,EAEpB,EACC,EAEP,CACF,GAAe,YAAc,iBC7C7B,MAAa,GAAoB,GAA0B,CAAE,WAAU,GAAG,KAAY,CACpF,GAAM,CAAE,QAAO,eAAc,aAAc,IAA6B,CAClE,EAAW,EAAyB,KAAK,CA2E/C,OAxEA,MAAgB,CACd,GAAI,CAAC,EAAS,QAAS,OAEvB,IAAM,EAAU,EAAM,gBAAgB,CAElCC,EACE,EAAW,IAAI,eAAe,GAAW,CACzC,IAAU,IAAA,IAAW,qBAAqB,EAAM,CACpD,EAAQ,0BAA4B,CAClC,IAAM,EAAQ,EAAQ,GACtB,GAAI,CAAC,EAAO,OACZ,IAAM,EAAe,EAAM,OAC3B,GAAI,EAAE,aAAwB,kBAAmB,OACjD,IAAM,EAAwB,EAAM,YAAY,MAE1C,CAAE,KAAM,EAAoB,EAAE,CAAE,MAAO,EAAqB,EAAE,EAAK,EAAM,UAAU,CAAC,cAEtFC,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,QAmBxC,OAjBI,GAEF,GAAe,GACR,CAAE,KAAI,OAAQ,GAAO,SAAO,EAGjC,GACF,GAAe,EACR,CAAE,KAAI,OAAQ,GAAO,MAAO,EAAM,EAGvC,EAAO,OAAO,UAAU,MAAQ,IAAS,KAC3C,GAAkB,EACX,CAAE,KAAI,OAAQ,GAAO,MAAO,EAAM,GAG3C,IACO,CAAE,KAAI,OAAQ,GAAM,UAAS,GACpC,CAEI,EAAiB,EAAwB,EAAc,EACvD,EAAe,EAAuB,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAiB,EAAqB,CAAC,CAAG,EAEjH,EAAY,QAAQ,GAAO,CACzB,GAAI,EAAI,OAAQ,CACd,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,EACF,EACF,CAEF,OADA,EAAS,QAAQ,EAAS,QAAQ,KACrB,CACP,IAAU,IAAA,IAAW,qBAAqB,EAAM,CACpD,EAAS,YAAY,GAEtB,CAAC,EAAM,UAAU,CAAC,iBAAkB,EAAM,UAAU,CAAC,aAAc,EAAM,UAAU,CAAC,cAAc,CAAC,CAGpG,EAAC,QAAA,CAAM,GAAI,EAAc,IAAK,EAAU,KAAK,oBAAoB,UAAW,IAAyB,CAAE,MAAO,CAAE,SAAU,EAAW,CAAE,GAAI,EACxI,YACK,EAEV,CACF,GAAkB,YAAc,oBCpFhC,MAAa,GAAsB,GAA4B,CAAE,WAAU,GAAG,KAAY,CACxF,GAAM,CAAE,kBAAmB,IAA+B,CAC1D,OACE,EAAC,MAAA,CAAI,GAAI,EAAgB,KAAK,sBAAsB,UAAW,IAA2B,CAAE,GAAI,EAC7F,YACG,EAER,CACF,GAAoB,YAAc,sBCFlC,MAAa,EAAkB,GAAwB,CAAE,kBAAiB,kBAAiB,mBAAoB,CAC7G,GAAM,CAAE,kBAAmB,IAA+B,CAEpD,EAAkB,EAAuB,KAAK,CAC9C,EAAS,EAA4B,KAAK,CAE1C,CAAC,EAAe,GAAoB,EAAwC,OAAO,CACnF,CAAC,EAAO,GAAY,EAAiB,EAAE,CAEvC,EAAsB,EAAY,SAAY,CAClD,GAAI,CACF,EAAiB,WAAW,CAC5B,MAAM,KAAiB,CACvB,EAAiB,OAAO,OACjB,EAAO,CACd,QAAQ,MAAM,4BAA6B,EAAM,CACjD,EAAiB,QAAQ,GAE1B,CAAC,EAAc,CAAC,CAgBnB,OAdA,MAAgB,CAEd,GADA,EAAgB,QAAU,SAAS,cAAc,WAAW,EAAe,IAAI,CAC3E,CAAC,EAAgB,QAAS,OAE9B,IAAM,EAAW,IAAI,eAAe,GAAW,CAC7C,EAAS,EAAQ,GAAG,YAAY,MAAM,EACtC,CAGF,OADA,EAAS,QAAQ,EAAgB,QAAQ,KAC5B,EAAS,YAAY,EACjC,CAAC,EAAe,CAAC,CAEf,EAGH,EAAC,KAAA,CAAG,IAAK,EAAQ,aAAY,EAAiB,MAAO,CAAE,UAAW,cAAc,EAAgB,KAAM,QAAO,CAAE,UAAU,+BACvH,EAAC,KAAA,CAAG,UAAU,2EACZ,EAAC,SAAA,CACC,KAAK,SACL,SAAU,IAAkB,WAC5B,UAAW,GAA4B,CAAE,MAAO,EAAe,CAAC,CAChE,QAAS,YAER,IAAkB,QAAU,EAAC,EAAA,CAAY,UAAU,SAAA,CAAW,CAC9D,IAAkB,YAAc,EAAC,GAAA,CAAQ,UAAU,sBAAA,CAAwB,CAC3E,IAAkB,SAAW,EAAC,EAAA,CAAc,UAAU,qBAAA,CAAuB,CAC7E,IAAkB,QAAU,YAC5B,IAAkB,YAAc,aAChC,IAAkB,SAAW,kBACvB,EACN,EACF,CAnBoB,MAqB3B,CACF,EAAgB,YAAc,kBCvD9B,MAAa,GAAa,GAAmB,CAAE,MAAK,aAAY,kBAAiB,kBAAiB,WAAU,GAAG,KAAY,CACzH,GAAM,CAAE,gBAAe,oBAAmB,qBAAoB,oBAAmB,qBAAoB,cAAe,IAAsB,CAEpI,EAAoB,MAAc,EAAmB,MAAQ,EAAE,CAAE,CAAC,EAAmB,CAAC,CACtF,EAAqB,MAAc,EAAmB,OAAS,EAAE,CAAE,CAAC,EAAmB,CAAC,CACxF,EAA2B,MAAc,IAAqB,IAAI,GAAI,CAAC,EAAmB,CAAC,CAC3F,EAAyB,MAAc,IAAoB,EAAkB,OAAS,IAAI,GAAI,CAAC,EAAkB,CAAC,CAElH,EAAc,EAClB,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,CAED,OACE,EAAC,KAAA,CACC,KAAK,YACL,aAAY,EACZ,MAAO,CAAE,UAAW,cAAc,EAAgB,KAAM,CACxD,UAAW,IAAkB,CAC7B,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,UAEnB,EAAC,GAAA,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,SAEnB,EAAC,GAAA,CAEC,WAAU,EAAK,OAAO,GACtB,YAAW,EACX,gBAAe,GAAc,IAAA,GACnB,WACV,WAAY,GAAqB,EACjC,oBAAqB,EAAK,IAAI,gBANzB,GAAG,EAAK,GAAG,GAAG,IAOnB,CAIJ,EAAC,GAAA,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,GAAW,YAAc,aChFzB,MAAa,GAAiB,GAAuB,CAAE,YAAW,WAAU,GAAG,KAE3E,EAAC,MAAA,CAAI,KAAK,gBAAgB,UAAW,EAAG,IAAsB,CAAE,EAAU,CAAE,GAAI,EAC7E,YACG,CAER,CACF,GAAe,YAAc,iBCJ7B,MAAaC,IAAuD,CAAE,cAAe,CACnF,GAAM,CAAE,QAAO,iBAAkB,GAAmB,CAC9C,CAAE,qBAAsB,IAAuB,CAE/C,EAAoB,EAA8B,KAAK,CAEvD,CAAE,QAAS,EAAM,aAAa,CAG9B,EAAiB,GAAoD,CAGzE,MAAO,EAAK,QAAU,EAAgB,EAAI,GAC1C,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,EAAkB,MAAc,CACpC,IAAM,EAAY,EAAe,cAAc,CACzC,EAAkB,EAAkB,SAAS,cAAgB,EACnE,MAAO,GAAG,KAAK,IAAI,EAAW,EAAgB,CAAC,KAC9C,CAAC,EAAe,cAAc,CAAC,CAAC,CAEnC,OACE,EAAC,GAAA,CACC,UAAU,aACV,MAAO,CAAE,UAAW,EAAM,QAAQ,sBAAuB,CACzD,UAAU,iJAEV,EAAC,EAAA,CAAe,UAAU,oBACxB,EAAC,GAAA,CAAoB,IAAK,YACxB,EAAC,GAAA,CAAA,SAAA,CACC,EAAC,GAAA,CAAA,SACE,EAAM,iBAAiB,CAAC,IAAI,GAC3B,EAAC,GAAA,CAAiD,cAAA,CAA7B,EAAY,GAAgC,CACjE,CAAA,CACU,CACd,EAAC,GAAA,CAAY,OAAQ,WAClB,EAAe,iBAAiB,CAAC,IAAI,GAAc,CAClD,IAAM,EAAM,EAAK,EAAW,OAI5B,GAAI,CAAC,GAAO,EACV,OACE,EAAC,EAAA,CAAqC,gBAAiB,EAAW,MAAO,gBAAiB,EAAW,MAAsB,iBAArG,EAAW,IAA2G,CAKhJ,IAAM,EAAa,EAAkB,EAAI,MAAQ,GAEjD,OACE,EAAC,GAAA,CAEC,IAAK,EAAe,eACf,MACO,aACZ,gBAAiB,EAAW,MAC5B,gBAAiB,EAAW,OALvB,EAAW,IAMhB,EAEJ,EACU,CACd,EAAC,GAAA,EAAA,CAAwB,GACP,CACpB,EAAC,GAAA,EAAA,CAAsB,CAAA,EACH,EACP,CAChB,GACC,EAAA,GAAA,CAAA,SAAA,CACE,EAAC,EAAA,EAAA,CAAkB,CAClB,EAAA,CAAA,CACA,CAAA,EAEe,ECpDpBC,GAAkD,CACtD,IAAK,EAAC,GAAA,CAAQ,KAAM,GAAA,CAAM,CAC1B,aAAc,EAAC,GAAA,CAAQ,KAAM,GAAA,CAAM,CACnC,aAAc,EAAC,EAAA,CAAa,KAAM,GAAA,CAAM,CACxC,OAAQ,EAAC,GAAA,CAAS,KAAM,GAAA,CAAM,CAC9B,KAAM,EAAC,GAAA,CAAS,KAAM,GAAA,CAAM,CAC5B,QAAS,EAAC,GAAA,CAAe,KAAM,GAAA,CAAM,CACtC,CAIKC,GAA8E,CAClF,CAAE,MAAO,KAAM,MAAO,aAAc,CACpC,CAAE,MAAO,KAAM,MAAO,iBAAkB,CACxC,CAAE,MAAO,KAAM,MAAO,mBAAoB,CAC1C,CAAE,MAAO,MAAO,MAAO,eAAgB,CACvC,CAAE,MAAO,KAAM,MAAO,gBAAiB,CACvC,CAAE,MAAO,MAAO,MAAO,cAAe,CACtC,CAAE,MAAO,UAAW,MAAO,UAAW,CACvC,CAEKC,GAA0E,CAC9E,CAAE,MAAO,WAAY,MAAO,WAAY,CACxC,CAAE,MAAO,SAAU,MAAO,SAAU,CACpC,CAAE,MAAO,cAAe,MAAO,cAAe,CAC9C,CAAE,MAAO,YAAa,MAAO,YAAa,CAC3C,CAID,SAAS,GAAkB,EAAoB,EAA+B,CAC5E,OAAQ,EAAM,KAAd,CACE,IAAK,aAEH,OADK,EAAM,MACJ,EAAI,SAAS,KAAK,GAAK,EAAE,QAAU,EAAM,MAAM,EAAE,OAAS,EAAM,MAD9C,QAG3B,IAAK,MAEH,OADK,EAAM,OAAO,OACX,EAAM,OAAO,IAAI,GAAK,EAAI,SAAS,KAAK,GAAK,EAAE,QAAU,EAAE,EAAE,OAAS,EAAE,CAAC,KAAK,KAAK,CADzD,QAGnC,IAAK,aAIH,MAHI,CAAC,EAAM,MAAQ,CAAC,EAAM,GAAW,cACjC,EAAM,MAAQ,EAAM,GAAW,GAAG,EAAM,KAAK,KAAK,EAAM,KACxD,EAAM,KAAa,QAAQ,EAAM,OAC9B,SAAS,EAAM,KAExB,IAAK,SAAU,CACb,IAAM,EAAK,CAAE,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,QAAS,UAAW,CAAC,EAAM,UAGhG,OAFI,EAAM,QAAU,IAAA,GAAkB,EAClC,EAAM,WAAa,UAAkB,GAAG,EAAG,GAAG,EAAM,MAAM,KAAK,EAAM,SAAW,MAC7E,GAAG,EAAG,GAAG,EAAM,QAExB,IAAK,OAAQ,CACX,IAAM,EAAK,CACT,SAAU,WACV,OAAQ,KACR,cAAe,cACf,YAAa,YACd,CAAC,EAAM,UACR,OAAO,EAAM,MAAQ,GAAG,EAAG,IAAI,EAAM,MAAM,GAAK,EAElD,IAAK,UAEH,OADI,EAAM,QAAU,KAAa,SAC1B,EAAM,MAAQ,MAAQ,MAMnC,MAAMC,IAIA,CAAE,QAAO,aAAY,cACzB,EAAC,MAAA,CAAI,UAAU,oCACX,EAAW,SAAW,EAAE,EAAE,SAAW,EACrC,EAAC,IAAA,CAAE,UAAU,4CAAmC,sBAAsB,CAEtE,EAAW,QAAS,IAAI,GACtB,EAAC,EAAA,CAEC,UAAW,EACT,8GACA,EAAM,OAAO,SAAS,EAAO,MAAM,EAAI,2CACxC,WAED,EAAC,EAAA,CACC,QAAS,EAAM,OAAO,SAAS,EAAO,MAAM,CAC5C,gBAAiB,GAAW,CAE1B,EAAS,CAAE,KAAM,MAAO,OADX,EAAU,CAAC,GAAG,EAAM,OAAQ,EAAO,MAAM,CAAG,EAAM,OAAO,OAAO,GAAK,IAAM,EAAO,MAAM,CAC/D,CAAC,GAEzC,CACF,EAAC,OAAA,CAAK,UAAU,mBAAW,EAAO,OAAa,CAAA,EAb1C,EAAO,MAcN,CACR,EAEA,CAGFC,IAIA,CAAE,QAAO,aAAY,cACzB,EAAC,MAAA,CAAI,UAAU,oCACX,EAAW,SAAW,EAAE,EAAE,SAAW,EACrC,EAAC,IAAA,CAAE,UAAU,4CAAmC,sBAAsB,CAEtE,EAAW,QAAS,IAAI,GACtB,EAAC,EAAA,CAEC,UAAW,EACT,8GACA,EAAM,QAAU,EAAO,OAAS,2CACjC,WAED,EAAC,EAAA,CACC,QAAS,EAAM,QAAU,EAAO,MAChC,gBAAiB,GAAW,CAC1B,EAAS,CAAE,KAAM,aAAc,MAAO,EAAU,EAAO,MAAQ,KAAM,CAAC,GAExE,CACF,EAAC,OAAA,CAAK,UAAU,mBAAW,EAAO,OAAa,CAAA,EAZ1C,EAAO,MAaN,CACR,EAEA,CAGFC,IAGA,CAAE,QAAO,cACb,EAAC,MAAA,CAAI,UAAU,oCACb,EAAC,MAAA,CAAI,UAAU,gCACb,EAAC,OAAA,CAAK,UAAU,4CAAmC,QAAW,CAC9D,EAAC,EAAA,CAAM,KAAK,OAAO,KAAK,KAAK,MAAO,EAAM,MAAQ,GAAI,cAAe,GAAK,EAAS,CAAE,GAAG,EAAO,KAAM,GAAK,IAAA,GAAW,CAAC,EAAI,CAAA,EACtH,CACN,EAAC,MAAA,CAAI,UAAU,gCACb,EAAC,OAAA,CAAK,UAAU,4CAAmC,MAAS,CAC5D,EAAC,EAAA,CAAM,KAAK,OAAO,KAAK,KAAK,MAAO,EAAM,IAAM,GAAI,cAAe,GAAK,EAAS,CAAE,GAAG,EAAO,GAAI,GAAK,IAAA,GAAW,CAAC,EAAI,CAAA,EAClH,CAAA,EACF,CAGFC,IAGA,CAAE,QAAO,cACb,EAAC,MAAA,CAAI,UAAU,oCACb,EAAC,EAAA,CAAO,MAAO,EAAM,SAAU,cAAe,GAAM,EAAS,CAAE,GAAG,EAAO,SAAU,EAAqC,CAAC,WACvH,EAAC,EAAA,CAAc,KAAK,cAClB,EAAC,EAAA,EAAA,CAAc,EACD,CAChB,EAAC,EAAA,CAAA,SACE,GAAiB,IAAI,GACpB,EAAC,EAAA,CAA0B,MAAO,EAAG,eAClC,EAAG,OADW,EAAG,MAEP,CACb,CAAA,CACY,CAAA,EACT,CACT,EAAC,EAAA,CACC,KAAK,SACL,KAAK,KACL,YAAY,QACZ,MAAO,EAAM,OAAS,GACtB,cAAe,GAAK,EAAS,CAAE,GAAG,EAAO,MAAO,EAAI,OAAO,EAAE,CAAG,IAAA,GAAW,CAAC,EAC5E,CACD,EAAM,WAAa,WAClB,EAAC,EAAA,CACC,KAAK,SACL,KAAK,KACL,YAAY,WACZ,MAAO,EAAM,SAAW,GACxB,cAAe,GAAK,EAAS,CAAE,GAAG,EAAO,QAAS,EAAI,OAAO,EAAE,CAAG,IAAA,GAAW,CAAC,EAC9E,GAEA,CAGFC,IAGA,CAAE,QAAO,cACb,EAAC,MAAA,CAAI,UAAU,oCACb,EAAC,EAAA,CAAO,MAAO,EAAM,SAAU,cAAe,GAAM,EAAS,CAAE,GAAG,EAAO,SAAU,EAAmC,CAAC,WACrH,EAAC,EAAA,CAAc,KAAK,cAClB,EAAC,EAAA,EAAA,CAAc,EACD,CAChB,EAAC,EAAA,CAAA,SACE,GAAe,IAAI,GAClB,EAAC,EAAA,CAA0B,MAAO,EAAG,eAClC,EAAG,OADW,EAAG,MAEP,CACb,CAAA,CACY,CAAA,EACT,CACT,EAAC,EAAA,CAAM,KAAK,OAAO,KAAK,KAAK,YAAY,gBAAgB,MAAO,EAAM,MAAO,cAAe,GAAK,EAAS,CAAE,GAAG,EAAO,MAAO,EAAG,CAAC,EAAI,CAAA,EACjI,CAGF,GAAkB,CACtB,CAAE,MAAO,MAAO,MAAO,GAAwB,CAC/C,CAAE,MAAO,KAAM,MAAO,GAAyB,CAC/C,CAAE,MAAO,SAAU,MAAO,KAAwB,CACnD,CAEKC,IAGA,CAAE,QAAO,cACb,EAAC,MAAA,CAAI,UAAU,mCACZ,GAAgB,KAAK,CAAE,QAAO,MAAO,KACpC,EAAC,EAAA,CAEC,KAAK,SACL,SAAU,GACV,QAAQ,UACR,UAAW,EACT,0DACA,EAAM,QAAU,EAAI,+BAAiC,2BACtD,CACD,YAAe,EAAS,CAAE,KAAM,UAAW,MAAO,EAAG,CAAC,UAErD,GAVI,EAWE,CACT,EACE,CAGR,SAAS,GAAa,CAAE,QAAO,aAAY,YAAsG,CAC/I,OAAQ,EAAM,KAAd,CACE,IAAK,MACH,OAAO,EAAC,GAAA,CAAuB,QAAmB,aAAsB,YAAY,CACtF,IAAK,aACH,OAAO,EAAC,GAAA,CAA6B,QAAmB,aAAsB,YAAY,CAC5F,IAAK,aACH,OAAO,EAAC,GAAA,CAA6B,QAAiB,YAAY,CACpE,IAAK,SACH,OAAO,EAAC,GAAA,CAA0B,QAAiB,YAAY,CACjE,IAAK,OACH,OAAO,EAAC,GAAA,CAAwB,QAAiB,YAAY,CAC/D,IAAK,UACH,OAAO,EAAC,GAAA,CAA2B,QAAiB,YAAY,EAMtE,MAAMC,IAKA,CAAE,SAAQ,aAAY,WAAU,cACpC,EAAC,MAAA,CAAI,UAAU,oCACb,EAAC,GAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAe,QAAA,YACd,EAAC,EAAA,CACC,KAAK,SACL,QAAQ,UACR,MAAM,QACN,UAAU,wDACV,eAAe,kCAEf,EAAC,OAAA,CAAK,UAAU,mDAA2C,EAAW,OAAa,CACnF,EAAC,OAAA,CAAK,UAAU,oDAA4C,GAAkB,EAAO,MAAO,EAAW,EAAQ,CAAA,EACxG,EACM,CACjB,EAAC,GAAA,CAAe,UAAU,WAAW,MAAM,QAAQ,KAAK,mBACtD,EAAC,MAAA,CAAI,UAAU,4CACb,EAAC,MAAA,CAAI,UAAU,sCACb,EAAC,OAAA,CAAK,UAAU,oCAA4B,GAAW,EAAW,OAAa,CAC/E,EAAC,IAAA,CAAE,UAAU,uBAAe,EAAW,OAAU,CAAA,EAC7C,EACF,CACN,EAAC,GAAA,CAAa,MAAO,EAAO,MAAmB,aAAY,SAAU,GAAY,CAAA,EAClE,CAAA,CAAA,CACT,CACV,EAAC,EAAA,CAAO,KAAK,SAAS,KAAK,OAAO,QAAQ,OAAO,MAAM,SAAS,UAAU,SAAS,QAAS,WAC1F,EAAC,GAAA,CAAW,KAAM,GAAA,CAAM,EACjB,CAAA,EACL,CA8CK,OAAsB,CAEjC,GAAM,CAAE,oBAAmB,gBAAe,YAAW,eAAc,gBAAiB,IAAyB,CAEvG,CAAC,EAAK,GAAU,EAAuC,KAAK,CAE5D,EAAuB,EAAkB,OAAO,GAAO,CAAC,EAAc,KAAK,GAAK,EAAE,eAAiB,EAAI,GAAG,CAAC,CAEjH,OACE,EAAC,EAAA,CAAe,YAAa,GAAI,UAAW,EAAG,UAAW,IAAQ,KAAO,WAAa,WAAW,UAC/F,EAAC,MAAA,CAAI,UAAU,4DACb,EAAC,MAAA,CAAI,UAAU,0CAuBb,EAAC,EAAA,CAAS,KAAM,IAAQ,UAAY,UAAY,kBAC9C,EAAC,MAAA,CAAI,UAAU,8CACb,EAAC,MAAA,CAAI,UAAU,oDACb,EAAC,IAAA,CAAE,UAAU,uBAAc,WAAW,CACtC,EAAC,EAAA,CAAA,SAAA,CACC,EAAC,EAAA,CAAoB,QAAA,YACnB,EAAC,EAAA,CAAO,QAAQ,UAAU,MAAM,QAAQ,SAAU,EAAqB,SAAW,YAChF,EAAC,GAAA,CAAe,KAAM,GAAA,CAAM,CAAA,aAAA,EAErB,EACW,CACtB,EAAC,EAAA,CAAoB,MAAM,eACxB,EAAqB,IAAI,GACxB,EAAC,EAAA,CAA8B,UAAU,0BAA0B,YAAe,EAAU,EAAI,GAAG,WAChG,GAAW,EAAI,MACf,EAAI,MAAA,EAFgB,EAAI,GAGR,CACnB,EACkB,CAAA,CAAA,CACT,CAAA,EACX,CACN,EAAC,EAAA,EAAA,CAAY,CACZ,EAAc,SAAW,EACxB,EAAC,IAAA,CAAE,UAAU,6DAAoD,qBAAqB,CAEtF,EAAC,MAAA,CAAI,UAAU,oCACZ,EAAc,IAAI,GAAU,CAC3B,IAAM,EAAM,EAAkB,KAAK,GAAK,EAAE,KAAO,EAAO,aAAa,CAErE,OADK,EAEH,EAAC,GAAA,CAES,SACR,WAAY,EACZ,aAAgB,EAAa,EAAO,GAAG,CACvC,SAAU,GAAS,EAAa,EAAO,GAAI,EAAM,EAJ5C,EAAO,GAKZ,CARa,MAUjB,EACE,GAEJ,EACG,EACP,CAGN,EAAC,MAAA,CAAI,UAAU,mFAUb,EAAC,SAAA,CACC,KAAK,SACL,UAAW,EAAG,2EAA4E,IAAQ,WAAa,UAAU,CACzH,YAAe,EAAO,IAAQ,UAAY,KAAO,UAAU,WAE3D,EAAC,GAAA,CAAe,KAAM,GAAA,CAAM,CAC3B,EAAc,OAAS,GACtB,EAAC,OAAA,CAAK,UAAU,sJACb,EAAc,QACV,CAET,EAAC,OAAA,CAAK,UAAU,kDAAyC,WAAc,GAChE,CACT,EAAC,EAAA,EAAA,CAAY,CAAA,EACT,CAAA,EACF,EACS,ECnbrB,SAAS,GAAyB,EAA+B,CAC/D,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,CAAE,KAAM,MAAO,OAAQ,EAAE,CAAE,CACpC,IAAK,aACH,MAAO,CAAE,KAAM,aAAc,MAAO,KAAM,CAC5C,IAAK,aACH,MAAO,CAAE,KAAM,aAAc,CAC/B,IAAK,SACH,MAAO,CAAE,KAAM,SAAU,SAAU,KAAM,CAC3C,IAAK,OACH,MAAO,CAAE,KAAM,OAAQ,SAAU,WAAY,MAAO,GAAI,CAC1D,IAAK,UACH,MAAO,CAAE,KAAM,UAAW,MAAO,KAAM,EAS7C,MAAM,GAA8B,GAA0D,CAAE,iBAAgB,cAAe,CAC7H,IAAM,EAAQ,OAA0C,CAAE,iBAAgB,EAAG,CAAC,EAAe,CAAC,CAC9F,OAAO,EAAC,GAAyB,SAAA,CAAgB,QAAQ,YAA6C,EACtG,CACF,GAA4B,YAAc,8BAO1C,MAAM,GAA4B,GAAwD,CAAE,QAAO,eAAc,YAAW,cAAe,CACzI,IAAM,EAAQ,OAAwC,CAAE,QAAO,eAAc,YAAW,EAAG,CAAC,EAAO,EAAc,EAAU,CAAC,CAC5H,OAAO,EAAC,GAAuB,SAAA,CAAgB,QAAQ,YAA2C,EAClG,CACF,GAA0B,YAAc,4BAMxC,MAAM,GAAyB,GAC5B,CAAE,oBAAmB,qBAAoB,oBAAmB,qBAAoB,0BAAyB,cAAe,CACvH,IAAM,EAAQ,OACL,CAAE,oBAAmB,qBAAoB,oBAAmB,qBAAoB,0BAAyB,EAChH,CAAC,EAAmB,EAAoB,EAAmB,EAAoB,EAAwB,CACxG,CACD,OAAO,EAAC,GAAoB,SAAA,CAAgB,QAAQ,YAAwC,EAE/F,CACD,GAAuB,YAAc,yBAMrC,MAAM,GAAsB,GAAkD,CAAE,aAAY,eAAc,UAAS,oBAAmB,cAAe,CACnJ,IAAM,EAAQ,OAAkC,CAAE,aAAY,eAAc,UAAS,oBAAmB,EAAG,CAAC,EAAY,EAAS,EAAkB,CAAC,CACpJ,OAAO,EAAC,GAAiB,SAAA,CAAgB,QAAQ,YAAqC,EACtF,CACF,GAAoB,YAAc,sBAMlC,MAAM,GAAqB,GACxB,CAAE,gBAAe,oBAAmB,qBAAoB,oBAAmB,qBAAoB,aAAY,cAAe,CACzH,IAAM,EAAQ,OACL,CACL,gBACA,oBACA,qBACA,oBACA,qBACA,aACD,EACD,CAAC,EAAe,EAAmB,EAAoB,EAAmB,EAAoB,EAAW,CAC1G,CACD,OAAO,EAAC,GAAgB,SAAA,CAAgB,QAAQ,YAAoC,EAEvF,CACD,GAAmB,YAAc,qBAkCjC,MAAa,IAIX,CACA,QAEA,aAAa,GACb,eAAe,GACf,YAAY,GACZ,oBAAoB,EAEpB,OACA,UACA,YAEA,oBAAoB,EAAE,CACtB,qBAAqB,EAAE,CAEvB,gBACA,aACA,iBACA,kBAEA,gBACA,qBACA,UACA,cAEA,oBAAoB,EAAE,CACtB,iBAEA,eACwE,CACxE,IAAM,EAAiB,IAAO,CACxB,GAAe,IAAO,CAEtB,CAAC,EAAc,GAAmB,EAA4B,EAAE,CAAC,CACjE,CAAC,EAAe,IAAoB,EAA6B,CACrE,MAAO,EACP,KAAM,CAAC,SAAU,GAAG,EAAkB,CACvC,CAAC,CACI,CAAC,GAAU,GAAe,EAAwB,EAAE,CAAC,CACrD,CAAC,EAAe,GAAoB,EAAyB,EAAE,CAAC,CAEhE,EAA2B,EAC/B,IACE,EAAgB,EAAgB,CAChC,IAAiB,aAA2B,SAAW,EAAgB,EAAa,CAAG,EAAgB,CAChG,GAET,CAAC,EAAc,EAAe,CAC/B,CAEK,EAA4B,EAChC,GAAoB,CAClB,GAAiB,EAAiB,CAClC,IAAkB,aAA4B,SAAW,EAAiB,EAAc,CAAG,EAAiB,EAE9G,CAAC,EAAe,EAAgB,CACjC,CAEK,EAAY,EACf,GAAyB,CACxB,IAAM,EAAO,EAAyC,KAAK,GAAK,EAAE,KAAO,EAAa,CACtF,GAAI,CAAC,EAAK,OACV,IAAMC,EAA0B,CAC9B,GAAI,GAAG,EAAa,GAAG,OAAO,YAAY,GAC1C,eACA,MAAO,GAAyB,EAAI,KAAK,CAC1C,CACD,EAAiB,GAAQ,CACvB,IAAM,EAAO,CAAC,GAAG,EAAM,EAAU,CAEjC,OADA,IAAiB,EAAK,CACf,GACP,EAEJ,CAAC,EAAmB,EAAe,CACpC,CAEK,EAAe,EAClB,GAAqB,CACpB,EAAiB,GAAQ,CACvB,IAAM,EAAO,EAAK,OAAO,GAAK,EAAE,KAAO,EAAS,CAEhD,OADA,IAAiB,EAAK,CACf,GACP,EAEJ,CAAC,EAAe,CACjB,CAEK,EAAe,GAClB,EAAkB,IAAuB,CACxC,EAAiB,GAAQ,CACvB,IAAM,EAAO,EAAK,IAAI,GAAM,EAAE,KAAO,EAAW,CAAE,GAAG,EAAG,MAAA,EAAO,CAAG,EAAG,CAErE,OADA,IAAiB,EAAK,CACf,GACP,EAEJ,CAAC,EAAe,CACjB,CAEK,GAAqB,OAClB,CACc,oBACnB,gBACA,YACA,eACA,eACD,EACD,CAAC,EAAmB,EAAe,EAAW,EAAc,EAAa,CAC1E,CAEK,EAAQ,GAAqB,CAC3B,OACG,UACT,MAAO,CACL,eACA,gBACA,YACD,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,gBAAiB,IAAiB,CAClC,mBAAoB,IAAoB,CACxC,oBAAqB,IAAqB,CAE1C,qBAAsB,EACtB,sBAAuB,EACvB,iBAAkB,EACnB,CAAC,CAGI,EAAO,MAAc,CACzB,GAAM,CAAE,KAAA,GAAS,EAAM,aAAa,CACpC,OAAOC,GACN,CAAC,EAAM,aAAa,CAAC,KAAM,EAAM,UAAU,CAAC,cAAc,CAAC,CAExD,EAAU,MACP,CAAC,GAAc,CAAC,GAAgB,EAAK,SAAW,EACtD,CAAC,EAAM,EAAY,EAAa,CAAC,CAG9B,GAAQ,OACL,CACL,QACA,QAEA,UACA,aACA,eACA,YACA,oBAEA,YAEA,gBACA,qBAEA,UACA,cACD,EACD,CACE,EACA,EAEA,EACA,EACA,EACA,EACA,EAEA,EAEA,EACA,EACA,EAAM,UAAU,CAAC,cACjB,EAAM,UAAU,CAAC,SAEjB,EACA,EACD,CACF,CAGK,EAAa,MACV,EAAM,UAAU,CACtB,CAAC,EAAM,UAAU,CAAC,CAAC,CAGhB,EAAoB,MACjB,EAAM,sBAAsB,CAClC,CAAC,EAAM,sBAAsB,CAAC,CAAC,CAE5B,GAAoB,MACjB,EAAW,aACjB,CAAC,EAAW,aAAa,CAAC,CAEvB,GAAqB,MAClB,EAAW,cACjB,CAAC,EAAW,cAAc,CAAC,CAGxB,GAAoB,MACjB,EAAM,qBAAqB,CAAC,IAAI,SAAW,EAAE,CACnD,CAAC,EAAM,UAAU,CAAC,cAAc,CAAC,CAG9B,GAAqB,MAClB,EAAM,sBAAsB,CAAC,IAAI,SAAW,EAAE,CACpD,CAAC,EAAM,UAAU,CAAC,cAAc,CAAC,CAG9B,GAAY,MACT,EAAM,cAAc,CAC1B,CAAC,EAAM,cAAc,CAAC,CAAC,CAE1B,OACE,EAAC,GAAmB,SAAA,CAAS,MAAO,YAClC,EAAC,GAAa,SAAA,CAAgB,kBAC5B,EAAC,GAAA,CAA4C,0BAC3C,EAAC,GAAA,CAAiC,QAAqB,gBAAyB,sBAC9E,EAAC,GAAA,CACoB,oBACC,sBACD,qBACC,sBACpB,wBAAyB,EAAM,+BAE/B,EAAC,GAAA,CAAgC,aAA0B,eAAuB,UAA4B,8BAC5G,EAAC,GAAA,CACgB,gBACI,oBACC,sBACD,qBACC,sBACR,aAEX,aACkB,EACD,EACC,EACC,EACA,EACR,EACI,EChalC,SAAS,GAAW,EAAiC,CACnD,GAAI,GAAU,KAA6B,MAAO,GAClD,GAAI,OAAO,GAAU,SAAU,OAAO,OAAO,EAAM,CACnD,GAAI,OAAO,GAAU,UAAW,OAAO,EAAQ,OAAS,QACxD,IAAM,EAAM,OAAO,EAAM,CAIzB,OAHI,EAAI,SAAS,IAAI,EAAI,EAAI,SAAS,IAAI,EAAI,EAAI,SAAS;EAAK,EAAI,EAAI,SAAS,KAAK,CAC7E,IAAI,EAAI,QAAQ,KAAM,KAAK,CAAC,GAE9B,EAGT,SAAgB,GAAgB,EAA2B,CACzD,GAAI,EAAK,SAAW,EAAG,MAAO,GAC9B,IAAM,EAAU,EAAK,GAAG,IAAI,GAAQ,GAAW,EAAK,MAAM,CAAC,CACrD,EAAW,EAAK,IAAI,GAAO,EAAI,IAAI,GAAQ,GAAW,EAAK,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,CACnF,MAAO,CAAC,EAAQ,KAAK,IAAI,CAAE,GAAG,EAAS,CAAC,KAAK;EAAK,CAGpD,SAAgB,GAAY,EAAmB,EAAwB,CACrE,IAAM,EAAU,GAAgB,EAAK,CACrC,GAAI,CAAC,EAAS,OACd,IAAM,EAAO,IAAI,KAAK,CAAC,EAAQ,CAAE,CAAE,KAAM,0BAA2B,CAAC,CAC/D,EAAM,IAAI,gBAAgB,EAAK,CAC/B,EAAO,SAAS,cAAc,IAAI,CACxC,EAAK,KAAO,EACZ,EAAK,SAAW,GAAG,EAAS,MAC5B,EAAK,OAAO,CACZ,IAAI,gBAAgB,EAAI,CCE1B,MAAaC,IAIR,CAAE,WAAU,WAAU,GAAG,KAAY,CACxC,IAAM,EAAkB,GAAqB,GAAkB,CAC7D,IAAW,EAAM,EAChB,IAAI,CACP,OACE,EAAC,MAAA,CAAI,UAAU,4CACb,EAAC,EAAA,CACC,GAAI,EACJ,KAAK,KACL,KAAK,SACL,YAAY,oBACZ,UAAU,mBACV,SAAU,GAAK,CACb,IAAW,EAAE,CACb,EAAgB,EAAE,OAAO,OAAS,GAAG,GAEvC,CACF,EAAC,MAAA,CAAI,UAAU,mJACb,EAAC,GAAA,CAAW,KAAM,GAAA,CAAM,EACpB,CACN,EAAC,SAAA,CACC,UAAU,8XACV,aAAW,gBACX,KAAK,kBAEL,EAAC,EAAA,CAAe,KAAM,GAAI,cAAY,QAAS,EACxC,GACL,EAIJC,GAAmF,CAAE,WAAU,WAAU,aAE3G,EAAC,SAAA,CACC,KAAK,SACK,WACV,UAAU,uYACD,UAER,YACM,CAqBAC,IAIP,CAAE,WAAU,aAAY,eAAgB,CAC5C,GAAM,CAAE,QAAO,UAAS,cAAa,SAAU,GAAmB,CAE5D,EAAiB,MAAkB,CACvC,GAAI,EAAY,CACd,GAAY,CACZ,OAEF,GAAI,CAAC,GAAW,EAAQ,SAAW,EAAG,OACtC,IAAM,EAAe,EAAM,qBAAqB,CAAC,SAEjD,GADa,EAAa,OAAS,EAAI,EAAa,IAAI,GAAO,EAAQ,EAAI,OAAO,CAAC,OAAO,QAAQ,CAAG,EACnF,GAAe,EAAM,EACtC,CAAC,EAAY,EAAS,EAAa,EAAO,EAAM,CAAC,CAE9C,EAAoB,CAAC,EAAE,GAAe,GAAW,EAAQ,OAAS,GAExE,OACE,EAAC,MAAA,CAAI,UAAU,iIACb,EAAC,EAAA,CACC,SAAU,CAAC,EACX,QAAS,GAAK,CACZ,KAAY,CACZ,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,WAGpB,EAAC,GAAA,EAAA,CAAa,EACD,CACf,EAAC,EAAA,CACC,SAAU,CAAC,EACX,QAAS,GAAK,CACZ,KAAa,CACb,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,WAGpB,EAAC,GAAA,EAAA,CAAgB,EACJ,CACf,EAAC,EAAA,CACC,SAAU,CAAC,EACX,QAAS,GAAK,CACZ,GAAgB,CAChB,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,WAGpB,EAAC,EAAA,EAAA,CAAe,EACH,GACX,EAyBGC,IAAqD,CAAE,cAAe,CACjF,GAAM,CAAE,SAAU,GAAmB,CACrC,OACE,EAAC,MAAA,CAAI,YAAU,gBAAgB,UAAU,sGACvC,EAAC,KAAA,CAAG,UAAU,sDAA8C,GAAW,CACvE,EAAC,MAAA,CAAI,UAAU,6CAA8C,YAAe,CAAA,EACxE,EAGV,GAAe,YAAc"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime27 from "react/jsx-runtime";
|
|
2
|
+
import * as class_variance_authority_types2 from "class-variance-authority/types";
|
|
3
3
|
import { ComponentPropsWithoutRef } from "react";
|
|
4
4
|
import { VariantProps } from "class-variance-authority";
|
|
5
5
|
|
|
6
6
|
//#region packages/components/typography/paragraph.d.ts
|
|
7
7
|
declare const paragraphVariants: (props?: ({
|
|
8
|
-
variant?: "xs" | "sm" | "lg" | "
|
|
9
|
-
} &
|
|
8
|
+
variant?: "xs" | "sm" | "lg" | "lead" | "p" | "muted" | null | undefined;
|
|
9
|
+
} & class_variance_authority_types2.ClassProp) | undefined) => string;
|
|
10
10
|
/**
|
|
11
11
|
* Props for the {@link Paragraph} component.
|
|
12
12
|
*
|
|
@@ -42,7 +42,7 @@ declare const Paragraph: ({
|
|
|
42
42
|
variant,
|
|
43
43
|
className,
|
|
44
44
|
...props
|
|
45
|
-
}: ParagraphProps) =>
|
|
45
|
+
}: ParagraphProps) => react_jsx_runtime27.JSX.Element;
|
|
46
46
|
//#endregion
|
|
47
47
|
export { Paragraph, ParagraphProps, paragraphVariants };
|
|
48
48
|
//# sourceMappingURL=paragraph.d.cts.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ComponentPropsWithoutRef } from "react";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime26 from "react/jsx-runtime";
|
|
3
3
|
import { VariantProps } from "class-variance-authority";
|
|
4
|
-
import * as
|
|
4
|
+
import * as class_variance_authority_types1 from "class-variance-authority/types";
|
|
5
5
|
|
|
6
6
|
//#region packages/components/typography/paragraph.d.ts
|
|
7
7
|
declare const paragraphVariants: (props?: ({
|
|
8
|
-
variant?: "xs" | "sm" | "lg" | "
|
|
9
|
-
} &
|
|
8
|
+
variant?: "xs" | "sm" | "lg" | "lead" | "p" | "muted" | null | undefined;
|
|
9
|
+
} & class_variance_authority_types1.ClassProp) | undefined) => string;
|
|
10
10
|
/**
|
|
11
11
|
* Props for the {@link Paragraph} component.
|
|
12
12
|
*
|
|
@@ -42,7 +42,7 @@ declare const Paragraph: ({
|
|
|
42
42
|
variant,
|
|
43
43
|
className,
|
|
44
44
|
...props
|
|
45
|
-
}: ParagraphProps) =>
|
|
45
|
+
}: ParagraphProps) => react_jsx_runtime26.JSX.Element;
|
|
46
46
|
//#endregion
|
|
47
47
|
export { Paragraph, ParagraphProps, paragraphVariants };
|
|
48
48
|
//# sourceMappingURL=paragraph.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime29 from "react/jsx-runtime";
|
|
2
2
|
import { ReactNode } from "react";
|
|
3
3
|
|
|
4
4
|
//#region packages/components/typography/title.d.ts
|
|
@@ -38,7 +38,7 @@ declare const Title: ({
|
|
|
38
38
|
level,
|
|
39
39
|
className,
|
|
40
40
|
children
|
|
41
|
-
}: TitleProps) =>
|
|
41
|
+
}: TitleProps) => react_jsx_runtime29.JSX.Element;
|
|
42
42
|
//#endregion
|
|
43
43
|
export { Title, TitleProps };
|
|
44
44
|
//# sourceMappingURL=title.d.cts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from "react";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime57 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region packages/components/typography/title.d.ts
|
|
5
5
|
type TitleProps = {
|
|
@@ -38,7 +38,7 @@ declare const Title: ({
|
|
|
38
38
|
level,
|
|
39
39
|
className,
|
|
40
40
|
children
|
|
41
|
-
}: TitleProps) =>
|
|
41
|
+
}: TitleProps) => react_jsx_runtime57.JSX.Element;
|
|
42
42
|
//#endregion
|
|
43
43
|
export { Title, TitleProps };
|
|
44
44
|
//# sourceMappingURL=title.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime203 from "react/jsx-runtime";
|
|
2
2
|
import { AlertDialog as AlertDialog$1 } from "radix-ui";
|
|
3
3
|
|
|
4
4
|
//#region packages/components/ui/alert-dialog.d.ts
|
|
@@ -36,55 +36,55 @@ import { AlertDialog as AlertDialog$1 } from "radix-ui";
|
|
|
36
36
|
*/
|
|
37
37
|
declare function AlertDialog({
|
|
38
38
|
...props
|
|
39
|
-
}: React.ComponentProps<typeof AlertDialog$1.Root>):
|
|
39
|
+
}: React.ComponentProps<typeof AlertDialog$1.Root>): react_jsx_runtime203.JSX.Element;
|
|
40
40
|
/** Element that opens the alert dialog when clicked; typically wrapped with `asChild` around a `Button`. */
|
|
41
41
|
declare function AlertDialogTrigger({
|
|
42
42
|
...props
|
|
43
|
-
}: React.ComponentProps<typeof AlertDialog$1.Trigger>):
|
|
43
|
+
}: React.ComponentProps<typeof AlertDialog$1.Trigger>): react_jsx_runtime203.JSX.Element;
|
|
44
44
|
/** Renders alert dialog overlay and content into a portal outside the normal React tree. */
|
|
45
45
|
declare function AlertDialogPortal({
|
|
46
46
|
...props
|
|
47
|
-
}: React.ComponentProps<typeof AlertDialog$1.Portal>):
|
|
47
|
+
}: React.ComponentProps<typeof AlertDialog$1.Portal>): react_jsx_runtime203.JSX.Element;
|
|
48
48
|
/** Semi-transparent backdrop rendered behind the alert dialog panel; pointer events are disabled to prevent accidental dismissal. */
|
|
49
49
|
declare function AlertDialogOverlay({
|
|
50
50
|
className,
|
|
51
51
|
...props
|
|
52
|
-
}: React.ComponentProps<typeof AlertDialog$1.Overlay>):
|
|
52
|
+
}: React.ComponentProps<typeof AlertDialog$1.Overlay>): react_jsx_runtime203.JSX.Element;
|
|
53
53
|
/** Animated panel that contains the alert dialog body; renders via `AlertDialogPortal` over `AlertDialogOverlay`. */
|
|
54
54
|
declare function AlertDialogContent({
|
|
55
55
|
className,
|
|
56
56
|
...props
|
|
57
|
-
}: React.ComponentProps<typeof AlertDialog$1.Content>):
|
|
57
|
+
}: React.ComponentProps<typeof AlertDialog$1.Content>): react_jsx_runtime203.JSX.Element;
|
|
58
58
|
/** Layout wrapper for the alert dialog title and description. */
|
|
59
59
|
declare function AlertDialogHeader({
|
|
60
60
|
className,
|
|
61
61
|
...props
|
|
62
|
-
}: React.ComponentProps<'div'>):
|
|
62
|
+
}: React.ComponentProps<'div'>): react_jsx_runtime203.JSX.Element;
|
|
63
63
|
/** Layout wrapper for the cancel and action buttons at the bottom of the alert dialog. */
|
|
64
64
|
declare function AlertDialogFooter({
|
|
65
65
|
className,
|
|
66
66
|
...props
|
|
67
|
-
}: React.ComponentProps<'div'>):
|
|
67
|
+
}: React.ComponentProps<'div'>): react_jsx_runtime203.JSX.Element;
|
|
68
68
|
/** Accessible heading for the alert dialog, styled with the h3 heading variant. */
|
|
69
69
|
declare function AlertDialogTitle({
|
|
70
70
|
className,
|
|
71
71
|
...props
|
|
72
|
-
}: React.ComponentProps<typeof AlertDialog$1.Title>):
|
|
72
|
+
}: React.ComponentProps<typeof AlertDialog$1.Title>): react_jsx_runtime203.JSX.Element;
|
|
73
73
|
/** Muted supporting text that explains the consequences of the destructive action. */
|
|
74
74
|
declare function AlertDialogDescription({
|
|
75
75
|
className,
|
|
76
76
|
...props
|
|
77
|
-
}: React.ComponentProps<typeof AlertDialog$1.Description>):
|
|
77
|
+
}: React.ComponentProps<typeof AlertDialog$1.Description>): react_jsx_runtime203.JSX.Element;
|
|
78
78
|
/** Confirm button that closes the dialog and proceeds with the action; auto-focused and styled as the primary action. */
|
|
79
79
|
declare function AlertDialogAction({
|
|
80
80
|
className,
|
|
81
81
|
...props
|
|
82
|
-
}: React.ComponentProps<typeof AlertDialog$1.Action>):
|
|
82
|
+
}: React.ComponentProps<typeof AlertDialog$1.Action>): react_jsx_runtime203.JSX.Element;
|
|
83
83
|
/** Cancel button that closes the alert dialog without performing the destructive action. */
|
|
84
84
|
declare function AlertDialogCancel({
|
|
85
85
|
className,
|
|
86
86
|
...props
|
|
87
|
-
}: React.ComponentProps<typeof AlertDialog$1.Cancel>):
|
|
87
|
+
}: React.ComponentProps<typeof AlertDialog$1.Cancel>): react_jsx_runtime203.JSX.Element;
|
|
88
88
|
//#endregion
|
|
89
89
|
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger };
|
|
90
90
|
//# sourceMappingURL=alert-dialog.d.cts.map
|