@mastra/playground-ui 64.0.0-alpha.9 → 64.0.1-alpha.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/components/DataList.cjs.js +17 -15
- package/dist/components/DataList.cjs.js.map +1 -1
- package/dist/components/DataList.es.js +5 -4
- 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/LogsDataList.cjs.js +2 -5
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +2 -5
- 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/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-DUfXIhyC.cjs +142 -0
- package/dist/data-list-DUfXIhyC.cjs.map +1 -0
- package/dist/data-list-DXQY_iQW.js +138 -0
- package/dist/data-list-DXQY_iQW.js.map +1 -0
- package/dist/{data-list-skeleton-CGKlcoiI.js → data-list-skeleton-B_SXAeE0.js} +2 -2
- package/dist/{data-list-skeleton-CGKlcoiI.js.map → data-list-skeleton-B_SXAeE0.js.map} +1 -1
- package/dist/{data-list-skeleton-DGMTqeNP.cjs → data-list-skeleton-BqC9Gggi.cjs} +6 -6
- package/dist/{data-list-skeleton-DGMTqeNP.cjs.map → data-list-skeleton-BqC9Gggi.cjs.map} +1 -1
- package/dist/data-list-spacer-ByA4ce2a.js +209 -0
- package/dist/data-list-spacer-ByA4ce2a.js.map +1 -0
- package/dist/data-list-spacer-tQaBaum4.cjs +218 -0
- package/dist/data-list-spacer-tQaBaum4.cjs.map +1 -0
- package/dist/{data-list-ecHsw-zr.cjs → data-list-top-ByT2Mo77.cjs} +13 -339
- package/dist/data-list-top-ByT2Mo77.cjs.map +1 -0
- package/dist/{data-list-DdCZZctL.js → data-list-top-DSr_ocKA.js} +5 -332
- package/dist/data-list-top-DSr_ocKA.js.map +1 -0
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +0 -3
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +0 -3
- package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -3
- package/dist/domains/logs/components/logs-list-view.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-list-view.es.js +2 -3
- 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/trace-scores-tab.cjs.js +1 -2
- package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
- package/dist/domains/scores/components/trace-scores-tab.es.js +1 -2
- 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 +9 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +9 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.cjs.js +0 -3
- package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel.es.js +0 -3
- package/dist/domains/traces/components/trace-data-panel.es.js.map +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 +14 -4
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +13 -3
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +1 -4
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +1 -4
- 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/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 +1 -3
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +1 -3
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +1 -3
- 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 +1 -3
- 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/layout/tabbed-container.cjs.js +1 -1
- package/dist/layout/tabbed-container.es.js +1 -1
- package/dist/{logs-data-list-DBJINzIL.js → logs-data-list-CoER2Hst.js} +3 -2
- package/dist/{logs-data-list-DBJINzIL.js.map → logs-data-list-CoER2Hst.js.map} +1 -1
- package/dist/{logs-data-list-IWZgMCKG.cjs → logs-data-list-DRR6cMgl.cjs} +22 -21
- package/dist/{logs-data-list-IWZgMCKG.cjs.map → logs-data-list-DRR6cMgl.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/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 +117 -1
- package/dist/{traces-data-list-CHREkLv0.cjs → traces-data-list-BgjeB-BF.cjs} +25 -17
- package/dist/traces-data-list-BgjeB-BF.cjs.map +1 -0
- package/dist/{traces-data-list-BgloVIVi.js → traces-data-list-Zoai0OW_.js} +10 -2
- package/dist/traces-data-list-Zoai0OW_.js.map +1 -0
- package/package.json +11 -11
- package/dist/data-list-DdCZZctL.js.map +0 -1
- package/dist/data-list-ecHsw-zr.cjs.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-BgloVIVi.js.map +0 -1
- package/dist/traces-data-list-CHREkLv0.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Meter.es.js","sources":["../../src/ds/components/Meter/meter-context.ts","../../src/ds/components/Meter/meter-key-row.tsx","../../src/ds/components/Meter/meter-segment.tsx","../../src/ds/components/Meter/meter-root.tsx","../../src/ds/components/Meter/meter-source.tsx","../../src/ds/components/Meter/meter.tsx"],"sourcesContent":["import { createContext } from 'react';\nimport { formatFullNumber } from '@/lib/cost';\n\nexport type MeterPart = 'bar' | 'key';\n\nexport const MeterPartContext = createContext<{ part: MeterPart; format: (value: number) => string }>({\n part: 'bar',\n format: formatFullNumber,\n});\n\nexport const sourceColorClassName = [\n '[&>:nth-child(5n+1)]:[--meter-source:var(--chart-share-1)]',\n '[&>:nth-child(5n+2)]:[--meter-source:var(--chart-share-2)]',\n '[&>:nth-child(5n+3)]:[--meter-source:var(--chart-share-3)]',\n '[&>:nth-child(5n+4)]:[--meter-source:var(--chart-share-4)]',\n '[&>:nth-child(5n)]:[--meter-source:var(--chart-share-5)]',\n].join(' ');\n","import type { ReactNode } from 'react';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\nexport function MeterKeyRow({ swatch, label, amount }: { swatch: string; label: ReactNode; amount: string }) {\n return (\n <div data-slot=\"meter-key-row\" className=\"flex items-center gap-2\">\n <span aria-hidden className={cn('size-2 rounded-xs', swatch)} />\n <Txt as=\"span\" variant=\"caption\" tone=\"muted\" className=\"max-w-48 min-w-0 flex-1 truncate\">\n {label}\n </Txt>\n <span className=\"ml-auto pl-4 text-foreground tabular-nums\">{amount}</span>\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { cn } from '@/lib/utils';\n\ninterface SegmentStyle extends CSSProperties {\n '--meter-share': number;\n}\n\nexport function MeterSegment({ slot, grow, className }: { slot: string; grow: number; className: string }) {\n const style: SegmentStyle = { '--meter-share': grow };\n return (\n <span\n data-slot={slot}\n className={cn('min-w-1 grow-(--meter-share) basis-0 rounded-full', className)}\n style={style}\n />\n );\n}\n","import { useId } from 'react';\nimport type { CSSProperties, ComponentProps, ReactNode } from 'react';\nimport { MeterPartContext, sourceColorClassName } from './meter-context';\nimport { MeterKeyRow } from './meter-key-row';\nimport { MeterSegment } from './meter-segment';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip/tooltip';\nimport { focusRing, transitions } from '@/ds/primitives/transitions';\nimport { formatFullNumber } from '@/lib/cost';\nimport { cn } from '@/lib/utils';\n\nexport type MeterProps = Omit<ComponentProps<'span'>, 'children'> & {\n value: number;\n max: number;\n children?: ReactNode;\n format?: (value: number) => string;\n} & ({ 'aria-label': string; 'aria-labelledby'?: never } | { 'aria-label'?: never; 'aria-labelledby': string });\n\ntype Reading = { used: number; allowance: number; over: number; within: number; rest: number };\n\nfunction readingOf(value: number, max: number): Reading {\n const used = Math.max(0, value);\n const allowance = Math.max(0, max);\n const over = Math.max(0, used - allowance);\n const within = used - over;\n return { used, allowance, over, within, rest: allowance - within };\n}\n\nfunction overAllowanceText({ used, allowance, over }: Reading, format: (value: number) => string) {\n if (over <= 0) return undefined;\n return `${format(used)} of ${format(allowance)}, ${format(over)} over`;\n}\n\nexport function MeterRoot({ value, max, children, format = formatFullNumber, className, ...props }: MeterProps) {\n const reading = readingOf(value, max);\n const meterProps = {\n role: 'meter',\n 'aria-valuemin': 0,\n 'aria-valuemax': reading.allowance,\n 'aria-valuenow': reading.within,\n 'aria-valuetext': overAllowanceText(reading, format),\n 'data-over': reading.over > 0 || undefined,\n className: cn('group/meter relative flex h-1 w-full min-w-0', className),\n ...props,\n };\n\n if (children === undefined) {\n return (\n <span {...meterProps}>\n <AllowanceBar reading={reading} />\n </span>\n );\n }\n\n return (\n <SourcesMeter reading={reading} format={format} meterProps={meterProps}>\n {children}\n </SourcesMeter>\n );\n}\n\nfunction SourcesMeter({\n reading,\n format,\n meterProps,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n meterProps: ComponentProps<'span'>;\n children: ReactNode;\n}) {\n const keyId = useId();\n return (\n <Tooltip>\n <TooltipTrigger\n delay={0}\n render={\n <span\n {...meterProps}\n tabIndex={0}\n aria-describedby={keyId}\n className={cn(\n meterProps.className,\n 'rounded-full before:absolute before:inset-x-0 before:-inset-y-2',\n focusRing,\n )}\n />\n }\n >\n <AllowanceBar reading={reading} className={cn(fadeOut, transitions.opacity, 'motion-reduce:transition-none')} />\n <SourceBar reading={reading} format={format}>\n {children}\n </SourceBar>\n </TooltipTrigger>\n <TooltipContent keepMounted id={keyId}>\n <MeterKey reading={reading} format={format}>\n {children}\n </MeterKey>\n </TooltipContent>\n </Tooltip>\n );\n}\n\nconst fadeOut = 'group-hover/meter:opacity-0 group-focus-visible/meter:opacity-0';\nconst fadeIn = 'opacity-0 group-hover/meter:opacity-100 group-focus-visible/meter:opacity-100';\n\nfunction AllowanceBar({ reading, className }: { reading: Reading; className?: string }) {\n const { used, over, within, rest } = reading;\n return (\n <span data-slot=\"meter-bar\" className={cn('flex size-full gap-0.5', className)}>\n {within > 0 && <MeterSegment slot=\"meter-used\" grow={within} className=\"bg-foreground\" />}\n {over > 0 && <MeterSegment slot=\"meter-over\" grow={over} className=\"bg-destructive-indicator\" />}\n {(rest > 0 || used === 0) && <MeterSegment slot=\"meter-rest\" grow={rest || 1} className=\"bg-fill-strong\" />}\n </span>\n );\n}\n\ninterface OverStyle extends CSSProperties {\n '--meter-over': string;\n}\n\nfunction SourceBar({\n reading,\n format,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n children: ReactNode;\n}) {\n const { used, over, rest } = reading;\n const overShare = used > 0 ? over / used : 0;\n const overStyle: OverStyle = { '--meter-over': `${overShare * 100}%` };\n return (\n <span\n aria-hidden\n data-slot=\"meter-sources\"\n style={overStyle}\n className={cn(\n 'absolute inset-0 flex gap-0.5',\n fadeIn,\n transitions.opacity,\n 'motion-reduce:transition-none',\n sourceColorClassName,\n )}\n >\n <MeterPartContext value={{ part: 'bar', format }}>{children}</MeterPartContext>\n {rest > 0 && <MeterSegment slot=\"meter-rest\" grow={rest} className=\"bg-fill-strong\" />}\n {over > 0 && (\n <>\n <span className=\"absolute inset-y-0 right-0 w-(--meter-over) rounded-r-full bg-destructive-indicator\" />\n <span className=\"absolute -inset-y-1 right-(--meter-over) w-0.5 rounded-full bg-foreground\" />\n </>\n )}\n </span>\n );\n}\n\nfunction MeterKey({\n reading,\n format,\n children,\n}: {\n reading: Reading;\n format: (value: number) => string;\n children: ReactNode;\n}) {\n const { over, rest } = reading;\n return (\n <div data-slot=\"meter-key\" className={cn('flex min-w-40 flex-col gap-1', sourceColorClassName)}>\n <MeterPartContext value={{ part: 'key', format }}>{children}</MeterPartContext>\n {rest > 0 && <MeterKeyRow swatch=\"bg-fill-strong\" label=\"Remaining\" amount={format(rest)} />}\n {over > 0 && <MeterKeyRow swatch=\"bg-destructive-indicator\" label=\"Over allowance\" amount={format(over)} />}\n </div>\n );\n}\n","import { use } from 'react';\nimport type { ReactNode } from 'react';\nimport { MeterPartContext } from './meter-context';\nimport { MeterKeyRow } from './meter-key-row';\nimport { MeterSegment } from './meter-segment';\n\nexport type MeterSourceProps = {\n label: ReactNode;\n value: number;\n};\n\nexport function MeterSource({ label, value }: MeterSourceProps) {\n const { part, format } = use(MeterPartContext);\n if (part === 'key') return <MeterKeyRow swatch=\"bg-(--meter-source)\" label={label} amount={format(value)} />;\n return <MeterSegment slot=\"meter-source\" grow={Math.max(0, value)} className=\"bg-(--meter-source)\" />;\n}\n","import { MeterRoot } from './meter-root';\nimport { MeterSource } from './meter-source';\n\nexport type { MeterProps } from './meter-root';\n\nexport const Meter = Object.assign(MeterRoot, { Source: MeterSource });\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { M as MetricsStackedBarChart } from '../metrics-stacked-bar-chart-
|
|
1
|
+
export { M as MetricsStackedBarChart } from '../metrics-stacked-bar-chart-DcxHznKw.js';
|
|
2
2
|
//# sourceMappingURL=MetricsStackedBarChart.es.js.map
|
|
@@ -221,14 +221,22 @@ function TableFrame({ variant, size = "default", className, columnDividers, ...p
|
|
|
221
221
|
function Table({ variant = "default", ...props }) {
|
|
222
222
|
return /* @__PURE__ */ jsxRuntime.jsx(TableVariantContext, { value: variant, children: /* @__PURE__ */ jsxRuntime.jsx(TableFrame, { variant, ...props }) });
|
|
223
223
|
}
|
|
224
|
-
|
|
224
|
+
const insideHeaderStyles = [
|
|
225
|
+
"[&>tr>th]:border-b [&>tr>th]:bg-background [&>tr>th]:bg-clip-padding",
|
|
226
|
+
"[&>tr>th:first-child]:rounded-tl-lg [&>tr>th:last-child]:rounded-tr-lg"
|
|
227
|
+
];
|
|
228
|
+
function TableHeader({ className, placement = "above", ...props }) {
|
|
225
229
|
const variant = useTableVariant();
|
|
230
|
+
const inside = variant === "inset" && placement === "inside";
|
|
231
|
+
const headerPlacement = inside ? "inside" : void 0;
|
|
226
232
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
227
233
|
"thead",
|
|
228
234
|
{
|
|
229
235
|
"data-slot": "table-header",
|
|
236
|
+
"data-placement": headerPlacement,
|
|
230
237
|
className: utils_cn.cn(
|
|
231
238
|
variant === "default" && "[&>tr]:h-table-header [&>tr]:border-b [&>tr]:border-border [&>tr]:bg-card",
|
|
239
|
+
inside && insideHeaderStyles,
|
|
232
240
|
className
|
|
233
241
|
),
|
|
234
242
|
...props
|
|
@@ -266,6 +274,8 @@ const tableBodyStyles = [
|
|
|
266
274
|
"[&>tr:first-child>td:first-child]:rounded-tl-lg",
|
|
267
275
|
"[&>tr:first-child>td:last-child]:rounded-tr-lg",
|
|
268
276
|
"[&>tr:first-child_[data-row-target]]:after:rounded-t-lg",
|
|
277
|
+
"[thead[data-placement=inside]+&>tr:first-child>td]:rounded-none",
|
|
278
|
+
"[thead[data-placement=inside]+&>tr:first-child_[data-row-target]]:after:rounded-none",
|
|
269
279
|
"[&>tr:last-child_[data-row-target]]:after:rounded-b-lg",
|
|
270
280
|
"[&_:is(a,button,input,select,textarea):not([data-row-target])]:relative",
|
|
271
281
|
"[&_:is(a,button,input,select,textarea):not([data-row-target])]:z-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":"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"}
|
|
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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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const dataListTop = require('./data-list-top-ByT2Mo77.cjs');
|
|
4
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
const React = require('react');
|
|
6
|
+
const hooks_useFluidHover = require('./hooks/use-fluid-hover.cjs.js');
|
|
7
|
+
const utils_cn = require('./cn-DlOJCxrS.cjs');
|
|
8
|
+
const dataListSpacer = require('./data-list-spacer-tQaBaum4.cjs');
|
|
9
|
+
const lucideReact = require('lucide-react');
|
|
10
|
+
const Button = require('./Button-DH1aTzbs.cjs');
|
|
11
|
+
const Txt = require('./Txt-CIS2G5Jx.cjs');
|
|
12
|
+
|
|
13
|
+
const DataListGroup = React.forwardRef(({ className, ...rest }, ref) => {
|
|
14
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
15
|
+
"section",
|
|
16
|
+
{
|
|
17
|
+
ref,
|
|
18
|
+
...{ [hooks_useFluidHover.GROUP_ATTR]: "" },
|
|
19
|
+
className: utils_cn.cn("col-span-full grid grid-cols-subgrid gap-y-px [&>:not(.data-list-row)]:col-span-full", className),
|
|
20
|
+
...rest
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
DataListGroup.displayName = "DataListGroup";
|
|
25
|
+
|
|
26
|
+
function DataListPagination({ currentPage, hasMore, onNextPage, onPrevPage }) {
|
|
27
|
+
const showNavigation = typeof currentPage === "number" && currentPage > 0 || hasMore;
|
|
28
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "col-span-full flex items-center justify-center gap-4 py-3 text-body text-muted-foreground", children: [
|
|
29
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
30
|
+
"Page ",
|
|
31
|
+
/* @__PURE__ */ jsxRuntime.jsx("b", { children: currentPage ? currentPage + 1 : "1" })
|
|
32
|
+
] }),
|
|
33
|
+
showNavigation && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-4", children: [
|
|
34
|
+
typeof currentPage === "number" && currentPage > 0 && /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { type: "button", size: "sm", onClick: onPrevPage, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowLeftIcon, {}), children: "Previous" }),
|
|
35
|
+
hasMore && /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { type: "button", size: "sm", onClick: onNextPage, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRightIcon, {}), children: "Next" })
|
|
36
|
+
] })
|
|
37
|
+
] });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const DataListRowStatic = React.forwardRef(
|
|
41
|
+
({ children, className, colStart, colEnd, featured, variant, style, ...rest }, ref) => {
|
|
42
|
+
const isWrapped = dataListSpacer.useDataListRowWrapperContext();
|
|
43
|
+
const hasColumnOverride = colStart !== void 0 || colEnd !== void 0;
|
|
44
|
+
const cellsClass = hasColumnOverride ? void 0 : "data-list-cells";
|
|
45
|
+
const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;
|
|
46
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
ref,
|
|
50
|
+
className: utils_cn.cn(isWrapped ? "grid grid-cols-subgrid gap-4 px-3" : dataListTop.dataListRowStaticStyles, cellsClass, className),
|
|
51
|
+
style: resolvedStyle,
|
|
52
|
+
"data-featured": featured || void 0,
|
|
53
|
+
"data-variant": variant ?? "default",
|
|
54
|
+
...rest,
|
|
55
|
+
children
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
DataListRowStatic.displayName = "DataListRowStatic";
|
|
61
|
+
|
|
62
|
+
const DataListSubheader = React.forwardRef(
|
|
63
|
+
({ children, className, ...rest }, ref) => {
|
|
64
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
65
|
+
"div",
|
|
66
|
+
{
|
|
67
|
+
ref,
|
|
68
|
+
className: utils_cn.cn(
|
|
69
|
+
"data-list-subheader relative isolate col-span-full px-3 py-2 text-subheading text-muted-foreground",
|
|
70
|
+
"bg-(--data-list-background)",
|
|
71
|
+
className
|
|
72
|
+
),
|
|
73
|
+
...rest,
|
|
74
|
+
children
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
DataListSubheader.displayName = "DataListSubheader";
|
|
80
|
+
|
|
81
|
+
function DataListSubHeading({ children, className }) {
|
|
82
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Txt.Txt, { as: "span", variant: "caption", tone: "faint", className, children });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const DataListTopCells = React.forwardRef(
|
|
86
|
+
({ children, className, flushLeft, colStart, style, ...rest }, ref) => {
|
|
87
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
88
|
+
"div",
|
|
89
|
+
{
|
|
90
|
+
ref,
|
|
91
|
+
className: utils_cn.cn(
|
|
92
|
+
"pointer-events-none grid grid-cols-subgrid gap-4 px-3 [&>*]:pointer-events-auto",
|
|
93
|
+
!colStart && "data-list-cells col-span-full",
|
|
94
|
+
flushLeft && "pl-0!",
|
|
95
|
+
className
|
|
96
|
+
),
|
|
97
|
+
style: colStart ? { ...style, gridColumn: `${colStart} / -1` } : style,
|
|
98
|
+
...rest,
|
|
99
|
+
children
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
DataListTopCells.displayName = "DataListTopCells";
|
|
105
|
+
|
|
106
|
+
const DataList = Object.assign(dataListTop.DataListRoot, {
|
|
107
|
+
Top: dataListTop.DataListTop,
|
|
108
|
+
TopCells: DataListTopCells,
|
|
109
|
+
TopCell: dataListTop.DataListTopCell,
|
|
110
|
+
SortableTopCell: dataListSpacer.DataListSortableTopCell,
|
|
111
|
+
TopCellWithTooltip: dataListTop.DataListTopCellWithTooltip,
|
|
112
|
+
TopCellSmart: dataListTop.DataListTopCellSmart,
|
|
113
|
+
RowWrapper: dataListSpacer.DataListRowWrapper,
|
|
114
|
+
RowButton: dataListSpacer.DataListRowButton,
|
|
115
|
+
RowLink: dataListSpacer.DataListRowLink,
|
|
116
|
+
RowStatic: DataListRowStatic,
|
|
117
|
+
Cell: dataListTop.DataListCell,
|
|
118
|
+
ActionsCell: dataListTop.DataListActionsCell,
|
|
119
|
+
TextCell: dataListTop.DataListTextCell,
|
|
120
|
+
NameCell: dataListTop.DataListNameCell,
|
|
121
|
+
DescriptionCell: dataListTop.DataListDescriptionCell,
|
|
122
|
+
IdCell: dataListTop.DataListIdCell,
|
|
123
|
+
RowHeaderCell: dataListTop.DataListRowHeaderCell,
|
|
124
|
+
NumberCell: dataListTop.DataListNumberCell,
|
|
125
|
+
DateCell: dataListTop.DataListDateCell,
|
|
126
|
+
CreatedCell: dataListTop.DataListCreatedCell,
|
|
127
|
+
TimeCell: dataListTop.DataListTimeCell,
|
|
128
|
+
SelectCell: dataListTop.DataListSelectCell,
|
|
129
|
+
TopSelectCell: dataListTop.DataListTopSelectCell,
|
|
130
|
+
NoMatch: dataListSpacer.DataListNoMatch,
|
|
131
|
+
Group: DataListGroup,
|
|
132
|
+
Subheader: DataListSubheader,
|
|
133
|
+
SubHeading: DataListSubHeading,
|
|
134
|
+
Spacer: dataListSpacer.DataListSpacer,
|
|
135
|
+
NextPageLoading: dataListSpacer.DataListNextPageLoading,
|
|
136
|
+
Pagination: DataListPagination
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
exports.DataList = DataList;
|
|
140
|
+
exports.DataListSubHeading = DataListSubHeading;
|
|
141
|
+
exports.DataListSubheader = DataListSubheader;
|
|
142
|
+
//# sourceMappingURL=data-list-DUfXIhyC.cjs.map
|