@godxjp/ui 18.4.0 → 18.6.0

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 (159) hide show
  1. package/README.md +16 -1
  2. package/dist/app/theme-axes.d.ts +11 -3
  3. package/dist/app/theme-axes.js +2 -1
  4. package/dist/components/charts/chart-frame.d.ts +17 -3
  5. package/dist/components/charts/chart-frame.js +7 -1
  6. package/dist/components/charts/chart-summary.d.ts +21 -0
  7. package/dist/components/charts/chart-summary.js +32 -5
  8. package/dist/components/charts/compact-bar-trend.d.ts +30 -0
  9. package/dist/components/charts/compact-bar-trend.js +74 -0
  10. package/dist/components/charts/index.d.ts +6 -0
  11. package/dist/components/charts/index.js +2 -0
  12. package/dist/components/data-display/badge.d.ts +8 -0
  13. package/dist/components/data-display/badge.js +7 -1
  14. package/dist/components/data-display/data-table.d.ts +40 -4
  15. package/dist/components/data-display/data-table.js +69 -2
  16. package/dist/components/data-display/empty-state.js +1 -1
  17. package/dist/components/data-display/index.d.ts +4 -2
  18. package/dist/components/data-display/index.js +10 -1
  19. package/dist/components/data-display/list-row.d.ts +41 -4
  20. package/dist/components/data-display/list-row.js +23 -3
  21. package/dist/components/data-display/qr-code.d.ts +1 -1
  22. package/dist/components/data-display/service-launcher-card.d.ts +40 -0
  23. package/dist/components/data-display/service-launcher-card.js +97 -0
  24. package/dist/components/data-display/table.d.ts +47 -2
  25. package/dist/components/data-display/table.js +29 -4
  26. package/dist/components/data-entry/command-palette.d.ts +37 -0
  27. package/dist/components/data-entry/command-palette.js +125 -0
  28. package/dist/components/data-entry/command.d.ts +10 -10
  29. package/dist/components/data-entry/index.d.ts +3 -0
  30. package/dist/components/data-entry/index.js +2 -0
  31. package/dist/components/data-entry/input-otp.d.ts +1 -0
  32. package/dist/components/feedback/dialog.d.ts +16 -1
  33. package/dist/components/feedback/dialog.js +46 -33
  34. package/dist/components/feedback/index.d.ts +5 -2
  35. package/dist/components/feedback/index.js +8 -2
  36. package/dist/components/feedback/sheet.d.ts +26 -4
  37. package/dist/components/feedback/sheet.js +54 -7
  38. package/dist/components/feedback/two-factor-setup.d.ts +31 -0
  39. package/dist/components/feedback/two-factor-setup.js +97 -0
  40. package/dist/components/general/index.d.ts +1 -1
  41. package/dist/components/general/logo.d.ts +49 -9
  42. package/dist/components/general/logo.js +67 -14
  43. package/dist/components/layout/app-shell.d.ts +1 -1
  44. package/dist/components/layout/app-shell.js +55 -30
  45. package/dist/components/layout/auth-account-summary.d.ts +5 -0
  46. package/dist/components/layout/auth-account-summary.js +31 -0
  47. package/dist/components/layout/auth-divider.d.ts +7 -0
  48. package/dist/components/layout/auth-divider.js +21 -0
  49. package/dist/components/layout/auth-footer.d.ts +5 -0
  50. package/dist/components/layout/auth-footer.js +24 -0
  51. package/dist/components/layout/auth-identity.d.ts +5 -0
  52. package/dist/components/layout/auth-identity.js +17 -0
  53. package/dist/components/layout/auth-shell.d.ts +9 -1
  54. package/dist/components/layout/auth-shell.js +25 -6
  55. package/dist/components/layout/auth-stack.d.ts +4 -0
  56. package/dist/components/layout/auth-stack.js +8 -0
  57. package/dist/components/layout/centered-shell.d.ts +5 -2
  58. package/dist/components/layout/centered-shell.js +29 -19
  59. package/dist/components/layout/error-surface.d.ts +35 -0
  60. package/dist/components/layout/error-surface.js +155 -0
  61. package/dist/components/layout/flex.d.ts +1 -1
  62. package/dist/components/layout/flex.js +4 -0
  63. package/dist/components/layout/index.d.ts +23 -3
  64. package/dist/components/layout/index.js +21 -2
  65. package/dist/components/layout/legal-document-shell.d.ts +34 -0
  66. package/dist/components/layout/legal-document-shell.js +186 -0
  67. package/dist/components/layout/master-detail.d.ts +24 -0
  68. package/dist/components/layout/master-detail.js +48 -0
  69. package/dist/components/layout/org-switcher.d.ts +9 -0
  70. package/dist/components/layout/org-switcher.js +218 -0
  71. package/dist/components/layout/page-container.d.ts +1 -1
  72. package/dist/components/layout/page-container.js +7 -2
  73. package/dist/components/layout/sidebar-link.d.ts +43 -0
  74. package/dist/components/layout/sidebar-link.js +13 -0
  75. package/dist/components/layout/sidebar.d.ts +42 -5
  76. package/dist/components/layout/sidebar.js +170 -85
  77. package/dist/components/navigation/app-setting-picker.js +17 -6
  78. package/dist/components/navigation/filter-bar.d.ts +12 -3
  79. package/dist/components/navigation/filter-bar.js +8 -2
  80. package/dist/components/navigation/index.d.ts +2 -2
  81. package/dist/components/navigation/index.js +3 -1
  82. package/dist/components/navigation/steps.js +38 -19
  83. package/dist/components/navigation/tabs-scroll.d.ts +70 -0
  84. package/dist/components/navigation/tabs-scroll.js +76 -0
  85. package/dist/components/navigation/tabs.js +47 -23
  86. package/dist/components/ui/avatar.d.ts +2 -1
  87. package/dist/components/ui/avatar.js +2 -1
  88. package/dist/components/ui/input-otp.d.ts +4 -1
  89. package/dist/components/ui/input-otp.js +2 -1
  90. package/dist/components/ui/toggle-group.d.ts +7 -4
  91. package/dist/components/ui/toggle-group.js +32 -21
  92. package/dist/email/brand-mark.d.ts +108 -0
  93. package/dist/email/brand-mark.js +88 -0
  94. package/dist/email/color.d.ts +53 -0
  95. package/dist/email/color.js +37 -0
  96. package/dist/email/geometry.d.ts +120 -0
  97. package/dist/email/geometry.js +90 -0
  98. package/dist/email/index.d.ts +83 -0
  99. package/dist/email/index.js +82 -0
  100. package/dist/email/inline-style.d.ts +27 -0
  101. package/dist/email/inline-style.js +26 -0
  102. package/dist/email/tokens.generated.d.ts +167 -0
  103. package/dist/email/tokens.generated.js +162 -0
  104. package/dist/email/urgency.d.ts +22 -0
  105. package/dist/email/urgency.js +14 -0
  106. package/dist/i18n/messages/en.json +36 -3
  107. package/dist/i18n/messages/ja.json +36 -3
  108. package/dist/i18n/messages/vi.json +36 -3
  109. package/dist/inertia/index.d.ts +50 -0
  110. package/dist/inertia/index.js +5 -0
  111. package/dist/props/components/app.prop.d.ts +11 -1
  112. package/dist/props/components/charts.prop.d.ts +40 -1
  113. package/dist/props/components/data-display.prop.d.ts +75 -1
  114. package/dist/props/components/data-entry.prop.d.ts +6 -0
  115. package/dist/props/components/feedback.prop.d.ts +10 -0
  116. package/dist/props/components/index.d.ts +3 -3
  117. package/dist/props/components/layout.prop.d.ts +560 -10
  118. package/dist/props/components/layout.prop.js +1 -0
  119. package/dist/props/components/navigation.prop.d.ts +24 -2
  120. package/dist/props/registry.d.ts +433 -8
  121. package/dist/props/registry.js +527 -9
  122. package/dist/props/vocabulary/data.prop.d.ts +27 -0
  123. package/dist/props/vocabulary/index.d.ts +3 -3
  124. package/dist/props/vocabulary/interaction.prop.d.ts +10 -1
  125. package/dist/props/vocabulary/layout.prop.d.ts +49 -0
  126. package/dist/styles/base.css +8 -2
  127. package/dist/styles/card-layout.css +161 -7
  128. package/dist/styles/chart-layout.css +97 -0
  129. package/dist/styles/control.css +76 -2
  130. package/dist/styles/data-display-layout.css +78 -6
  131. package/dist/styles/dialog-layout.css +105 -4
  132. package/dist/styles/fonts.css +15 -4
  133. package/dist/styles/index.css +11 -3
  134. package/dist/styles/layout.css +466 -1
  135. package/dist/styles/logo-layout.css +95 -0
  136. package/dist/styles/navigation-layout.css +152 -0
  137. package/dist/styles/shell-layout.css +790 -40
  138. package/dist/styles/table-layout.css +164 -1
  139. package/dist/theme/dxs.canonical.css +77 -0
  140. package/dist/tokens/axes.css +40 -0
  141. package/dist/tokens/base.css +6 -0
  142. package/dist/tokens/components/card.css +48 -0
  143. package/dist/tokens/components/chart.css +47 -0
  144. package/dist/tokens/components/control.css +16 -0
  145. package/dist/tokens/components/data-display.css +13 -0
  146. package/dist/tokens/components/email.css +93 -0
  147. package/dist/tokens/components/error-surface.css +36 -0
  148. package/dist/tokens/components/feedback.css +17 -0
  149. package/dist/tokens/components/legal-document.css +67 -0
  150. package/dist/tokens/components/list-row.css +43 -2
  151. package/dist/tokens/components/logo.css +74 -0
  152. package/dist/tokens/components/navigation.css +28 -0
  153. package/dist/tokens/components/sheet.css +19 -0
  154. package/dist/tokens/components/shell.css +210 -0
  155. package/dist/tokens/components/sidebar.css +33 -0
  156. package/dist/tokens/components/table.css +45 -0
  157. package/dist/tokens/foundation.css +31 -2
  158. package/dist/tokens/semantic/layout.css +69 -2
  159. package/package.json +22 -5
