@exxatdesignux/ui 0.5.2 → 0.5.4

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 (104) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +1 -1
  3. package/consumer-extras/cursor-rules/exxat-accessibility.mdc +1 -1
  4. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +8 -6
  5. package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +4 -4
  6. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +6 -1
  7. package/consumer-extras/cursor-rules/exxat-hub-supported-views.mdc +54 -0
  8. package/consumer-extras/cursor-rules/exxat-nav-single-active.mdc +31 -0
  9. package/consumer-extras/cursor-rules/exxat-no-vaul.mdc +25 -0
  10. package/consumer-extras/cursor-rules/exxat-page-header-actions.mdc +31 -0
  11. package/consumer-extras/cursor-rules/exxat-table-row-preview.mdc +24 -0
  12. package/consumer-extras/cursor-rules/exxat-tabs-chrome.mdc +31 -0
  13. package/consumer-extras/cursor-skills/exxat-drawer-vs-dialog/SKILL.md +5 -5
  14. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +10 -5
  15. package/consumer-extras/cursor-skills/exxat-ds-skill/references/accessibility.md +1 -1
  16. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +15 -5
  17. package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +14 -5
  18. package/consumer-extras/handbook/HANDBOOK.md +1 -1
  19. package/consumer-extras/handbook/reference-implementations.md +2 -2
  20. package/consumer-extras/patterns/consumer-upgrade-checklist.md +14 -1
  21. package/consumer-extras/patterns/data-views-pattern.md +6 -0
  22. package/consumer-extras/patterns/drawer-vs-dialog-pattern.md +50 -0
  23. package/consumer-extras/patterns/hub-supported-views-pattern.md +53 -0
  24. package/dist/components/data-table/index.js +13 -9
  25. package/dist/components/data-table/index.js.map +1 -1
  26. package/dist/components/data-table/pagination.js +13 -9
  27. package/dist/components/data-table/pagination.js.map +1 -1
  28. package/dist/components/data-views/hub-table.d.ts +8 -4
  29. package/dist/components/data-views/hub-table.js +25 -10
  30. package/dist/components/data-views/hub-table.js.map +1 -1
  31. package/dist/components/data-views/index.d.ts +1 -1
  32. package/dist/components/data-views/index.js +25 -10
  33. package/dist/components/data-views/index.js.map +1 -1
  34. package/dist/components/data-views/list-page-connected-view-body.d.ts +1 -1
  35. package/dist/components/data-views/list-page-connected-view-body.js +1 -0
  36. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -1
  37. package/dist/components/table-properties/drawer-button.js +1 -0
  38. package/dist/components/table-properties/drawer-button.js.map +1 -1
  39. package/dist/components/table-properties/drawer.js +1 -0
  40. package/dist/components/table-properties/drawer.js.map +1 -1
  41. package/dist/components/table-properties/index.d.ts +1 -1
  42. package/dist/components/table-properties/index.js +1 -0
  43. package/dist/components/table-properties/index.js.map +1 -1
  44. package/dist/components/templates/index.d.ts +1 -1
  45. package/dist/components/templates/index.js +12 -2
  46. package/dist/components/templates/index.js.map +1 -1
  47. package/dist/components/templates/list-page.d.ts +4 -2
  48. package/dist/components/templates/list-page.js +12 -2
  49. package/dist/components/templates/list-page.js.map +1 -1
  50. package/dist/{data-list-view-registry-CyBoBML4.d.ts → data-list-view-registry-BstmlfQ3.d.ts} +16 -1
  51. package/dist/index.d.ts +2 -3
  52. package/dist/index.js +135 -126
  53. package/dist/index.js.map +1 -1
  54. package/dist/lib/data-list-view-registry.d.ts +1 -1
  55. package/dist/lib/data-list-view-registry.js +17 -1
  56. package/dist/lib/data-list-view-registry.js.map +1 -1
  57. package/dist/lib/data-list-view-surface.d.ts +1 -1
  58. package/dist/lib/data-list-view-surface.js +1 -0
  59. package/dist/lib/data-list-view-surface.js.map +1 -1
  60. package/dist/lib/list-page-table-properties.d.ts +1 -1
  61. package/dist/lib/list-page-table-properties.js +1 -0
  62. package/dist/lib/list-page-table-properties.js.map +1 -1
  63. package/dist/lib/nav-active.d.ts +38 -0
  64. package/dist/lib/nav-active.js +104 -0
  65. package/dist/lib/nav-active.js.map +1 -0
  66. package/package.json +1 -2
  67. package/src/components/data-table/index.tsx +25 -17
  68. package/src/components/data-views/hub-table.tsx +9 -3
  69. package/src/components/templates/list-page.tsx +9 -3
  70. package/src/index.ts +1 -1
  71. package/src/lib/data-list-view-registry.ts +31 -0
  72. package/src/lib/nav-active.ts +162 -0
  73. package/template/.claude/skills/exxat-ds-skill/SKILL.md +2 -1
  74. package/template/.cursor/rules/exxat-accessibility.mdc +1 -1
  75. package/template/AGENTS.md +18 -3
  76. package/template/components/columns-client.tsx +3 -2
  77. package/template/components/columns-showcase.tsx +22 -18
  78. package/template/components/exxat-product-logo.tsx +1 -1
  79. package/template/components/library-table.tsx +62 -23
  80. package/template/components/new-library-item-form.tsx +0 -7
  81. package/template/components/product-wordmark.tsx +1 -1
  82. package/template/components/sidebar/app-sidebar.tsx +14 -106
  83. package/template/components/sidebar/secondary-nav.tsx +22 -4
  84. package/template/components/site-header.tsx +1 -1
  85. package/template/components/tokens-hub-auxiliary-views.tsx +301 -0
  86. package/template/components/tokens-themes-client.tsx +44 -16
  87. package/template/docs/HANDBOOK.md +2 -2
  88. package/template/docs/component-selection-guide.md +1 -1
  89. package/template/docs/consumer-upgrade-checklist.md +51 -0
  90. package/template/docs/data-views-pattern.md +6 -0
  91. package/template/docs/drawer-vs-dialog-pattern.md +8 -8
  92. package/template/docs/glossary.md +2 -1
  93. package/template/docs/hub-supported-views-pattern.md +53 -0
  94. package/template/docs/reference-implementations.md +2 -2
  95. package/template/lib/full-hub-supported-views.ts +8 -0
  96. package/template/lib/library-supported-views.ts +5 -12
  97. package/template/lib/motion-ui.ts +2 -2
  98. package/template/package.json +1 -1
  99. package/tokens/hooks-index.json +2 -2
  100. package/dist/components/ui/drawer.d.ts +0 -16
  101. package/dist/components/ui/drawer.js +0 -125
  102. package/dist/components/ui/drawer.js.map +0 -1
  103. package/src/components/ui/drawer.tsx +0 -134
  104. package/template/components/ui/drawer.tsx +0 -1
@@ -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
  }
@@ -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) {
@@ -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(