@godxjp/ui 28.7.0 → 28.9.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 (119) hide show
  1. package/dist/components/data-display/index.d.ts +2 -0
  2. package/dist/components/data-display/index.js +2 -0
  3. package/dist/components/data-display/marquee.d.ts +16 -0
  4. package/dist/components/data-display/marquee.js +155 -0
  5. package/dist/components/general/reveal.d.ts +23 -2
  6. package/dist/components/general/reveal.js +37 -7
  7. package/dist/components/general/typography.d.ts +4 -1
  8. package/dist/components/general/typography.js +14 -1
  9. package/dist/components/layout/affix.d.ts +86 -0
  10. package/dist/components/layout/affix.js +187 -0
  11. package/dist/components/layout/index.d.ts +4 -0
  12. package/dist/components/layout/index.js +4 -0
  13. package/dist/components/layout/legal-document-shell.js +4 -3
  14. package/dist/components/layout/masonry.d.ts +74 -0
  15. package/dist/components/layout/masonry.js +214 -0
  16. package/dist/components/layout/page-container.js +5 -20
  17. package/dist/components/navigation/anchor.d.ts +64 -0
  18. package/dist/components/navigation/anchor.js +284 -0
  19. package/dist/components/navigation/index.d.ts +4 -0
  20. package/dist/components/navigation/index.js +4 -0
  21. package/dist/components/navigation/mega-menu.d.ts +21 -0
  22. package/dist/components/navigation/mega-menu.js +526 -0
  23. package/dist/contracts/measurement.json +1 -1
  24. package/dist/i18n/messages/en.json +517 -0
  25. package/dist/i18n/messages/ja.json +513 -0
  26. package/dist/i18n/messages/vi.json +513 -0
  27. package/dist/lib/hooks.d.ts +68 -0
  28. package/dist/lib/hooks.js +52 -0
  29. package/dist/lib/platform.d.ts +14 -0
  30. package/dist/lib/platform.js +10 -1
  31. package/dist/lib/utils.d.ts +1 -1
  32. package/dist/lib/utils.js +3 -2
  33. package/dist/lib/variants.js +4 -1
  34. package/dist/props/components/data-display.prop.d.ts +95 -1
  35. package/dist/props/components/general.prop.d.ts +47 -3
  36. package/dist/props/components/layout.prop.d.ts +194 -0
  37. package/dist/props/components/navigation.prop.d.ts +263 -0
  38. package/dist/props/registry.d.ts +359 -4
  39. package/dist/props/registry.js +472 -3
  40. package/dist/props/vocabulary/index.d.ts +1 -1
  41. package/dist/props/vocabulary/interaction.prop.d.ts +39 -2
  42. package/dist/props/vocabulary/layout.prop.d.ts +1 -1
  43. package/dist/styles/base.css +47 -14
  44. package/dist/styles/card-layout.css +2 -2
  45. package/dist/styles/chart-layout.css +6 -6
  46. package/dist/styles/control.css +15 -10
  47. package/dist/styles/data-display-layout.css +22 -6
  48. package/dist/styles/density.css +6 -0
  49. package/dist/styles/dialog-layout.css +4 -1
  50. package/dist/styles/focus-ring.css +4 -1
  51. package/dist/styles/layout.css +92 -3
  52. package/dist/styles/motion.css +121 -1
  53. package/dist/styles/navigation-layout.css +397 -1
  54. package/dist/styles/shell-layout.css +28 -21
  55. package/dist/styles/text-layout.css +134 -15
  56. package/dist/tokens/base.css +5 -0
  57. package/dist/tokens/components/activity.css +13 -4
  58. package/dist/tokens/components/affix.css +7 -0
  59. package/dist/tokens/components/anchor.css +17 -0
  60. package/dist/tokens/components/attachments.css +1 -1
  61. package/dist/tokens/components/badge.css +1 -1
  62. package/dist/tokens/components/card.css +28 -7
  63. package/dist/tokens/components/chart.css +4 -1
  64. package/dist/tokens/components/chat-composer.css +4 -1
  65. package/dist/tokens/components/control.css +72 -33
  66. package/dist/tokens/components/conversations.css +4 -1
  67. package/dist/tokens/components/data-display.css +42 -15
  68. package/dist/tokens/components/data-entry.css +8 -2
  69. package/dist/tokens/components/descriptions.css +1 -1
  70. package/dist/tokens/components/feedback.css +8 -5
  71. package/dist/tokens/components/float-button.css +8 -2
  72. package/dist/tokens/components/form.css +1 -1
  73. package/dist/tokens/components/legal-document.css +12 -3
  74. package/dist/tokens/components/logo.css +15 -6
  75. package/dist/tokens/components/marquee.css +7 -0
  76. package/dist/tokens/components/masonry.css +6 -0
  77. package/dist/tokens/components/mega-menu.css +71 -0
  78. package/dist/tokens/components/navigation.css +37 -13
  79. package/dist/tokens/components/segmented.css +4 -1
  80. package/dist/tokens/components/separator.css +4 -1
  81. package/dist/tokens/components/shell.css +99 -31
  82. package/dist/tokens/components/table.css +11 -5
  83. package/dist/tokens/components/thought-chain.css +4 -1
  84. package/dist/tokens/components/toggle.css +4 -1
  85. package/dist/tokens/components/tree.css +1 -1
  86. package/dist/tokens/components/upload.css +21 -9
  87. package/dist/tokens/foundation.css +35 -30
  88. package/dist/tokens/semantic/layout.css +26 -5
  89. package/docs/COMPOSITION-VS-COMPONENT.md +19 -1
  90. package/docs/DESIGN-AUTHORITY.md +99 -18
  91. package/docs/FRAME-COVERAGE-REPORT.md +7 -2
  92. package/docs/TOKENS.md +16 -1
  93. package/docs/data-display/marquee.tsx +254 -0
  94. package/docs/foundation/_theme-editor-scope.ts +222 -0
  95. package/docs/foundation/density.tsx +12 -2
  96. package/docs/foundation/spacing.tsx +5 -0
  97. package/docs/foundation/theme-editor.tsx +645 -0
  98. package/docs/general/activity.tsx +65 -0
  99. package/docs/general/reveal.tsx +290 -22
  100. package/docs/general/typography.tsx +91 -1
  101. package/docs/layout/affix.tsx +209 -0
  102. package/docs/layout/masonry.tsx +291 -0
  103. package/docs/navigation/anchor.tsx +285 -0
  104. package/docs/navigation/mega-menu-panel.tsx +86 -0
  105. package/docs/navigation/mega-menu.tsx +254 -0
  106. package/docs/roadmap/website-components.md +779 -0
  107. package/docs/showcase/acme-website.tsx +75 -39
  108. package/docs/showcase/case4-login.tsx +10 -2
  109. package/docs/showcase/case5-shift-calendar.tsx +1 -1
  110. package/docs/showcase/case6-agency-handy.tsx +6 -6
  111. package/docs/showcase/futurelastic-web.tsx +89 -49
  112. package/docs/showcase/marketing-page.tsx +885 -0
  113. package/docs/showcase/table-expandable-rows.tsx +4 -1
  114. package/docs/showcase/table-footer-totals.tsx +12 -2
  115. package/docs/showcase/theme-customization.tsx +1259 -0
  116. package/package.json +6 -3
  117. package/scripts/brand-accent.generated.mjs +27 -0
  118. package/scripts/ui-audit.mjs +66 -0
  119. package/scripts/visual-audit-rules.mjs +46 -2
