@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
@@ -34,11 +34,18 @@ import {
34
34
  } from "@/components/key-metrics"
35
35
  import {
36
36
  HubTable,
37
+ ListPageBoardCard,
37
38
  ListPageTemplate,
38
39
  type ViewTab,
39
40
  } from "@/components/data-views"
41
+ import type { ListPageBoardColumnDef } from "@/components/data-views/list-page-board-template"
40
42
  import type { ColumnDef } from "@/components/data-table/types"
41
- import type { DataListViewType } from "@/lib/data-list-view"
43
+ import { FULL_HUB_SUPPORTED_VIEWS } from "@/lib/data-list-view-registry"
44
+ import {
45
+ buildTokensHubRenderers,
46
+ renderTokenListRow,
47
+ type TokenHubRow,
48
+ } from "@/components/tokens-hub-auxiliary-views"
42
49
  import { Button } from "@/components/ui/button"
43
50
  import { Tip } from "@/components/ui/tip"
44
51
  import { Badge } from "@/components/ui/badge"
@@ -51,7 +58,6 @@ import {
51
58
  categoryPreview,
52
59
  primaryValueText,
53
60
  type TokenCategory,
54
- type TokenRecord,
55
61
  } from "@/components/tokens-themes-section"
56
62
  import {
57
63
  readTokensCategory,
@@ -60,16 +66,7 @@ import {
60
66
  } from "@/components/tokens-secondary-nav"
61
67
 
62
68
  /** Row shape consumed by `DataTable` — flat fields make built-in search work out of the box. */
63
- interface TokenRow extends Record<string, unknown> {
64
- id: string // == name, unique
65
- name: string // var(--…)
66
- namespace: string
67
- category: TokenCategory | string
68
- value: string
69
- deprecated: boolean
70
- /** The original token index entry — used by the Preview cell renderer. */
71
- record: TokenRecord
72
- }
69
+ type TokenRow = TokenHubRow & { category: TokenCategory | string }
73
70
 
74
71
  /** Build all token rows once at module load (token index is static at runtime). */
75
72
  const TOKEN_ROWS: TokenRow[] = (() => {
@@ -124,8 +121,8 @@ const TOKENS_VIEW_TABS: ViewTab[] = [
124
121
  },
125
122
  ]
126
123
 
127
- /** Tokens hub only supports the table viewProperties drawer hides everything else. */
128
- const TOKENS_SUPPORTED_VIEWS: readonly DataListViewType[] = ["table"] as const
124
+ /** Same seven views as Library / Column types each has a renderer on `HubTable` below. */
125
+ const TOKENS_SUPPORTED_VIEWS = FULL_HUB_SUPPORTED_VIEWS
129
126
 
130
127
  /**
131
128
  * Canonical KPI shape (matches `placement-kpi.ts` precedent):
@@ -324,6 +321,19 @@ export function TokensThemesClient() {
324
321
 
325
322
  const getTabCount = React.useCallback(() => rows.length, [rows.length])
326
323
 
324
+ const tokenBoardGroups = React.useMemo((): ListPageBoardColumnDef<TokenRow>[] => {
325
+ return CATEGORY_TABS.map(tab => ({
326
+ id: String(tab.id),
327
+ label: tab.label,
328
+ filter: (row: TokenRow) => tab.matches(String(row.category)),
329
+ }))
330
+ }, [])
331
+
332
+ const tokenHubRenderers = React.useMemo(
333
+ () => buildTokensHubRenderers(metrics, insight),
334
+ [metrics, insight],
335
+ )
336
+
327
337
  const columns: ColumnDef<TokenRow>[] = React.useMemo(() => [
328
338
  {
329
339
  key: "preview",
@@ -425,7 +435,7 @@ export function TokensThemesClient() {
425
435
  onTabsChange={setTabs}
426
436
  activeTabId={activeTabId}
427
437
  onActiveTabChange={setActiveTabId}
428
- supportedViewTypes={["table"]}
438
+ supportedViewTypes={TOKENS_SUPPORTED_VIEWS}
429
439
  getTabCount={getTabCount}
430
440
  header={
431
441
  <PageHeader
@@ -467,7 +477,25 @@ export function TokensThemesClient() {
467
477
  No tokens match your filters.
468
478
  </p>
469
479
  }
470
- renderers={{}}
480
+ listAriaLabel="Tokens"
481
+ listEmptyState="No tokens match your filters."
482
+ renderListRow={renderTokenListRow}
483
+ renderBoardCard={row => (
484
+ <ListPageBoardCard layout="stack">
485
+ <div className="flex items-center gap-2">
486
+ <div className="flex h-9 w-9 shrink-0 items-center justify-center rounded border border-border bg-muted/20">
487
+ {categoryPreview(row.name, row.record)}
488
+ </div>
489
+ <div className="min-w-0">
490
+ <p className="truncate font-mono text-xs font-semibold text-foreground">{row.name}</p>
491
+ <p className="text-[10px] text-muted-foreground">{row.namespace}</p>
492
+ </div>
493
+ </div>
494
+ </ListPageBoardCard>
495
+ )}
496
+ boardGroups={tokenBoardGroups}
497
+ boardEmptyColumnLabel="No tokens"
498
+ renderers={tokenHubRenderers}
471
499
  />
472
500
  )}
473
501
  />
@@ -33,7 +33,7 @@ This is the **happy path** for the most common task: "I have an entity (records,
33
33
  | 5 | Compose the page client with `PrimaryPageTemplate` → `ListPageTemplate` (KPIs in `metrics`, view tabs in `defaultTabs`, the `HubTable` in `renderContent`). | `apps/web/components/<entity>-client.tsx` | `exxat-list-page-connected-views.mdc` |
34
34
  | 6 | Add to nav (`lib/mock/navigation.tsx`). If the hub needs scoped sub-navigation (e.g. categories), declare `secondaryPanel: "<id>"` and register the panel. | `apps/web/lib/mock/navigation.tsx`, `apps/web/components/sidebar/secondary-panel.tsx` | `exxat-primary-nav-secondary-panel.mdc` |
35
35
 
36
- **Reference pages to copy:** `apps/web/components/columns-showcase.tsx` (single-view catalog hub composing every reusable cell), `apps/web/components/tokens-themes-client.tsx` (hub with a secondary panel + URL-driven scope), or `apps/web/components/library-table.tsx` (full hub: table / board / dashboard + conditional rules).
36
+ **Reference pages to copy:** `apps/web/components/library-table.tsx` + `library-client.tsx` (canonical seven-view hub), `apps/web/components/columns-showcase.tsx` (custom columns + same Add view via `LibraryTable`), `apps/web/components/tokens-themes-client.tsx` + `tokens-hub-auxiliary-views.tsx`. See **`hub-supported-views-pattern.md`** before changing Add view.
37
37
 
38
38
  > **Stop signs.** If you find yourself building a parallel table stack, a second metrics strip, a custom filter row, or pasting raw `<DataTable>` into `renderContent` — **stop and re-read** `.cursor/rules/exxat-reuse-before-custom.mdc`.
39
39
 
@@ -6,6 +6,12 @@
6
6
 
7
7
  This document describes how list pages combine **views**, **toolbar** behavior, **filters**, **properties**, and **persistence** in this codebase.
8
8
 
9
+ ## Add view parity (seven views)
10
+
11
+ **Binding:** `.cursor/rules/exxat-hub-supported-views.mdc`. **Detail:** `docs/hub-supported-views-pattern.md`.
12
+
13
+ Every list hub **should** use **`FULL_HUB_SUPPORTED_VIEWS`** (table, list, board, dashboard, folder, panel, tree-panel) on both **`ListPageTemplate`** and **`HubTable`**, with a working renderer per view. **Library** (`library-table.tsx`) is the reference. Do not ship table-only or four-view allowlists on showcase/catalog hubs unless product documents an exception.
14
+
9
15
  ## Reuse existing components (required)
10
16
 
11
17
  **Prefer composing what already exists** over rebuilding one-off tabs, search, filters, or property panels. The **Placements** flow is the reference implementation; new list/table/board pages should wire the same building blocks with new data and column definitions.
@@ -46,7 +46,8 @@
46
46
  | **Secondary panel** | A scoped navigation rail (e.g. "Library → All / Mine / Tree", "Tokens & themes → Colors / Radius / Motion / …") that sits between the main sidebar and the page. Opening one collapses the main sidebar; closing one restores the previous sidebar state. | `exxat-primary-nav-secondary-panel.mdc` |
47
47
  | **Site header** | The top bar on a primary route (org/product switcher + breadcrumbs + actions). Owned by `PrimaryPageTemplate`. | `apps/web/components/templates/primary-page-template.tsx` |
48
48
  | **Skill** | A `.cursor/skills/<name>/SKILL.md` (mirrored in `.claude/skills/`) workflow + checklist for a recurring agent task. Use a skill when the same checklist would be repeated across many sessions. | `apps/web/AGENTS.md` |
49
- | **`supportedViewTypes`** | The allowlist of `DataListViewType` values a hub implements. Passed to `HubTable.supportedViewTypes` so the Properties drawer never offers a view the hub can't render. | `packages/ui/src/components/data-views/hub-table.tsx` |
49
+ | **`supportedViewTypes`** | The allowlist of `DataListViewType` values a hub implements. Default **`FULL_HUB_SUPPORTED_VIEWS`** (seven views, same Add view as Library). Must match on **`ListPageTemplate`** + **`HubTable`**; every entry needs a renderer. | `packages/ui/src/lib/data-list-view-registry.ts`, `docs/hub-supported-views-pattern.md` |
50
+ | **`FULL_HUB_SUPPORTED_VIEWS`** | table · list · board · dashboard · folder · panel · tree-panel — canonical list-hub allowlist. | `data-list-view-registry.ts` |
50
51
  | **Trend polarity** | `MetricItem.trendPolarity` says whether "up" is good (`higher_is_better`, default), bad (`lower_is_better`), or value-neutral (`informational`). The arrow's tint follows the polarity, not the sign. | `exxat-kpi-trends.mdc` |
51
52
  | **`useTableState`** | The state hook that owns rows, filters, search, sort, pagination, group-by, and column visibility. Always one instance per hub. | `exxat-centralized-list-dataset.mdc` |
52
53
  | **View tab** | A tab on `ListPageTemplate` representing one view of the same dataset (table, list, board, dashboard, folder, panel, tree, …). Each tab carries a `viewType` and the `renderContent` callback receives it. | `exxat-list-page-connected-views.mdc` |
@@ -0,0 +1,53 @@
1
+ # Hub supported views pattern (Add view parity)
2
+
3
+ > **Agents:** `.cursor/rules/exxat-hub-supported-views.mdc` (binding). **Reference hub:** Library / All questions (`library-table.tsx`, `library-client.tsx`).
4
+
5
+ ## Problem this solves
6
+
7
+ `ListPageTemplate` filters **Add view** and Properties view tiles from `supportedViewTypes`. If Column types passes four views but Library passes seven, users see inconsistent menus. If a hub allows Board but has no `board-with-toolbar` renderer, users see **“does not implement Board view”**.
8
+
9
+ ## Canonical allowlist
10
+
11
+ Import from the registry (single source of truth):
12
+
13
+ ```ts
14
+ import { FULL_HUB_SUPPORTED_VIEWS } from "@/lib/data-list-view-registry"
15
+ // or
16
+ import { LIBRARY_SUPPORTED_VIEWS } from "@/lib/library-supported-views" // alias of FULL
17
+ ```
18
+
19
+ Seven views: **table**, **list**, **board**, **dashboard**, **folder**, **panel**, **tree-panel**.
20
+
21
+ `HubTable` and `ListPageTemplate` use this list when `supportedViewTypes` is omitted.
22
+
23
+ `PRIMARY_HUB_SUPPORTED_VIEWS` (four views) remains for hubs that intentionally omit folder/panel/tree — document that in `lib/<entity>-supported-views.ts`.
24
+
25
+ ## Wiring checklist
26
+
27
+ 1. **`ListPageTemplate`** — `supportedViewTypes={FULL_HUB_SUPPORTED_VIEWS}` (or entity alias).
28
+ 2. **`HubTable`** — same allowlist (or omit on both).
29
+ 3. **List** — `renderListRow` returning **`ListPageBoardCard`** `layout="row"` (copy from `library-table.tsx`).
30
+ 4. **Board** — `renderBoardCard` + `boardGroups` and/or `renderers["board-with-toolbar"]`.
31
+ 5. **Dashboard** — `renderers["dashboard-with-toolbar"]` with **`KeyMetrics`** on filtered rows.
32
+ 6. **Folder / panel / tree** — explicit `renderers` entries (Library reference) or **`LibraryTable`** for `LibraryItem` rows.
33
+
34
+ ## Special cases in this app
35
+
36
+ | Hub | Pattern |
37
+ |-----|---------|
38
+ | **Library / All questions** | `LibraryTable` + `LIBRARY_SUPPORTED_VIEWS` — reference |
39
+ | **Column types** | `LibraryTable` with `columnDefs` + `hubLabels` + `DEFAULT_LIBRARY_FOLDERS` — custom table, shared other views |
40
+ | **Tokens & themes** | `FULL_HUB_SUPPORTED_VIEWS` + `tokens-hub-auxiliary-views.tsx` |
41
+ | **New entity hub** | Start from `library-table.tsx` or token/columns references; never table-only unless approved |
42
+
43
+ ## Anti-patterns
44
+
45
+ - `supportedViewTypes={["table"]}` on a `ListPageTemplate` hub.
46
+ - `COLUMNS_SUPPORTED_VIEWS = PRIMARY_HUB_SUPPORTED_VIEWS` without board/folder/panel/tree renderers.
47
+ - Minimal `renderListRow` with only stem + `questionId` (not product list UI).
48
+
49
+ ## See also
50
+
51
+ - `packages/ui/src/lib/data-list-view-registry.ts`
52
+ - `apps/web/docs/data-views-pattern.md`
53
+ - `apps/web/lib/hub-connected-view-renderers.ts` — `defineHubViewRenderers` dev warnings
@@ -25,9 +25,9 @@ If you find yourself diverging from the reference page, ask **why** before shipp
25
25
  | Full hub: table + board + dashboard + list + paginated + conditional rules + dashboard customize | `apps/web/components/library-table.tsx` + `library-hub-client.tsx` | [`list-page-template`](./blueprints/list-page-template.md), [`data-table`](./blueprints/data-table.md), [`board-card`](./blueprints/board-card.md), [`key-metrics`](./blueprints/key-metrics.md) | [`exxat-data-tables`](../../../.cursor/rules/exxat-data-tables.mdc), [`exxat-list-page-connected-views`](../../../.cursor/rules/exxat-list-page-connected-views.mdc), [`exxat-centralized-list-dataset`](../../../.cursor/rules/exxat-centralized-list-dataset.mdc) | [`data-views-pattern`](./data-views-pattern.md) |
26
26
  | Hub with secondary panel scope (folder rail) | `apps/web/components/library-hub-client.tsx` + `library-secondary-nav.tsx` | [`list-page-template`](./blueprints/list-page-template.md) | [`exxat-primary-nav-secondary-panel`](../../../.cursor/rules/exxat-primary-nav-secondary-panel.mdc), [`exxat-library-hub-header`](../../../.cursor/rules/exxat-library-hub-header.mdc) | [`library-hub-header-pattern`](./library-hub-header-pattern.md) |
27
27
  | Hub with secondary panel scope (URL-driven category rail) — **smallest** secondary-panel reference + built-in pagination chrome | `apps/web/components/tokens-themes-client.tsx` + `tokens-secondary-nav.tsx` | [`list-page-template`](./blueprints/list-page-template.md) | [`exxat-primary-nav-secondary-panel`](../../../.cursor/rules/exxat-primary-nav-secondary-panel.mdc) | [`shell-surface-elevation-pattern`](./shell-surface-elevation-pattern.md) |
28
- | Single-view showcase hub (table only) — **18 SaaS cell patterns**, each rendered by an **importable named cell** from `@/components/data-views` (see "Cell primitives" table below). Categories: select, primary identity + ID + favorite, avatar + name + email, avatar group +N, type pill, difficulty signal, status chip, inline toggle, tag list, rating stars, progress bar, currency, numeric, attachment count, external link, relative time, absolute date, row actions overflow. | `apps/web/components/columns-showcase.tsx` + `columns-client.tsx` | [`list-page-template`](./blueprints/list-page-template.md), [`data-table`](./blueprints/data-table.md) | [`exxat-data-tables`](../../../.cursor/rules/exxat-data-tables.mdc) | — |
28
+ | Cell-pattern catalog — **18 SaaS cell patterns** via custom `columnDefs`; **seven views** via **`LibraryTable`** (same Add view as Library). | `apps/web/components/columns-showcase.tsx` + `columns-client.tsx` | [`list-page-template`](./blueprints/list-page-template.md), [`data-table`](./blueprints/data-table.md), [`hub-supported-views-pattern`](./hub-supported-views-pattern.md) | [`exxat-data-tables`](../../../.cursor/rules/exxat-data-tables.mdc), [`exxat-hub-supported-views`](../../../.cursor/rules/exxat-hub-supported-views.mdc) | — |
29
29
 
30
- > **First-time hub builder:** start with `columns-showcase.tsx` (single-view catalog, easiest) or `tokens-themes-client.tsx` (adds a secondary panel + URL-driven scope). Move to `library-table.tsx` only when you genuinely need a board / dashboard / conditional rules.
30
+ > **First-time hub builder:** copy **`library-table.tsx`** + **`library-client.tsx`** for seven-view wiring; use **`columns-showcase.tsx`** for custom columns on **`LibraryItem`**; use **`tokens-themes-client.tsx`** + **`tokens-hub-auxiliary-views.tsx`** for token rows. Read **`hub-supported-views-pattern.md`** before changing Add view.
31
31
 
32
32
  ---
33
33
 
@@ -0,0 +1,8 @@
1
+ /**
2
+ * App-wide default view allowlist for list-page hubs (Add view + Properties).
3
+ * Keep in sync with `library-table.tsx` / `ListPageTemplate` / `HubTable`.
4
+ */
5
+ export {
6
+ FULL_HUB_SUPPORTED_VIEWS,
7
+ PRIMARY_HUB_SUPPORTED_VIEWS,
8
+ } from "@exxatdesignux/ui/lib/data-list-view-registry"
@@ -1,12 +1,5 @@
1
- import type { DataListViewType } from "@/lib/data-list-view"
2
-
3
- /** Views implemented in `LibraryTable` — keep in sync with `ListPageConnectedViewBody` renderers. */
4
- export const LIBRARY_SUPPORTED_VIEWS = [
5
- "table",
6
- "list",
7
- "board",
8
- "dashboard",
9
- "folder",
10
- "panel",
11
- "tree-panel",
12
- ] as const satisfies readonly DataListViewType[]
1
+ export {
2
+ FULL_HUB_SUPPORTED_VIEWS,
3
+ FULL_HUB_SUPPORTED_VIEWS as LIBRARY_SUPPORTED_VIEWS,
4
+ PRIMARY_HUB_SUPPORTED_VIEWS,
5
+ } from "@exxatdesignux/ui/lib/data-list-view-registry"
@@ -9,6 +9,7 @@
9
9
  },
10
10
  "scripts": {
11
11
  "dev": "next dev --turbopack",
12
+ "dev:webpack": "next dev",
12
13
  "dev:3001": "next dev --turbopack -p 3001",
13
14
  "dev:3005": "next dev --turbopack -p 3005",
14
15
  "dev:daemon": "pm2 start ecosystem.config.cjs",
@@ -79,5 +80,15 @@
79
80
  "typescript": "^5.9.3",
80
81
  "vite": "^6.4.1",
81
82
  "vitest": "^3.2.4"
83
+ },
84
+ "overrides": {
85
+ "postcss": "^8.5.14",
86
+ "ws": "^8.20.1"
87
+ },
88
+ "pnpm": {
89
+ "overrides": {
90
+ "postcss@<8.5.10": "^8.5.14",
91
+ "ws@<8.20.1": "^8.20.1"
92
+ }
82
93
  }
83
94
  }
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.5.1",
2
+ "version": "0.5.3",
3
3
  "source": "packages/ui/src/globals.css",
4
- "generatedAt": "2026-05-22T04:04:09.308Z",
4
+ "generatedAt": "2026-05-22T09:24:53.662Z",
5
5
  "tokenCount": 197,
6
6
  "themeKeys": [
7
7
  "tailwind-bridge",