@exxatdesignux/ui 0.5.4 → 0.5.5

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.5
4
+
5
+ ### Patch Changes
6
+
7
+ - **New consumer agent rules (vendored via `sync-extras`):** `exxat-no-image-pixel-copy` (uploaded screenshots = IA only — never pixel-copy colors/chrome), `exxat-sidebar-shell` (DS `AppSidebar` chrome; no legacy rainbow nav styling).
8
+ - **`exxat-ds-agents` §33–§34**, **`exxat-reuse-before-custom`**, **`exxat-token-economy` Q9** — image discipline + sidebar guardrails wired into pre-flight.
9
+ - **`consumer-upgrade-checklist.md`** and **`reference-implementations.md`** — audit rows for screenshot copying and legacy sidebar anti-patterns.
10
+
3
11
  ## 0.5.4
4
12
 
5
13
  ### Patch Changes
@@ -45,6 +45,8 @@ Before implementing or reviewing **list / table / board / dashboard / data-heavy
45
45
  30. **Tabs chrome** — **`exxat-tabs-chrome.mdc`** — hub views = **`ListPageTemplate`** toolbar (`w-max`); record tabs = **`TabsList`** `w-fit`, never full-width stretch.
46
46
  31. **Page header actions** — **`exxat-page-header-actions.mdc`** — filled primary + outline overflow; no hand-built grey buttons.
47
47
  32. **Table row preview** — **`exxat-table-row-preview.mdc`** — **`HoverCard`** + DS badges/cells; no bespoke popover cards.
48
+ 33. **Sidebar shell** — **`exxat-sidebar-shell.mdc`** + **`AGENTS.md` §9.1** — legacy screenshots = **IA only**; **MUST NOT** copy rainbow section styling or fork **`app-sidebar.tsx`**.
49
+ 34. **Uploaded images** — **`exxat-no-image-pixel-copy.mdc`** — screenshots = intent/IA only; map to DS patterns; never pixel-copy.
48
50
 
49
51
  ## Also read
50
52
 
@@ -0,0 +1,35 @@
1
+ ---
2
+ description: Uploaded screenshots/mockups are IA reference only — map to Exxat DS patterns; never pixel-copy
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Exxat DS — uploaded images are not the implementation spec
7
+
8
+ When the user attaches a **screenshot**, **mockup**, **Figma export**, **legacy app capture**, or any **reference image**, treat it as **product intent** — **not** as code to transcribe.
9
+
10
+ **Exxat DS rules, blueprints, and reference hubs always win** over what the image shows.
11
+
12
+ ## Allowed to take from an image (content / IA)
13
+
14
+ - **Screen purpose**, **nav labels**, **routes**, **fields**, **columns**, **KPIs**, **actions**, **statuses**
15
+ - **Icon suffix** (Font Awesome) — still use **`fa-light` / `fa-solid`** DS pairing
16
+ - **Workflow intent** — export, invite, row → detail, etc.
17
+
18
+ ## MUST NOT copy from an image (visual / stack)
19
+
20
+ - **Hex / RGB colors**, rainbow section text, custom sidebar washes, bespoke pills
21
+ - **Shell forks** — sidebar, header, list toolbar, tabs that bypass DS components
22
+ - **Bespoke widgets** when DS primitives exist — raw tables, custom popovers, Vaul, full-width tabs
23
+ - **Pixel implementation “because it’s in the picture”** without citing a **DS pattern + reference hub**
24
+
25
+ ## REQUIRED workflow (before UI code)
26
+
27
+ 1. Classify via **`component-selection-guide`** + **`blueprints/`**
28
+ 2. Pick **`reference-implementations`** hub
29
+ 3. State mapping (screen → DS composition)
30
+ 4. Build with **`AGENTS.md`** + topic rules
31
+ 5. Image vs DS conflict → **DS wins**; ask one question only for true business gaps
32
+
33
+ ## See also
34
+
35
+ - **`exxat-reuse-before-custom.mdc`**, **`exxat-sidebar-shell.mdc`**, **`exxat-token-economy`** §2
@@ -20,6 +20,8 @@ alwaysApply: true
20
20
 
21
21
  Do **not** silently ship a second stack for the same product pattern (e.g. another “table”, another metrics strip, another sidebar).
22
22
 
23
+ When the user **uploads a screenshot or mockup**, read **`exxat-no-image-pixel-copy.mdc`** first — extract IA only; map to DS patterns; never pixel-copy colors or chrome.
24
+
23
25
  If the **user or task already explicitly** approved a greenfield component (“build a new X from scratch”), you may proceed without re-asking.
24
26
 
25
27
  ## MUST NOT