@@ -2,9 +2,18 @@
2
2
 
3
3
  :root {
4
4
  --responsive-grid-column-width: 20rem;
5
- --sidebar-section-label-font-size: var(--font-size-2xs);
6
- --sidebar-product-tenant-font-size: var(--font-size-2xs);
7
- --sidebar-badge-font-size: var(--font-size-2xs);
5
+ --sidebar-section-label-font-size: var(
6
+ --font-size-2xs,
7
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
8
+ );
9
+ --sidebar-product-tenant-font-size: var(
10
+ --font-size-2xs,
11
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
12
+ );
13
+ --sidebar-badge-font-size: var(
14
+ --font-size-2xs,
15
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
16
+ );
8
17
 
9
18
  --sidebar-badge-background: initial;
10
19
  --sidebar-badge-foreground: initial;
@@ -23,15 +32,39 @@
23
32
 
24
33
  --topbar-icon-focus-ring-alpha: 1;
25
34
 
26
- --sidebar-user-role-font-size: var(--font-size-2xs);
35
+ --sidebar-user-role-font-size: var(
36
+ --font-size-2xs,
37
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
38
+ );
27
39
  --org-switcher-meta-foreground: var(--muted-foreground);
28
- --sidebar-nav-sub-font-size: var(--font-size-xs);
29
- --sidebar-flyout-title-font-size: var(--font-size-xs);
30
- --topbar-chip-icon-font-size: var(--font-size-2xs);
31
- --kbd-font-size: var(--font-size-2xs);
32
- --sidebar-logo-mark-font-size: var(--font-size-xs);
33
- --sidebar-avatar-font-size: var(--font-size-2xs);
34
- --sidebar-user-name-font-size: var(--font-size-xs);
40
+ --sidebar-nav-sub-font-size: var(
41
+ --font-size-xs,
42
+ calc(var(--font-size-base) / var(--font-size-ratio))
43
+ );
44
+ --sidebar-flyout-title-font-size: var(
45
+ --font-size-xs,
46
+ calc(var(--font-size-base) / var(--font-size-ratio))
47
+ );
48
+ --topbar-chip-icon-font-size: var(
49
+ --font-size-2xs,
50
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
51
+ );
52
+ --kbd-font-size: var(
53
+ --font-size-2xs,
54
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
55
+ );
56
+ --sidebar-logo-mark-font-size: var(
57
+ --font-size-xs,
58
+ calc(var(--font-size-base) / var(--font-size-ratio))
59
+ );
60
+ --sidebar-avatar-font-size: var(
61
+ --font-size-2xs,
62
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
63
+ );
64
+ --sidebar-user-name-font-size: var(
65
+ --font-size-xs,
66
+ calc(var(--font-size-base) / var(--font-size-ratio))
67
+ );
35
68
 
36
69
  --sidebar-gradient: none;
37
70
  --topbar-gradient: none;
@@ -78,7 +111,10 @@
78
111
  --sidebar-brand-mark-size: 1.375rem;
79
112
  --sidebar-nav-item-height: var(--band-height-md);
80
113
 
81
- --sidebar-nav-item-font-size: var(--font-size-xs);
114
+ --sidebar-nav-item-font-size: var(
115
+ --font-size-xs,
116
+ calc(var(--font-size-base) / var(--font-size-ratio))
117
+ );
82
118
 
83
119
  --sidebar-nav-item-line-height: 1.5;
84
120
 
@@ -102,6 +138,9 @@
102
138
  --topbar-inset: 0px;
103
139
  --topbar-gap: var(--space-2);
104
140
 
141
+ --topbar-background-alpha: initial;
142
+ --topbar-backdrop-blur-size: initial;
143
+
105
144
  --topbar-center-compact-display: none;
106
145
 
107
146
  --topbar-item-padding-inline: var(--space-3);
@@ -121,7 +160,10 @@
121
160
  --topbar-item-badge-offset-inline: var(--space-1);
122
161
  --topbar-item-badge-size: 1rem;
123
162
  --topbar-item-badge-padding-inline: var(--space-1);
124
- --topbar-item-badge-font-size: var(--font-size-2xs);
163
+ --topbar-item-badge-font-size: var(
164
+ --font-size-2xs,
165
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
166
+ );
125
167
  --topbar-item-badge-background: initial;
126
168
  --topbar-item-badge-foreground: initial;
127
169
  --topbar-item-badge-destructive-background: initial;
@@ -140,7 +182,10 @@
140
182
  --org-switcher-list-offset: 0px;
141
183
 
142
184
  --org-switcher-legend-space-gap: var(--space-4);
143
- --org-switcher-legend-font-size: var(--font-size-2xs);
185
+ --org-switcher-legend-font-size: var(
186
+ --font-size-2xs,
187
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
188
+ );
144
189
  --org-switcher-hint-space-gap: var(--space-1);
145
190
 
146
191
  --org-switcher-dialog-width: 26rem;
@@ -169,14 +214,20 @@
169
214
  --app-launcher-mark-radius: var(--radius);
170
215
  --app-launcher-mark-background: var(--secondary);
171
216
  --app-launcher-mark-foreground: var(--secondary-foreground);
172
- --app-launcher-mark-font-size: var(--font-size-sm);
173
- --app-launcher-name-font-size: var(--font-size-2xs);
174
- --app-launcher-group-label-font-size: var(--font-size-2xs);
217
+ --app-launcher-mark-font-size: var(--font-size-sm, var(--font-size-base));
218
+ --app-launcher-name-font-size: var(
219
+ --font-size-2xs,
220
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
221
+ );
222
+ --app-launcher-group-label-font-size: var(
223
+ --font-size-2xs,
224
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
225
+ );
175
226
  --app-launcher-group-label-color: var(--muted-foreground);
176
227
  --app-launcher-state-min-height: 8rem;
177
228
 
178
229
  --app-launcher-launchpad-backdrop-background: initial;
179
- --app-launcher-launchpad-backdrop-blur-size: 16px;
230
+ --app-launcher-launchpad-backdrop-blur-size: var(--blur-lg);
180
231
  --app-launcher-launchpad-backdrop-alpha: 55%;
181
232
 
182
233
  --app-launcher-launchpad-backdrop-color-saturate: 180%;
@@ -198,20 +249,22 @@
198
249
  --app-launcher-launchpad-mark-size: 4rem;
199
250
  --app-launcher-launchpad-mark-radius: var(--radius-lg);
200
251
 
201
- --app-launcher-launchpad-mark-background: color-mix(
202
- in srgb,
203
- hsl(var(--card)) 78%,
204
- transparent
205
- );
252
+ --app-launcher-launchpad-mark-background: color-mix(in srgb, hsl(var(--card)) 78%, transparent);
206
253
  --app-launcher-launchpad-mark-border-color: color-mix(
207
254
  in srgb,
208
255
  hsl(var(--foreground)) 14%,
209
256
  transparent
210
257
  );
211
- --app-launcher-launchpad-mark-font-size: var(--font-size-lg);
258
+ --app-launcher-launchpad-mark-font-size: var(
259
+ --font-size-lg,
260
+ calc(var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio))
261
+ );
212
262
  --app-launcher-launchpad-mark-shadow: var(--shadow-lg);
