@exxatdesignux/ui 0.3.0 → 0.4.1

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 (214) hide show
  1. package/CHANGELOG.md +701 -6
  2. package/README.md +138 -0
  3. package/bin/init.mjs +134 -31
  4. package/consumer-extras/cursor-rules/exxat-board-cards.mdc +1 -1
  5. package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +2 -2
  6. package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +1 -1
  7. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +2 -0
  8. package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +1 -1
  9. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +3 -3
  10. package/consumer-extras/cursor-rules/exxat-library-hub-header.mdc +28 -0
  11. package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +1 -1
  12. package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +1 -1
  13. package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +6 -6
  14. package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +1 -1
  15. package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +2 -2
  16. package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +1 -1
  17. package/consumer-extras/cursor-skills/exxat-collaboration-access/SKILL.md +3 -3
  18. package/consumer-extras/cursor-skills/exxat-dedicated-search-surfaces/SKILL.md +2 -2
  19. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +7 -7
  20. package/consumer-extras/cursor-skills/exxat-kpi-flat-band/SKILL.md +1 -1
  21. package/consumer-extras/cursor-skills/exxat-list-page-view-shells/SKILL.md +1 -1
  22. package/consumer-extras/cursor-skills/exxat-mono-ids/SKILL.md +4 -4
  23. package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +8 -8
  24. package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +277 -0
  25. package/consumer-extras/handbook/HANDBOOK.md +2 -0
  26. package/consumer-extras/handbook/glossary.md +2 -1
  27. package/consumer-extras/handbook/reference-implementations.md +31 -4
  28. package/consumer-extras/patterns/collaboration-access-pattern.md +7 -7
  29. package/consumer-extras/patterns/data-views-pattern.md +18 -16
  30. package/consumer-extras/patterns/kpi-flat-band-pattern.md +2 -2
  31. package/dist/components/data-table/index.js +2 -2
  32. package/dist/components/data-table/index.js.map +1 -1
  33. package/dist/components/data-table/pagination.js +3 -3
  34. package/dist/components/data-table/pagination.js.map +1 -1
  35. package/dist/components/data-table/use-table-state.d.ts +1 -1
  36. package/dist/components/data-table/use-table-state.js.map +1 -1
  37. package/dist/components/data-views/data-row-list.js.map +1 -1
  38. package/dist/components/data-views/finder-panel-view.d.ts +1 -1
  39. package/dist/components/data-views/finder-panel-view.js.map +1 -1
  40. package/dist/components/data-views/hub-table.d.ts +9 -3
  41. package/dist/components/data-views/hub-table.js +262 -40
  42. package/dist/components/data-views/hub-table.js.map +1 -1
  43. package/dist/components/data-views/index.js +262 -40
  44. package/dist/components/data-views/index.js.map +1 -1
  45. package/dist/components/data-views/list-page-split-hub-tokens.d.ts +2 -2
  46. package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -1
  47. package/dist/components/data-views/list-page-tree-column-header.d.ts +1 -1
  48. package/dist/components/data-views/list-page-tree-column-header.js.map +1 -1
  49. package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -1
  50. package/dist/components/data-views/os-folder-glyph.d.ts +1 -1
  51. package/dist/components/data-views/os-folder-glyph.js.map +1 -1
  52. package/dist/components/ui/avatar.d.ts +1 -1
  53. package/dist/components/ui/key-metrics.js.map +1 -1
  54. package/dist/index.js +136 -39
  55. package/dist/index.js.map +1 -1
  56. package/package.json +3 -2
  57. package/src/components/data-table/index.tsx +2 -2
  58. package/src/components/data-table/pagination.tsx +5 -1
  59. package/src/components/data-table/use-table-state.ts +1 -1
  60. package/src/components/data-views/data-row-list.tsx +1 -1
  61. package/src/components/data-views/finder-panel-view.tsx +2 -2
  62. package/src/components/data-views/hub-table.tsx +149 -41
  63. package/src/components/data-views/list-page-split-hub-tokens.ts +2 -2
  64. package/src/components/data-views/list-page-tree-column-header.tsx +1 -1
  65. package/src/components/data-views/os-folder-glyph.tsx +1 -1
  66. package/src/components/ui/key-metrics.tsx +1 -1
  67. package/template/.claude/skills/exxat-ds-skill/SKILL.md +8 -7
  68. package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
  69. package/template/.cursor/rules/exxat-command-menu.mdc +1 -1
  70. package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +6 -6
  71. package/template/.cursor/rules/exxat-data-tables.mdc +3 -3
  72. package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +5 -5
  73. package/template/.cursor/rules/exxat-mono-ids.mdc +1 -1
  74. package/template/.cursor/rules/exxat-page-vs-drawer.mdc +1 -1
  75. package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
  76. package/template/AGENTS.md +43 -37
  77. package/template/app/(app)/columns/page.tsx +11 -0
  78. package/template/app/(app)/library/all/page.tsx +11 -0
  79. package/template/app/(app)/library/find/page.tsx +12 -0
  80. package/template/app/(app)/{question-bank → library}/layout.tsx +16 -16
  81. package/template/app/(app)/library/list/page.tsx +12 -0
  82. package/template/app/(app)/{question-bank → library}/new/page.tsx +10 -10
  83. package/template/app/(app)/library/page.tsx +11 -0
  84. package/template/app/(app)/tokens-themes/page.tsx +11 -0
  85. package/template/components/ask-leo-composer.tsx +2 -2
  86. package/template/components/columns-client.tsx +158 -0
  87. package/template/components/columns-showcase.tsx +541 -0
  88. package/template/components/data-views/index.ts +32 -6
  89. package/template/components/data-views/{question-bank-folder-tree-branch.tsx → library-folder-tree-branch.tsx} +19 -19
  90. package/template/components/data-views/table-cells.tsx +673 -0
  91. package/template/components/folder-details-shell.tsx +11 -11
  92. package/template/components/hub-tree-panel-view.tsx +24 -24
  93. package/template/components/{question-bank-board-view.tsx → library-board-view.tsx} +44 -44
  94. package/template/components/{question-bank-client.tsx → library-client.tsx} +82 -82
  95. package/template/components/{question-bank-dashboard-charts.tsx → library-dashboard-charts.tsx} +14 -14
  96. package/template/components/{question-bank-favorite-button.tsx → library-favorite-button.tsx} +7 -7
  97. package/template/components/{question-bank-hub-client.tsx → library-hub-client.tsx} +43 -43
  98. package/template/components/{question-bank-new-folder-sheet.tsx → library-new-folder-sheet.tsx} +14 -14
  99. package/template/components/{question-bank-os-folder-view.tsx → library-os-folder-view.tsx} +31 -31
  100. package/template/components/{question-bank-page-header.tsx → library-page-header.tsx} +6 -6
  101. package/template/components/library-panel-activator.tsx +8 -0
  102. package/template/components/{question-bank-secondary-nav.tsx → library-secondary-nav.tsx} +60 -60
  103. package/template/components/{question-bank-table.tsx → library-table.tsx} +97 -97
  104. package/template/components/list-hub-status-badge.tsx +2 -2
  105. package/template/components/{new-question-composer.tsx → new-library-item-form.tsx} +37 -37
  106. package/template/components/sidebar/app-sidebar.tsx +61 -5
  107. package/template/components/sidebar/secondary-panel.tsx +109 -56
  108. package/template/components/sidebar/sidebar-auto-collapse.tsx +2 -2
  109. package/template/components/sidebar/sidebar-auto-open.tsx +2 -1
  110. package/template/components/table-properties/types.ts +1 -1
  111. package/template/components/templates/discovery-hub-template.tsx +1 -1
  112. package/template/components/templates/new-focus-template.tsx +2 -2
  113. package/template/components/templates/secondary-panel-hub-template.tsx +1 -1
  114. package/template/components/tokens-secondary-nav.tsx +192 -0
  115. package/template/components/tokens-themes-client.tsx +476 -0
  116. package/template/components/tokens-themes-section.tsx +386 -0
  117. package/template/docs/HANDBOOK.md +187 -0
  118. package/template/docs/blueprints/README.md +1 -1
  119. package/template/docs/blueprints/board-card.md +1 -1
  120. package/template/docs/blueprints/data-table.md +2 -2
  121. package/template/docs/blueprints/list-page-template.md +3 -3
  122. package/template/docs/blueprints/page-header.md +4 -4
  123. package/template/docs/collaboration-access-pattern.md +7 -7
  124. package/template/docs/component-selection-guide.md +1 -1
  125. package/template/docs/data-views-pattern.md +18 -16
  126. package/template/docs/glossary.md +58 -0
  127. package/template/docs/kpi-flat-band-pattern.md +3 -3
  128. package/template/docs/kpi-trend-pattern.md +18 -3
  129. package/template/docs/large-dataset-strategy.md +155 -0
  130. package/template/docs/library-hub-header-pattern.md +25 -0
  131. package/template/docs/migrations/_template.md +1 -1
  132. package/template/docs/reference-implementations.md +151 -0
  133. package/template/docs/token-taxonomy.md +1 -1
  134. package/template/docs/voice-and-tone.md +262 -0
  135. package/template/eslint.config.mjs +9 -39
  136. package/template/hooks/use-secondary-panel-hub-nav.ts +10 -10
  137. package/template/lib/ask-leo-route-context.ts +6 -18
  138. package/template/lib/coach-mark-registry.ts +0 -16
  139. package/template/lib/command-menu-config.ts +5 -12
  140. package/template/lib/command-menu-search-data.ts +8 -39
  141. package/template/lib/{question-bank-authoring.ts → library-authoring.ts} +89 -88
  142. package/template/lib/library-dedicated-search.ts +19 -0
  143. package/template/lib/library-hub-search.ts +90 -0
  144. package/template/lib/library-nav.ts +477 -0
  145. package/template/lib/library-recent-searches.ts +22 -0
  146. package/template/lib/{placements-supported-views.ts → library-supported-views.ts} +2 -2
  147. package/template/lib/list-status-badges.ts +16 -104
  148. package/template/lib/mock/dashboard.ts +1 -1
  149. package/template/lib/mock/{question-bank-folders.ts → library-folders.ts} +30 -30
  150. package/template/lib/mock/library-header-collaborators.ts +54 -0
  151. package/template/lib/mock/{question-bank-inspector.ts → library-inspector.ts} +29 -29
  152. package/template/lib/mock/{question-bank-kpi.ts → library-kpi.ts} +20 -20
  153. package/template/lib/mock/library.ts +249 -0
  154. package/template/lib/mock/navigation.tsx +32 -26
  155. package/template/lib/table-state-lifecycle.ts +1 -1
  156. package/template/next.config.mjs +7 -4
  157. package/template/package.json +0 -1
  158. package/tokens/hooks-index.json +2874 -0
  159. package/consumer-extras/cursor-rules/exxat-question-bank-hub-header.mdc +0 -28
  160. package/template/app/(app)/examples/page.tsx +0 -41
  161. package/template/app/(app)/question-bank/find/page.tsx +0 -12
  162. package/template/app/(app)/question-bank/library/page.tsx +0 -11
  163. package/template/app/(app)/question-bank/list/page.tsx +0 -12
  164. package/template/app/(app)/question-bank/page.tsx +0 -11
  165. package/template/components/compliance-board-view.tsx +0 -142
  166. package/template/components/compliance-client.tsx +0 -92
  167. package/template/components/compliance-page-header.tsx +0 -89
  168. package/template/components/compliance-table.tsx +0 -468
  169. package/template/components/data-view-dashboard-charts-compliance.tsx +0 -963
  170. package/template/components/data-view-dashboard-charts-team.tsx +0 -971
  171. package/template/components/data-view-dashboard-charts.tsx +0 -1503
  172. package/template/components/new-placement-back-btn.tsx +0 -28
  173. package/template/components/new-placement-form.tsx +0 -942
  174. package/template/components/placement-board-card.tsx +0 -250
  175. package/template/components/placement-detail.tsx +0 -438
  176. package/template/components/placements-board-view.tsx +0 -397
  177. package/template/components/placements-client.tsx +0 -220
  178. package/template/components/placements-list-view.tsx +0 -124
  179. package/template/components/placements-page-header.tsx +0 -166
  180. package/template/components/placements-table-cells.test.tsx +0 -22
  181. package/template/components/placements-table-cells.tsx +0 -173
  182. package/template/components/placements-table-columns.tsx +0 -210
  183. package/template/components/placements-table.tsx +0 -934
  184. package/template/components/question-bank-panel-activator.tsx +0 -8
  185. package/template/components/rotations-empty-state.tsx +0 -50
  186. package/template/components/rotations-panel-activator.tsx +0 -8
  187. package/template/components/sites-board-view.tsx +0 -67
  188. package/template/components/sites-client.tsx +0 -154
  189. package/template/components/sites-table.tsx +0 -249
  190. package/template/components/team-board-view.tsx +0 -122
  191. package/template/components/team-client.tsx +0 -100
  192. package/template/components/team-page-header.tsx +0 -92
  193. package/template/components/team-table.tsx +0 -553
  194. package/template/docs/question-bank-hub-header-pattern.md +0 -25
  195. package/template/lib/compliance-supported-views.ts +0 -10
  196. package/template/lib/data-view-dashboard-placements-layout.ts +0 -215
  197. package/template/lib/mock/compliance-kpi.ts +0 -61
  198. package/template/lib/mock/compliance.ts +0 -146
  199. package/template/lib/mock/placements-kpi.ts +0 -134
  200. package/template/lib/mock/placements.ts +0 -176
  201. package/template/lib/mock/question-bank-header-collaborators.ts +0 -54
  202. package/template/lib/mock/question-bank.ts +0 -249
  203. package/template/lib/mock/sites-directory.ts +0 -16
  204. package/template/lib/mock/sites-kpi.ts +0 -25
  205. package/template/lib/mock/team-kpi.ts +0 -60
  206. package/template/lib/mock/team.ts +0 -118
  207. package/template/lib/placement-board-card-layout.ts +0 -79
  208. package/template/lib/question-bank-dedicated-search.ts +0 -19
  209. package/template/lib/question-bank-hub-search.ts +0 -90
  210. package/template/lib/question-bank-nav.ts +0 -477
  211. package/template/lib/question-bank-recent-searches.ts +0 -22
  212. package/template/lib/question-bank-supported-views.ts +0 -12
  213. package/template/lib/sites-supported-views.ts +0 -10
  214. package/template/lib/team-supported-views.ts +0 -10