@@ -0,0 +1,35 @@
1
+ ---
2
+ description: Application sidebar — DS shell only; legacy screenshots are IA reference, not visual spec
3
+ globs: "**/app-sidebar.tsx,**/navigation*.tsx,**/lib/mock/navigation.tsx,**/lib/*-navigation.tsx"
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Exxat DS — application sidebar shell (MUST)
8
+
9
+ Customer / legacy app **screenshots** may show **what links exist** — not **how the sidebar is styled**. Full policy: **`exxat-no-image-pixel-copy.mdc`**.
10
+
11
+ ## Screenshots are allowed to inform (content only)
12
+
13
+ - Nav **labels**, **grouping**, **route paths**, **Font Awesome icon suffixes**
14
+ - Whether a row needs **children**, a **secondary panel**, or a **badge**
15
+
16
+ ## Screenshots MUST NOT drive styling (MUST NOT)
17
+
18
+ - **Per-section label colors** (magenta / teal / gold text on every row in a group)
19
+ - **Custom active pills** (hand-built white `rounded-*` + shadow instead of `SidebarMenuButton` `data-active`)
20
+ - **Non-token sidebar fills** (pink wash, `#hex` tints, inline `style={{ color: … }}`)
21
+ - **Forking `app-sidebar.tsx` layout** for one product while rest of DS uses shared chrome
22
+ - **Re-implementing `isNavActive`** in the app — use **`@exxatdesignux/ui/lib/nav-active`** (see **`exxat-nav-single-active.mdc`**)
23
+
24
+ ## MUST — DS sidebar chrome
25
+
26
+ 1. **Shell:** **`AppSidebar`** + **`SidebarMenuButton`** / **`SidebarGroup`** / **`SidebarGroupLabel`** from **`@exxatdesignux/ui`**. Reference: **`AGENTS.md` §9.1**, **`exxat-ds-skill` §3.1–§3.2**.
27
+ 2. **Typography:** Row labels **`text-sidebar-foreground`**. Section headings **`SidebarGroupLabel`** + **`text-sidebar-section-label`**.
28
+ 3. **Active state:** **`SidebarMenuButton` `isActive`** only — one active row in expanded rail; collapsible parent neutral when child active.
29
+ 4. **Icons:** **`fa-light`** / **`fa-solid`** on icons — do **not** recolor labels per module.
30
+ 5. **Nav data:** Extend **`lib/mock/navigation.tsx`** (or imported mock). **MUST NOT** paste legacy sidebar components from customer repos.
31
+ 6. **Consumer products:** Build in a **separate repo** with **`@exxatdesignux/ui`** — not DS monorepo sidebar forks.
32
+
33
+ ## Anti-pattern
34
+
35
+ Legacy product sidebars with rainbow section text and bespoke selection chrome — **do not reproduce** on Exxat DS.
@@ -66,8 +66,9 @@ Answer **yes / no / N/A** to each. A **no** means re-plan; you'll save a regener
66
66
  6. **Seven views + real bodies?** — `FULL_HUB_SUPPORTED_VIEWS` on **`ListPageTemplate`** + **`HubTable`** (sync both); every allowed view has a renderer; list uses **`ListPageBoardCard`** — not `["table"]` / `PRIMARY_HUB_SUPPORTED_VIEWS` / empty `renderers={}`.
67
67
  7. **Sheet only (no Vaul)?** — side panels use **`Sheet`**; **`vaul`** must not be in `package.json`.
68
68
  8. **Header + tabs + table preview?** — **`PageHeader`** + DS **`Button`** variants for actions; hub views via **`ListPageTemplate`** (not full-width tabs); record tabs **`TabsList`** `w-fit`; row preview via **`HoverCard`** + shared cells — not custom popovers.
69
+ 9. **Uploaded image ≠ spec?** — If the user attached a screenshot/mockup: extract **IA only** (labels, routes, fields); map to **`component-selection-guide`** + a **reference hub**; **MUST NOT** pixel-copy colors, sidebar chrome, tabs, or bespoke widgets — **`exxat-no-image-pixel-copy.mdc`**.
69
70
 
70
- If all eight are **yes**, generate. If any is **no**, either narrow the requirements
71
+ If all nine are **yes**, generate. If any is **no**, either narrow the requirements
71
72
  with **one** clarifying question or fix the gap silently and note it in your response.
72
73
 
73
74
  ---
@@ -131,6 +131,8 @@ These exist but are **not** canonical. They predate a rule, are scoped to a one-
131
131
  | Custom search input above a `DataTable` | `HubTable`'s toolbar already does this; duplicating leads to drift | Configure `ColumnDef.filter` + use `HubTable` |
132
132
  | `toast()` / Sonner / snackbar | Forbidden — see [`exxat-no-toast.mdc`](../../../.cursor/rules/exxat-no-toast.mdc) | `LocalBanner` / `SystemBanner` or inline status |
133
133
  | Negative-margin overlapping avatars | Forbidden — see [`exxat-person-identity-display.mdc`](../../../.cursor/rules/exxat-person-identity-display.mdc) | `AvatarGroup` (gapped by default) |
134
+ | Legacy customer sidebar screenshots (rainbow section text, pink wash, custom pills) | Visual spec for old product — **not** Exxat DS chrome | **`AppSidebar`** + **`SidebarMenuButton`** + **`lib/mock/navigation.tsx`** — **`exxat-sidebar-shell.mdc`** |
135
+ | Uploaded screenshots / mockups treated as pixel spec | Images show **intent** — DS blueprints + reference hubs define **implementation** | **`exxat-no-image-pixel-copy.mdc`** + **`component-selection-guide.md`** |
134
136
 