213
- --app-launcher-launchpad-name-font-size: var(--font-size-sm);
214
- --app-launcher-launchpad-title-font-size: var(--font-size-2xs);
263
+ --app-launcher-launchpad-name-font-size: var(--font-size-sm, var(--font-size-base));
264
+ --app-launcher-launchpad-title-font-size: var(
265
+ --font-size-2xs,
266
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
267
+ );
215
268
  --app-launcher-launchpad-title-letter-spacing: 0.08em;
216
269
  --app-launcher-launchpad-close-space-padding: var(--space-2);
217
270
 
@@ -224,7 +277,13 @@
224
277
  --sidebar-item-active-background-alpha: 12%;
225
278
 
226
279
  --auth-shell-control-height: var(--control-height-comfortable);
227
- --auth-shell-heading-size: var(--font-size-2xl);
280
+ --auth-shell-heading-size: var(
281
+ --font-size-2xl,
282
+ calc(
283
+ var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio) *
284
+ var(--font-size-ratio) * var(--font-size-ratio)
285
+ )
286
+ );
228
287
  --auth-shell-card-max-width: 24rem;
229
288
  --auth-shell-bar-padding: var(--space-5) var(--space-6);
230
289
  --auth-shell-main-padding: var(--space-6);
@@ -293,7 +352,10 @@
293
352
  --auth-shell-registration-identity-slot-block-size: 7rem;