@@ -31,6 +31,25 @@
31
31
  --attention: 25 99% 46%; /* 朱 #eb6101 */
32
32
  --attention-foreground: 60 33% 99%;
33
33
 
34
+ /* IDENTITY role — the canonical GoDX emerald. This is the PRODUCT MARK colour (Logo `mark="godx"`
35
+ * / `tone="success"`, its wordmark, the email brand capsule), and it is deliberately THREE-WAY
36
+ * distinct:
37
+ * · from --primary — a service re-theming its action colour must never recolour the mark;
38
+ * · from --success — 若竹 #68be8d is the STATUS green (badges, progress, "saved" text) and
39
+ * stays exactly as it is. The mark previously borrowed it, which rendered
40
+ * the identity at #69bf8e instead of the canonical emerald — ΔE76 ≈ 17.5,
41
+ * a plainly wrong brand colour (gh#250/#214);
42
+ * · from --text-brand / --color-brand — those are the BLUE brand-numeral TEXT slot and the
43
+ * Tailwind `text-brand` utility it feeds; unrelated, and not renamed here.
44
+ * Canonical value: oklch(0.595 0.137 162.94) = #009766, "kept distinct from SmartHR primary".
45
+ * The triplet is carried at one decimal so hsl() lands on that exact hex (an integer 160 100% 30%
46
+ * would drift to #009966). Dark lifts lightness only — same hue, same full chroma — so the mark
47
+ * stays the same emerald while clearing AA against the dark spine.
48
+ * There is no Tailwind `bg-brand` utility on purpose: `--color-brand` is already taken by
49
+ * --text-brand, so identity surfaces read `hsl(var(--brand))` directly in component CSS. */
50
+ --brand: 160.5 100% 29.6%; /* 翠 GoDX emerald #009766 */
51
+ --brand-foreground: 60 33% 99%;
52
+
34
53
  /* Extended text hierarchy (beyond --foreground / --muted-foreground) — themeable per service.
35
54
  * Roles primitives bake in today: caption/meta, disabled, inline link, brand numerals. */