135
137
  ---
136
138
 
@@ -42,6 +42,7 @@ If the app was built before current agent rules, verify:
42
42
  | Grey custom header buttons | **`PageHeader`** + **`Button`** variants — **`exxat-page-header-actions.mdc`** |
43
43
  | Bespoke student popover in table | **`HoverCard`** + shared cells/badges — **`exxat-table-row-preview.mdc`** |
44
44
  | Custom hub table / trimmed Add view | **`HubTable`** + **`FULL_HUB_SUPPORTED_VIEWS`** — **`exxat-hub-supported-views.mdc`** |
45
+ | Agent copied uploaded screenshots pixel-for-pixel | **`exxat-no-image-pixel-copy.mdc`** — images = IA only; map to blueprints + reference hubs |
45
46
 
46
47
  ## 6. Still stuck?
47
48
 
@@ -10,7 +10,7 @@ declare function useAppTheme(): {
10
10
  brand: Brand;
11
11
  setBrand: (b: Brand) => void;
12
12
  /** The user's preference: "system" | "normal" | "high" | "windows" */
13
- contrastPref: "normal" | "high" | "system" | "windows";
13
+ contrastPref: "system" | "normal" | "high" | "windows";
14
14
  /** The resolved contrast mode actually applied to the DOM. */
15
15
  contrast: ContrastMode;
16
16
  /** Set the contrast preference. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exxatdesignux/ui",
3
- "version": "0.5.4",
3
+ "version": "0.5.5",
4
4
  "description": "Exxat shared design system (components, hooks, tokens). Monorepo setup: clone repo then pnpm bootstrap at workspace root — see github.com/ExxatDesign/Exxat-DS-Workspace README.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Exxat Design",
@@ -42,6 +42,7 @@ If the app was built before current agent rules, verify:
42
42
  | Grey custom header buttons | **`PageHeader`** + **`Button`** variants — **`exxat-page-header-actions.mdc`** |
43
43
  | Bespoke student popover in table | **`HoverCard`** + shared cells/badges — **`exxat-table-row-preview.mdc`** |
44
44
  | Custom hub table / trimmed Add view | **`HubTable`** + **`FULL_HUB_SUPPORTED_VIEWS`** — **`exxat-hub-supported-views.mdc`** |
45
+ | Agent copied uploaded screenshots pixel-for-pixel | **`exxat-no-image-pixel-copy.mdc`** — images = IA only; map to blueprints + reference hubs |
45
46
 
46
47
  ## 6. Still stuck?
47
48
 
@@ -129,6 +129,8 @@ These exist but are **not** canonical. They predate a rule, are scoped to a one-
129
129
  | Custom search input above a `DataTable` | `HubTable`'s toolbar already does this; duplicating leads to drift | Configure `ColumnDef.filter` + use `HubTable` |
130
130
  | `toast()` / Sonner / snackbar | Forbidden — see [`exxat-no-toast.mdc`](../../../.cursor/rules/exxat-no-toast.mdc) | `LocalBanner` / `SystemBanner` or inline status |
131
131
  | Negative-margin overlapping avatars | Forbidden — see [`exxat-person-identity-display.mdc`](../../../.cursor/rules/exxat-person-identity-display.mdc) | `AvatarGroup` (gapped by default) |
132
+ | Legacy customer sidebar screenshots (rainbow section text, pink wash, custom pills) | Visual spec for old product — **not** Exxat DS chrome | **`AppSidebar`** + **`SidebarMenuButton`** + **`lib/mock/navigation.tsx`** — [`exxat-sidebar-shell.mdc`](../../../.cursor/rules/exxat-sidebar-shell.mdc) |
133
+ | Uploaded screenshots / mockups treated as pixel spec | Images show **intent** (labels, fields, flows) — DS blueprints + reference hubs define **implementation** | [`exxat-no-image-pixel-copy.mdc`](../../../.cursor/rules/exxat-no-image-pixel-copy.mdc) + **`component-selection-guide.md`** |
132
134
 
133
135
  ---
134
136
 
@@ -15,7 +15,7 @@ import {
15
15
 
16
16
  // ── Types ─────────────────────────────────────────────────────────────────────
17
17
 
18
- /** Flat sidebar link (screenshot: primary + Documents + utilities) */
18
+ /** Flat sidebar link primary + Documents + utilities groups (DS shell; not legacy screenshot styling) */
19
19
  export interface NavLinkItem {
20
20
  key: string
21
21
  title: string
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.5.4",
2
+ "version": "0.5.5",
3
3
  "source": "packages/ui/src/globals.css",
4
- "generatedAt": "2026-05-22T11:42:41.710Z",
4
+ "generatedAt": "2026-05-22T12:39:10.883Z",
5
5
  "tokenCount": 197,
6
6
  "themeKeys": [
7
7
  "tailwind-bridge",