294
353
 
295
354
  --auth-shell-divider-gap: 0.625rem;
296
- --auth-shell-divider-label-font-size: var(--font-size-2xs);
355
+ --auth-shell-divider-label-font-size: var(
356
+ --font-size-2xs,
357
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
358
+ );
297
359
  --auth-shell-divider-label-line-height: calc(19 / 11);
298
360
  --auth-shell-divider-rule-color: var(--border);
299
361
  --auth-shell-divider-label-color: var(--muted-foreground);
@@ -307,10 +369,13 @@
307
369
  --auth-account-summary-identity-min-width: 12rem;
308
370
  --auth-account-summary-avatar-size: var(--control-height-sm);
309
371
  --auth-account-summary-avatar-glyph-size: var(--control-icon-size-sm);
310
- --auth-account-summary-email-font-size: var(--font-size-sm);
372
+ --auth-account-summary-email-font-size: var(--font-size-sm, var(--font-size-base));
311
373
  --auth-footer-content-gap: 0.375rem;
312
374
 
313
- --auth-footer-text-font-size: var(--font-size-2xs);
375
+ --auth-footer-text-font-size: var(
376
+ --font-size-2xs,
377
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
378
+ );
314
379
 
315
380
  --auth-footer-target-min-size: var(--touch-target-min);
316
381
  --auth-stack-gap: var(--space-3);
@@ -347,7 +412,10 @@
347
412
  --centered-shell-landing-card-shadow: none;
348
413
 
349
414
  --centered-shell-landing-heading-size: var(--font-size-display);
350
- --centered-shell-landing-heading-size-compact: var(--font-size-3xl);
415
+ --centered-shell-landing-heading-size-compact: var(
416
+ --font-size-3xl,
417
+ calc(var(--font-size-display) / var(--font-size-display-ratio) / var(--font-size-display-ratio))
418
+ );
351
419
 
352
420
  --centered-shell-landing-background: initial;
353
421
  }
@@ -15,7 +15,7 @@
15
15
  --table-pagination-padding-x: initial;
16
16
 
17
17
  --table-surface-min-inline-size: 640px;
18
- --table-head-font-size: var(--font-size-xs);
18
+ --table-head-font-size: var(--font-size-xs, calc(var(--font-size-base) / var(--font-size-ratio)));
19
19
 
20
20
  --table-head-font-weight: var(--font-weight-medium);
