@exxatdesignux/ui 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +8 -6
  3. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +2 -1
  4. package/consumer-extras/cursor-rules/exxat-hub-supported-views.mdc +54 -0
  5. package/consumer-extras/cursor-rules/exxat-nav-single-active.mdc +31 -0
  6. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +8 -3
  7. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +15 -5
  8. package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +11 -4
  9. package/consumer-extras/handbook/HANDBOOK.md +1 -1
  10. package/consumer-extras/handbook/reference-implementations.md +2 -2
  11. package/consumer-extras/patterns/data-views-pattern.md +6 -0
  12. package/consumer-extras/patterns/hub-supported-views-pattern.md +53 -0
  13. package/dist/components/data-table/filter-text-value-input.js +1 -1
  14. package/dist/components/data-table/filter-text-value-input.js.map +1 -1
  15. package/dist/components/data-table/index.js +16 -12
  16. package/dist/components/data-table/index.js.map +1 -1
  17. package/dist/components/data-table/pagination.js +16 -12
  18. package/dist/components/data-table/pagination.js.map +1 -1
  19. package/dist/components/data-views/data-row-list.js +1 -1
  20. package/dist/components/data-views/data-row-list.js.map +1 -1
  21. package/dist/components/data-views/hub-table.d.ts +8 -4
  22. package/dist/components/data-views/hub-table.js +31 -16
  23. package/dist/components/data-views/hub-table.js.map +1 -1
  24. package/dist/components/data-views/index.d.ts +1 -1
  25. package/dist/components/data-views/index.js +31 -16
  26. package/dist/components/data-views/index.js.map +1 -1
  27. package/dist/components/data-views/list-page-connected-view-body.d.ts +1 -1
  28. package/dist/components/data-views/list-page-connected-view-body.js +1 -0
  29. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -1
  30. package/dist/components/table-properties/column-row.js +1 -1
  31. package/dist/components/table-properties/column-row.js.map +1 -1
  32. package/dist/components/table-properties/drawer-button.js +6 -5
  33. package/dist/components/table-properties/drawer-button.js.map +1 -1
  34. package/dist/components/table-properties/drawer.js +6 -5
  35. package/dist/components/table-properties/drawer.js.map +1 -1
  36. package/dist/components/table-properties/filter-card.js +2 -2
  37. package/dist/components/table-properties/filter-card.js.map +1 -1
  38. package/dist/components/table-properties/index.d.ts +1 -1
  39. package/dist/components/table-properties/index.js +6 -5
  40. package/dist/components/table-properties/index.js.map +1 -1
  41. package/dist/components/table-properties/sort-card.js +1 -1
  42. package/dist/components/table-properties/sort-card.js.map +1 -1
  43. package/dist/components/templates/index.d.ts +1 -1
  44. package/dist/components/templates/index.js +16 -6
  45. package/dist/components/templates/index.js.map +1 -1
  46. package/dist/components/templates/list-page.d.ts +4 -2
  47. package/dist/components/templates/list-page.js +16 -6
  48. package/dist/components/templates/list-page.js.map +1 -1
  49. package/dist/components/ui/banner.d.ts +2 -2
  50. package/dist/components/ui/banner.js +1 -1
  51. package/dist/components/ui/banner.js.map +1 -1
  52. package/dist/components/ui/coach-mark.js +1 -1
  53. package/dist/components/ui/coach-mark.js.map +1 -1
  54. package/dist/components/ui/context-menu.js +1 -1
  55. package/dist/components/ui/context-menu.js.map +1 -1
  56. package/dist/components/ui/date-picker-field.js +1 -1
  57. package/dist/components/ui/date-picker-field.js.map +1 -1
  58. package/dist/components/ui/dropdown-menu.js +2 -2
  59. package/dist/components/ui/dropdown-menu.js.map +1 -1
  60. package/dist/components/ui/export-drawer.js +3 -3
  61. package/dist/components/ui/export-drawer.js.map +1 -1
  62. package/dist/components/ui/hover-card.js +1 -1
  63. package/dist/components/ui/hover-card.js.map +1 -1
  64. package/dist/components/ui/key-metrics.js +6 -6
  65. package/dist/components/ui/key-metrics.js.map +1 -1
  66. package/dist/components/ui/page-header.js +1 -1
  67. package/dist/components/ui/page-header.js.map +1 -1
  68. package/dist/components/ui/popover.js +1 -1
  69. package/dist/components/ui/popover.js.map +1 -1
  70. package/dist/components/ui/select.js +1 -1
  71. package/dist/components/ui/select.js.map +1 -1
  72. package/dist/components/ui/sheet.js +1 -1
  73. package/dist/components/ui/sheet.js.map +1 -1
  74. package/dist/components/ui/sidebar.d.ts +1 -1
  75. package/dist/components/ui/sidebar.js +3 -3
  76. package/dist/components/ui/sidebar.js.map +1 -1
  77. package/dist/components/ui/tip.js +1 -1
  78. package/dist/components/ui/tip.js.map +1 -1
  79. package/dist/components/ui/tooltip.js +1 -1
  80. package/dist/components/ui/tooltip.js.map +1 -1
  81. package/dist/components/ui/view-segmented-control.js +1 -1
  82. package/dist/components/ui/view-segmented-control.js.map +1 -1
  83. package/dist/{data-list-view-registry-CyBoBML4.d.ts → data-list-view-registry-BstmlfQ3.d.ts} +16 -1
  84. package/dist/index.d.ts +2 -1
  85. package/dist/index.js +151 -29
  86. package/dist/index.js.map +1 -1
  87. package/dist/lib/data-list-view-registry.d.ts +1 -1
  88. package/dist/lib/data-list-view-registry.js +17 -1
  89. package/dist/lib/data-list-view-registry.js.map +1 -1
  90. package/dist/lib/data-list-view-surface.d.ts +1 -1
  91. package/dist/lib/data-list-view-surface.js +1 -0
  92. package/dist/lib/data-list-view-surface.js.map +1 -1
  93. package/dist/lib/list-page-table-properties.d.ts +1 -1
  94. package/dist/lib/list-page-table-properties.js +1 -0
  95. package/dist/lib/list-page-table-properties.js.map +1 -1
  96. package/dist/lib/nav-active.d.ts +38 -0
  97. package/dist/lib/nav-active.js +104 -0
  98. package/dist/lib/nav-active.js.map +1 -0
  99. package/package.json +1 -1
  100. package/src/components/data-table/index.tsx +25 -17
  101. package/src/components/data-views/data-row-list.tsx +1 -1
  102. package/src/components/data-views/hub-table.tsx +9 -3
  103. package/src/components/templates/list-page.tsx +9 -3
  104. package/src/components/ui/banner.tsx +0 -2
  105. package/src/components/ui/coach-mark.tsx +1 -2
  106. package/src/components/ui/context-menu.tsx +1 -1
  107. package/src/components/ui/dropdown-menu.tsx +2 -2
  108. package/src/components/ui/hover-card.tsx +1 -1
  109. package/src/components/ui/key-metrics.tsx +4 -4
  110. package/src/components/ui/popover.tsx +1 -1
  111. package/src/components/ui/select.tsx +1 -1
  112. package/src/components/ui/sheet.tsx +1 -1
  113. package/src/components/ui/sidebar.tsx +3 -3
  114. package/src/components/ui/tooltip.tsx +1 -1
  115. package/src/index.ts +1 -0
  116. package/src/lib/data-list-view-registry.ts +31 -0
  117. package/src/lib/nav-active.ts +162 -0
  118. package/template/.claude/skills/exxat-ds-skill/SKILL.md +2 -1
  119. package/template/AGENTS.md +16 -1
  120. package/template/components/columns-client.tsx +3 -2
  121. package/template/components/columns-showcase.tsx +22 -18
  122. package/template/components/exxat-product-logo.tsx +1 -1
  123. package/template/components/library-table.tsx +62 -23
  124. package/template/components/new-library-item-form.tsx +0 -7
  125. package/template/components/product-wordmark.tsx +1 -1
  126. package/template/components/sidebar/app-sidebar.tsx +14 -106
  127. package/template/components/sidebar/secondary-nav.tsx +22 -4
  128. package/template/components/tokens-hub-auxiliary-views.tsx +301 -0
  129. package/template/components/tokens-themes-client.tsx +44 -16
  130. package/template/docs/HANDBOOK.md +1 -1
  131. package/template/docs/data-views-pattern.md +6 -0
  132. package/template/docs/glossary.md +2 -1
  133. package/template/docs/hub-supported-views-pattern.md +53 -0
  134. package/template/docs/reference-implementations.md +2 -2
  135. package/template/lib/full-hub-supported-views.ts +8 -0
  136. package/template/lib/library-supported-views.ts +5 -12
  137. package/template/package.json +11 -0
  138. package/tokens/hooks-index.json +2 -2