36
55
  --text-tertiary: 44 5% 55%; /* lighter than muted-foreground — captions / meta */
@@ -161,8 +180,11 @@
161
180
  * --font-sans-zh-hans (lang="zh" | "zh-Hans" | "zh-CN")
162
181
  * --font-sans-zh-hant (lang="zh-Hant" | "zh-TW")
163
182
  * e.g. `--font-sans-ja: "Noto Sans JP", var(--font-sans-base);`
164
- * The opt-in bundle `@godxjp/ui/styles/fonts` fills these slots with the DXS
165
- * M PLUS 2 face and Noto Sans JP fallback, so the all-in-one entry is zero-config. */
183
+ * The opt-in bundle `@godxjp/ui/styles/fonts` overwrites `--font-sans-base`
184
+ * (and `--font-sans-vi`) with the DXS bundle "M PLUS 2" primary, "Noto Sans JP"
185
+ * as the CJK fallback — so the all-in-one entry is zero-config. That fill also
186
+ * lands on `:root` at THIS specificity, so `styles/fonts` MUST be imported AFTER
187
+ * `styles/base`, or the system stack below silently wins (issue #210). */
166
188
  --font-sans-base:
167
189
  -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, system-ui,
168
190
  sans-serif;
@@ -377,6 +399,13 @@
377
399
  --attention: 25 95% 56%;
378
400
  --attention-foreground: 48 9% 9%;
379
401
 
402
+ /* IDENTITY (dark) — the SAME canonical emerald hue/chroma, lifted 29.6% → 36% lightness so the
403
+ * mark reads off the warm near-black spine (#00b87c: 6.9:1 on --background, 6.3:1 on --card;
404
+ * the unlifted #009766 sat at 4.4:1 on the card). The on-fill glyph flips dark, exactly like
405
+ * --success-foreground does. */
406
+ --brand: 160.5 100% 36%; /* #00b87c */
407
+ --brand-foreground: 48 9% 9%;
408
+
380
409
  /* Extended text hierarchy + interaction ramp (dark) */
381
410
  --text-tertiary: 44 6% 56%;
382
411
  --text-disabled: 45 6% 40%;
@@ -18,6 +18,30 @@
18
18
  --space-inline-md: var(--space-3); /* 12px */
19
19
  --space-inline-lg: var(--space-4); /* 16px */
20
20
 
21
+ /* Master-detail geometry. Consumers choose a semantic rail preset; they never author grid tracks. */
22
+ --master-detail-rail-compact: 18.75rem; /* 300px */
23
+ --master-detail-rail-standard: 20rem; /* 320px */
24
+ --master-detail-gap: var(--space-stack-md);
25
+ /* The collapse threshold: MasterDetail keeps its two-track split while the composition's OWN
26
+ * inline size is at least this wide, and stacks (master then detail) below it. A service theme
27
+ * retunes it once globally; the `collapseBelow` prop overrides it per instance (rule #45).
28
+ * This is a real knob — the layout reads it through the flex-basis threshold, NOT a media
29
+ * query, precisely so a `var()` can drive it (see src/styles/layout.css · .ui-master-detail). */
30
+ --master-detail-collapse-below: 40rem; /* 640px — the `sm` step */
31
+
32
+ /* Bounded master viewport (gh#231). OPT-IN, chosen by the semantic `masterViewport` prop —
33
+ * `auto` (the default) applies NO bound, so every existing composition is unchanged. A real
34
+ * collection can be thousands of pixels tall; when the layout stacks, that pushes the detail
35
+ * far below the fold. The presets cap the collection's BLOCK size and scroll it inside the
36
+ * region instead. Sized as a whole number of nominal collection rows (2.5rem ≈ a compact list
37
+ * row) so a service theme retunes them in the same semantic unit the design grid uses. */
38
+ --master-detail-master-viewport-compact: 20rem; /* 320px — about 8 nominal rows */
39
+ --master-detail-master-viewport-standard: 28rem; /* 448px — about 11 nominal rows */
40
+ /* Focus-ring room INSIDE the bounded region: an overflow container clips both axes, so without
41
+ * an inset the ring of a row at the edge would be cut off (WCAG 2.4.11/2.4.13). Doubles as the
42
+ * scroll-padding so a row scrolled into view never sits flush against the clip edge. */
43
+ --master-detail-master-viewport-inset: var(--space-1); /* 4px */
44
+
21
45
  --space-page-active-x: var(--space-page-x);
22
46
  --space-page-active-y: var(--space-page-y);
23
47
  --space-section-active: var(--space-section);
@@ -26,8 +50,18 @@
26
50
  --space-section-compact: var(--space-4);
27
51
 
28
52
  /* Modal scrim — the single backdrop colour shared by EVERY overlay (Dialog, AlertDialog, Sheet,
29
- * Drawer). Themeable (rule #44) so a service tints the wash to its brand once, e.g. a navy
30
- * `--overlay-background: rgb(12 26 49 / .55)`, instead of forking each overlay. */
53
+ * Drawer, AppShell mobile nav). Themeable (rule #44) so a service tints the wash to its brand
54
+ * once, e.g. a navy `--overlay-background: rgb(12 26 49 / .55)`, instead of forking each overlay.
55
+ *
56
+ * HOW IT REACHES AN OVERLAY (gh#215 — it previously reached NOTHING): each surface declares its
57
+ * own knob `initial` and resolves a SHARE of this colour at the call site,
58
+ * `var(--dialog-overlay-background, color-mix(in srgb, var(--overlay-background)
59
+ * var(--dialog-overlay-alpha), transparent))`. That keeps the calibrated per-surface depth — a
60
+ * slide-in Sheet washes the page more lightly (40%) than a modal Dialog (60%) — while ONE
61
+ * override here retints every backdrop. Per docs/TOKENS.md the knobs must stay `initial`: a
62
+ * `:root` binding would freeze and a scoped `[data-tenant]`/`.dark` override of this token would
63
+ * never reach the overlay. Overlays are portaled, so a tenant scope must also sit on the portal
64
+ * container (see docs/CUSTOMER-THEMING.md). */
31
65
  --overlay-background: rgb(0 0 0 / 0.5);
32
66
 
33
67
  /* Full-bleed rule under the PageContainer header. OFF by default — the title/body
@@ -41,6 +75,29 @@
41
75
  * old fixed 16px pad that left 24 above vs 32 below. */
42
76
  --page-header-pad-bottom: calc(var(--space-page-active-y) - var(--space-section-active));
43
77
 
78
+ /* Inline measure of the header `extra` region while the page header is in `responsive-inline`
79
+ * arrangement (gh#231). Below the 640px step the default arrangement drops `extra` onto its own
80
+ * full-width line under the subtitle; `headerLayout="responsive-inline"` keeps it beside the
81
+ * title band at this measure instead, so a single compact control (a search field, one primary
82
+ * action) stays on the title row at 390px. Unused by the default arrangement, so no existing
83
+ * page moves. 11rem = 176px, i.e. the control ends flush with the compact page gutter. */
84
+ --page-header-extra-measure: 11rem; /* 176px */
85
+
86
+ /* Bounded page MEASURE (gh#245 / gh#247) — the shared inline cap applied to the page HEADER and
87
+ * BODY together, so the header `extra` action ends on the same edge as the body surface (the
88
+ * `variant="narrow"` complaint: it caps only `.ui-page-body`, leaving the header action out at
89
+ * the page edge). Selected by the semantic `measure` prop; `measure="default"` reads NEITHER
90
+ * token, so an existing page is untouched.
91
+ *
92
+ * These are OUTER measures: the page gutters (--space-page-active-x, 24px each side by default)
93
+ * live INSIDE the cap, so the VISIBLE surface is the measure minus both gutters:
94
+ * narrow 42rem = 672px → 624px visible surface (the historical variant="narrow" body width)
95
+ * medium 48rem = 768px → 720px visible surface (the canonical readable/feed measure)
96
+ * Below the cap nothing binds, so a 390px viewport stays fluid at the 16px compact gutter
97
+ * (358px surface). A service theme retunes both in ONE place; never a page-local max-width. */
98
+ --page-measure-narrow: 42rem; /* 672px outer → 624px surface */
99
+ --page-measure-medium: 48rem; /* 768px outer → 720px surface */
100
+
44
101
  /* Responsive page typography is independent from density. Density changes information spacing;
45
102
  * these tokens change only page chrome so mobile keeps readable body text and touch targets. */
46
103
  --page-title-font-size: var(--heading-h1);
@@ -62,3 +119,13 @@
62
119
  * whole system stays in sync (gh feedback: Descriptions was ~0px while FormField was 8px). */
63
120
  --field-label-gap: var(--space-2); /* 8px */
64
121
  }
122
+
123
+ /* Canonical admin collection composition. Services may retune these semantic knobs once. */
124
+ :root {
125
+ --admin-collection-control-height: var(--control-height-default);
126
+ --admin-collection-section-gap: var(--space-stack-md);
127
+ --admin-collection-toolbar-padding-y: 0px;
128
+ --admin-collection-search-measure: 20rem;
129
+ --admin-collection-table-row-height: var(--table-row-height-default);
130
+ --admin-collection-table-cell-padding-y: var(--space-1);
131
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@godxjp/ui",
3
- "version": "18.4.0",
4
- "godxUiMcp": "18.3.0",
3
+ "version": "18.6.0",
4
+ "godxUiMcp": "18.6.0",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.29.1",
7
7
  "pnpm": {
@@ -32,6 +32,7 @@
32
32
  },
33
33
  "./styles": "./dist/styles/index.css",
34
34
  "./styles/*": "./dist/styles/*.css",
35
+ "./theme/*": "./dist/theme/*",
35
36
  "./tokens": "./dist/tokens/base.css",
36
37
  "./admin": {
37
38
  "types": "./dist/components/admin/index.d.ts",
@@ -65,6 +66,10 @@
65
66
  "types": "./dist/components/charts/index.d.ts",
66
67
  "import": "./dist/components/charts/index.js"
67
68
  },
69
+ "./charts/compact-bar-trend": {
70
+ "types": "./dist/components/charts/compact-bar-trend.d.ts",
71
+ "import": "./dist/components/charts/compact-bar-trend.js"
72
+ },
68
73
  "./ui": {
69
74
  "types": "./dist/components/ui/index.d.ts",
70
75
  "import": "./dist/components/ui/index.js"
@@ -109,6 +114,10 @@
109
114
  "types": "./dist/i18n/index.d.ts",
110
115
  "import": "./dist/i18n/index.js"
111
116
  },
117
+ "./email": {
118
+ "types": "./dist/email/index.d.ts",
119
+ "import": "./dist/email/index.js"
120
+ },
112
121
  "./lib/utils": {
113
122
  "types": "./dist/lib/utils.d.ts",
114
123
  "import": "./dist/lib/utils.js"
@@ -286,10 +295,14 @@
286
295
  "format": "prettier --check .",
287
296
  "format:fix": "prettier --write .",
288
297
  "test": "vitest run",
298
+ "test:visual:auth-login": "node scripts/auth-shell-login-visual.mjs",
299
+ "test:visual:topbar-collision": "node scripts/topbar-collision-visual.mjs",
289
300
  "test:watch": "vitest",
290
301
  "test:coverage": "vitest run --coverage",
291
302
  "check:example-imports": "node scripts/check-example-imports.mjs",
292
303
  "check:frame-coverage": "node scripts/frame-coverage.mjs",
304
+ "gen:frame-coverage-ledger": "node scripts/gen-frame-coverage-ledger.mjs",
305
+ "check:frame-coverage-ledger": "node scripts/gen-frame-coverage-ledger.mjs --check && node scripts/check-frame-coverage-ledger.mjs",
293
306
  "check:screen-reader-evidence": "node scripts/check-screen-reader-evidence.mjs",
294
307
  "check:voiceover-capture": "node scripts/check-voiceover-capture.mjs",
295
308
  "check:data-entry-frame-runtime": "node scripts/check-data-entry-frame-runtime.mjs",
@@ -301,14 +314,16 @@
301
314
  "check:display-runtime-evidence": "node scripts/check-display-runtime-evidence.mjs",
302
315
  "check:data-table-pagination-wrap": "node scripts/check-data-table-pagination-wrap.mjs",
303
316
  "check:button-icon-xs": "node scripts/check-button-icon-xs.mjs",
304
- "check:frame-contracts": "pnpm check:component-api-manifest && pnpm audit:component-cases && pnpm check:frame-coverage && pnpm check:screen-reader-evidence && pnpm check:data-entry-owner-source && pnpm check:display-runtime-evidence",
317
+ "check:frame-contracts": "pnpm check:component-api-manifest && pnpm audit:component-cases && pnpm check:frame-coverage && pnpm check:frame-coverage-ledger && pnpm check:screen-reader-evidence && pnpm check:data-entry-owner-source && pnpm check:display-runtime-evidence",
305
318
  "check:final-touch-rtl": "node scripts/check-final-touch-rtl.mjs",
306
319
  "check:frame-runtime": "pnpm check:data-entry-frame-runtime && pnpm check:data-entry-touch-aria && pnpm check:layout-nav-frames && pnpm check:provider-feedback-query-runtime && pnpm check:layout-nav-closure && pnpm check:final-touch-rtl && pnpm check:data-table-pagination-wrap && pnpm check:button-icon-xs",
307
320
  "pretest": "pnpm check:frame-coverage",
308
- "verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:frame-coverage && pnpm test",
309
- "verify:static": "pnpm build && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm check:contrast && pnpm check:visual-audit && pnpm test",
321
+ "verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:frame-coverage && pnpm test",
322
+ "verify:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm check:contrast && pnpm check:visual-audit && pnpm test",
310
323
  "verify:release": "pnpm verify:static && pnpm check:frame-contracts && pnpm check:frame-coverage && pnpm check:frame-axe",
311
324
  "check:mcp-lockstep": "node scripts/check-release-lockstep.mjs",
325
+ "check:release-plan": "node scripts/check-release-command-plan.mjs",
326
+ "check:packed-public-contract": "node scripts/check-packed-public-contract.mjs",
312
327
  "check:mcp-pattern-imports": "node scripts/check-mcp-pattern-imports.mjs",
313
328
  "check:mcp-sync": "node scripts/check-mcp-sync.mjs",
314
329
  "check:mcp-orphans": "node scripts/check-mcp-orphans.mjs",
@@ -323,6 +338,8 @@
323
338
  "check:typography": "node scripts/check-typography.mjs",
324
339
  "gen:component-tokens": "node scripts/gen-component-tokens.mjs",
325
340
  "check:mcp-token-sync": "node scripts/gen-component-tokens.mjs --check",
341
+ "gen:email-tokens": "node scripts/gen-email-tokens.mjs",
342
+ "check:email-token-sync": "node scripts/gen-email-tokens.mjs --check",
326
343
  "check:core-isolation": "node scripts/check-core-isolation.mjs",
327
344
  "check:no-consumer-coupling": "node scripts/check-no-consumer-coupling.mjs",
328
345
  "release": "node scripts/release.mjs",