21
21
 
@@ -59,7 +59,10 @@
59
59
  --table-action-collection-meta-width-floor: 5rem;
60
60
 
61
61
  --table-action-collection-flex-width-floor: 5rem;
62
- --table-action-collection-font-size-compact: var(--font-size-xs);
62
+ --table-action-collection-font-size-compact: var(
63
+ --font-size-xs,
64
+ calc(var(--font-size-base) / var(--font-size-ratio))
65
+ );
63
66
  --table-action-collection-cell-space-x-compact: var(--space-2);
64
67
  --table-action-collection-cell-padding-y-compact: var(--space-2);
65
68
  --table-action-collection-row-height-compact: var(--table-row-height-compact);
@@ -72,13 +75,16 @@
72
75
  --table-stacked-collection-card-padding-x: var(--space-inline-md);
73
76
  --table-stacked-collection-card-gap: var(--space-stack-sm);
74
77
  --table-stacked-collection-cell-padding-y: var(--space-stack-xs);
75
- --table-stacked-collection-label-font-size: var(--font-size-xs);
78
+ --table-stacked-collection-label-font-size: var(
79
+ --font-size-xs,
80
+ calc(var(--font-size-base) / var(--font-size-ratio))
81
+ );
76
82
 
77
83
  --table-select-column-width: 2.5rem;
78
84
  --table-sort-icon-size: var(--icon-size-xs);
79
85
  --table-toolbar-icon-size: var(--icon-size-md);
80
86
  --table-pagination-icon-size: var(--icon-size-md);
81
- --table-pagination-font-size: var(--font-size-sm);
87
+ --table-pagination-font-size: var(--font-size-sm, var(--font-size-base));
82
88
 
83
89
  --table-skeleton-check-size: 1rem;
84
90
 
@@ -86,7 +92,7 @@
86
92
  --table-skeleton-line-height: var(--table-skeleton-line-block-size);
87
93
  --table-skeleton-radius: var(--radius-sm);
88
94
 
89
- --table-font-size: var(--font-size-sm);
95
+ --table-font-size: var(--font-size-sm, var(--font-size-base));
90
96
 
91
97
  --table-line-height: calc(1.25 / 0.875);
92
98
 
@@ -7,7 +7,10 @@
7
7
  --thought-chain-body-gap: var(--space-1);
8
8
 
9
9
  --thought-chain-icon-size: var(--band-height-sm);
10
- --thought-chain-icon-font-size: var(--font-size-xs);
10
+ --thought-chain-icon-font-size: var(
11
+ --font-size-xs,
12
+ calc(var(--font-size-base) / var(--font-size-ratio))
13
+ );
11
14
  --thought-chain-icon-radius: var(--radius-pill);
12
15
 
13
16
  --thought-chain-icon-background: initial;
@@ -3,7 +3,10 @@
3
3
 
4
4
  --toggle-count-min-width: var(--space-4);
5
5
  --toggle-count-space-inline: var(--space-1);
6
- --toggle-count-font-size: var(--font-size-xs);
6
+ --toggle-count-font-size: var(
7
+ --font-size-xs,
8
+ calc(var(--font-size-base) / var(--font-size-ratio))
9
+ );
7
10
  --toggle-count-radius: var(--radius-pill);
8
11
 
9
12
  --toggle-count-gap: 0;
@@ -9,7 +9,7 @@
9
9
  --tree-node-padding-inline: var(--space-2);
10
10
  --tree-node-gap: var(--space-2);
11
11
  --tree-node-radius: var(--radius-sm);
12
- --tree-node-font-size: var(--font-size-sm);
12
+ --tree-node-font-size: var(--font-size-sm, var(--font-size-base));
13
13
 
14
14
  --tree-switcher-size: 1.25rem;
15
15
 
@@ -7,17 +7,26 @@
7
7
  --upload-dropzone-border-width: var(--stroke-md);
8
8
  --upload-dropzone-icon-size: var(--icon-size-3xl);
9
9
  --upload-dropzone-hint-space-block-start: var(--space-3);
10
- --upload-dropzone-hint-font-size: var(--font-size-sm);
10
+ --upload-dropzone-hint-font-size: var(--font-size-sm, var(--font-size-base));
11
11
  --upload-dropzone-meta-space-block-start: var(--space-1);
12
- --upload-dropzone-meta-font-size: var(--font-size-xs);
12
+ --upload-dropzone-meta-font-size: var(
13
+ --font-size-xs,
14
+ calc(var(--font-size-base) / var(--font-size-ratio))
15
+ );
13
16
 
14
17
  --upload-tile-size: 6rem;
15
18
  --upload-tile-radius: var(--radius-md);
