@mastra/playground-ui 64.0.0-alpha.8 → 64.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/combobox-BNlVCFgY.cjs +718 -0
- package/dist/combobox-BNlVCFgY.cjs.map +1 -0
- package/dist/combobox-Bw13EcK0.js +676 -0
- package/dist/combobox-Bw13EcK0.js.map +1 -0
- package/dist/{combobox-styles-B3jftCXY.js → combobox-styles-Dr66ofEp.js} +2 -2
- package/dist/{combobox-styles-B3jftCXY.js.map → combobox-styles-Dr66ofEp.js.map} +1 -1
- package/dist/components/Combobox.cjs.js +22 -1
- package/dist/components/Combobox.cjs.js.map +1 -1
- package/dist/components/Combobox.es.js +2 -2
- package/dist/components/DataList.cjs.js +15 -17
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +4 -5
- package/dist/components/DataList.es.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/FilterBar.es.js +3 -3
- package/dist/components/LogsDataList.cjs.js +5 -2
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +5 -2
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/Meter.cjs.js +172 -0
- package/dist/components/Meter.cjs.js.map +1 -0
- package/dist/components/Meter.d.ts +2 -0
- package/dist/components/Meter.es.js +167 -0
- package/dist/components/Meter.es.js.map +1 -0
- package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
- package/dist/components/MetricsStackedBarChart.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +1 -1
- package/dist/components/PropertyFilter.es.js +1 -1
- package/dist/components/SavedViews.es.js +1 -1
- package/dist/components/Table.cjs.js +11 -1
- package/dist/components/Table.cjs.js.map +1 -1
- package/dist/components/Table.es.js +11 -1
- package/dist/components/Table.es.js.map +1 -1
- package/dist/{data-list-top-DSr_ocKA.js → data-list-DdCZZctL.js} +332 -5
- package/dist/data-list-DdCZZctL.js.map +1 -0
- package/dist/{data-list-top-ByT2Mo77.cjs → data-list-ecHsw-zr.cjs} +339 -13
- package/dist/data-list-ecHsw-zr.cjs.map +1 -0
- package/dist/{data-list-skeleton-B_SXAeE0.js → data-list-skeleton-CGKlcoiI.js} +2 -2
- package/dist/{data-list-skeleton-B_SXAeE0.js.map → data-list-skeleton-CGKlcoiI.js.map} +1 -1
- package/dist/{data-list-skeleton-BqC9Gggi.cjs → data-list-skeleton-DGMTqeNP.cjs} +6 -6
- package/dist/{data-list-skeleton-BqC9Gggi.cjs.map → data-list-skeleton-DGMTqeNP.cjs.map} +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +3 -2
- package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +3 -2
- package/dist/domains/logs/components/logs-list-view.es.js.map +1 -1
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +1 -1
- package/dist/domains/metrics/components/agent-runs-card.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-card.es.js +1 -1
- package/dist/domains/scores/components/span-scoring.cjs.js +1 -1
- package/dist/domains/scores/components/span-scoring.es.js +1 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js +2 -1
- package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +2 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js +0 -1
- package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js +0 -1
- package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +10 -2
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +10 -2
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +2 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +2 -1
- package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.es.js +1 -1
- package/dist/domains/traces/components/traces-list-view-adapter.cjs.js +2 -0
- package/dist/domains/traces/components/traces-list-view-adapter.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view-adapter.es.js +2 -0
- package/dist/domains/traces/components/traces-list-view-adapter.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +13 -5
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +12 -4
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +4 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +4 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.cjs.js +12 -4
- package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.es.js +12 -4
- package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
- package/dist/domains/workflows/components/workflow-combobox.cjs.js +1 -1
- package/dist/domains/workflows/components/workflow-combobox.es.js +1 -1
- package/dist/domains/workflows/components/workflows-list/workflows-list.cjs.js +2 -2
- package/dist/domains/workflows/components/workflows-list/workflows-list.es.js +2 -2
- package/dist/ee/signals/components/entity-index-list.cjs.js +3 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +3 -1
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +3 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +3 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/{filter-bar-chip-BAqmNIeE.js → filter-bar-chip-BarAq1S2.js} +2 -2
- package/dist/{filter-bar-chip-BAqmNIeE.js.map → filter-bar-chip-BarAq1S2.js.map} +1 -1
- package/dist/layout/tabbed-container.cjs.js +2 -2
- package/dist/layout/tabbed-container.es.js +2 -2
- package/dist/{logs-data-list-CoER2Hst.js → logs-data-list-DBJINzIL.js} +2 -3
- package/dist/{logs-data-list-CoER2Hst.js.map → logs-data-list-DBJINzIL.js.map} +1 -1
- package/dist/{logs-data-list-DRR6cMgl.cjs → logs-data-list-IWZgMCKG.cjs} +21 -22
- package/dist/{logs-data-list-DRR6cMgl.cjs.map → logs-data-list-IWZgMCKG.cjs.map} +1 -1
- package/dist/{metrics-stacked-bar-chart-BijHfnOd.cjs → metrics-stacked-bar-chart-BofJ8NDc.cjs} +45 -3
- package/dist/metrics-stacked-bar-chart-BofJ8NDc.cjs.map +1 -0
- package/dist/{metrics-stacked-bar-chart-CdcENBLD.js → metrics-stacked-bar-chart-DcxHznKw.js} +47 -5
- package/dist/metrics-stacked-bar-chart-DcxHznKw.js.map +1 -0
- package/dist/src/domains/traces/components/traces-list-view.d.ts +4 -0
- package/dist/src/domains/traces/trace-list-columns.d.ts +1 -1
- package/dist/src/ds/components/Combobox/combobox-parts.d.ts +102 -0
- package/dist/src/ds/components/Combobox/combobox.d.ts +17 -3
- package/dist/src/ds/components/Combobox/index.d.ts +1 -0
- package/dist/src/ds/components/DataList/TracesDataList/traces-data-list-cells.d.ts +7 -0
- package/dist/src/ds/components/DataList/TracesDataList/traces-data-list.d.ts +2 -1
- package/dist/src/ds/components/Meter/index.d.ts +2 -0
- package/dist/src/ds/components/Meter/meter-context.d.ts +6 -0
- package/dist/src/ds/components/Meter/meter-key-row.d.ts +6 -0
- package/dist/src/ds/components/Meter/meter-root.d.ts +14 -0
- package/dist/src/ds/components/Meter/meter-segment.d.ts +5 -0
- package/dist/src/ds/components/Meter/meter-source.d.ts +6 -0
- package/dist/src/ds/components/Meter/meter.d.ts +6 -0
- package/dist/src/ds/components/MetricsStackedBarChart/metrics-stacked-bar-chart.d.ts +1 -0
- package/dist/src/ds/components/Table/Table.d.ts +4 -2
- package/dist/style.css +196 -2
- package/dist/{traces-data-list-B0-fbEpk.cjs → traces-data-list-BH24OVKh.cjs} +23 -19
- package/dist/traces-data-list-BH24OVKh.cjs.map +1 -0
- package/dist/{traces-data-list-0GcqZUbe.js → traces-data-list-BOJB37dV.js} +8 -4
- package/dist/traces-data-list-BOJB37dV.js.map +1 -0
- package/package.json +10 -10
- package/dist/combobox-DlKD-Q3M.js +0 -208
- package/dist/combobox-DlKD-Q3M.js.map +0 -1
- package/dist/combobox-VHtZQcl9.cjs +0 -229
- package/dist/combobox-VHtZQcl9.cjs.map +0 -1
- package/dist/data-list-DUfXIhyC.cjs +0 -142
- package/dist/data-list-DUfXIhyC.cjs.map +0 -1
- package/dist/data-list-DXQY_iQW.js +0 -138
- package/dist/data-list-DXQY_iQW.js.map +0 -1
- package/dist/data-list-spacer-ByA4ce2a.js +0 -209
- package/dist/data-list-spacer-ByA4ce2a.js.map +0 -1
- package/dist/data-list-spacer-tQaBaum4.cjs +0 -218
- package/dist/data-list-spacer-tQaBaum4.cjs.map +0 -1
- package/dist/data-list-top-ByT2Mo77.cjs.map +0 -1
- package/dist/data-list-top-DSr_ocKA.js.map +0 -1
- package/dist/metrics-stacked-bar-chart-BijHfnOd.cjs.map +0 -1
- package/dist/metrics-stacked-bar-chart-CdcENBLD.js.map +0 -1
- package/dist/traces-data-list-0GcqZUbe.js.map +0 -1
- package/dist/traces-data-list-B0-fbEpk.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.cjs.js","sources":["../../src/ds/components/Table/table-align.ts","../../src/ds/components/Table/table-context.ts","../../src/ds/components/Table/Cells.tsx","../../src/ds/components/Table/table-pagination.tsx","../../src/ds/components/Table/table-row-target.ts","../../src/ds/components/Table/table-row-button.tsx","../../src/ds/components/Table/table-row-link.tsx","../../src/ds/components/Table/table-sort-button.tsx","../../src/ds/components/Table/Table.tsx","../../src/ds/components/Table/use-table-keyboard-navigation.ts"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nexport type TableAlign = 'start' | 'center' | 'end';\n\ntype NativeCellAlign = ComponentProps<'td'>['align'];\n\nexport const tableAlignClasses: Record<TableAlign, string> = {\n start: 'text-left',\n center: 'text-center',\n end: 'text-right',\n};\n\nexport function resolveTableAlign(align: string | undefined): TableAlign {\n if (align === 'center') return 'center';\n if (align === 'end' || align === 'right') return 'end';\n return 'start';\n}\n\nexport function toNativeAlign(align: TableAlign | NativeCellAlign): NativeCellAlign {\n if (align === 'start') return 'left';\n if (align === 'end') return 'right';\n return align;\n}\n","import { createContext, use } from 'react';\n\nexport type TableVariant = 'default' | 'inset';\n\nexport const TableVariantContext = createContext<TableVariant>('default');\n\nexport function useTableVariant() {\n return use(TableVariantContext);\n}\n\nexport function insetSlot(variant: TableVariant, slot: string) {\n if (variant === 'inset') return slot;\n return undefined;\n}\n","import React from 'react';\n\nimport { Icon } from '../../icons/Icon';\nimport { Txt } from '../Txt';\nimport { resolveTableAlign, tableAlignClasses, toNativeAlign } from './table-align';\nimport type { TableAlign } from './table-align';\nimport { useTableVariant } from './table-context';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/utils/date-format';\n\nexport type TableCellTone = 'ink' | 'muted';\n\nconst tableCellToneClasses: Record<TableCellTone, string> = {\n ink: 'text-foreground',\n muted: 'text-muted-foreground',\n};\n\nexport interface CellProps extends Omit<React.ComponentProps<'td'>, 'align'> {\n align?: TableAlign | React.TdHTMLAttributes<HTMLTableCellElement>['align'];\n tone?: TableCellTone;\n className?: string;\n children: React.ReactNode;\n}\n\nconst insetCellClass = cn(\n 'h-9 border-transparent bg-background bg-clip-padding px-2 py-1 align-middle whitespace-nowrap first:pl-3 last:pr-3',\n 'group-data-column-dividers/table:border-l group-data-column-dividers/table:px-3',\n);\n\nexport const Cell = ({ className, children, tone = 'ink', align, ...props }: CellProps) => {\n const variant = useTableVariant();\n if (variant === 'inset') {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n insetCellClass,\n tableAlignClasses[resolveTableAlign(align)],\n tableCellToneClasses[tone],\n className,\n )}\n {...props}\n >\n {children}\n </td>\n );\n }\n return (\n <td\n className={cn(tableCellToneClasses[tone], 'first:pl-3 last:pr-3', className)}\n {...props}\n align={toNativeAlign(align)}\n >\n <div className={cn('flex size-full shrink-0 items-center')}>{children}</div>\n </td>\n );\n};\n\nexport const TxtCell = ({ className, children }: CellProps) => {\n return (\n <Cell className={className}>\n <Txt as=\"span\" variant=\"body-sm\" className=\"w-full truncate\">\n {children}\n </Txt>\n </Cell>\n );\n};\n\nexport interface DateTimeCellProps extends Omit<CellProps, 'children'> {\n dateTime: Date;\n}\n\nexport const DateTimeCell = ({ dateTime, ...props }: DateTimeCellProps) => {\n return (\n <Cell {...props}>\n <Txt as=\"span\" variant=\"body\" className=\"shrink-0\">\n {formatDate(dateTime, 'date-time-seconds')}\n </Txt>\n </Cell>\n );\n};\n\nexport interface EntryCellProps extends Omit<CellProps, 'children'> {\n name: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport const EntryCell = ({ name, description, icon, meta, ...props }: EntryCellProps) => {\n return (\n <Cell {...props}>\n <div className=\"flex items-center gap-3.5\">\n {icon && (\n <Icon size=\"lg\" className=\"text-foreground\">\n {icon}\n </Icon>\n )}\n\n <div className=\"flex flex-col gap-0\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {name}\n </Txt>\n {description && (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"w-full max-w-75 truncate pt-1\">\n {description}\n </Txt>\n )}\n </div>\n {meta}\n </div>\n </Cell>\n );\n};\n","import type { ComponentProps } from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from '../Pagination/pagination';\nimport { getPaginationRange } from '../Pagination/pagination-range';\n\nexport type TablePaginationProps = Omit<ComponentProps<'nav'>, 'children'> & {\n page: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n};\n\nexport function TablePagination({ page, pageCount, onPageChange, ...props }: TablePaginationProps) {\n return (\n <Pagination {...props}>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious disabled={page <= 0} onClick={() => onPageChange(page - 1)} />\n </PaginationItem>\n {getPaginationRange(page, pageCount).map(item => {\n if (item.kind === 'ellipsis') {\n return (\n <PaginationItem key={item.key}>\n <PaginationEllipsis />\n </PaginationItem>\n );\n }\n return (\n <PaginationItem key={item.page}>\n <PaginationLink\n aria-label={`Page ${item.page + 1}`}\n isActive={item.page === page}\n onClick={() => onPageChange(item.page)}\n >\n {item.page + 1}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext disabled={page >= pageCount - 1} onClick={() => onPageChange(page + 1)} />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n );\n}\n","import type { TableVariant } from './table-context';\n\nconst stretchedTargetStyles = [\n \"outline-none after:absolute after:inset-0 after:content-['']\",\n 'focus-visible:after:outline-1 focus-visible:after:-outline-offset-1 focus-visible:after:outline-border-focus focus-visible:after:outline-solid',\n];\n\nexport function tableRowTargetStyles(variant: TableVariant) {\n if (variant === 'inset') return stretchedTargetStyles;\n return [];\n}\n","import type { ComponentProps } from 'react';\nimport { useTableVariant } from './table-context';\nimport { tableRowTargetStyles } from './table-row-target';\nimport { cn } from '@/lib/utils';\n\nexport type TableRowButtonProps = Omit<ComponentProps<'button'>, 'type'>;\n\nexport function TableRowButton({ className, ...props }: TableRowButtonProps) {\n const variant = useTableVariant();\n return (\n <button\n type=\"button\"\n data-slot=\"table-row-button\"\n data-row-target=\"\"\n className={cn('cursor-pointer text-left', ...tableRowTargetStyles(variant), className)}\n {...props}\n />\n );\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { useTableVariant } from './table-context';\nimport { tableRowTargetStyles } from './table-row-target';\nimport { cn } from '@/lib/utils';\n\nexport type TableRowLinkProps = useRender.ComponentProps<'a'>;\n\nexport function TableRowLink({ render, className, ...props }: TableRowLinkProps) {\n const variant = useTableVariant();\n return useRender({\n defaultTagName: 'a',\n render,\n props: {\n ...props,\n 'data-slot': 'table-row-link',\n 'data-row-target': '',\n className: cn(...tableRowTargetStyles(variant), className),\n },\n });\n}\n","import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlStateColorTransition, focusRingOffset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type TableSortDirection = 'ascending' | 'descending' | 'none';\n\nexport type TableSortButtonProps = Omit<ComponentProps<'button'>, 'type'> & {\n direction?: TableSortDirection;\n};\n\nconst sortIcons = {\n ascending: ArrowUp,\n descending: ArrowDown,\n none: ArrowUpDown,\n} satisfies Record<TableSortDirection, LucideIcon>;\n\nexport function TableSortButton({ direction = 'none', className, children, ...props }: TableSortButtonProps) {\n const SortIcon = sortIcons[direction];\n const sorted = direction !== 'none';\n return (\n <button\n type=\"button\"\n data-slot=\"table-sort-button\"\n data-sorted={sorted || undefined}\n className={cn(\n 'group/sort inline-flex cursor-pointer items-center gap-1 rounded-sm align-middle',\n 'group-data-[align=end]/head:flex-row-reverse',\n 'hover:text-foreground data-sorted:text-foreground',\n controlStateColorTransition,\n focusRingOffset,\n className,\n )}\n {...props}\n >\n {children}\n <Icon\n size=\"sm\"\n aria-hidden\n className={cn(\n !sorted &&\n 'opacity-0 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100 pointer-coarse:opacity-100',\n )}\n >\n <SortIcon />\n </Icon>\n </button>\n );\n}\n","import type { ComponentProps, ComponentPropsWithoutRef, CSSProperties, ReactNode } from 'react';\nimport { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\nimport { Cell } from './Cells';\nimport { resolveTableAlign, tableAlignClasses, toNativeAlign } from './table-align';\nimport type { TableAlign } from './table-align';\nimport { insetSlot, TableVariantContext, useTableVariant } from './table-context';\nimport type { TableVariant } from './table-context';\nimport { TablePagination } from './table-pagination';\nimport { TableRowButton } from './table-row-button';\nimport { TableRowLink } from './table-row-link';\nimport { TableSortButton } from './table-sort-button';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRingInset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TableProps extends ComponentProps<'table'> {\n className?: string;\n children: ReactNode;\n size?: 'default' | 'small';\n variant?: TableVariant;\n columnDividers?: boolean;\n style?: CSSProperties;\n}\n\nconst rowSize = {\n default: '[&>tbody>tr]:h-table-row',\n small: '[&>tbody>tr]:h-table-row-small',\n};\n\ntype TableFrameProps = Omit<TableProps, 'variant'> & { variant: TableVariant };\n\nfunction InsetTable({ className, columnDividers, ...props }: Omit<TableProps, 'variant' | 'size'>) {\n return (\n <div\n data-slot=\"table-container\"\n data-column-dividers={columnDividers || undefined}\n className={cn('group/table w-full rounded-xl p-1', raisedSurfaceStyle, className)}\n >\n <div data-slot=\"table-scroll\" className=\"overflow-x-auto rounded-lg\">\n <div className=\"group-data-column-dividers/table:-ml-px\">\n <table\n data-slot=\"table\"\n className=\"w-full border-separate border-spacing-0 text-body-sm tabular-nums\"\n tabIndex={0}\n {...props}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TableFrame({ variant, size = 'default', className, columnDividers, ...props }: TableFrameProps) {\n if (variant === 'inset') return <InsetTable className={className} columnDividers={columnDividers} {...props} />;\n return <table className={cn('w-full', rowSize[size], className)} {...props} />;\n}\n\nexport function Table({ variant = 'default', ...props }: TableProps) {\n return (\n <TableVariantContext value={variant}>\n <TableFrame variant={variant} {...props} />\n </TableVariantContext>\n );\n}\n\nexport type TableHeaderProps = ComponentProps<'thead'>;\n\nfunction TableHeader({ className, ...props }: TableHeaderProps) {\n const variant = useTableVariant();\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\n variant === 'default' && '[&>tr]:h-table-header [&>tr]:border-b [&>tr]:border-border [&>tr]:bg-card',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface TheadProps {\n className?: string;\n children: ReactNode;\n}\n\nexport const Thead = ({ className, children }: TheadProps) => {\n const variant = useTableVariant();\n return (\n <thead>\n <tr className={cn(variant === 'default' && 'h-table-header border-b border-border bg-card', className)}>\n {children}\n </tr>\n </thead>\n );\n};\n\nexport interface ThProps extends Omit<ComponentProps<'th'>, 'align'> {\n align?: TableAlign | ComponentProps<'th'>['align'];\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nconst insetHeadClass = cn(\n 'group/head h-10 px-2 align-middle text-column whitespace-nowrap text-muted-foreground first:pl-3 last:pr-3',\n 'border-transparent group-data-column-dividers/table:border-l group-data-column-dividers/table:px-3',\n);\n\nconst legacyHeadClass =\n 'h-full text-left text-meta tracking-wide whitespace-nowrap text-placeholder uppercase first:pl-3 last:pr-3';\n\nexport const Th = ({ className, children, align, ...props }: ThProps) => {\n const variant = useTableVariant();\n if (variant === 'inset') {\n const insetAlign = resolveTableAlign(align);\n return (\n <th\n className={cn(insetHeadClass, tableAlignClasses[insetAlign], className)}\n data-slot=\"table-head\"\n data-align={insetAlign}\n {...props}\n >\n {children}\n </th>\n );\n }\n return (\n <th className={cn(legacyHeadClass, className)} {...props} align={toNativeAlign(align)}>\n {children}\n </th>\n );\n};\n\nconst tableBodyStyles = [\n '[&>tr+tr>td]:border-t',\n '[&>tr:first-child>td:first-child]:rounded-tl-lg',\n '[&>tr:first-child>td:last-child]:rounded-tr-lg',\n '[&>tr:first-child_[data-row-target]]:after:rounded-t-lg',\n '[&>tr:last-child_[data-row-target]]:after:rounded-b-lg',\n '[&_:is(a,button,input,select,textarea):not([data-row-target])]:relative',\n '[&_:is(a,button,input,select,textarea):not([data-row-target])]:z-1',\n];\n\nexport interface TbodyProps extends ComponentProps<'tbody'> {\n className?: string;\n children: ReactNode;\n}\n\nexport const Tbody = ({ className, children, ...props }: TbodyProps) => {\n const variant = useTableVariant();\n return (\n <tbody\n data-slot={insetSlot(variant, 'table-body')}\n className={cn(variant === 'inset' && tableBodyStyles, className)}\n {...props}\n >\n {children}\n </tbody>\n );\n};\n\nexport interface RowProps extends Omit<ComponentPropsWithoutRef<'tr'>, 'onClick'> {\n className?: string;\n children: ReactNode;\n selected?: boolean;\n style?: CSSProperties;\n onClick?: () => void;\n tabIndex?: number;\n /** When true, row receives focus and scrolls into view */\n isActive?: boolean;\n}\n\nexport const Row = forwardRef<HTMLTableRowElement, RowProps>(\n ({ className, children, selected = false, style, onClick, isActive = false, ...props }, ref) => {\n const variant = useTableVariant();\n const internalRef = useRef<HTMLTableRowElement>(null);\n\n // Merge forwarded ref with internal ref\n useImperativeHandle<HTMLTableRowElement | null, HTMLTableRowElement | null>(ref, () => internalRef.current, []);\n\n // Focus and scroll into view when active\n useEffect(() => {\n if (isActive && internalRef.current) {\n internalRef.current.focus();\n internalRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (event.key === 'Enter' && onClick) {\n onClick();\n }\n };\n\n return (\n <tr\n className={cn(\n variant === 'default' && 'border-b border-border',\n // Smooth hover transition\n variant === 'default' && 'transition-colors duration-normal ease-out-custom',\n variant === 'default' && 'hover:bg-fill-subtle',\n variant === 'default' && 'focus:bg-fill-subtle',\n variant === 'default' && focusRingInset,\n variant === 'inset' && [\n 'has-[[data-row-target]]:relative',\n 'has-[[data-row-target]]:hover:*:bg-surface-panel',\n 'has-[[data-row-target]:focus-visible]:*:bg-surface-panel',\n ],\n selected && 'bg-fill-hover',\n onClick && 'cursor-pointer',\n className,\n )}\n data-slot={insetSlot(variant, 'table-row')}\n style={style}\n onClick={onClick}\n ref={internalRef}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={handleKeyDown}\n data-active={isActive || undefined}\n {...props}\n >\n {children}\n </tr>\n );\n },\n);\n\nTable.Header = TableHeader;\nTable.Body = Tbody;\nTable.Row = Row;\nTable.Head = Th;\nTable.Cell = Cell;\nTable.RowLink = TableRowLink;\nTable.RowButton = TableRowButton;\nTable.SortButton = TableSortButton;\nTable.Pagination = TablePagination;\n","import { useState, useCallback, useEffect } from 'react';\n\nexport interface UseTableKeyboardNavigationOptions {\n /** Number of items in the list */\n itemCount: number;\n /** Initial active index (-1 = none) */\n initialIndex?: number;\n /** Wrap around at boundaries */\n wrap?: boolean;\n /** Callback when Enter pressed on active row */\n onSelect?: (index: number) => void;\n /** When true, registers keyboard handlers globally on the document */\n global?: boolean;\n}\n\nexport interface UseTableKeyboardNavigationReturn {\n /** Currently active index (-1 if none) */\n activeIndex: number;\n /** Set active index programmatically */\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n /** Returns props to spread on the Tbody element. Returns null when global is true. */\n getKeyboardProps: () => { onKeyDown: (e: React.KeyboardEvent) => void; tabIndex: number } | null;\n}\n\nexport function useTableKeyboardNavigation({\n itemCount,\n initialIndex = -1,\n wrap = false,\n onSelect,\n global = false,\n}: UseTableKeyboardNavigationOptions): UseTableKeyboardNavigationReturn {\n const [activeIndex, setActiveIndex] = useState(initialIndex);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent | React.KeyboardEvent) => {\n // No-op for empty list\n if (itemCount === 0) return;\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n setActiveIndex(prev => {\n if (prev === -1) return 0;\n if (prev >= itemCount - 1) {\n return wrap ? 0 : itemCount - 1;\n }\n return prev + 1;\n });\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n setActiveIndex(prev => {\n if (prev === -1) return itemCount - 1;\n if (prev <= 0) {\n return wrap ? itemCount - 1 : 0;\n }\n return prev - 1;\n });\n break;\n }\n case 'Home': {\n e.preventDefault();\n setActiveIndex(0);\n break;\n }\n case 'End': {\n e.preventDefault();\n setActiveIndex(itemCount - 1);\n break;\n }\n case 'Enter': {\n if (activeIndex >= 0 && onSelect) {\n e.preventDefault();\n onSelect(activeIndex);\n }\n break;\n }\n }\n },\n [itemCount, wrap, activeIndex, onSelect],\n );\n\n // Register global keyboard handlers when global option is enabled\n useEffect(() => {\n if (!global) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [global, handleKeyDown]);\n\n const getKeyboardProps = useCallback(() => {\n if (global) return null;\n return { onKeyDown: handleKeyDown as (e: React.KeyboardEvent) => void, tabIndex: 0 };\n }, [global, handleKeyDown]);\n\n return {\n activeIndex,\n setActiveIndex,\n getKeyboardProps,\n };\n}\n"],"names":["createContext","use","cn","jsx","Txt","formatDate","jsxs","Icon","Pagination","PaginationContent","PaginationItem","PaginationPrevious","getPaginationRange","PaginationEllipsis","PaginationLink","PaginationNext","useRender","ArrowUp","ArrowDown","ArrowUpDown","controlStateColorTransition","focusRingOffset","raisedSurfaceStyle","forwardRef","useRef","useImperativeHandle","useEffect","focusRingInset","useState","useCallback"],"mappings":";;;;;;;;;;;;;;;;AAMO,MAAM,iBAAA,GAAgD;AAAA,EAC3D,KAAA,EAAO,WAAA;AAAA,EACP,MAAA,EAAQ,aAAA;AAAA,EACR,GAAA,EAAK;AACP,CAAA;AAEO,SAAS,kBAAkB,KAAA,EAAuC;AACvE,EAAA,IAAI,KAAA,KAAU,UAAU,OAAO,QAAA;AAC/B,EAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,OAAA,EAAS,OAAO,KAAA;AACjD,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAsD;AAClF,EAAA,IAAI,KAAA,KAAU,SAAS,OAAO,MAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,OAAO,OAAO,OAAA;AAC5B,EAAA,OAAO,KAAA;AACT;;AClBO,MAAM,mBAAA,GAAsBA,oBAA4B,SAAS,CAAA;AAEjE,SAAS,eAAA,GAAkB;AAChC,EAAA,OAAOC,UAAI,mBAAmB,CAAA;AAChC;AAEO,SAAS,SAAA,CAAU,SAAuB,IAAA,EAAc;AAC7D,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,IAAA;AAChC,EAAA,OAAO,MAAA;AACT;;ACDA,MAAM,oBAAA,GAAsD;AAAA,EAC1D,GAAA,EAAK,iBAAA;AAAA,EACL,KAAA,EAAO;AACT,CAAA;AASA,MAAM,cAAA,GAAiBC,WAAA;AAAA,EACrB,oHAAA;AAAA,EACA;AACF,CAAA;AAEO,MAAM,IAAA,GAAO,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,OAAO,KAAA,EAAO,KAAA,EAAO,GAAG,KAAA,EAAM,KAAiB;AACzF,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,uBACEC,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAWD,WAAA;AAAA,UACT,cAAA;AAAA,UACA,iBAAA,CAAkB,iBAAA,CAAkB,KAAK,CAAC,CAAA;AAAA,UAC1C,qBAAqB,IAAI,CAAA;AAAA,UACzB;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACA,EAAA,uBACEC,cAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAWD,WAAA,CAAG,oBAAA,CAAqB,IAAI,CAAA,EAAG,wBAAwB,SAAS,CAAA;AAAA,MAC1E,GAAG,KAAA;AAAA,MACJ,KAAA,EAAO,cAAc,KAAK,CAAA;AAAA,MAE1B,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAWA,WAAA,CAAG,sCAAsC,GAAI,QAAA,EAAS;AAAA;AAAA,GACxE;AAEJ;AAEO,MAAM,OAAA,GAAU,CAAC,EAAE,SAAA,EAAW,UAAS,KAAiB;AAC7D,EAAA,uBACEC,cAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EACJ,QAAA,kBAAAA,cAAA,CAACC,OAAA,EAAA,EAAI,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,iBAAA,EACxC,QAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAMO,MAAM,eAAe,CAAC,EAAE,QAAA,EAAU,GAAG,OAAM,KAAyB;AACzE,EAAA,sCACG,IAAA,EAAA,EAAM,GAAG,KAAA,EACR,QAAA,kBAAAD,cAAA,CAACC,WAAI,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,MAAA,EAAO,WAAU,UAAA,EACrC,QAAA,EAAAC,2BAAA,CAAW,QAAA,EAAU,mBAAmB,GAC3C,CAAA,EACF,CAAA;AAEJ;AASO,MAAM,SAAA,GAAY,CAAC,EAAE,IAAA,EAAM,aAAa,IAAA,EAAM,IAAA,EAAM,GAAG,KAAA,EAAM,KAAsB;AACxF,EAAA,sCACG,IAAA,EAAA,EAAM,GAAG,OACR,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,mCACEC,eAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,mBACvB,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,oBAGFD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACC,WAAI,EAAA,EAAG,MAAA,EAAO,SAAQ,MAAA,EAAO,IAAA,EAAK,OAChC,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,MACC,WAAA,oBACCD,cAAA,CAACC,OAAA,EAAA,EAAI,EAAA,EAAG,MAAA,EAAO,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,+BAAA,EAClD,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,IACC;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ;;AC/FO,SAAS,gBAAgB,EAAE,IAAA,EAAM,WAAW,YAAA,EAAc,GAAG,OAAM,EAAyB;AACjG,EAAA,uBACED,cAAA,CAACK,0BAAA,EAAA,EAAY,GAAG,KAAA,EACd,0CAACC,iCAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAN,cAAA,CAACO,8BAAA,EAAA,EACC,QAAA,kBAAAP,cAAA,CAACQ,kCAAA,EAAA,EAAmB,QAAA,EAAU,IAAA,IAAQ,CAAA,EAAG,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,EAAG,CAAA,EAClF,CAAA;AAAA,IACCC,kCAAA,CAAmB,IAAA,EAAM,SAAS,CAAA,CAAE,IAAI,CAAA,IAAA,KAAQ;AAC/C,MAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,QAAA,sCACGF,8BAAA,EAAA,EACC,QAAA,kBAAAP,cAAA,CAACU,kCAAA,EAAA,EAAmB,CAAA,EAAA,EADD,KAAK,GAE1B,CAAA;AAAA,MAEJ;AACA,MAAA,sCACGH,8BAAA,EAAA,EACC,QAAA,kBAAAP,cAAA;AAAA,QAACW,8BAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAY,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,CAAA;AAAA,UACjC,QAAA,EAAU,KAAK,IAAA,KAAS,IAAA;AAAA,UACxB,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAAA,UAEpC,eAAK,IAAA,GAAO;AAAA;AAAA,OACf,EAAA,EAPmB,KAAK,IAQ1B,CAAA;AAAA,IAEJ,CAAC,CAAA;AAAA,oBACDX,cAAA,CAACO,8BAAA,EAAA,EACC,QAAA,kBAAAP,cAAA,CAACY,8BAAA,EAAA,EAAe,UAAU,IAAA,IAAQ,SAAA,GAAY,CAAA,EAAG,OAAA,EAAS,MAAM,YAAA,CAAa,IAAA,GAAO,CAAC,GAAG,CAAA,EAC1F;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;ACjDA,MAAM,qBAAA,GAAwB;AAAA,EAC5B,8DAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,qBAAqB,OAAA,EAAuB;AAC1D,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,qBAAA;AAChC,EAAA,OAAO,EAAC;AACV;;ACHO,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAAwB;AAC3E,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,uBACEZ,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,kBAAA;AAAA,MACV,iBAAA,EAAgB,EAAA;AAAA,MAChB,WAAWD,WAAA,CAAG,0BAAA,EAA4B,GAAG,oBAAA,CAAqB,OAAO,GAAG,SAAS,CAAA;AAAA,MACpF,GAAG;AAAA;AAAA,GACN;AAEJ;;ACXO,SAAS,aAAa,EAAE,MAAA,EAAQ,SAAA,EAAW,GAAG,OAAM,EAAsB;AAC/E,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,OAAOc,mBAAA,CAAU;AAAA,IACf,cAAA,EAAgB,GAAA;AAAA,IAChB,MAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,GAAG,KAAA;AAAA,MACH,WAAA,EAAa,gBAAA;AAAA,MACb,iBAAA,EAAmB,EAAA;AAAA,MACnB,WAAWd,WAAA,CAAG,GAAG,oBAAA,CAAqB,OAAO,GAAG,SAAS;AAAA;AAC3D,GACD,CAAA;AACH;;ACNA,MAAM,SAAA,GAAY;AAAA,EAChB,SAAA,EAAWe,mBAAA;AAAA,EACX,UAAA,EAAYC,qBAAA;AAAA,EACZ,IAAA,EAAMC;AACR,CAAA;AAEO,SAAS,eAAA,CAAgB,EAAE,SAAA,GAAY,MAAA,EAAQ,WAAW,QAAA,EAAU,GAAG,OAAM,EAAyB;AAC3G,EAAA,MAAM,QAAA,GAAW,UAAU,SAAS,CAAA;AACpC,EAAA,MAAM,SAAS,SAAA,KAAc,MAAA;AAC7B,EAAA,uBACEb,eAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,mBAAA;AAAA,MACV,eAAa,MAAA,IAAU,MAAA;AAAA,MACvB,SAAA,EAAWJ,WAAA;AAAA,QACT,kFAAA;AAAA,QACA,8CAAA;AAAA,QACA,mDAAA;AAAA,QACAkB,kDAAA;AAAA,QACAC,sCAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDlB,cAAA;AAAA,UAACI,eAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAWL,WAAA;AAAA,cACT,CAAC,MAAA,IACC;AAAA,aACJ;AAAA,YAEA,yCAAC,QAAA,EAAA,EAAS;AAAA;AAAA;AACZ;AAAA;AAAA,GACF;AAEJ;;AC1BA,MAAM,OAAA,GAAU;AAAA,EACd,OAAA,EAAS,0BAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAIA,SAAS,WAAW,EAAE,SAAA,EAAW,cAAA,EAAgB,GAAG,OAAM,EAAyC;AACjG,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,wBAAsB,cAAA,IAAkB,MAAA;AAAA,MACxC,SAAA,EAAWD,WAAA,CAAG,mCAAA,EAAqCoB,2CAAA,EAAoB,SAAS,CAAA;AAAA,MAEhF,QAAA,kBAAAnB,cAAA,CAAC,SAAI,WAAA,EAAU,cAAA,EAAe,WAAU,4BAAA,EACtC,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAU,OAAA;AAAA,UACV,SAAA,EAAU,mEAAA;AAAA,UACV,QAAA,EAAU,CAAA;AAAA,UACT,GAAG;AAAA;AAAA,SAER,CAAA,EACF;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,UAAA,CAAW,EAAE,OAAA,EAAS,IAAA,GAAO,WAAW,SAAA,EAAW,cAAA,EAAgB,GAAG,KAAA,EAAM,EAAoB;AACvG,EAAA,IAAI,OAAA,KAAY,SAAS,uBAAOA,cAAA,CAAC,cAAW,SAAA,EAAsB,cAAA,EAAiC,GAAG,KAAA,EAAO,CAAA;AAC7G,EAAA,uBAAOA,cAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAWD,WAAA,CAAG,QAAA,EAAU,OAAA,CAAQ,IAAI,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAC9E;AAEO,SAAS,MAAM,EAAE,OAAA,GAAU,SAAA,EAAW,GAAG,OAAM,EAAe;AACnE,EAAA,uBACEC,cAAA,CAAC,uBAAoB,KAAA,EAAO,OAAA,EAC1B,yCAAC,UAAA,EAAA,EAAW,OAAA,EAAmB,GAAG,KAAA,EAAO,CAAA,EAC3C,CAAA;AAEJ;AAIA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAqB;AAC9D,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,uBACEA,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAWD,WAAA;AAAA,QACT,YAAY,SAAA,IAAa,2EAAA;AAAA,QACzB;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAOO,MAAM,KAAA,GAAQ,CAAC,EAAE,SAAA,EAAW,UAAS,KAAkB;AAC5D,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,uBACEC,cAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAAA,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAWD,WAAA,CAAG,OAAA,KAAY,SAAA,IAAa,+CAAA,EAAiD,SAAS,CAAA,EAClG,QAAA,EACH,CAAA,EACF,CAAA;AAEJ;AASA,MAAM,cAAA,GAAiBA,WAAA;AAAA,EACrB,4GAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,eAAA,GACJ,4GAAA;AAEK,MAAM,EAAA,GAAK,CAAC,EAAE,SAAA,EAAW,UAAU,KAAA,EAAO,GAAG,OAAM,KAAe;AACvE,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,IAAA,uBACEC,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,WAAWD,WAAA,CAAG,cAAA,EAAgB,iBAAA,CAAkB,UAAU,GAAG,SAAS,CAAA;AAAA,QACtE,WAAA,EAAU,YAAA;AAAA,QACV,YAAA,EAAY,UAAA;AAAA,QACX,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACA,EAAA,uBACEC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAWD,WAAA,CAAG,eAAA,EAAiB,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,KAAA,EAAO,aAAA,CAAc,KAAK,GACjF,QAAA,EACH,CAAA;AAEJ;AAEA,MAAM,eAAA,GAAkB;AAAA,EACtB,uBAAA;AAAA,EACA,iDAAA;AAAA,EACA,gDAAA;AAAA,EACA,yDAAA;AAAA,EACA,wDAAA;AAAA,EACA,yEAAA;AAAA,EACA;AACF,CAAA;AAOO,MAAM,QAAQ,CAAC,EAAE,WAAW,QAAA,EAAU,GAAG,OAAM,KAAkB;AACtE,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,uBACEC,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAW,SAAA,CAAU,OAAA,EAAS,YAAY,CAAA;AAAA,MAC1C,SAAA,EAAWD,WAAA,CAAG,OAAA,KAAY,OAAA,IAAW,iBAAiB,SAAS,CAAA;AAAA,MAC9D,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;AAaO,MAAM,GAAA,GAAMqB,gBAAA;AAAA,EACjB,CAAC,EAAE,SAAA,EAAW,QAAA,EAAU,QAAA,GAAW,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,QAAA,GAAW,KAAA,EAAO,GAAG,KAAA,IAAS,GAAA,KAAQ;AAC9F,IAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,IAAA,MAAM,WAAA,GAAcC,aAA4B,IAAI,CAAA;AAGpD,IAAAC,yBAAA,CAA4E,GAAA,EAAK,MAAM,WAAA,CAAY,OAAA,EAAS,EAAE,CAAA;AAG9G,IAAAC,eAAA,CAAU,MAAM;AACd,MAAA,IAAI,QAAA,IAAY,YAAY,OAAA,EAAS;AACnC,QAAA,WAAA,CAAY,QAAQ,KAAA,EAAM;AAC1B,QAAA,WAAA,CAAY,OAAA,CAAQ,cAAA,CAAe,EAAE,KAAA,EAAO,WAAW,CAAA;AAAA,MACzD;AAAA,IACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAoD;AACzE,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,OAAA,EAAS;AACpC,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,uBACEvB,cAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWD,WAAA;AAAA,UACT,YAAY,SAAA,IAAa,wBAAA;AAAA;AAAA,UAEzB,YAAY,SAAA,IAAa,mDAAA;AAAA,UACzB,YAAY,SAAA,IAAa,sBAAA;AAAA,UACzB,YAAY,SAAA,IAAa,sBAAA;AAAA,UACzB,YAAY,SAAA,IAAayB,qCAAA;AAAA,UACzB,YAAY,OAAA,IAAW;AAAA,YACrB,kCAAA;AAAA,YACA,kDAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,QAAA,IAAY,eAAA;AAAA,UACZ,OAAA,IAAW,gBAAA;AAAA,UACX;AAAA,SACF;AAAA,QACA,WAAA,EAAW,SAAA,CAAU,OAAA,EAAS,WAAW,CAAA;AAAA,QACzC,KAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAA,EAAK,WAAA;AAAA,QACL,QAAA,EAAU,UAAU,CAAA,GAAI,MAAA;AAAA,QACxB,SAAA,EAAW,aAAA;AAAA,QACX,eAAa,QAAA,IAAY,MAAA;AAAA,QACxB,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,KAAA,CAAM,IAAA,GAAO,KAAA;AACb,KAAA,CAAM,GAAA,GAAM,GAAA;AACZ,KAAA,CAAM,IAAA,GAAO,EAAA;AACb,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,KAAA,CAAM,OAAA,GAAU,YAAA;AAChB,KAAA,CAAM,SAAA,GAAY,cAAA;AAClB,KAAA,CAAM,UAAA,GAAa,eAAA;AACnB,KAAA,CAAM,UAAA,GAAa,eAAA;;ACpNZ,SAAS,0BAAA,CAA2B;AAAA,EACzC,SAAA;AAAA,EACA,YAAA,GAAe,EAAA;AAAA,EACf,IAAA,GAAO,KAAA;AAAA,EACP,QAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EAAwE;AACtE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAS,YAAY,CAAA;AAE3D,EAAA,MAAM,aAAA,GAAgBC,iBAAA;AAAA,IACpB,CAAC,CAAA,KAA2C;AAE1C,MAAA,IAAI,cAAc,CAAA,EAAG;AAErB,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,WAAA,EAAa;AAChB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,cAAA,CAAe,CAAA,IAAA,KAAQ;AACrB,YAAA,IAAI,IAAA,KAAS,IAAI,OAAO,CAAA;AACxB,YAAA,IAAI,IAAA,IAAQ,YAAY,CAAA,EAAG;AACzB,cAAA,OAAO,IAAA,GAAO,IAAI,SAAA,GAAY,CAAA;AAAA,YAChC;AACA,YAAA,OAAO,IAAA,GAAO,CAAA;AAAA,UAChB,CAAC,CAAA;AACD,UAAA;AAAA,QACF;AAAA,QACA,KAAK,SAAA,EAAW;AACd,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,cAAA,CAAe,CAAA,IAAA,KAAQ;AACrB,YAAA,IAAI,IAAA,KAAS,EAAA,EAAI,OAAO,SAAA,GAAY,CAAA;AACpC,YAAA,IAAI,QAAQ,CAAA,EAAG;AACb,cAAA,OAAO,IAAA,GAAO,YAAY,CAAA,GAAI,CAAA;AAAA,YAChC;AACA,YAAA,OAAO,IAAA,GAAO,CAAA;AAAA,UAChB,CAAC,CAAA;AACD,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA,EAAQ;AACX,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,cAAA,CAAe,CAAC,CAAA;AAChB,UAAA;AAAA,QACF;AAAA,QACA,KAAK,KAAA,EAAO;AACV,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,cAAA,CAAe,YAAY,CAAC,CAAA;AAC5B,UAAA;AAAA,QACF;AAAA,QACA,KAAK,OAAA,EAAS;AACZ,UAAA,IAAI,WAAA,IAAe,KAAK,QAAA,EAAU;AAChC,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,QAAA,CAAS,WAAW,CAAA;AAAA,UACtB;AACA,UAAA;AAAA,QACF;AAAA;AACF,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,IAAA,EAAM,WAAA,EAAa,QAAQ;AAAA,GACzC;AAGA,EAAAH,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,MAAM,gBAAA,GAAmBG,kBAAY,MAAM;AACzC,IAAA,IAAI,QAAQ,OAAO,IAAA;AACnB,IAAA,OAAO,EAAE,SAAA,EAAW,aAAA,EAAmD,QAAA,EAAU,CAAA,EAAE;AAAA,EACrF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAE1B,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"Table.cjs.js","sources":["../../src/ds/components/Table/table-align.ts","../../src/ds/components/Table/table-context.ts","../../src/ds/components/Table/Cells.tsx","../../src/ds/components/Table/table-pagination.tsx","../../src/ds/components/Table/table-row-target.ts","../../src/ds/components/Table/table-row-button.tsx","../../src/ds/components/Table/table-row-link.tsx","../../src/ds/components/Table/table-sort-button.tsx","../../src/ds/components/Table/Table.tsx","../../src/ds/components/Table/use-table-keyboard-navigation.ts"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nexport type TableAlign = 'start' | 'center' | 'end';\n\ntype NativeCellAlign = ComponentProps<'td'>['align'];\n\nexport const tableAlignClasses: Record<TableAlign, string> = {\n start: 'text-left',\n center: 'text-center',\n end: 'text-right',\n};\n\nexport function resolveTableAlign(align: string | undefined): TableAlign {\n if (align === 'center') return 'center';\n if (align === 'end' || align === 'right') return 'end';\n return 'start';\n}\n\nexport function toNativeAlign(align: TableAlign | NativeCellAlign): NativeCellAlign {\n if (align === 'start') return 'left';\n if (align === 'end') return 'right';\n return align;\n}\n","import { createContext, use } from 'react';\n\nexport type TableVariant = 'default' | 'inset';\n\nexport const TableVariantContext = createContext<TableVariant>('default');\n\nexport function useTableVariant() {\n return use(TableVariantContext);\n}\n\nexport function insetSlot(variant: TableVariant, slot: string) {\n if (variant === 'inset') return slot;\n return undefined;\n}\n","import React from 'react';\n\nimport { Icon } from '../../icons/Icon';\nimport { Txt } from '../Txt';\nimport { resolveTableAlign, tableAlignClasses, toNativeAlign } from './table-align';\nimport type { TableAlign } from './table-align';\nimport { useTableVariant } from './table-context';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/utils/date-format';\n\nexport type TableCellTone = 'ink' | 'muted';\n\nconst tableCellToneClasses: Record<TableCellTone, string> = {\n ink: 'text-foreground',\n muted: 'text-muted-foreground',\n};\n\nexport interface CellProps extends Omit<React.ComponentProps<'td'>, 'align'> {\n align?: TableAlign | React.TdHTMLAttributes<HTMLTableCellElement>['align'];\n tone?: TableCellTone;\n className?: string;\n children: React.ReactNode;\n}\n\nconst insetCellClass = cn(\n 'h-9 border-transparent bg-background bg-clip-padding px-2 py-1 align-middle whitespace-nowrap first:pl-3 last:pr-3',\n 'group-data-column-dividers/table:border-l group-data-column-dividers/table:px-3',\n);\n\nexport const Cell = ({ className, children, tone = 'ink', align, ...props }: CellProps) => {\n const variant = useTableVariant();\n if (variant === 'inset') {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n insetCellClass,\n tableAlignClasses[resolveTableAlign(align)],\n tableCellToneClasses[tone],\n className,\n )}\n {...props}\n >\n {children}\n </td>\n );\n }\n return (\n <td\n className={cn(tableCellToneClasses[tone], 'first:pl-3 last:pr-3', className)}\n {...props}\n align={toNativeAlign(align)}\n >\n <div className={cn('flex size-full shrink-0 items-center')}>{children}</div>\n </td>\n );\n};\n\nexport const TxtCell = ({ className, children }: CellProps) => {\n return (\n <Cell className={className}>\n <Txt as=\"span\" variant=\"body-sm\" className=\"w-full truncate\">\n {children}\n </Txt>\n </Cell>\n );\n};\n\nexport interface DateTimeCellProps extends Omit<CellProps, 'children'> {\n dateTime: Date;\n}\n\nexport const DateTimeCell = ({ dateTime, ...props }: DateTimeCellProps) => {\n return (\n <Cell {...props}>\n <Txt as=\"span\" variant=\"body\" className=\"shrink-0\">\n {formatDate(dateTime, 'date-time-seconds')}\n </Txt>\n </Cell>\n );\n};\n\nexport interface EntryCellProps extends Omit<CellProps, 'children'> {\n name: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport const EntryCell = ({ name, description, icon, meta, ...props }: EntryCellProps) => {\n return (\n <Cell {...props}>\n <div className=\"flex items-center gap-3.5\">\n {icon && (\n <Icon size=\"lg\" className=\"text-foreground\">\n {icon}\n </Icon>\n )}\n\n <div className=\"flex flex-col gap-0\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {name}\n </Txt>\n {description && (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"w-full max-w-75 truncate pt-1\">\n {description}\n </Txt>\n )}\n </div>\n {meta}\n </div>\n </Cell>\n );\n};\n","import type { ComponentProps } from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from '../Pagination/pagination';\nimport { getPaginationRange } from '../Pagination/pagination-range';\n\nexport type TablePaginationProps = Omit<ComponentProps<'nav'>, 'children'> & {\n page: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n};\n\nexport function TablePagination({ page, pageCount, onPageChange, ...props }: TablePaginationProps) {\n return (\n <Pagination {...props}>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious disabled={page <= 0} onClick={() => onPageChange(page - 1)} />\n </PaginationItem>\n {getPaginationRange(page, pageCount).map(item => {\n if (item.kind === 'ellipsis') {\n return (\n <PaginationItem key={item.key}>\n <PaginationEllipsis />\n </PaginationItem>\n );\n }\n return (\n <PaginationItem key={item.page}>\n <PaginationLink\n aria-label={`Page ${item.page + 1}`}\n isActive={item.page === page}\n onClick={() => onPageChange(item.page)}\n >\n {item.page + 1}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext disabled={page >= pageCount - 1} onClick={() => onPageChange(page + 1)} />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n );\n}\n","import type { TableVariant } from './table-context';\n\nconst stretchedTargetStyles = [\n \"outline-none after:absolute after:inset-0 after:content-['']\",\n 'focus-visible:after:outline-1 focus-visible:after:-outline-offset-1 focus-visible:after:outline-border-focus focus-visible:after:outline-solid',\n];\n\nexport function tableRowTargetStyles(variant: TableVariant) {\n if (variant === 'inset') return stretchedTargetStyles;\n return [];\n}\n","import type { ComponentProps } from 'react';\nimport { useTableVariant } from './table-context';\nimport { tableRowTargetStyles } from './table-row-target';\nimport { cn } from '@/lib/utils';\n\nexport type TableRowButtonProps = Omit<ComponentProps<'button'>, 'type'>;\n\nexport function TableRowButton({ className, ...props }: TableRowButtonProps) {\n const variant = useTableVariant();\n return (\n <button\n type=\"button\"\n data-slot=\"table-row-button\"\n data-row-target=\"\"\n className={cn('cursor-pointer text-left', ...tableRowTargetStyles(variant), className)}\n {...props}\n />\n );\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { useTableVariant } from './table-context';\nimport { tableRowTargetStyles } from './table-row-target';\nimport { cn } from '@/lib/utils';\n\nexport type TableRowLinkProps = useRender.ComponentProps<'a'>;\n\nexport function TableRowLink({ render, className, ...props }: TableRowLinkProps) {\n const variant = useTableVariant();\n return useRender({\n defaultTagName: 'a',\n render,\n props: {\n ...props,\n 'data-slot': 'table-row-link',\n 'data-row-target': '',\n className: cn(...tableRowTargetStyles(variant), className),\n },\n });\n}\n","import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlStateColorTransition, focusRingOffset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type TableSortDirection = 'ascending' | 'descending' | 'none';\n\nexport type TableSortButtonProps = Omit<ComponentProps<'button'>, 'type'> & {\n direction?: TableSortDirection;\n};\n\nconst sortIcons = {\n ascending: ArrowUp,\n descending: ArrowDown,\n none: ArrowUpDown,\n} satisfies Record<TableSortDirection, LucideIcon>;\n\nexport function TableSortButton({ direction = 'none', className, children, ...props }: TableSortButtonProps) {\n const SortIcon = sortIcons[direction];\n const sorted = direction !== 'none';\n return (\n <button\n type=\"button\"\n data-slot=\"table-sort-button\"\n data-sorted={sorted || undefined}\n className={cn(\n 'group/sort inline-flex cursor-pointer items-center gap-1 rounded-sm align-middle',\n 'group-data-[align=end]/head:flex-row-reverse',\n 'hover:text-foreground data-sorted:text-foreground',\n controlStateColorTransition,\n focusRingOffset,\n className,\n )}\n {...props}\n >\n {children}\n <Icon\n size=\"sm\"\n aria-hidden\n className={cn(\n !sorted &&\n 'opacity-0 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100 pointer-coarse:opacity-100',\n )}\n >\n <SortIcon />\n </Icon>\n </button>\n );\n}\n","import type { ComponentProps, ComponentPropsWithoutRef, CSSProperties, ReactNode } from 'react';\nimport { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\nimport { Cell } from './Cells';\nimport { resolveTableAlign, tableAlignClasses, toNativeAlign } from './table-align';\nimport type { TableAlign } from './table-align';\nimport { insetSlot, TableVariantContext, useTableVariant } from './table-context';\nimport type { TableVariant } from './table-context';\nimport { TablePagination } from './table-pagination';\nimport { TableRowButton } from './table-row-button';\nimport { TableRowLink } from './table-row-link';\nimport { TableSortButton } from './table-sort-button';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRingInset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TableProps extends ComponentProps<'table'> {\n className?: string;\n children: ReactNode;\n size?: 'default' | 'small';\n variant?: TableVariant;\n columnDividers?: boolean;\n style?: CSSProperties;\n}\n\nconst rowSize = {\n default: '[&>tbody>tr]:h-table-row',\n small: '[&>tbody>tr]:h-table-row-small',\n};\n\ntype TableFrameProps = Omit<TableProps, 'variant'> & { variant: TableVariant };\n\nfunction InsetTable({ className, columnDividers, ...props }: Omit<TableProps, 'variant' | 'size'>) {\n return (\n <div\n data-slot=\"table-container\"\n data-column-dividers={columnDividers || undefined}\n className={cn('group/table w-full rounded-xl p-1', raisedSurfaceStyle, className)}\n >\n <div data-slot=\"table-scroll\" className=\"overflow-x-auto rounded-lg\">\n <div className=\"group-data-column-dividers/table:-ml-px\">\n <table\n data-slot=\"table\"\n className=\"w-full border-separate border-spacing-0 text-body-sm tabular-nums\"\n tabIndex={0}\n {...props}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TableFrame({ variant, size = 'default', className, columnDividers, ...props }: TableFrameProps) {\n if (variant === 'inset') return <InsetTable className={className} columnDividers={columnDividers} {...props} />;\n return <table className={cn('w-full', rowSize[size], className)} {...props} />;\n}\n\nexport function Table({ variant = 'default', ...props }: TableProps) {\n return (\n <TableVariantContext value={variant}>\n <TableFrame variant={variant} {...props} />\n </TableVariantContext>\n );\n}\n\nexport type TableHeaderProps = ComponentProps<'thead'> & {\n placement?: 'above' | 'inside';\n};\n\nconst insideHeaderStyles = [\n '[&>tr>th]:border-b [&>tr>th]:bg-background [&>tr>th]:bg-clip-padding',\n '[&>tr>th:first-child]:rounded-tl-lg [&>tr>th:last-child]:rounded-tr-lg',\n];\n\nfunction TableHeader({ className, placement = 'above', ...props }: TableHeaderProps) {\n const variant = useTableVariant();\n const inside = variant === 'inset' && placement === 'inside';\n const headerPlacement = inside ? 'inside' : undefined;\n return (\n <thead\n data-slot=\"table-header\"\n data-placement={headerPlacement}\n className={cn(\n variant === 'default' && '[&>tr]:h-table-header [&>tr]:border-b [&>tr]:border-border [&>tr]:bg-card',\n inside && insideHeaderStyles,\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface TheadProps {\n className?: string;\n children: ReactNode;\n}\n\nexport const Thead = ({ className, children }: TheadProps) => {\n const variant = useTableVariant();\n return (\n <thead>\n <tr className={cn(variant === 'default' && 'h-table-header border-b border-border bg-card', className)}>\n {children}\n </tr>\n </thead>\n );\n};\n\nexport interface ThProps extends Omit<ComponentProps<'th'>, 'align'> {\n align?: TableAlign | ComponentProps<'th'>['align'];\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nconst insetHeadClass = cn(\n 'group/head h-10 px-2 align-middle text-column whitespace-nowrap text-muted-foreground first:pl-3 last:pr-3',\n 'border-transparent group-data-column-dividers/table:border-l group-data-column-dividers/table:px-3',\n);\n\nconst legacyHeadClass =\n 'h-full text-left text-meta tracking-wide whitespace-nowrap text-placeholder uppercase first:pl-3 last:pr-3';\n\nexport const Th = ({ className, children, align, ...props }: ThProps) => {\n const variant = useTableVariant();\n if (variant === 'inset') {\n const insetAlign = resolveTableAlign(align);\n return (\n <th\n className={cn(insetHeadClass, tableAlignClasses[insetAlign], className)}\n data-slot=\"table-head\"\n data-align={insetAlign}\n {...props}\n >\n {children}\n </th>\n );\n }\n return (\n <th className={cn(legacyHeadClass, className)} {...props} align={toNativeAlign(align)}>\n {children}\n </th>\n );\n};\n\nconst tableBodyStyles = [\n '[&>tr+tr>td]:border-t',\n '[&>tr:first-child>td:first-child]:rounded-tl-lg',\n '[&>tr:first-child>td:last-child]:rounded-tr-lg',\n '[&>tr:first-child_[data-row-target]]:after:rounded-t-lg',\n '[thead[data-placement=inside]+&>tr:first-child>td]:rounded-none',\n '[thead[data-placement=inside]+&>tr:first-child_[data-row-target]]:after:rounded-none',\n '[&>tr:last-child_[data-row-target]]:after:rounded-b-lg',\n '[&_:is(a,button,input,select,textarea):not([data-row-target])]:relative',\n '[&_:is(a,button,input,select,textarea):not([data-row-target])]:z-1',\n];\n\nexport interface TbodyProps extends ComponentProps<'tbody'> {\n className?: string;\n children: ReactNode;\n}\n\nexport const Tbody = ({ className, children, ...props }: TbodyProps) => {\n const variant = useTableVariant();\n return (\n <tbody\n data-slot={insetSlot(variant, 'table-body')}\n className={cn(variant === 'inset' && tableBodyStyles, className)}\n {...props}\n >\n {children}\n </tbody>\n );\n};\n\nexport interface RowProps extends Omit<ComponentPropsWithoutRef<'tr'>, 'onClick'> {\n className?: string;\n children: ReactNode;\n selected?: boolean;\n style?: CSSProperties;\n onClick?: () => void;\n tabIndex?: number;\n /** When true, row receives focus and scrolls into view */\n isActive?: boolean;\n}\n\nexport const Row = forwardRef<HTMLTableRowElement, RowProps>(\n ({ className, children, selected = false, style, onClick, isActive = false, ...props }, ref) => {\n const variant = useTableVariant();\n const internalRef = useRef<HTMLTableRowElement>(null);\n\n // Merge forwarded ref with internal ref\n useImperativeHandle<HTMLTableRowElement | null, HTMLTableRowElement | null>(ref, () => internalRef.current, []);\n\n // Focus and scroll into view when active\n useEffect(() => {\n if (isActive && internalRef.current) {\n internalRef.current.focus();\n internalRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (event.key === 'Enter' && onClick) {\n onClick();\n }\n };\n\n return (\n <tr\n className={cn(\n variant === 'default' && 'border-b border-border',\n // Smooth hover transition\n variant === 'default' && 'transition-colors duration-normal ease-out-custom',\n variant === 'default' && 'hover:bg-fill-subtle',\n variant === 'default' && 'focus:bg-fill-subtle',\n variant === 'default' && focusRingInset,\n variant === 'inset' && [\n 'has-[[data-row-target]]:relative',\n 'has-[[data-row-target]]:hover:*:bg-surface-panel',\n 'has-[[data-row-target]:focus-visible]:*:bg-surface-panel',\n ],\n selected && 'bg-fill-hover',\n onClick && 'cursor-pointer',\n className,\n )}\n data-slot={insetSlot(variant, 'table-row')}\n style={style}\n onClick={onClick}\n ref={internalRef}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={handleKeyDown}\n data-active={isActive || undefined}\n {...props}\n >\n {children}\n </tr>\n );\n },\n);\n\nTable.Header = TableHeader;\nTable.Body = Tbody;\nTable.Row = Row;\nTable.Head = Th;\nTable.Cell = Cell;\nTable.RowLink = TableRowLink;\nTable.RowButton = TableRowButton;\nTable.SortButton = TableSortButton;\nTable.Pagination = TablePagination;\n","import { useState, useCallback, useEffect } from 'react';\n\nexport interface UseTableKeyboardNavigationOptions {\n /** Number of items in the list */\n itemCount: number;\n /** Initial active index (-1 = none) */\n initialIndex?: number;\n /** Wrap around at boundaries */\n wrap?: boolean;\n /** Callback when Enter pressed on active row */\n onSelect?: (index: number) => void;\n /** When true, registers keyboard handlers globally on the document */\n global?: boolean;\n}\n\nexport interface UseTableKeyboardNavigationReturn {\n /** Currently active index (-1 if none) */\n activeIndex: number;\n /** Set active index programmatically */\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n /** Returns props to spread on the Tbody element. Returns null when global is true. */\n getKeyboardProps: () => { onKeyDown: (e: React.KeyboardEvent) => void; tabIndex: number } | null;\n}\n\nexport function useTableKeyboardNavigation({\n itemCount,\n initialIndex = -1,\n wrap = false,\n onSelect,\n global = false,\n}: UseTableKeyboardNavigationOptions): UseTableKeyboardNavigationReturn {\n const [activeIndex, setActiveIndex] = useState(initialIndex);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent | React.KeyboardEvent) => {\n // No-op for empty list\n if (itemCount === 0) return;\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n setActiveIndex(prev => {\n if (prev === -1) return 0;\n if (prev >= itemCount - 1) {\n return wrap ? 0 : itemCount - 1;\n }\n return prev + 1;\n });\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n setActiveIndex(prev => {\n if (prev === -1) return itemCount - 1;\n if (prev <= 0) {\n return wrap ? itemCount - 1 : 0;\n }\n return prev - 1;\n });\n break;\n }\n case 'Home': {\n e.preventDefault();\n setActiveIndex(0);\n break;\n }\n case 'End': {\n e.preventDefault();\n setActiveIndex(itemCount - 1);\n break;\n }\n case 'Enter': {\n if (activeIndex >= 0 && onSelect) {\n e.preventDefault();\n onSelect(activeIndex);\n }\n break;\n }\n }\n },\n [itemCount, wrap, activeIndex, onSelect],\n );\n\n // Register global keyboard handlers when global option is enabled\n useEffect(() => {\n if (!global) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [global, handleKeyDown]);\n\n const getKeyboardProps = useCallback(() => {\n if (global) return null;\n return { onKeyDown: handleKeyDown as (e: React.KeyboardEvent) => void, tabIndex: 0 };\n }, [global, handleKeyDown]);\n\n return {\n activeIndex,\n setActiveIndex,\n getKeyboardProps,\n };\n}\n"],"names":["createContext","use","cn","jsx","Txt","formatDate","jsxs","Icon","Pagination","PaginationContent","PaginationItem","PaginationPrevious","getPaginationRange","PaginationEllipsis","PaginationLink","PaginationNext","useRender","ArrowUp","ArrowDown","ArrowUpDown","controlStateColorTransition","focusRingOffset","raisedSurfaceStyle","forwardRef","useRef","useImperativeHandle","useEffect","focusRingInset","useState","useCallback"],"mappings":"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"}
|
|
@@ -217,14 +217,22 @@ function TableFrame({ variant, size = "default", className, columnDividers, ...p
|
|
|
217
217
|
function Table({ variant = "default", ...props }) {
|
|
218
218
|
return /* @__PURE__ */ jsx(TableVariantContext, { value: variant, children: /* @__PURE__ */ jsx(TableFrame, { variant, ...props }) });
|
|
219
219
|
}
|
|
220
|
-
|
|
220
|
+
const insideHeaderStyles = [
|
|
221
|
+
"[&>tr>th]:border-b [&>tr>th]:bg-background [&>tr>th]:bg-clip-padding",
|
|
222
|
+
"[&>tr>th:first-child]:rounded-tl-lg [&>tr>th:last-child]:rounded-tr-lg"
|
|
223
|
+
];
|
|
224
|
+
function TableHeader({ className, placement = "above", ...props }) {
|
|
221
225
|
const variant = useTableVariant();
|
|
226
|
+
const inside = variant === "inset" && placement === "inside";
|
|
227
|
+
const headerPlacement = inside ? "inside" : void 0;
|
|
222
228
|
return /* @__PURE__ */ jsx(
|
|
223
229
|
"thead",
|
|
224
230
|
{
|
|
225
231
|
"data-slot": "table-header",
|
|
232
|
+
"data-placement": headerPlacement,
|
|
226
233
|
className: cn(
|
|
227
234
|
variant === "default" && "[&>tr]:h-table-header [&>tr]:border-b [&>tr]:border-border [&>tr]:bg-card",
|
|
235
|
+
inside && insideHeaderStyles,
|
|
228
236
|
className
|
|
229
237
|
),
|
|
230
238
|
...props
|
|
@@ -262,6 +270,8 @@ const tableBodyStyles = [
|
|
|
262
270
|
"[&>tr:first-child>td:first-child]:rounded-tl-lg",
|
|
263
271
|
"[&>tr:first-child>td:last-child]:rounded-tr-lg",
|
|
264
272
|
"[&>tr:first-child_[data-row-target]]:after:rounded-t-lg",
|
|
273
|
+
"[thead[data-placement=inside]+&>tr:first-child>td]:rounded-none",
|
|
274
|
+
"[thead[data-placement=inside]+&>tr:first-child_[data-row-target]]:after:rounded-none",
|
|
265
275
|
"[&>tr:last-child_[data-row-target]]:after:rounded-b-lg",
|
|
266
276
|
"[&_:is(a,button,input,select,textarea):not([data-row-target])]:relative",
|
|
267
277
|
"[&_:is(a,button,input,select,textarea):not([data-row-target])]:z-1"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.es.js","sources":["../../src/ds/components/Table/table-align.ts","../../src/ds/components/Table/table-context.ts","../../src/ds/components/Table/Cells.tsx","../../src/ds/components/Table/table-pagination.tsx","../../src/ds/components/Table/table-row-target.ts","../../src/ds/components/Table/table-row-button.tsx","../../src/ds/components/Table/table-row-link.tsx","../../src/ds/components/Table/table-sort-button.tsx","../../src/ds/components/Table/Table.tsx","../../src/ds/components/Table/use-table-keyboard-navigation.ts"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nexport type TableAlign = 'start' | 'center' | 'end';\n\ntype NativeCellAlign = ComponentProps<'td'>['align'];\n\nexport const tableAlignClasses: Record<TableAlign, string> = {\n start: 'text-left',\n center: 'text-center',\n end: 'text-right',\n};\n\nexport function resolveTableAlign(align: string | undefined): TableAlign {\n if (align === 'center') return 'center';\n if (align === 'end' || align === 'right') return 'end';\n return 'start';\n}\n\nexport function toNativeAlign(align: TableAlign | NativeCellAlign): NativeCellAlign {\n if (align === 'start') return 'left';\n if (align === 'end') return 'right';\n return align;\n}\n","import { createContext, use } from 'react';\n\nexport type TableVariant = 'default' | 'inset';\n\nexport const TableVariantContext = createContext<TableVariant>('default');\n\nexport function useTableVariant() {\n return use(TableVariantContext);\n}\n\nexport function insetSlot(variant: TableVariant, slot: string) {\n if (variant === 'inset') return slot;\n return undefined;\n}\n","import React from 'react';\n\nimport { Icon } from '../../icons/Icon';\nimport { Txt } from '../Txt';\nimport { resolveTableAlign, tableAlignClasses, toNativeAlign } from './table-align';\nimport type { TableAlign } from './table-align';\nimport { useTableVariant } from './table-context';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/utils/date-format';\n\nexport type TableCellTone = 'ink' | 'muted';\n\nconst tableCellToneClasses: Record<TableCellTone, string> = {\n ink: 'text-foreground',\n muted: 'text-muted-foreground',\n};\n\nexport interface CellProps extends Omit<React.ComponentProps<'td'>, 'align'> {\n align?: TableAlign | React.TdHTMLAttributes<HTMLTableCellElement>['align'];\n tone?: TableCellTone;\n className?: string;\n children: React.ReactNode;\n}\n\nconst insetCellClass = cn(\n 'h-9 border-transparent bg-background bg-clip-padding px-2 py-1 align-middle whitespace-nowrap first:pl-3 last:pr-3',\n 'group-data-column-dividers/table:border-l group-data-column-dividers/table:px-3',\n);\n\nexport const Cell = ({ className, children, tone = 'ink', align, ...props }: CellProps) => {\n const variant = useTableVariant();\n if (variant === 'inset') {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n insetCellClass,\n tableAlignClasses[resolveTableAlign(align)],\n tableCellToneClasses[tone],\n className,\n )}\n {...props}\n >\n {children}\n </td>\n );\n }\n return (\n <td\n className={cn(tableCellToneClasses[tone], 'first:pl-3 last:pr-3', className)}\n {...props}\n align={toNativeAlign(align)}\n >\n <div className={cn('flex size-full shrink-0 items-center')}>{children}</div>\n </td>\n );\n};\n\nexport const TxtCell = ({ className, children }: CellProps) => {\n return (\n <Cell className={className}>\n <Txt as=\"span\" variant=\"body-sm\" className=\"w-full truncate\">\n {children}\n </Txt>\n </Cell>\n );\n};\n\nexport interface DateTimeCellProps extends Omit<CellProps, 'children'> {\n dateTime: Date;\n}\n\nexport const DateTimeCell = ({ dateTime, ...props }: DateTimeCellProps) => {\n return (\n <Cell {...props}>\n <Txt as=\"span\" variant=\"body\" className=\"shrink-0\">\n {formatDate(dateTime, 'date-time-seconds')}\n </Txt>\n </Cell>\n );\n};\n\nexport interface EntryCellProps extends Omit<CellProps, 'children'> {\n name: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport const EntryCell = ({ name, description, icon, meta, ...props }: EntryCellProps) => {\n return (\n <Cell {...props}>\n <div className=\"flex items-center gap-3.5\">\n {icon && (\n <Icon size=\"lg\" className=\"text-foreground\">\n {icon}\n </Icon>\n )}\n\n <div className=\"flex flex-col gap-0\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {name}\n </Txt>\n {description && (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"w-full max-w-75 truncate pt-1\">\n {description}\n </Txt>\n )}\n </div>\n {meta}\n </div>\n </Cell>\n );\n};\n","import type { ComponentProps } from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from '../Pagination/pagination';\nimport { getPaginationRange } from '../Pagination/pagination-range';\n\nexport type TablePaginationProps = Omit<ComponentProps<'nav'>, 'children'> & {\n page: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n};\n\nexport function TablePagination({ page, pageCount, onPageChange, ...props }: TablePaginationProps) {\n return (\n <Pagination {...props}>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious disabled={page <= 0} onClick={() => onPageChange(page - 1)} />\n </PaginationItem>\n {getPaginationRange(page, pageCount).map(item => {\n if (item.kind === 'ellipsis') {\n return (\n <PaginationItem key={item.key}>\n <PaginationEllipsis />\n </PaginationItem>\n );\n }\n return (\n <PaginationItem key={item.page}>\n <PaginationLink\n aria-label={`Page ${item.page + 1}`}\n isActive={item.page === page}\n onClick={() => onPageChange(item.page)}\n >\n {item.page + 1}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext disabled={page >= pageCount - 1} onClick={() => onPageChange(page + 1)} />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n );\n}\n","import type { TableVariant } from './table-context';\n\nconst stretchedTargetStyles = [\n \"outline-none after:absolute after:inset-0 after:content-['']\",\n 'focus-visible:after:outline-1 focus-visible:after:-outline-offset-1 focus-visible:after:outline-border-focus focus-visible:after:outline-solid',\n];\n\nexport function tableRowTargetStyles(variant: TableVariant) {\n if (variant === 'inset') return stretchedTargetStyles;\n return [];\n}\n","import type { ComponentProps } from 'react';\nimport { useTableVariant } from './table-context';\nimport { tableRowTargetStyles } from './table-row-target';\nimport { cn } from '@/lib/utils';\n\nexport type TableRowButtonProps = Omit<ComponentProps<'button'>, 'type'>;\n\nexport function TableRowButton({ className, ...props }: TableRowButtonProps) {\n const variant = useTableVariant();\n return (\n <button\n type=\"button\"\n data-slot=\"table-row-button\"\n data-row-target=\"\"\n className={cn('cursor-pointer text-left', ...tableRowTargetStyles(variant), className)}\n {...props}\n />\n );\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { useTableVariant } from './table-context';\nimport { tableRowTargetStyles } from './table-row-target';\nimport { cn } from '@/lib/utils';\n\nexport type TableRowLinkProps = useRender.ComponentProps<'a'>;\n\nexport function TableRowLink({ render, className, ...props }: TableRowLinkProps) {\n const variant = useTableVariant();\n return useRender({\n defaultTagName: 'a',\n render,\n props: {\n ...props,\n 'data-slot': 'table-row-link',\n 'data-row-target': '',\n className: cn(...tableRowTargetStyles(variant), className),\n },\n });\n}\n","import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlStateColorTransition, focusRingOffset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type TableSortDirection = 'ascending' | 'descending' | 'none';\n\nexport type TableSortButtonProps = Omit<ComponentProps<'button'>, 'type'> & {\n direction?: TableSortDirection;\n};\n\nconst sortIcons = {\n ascending: ArrowUp,\n descending: ArrowDown,\n none: ArrowUpDown,\n} satisfies Record<TableSortDirection, LucideIcon>;\n\nexport function TableSortButton({ direction = 'none', className, children, ...props }: TableSortButtonProps) {\n const SortIcon = sortIcons[direction];\n const sorted = direction !== 'none';\n return (\n <button\n type=\"button\"\n data-slot=\"table-sort-button\"\n data-sorted={sorted || undefined}\n className={cn(\n 'group/sort inline-flex cursor-pointer items-center gap-1 rounded-sm align-middle',\n 'group-data-[align=end]/head:flex-row-reverse',\n 'hover:text-foreground data-sorted:text-foreground',\n controlStateColorTransition,\n focusRingOffset,\n className,\n )}\n {...props}\n >\n {children}\n <Icon\n size=\"sm\"\n aria-hidden\n className={cn(\n !sorted &&\n 'opacity-0 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100 pointer-coarse:opacity-100',\n )}\n >\n <SortIcon />\n </Icon>\n </button>\n );\n}\n","import type { ComponentProps, ComponentPropsWithoutRef, CSSProperties, ReactNode } from 'react';\nimport { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\nimport { Cell } from './Cells';\nimport { resolveTableAlign, tableAlignClasses, toNativeAlign } from './table-align';\nimport type { TableAlign } from './table-align';\nimport { insetSlot, TableVariantContext, useTableVariant } from './table-context';\nimport type { TableVariant } from './table-context';\nimport { TablePagination } from './table-pagination';\nimport { TableRowButton } from './table-row-button';\nimport { TableRowLink } from './table-row-link';\nimport { TableSortButton } from './table-sort-button';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRingInset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TableProps extends ComponentProps<'table'> {\n className?: string;\n children: ReactNode;\n size?: 'default' | 'small';\n variant?: TableVariant;\n columnDividers?: boolean;\n style?: CSSProperties;\n}\n\nconst rowSize = {\n default: '[&>tbody>tr]:h-table-row',\n small: '[&>tbody>tr]:h-table-row-small',\n};\n\ntype TableFrameProps = Omit<TableProps, 'variant'> & { variant: TableVariant };\n\nfunction InsetTable({ className, columnDividers, ...props }: Omit<TableProps, 'variant' | 'size'>) {\n return (\n <div\n data-slot=\"table-container\"\n data-column-dividers={columnDividers || undefined}\n className={cn('group/table w-full rounded-xl p-1', raisedSurfaceStyle, className)}\n >\n <div data-slot=\"table-scroll\" className=\"overflow-x-auto rounded-lg\">\n <div className=\"group-data-column-dividers/table:-ml-px\">\n <table\n data-slot=\"table\"\n className=\"w-full border-separate border-spacing-0 text-body-sm tabular-nums\"\n tabIndex={0}\n {...props}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TableFrame({ variant, size = 'default', className, columnDividers, ...props }: TableFrameProps) {\n if (variant === 'inset') return <InsetTable className={className} columnDividers={columnDividers} {...props} />;\n return <table className={cn('w-full', rowSize[size], className)} {...props} />;\n}\n\nexport function Table({ variant = 'default', ...props }: TableProps) {\n return (\n <TableVariantContext value={variant}>\n <TableFrame variant={variant} {...props} />\n </TableVariantContext>\n );\n}\n\nexport type TableHeaderProps = ComponentProps<'thead'>;\n\nfunction TableHeader({ className, ...props }: TableHeaderProps) {\n const variant = useTableVariant();\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\n variant === 'default' && '[&>tr]:h-table-header [&>tr]:border-b [&>tr]:border-border [&>tr]:bg-card',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface TheadProps {\n className?: string;\n children: ReactNode;\n}\n\nexport const Thead = ({ className, children }: TheadProps) => {\n const variant = useTableVariant();\n return (\n <thead>\n <tr className={cn(variant === 'default' && 'h-table-header border-b border-border bg-card', className)}>\n {children}\n </tr>\n </thead>\n );\n};\n\nexport interface ThProps extends Omit<ComponentProps<'th'>, 'align'> {\n align?: TableAlign | ComponentProps<'th'>['align'];\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nconst insetHeadClass = cn(\n 'group/head h-10 px-2 align-middle text-column whitespace-nowrap text-muted-foreground first:pl-3 last:pr-3',\n 'border-transparent group-data-column-dividers/table:border-l group-data-column-dividers/table:px-3',\n);\n\nconst legacyHeadClass =\n 'h-full text-left text-meta tracking-wide whitespace-nowrap text-placeholder uppercase first:pl-3 last:pr-3';\n\nexport const Th = ({ className, children, align, ...props }: ThProps) => {\n const variant = useTableVariant();\n if (variant === 'inset') {\n const insetAlign = resolveTableAlign(align);\n return (\n <th\n className={cn(insetHeadClass, tableAlignClasses[insetAlign], className)}\n data-slot=\"table-head\"\n data-align={insetAlign}\n {...props}\n >\n {children}\n </th>\n );\n }\n return (\n <th className={cn(legacyHeadClass, className)} {...props} align={toNativeAlign(align)}>\n {children}\n </th>\n );\n};\n\nconst tableBodyStyles = [\n '[&>tr+tr>td]:border-t',\n '[&>tr:first-child>td:first-child]:rounded-tl-lg',\n '[&>tr:first-child>td:last-child]:rounded-tr-lg',\n '[&>tr:first-child_[data-row-target]]:after:rounded-t-lg',\n '[&>tr:last-child_[data-row-target]]:after:rounded-b-lg',\n '[&_:is(a,button,input,select,textarea):not([data-row-target])]:relative',\n '[&_:is(a,button,input,select,textarea):not([data-row-target])]:z-1',\n];\n\nexport interface TbodyProps extends ComponentProps<'tbody'> {\n className?: string;\n children: ReactNode;\n}\n\nexport const Tbody = ({ className, children, ...props }: TbodyProps) => {\n const variant = useTableVariant();\n return (\n <tbody\n data-slot={insetSlot(variant, 'table-body')}\n className={cn(variant === 'inset' && tableBodyStyles, className)}\n {...props}\n >\n {children}\n </tbody>\n );\n};\n\nexport interface RowProps extends Omit<ComponentPropsWithoutRef<'tr'>, 'onClick'> {\n className?: string;\n children: ReactNode;\n selected?: boolean;\n style?: CSSProperties;\n onClick?: () => void;\n tabIndex?: number;\n /** When true, row receives focus and scrolls into view */\n isActive?: boolean;\n}\n\nexport const Row = forwardRef<HTMLTableRowElement, RowProps>(\n ({ className, children, selected = false, style, onClick, isActive = false, ...props }, ref) => {\n const variant = useTableVariant();\n const internalRef = useRef<HTMLTableRowElement>(null);\n\n // Merge forwarded ref with internal ref\n useImperativeHandle<HTMLTableRowElement | null, HTMLTableRowElement | null>(ref, () => internalRef.current, []);\n\n // Focus and scroll into view when active\n useEffect(() => {\n if (isActive && internalRef.current) {\n internalRef.current.focus();\n internalRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (event.key === 'Enter' && onClick) {\n onClick();\n }\n };\n\n return (\n <tr\n className={cn(\n variant === 'default' && 'border-b border-border',\n // Smooth hover transition\n variant === 'default' && 'transition-colors duration-normal ease-out-custom',\n variant === 'default' && 'hover:bg-fill-subtle',\n variant === 'default' && 'focus:bg-fill-subtle',\n variant === 'default' && focusRingInset,\n variant === 'inset' && [\n 'has-[[data-row-target]]:relative',\n 'has-[[data-row-target]]:hover:*:bg-surface-panel',\n 'has-[[data-row-target]:focus-visible]:*:bg-surface-panel',\n ],\n selected && 'bg-fill-hover',\n onClick && 'cursor-pointer',\n className,\n )}\n data-slot={insetSlot(variant, 'table-row')}\n style={style}\n onClick={onClick}\n ref={internalRef}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={handleKeyDown}\n data-active={isActive || undefined}\n {...props}\n >\n {children}\n </tr>\n );\n },\n);\n\nTable.Header = TableHeader;\nTable.Body = Tbody;\nTable.Row = Row;\nTable.Head = Th;\nTable.Cell = Cell;\nTable.RowLink = TableRowLink;\nTable.RowButton = TableRowButton;\nTable.SortButton = TableSortButton;\nTable.Pagination = TablePagination;\n","import { useState, useCallback, useEffect } from 'react';\n\nexport interface UseTableKeyboardNavigationOptions {\n /** Number of items in the list */\n itemCount: number;\n /** Initial active index (-1 = none) */\n initialIndex?: number;\n /** Wrap around at boundaries */\n wrap?: boolean;\n /** Callback when Enter pressed on active row */\n onSelect?: (index: number) => void;\n /** When true, registers keyboard handlers globally on the document */\n global?: boolean;\n}\n\nexport interface UseTableKeyboardNavigationReturn {\n /** Currently active index (-1 if none) */\n activeIndex: number;\n /** Set active index programmatically */\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n /** Returns props to spread on the Tbody element. Returns null when global is true. */\n getKeyboardProps: () => { onKeyDown: (e: React.KeyboardEvent) => void; tabIndex: number } | null;\n}\n\nexport function useTableKeyboardNavigation({\n itemCount,\n initialIndex = -1,\n wrap = false,\n onSelect,\n global = false,\n}: UseTableKeyboardNavigationOptions): UseTableKeyboardNavigationReturn {\n const [activeIndex, setActiveIndex] = useState(initialIndex);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent | React.KeyboardEvent) => {\n // No-op for empty list\n if (itemCount === 0) return;\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n setActiveIndex(prev => {\n if (prev === -1) return 0;\n if (prev >= itemCount - 1) {\n return wrap ? 0 : itemCount - 1;\n }\n return prev + 1;\n });\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n setActiveIndex(prev => {\n if (prev === -1) return itemCount - 1;\n if (prev <= 0) {\n return wrap ? itemCount - 1 : 0;\n }\n return prev - 1;\n });\n break;\n }\n case 'Home': {\n e.preventDefault();\n setActiveIndex(0);\n break;\n }\n case 'End': {\n e.preventDefault();\n setActiveIndex(itemCount - 1);\n break;\n }\n case 'Enter': {\n if (activeIndex >= 0 && onSelect) {\n e.preventDefault();\n onSelect(activeIndex);\n }\n break;\n }\n }\n },\n [itemCount, wrap, activeIndex, onSelect],\n );\n\n // Register global keyboard handlers when global option is enabled\n useEffect(() => {\n if (!global) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [global, handleKeyDown]);\n\n const getKeyboardProps = useCallback(() => {\n if (global) return null;\n return { onKeyDown: handleKeyDown as (e: React.KeyboardEvent) => void, tabIndex: 0 };\n }, [global, handleKeyDown]);\n\n return {\n activeIndex,\n setActiveIndex,\n getKeyboardProps,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Table.es.js","sources":["../../src/ds/components/Table/table-align.ts","../../src/ds/components/Table/table-context.ts","../../src/ds/components/Table/Cells.tsx","../../src/ds/components/Table/table-pagination.tsx","../../src/ds/components/Table/table-row-target.ts","../../src/ds/components/Table/table-row-button.tsx","../../src/ds/components/Table/table-row-link.tsx","../../src/ds/components/Table/table-sort-button.tsx","../../src/ds/components/Table/Table.tsx","../../src/ds/components/Table/use-table-keyboard-navigation.ts"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nexport type TableAlign = 'start' | 'center' | 'end';\n\ntype NativeCellAlign = ComponentProps<'td'>['align'];\n\nexport const tableAlignClasses: Record<TableAlign, string> = {\n start: 'text-left',\n center: 'text-center',\n end: 'text-right',\n};\n\nexport function resolveTableAlign(align: string | undefined): TableAlign {\n if (align === 'center') return 'center';\n if (align === 'end' || align === 'right') return 'end';\n return 'start';\n}\n\nexport function toNativeAlign(align: TableAlign | NativeCellAlign): NativeCellAlign {\n if (align === 'start') return 'left';\n if (align === 'end') return 'right';\n return align;\n}\n","import { createContext, use } from 'react';\n\nexport type TableVariant = 'default' | 'inset';\n\nexport const TableVariantContext = createContext<TableVariant>('default');\n\nexport function useTableVariant() {\n return use(TableVariantContext);\n}\n\nexport function insetSlot(variant: TableVariant, slot: string) {\n if (variant === 'inset') return slot;\n return undefined;\n}\n","import React from 'react';\n\nimport { Icon } from '../../icons/Icon';\nimport { Txt } from '../Txt';\nimport { resolveTableAlign, tableAlignClasses, toNativeAlign } from './table-align';\nimport type { TableAlign } from './table-align';\nimport { useTableVariant } from './table-context';\nimport { cn } from '@/lib/utils';\nimport { formatDate } from '@/utils/date-format';\n\nexport type TableCellTone = 'ink' | 'muted';\n\nconst tableCellToneClasses: Record<TableCellTone, string> = {\n ink: 'text-foreground',\n muted: 'text-muted-foreground',\n};\n\nexport interface CellProps extends Omit<React.ComponentProps<'td'>, 'align'> {\n align?: TableAlign | React.TdHTMLAttributes<HTMLTableCellElement>['align'];\n tone?: TableCellTone;\n className?: string;\n children: React.ReactNode;\n}\n\nconst insetCellClass = cn(\n 'h-9 border-transparent bg-background bg-clip-padding px-2 py-1 align-middle whitespace-nowrap first:pl-3 last:pr-3',\n 'group-data-column-dividers/table:border-l group-data-column-dividers/table:px-3',\n);\n\nexport const Cell = ({ className, children, tone = 'ink', align, ...props }: CellProps) => {\n const variant = useTableVariant();\n if (variant === 'inset') {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n insetCellClass,\n tableAlignClasses[resolveTableAlign(align)],\n tableCellToneClasses[tone],\n className,\n )}\n {...props}\n >\n {children}\n </td>\n );\n }\n return (\n <td\n className={cn(tableCellToneClasses[tone], 'first:pl-3 last:pr-3', className)}\n {...props}\n align={toNativeAlign(align)}\n >\n <div className={cn('flex size-full shrink-0 items-center')}>{children}</div>\n </td>\n );\n};\n\nexport const TxtCell = ({ className, children }: CellProps) => {\n return (\n <Cell className={className}>\n <Txt as=\"span\" variant=\"body-sm\" className=\"w-full truncate\">\n {children}\n </Txt>\n </Cell>\n );\n};\n\nexport interface DateTimeCellProps extends Omit<CellProps, 'children'> {\n dateTime: Date;\n}\n\nexport const DateTimeCell = ({ dateTime, ...props }: DateTimeCellProps) => {\n return (\n <Cell {...props}>\n <Txt as=\"span\" variant=\"body\" className=\"shrink-0\">\n {formatDate(dateTime, 'date-time-seconds')}\n </Txt>\n </Cell>\n );\n};\n\nexport interface EntryCellProps extends Omit<CellProps, 'children'> {\n name: React.ReactNode;\n description?: React.ReactNode;\n icon?: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport const EntryCell = ({ name, description, icon, meta, ...props }: EntryCellProps) => {\n return (\n <Cell {...props}>\n <div className=\"flex items-center gap-3.5\">\n {icon && (\n <Icon size=\"lg\" className=\"text-foreground\">\n {icon}\n </Icon>\n )}\n\n <div className=\"flex flex-col gap-0\">\n <Txt as=\"span\" variant=\"body\" tone=\"ink\">\n {name}\n </Txt>\n {description && (\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"w-full max-w-75 truncate pt-1\">\n {description}\n </Txt>\n )}\n </div>\n {meta}\n </div>\n </Cell>\n );\n};\n","import type { ComponentProps } from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from '../Pagination/pagination';\nimport { getPaginationRange } from '../Pagination/pagination-range';\n\nexport type TablePaginationProps = Omit<ComponentProps<'nav'>, 'children'> & {\n page: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n};\n\nexport function TablePagination({ page, pageCount, onPageChange, ...props }: TablePaginationProps) {\n return (\n <Pagination {...props}>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious disabled={page <= 0} onClick={() => onPageChange(page - 1)} />\n </PaginationItem>\n {getPaginationRange(page, pageCount).map(item => {\n if (item.kind === 'ellipsis') {\n return (\n <PaginationItem key={item.key}>\n <PaginationEllipsis />\n </PaginationItem>\n );\n }\n return (\n <PaginationItem key={item.page}>\n <PaginationLink\n aria-label={`Page ${item.page + 1}`}\n isActive={item.page === page}\n onClick={() => onPageChange(item.page)}\n >\n {item.page + 1}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n <PaginationItem>\n <PaginationNext disabled={page >= pageCount - 1} onClick={() => onPageChange(page + 1)} />\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n );\n}\n","import type { TableVariant } from './table-context';\n\nconst stretchedTargetStyles = [\n \"outline-none after:absolute after:inset-0 after:content-['']\",\n 'focus-visible:after:outline-1 focus-visible:after:-outline-offset-1 focus-visible:after:outline-border-focus focus-visible:after:outline-solid',\n];\n\nexport function tableRowTargetStyles(variant: TableVariant) {\n if (variant === 'inset') return stretchedTargetStyles;\n return [];\n}\n","import type { ComponentProps } from 'react';\nimport { useTableVariant } from './table-context';\nimport { tableRowTargetStyles } from './table-row-target';\nimport { cn } from '@/lib/utils';\n\nexport type TableRowButtonProps = Omit<ComponentProps<'button'>, 'type'>;\n\nexport function TableRowButton({ className, ...props }: TableRowButtonProps) {\n const variant = useTableVariant();\n return (\n <button\n type=\"button\"\n data-slot=\"table-row-button\"\n data-row-target=\"\"\n className={cn('cursor-pointer text-left', ...tableRowTargetStyles(variant), className)}\n {...props}\n />\n );\n}\n","import { useRender } from '@base-ui/react/use-render';\nimport { useTableVariant } from './table-context';\nimport { tableRowTargetStyles } from './table-row-target';\nimport { cn } from '@/lib/utils';\n\nexport type TableRowLinkProps = useRender.ComponentProps<'a'>;\n\nexport function TableRowLink({ render, className, ...props }: TableRowLinkProps) {\n const variant = useTableVariant();\n return useRender({\n defaultTagName: 'a',\n render,\n props: {\n ...props,\n 'data-slot': 'table-row-link',\n 'data-row-target': '',\n className: cn(...tableRowTargetStyles(variant), className),\n },\n });\n}\n","import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { Icon } from '@/ds/icons/Icon';\nimport { controlStateColorTransition, focusRingOffset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport type TableSortDirection = 'ascending' | 'descending' | 'none';\n\nexport type TableSortButtonProps = Omit<ComponentProps<'button'>, 'type'> & {\n direction?: TableSortDirection;\n};\n\nconst sortIcons = {\n ascending: ArrowUp,\n descending: ArrowDown,\n none: ArrowUpDown,\n} satisfies Record<TableSortDirection, LucideIcon>;\n\nexport function TableSortButton({ direction = 'none', className, children, ...props }: TableSortButtonProps) {\n const SortIcon = sortIcons[direction];\n const sorted = direction !== 'none';\n return (\n <button\n type=\"button\"\n data-slot=\"table-sort-button\"\n data-sorted={sorted || undefined}\n className={cn(\n 'group/sort inline-flex cursor-pointer items-center gap-1 rounded-sm align-middle',\n 'group-data-[align=end]/head:flex-row-reverse',\n 'hover:text-foreground data-sorted:text-foreground',\n controlStateColorTransition,\n focusRingOffset,\n className,\n )}\n {...props}\n >\n {children}\n <Icon\n size=\"sm\"\n aria-hidden\n className={cn(\n !sorted &&\n 'opacity-0 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100 pointer-coarse:opacity-100',\n )}\n >\n <SortIcon />\n </Icon>\n </button>\n );\n}\n","import type { ComponentProps, ComponentPropsWithoutRef, CSSProperties, ReactNode } from 'react';\nimport { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\nimport { Cell } from './Cells';\nimport { resolveTableAlign, tableAlignClasses, toNativeAlign } from './table-align';\nimport type { TableAlign } from './table-align';\nimport { insetSlot, TableVariantContext, useTableVariant } from './table-context';\nimport type { TableVariant } from './table-context';\nimport { TablePagination } from './table-pagination';\nimport { TableRowButton } from './table-row-button';\nimport { TableRowLink } from './table-row-link';\nimport { TableSortButton } from './table-sort-button';\nimport { raisedSurfaceStyle } from '@/ds/primitives/raised-surface';\nimport { focusRingInset } from '@/ds/primitives/transitions';\nimport { cn } from '@/lib/utils';\n\nexport interface TableProps extends ComponentProps<'table'> {\n className?: string;\n children: ReactNode;\n size?: 'default' | 'small';\n variant?: TableVariant;\n columnDividers?: boolean;\n style?: CSSProperties;\n}\n\nconst rowSize = {\n default: '[&>tbody>tr]:h-table-row',\n small: '[&>tbody>tr]:h-table-row-small',\n};\n\ntype TableFrameProps = Omit<TableProps, 'variant'> & { variant: TableVariant };\n\nfunction InsetTable({ className, columnDividers, ...props }: Omit<TableProps, 'variant' | 'size'>) {\n return (\n <div\n data-slot=\"table-container\"\n data-column-dividers={columnDividers || undefined}\n className={cn('group/table w-full rounded-xl p-1', raisedSurfaceStyle, className)}\n >\n <div data-slot=\"table-scroll\" className=\"overflow-x-auto rounded-lg\">\n <div className=\"group-data-column-dividers/table:-ml-px\">\n <table\n data-slot=\"table\"\n className=\"w-full border-separate border-spacing-0 text-body-sm tabular-nums\"\n tabIndex={0}\n {...props}\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TableFrame({ variant, size = 'default', className, columnDividers, ...props }: TableFrameProps) {\n if (variant === 'inset') return <InsetTable className={className} columnDividers={columnDividers} {...props} />;\n return <table className={cn('w-full', rowSize[size], className)} {...props} />;\n}\n\nexport function Table({ variant = 'default', ...props }: TableProps) {\n return (\n <TableVariantContext value={variant}>\n <TableFrame variant={variant} {...props} />\n </TableVariantContext>\n );\n}\n\nexport type TableHeaderProps = ComponentProps<'thead'> & {\n placement?: 'above' | 'inside';\n};\n\nconst insideHeaderStyles = [\n '[&>tr>th]:border-b [&>tr>th]:bg-background [&>tr>th]:bg-clip-padding',\n '[&>tr>th:first-child]:rounded-tl-lg [&>tr>th:last-child]:rounded-tr-lg',\n];\n\nfunction TableHeader({ className, placement = 'above', ...props }: TableHeaderProps) {\n const variant = useTableVariant();\n const inside = variant === 'inset' && placement === 'inside';\n const headerPlacement = inside ? 'inside' : undefined;\n return (\n <thead\n data-slot=\"table-header\"\n data-placement={headerPlacement}\n className={cn(\n variant === 'default' && '[&>tr]:h-table-header [&>tr]:border-b [&>tr]:border-border [&>tr]:bg-card',\n inside && insideHeaderStyles,\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface TheadProps {\n className?: string;\n children: ReactNode;\n}\n\nexport const Thead = ({ className, children }: TheadProps) => {\n const variant = useTableVariant();\n return (\n <thead>\n <tr className={cn(variant === 'default' && 'h-table-header border-b border-border bg-card', className)}>\n {children}\n </tr>\n </thead>\n );\n};\n\nexport interface ThProps extends Omit<ComponentProps<'th'>, 'align'> {\n align?: TableAlign | ComponentProps<'th'>['align'];\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nconst insetHeadClass = cn(\n 'group/head h-10 px-2 align-middle text-column whitespace-nowrap text-muted-foreground first:pl-3 last:pr-3',\n 'border-transparent group-data-column-dividers/table:border-l group-data-column-dividers/table:px-3',\n);\n\nconst legacyHeadClass =\n 'h-full text-left text-meta tracking-wide whitespace-nowrap text-placeholder uppercase first:pl-3 last:pr-3';\n\nexport const Th = ({ className, children, align, ...props }: ThProps) => {\n const variant = useTableVariant();\n if (variant === 'inset') {\n const insetAlign = resolveTableAlign(align);\n return (\n <th\n className={cn(insetHeadClass, tableAlignClasses[insetAlign], className)}\n data-slot=\"table-head\"\n data-align={insetAlign}\n {...props}\n >\n {children}\n </th>\n );\n }\n return (\n <th className={cn(legacyHeadClass, className)} {...props} align={toNativeAlign(align)}>\n {children}\n </th>\n );\n};\n\nconst tableBodyStyles = [\n '[&>tr+tr>td]:border-t',\n '[&>tr:first-child>td:first-child]:rounded-tl-lg',\n '[&>tr:first-child>td:last-child]:rounded-tr-lg',\n '[&>tr:first-child_[data-row-target]]:after:rounded-t-lg',\n '[thead[data-placement=inside]+&>tr:first-child>td]:rounded-none',\n '[thead[data-placement=inside]+&>tr:first-child_[data-row-target]]:after:rounded-none',\n '[&>tr:last-child_[data-row-target]]:after:rounded-b-lg',\n '[&_:is(a,button,input,select,textarea):not([data-row-target])]:relative',\n '[&_:is(a,button,input,select,textarea):not([data-row-target])]:z-1',\n];\n\nexport interface TbodyProps extends ComponentProps<'tbody'> {\n className?: string;\n children: ReactNode;\n}\n\nexport const Tbody = ({ className, children, ...props }: TbodyProps) => {\n const variant = useTableVariant();\n return (\n <tbody\n data-slot={insetSlot(variant, 'table-body')}\n className={cn(variant === 'inset' && tableBodyStyles, className)}\n {...props}\n >\n {children}\n </tbody>\n );\n};\n\nexport interface RowProps extends Omit<ComponentPropsWithoutRef<'tr'>, 'onClick'> {\n className?: string;\n children: ReactNode;\n selected?: boolean;\n style?: CSSProperties;\n onClick?: () => void;\n tabIndex?: number;\n /** When true, row receives focus and scrolls into view */\n isActive?: boolean;\n}\n\nexport const Row = forwardRef<HTMLTableRowElement, RowProps>(\n ({ className, children, selected = false, style, onClick, isActive = false, ...props }, ref) => {\n const variant = useTableVariant();\n const internalRef = useRef<HTMLTableRowElement>(null);\n\n // Merge forwarded ref with internal ref\n useImperativeHandle<HTMLTableRowElement | null, HTMLTableRowElement | null>(ref, () => internalRef.current, []);\n\n // Focus and scroll into view when active\n useEffect(() => {\n if (isActive && internalRef.current) {\n internalRef.current.focus();\n internalRef.current.scrollIntoView({ block: 'nearest' });\n }\n }, [isActive]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n if (event.key === 'Enter' && onClick) {\n onClick();\n }\n };\n\n return (\n <tr\n className={cn(\n variant === 'default' && 'border-b border-border',\n // Smooth hover transition\n variant === 'default' && 'transition-colors duration-normal ease-out-custom',\n variant === 'default' && 'hover:bg-fill-subtle',\n variant === 'default' && 'focus:bg-fill-subtle',\n variant === 'default' && focusRingInset,\n variant === 'inset' && [\n 'has-[[data-row-target]]:relative',\n 'has-[[data-row-target]]:hover:*:bg-surface-panel',\n 'has-[[data-row-target]:focus-visible]:*:bg-surface-panel',\n ],\n selected && 'bg-fill-hover',\n onClick && 'cursor-pointer',\n className,\n )}\n data-slot={insetSlot(variant, 'table-row')}\n style={style}\n onClick={onClick}\n ref={internalRef}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={handleKeyDown}\n data-active={isActive || undefined}\n {...props}\n >\n {children}\n </tr>\n );\n },\n);\n\nTable.Header = TableHeader;\nTable.Body = Tbody;\nTable.Row = Row;\nTable.Head = Th;\nTable.Cell = Cell;\nTable.RowLink = TableRowLink;\nTable.RowButton = TableRowButton;\nTable.SortButton = TableSortButton;\nTable.Pagination = TablePagination;\n","import { useState, useCallback, useEffect } from 'react';\n\nexport interface UseTableKeyboardNavigationOptions {\n /** Number of items in the list */\n itemCount: number;\n /** Initial active index (-1 = none) */\n initialIndex?: number;\n /** Wrap around at boundaries */\n wrap?: boolean;\n /** Callback when Enter pressed on active row */\n onSelect?: (index: number) => void;\n /** When true, registers keyboard handlers globally on the document */\n global?: boolean;\n}\n\nexport interface UseTableKeyboardNavigationReturn {\n /** Currently active index (-1 if none) */\n activeIndex: number;\n /** Set active index programmatically */\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n /** Returns props to spread on the Tbody element. Returns null when global is true. */\n getKeyboardProps: () => { onKeyDown: (e: React.KeyboardEvent) => void; tabIndex: number } | null;\n}\n\nexport function useTableKeyboardNavigation({\n itemCount,\n initialIndex = -1,\n wrap = false,\n onSelect,\n global = false,\n}: UseTableKeyboardNavigationOptions): UseTableKeyboardNavigationReturn {\n const [activeIndex, setActiveIndex] = useState(initialIndex);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent | React.KeyboardEvent) => {\n // No-op for empty list\n if (itemCount === 0) return;\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n setActiveIndex(prev => {\n if (prev === -1) return 0;\n if (prev >= itemCount - 1) {\n return wrap ? 0 : itemCount - 1;\n }\n return prev + 1;\n });\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n setActiveIndex(prev => {\n if (prev === -1) return itemCount - 1;\n if (prev <= 0) {\n return wrap ? itemCount - 1 : 0;\n }\n return prev - 1;\n });\n break;\n }\n case 'Home': {\n e.preventDefault();\n setActiveIndex(0);\n break;\n }\n case 'End': {\n e.preventDefault();\n setActiveIndex(itemCount - 1);\n break;\n }\n case 'Enter': {\n if (activeIndex >= 0 && onSelect) {\n e.preventDefault();\n onSelect(activeIndex);\n }\n break;\n }\n }\n },\n [itemCount, wrap, activeIndex, onSelect],\n );\n\n // Register global keyboard handlers when global option is enabled\n useEffect(() => {\n if (!global) return;\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [global, handleKeyDown]);\n\n const getKeyboardProps = useCallback(() => {\n if (global) return null;\n return { onKeyDown: handleKeyDown as (e: React.KeyboardEvent) => void, tabIndex: 0 };\n }, [global, handleKeyDown]);\n\n return {\n activeIndex,\n setActiveIndex,\n getKeyboardProps,\n };\n}\n"],"names":[],"mappings":"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"}
|