@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.
- package/CHANGELOG.md +16 -0
- package/consumer-extras/cursor-rules/exxat-data-tables.mdc +8 -6
- package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +2 -1
- package/consumer-extras/cursor-rules/exxat-hub-supported-views.mdc +54 -0
- package/consumer-extras/cursor-rules/exxat-nav-single-active.mdc +31 -0
- package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +8 -3
- package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +15 -5
- package/consumer-extras/cursor-skills/exxat-token-economy/SKILL.md +11 -4
- package/consumer-extras/handbook/HANDBOOK.md +1 -1
- package/consumer-extras/handbook/reference-implementations.md +2 -2
- package/consumer-extras/patterns/data-views-pattern.md +6 -0
- package/consumer-extras/patterns/hub-supported-views-pattern.md +53 -0
- package/dist/components/data-table/filter-text-value-input.js +1 -1
- package/dist/components/data-table/filter-text-value-input.js.map +1 -1
- package/dist/components/data-table/index.js +16 -12
- package/dist/components/data-table/index.js.map +1 -1
- package/dist/components/data-table/pagination.js +16 -12
- package/dist/components/data-table/pagination.js.map +1 -1
- package/dist/components/data-views/data-row-list.js +1 -1
- package/dist/components/data-views/data-row-list.js.map +1 -1
- package/dist/components/data-views/hub-table.d.ts +8 -4
- package/dist/components/data-views/hub-table.js +31 -16
- package/dist/components/data-views/hub-table.js.map +1 -1
- package/dist/components/data-views/index.d.ts +1 -1
- package/dist/components/data-views/index.js +31 -16
- package/dist/components/data-views/index.js.map +1 -1
- package/dist/components/data-views/list-page-connected-view-body.d.ts +1 -1
- package/dist/components/data-views/list-page-connected-view-body.js +1 -0
- package/dist/components/data-views/list-page-connected-view-body.js.map +1 -1
- package/dist/components/table-properties/column-row.js +1 -1
- package/dist/components/table-properties/column-row.js.map +1 -1
- package/dist/components/table-properties/drawer-button.js +6 -5
- package/dist/components/table-properties/drawer-button.js.map +1 -1
- package/dist/components/table-properties/drawer.js +6 -5
- package/dist/components/table-properties/drawer.js.map +1 -1
- package/dist/components/table-properties/filter-card.js +2 -2
- package/dist/components/table-properties/filter-card.js.map +1 -1
- package/dist/components/table-properties/index.d.ts +1 -1
- package/dist/components/table-properties/index.js +6 -5
- package/dist/components/table-properties/index.js.map +1 -1
- package/dist/components/table-properties/sort-card.js +1 -1
- package/dist/components/table-properties/sort-card.js.map +1 -1
- package/dist/components/templates/index.d.ts +1 -1
- package/dist/components/templates/index.js +16 -6
- package/dist/components/templates/index.js.map +1 -1
- package/dist/components/templates/list-page.d.ts +4 -2
- package/dist/components/templates/list-page.js +16 -6
- package/dist/components/templates/list-page.js.map +1 -1
- package/dist/components/ui/banner.d.ts +2 -2
- package/dist/components/ui/banner.js +1 -1
- package/dist/components/ui/banner.js.map +1 -1
- package/dist/components/ui/coach-mark.js +1 -1
- package/dist/components/ui/coach-mark.js.map +1 -1
- package/dist/components/ui/context-menu.js +1 -1
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/date-picker-field.js +1 -1
- package/dist/components/ui/date-picker-field.js.map +1 -1
- package/dist/components/ui/dropdown-menu.js +2 -2
- package/dist/components/ui/dropdown-menu.js.map +1 -1
- package/dist/components/ui/export-drawer.js +3 -3
- package/dist/components/ui/export-drawer.js.map +1 -1
- package/dist/components/ui/hover-card.js +1 -1
- package/dist/components/ui/hover-card.js.map +1 -1
- package/dist/components/ui/key-metrics.js +6 -6
- package/dist/components/ui/key-metrics.js.map +1 -1
- package/dist/components/ui/page-header.js +1 -1
- package/dist/components/ui/page-header.js.map +1 -1
- package/dist/components/ui/popover.js +1 -1
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/select.js +1 -1
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/sheet.js +1 -1
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/sidebar.d.ts +1 -1
- package/dist/components/ui/sidebar.js +3 -3
- package/dist/components/ui/sidebar.js.map +1 -1
- package/dist/components/ui/tip.js +1 -1
- package/dist/components/ui/tip.js.map +1 -1
- package/dist/components/ui/tooltip.js +1 -1
- package/dist/components/ui/tooltip.js.map +1 -1
- package/dist/components/ui/view-segmented-control.js +1 -1
- package/dist/components/ui/view-segmented-control.js.map +1 -1
- package/dist/{data-list-view-registry-CyBoBML4.d.ts → data-list-view-registry-BstmlfQ3.d.ts} +16 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +151 -29
- package/dist/index.js.map +1 -1
- package/dist/lib/data-list-view-registry.d.ts +1 -1
- package/dist/lib/data-list-view-registry.js +17 -1
- package/dist/lib/data-list-view-registry.js.map +1 -1
- package/dist/lib/data-list-view-surface.d.ts +1 -1
- package/dist/lib/data-list-view-surface.js +1 -0
- package/dist/lib/data-list-view-surface.js.map +1 -1
- package/dist/lib/list-page-table-properties.d.ts +1 -1
- package/dist/lib/list-page-table-properties.js +1 -0
- package/dist/lib/list-page-table-properties.js.map +1 -1
- package/dist/lib/nav-active.d.ts +38 -0
- package/dist/lib/nav-active.js +104 -0
- package/dist/lib/nav-active.js.map +1 -0
- package/package.json +1 -1
- package/src/components/data-table/index.tsx +25 -17
- package/src/components/data-views/data-row-list.tsx +1 -1
- package/src/components/data-views/hub-table.tsx +9 -3
- package/src/components/templates/list-page.tsx +9 -3
- package/src/components/ui/banner.tsx +0 -2
- package/src/components/ui/coach-mark.tsx +1 -2
- package/src/components/ui/context-menu.tsx +1 -1
- package/src/components/ui/dropdown-menu.tsx +2 -2
- package/src/components/ui/hover-card.tsx +1 -1
- package/src/components/ui/key-metrics.tsx +4 -4
- package/src/components/ui/popover.tsx +1 -1
- package/src/components/ui/select.tsx +1 -1
- package/src/components/ui/sheet.tsx +1 -1
- package/src/components/ui/sidebar.tsx +3 -3
- package/src/components/ui/tooltip.tsx +1 -1
- package/src/index.ts +1 -0
- package/src/lib/data-list-view-registry.ts +31 -0
- package/src/lib/nav-active.ts +162 -0
- package/template/.claude/skills/exxat-ds-skill/SKILL.md +2 -1
- package/template/AGENTS.md +16 -1
- package/template/components/columns-client.tsx +3 -2
- package/template/components/columns-showcase.tsx +22 -18
- package/template/components/exxat-product-logo.tsx +1 -1
- package/template/components/library-table.tsx +62 -23
- package/template/components/new-library-item-form.tsx +0 -7
- package/template/components/product-wordmark.tsx +1 -1
- package/template/components/sidebar/app-sidebar.tsx +14 -106
- package/template/components/sidebar/secondary-nav.tsx +22 -4
- package/template/components/tokens-hub-auxiliary-views.tsx +301 -0
- package/template/components/tokens-themes-client.tsx +44 -16
- package/template/docs/HANDBOOK.md +1 -1
- package/template/docs/data-views-pattern.md +6 -0
- package/template/docs/glossary.md +2 -1
- package/template/docs/hub-supported-views-pattern.md +53 -0
- package/template/docs/reference-implementations.md +2 -2
- package/template/lib/full-hub-supported-views.ts +8 -0
- package/template/lib/library-supported-views.ts +5 -12
- package/template/package.json +11 -0
- 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
|
|
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
|
-
|
|
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
|
-
/**
|
|
128
|
-
const TOKENS_SUPPORTED_VIEWS
|
|
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={
|
|
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
|
-
|
|
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/
|
|
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.
|
|
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
|
-
|
|
|
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:**
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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"
|
package/template/package.json
CHANGED
|
@@ -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
|
}
|
package/tokens/hooks-index.json
CHANGED