16
19
  --upload-tile-space-gap: var(--space-3);
17
20
  --upload-tile-icon-size: var(--icon-size-xl);
18
21
  --upload-tile-label-space-block-start: var(--space-1);
19
- --upload-tile-label-font-size: var(--font-size-xs);
20
- --upload-tile-overlay-font-size: var(--font-size-xs);
22
+ --upload-tile-label-font-size: var(
23
+ --font-size-xs,
24
+ calc(var(--font-size-base) / var(--font-size-ratio))
25
+ );
26
+ --upload-tile-overlay-font-size: var(
27
+ --font-size-xs,
28
+ calc(var(--font-size-base) / var(--font-size-ratio))
29
+ );
21
30
 
22
31
  --upload-overlay-background: initial;
23
32
  --upload-overlay-alpha: 70%;
@@ -33,14 +42,17 @@
33
42
 
34
43
  --upload-picture-icon-size: var(--icon-size-2xl);
35
44
  --upload-picture-empty-label-space-block-start: var(--space-2);
36
- --upload-picture-empty-label-font-size: var(--font-size-sm);
37
- --upload-picture-overlay-font-size: var(--font-size-sm);
45
+ --upload-picture-empty-label-font-size: var(--font-size-sm, var(--font-size-base));
46
+ --upload-picture-overlay-font-size: var(--font-size-sm, var(--font-size-base));
38
47
 
39
48
  --upload-picture-badge-radius: var(--radius-md);
40
49
  --upload-picture-badge-offset: var(--space-2);
41
50
  --upload-picture-badge-space-inline: var(--space-2);
42
51
  --upload-picture-badge-space-block: 0.125rem;
43
- --upload-picture-badge-font-size: var(--font-size-xs);
52
+ --upload-picture-badge-font-size: var(
53
+ --font-size-xs,
54
+ calc(var(--font-size-base) / var(--font-size-ratio))
55
+ );
44
56
 
45
57
  --upload-avatar-size: 6rem;
46
58
 
@@ -57,14 +69,14 @@
57
69
  --upload-draft-space-block: var(--space-2);
58
70
  --upload-draft-space-gap: var(--space-2);
59
71
  --upload-draft-radius: var(--radius-md);
60
- --upload-draft-font-size: var(--font-size-sm);
72
+ --upload-draft-font-size: var(--font-size-sm, var(--font-size-base));
61
73
  --upload-draft-icon-size: var(--icon-size-sm);
62
74
 
63
75
  --upload-row-space-inline: var(--space-3);
64
76
  --upload-row-space-block: var(--space-2);
65
77
  --upload-row-space-gap: var(--space-3);
66
78
  --upload-row-radius: var(--radius-md);
67
- --upload-row-font-size: var(--font-size-sm);
79
+ --upload-row-font-size: var(--font-size-sm, var(--font-size-base));
68
80
  --upload-row-icon-size: var(--icon-size-md);
69
81
 
70
82
  --upload-crop-dialog-max-width: 24rem;
@@ -146,37 +146,27 @@
146
146
 
147
147
  --font-size-base: 0.875rem;
148
148
  --font-size-ratio: 1.1227;
149
- --font-size-2xs: calc(
150
- var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio)
151
- );
152
- --font-size-xs: calc(var(--font-size-base) / var(--font-size-ratio));
153
- --font-size-sm: var(--font-size-base);
154
- --font-size-lg: calc(
155
- var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio)
156
- );
157
- --font-size-xl: calc(var(--font-size-lg) * var(--font-size-ratio));
158
- --font-size-2xl: calc(var(--font-size-xl) * var(--font-size-ratio));
159
-
160
- --font-size-display: 3.375rem;
149
+
150
+ --font-size-2xs: initial;
151
+ --font-size-xs: initial;
152
+ --font-size-sm: initial;
153
+ --font-size-lg: initial;
154
+ --font-size-xl: initial;
155
+ --font-size-2xl: initial;
156
+
157
+ --font-size-display: clamp(2rem, 1.5rem + 2.5vw, 3.375rem);
161
158
  --font-size-display-ratio: 1.28;
162
- --font-size-3xl: calc(
163
- var(--font-size-display) / var(--font-size-display-ratio) / var(--font-size-display-ratio)
164
- );
165
- --font-size-4xl: calc(
166
- var(--font-size-display) / var(--font-size-display-ratio)
167
- );
168
- --font-size-5xl: var(--font-size-display);
169
-
170
- --heading-h1: calc(
171
- var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio) * var(--font-size-ratio)
172
- );
173
- --heading-h2: calc(
174
- var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio)
175
- );
176
- --heading-h3: var(--font-size-base);
177
- --heading-h4: var(--font-size-xs);
178
-
179
- --heading-h5: var(--font-size-2xs);
159
+
160
+ --font-size-3xl: initial;
161
+ --font-size-4xl: initial;
162
+ --font-size-5xl: initial;
163
+
164
+ --heading-h1: initial;
165
+ --heading-h2: initial;
166
+ --heading-h3: initial;
167
+ --heading-h4: initial;
168
+
169
+ --heading-h5: initial;
180
170
 