@@ -90,7 +90,7 @@ function DataRowListVirtualized({
90
90
  {
91
91
  "data-index": vr.index,
92
92
  ref: virtualizer.measureElement,
93
- className: cn("absolute left-0 top-0 w-full pb-2", rowClassName),
93
+ className: cn("absolute start-0 top-0 w-full pb-2", rowClassName),
94
94
  style: { transform: `translateY(${vr.start}px)` },
95
95
  children: renderRow(row, vr.index)
96
96
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/data-views/data-row-list.tsx"],"names":[],"mappings":"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","file":"data-row-list.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\n/**\n * DataRowList — generic vertical-stack list view used by every hub's \"list\"\n * tab (placements, team, compliance, sites, library, …). Replaces the\n * hand-rolled `<ul …flex-col gap-2 px-4 pb-8 pt-2 lg:px-6> {rows.map(<li>…)}`\n * shell that was duplicated across `*-list-view.tsx` files.\n *\n * Composition over inheritance: callers provide a `renderRow(row)` that\n * returns whatever ListPageBoardCard / link / chip-stack they need — this\n * component owns the chrome (spacing, empty state, virtualization), not the\n * row body.\n *\n * Auto-virtualises with `@tanstack/react-virtual` when the row count meets\n * `virtualizeThreshold` (default 100). Disable by passing `0`.\n */\n\nimport * as React from \"react\"\nimport { useWindowVirtualizer } from \"@tanstack/react-virtual\"\nimport { cn } from \"../../lib/utils\"\n\nconst DEFAULT_VIRTUALIZE_THRESHOLD = 100\nconst DEFAULT_ESTIMATED_ROW_HEIGHT = 96\nconst DEFAULT_OVERSCAN = 8\n\nexport interface DataRowListProps<TRow> {\n /** The filtered/sorted rows from `tableState.rows` (or wherever). */\n rows: readonly TRow[]\n /** Stable id used as the React `key` and (for virtualizer) the v-key. */\n getRowId: (row: TRow, index: number) => string | number\n /** Render the body of one row. Wrap with `<ListPageBoardCard layout=\"row\">` etc. */\n renderRow: (row: TRow, index: number) => React.ReactNode\n /**\n * Shown when `rows.length === 0`. Strings render as muted body copy; pass\n * a `ReactNode` for richer empty states (illustration, CTA, etc.).\n */\n emptyState?: React.ReactNode\n /**\n * Auto-virtualise when `rows.length >= virtualizeThreshold`. Default 100.\n * Pass `0` to never virtualise (preserves predictable layout for short\n * lists like dashboards / pinned tabs).\n */\n virtualizeThreshold?: number\n /** Hint for the virtualizer; clamps to measured size after first paint. */\n estimatedRowHeight?: number\n /** Override the default container padding / gap if needed. */\n className?: string\n /** Override the per-row `<li>` className (e.g. tighter spacing). */\n rowClassName?: string\n /** `aria-label` for the `<ul>` (screen-reader name for the list). */\n ariaLabel?: string\n}\n\nconst DEFAULT_OUTER_CLASS = \"flex list-none flex-col gap-2 px-4 pb-8 pt-2 lg:px-6\"\n\nexport function DataRowList<TRow>(props: DataRowListProps<TRow>) {\n const {\n rows,\n getRowId,\n renderRow,\n emptyState,\n virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD,\n estimatedRowHeight = DEFAULT_ESTIMATED_ROW_HEIGHT,\n className,\n rowClassName,\n ariaLabel,\n } = props\n\n if (rows.length === 0) {\n if (emptyState == null) return null\n if (typeof emptyState === \"string\") {\n return (\n <div className=\"px-4 py-16 text-center lg:px-6\">\n <p className=\"text-sm text-muted-foreground\">{emptyState}</p>\n </div>\n )\n }\n return <div className=\"px-4 py-16 text-center lg:px-6\">{emptyState}</div>\n }\n\n if (virtualizeThreshold > 0 && rows.length >= virtualizeThreshold) {\n return (\n <DataRowListVirtualized\n rows={rows}\n getRowId={getRowId}\n renderRow={renderRow}\n estimatedRowHeight={estimatedRowHeight}\n className={className}\n rowClassName={rowClassName}\n ariaLabel={ariaLabel}\n />\n )\n }\n\n return (\n <ul aria-label={ariaLabel} className={cn(DEFAULT_OUTER_CLASS, className)}>\n {rows.map((row, i) => (\n <li key={getRowId(row, i)} className={rowClassName}>\n {renderRow(row, i)}\n </li>\n ))}\n </ul>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Virtualised variant — keeps the DOM short on long lists (e.g. 1000+ rows).\n// Uses `useWindowVirtualizer` so the page scroll drives row recycling; this\n// is the right tool for hub-level lists (not nested-scroll containers).\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction DataRowListVirtualized<TRow>({\n rows,\n getRowId,\n renderRow,\n estimatedRowHeight,\n className,\n rowClassName,\n ariaLabel,\n}: {\n rows: readonly TRow[]\n getRowId: (row: TRow, index: number) => string | number\n renderRow: (row: TRow, index: number) => React.ReactNode\n estimatedRowHeight: number\n className?: string\n rowClassName?: string\n ariaLabel?: string\n}) {\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n // `scrollMargin` is read by the virtualizer during render, so it has to\n // be state (not a ref). We measure with `useLayoutEffect` after the first\n // paint and on resize so window-scroll math stays accurate when the page\n // layout shifts (sidebar collapse, banner, etc.).\n const [scrollMargin, setScrollMargin] = React.useState(0)\n\n const updateScrollMargin = React.useCallback(() => {\n const el = anchorRef.current\n if (!el) return\n setScrollMargin(el.getBoundingClientRect().top + window.scrollY)\n }, [])\n\n React.useLayoutEffect(() => {\n updateScrollMargin()\n window.addEventListener(\"resize\", updateScrollMargin)\n return () => window.removeEventListener(\"resize\", updateScrollMargin)\n }, [updateScrollMargin, rows.length])\n\n const virtualizer = useWindowVirtualizer({\n count: rows.length,\n estimateSize: () => estimatedRowHeight,\n overscan: DEFAULT_OVERSCAN,\n scrollMargin,\n getItemKey: i => String(getRowId(rows[i], i)),\n })\n\n const totalSize = virtualizer.getTotalSize()\n\n return (\n <div ref={anchorRef} className={cn(\"px-4 pb-8 pt-2 lg:px-6\", className)}>\n <ul\n aria-label={ariaLabel}\n className=\"relative m-0 w-full list-none p-0\"\n style={{ height: `${totalSize}px` }}\n >\n {virtualizer.getVirtualItems().map(vr => {\n const row = rows[vr.index]\n if (!row) return null\n return (\n <li\n key={vr.key}\n data-index={vr.index}\n ref={virtualizer.measureElement}\n className={cn(\"absolute left-0 top-0 w-full pb-2\", rowClassName)}\n style={{ transform: `translateY(${vr.start}px)` }}\n >\n {renderRow(row, vr.index)}\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/data-views/data-row-list.tsx"],"names":[],"mappings":"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","file":"data-row-list.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","\"use client\"\n\n/**\n * DataRowList — generic vertical-stack list view used by every hub's \"list\"\n * tab (placements, team, compliance, sites, library, …). Replaces the\n * hand-rolled `<ul …flex-col gap-2 px-4 pb-8 pt-2 lg:px-6> {rows.map(<li>…)}`\n * shell that was duplicated across `*-list-view.tsx` files.\n *\n * Composition over inheritance: callers provide a `renderRow(row)` that\n * returns whatever ListPageBoardCard / link / chip-stack they need — this\n * component owns the chrome (spacing, empty state, virtualization), not the\n * row body.\n *\n * Auto-virtualises with `@tanstack/react-virtual` when the row count meets\n * `virtualizeThreshold` (default 100). Disable by passing `0`.\n */\n\nimport * as React from \"react\"\nimport { useWindowVirtualizer } from \"@tanstack/react-virtual\"\nimport { cn } from \"../../lib/utils\"\n\nconst DEFAULT_VIRTUALIZE_THRESHOLD = 100\nconst DEFAULT_ESTIMATED_ROW_HEIGHT = 96\nconst DEFAULT_OVERSCAN = 8\n\nexport interface DataRowListProps<TRow> {\n /** The filtered/sorted rows from `tableState.rows` (or wherever). */\n rows: readonly TRow[]\n /** Stable id used as the React `key` and (for virtualizer) the v-key. */\n getRowId: (row: TRow, index: number) => string | number\n /** Render the body of one row. Wrap with `<ListPageBoardCard layout=\"row\">` etc. */\n renderRow: (row: TRow, index: number) => React.ReactNode\n /**\n * Shown when `rows.length === 0`. Strings render as muted body copy; pass\n * a `ReactNode` for richer empty states (illustration, CTA, etc.).\n */\n emptyState?: React.ReactNode\n /**\n * Auto-virtualise when `rows.length >= virtualizeThreshold`. Default 100.\n * Pass `0` to never virtualise (preserves predictable layout for short\n * lists like dashboards / pinned tabs).\n */\n virtualizeThreshold?: number\n /** Hint for the virtualizer; clamps to measured size after first paint. */\n estimatedRowHeight?: number\n /** Override the default container padding / gap if needed. */\n className?: string\n /** Override the per-row `<li>` className (e.g. tighter spacing). */\n rowClassName?: string\n /** `aria-label` for the `<ul>` (screen-reader name for the list). */\n ariaLabel?: string\n}\n\nconst DEFAULT_OUTER_CLASS = \"flex list-none flex-col gap-2 px-4 pb-8 pt-2 lg:px-6\"\n\nexport function DataRowList<TRow>(props: DataRowListProps<TRow>) {\n const {\n rows,\n getRowId,\n renderRow,\n emptyState,\n virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD,\n estimatedRowHeight = DEFAULT_ESTIMATED_ROW_HEIGHT,\n className,\n rowClassName,\n ariaLabel,\n } = props\n\n if (rows.length === 0) {\n if (emptyState == null) return null\n if (typeof emptyState === \"string\") {\n return (\n <div className=\"px-4 py-16 text-center lg:px-6\">\n <p className=\"text-sm text-muted-foreground\">{emptyState}</p>\n </div>\n )\n }\n return <div className=\"px-4 py-16 text-center lg:px-6\">{emptyState}</div>\n }\n\n if (virtualizeThreshold > 0 && rows.length >= virtualizeThreshold) {\n return (\n <DataRowListVirtualized\n rows={rows}\n getRowId={getRowId}\n renderRow={renderRow}\n estimatedRowHeight={estimatedRowHeight}\n className={className}\n rowClassName={rowClassName}\n ariaLabel={ariaLabel}\n />\n )\n }\n\n return (\n <ul aria-label={ariaLabel} className={cn(DEFAULT_OUTER_CLASS, className)}>\n {rows.map((row, i) => (\n <li key={getRowId(row, i)} className={rowClassName}>\n {renderRow(row, i)}\n </li>\n ))}\n </ul>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Virtualised variant — keeps the DOM short on long lists (e.g. 1000+ rows).\n// Uses `useWindowVirtualizer` so the page scroll drives row recycling; this\n// is the right tool for hub-level lists (not nested-scroll containers).\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction DataRowListVirtualized<TRow>({\n rows,\n getRowId,\n renderRow,\n estimatedRowHeight,\n className,\n rowClassName,\n ariaLabel,\n}: {\n rows: readonly TRow[]\n getRowId: (row: TRow, index: number) => string | number\n renderRow: (row: TRow, index: number) => React.ReactNode\n estimatedRowHeight: number\n className?: string\n rowClassName?: string\n ariaLabel?: string\n}) {\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n // `scrollMargin` is read by the virtualizer during render, so it has to\n // be state (not a ref). We measure with `useLayoutEffect` after the first\n // paint and on resize so window-scroll math stays accurate when the page\n // layout shifts (sidebar collapse, banner, etc.).\n const [scrollMargin, setScrollMargin] = React.useState(0)\n\n const updateScrollMargin = React.useCallback(() => {\n const el = anchorRef.current\n if (!el) return\n setScrollMargin(el.getBoundingClientRect().top + window.scrollY)\n }, [])\n\n React.useLayoutEffect(() => {\n updateScrollMargin()\n window.addEventListener(\"resize\", updateScrollMargin)\n return () => window.removeEventListener(\"resize\", updateScrollMargin)\n }, [updateScrollMargin, rows.length])\n\n const virtualizer = useWindowVirtualizer({\n count: rows.length,\n estimateSize: () => estimatedRowHeight,\n overscan: DEFAULT_OVERSCAN,\n scrollMargin,\n getItemKey: i => String(getRowId(rows[i], i)),\n })\n\n const totalSize = virtualizer.getTotalSize()\n\n return (\n <div ref={anchorRef} className={cn(\"px-4 pb-8 pt-2 lg:px-6\", className)}>\n <ul\n aria-label={ariaLabel}\n className=\"relative m-0 w-full list-none p-0\"\n style={{ height: `${totalSize}px` }}\n >\n {virtualizer.getVirtualItems().map(vr => {\n const row = rows[vr.index]\n if (!row) return null\n return (\n <li\n key={vr.key}\n data-index={vr.index}\n ref={virtualizer.measureElement}\n className={cn(\"absolute start-0 top-0 w-full pb-2\", rowClassName)}\n style={{ transform: `translateY(${vr.start}px)` }}\n >\n {renderRow(row, vr.index)}\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n"]}
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import { ColumnDef } from '../data-table/types.js';
4
4
  import { useTableState } from '../data-table/use-table-state.js';