package/dist/index.js CHANGED
@@ -3042,8 +3042,8 @@ function DataTableInner({
3042
3042
  setHeaderScrollLeft(e.currentTarget.scrollLeft);
3043
3043
  },
3044
3044
  className: cn(
3045
- "mx-4 lg:mx-6 overflow-x-auto border border-border",
3046
- hasFooter ? "rounded-t-lg" : "rounded-lg"
3045
+ "mx-4 lg:mx-6 overflow-x-auto border-t border-x border-border",
3046
+ hasFooter ? "rounded-t-lg" : "border-b rounded-lg"
3047
3047
  ),
3048
3048
  children: /* @__PURE__ */ jsxs(
3049
3049
  "table",
@@ -3693,7 +3693,7 @@ function DataTablePaginated({
3693
3693
  hasFooter: true
3694
3694
  }
3695
3695
  ),
3696
- /* @__PURE__ */ jsx("div", { className: "mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden", children: /* @__PURE__ */ jsx(
3696
+ /* @__PURE__ */ jsx("div", { className: "sticky bottom-0 z-40 mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background", children: /* @__PURE__ */ jsx(
3697
3697
  PaginationBar,
3698
3698
  {
3699
3699
  page: safePage,
@@ -6180,6 +6180,8 @@ function HubTable({
6180
6180
  handleRef,
6181
6181
  tableRenderer,
6182
6182
  paginationOverride,
6183
+ paginationPageSizeOptions = [10, 25, 50, 100],
6184
+ paginationInitialPageSize = 10,
6183
6185
  syncedSearchFromUrl,
6184
6186
  renderListRow,
6185
6187
  listAriaLabel,
@@ -6225,13 +6227,23 @@ function HubTable({
6225
6227
  },
6226
6228
  []
6227
6229
  );
6230
+ const [internalPage, setInternalPage] = React10.useState(1);
6231
+ const [internalPageSize, setInternalPageSize] = React10.useState(paginationInitialPageSize);
6232
+ const chromeOwnedPagination = pagination === true && paginationOverride === void 0;
6233
+ const effectivePaginationOverride = paginationOverride ?? (chromeOwnedPagination ? { page: internalPage, pageSize: internalPageSize } : void 0);
6228
6234
  const tableState = useTableState(
6229
6235
  rows,
6230
6236
  columns,
6231
6237
  defaultSort,
6232
- paginationOverride,
6238
+ effectivePaginationOverride,
6233
6239
  syncedSearchFromUrl
6234
6240
  );
6241
+ const handlePageChange = React10.useCallback((p) => setInternalPage(p), []);
6242
+ const handlePageSizeChange = React10.useCallback((n) => {
6243
+ setInternalPageSize(n);
6244
+ setInternalPage(1);
6245
+ }, []);
6246
+ const resetPage = React10.useCallback(() => setInternalPage(1), []);
6235
6247
  const { setSheetOpen: openPropertiesSheet } = tableState;
6236
6248
  React10.useImperativeHandle(
6237
6249
  handleRef ?? null,
@@ -6287,27 +6299,70 @@ function HubTable({
6287
6299
  drawerToolbarProps
6288
6300
  ]
6289
6301
  );
6290
- const defaultTableRenderer = (args2) => /* @__PURE__ */ jsx("div", { className: "pb-6", children: /* @__PURE__ */ jsx(
6291
- DataTable,
6292
- {
6293
- data: rows,
6294
- columns,
6295
- getRowId,
6296
- getRowSelectionLabel,
6297
- selectable,
6298
- searchable: displayOptions.showToolbarSearch,
6299
- showColumnHeaders: displayOptions.showColumnLabels,
6300
- groupable,
6301
- defaultSort,
6302
- emptyState: emptyState ?? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "No records match your filters." }),
6303
- conditionalRules,
6304
- state: args2.state,
6305
- renderFilterOptionValue,
6306
- toolbarSlot: (s) => /* @__PURE__ */ jsx(TablePropertiesDrawerButton, { ...drawerToolbarProps, state: s }),
6307
- bulkActionsSlot,
6308
- onRowClick
6309
- }
6310
- ) });
6302
+ const defaultTableRenderer = (args2) => {
6303
+ const filteredCount = args2.state.rows.length;
6304
+ const totalPages = Math.max(1, Math.ceil(filteredCount / Math.max(1, internalPageSize)));
6305
+ const safePage = Math.min(internalPage, totalPages);
6306
+ return /* @__PURE__ */ jsxs("div", { className: "pb-6", children: [
6307
+ chromeOwnedPagination ? /* @__PURE__ */ jsx(
6308
+ CountSyncer,
6309
+ {
6310
+ count: filteredCount,
6311
+ onSync: (n) => {
6312
+ const next = Math.max(1, Math.ceil(n / Math.max(1, internalPageSize)));
6313
+ if (safePage > next) setInternalPage(next);
6314
+ },
6315
+ onReset: resetPage
6316
+ }
6317
+ ) : null,
6318
+ /* @__PURE__ */ jsx(
6319
+ DataTable,
6320
+ {
6321
+ data: rows,
6322
+ columns,
6323
+ getRowId,
6324
+ getRowSelectionLabel,
6325
+ selectable,
6326
+ searchable: displayOptions.showToolbarSearch,
6327
+ showColumnHeaders: displayOptions.showColumnLabels,
6328
+ groupable,
6329
+ defaultSort,
6330
+ emptyState: emptyState ?? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "No records match your filters." }),
6331
+ conditionalRules,
6332
+ state: args2.state,
6333
+ renderFilterOptionValue,
6334
+ toolbarSlot: (s) => /* @__PURE__ */ jsx(TablePropertiesDrawerButton, { ...drawerToolbarProps, state: s }),
6335
+ bulkActionsSlot,
6336
+ onRowClick,
6337
+ hasFooter: chromeOwnedPagination
6338
+ }
6339
+ ),
6340
+ chromeOwnedPagination ? /* @__PURE__ */ jsx(
6341
+ "div",
6342
+ {
6343
+ className: cn(
6344
+ "mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background",
6345
+ // z-40 sits above pinned cells (z-20), group headers (z-25), and column headers
6346
+ // (z-30 / z-40) so the sticky footer paints over any table content that scrolls
6347
+ // behind it. Pinned-left cells ship with their own `bg-dt-row-bg`, which
6348
+ // otherwise wins because of z-20 > z-10.
6349
+ "sticky bottom-0 z-40"
6350
+ ),
6351
+ children: /* @__PURE__ */ jsx(
6352
+ PaginationBar,
6353
+ {
6354
+ page: safePage,
6355
+ pageSize: internalPageSize,
6356
+ total: filteredCount,
6357
+ pageSizeOptions: paginationPageSizeOptions,
6358
+ onPageChange: handlePageChange,
6359
+ onPageSizeChange: handlePageSizeChange
6360
+ }
6361
+ )
6362
+ }
6363
+ ) : null
6364
+ ] });
6365
+ };
6311
6366
  const args = {
6312
6367
  state: tableState,
6313
6368
  toolbar,
@@ -6331,20 +6386,62 @@ function HubTable({
6331
6386
  "data-table": () => (tableRenderer ?? defaultTableRenderer)(args)
6332
6387
  };
6333
6388
  if (renderers["list-with-toolbar"] == null && renderListRow != null) {
6334
- composed["list-with-toolbar"] = () => args.toolbarShell(
6335
- /* @__PURE__ */ jsx(
6336
- DataRowList,
6337
- {
6338
- rows: args.state.rows,
6339
- getRowId: (row) => getRowId(row),
6340
- ariaLabel: listAriaLabel ?? hubLabel,
6341
- emptyState: listEmptyState ?? "No records match your filters.",
6342
- ...listVirtualizeThreshold !== void 0 ? { virtualizeThreshold: listVirtualizeThreshold } : {},
6343
- ...listEstimatedRowHeight !== void 0 ? { estimatedRowHeight: listEstimatedRowHeight } : {},
6344
- renderRow: renderListRow
6345
- }
6346
- )
6347
- );
6389
+ composed["list-with-toolbar"] = () => {
6390
+ const fullRows = args.state.rows;
6391
+ const pagedRows = chromeOwnedPagination ? args.state.pagedRows : fullRows;
6392
+ const filteredCount = fullRows.length;
6393
+ const totalPages = Math.max(1, Math.ceil(filteredCount / Math.max(1, internalPageSize)));
6394
+ const safePage = Math.min(internalPage, totalPages);
6395
+ return args.toolbarShell(
6396
+ /* @__PURE__ */ jsxs(Fragment, { children: [
6397
+ chromeOwnedPagination ? /* @__PURE__ */ jsx(
6398
+ CountSyncer,
6399
+ {
6400
+ count: filteredCount,
6401
+ onSync: (n) => {
6402
+ const next = Math.max(1, Math.ceil(n / Math.max(1, internalPageSize)));
6403
+ if (safePage > next) setInternalPage(next);
6404
+ },
6405
+ onReset: resetPage
6406
+ }
6407
+ ) : null,
6408
+ /* @__PURE__ */ jsx(
6409
+ DataRowList,
6410
+ {
6411
+ rows: pagedRows,
6412
+ getRowId: (row) => getRowId(row),
6413
+ ariaLabel: listAriaLabel ?? hubLabel,
6414
+ emptyState: listEmptyState ?? "No records match your filters.",
6415
+ ...listVirtualizeThreshold !== void 0 ? { virtualizeThreshold: listVirtualizeThreshold } : {},
6416
+ ...listEstimatedRowHeight !== void 0 ? { estimatedRowHeight: listEstimatedRowHeight } : {},
6417
+ renderRow: renderListRow
6418
+ }
6419
+ ),
6420
+ chromeOwnedPagination ? /* @__PURE__ */ jsx(
6421
+ "div",
6422
+ {
6423
+ className: cn(
6424
+ "mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden bg-background",
6425
+ // Match the table-view footer — above pinned cells (z-20) and column
6426
+ // headers (z-30 / z-40) so the sticky chrome paints over scrolling rows.
6427
+ "sticky bottom-0 z-40"
6428
+ ),
6429
+ children: /* @__PURE__ */ jsx(
6430
+ PaginationBar,
6431
+ {
6432
+ page: safePage,
6433
+ pageSize: internalPageSize,
6434
+ total: filteredCount,
6435
+ pageSizeOptions: paginationPageSizeOptions,
6436
+ onPageChange: handlePageChange,
6437
+ onPageSizeChange: handlePageSizeChange
6438
+ }
6439
+ )
6440
+ }
6441
+ ) : null
6442
+ ] })
6443
+ );
6444
+ };
6348
6445
  }
6349
6446
  if (renderers["board-with-toolbar"] == null && renderBoardCard != null && boardGroups != null) {
6350
6447
  composed["board-with-toolbar"] = () => args.toolbarShell(