181
171
  --font-weight-normal: 400;
182
172
  --font-weight-medium: 500;
@@ -205,6 +195,9 @@
205
195
  --space-10: calc(2.5rem * var(--scaling));
206
196
  --space-12: calc(3rem * var(--scaling));
207
197
 
198
+ --space-20: calc(5rem * var(--scaling));
199
+ --space-24: calc(6rem * var(--scaling));
200
+
208
201
  --icon-size-2xs: 0.625rem;
209
202
  --icon-size-xs: 0.75rem;
210
203
  --icon-size-sm: 0.875rem;
@@ -222,6 +215,10 @@
222
215
  --stroke-xl: 4px;
223
216
  --stroke-2xl: 6px;
224
217
 
218
+ --blur-sm: 4px;
219
+ --blur-md: 8px;
220
+ --blur-lg: 16px;
221
+
225
222
  --band-height-xs: 1.5rem;
226
223
  --band-height-sm: 1.75rem;
227
224
  --band-height-md: 2rem;
@@ -254,6 +251,10 @@
254
251
  --activity-interval: var(--duration-loop);
255
252
 
256
253
  --activity-stagger-step: 160ms;
254
+
255
+ --marquee-interval: 20s;
256
+ --marquee-interval-slow: calc(var(--marquee-interval) * 2);
257
+ --marquee-interval-fast: calc(var(--marquee-interval) / 2);
257
258
  }
258
259
 
259
260
  .ui-scale-fixed {
@@ -267,6 +268,8 @@
267
268
  --space-8: 2rem;
268
269
  --space-10: 2.5rem;
269
270
  --space-12: 3rem;
271
+ --space-20: 5rem;
272
+ --space-24: 6rem;
270
273
  --radius: 0.375rem;
271
274
  --control-height: var(--control-height-default);
272
275
 
@@ -289,6 +292,8 @@
289
292
  --space-page-x: var(--space-6);
290
293
  --space-page-y: var(--space-6);
291
294
  --space-section: var(--space-4);
295
+ --space-section-band: var(--space-20);
296
+ --space-section-hero: var(--space-24);
292
297
  --space-stack-xs: var(--space-1);
293
298
  --space-stack-sm: var(--space-2);
294
299
  --space-stack-md: var(--space-4);
@@ -5,6 +5,9 @@
5
5
  --space-page-x: var(--space-6);
6
6
  --space-page-y: var(--space-6);
7
7
  --space-section: var(--space-4);
8
+
9
+ --space-section-band: var(--space-20);
10
+ --space-section-hero: var(--space-24);
8
11
  --space-stack-xs: var(--space-1);
9
12
  --space-stack-sm: var(--space-2);
10
13
  --space-stack-md: var(--space-4);
@@ -15,8 +18,12 @@
15
18
  --space-inline-md: var(--space-3);
16
19
  --space-inline-lg: var(--space-4);
17
20
 
21
+ --space-inline-xl: var(--space-6);
22
+
18
23
  --overlay-z-index: 50;
19
24
 
25
+ --sticky-z-index: 20;
26
+
20
27
  --master-detail-rail-compact: 18.75rem;
21
28
  --master-detail-rail-narrow: 12rem;
22
29
  --master-detail-rail-wide: 24rem;
@@ -64,14 +71,28 @@
64
71
  --page-measure-narrow: 42rem;
65
72
  --page-measure-medium: 48rem;
66
73
 
67
- --page-title-font-size: var(--heading-h1);
68
- --page-title-font-size-compact: var(--heading-h2);
74
+ --page-measure-wide: 72rem;
75
+
76
+ --page-title-font-size: var(
77
+ --heading-h1,
78
+ calc(
79
+ var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio) *
80
+ var(--font-size-ratio)
81
+ )
82
+ );
83
+ --page-title-font-size-compact: var(
84
+ --heading-h2,
85
+ calc(var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio))
86
+ );
69
87
  --page-subtitle-font-size: var(--font-size-base);
70
- --page-subtitle-font-size-compact: var(--font-size-sm);
88
+ --page-subtitle-font-size-compact: var(--font-size-sm, var(--font-size-base));
71
89
 