5
5
  import { DataListViewType } from '../../lib/data-list-view.js';
6
- import { c as DataListViewRenderKind } from '../../data-list-view-registry-CyBoBML4.js';
6
+ import { c as DataListViewRenderKind } from '../../data-list-view-registry-BstmlfQ3.js';
7
7
  import { DataListDisplayOptions } from '../../lib/data-list-display-options.js';
8
8
  import { FilterFieldDef, ConditionalRule } from '../../lib/table-properties-types.js';
9
9
  import { ListPageBoardColumnDef } from './list-page-board-template.js';
@@ -74,8 +74,12 @@ interface HubTableProps<TRow extends Record<string, unknown>> {
74
74
  /** Active view from the `ListPageTemplate` tab. */
75
75
  view: DataListViewType;
76
76
  onViewChange?: (v: DataListViewType) => void;
77
- /** Allowlist passed to `TablePropertiesDrawerButton` so Properties cannot offer unsupported views. */
78
- supportedViewTypes: readonly DataListViewType[];
77
+ /**
78
+ * Allowlist passed to `TablePropertiesDrawerButton` so Properties cannot offer unsupported views.
79
+ * Defaults to {@link FULL_HUB_SUPPORTED_VIEWS} when omitted — keep in sync with
80
+ * `ListPageTemplate.supportedViewTypes` on the same hub.
81
+ */
82
+ supportedViewTypes?: readonly DataListViewType[];
79
83
  /** Used by `ListPageViewNotConfigured` when a supported view has no renderer. */
80
84
  hubLabel: string;
81
85
  /** Shown below "Properties" in the drawer header. */
@@ -165,7 +169,7 @@ interface HubTableProps<TRow extends Record<string, unknown>> {
165
169
  /** Empty column copy for the default board renderer. Defaults to "No items". */
166
170
  boardEmptyColumnLabel?: string;
167
171
  }
168
- declare function HubTable<TRow extends Record<string, unknown>>({ rows, columns, view, onViewChange, supportedViewTypes, hubLabel, lifecycleTabLabel, searchAriaLabel, getRowId, getRowSelectionLabel, defaultSort, emptyState, renderers, bulkActionsSlot, boardGroupByColumnOptions, displayOptionsInit, renderFilterOptionValue, groupable, selectable, onRowClick, displayOptions: displayOptionsControlled, onDisplayOptionsChange: onDisplayOptionsChangeControlled, pagination, onPaginationChange, handleRef, tableRenderer, paginationOverride, paginationPageSizeOptions, paginationInitialPageSize, syncedSearchFromUrl, renderListRow, listAriaLabel, listEmptyState, listVirtualizeThreshold, listEstimatedRowHeight, renderBoardCard, boardGroups, boardColumnCountBadgeClassName, boardEmptyColumnLabel, }: HubTableProps<TRow>): react_jsx_runtime.JSX.Element;
172
+ declare function HubTable<TRow extends Record<string, unknown>>({ rows, columns, view, onViewChange, supportedViewTypes: supportedViewTypesProp, hubLabel, lifecycleTabLabel, searchAriaLabel, getRowId, getRowSelectionLabel, defaultSort, emptyState, renderers, bulkActionsSlot, boardGroupByColumnOptions, displayOptionsInit, renderFilterOptionValue, groupable, selectable, onRowClick, displayOptions: displayOptionsControlled, onDisplayOptionsChange: onDisplayOptionsChangeControlled, pagination, onPaginationChange, handleRef, tableRenderer, paginationOverride, paginationPageSizeOptions, paginationInitialPageSize, syncedSearchFromUrl, renderListRow, listAriaLabel, listEmptyState, listVirtualizeThreshold, listEstimatedRowHeight, renderBoardCard, boardGroups, boardColumnCountBadgeClassName, boardEmptyColumnLabel, }: HubTableProps<TRow>): react_jsx_runtime.JSX.Element;
169
173
  declare namespace HubTable {
170
174
  var displayName: string;
171
175
  }
@@ -177,7 +177,7 @@ function TooltipContent({
177
177
  "data-slot": "tooltip-content",
178
178
  sideOffset,
179
179
  className: cn(
180
- "z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
180
+ "z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
181
181
  className
182
182
  ),
183
183
  ...props,
@@ -373,7 +373,7 @@ function DropdownMenuContent({
373
373
  sideOffset,
374
374
  align,
375
375
  className: cn(
376
- "z-50 max-h-(--radix-dropdown-menu-content-available-height) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
376
+ "z-50 max-h-(--radix-dropdown-menu-content-available-height) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
377
377
  DROPDOWN_MENU_CONTENT_SURFACE_CLASS,
378
378
  className
379
379
  ),
@@ -483,7 +483,7 @@ function PopoverContent({
483
483
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
484
484
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
485
485
  "data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",
486
- "data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2",
486
+ "data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2",
487
487
  className
488
488
  ),
489
489
  ...props
@@ -2282,13 +2282,15 @@ function useBulkBarFixedToTableScrollEl(scrollRef, active, fullWidth) {
2282
2282
  const scheduled = rafThrottle(apply);
2283
2283
  const ro = new ResizeObserver(scheduled);
2284
2284
  ro.observe(el);
2285
+ el.addEventListener("scroll", scheduled, { passive: true });
2285
2286
  window.addEventListener("resize", scheduled, { passive: true });
2286
- window.addEventListener("scroll", scheduled, { passive: true, capture: true });
2287
+ window.addEventListener("scroll", scheduled, { passive: true });
2287
2288
  return () => {
2288
2289
  scheduled.cancel();
2289
2290
  ro.disconnect();
2291
+ el.removeEventListener("scroll", scheduled);
2290
2292
  window.removeEventListener("resize", scheduled);
2291
- window.removeEventListener("scroll", scheduled, { capture: true });
2293
+ window.removeEventListener("scroll", scheduled);
2292
2294
  };
2293
2295
  }, [active, fullWidth, scrollRef]);
2294
2296
  return style;
@@ -2455,11 +2457,13 @@ function DataTableInner({
2455
2457
  };
2456
2458
  update();
2457
2459
  const scheduled = rafThrottle(update);
2458
- window.addEventListener("scroll", scheduled, { passive: true, capture: true });
2460
+ wrapEl.addEventListener("scroll", scheduled, { passive: true });
2461
+ window.addEventListener("scroll", scheduled, { passive: true });
2459
2462
  window.addEventListener("resize", scheduled, { passive: true });
2460
2463
  return () => {
2461
2464
  scheduled.cancel();
2462
- window.removeEventListener("scroll", scheduled, { capture: true });
2465
+ wrapEl.removeEventListener("scroll", scheduled);
2466
+ window.removeEventListener("scroll", scheduled);
2463
2467
  window.removeEventListener("resize", scheduled);
2464
2468
  };
2465
2469
  }, [showColumnHeaders, rows.length, displayCols.length]);
@@ -2896,11 +2900,11 @@ function DataTableInner({
2896
2900
  const rowPy = rowHeight === "compact" ? "py-1" : rowHeight === "comfortable" ? "py-4" : "py-2.5";
2897
2901
  const cs = cellStyle(col.key);
2898
2902
  const tdBase = cn(
2899
- `px-3 ${rowPy} align-middle`,
2903
+ `px-3 ${rowPy} align-middle max-w-0`,
2900
2904
  showGridlines && !isEdgePin && "border-e border-border last:border-e-0",
2901
2905
  "border-b border-border group-last/row:border-b-0",
2902
2906
  isPinned && [
2903
- "z-20 pinned-cell",
2907
+ "z-20 pinned-cell relative",
2904
2908
  "bg-dt-row-bg",
2905
2909
  "group-data-[state=selected]/row:bg-dt-row-selected",
2906
2910
  "group-hover/row:bg-dt-row-hover",
@@ -2950,17 +2954,17 @@ function DataTableInner({
2950
2954
  wrap && "[&_.truncate]:!whitespace-normal [&_.truncate]:!overflow-visible [&_.truncate]:!text-clip"
2951
2955
  ),
2952
2956
  style: tdStyle,
2953
- children: col.cell(row, {
2957
+ children: /* @__PURE__ */ jsx("div", { className: "min-w-0 overflow-hidden", children: col.cell(row, {
2954
2958
  rowIndex,
2955
2959
  selected: isSelected,
2956
2960
  onSelect: (checked) => checked ? setSelected((prev) => /* @__PURE__ */ new Set([...prev, rowId])) : toggleRow(rowId)
2957
- })
2961
+ }) })
2958
2962
  },
2959
2963
  col.key
2960
2964
  );
2961
2965
  }
2962
2966
  const rawVal = String(row[col.key] ?? "");
2963
- return /* @__PURE__ */ jsx("td", { className: cn(tdBase, "text-sm text-foreground/80"), style: tdStyle, children: /* @__PURE__ */ jsx("span", { className: wrap ? "whitespace-normal" : "block truncate", title: !wrap ? rawVal : void 0, children: rawVal }) }, col.key);
2967
+ return /* @__PURE__ */ jsx("td", { className: cn(tdBase, "text-sm text-foreground/80"), style: tdStyle, children: /* @__PURE__ */ jsx("div", { className: "min-w-0 overflow-hidden", children: /* @__PURE__ */ jsx("span", { className: wrap ? "whitespace-normal" : "block truncate", title: !wrap ? rawVal : void 0, children: rawVal }) }) }, col.key);
2964
2968
  })
2965
2969
  },
2966
2970
  String(rowId)
@@ -3288,6 +3292,16 @@ var BY_VALUE = new Map(
3288
3292
  DEFINITIONS.map((d) => [d.value, d])
3289
3293
  );
3290
3294
  var DATA_LIST_VIEW_REGISTRY = DEFINITIONS;
3295
+ var FULL_HUB_SUPPORTED_VIEWS = [
3296
+ "table",
3297
+ "list",
3298
+ "board",
3299
+ "dashboard",
3300
+ "folder",
3301
+ "panel",
3302
+ "tree-panel"
3303
+ ];
3304
+ DATA_LIST_VIEW_REGISTRY.map((d) => d.value);
3291
3305
  function dataListViewDefinition(view) {
3292
3306
  const def = BY_VALUE.get(view);
3293
3307
  if (!def) {
@@ -3682,7 +3696,7 @@ function SheetContent({
3682
3696
  "data-slot": "sheet-content",
3683
3697
  "data-side": side,
3684
3698
  className: cn(
3685
- "fixed z-50 flex flex-col gap-4 bg-background bg-clip-padding text-sm shadow-lg outline-none duration-300 ease-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-e data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-s data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-6 data-[side=left]:data-open:slide-in-from-left-6 data-[side=right]:data-open:slide-in-from-right-6 data-[side=top]:data-open:slide-in-from-top-6 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-6 data-[side=left]:data-closed:slide-out-to-left-6 data-[side=right]:data-closed:slide-out-to-right-6 data-[side=top]:data-closed:slide-out-to-top-6",
3699
+ "fixed z-50 flex flex-col gap-4 bg-background bg-clip-padding text-sm shadow-lg outline-none duration-300 ease-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:start-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-e data-[side=right]:inset-y-0 data-[side=right]:end-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-s data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-6 data-[side=left]:data-open:slide-in-from-start-6 data-[side=right]:data-open:slide-in-from-end-6 data-[side=top]:data-open:slide-in-from-top-6 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-6 data-[side=left]:data-closed:slide-out-to-start-6 data-[side=right]:data-closed:slide-out-to-end-6 data-[side=top]:data-closed:slide-out-to-top-6",
3686
3700
  className
3687
3701
  ),
3688
3702
  ...props,
@@ -3766,7 +3780,7 @@ function SelectContent({
3766
3780
  {
3767
3781
  "data-slot": "select-content",
3768
3782
  "data-align-trigger": position === "item-aligned",
3769
- className: cn("relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 rtl:data-[side=left]:translate-x-1 data-[side=right]:translate-x-1 rtl:data-[side=right]:-translate-x-1 data-[side=top]:-translate-y-1", className),
3783
+ className: cn("relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 rtl:data-[side=left]:translate-x-1 data-[side=right]:translate-x-1 rtl:data-[side=right]:-translate-x-1 data-[side=top]:-translate-y-1", className),
3770
3784
  position,
3771
3785
  align,
3772
3786
  ...props,
@@ -5308,7 +5322,7 @@ function DataRowListVirtualized({
5308
5322
  {
5309
5323
  "data-index": vr.index,
5310
5324
  ref: virtualizer.measureElement,
5311
- className: cn("absolute left-0 top-0 w-full pb-2", rowClassName),
5325
+ className: cn("absolute start-0 top-0 w-full pb-2", rowClassName),
5312
5326
  style: { transform: `translateY(${vr.start}px)` },
5313
5327
  children: renderRow(row, vr.index)
5314
5328
  },
@@ -5469,7 +5483,7 @@ function HubTable({
5469
5483
  columns,
5470
5484
  view,
5471
5485
  onViewChange,
5472
- supportedViewTypes,
5486
+ supportedViewTypes: supportedViewTypesProp,
5473
5487
  hubLabel,
5474
5488
  lifecycleTabLabel,
5475
5489
  searchAriaLabel,
@@ -5505,6 +5519,7 @@ function HubTable({
5505
5519
  boardColumnCountBadgeClassName,
5506
5520
  boardEmptyColumnLabel
5507
5521
  }) {
5522
+ const supportedViewTypes = supportedViewTypesProp ?? FULL_HUB_SUPPORTED_VIEWS;
5508
5523
  const filterFields = React10.useMemo(() => columnsToFilterFields(columns), [columns]);
5509
5524
  const fieldDefinitions = React10.useMemo(() => columnsToFieldDefinitions(columns), [columns]);
5510
5525
  const resolveColumnLabel = React10.useCallback(