72
- --page-title-font-size-chrome: var(--heading-h3);
90
+ --page-title-font-size-chrome: var(--heading-h3, var(--font-size-base));
73
91
 
74
- --page-subtitle-font-size-chrome: var(--font-size-2xs);
92
+ --page-subtitle-font-size-chrome: var(
93
+ --font-size-2xs,
94
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
95
+ );
75
96
 
76
97
  --page-pad-block-start-chrome: 0px;
77
98
 
@@ -77,7 +77,8 @@ new UI need
77
77
  | `Select` (incl. search/async) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | **Framework component** |
78
78
  | `DataTable`, `Dialog`, `Calendar`, `Switch`, `Combobox` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | **Framework component** |
79
79
  | `StatCard` (+ `icon`) | ✅ | ➖ | ✅ | ✅ | ✅ | ✅ | ✅ | **Framework component** (a reusable KPI tile with a stable API + tokens) |
80
- | `ServiceLauncherCard` | ➖ | ❌ | ❌ | ✅ | ✅ | ➖ | ➖ | **Composition by the test — RETAINED as a recorded exception** (gh#814) |
80
+ | `ServiceLauncherCard` | ➖ | ❌ | ❌ | ✅ | ✅ | ➖ | ➖ | **Composition by the test — RETAINED as a recorded exception** (gh#814) |
81
+ | `MegaMenu` | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ➖ | **Framework component** — the instructive contrast with Hero, below |
81
82
  | Marketing **Hero** | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | **Composition** — section, static, composable, brand-specific |
82
83
  | **Navbar** / **Footer** | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | **Composition** — layout of `Text`/`Button`/`Flex` |
83
84
  | **PricingTable** / feature grid | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | **Composition** — `ResponsiveGrid` + `Card` |
@@ -86,6 +87,23 @@ new UI need
86
87
 
87
88
  `✅ pass · ❌ fail · ➖ borderline`. **StatCard** is the instructive borderline: C2 is weak (it owns little behavior), but it is a universal KPI tile with a controlled API, fully tokenized, broadly reused — so it earns its place. A **Hero** fails six of seven; it is unambiguously a composition.
88
89
 
90
+ **MegaMenu is the instructive PASS, and it is in this table because it sits next to Navbar.** A
91
+ Navbar fails every criterion; a megamenu is the same bar with behaviour bolted through it, and that
92
+ one difference flips the verdict. **C2** is the whole case: a roving tabindex across the top-level
93
+ items, `aria-expanded`/`aria-controls` per trigger, hover intent (a diagonal pointer path toward the
94
+ panel must not close it), `Escape` closing and returning focus to its trigger, Tab-out and
95
+ outside-click closing, and close-on-route-change. None of that is layout. **C3** is the one people
96
+ get wrong: `DropdownMenu` looks like the answer and is the WRONG primitive, not an awkward one — it
97
+ is react-aria-components `Menu`, i.e. `role="menu"` / `role="menuitem"`, which announces a set of
98
+ site links as a desktop application menu and takes Tab out of the widget. The APG says so itself in
99
+ its Disclosure Navigation example. A recipe over `DropdownMenu` would therefore ship the classic
100
+ megamenu accessibility defect, which is exactly the case C3 is asking about. **C7 is the weak
101
+ one** — marked ➖ deliberately: this is a JP business-software library, and a marketing megamenu is
102
+ not in every consumer's build. It is kept because the same disclosure bar is what an admin console
103
+ with several product areas needs, and because the cost is one file with no new dependency (no
104
+ `@radix-ui/react-navigation-menu`, no animation runtime). Compare `StatCard`, whose borderline is
105
+ C2 rather than C7.
106
+
89
107
  **ServiceLauncherCard is the ONE recorded exception, and it is recorded so that it stays one.** It shipped before the test was run against it, and when the test was run it came back with two hard FAILs: **C2** — no state, no keyboard handling, no focus management, its only ARIA three static attributes — and **C3** — its own imports are `Card` + `CardContent` + `Badge` + a Lucide glyph, so "could I build this right now from primitives?" is yes. By §2 that makes it a composition pattern. It is kept anyway because `src/components/layout/app-launcher.tsx` consumes it: it is an internal building block of a component that **does** pass, so the question was never "should it exist" but "should it be PUBLIC", and removing a public export is breaking. Keeping it public was the cheaper call and the ledger lives on gh#814 and at the top of `src/components/data-display/service-launcher-card.tsx`. **Consumers should compose `Card` + `Badge` for a service tile** — reach for `ServiceLauncherCard` only to match `AppLauncher`'s own tiles — and this row is not precedent for adding another static tile to `src/components/`.
90
108
 
91
109
  ---