@tailor-platform/app-shell 1.16.0 → 1.18.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 (45) hide show
  1. package/dist/app-shell-core.css +1 -1
  2. package/dist/app-shell.d.ts +762 -51
  3. package/dist/app-shell.js +7642 -5636
  4. package/dist/{appshell-B0wh5Lq0.js → appshell-Y1AYCuVJ.js} +323 -304
  5. package/dist/semantic-contrast.test.ts +227 -0
  6. package/dist/style-entry.d.ts +61 -26
  7. package/dist/testing.d.ts +66 -29
  8. package/dist/testing.js +1 -1
  9. package/dist/theme-bridge.test.ts +124 -1
  10. package/dist/theme.bridge.css +178 -0
  11. package/dist/theme.css +8 -2
  12. package/dist/themes/_template.css +8 -3
  13. package/dist/themes/bloom.css +0 -8
  14. package/dist/themes/cream.css +0 -8
  15. package/dist/themes/default.css +458 -103
  16. package/dist/vite-plugin.d.ts +61 -26
  17. package/package.json +2 -2
  18. package/skills/app-shell-patterns/SKILL.md +48 -37
  19. package/skills/app-shell-patterns/references/api/define-i18n-labels.md +123 -91
  20. package/skills/app-shell-patterns/references/api/define-module.md +4 -6
  21. package/skills/app-shell-patterns/references/api/define-resource.md +2 -2
  22. package/skills/app-shell-patterns/references/api/use-app-shell-config.md +53 -47
  23. package/skills/app-shell-patterns/references/api/use-app-shell-data.md +30 -26
  24. package/skills/app-shell-patterns/references/api/use-app-shell.md +37 -30
  25. package/skills/app-shell-patterns/references/api/use-toast.md +28 -31
  26. package/skills/app-shell-patterns/references/components/app-shell.md +4 -4
  27. package/skills/app-shell-patterns/references/components/card.md +79 -7
  28. package/skills/app-shell-patterns/references/components/data-table.md +599 -77
  29. package/skills/app-shell-patterns/references/components/date-picker.md +32 -21
  30. package/skills/app-shell-patterns/references/components/filter-rail.md +165 -0
  31. package/skills/app-shell-patterns/references/components/sidebar-group.md +12 -6
  32. package/skills/app-shell-patterns/references/components/sidebar-section.md +114 -0
  33. package/skills/app-shell-patterns/references/components/text.md +198 -0
  34. package/skills/app-shell-patterns/references/concepts/custom-components.md +1 -1
  35. package/skills/app-shell-patterns/references/concepts/file-based-routing.md +7 -1
  36. package/skills/app-shell-patterns/references/concepts/graphql.md +20 -14
  37. package/skills/app-shell-patterns/references/concepts/routing-navigation.md +41 -3
  38. package/skills/app-shell-patterns/references/concepts/sidebar-navigation.md +32 -0
  39. package/skills/app-shell-patterns/references/concepts/styling-theming.md +278 -65
  40. package/skills/app-shell-patterns/references/migrations.md +43 -1
  41. package/skills/app-shell-patterns/references/pages/document-detail.md +6 -6
  42. package/skills/app-shell-patterns/references/patterns/form-modal.md +26 -20
  43. package/skills/app-shell-patterns/references/patterns/i18n-labels.md +139 -0
  44. package/skills/app-shell-patterns/references/patterns/interaction-multi-select.md +129 -118
  45. package/skills/app-shell-patterns/references/patterns/list-dense-scan.md +5 -4
@@ -8,12 +8,12 @@
8
8
  color-scheme: light;
9
9
 
10
10
  /* ── 1. BRAND ─────────────────────────────────────────────────────────── */
11
- --primary: rgba(23, 23, 23, 1);
12
- --primary-foreground: rgba(250, 250, 250, 1);
13
- --secondary: rgba(245, 245, 245, 1);
14
- --secondary-foreground: rgba(23, 23, 23, 1);
11
+ --primary: var(--primitive-gray-900);
12
+ --primary-foreground: var(--primitive-gray-50);
13
+ --secondary: var(--primitive-gray-100);
14
+ --secondary-foreground: var(--primitive-gray-900);
15
15
  --accent: rgb(237, 237, 237);
16
- --accent-foreground: rgba(10, 10, 10, 1);
16
+ --accent-foreground: var(--primitive-gray-950);
17
17
 
18
18
  /* ── 2. SHELL GRADIENT — not used (flat palette) ──────────────────────── */
19
19
 
@@ -24,25 +24,26 @@
24
24
  --sidebar-accent: var(--accent);
25
25
  --sidebar-accent-foreground: var(--accent-foreground);
26
26
  --sidebar-ring: var(--ring);
27
+ --backdrop: var(--primitive-black-a7);
27
28
 
28
29
  /* ── 4. SYSTEM ────────────────────────────────────────────────────────── */
29
- --background: rgba(250, 250, 250, 1);
30
- --foreground: rgba(10, 10, 10, 1);
31
- --card: rgba(255, 255, 255, 1);
32
- --card-foreground: rgba(10, 10, 10, 1);
33
- --popover: rgba(255, 255, 255, 1);
34
- --popover-foreground: rgba(10, 10, 10, 1);
35
- --muted: rgba(245, 245, 245, 1);
36
- --muted-foreground: rgba(115, 115, 115, 1);
37
- --border: rgba(229, 229, 229, 1);
38
- --input: rgba(229, 229, 229, 1);
39
- --sidebar: rgba(250, 250, 250, 1);
40
- --sidebar-foreground: rgba(10, 10, 10, 1);
41
- --sidebar-border: rgba(229, 229, 229, 1);
30
+ --background: var(--primitive-gray-50);
31
+ --foreground: var(--primitive-gray-950);
32
+ --card: var(--primitive-white);
33
+ --card-foreground: var(--primitive-gray-950);
34
+ --popover: var(--primitive-white);
35
+ --popover-foreground: var(--primitive-gray-950);
36
+ --muted: var(--primitive-gray-100);
37
+ --muted-foreground: var(--primitive-gray-500);
38
+ --border: var(--primitive-gray-200);
39
+ --input: var(--primitive-gray-200);
40
+ --sidebar: var(--primitive-gray-50);
41
+ --sidebar-foreground: var(--primitive-gray-950);
42
+ --sidebar-border: var(--primitive-gray-200);
42
43
 
43
44
  /* ── 5. PALETTE ───────────────────────────────────────────────────────── */
44
- --destructive: rgba(220, 38, 38, 1);
45
- --destructive-foreground: rgba(254, 242, 242, 1);
45
+ --destructive: var(--danger-solid);
46
+ --destructive-foreground: var(--danger-contrast);
46
47
  --radius: 0.625rem;
47
48
  --chart-1: rgba(234, 88, 12, 1);
48
49
  --chart-2: rgba(13, 148, 136, 1);
@@ -53,81 +54,43 @@
53
54
  --semantic-shadow-sm: 0 1px 3px 0 rgb(15 23 42 / 0.08), 0 1px 2px -1px rgb(15 23 42 / 0.08);
54
55
  --semantic-shadow-md: 0 4px 6px -1px rgb(15 23 42 / 0.09), 0 2px 4px -2px rgb(15 23 42 / 0.06);
55
56
  --semantic-shadow-lg: 0 10px 15px -3px rgb(15 23 42 / 0.12), 0 4px 6px -4px rgb(15 23 42 / 0.09);
56
-
57
- /* ── 6. SEMANTIC — product-wide; inherited by all palettes, do not override */
58
- --status-default: #737373;
59
- --status-neutral: #0ea5e9;
60
- --status-completed: #22c55e;
61
- --status-attention: #f59e0b;
62
- --status-danger: #ef4444;
63
- --alert-neutral-background: var(--muted);
64
- --alert-neutral-foreground: var(--foreground);
65
- --alert-neutral-foreground-muted: var(--muted-foreground);
66
- --alert-neutral-border: var(--border);
67
- --alert-success-foreground: #15803d;
68
- --alert-success-foreground-muted: color-mix(
69
- in srgb,
70
- var(--alert-success-foreground) 80%,
71
- transparent
72
- );
73
- --alert-success-background: color-mix(in srgb, #22c55e 10%, transparent);
74
- --alert-success-border: color-mix(in srgb, #22c55e 20%, transparent);
75
- --alert-warning-foreground: #a16207;
76
- --alert-warning-foreground-muted: color-mix(
77
- in srgb,
78
- var(--alert-warning-foreground) 80%,
79
- transparent
80
- );
81
- --alert-warning-background: color-mix(in srgb, #eab308 10%, transparent);
82
- --alert-warning-border: color-mix(in srgb, #eab308 20%, transparent);
83
- --alert-error-foreground: var(--destructive);
84
- --alert-error-foreground-muted: color-mix(
85
- in srgb,
86
- var(--alert-error-foreground) 80%,
87
- transparent
88
- );
89
- --alert-error-background: color-mix(in srgb, var(--destructive) 10%, transparent);
90
- --alert-error-border: color-mix(in srgb, var(--destructive) 20%, transparent);
91
- --alert-info-foreground: #1d4ed8;
92
- --alert-info-foreground-muted: color-mix(in srgb, var(--alert-info-foreground) 80%, transparent);
93
- --alert-info-background: color-mix(in srgb, #3b82f6 10%, transparent);
94
- --alert-info-border: color-mix(in srgb, #3b82f6 20%, transparent);
95
57
  }
96
58
 
97
59
  /*
98
- * Dark variant. Overrides BRAND + SYSTEM (+ semantic foregrounds that differ).
99
- * Shared aliases/ring re-resolve when BRAND changes; `--radius` and `--status-*`
100
- * inherit from the light block.
60
+ * Dark variant. Overrides BRAND + SYSTEM + PALETTE. The primitive scales (6),
61
+ * the semantic roles (7) and the typography roles (8) follow below. Shared
62
+ * aliases/ring re-resolve when BRAND changes; `--radius` inherits from the
63
+ * light block.
101
64
  */
102
65
  .dark {
103
66
  color-scheme: dark;
104
67
 
105
68
  /* ── 1. BRAND (dark) ──────────────────────────────────────────────────── */
106
- --primary: rgba(229, 229, 229, 1);
107
- --primary-foreground: rgba(23, 23, 23, 1);
108
- --secondary: rgba(38, 38, 38, 1);
109
- --secondary-foreground: rgba(250, 250, 250, 1);
69
+ --primary: var(--primitive-gray-200);
70
+ --primary-foreground: var(--primitive-gray-900);
71
+ --secondary: var(--primitive-gray-800);
72
+ --secondary-foreground: var(--primitive-gray-50);
110
73
  --accent: rgb(48, 48, 48);
111
- --accent-foreground: rgba(250, 250, 250, 1);
74
+ --accent-foreground: var(--primitive-gray-50);
112
75
 
113
76
  /* ── 4. SYSTEM (dark) ─────────────────────────────────────────────────── */
114
- --background: rgba(10, 10, 10, 1);
115
- --foreground: rgba(250, 250, 250, 1);
116
- --card: rgba(23, 23, 23, 1);
117
- --card-foreground: rgba(250, 250, 250, 1);
118
- --popover: rgba(38, 38, 38, 1);
119
- --popover-foreground: rgba(250, 250, 250, 1);
120
- --muted: rgba(38, 38, 38, 1);
121
- --muted-foreground: rgba(163, 163, 163, 1);
122
- --border: rgba(255, 255, 255, 0.1);
123
- --input: rgba(255, 255, 255, 0.15);
124
- --sidebar: rgba(10, 10, 10, 1);
125
- --sidebar-foreground: rgba(250, 250, 250, 1);
126
- --sidebar-border: rgba(255, 255, 255, 0.1);
77
+ --background: var(--primitive-gray-950);
78
+ --foreground: var(--primitive-gray-50);
79
+ --card: var(--primitive-gray-900);
80
+ --card-foreground: var(--primitive-gray-50);
81
+ --popover: var(--primitive-gray-800);
82
+ --popover-foreground: var(--primitive-gray-50);
83
+ --muted: var(--primitive-gray-800);
84
+ --muted-foreground: var(--primitive-gray-400);
85
+ --border: var(--primitive-white-a2);
86
+ --input: var(--primitive-white-a3);
87
+ --sidebar: var(--primitive-gray-950);
88
+ --sidebar-foreground: var(--primitive-gray-50);
89
+ --sidebar-border: var(--primitive-white-a2);
127
90
 
128
91
  /* ── 5. PALETTE (dark) ────────────────────────────────────────────────── */
129
- --destructive: rgba(248, 113, 113, 1);
130
- --destructive-foreground: rgba(254, 242, 242, 1);
92
+ --destructive: var(--danger-solid);
93
+ --destructive-foreground: var(--danger-contrast);
131
94
  --chart-1: rgba(29, 78, 216, 1);
132
95
  --chart-2: rgba(16, 185, 129, 1);
133
96
  --chart-3: rgba(245, 158, 11, 1);
@@ -137,26 +100,418 @@
137
100
  --semantic-shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.38), 0 1px 2px -1px rgb(0 0 0 / 0.32);
138
101
  --semantic-shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.35), 0 2px 4px -2px rgb(0 0 0 / 0.28);
139
102
  --semantic-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.42), 0 4px 6px -4px rgb(0 0 0 / 0.35);
103
+ }
104
+
105
+ /*
106
+ * 6. PRIMITIVE SCALES — internal; consumers use the semantic roles (7) below.
107
+ *
108
+ * One gray scale and four Radix-style 12-step + alpha hue scales, light then
109
+ * dark. Names are prefixed to avoid colliding with a consumer's own copy of
110
+ * Radix Colors. Not bridged to Tailwind. See decisions/semantic-color-roles.md
111
+ * for how they were made. The hue "alpha" steps are translucent only where the
112
+ * generator could express them; some light steps (for example amber a2-a6)
113
+ * resolve to opaque hex.
114
+ *
115
+ * Gray is the Tailwind `neutral` family (the values this palette already used)
116
+ * and is the same in both modes, so it is declared once. White and the white /
117
+ * black alpha scales are declared with it. The BRAND (1) and SYSTEM (4) tokens
118
+ * of this palette read these scales. Other palettes still set their own
119
+ * literal values; the scales are not a theme input yet. `--accent` and the
120
+ * shadows have no step and stay literal.
121
+ */
122
+ :root {
123
+ /* gray — both modes */
124
+ --primitive-gray-50: #fafafa;
125
+ --primitive-gray-100: #f5f5f5;
126
+ --primitive-gray-200: #e5e5e5;
127
+ --primitive-gray-300: #d4d4d4;
128
+ --primitive-gray-400: #a3a3a3;
129
+ --primitive-gray-500: #737373;
130
+ --primitive-gray-600: #525252;
131
+ --primitive-gray-700: #404040;
132
+ --primitive-gray-800: #262626;
133
+ --primitive-gray-900: #171717;
134
+ --primitive-gray-950: #0a0a0a;
135
+
136
+ /* white, and white / black alpha — both modes (Radix whiteA / blackA) */
137
+ --primitive-white: #ffffff;
138
+ --primitive-white-a1: rgba(255, 255, 255, 0.05);
139
+ --primitive-white-a2: rgba(255, 255, 255, 0.1);
140
+ --primitive-white-a3: rgba(255, 255, 255, 0.15);
141
+ --primitive-white-a4: rgba(255, 255, 255, 0.2);
142
+ --primitive-white-a5: rgba(255, 255, 255, 0.3);
143
+ --primitive-white-a6: rgba(255, 255, 255, 0.4);
144
+ --primitive-white-a7: rgba(255, 255, 255, 0.5);
145
+ --primitive-white-a8: rgba(255, 255, 255, 0.6);
146
+ --primitive-white-a9: rgba(255, 255, 255, 0.7);
147
+ --primitive-white-a10: rgba(255, 255, 255, 0.8);
148
+ --primitive-white-a11: rgba(255, 255, 255, 0.9);
149
+ --primitive-white-a12: rgba(255, 255, 255, 0.95);
150
+ --primitive-black-a1: rgba(0, 0, 0, 0.05);
151
+ --primitive-black-a2: rgba(0, 0, 0, 0.1);
152
+ --primitive-black-a3: rgba(0, 0, 0, 0.15);
153
+ --primitive-black-a4: rgba(0, 0, 0, 0.2);
154
+ --primitive-black-a5: rgba(0, 0, 0, 0.3);
155
+ --primitive-black-a6: rgba(0, 0, 0, 0.4);
156
+ --primitive-black-a7: rgba(0, 0, 0, 0.5);
157
+ --primitive-black-a8: rgba(0, 0, 0, 0.6);
158
+ --primitive-black-a9: rgba(0, 0, 0, 0.7);
159
+ --primitive-black-a10: rgba(0, 0, 0, 0.8);
160
+ --primitive-black-a11: rgba(0, 0, 0, 0.9);
161
+ --primitive-black-a12: rgba(0, 0, 0, 0.95);
162
+
163
+ /* hues — light */
164
+ --primitive-blue-1: #f7f8f9;
165
+ --primitive-blue-2: #f0f4fa;
166
+ --primitive-blue-3: #e5ecf9;
167
+ --primitive-blue-4: #d6e4fd;
168
+ --primitive-blue-5: #c5d9ff;
169
+ --primitive-blue-6: #b0cbff;
170
+ --primitive-blue-7: #98b9f7;
171
+ --primitive-blue-8: #769ff0;
172
+ --primitive-blue-9: #2563eb;
173
+ --primitive-blue-10: #2057d1;
174
+ --primitive-blue-11: #1e55cf;
175
+ --primitive-blue-12: #152e63;
176
+ --primitive-blue-a1: #3b7bbb04;
177
+ --primitive-blue-a2: #136ffa0b;
178
+ --primitive-blue-a3: #0758ef16;
179
+ --primitive-blue-a4: #bed6ff99;
180
+ --primitive-blue-a5: #c5d9ff;
181
+ --primitive-blue-a6: #b0cbff;
182
+ --primitive-blue-a7: #0155f364;
183
+ --primitive-blue-a8: #004ee787;
184
+ --primitive-blue-a9: #014ae9da;
185
+ --primitive-blue-a10: #0140ccdf;
186
+ --primitive-blue-a11: #013fcae1;
187
+ --primitive-blue-a12: #001b55ea;
188
+ --primitive-blue-contrast: #ffffff;
189
+
190
+ --primitive-green-1: #f5f9f6;
191
+ --primitive-green-2: #eff5f0;
192
+ --primitive-green-3: #e1f1e3;
193
+ --primitive-green-4: #d1ead5;
194
+ --primitive-green-5: #bfe2c5;
195
+ --primitive-green-6: #a7d7b0;
196
+ --primitive-green-7: #88c895;
197
+ --primitive-green-8: #57b36f;
198
+ --primitive-green-9: #15803d;
199
+ --primitive-green-10: #00722f;
200
+ --primitive-green-11: #047936;
201
+ --primitive-green-12: #1e3c25;
202
+ --primitive-green-a1: #26d05006;
203
+ --primitive-green-a2: #1190260c;
204
+ --primitive-green-a3: #04a1181a;
205
+ --primitive-green-a4: #02991a2a;
206
+ --primitive-green-a5: #04961d3d;
207
+ --primitive-green-a6: #01911c55;
208
+ --primitive-green-a7: #028e1e75;
209
+ --primitive-green-a8: #028e26a7;
210
+ --primitive-green-a9: #00752cea;
211
+ --primitive-green-a10: #00722f;
212
+ --primitive-green-a11: #007733fb;
213
+ --primitive-green-a12: #012309e1;
214
+ --primitive-green-contrast: #ffffff;
215
+
216
+ --primitive-amber-1: #f9f7f5;
217
+ --primitive-amber-2: #fff2e1;
218
+ --primitive-amber-3: #ffe7bd;
219
+ --primitive-amber-4: #ffdca5;
220
+ --primitive-amber-5: #ffd089;
221
+ --primitive-amber-6: #ffbe5d;
222
+ --primitive-amber-7: #f8ad4a;
223
+ --primitive-amber-8: #e99300;
224
+ --primitive-amber-9: #f59e0b;
225
+ --primitive-amber-10: #e99300;
226
+ --primitive-amber-11: #a35f00;
227
+ --primitive-amber-12: #4f3515;
228
+ --primitive-amber-a1: #d07b2606;
229
+ --primitive-amber-a2: #fff2e1;
230
+ --primitive-amber-a3: #ffe7bd;
231
+ --primitive-amber-a4: #ffdca5;
232
+ --primitive-amber-a5: #ffd089;
233
+ --primitive-amber-a6: #ffbe5d;
234
+ --primitive-amber-a7: #f78c00b4;
235
+ --primitive-amber-a8: #e99300;
236
+ --primitive-amber-a9: #f59a00f4;
237
+ --primitive-amber-a10: #e99300;
238
+ --primitive-amber-a11: #a35f00;
239
+ --primitive-amber-a12: #3f2300ea;
240
+ --primitive-amber-contrast: #4f3515;
241
+
242
+ --primitive-red-1: #faf7f6;
243
+ --primitive-red-2: #f9f2f1;
244
+ --primitive-red-3: #f9e5e2;
245
+ --primitive-red-4: #ffd4ce;
246
+ --primitive-red-5: #ffc5bd;
247
+ --primitive-red-6: #f9b4ab;
248
+ --primitive-red-7: #f19f95;
249
+ --primitive-red-8: #e88479;
250
+ --primitive-red-9: #dc2626;
251
+ --primitive-red-10: #cc0615;
252
+ --primitive-red-11: #ce0c17;
253
+ --primitive-red-12: #641c18;
254
+ --primitive-red-a1: #fb622f05;
255
+ --primitive-red-a2: #e12e150a;
256
+ --primitive-red-a3: #f0240619;
257
+ --primitive-red-a4: #ffd4ce;
258
+ --primitive-red-a5: #ffc5bd;
259
+ --primitive-red-a6: #f71d0151;
260
+ --primitive-red-a7: #e41b0368;
261
+ --primitive-red-a8: #d7160084;
262
+ --primitive-red-a9: #d70101d9;
263
+ --primitive-red-a10: #cb000ff9;
264
+ --primitive-red-a11: #cc000cf3;
265
+ --primitive-red-a12: #540400e7;
266
+ --primitive-red-contrast: #ffffff;
267
+ }
268
+
269
+ .dark {
270
+ /* hues — dark */
271
+ --primitive-blue-1: #050a16;
272
+ --primitive-blue-2: #0e1626;
273
+ --primitive-blue-3: #11244c;
274
+ --primitive-blue-4: #132e66;
275
+ --primitive-blue-5: #1a397a;
276
+ --primitive-blue-6: #22448b;
277
+ --primitive-blue-7: #2b509f;
278
+ --primitive-blue-8: #325ebb;
279
+ --primitive-blue-9: #2563eb;
280
+ --primitive-blue-10: #315dba;
281
+ --primitive-blue-11: #88b5ff;
282
+ --primitive-blue-12: #d1e2ff;
283
+ --primitive-blue-a1: #000af60d;
284
+ --primitive-blue-a2: #2c70f81e;
285
+ --primitive-blue-a3: #246bfe45;
286
+ --primitive-blue-a4: #226aff60;
287
+ --primitive-blue-a5: #2d71ff75;
288
+ --primitive-blue-a6: #3777fe87;
289
+ --primitive-blue-a7: #407dfe9c;
290
+ --primitive-blue-a8: #417efeb9;
291
+ --primitive-blue-a9: #276afeeb;
292
+ --primitive-blue-a10: #407dfeb8;
293
+ --primitive-blue-a11: #88b5ff;
294
+ --primitive-blue-a12: #d1e2ff;
295
+ --primitive-blue-contrast: #ffffff;
296
+
297
+ --primitive-green-1: #050c06;
298
+ --primitive-green-2: #101a12;
299
+ --primitive-green-3: #152b1a;
300
+ --primitive-green-4: #0f3c1d;
301
+ --primitive-green-5: #124b24;
302
+ --primitive-green-6: #155b2c;
303
+ --primitive-green-7: #166c34;
304
+ --primitive-green-8: #137f3c;
305
+ --primitive-green-9: #15803d;
306
+ --primitive-green-10: #1b6f37;
307
+ --primitive-green-11: #71d088;
308
+ --primitive-green-12: #acf7bb;
309
+ --primitive-green-a1: #00b40003;
310
+ --primitive-green-a2: #64fa8211;
311
+ --primitive-green-a3: #5bfb7f23;
312
+ --primitive-green-a4: #23fb6635;
313
+ --primitive-green-a5: #28fe6c44;
314
+ --primitive-green-a6: #2bfd7055;
315
+ --primitive-green-a7: #28ff7366;
316
+ --primitive-green-a8: #1dff737a;
317
+ --primitive-green-a9: #21ff747b;
318
+ --primitive-green-a10: #33fd776a;
319
+ --primitive-green-a11: #89fea5cf;
320
+ --primitive-green-a12: #b2ffc1f7;
321
+ --primitive-green-contrast: #ffffff;
322
+
323
+ --primitive-amber-1: #0d0906;
324
+ --primitive-amber-2: #1c150e;
325
+ --primitive-amber-3: #2f1f0c;
326
+ --primitive-amber-4: #412500;
327
+ --primitive-amber-5: #4e2e00;
328
+ --primitive-amber-6: #5d3c0f;
329
+ --primitive-amber-7: #724d1e;
330
+ --primitive-amber-8: #926426;
331
+ --primitive-amber-9: #f59e0b;
332
+ --primitive-amber-10: #e99300;
333
+ --primitive-amber-11: #fbb050;
334
+ --primitive-amber-12: #fde2c4;
335
+ --primitive-amber-a1: #ca000004;
336
+ --primitive-amber-a2: #fc9e4013;
337
+ --primitive-amber-a3: #fc941827;
338
+ --primitive-amber-a4: #fc81003a;
339
+ --primitive-amber-a5: #ff8c0047;
340
+ --primitive-amber-a6: #fd9c1857;
341
+ --primitive-amber-a7: #fda7396d;
342
+ --primitive-amber-a8: #ffac3d8e;
343
+ --primitive-amber-a9: #ffa40bf5;
344
+ --primitive-amber-a10: #fea000e9;
345
+ --primitive-amber-a11: #ffb351fb;
346
+ --primitive-amber-a12: #ffe4c6fd;
347
+ --primitive-amber-contrast: #4f3515;
140
348
 
141
- /* ── 6. SEMANTIC (dark foreground adjustments) ──────────────────────── */
142
- --alert-success-foreground: #86efac;
143
- --alert-success-foreground-muted: color-mix(
144
- in srgb,
145
- var(--alert-success-foreground) 85%,
146
- transparent
147
- );
148
- --alert-warning-foreground: #fde047;
149
- --alert-warning-foreground-muted: color-mix(
150
- in srgb,
151
- var(--alert-warning-foreground) 85%,
152
- transparent
153
- );
154
- --alert-error-foreground: #fca5a5;
155
- --alert-error-foreground-muted: color-mix(
156
- in srgb,
157
- var(--alert-error-foreground) 85%,
158
- transparent
159
- );
160
- --alert-info-foreground: #93c5fd;
161
- --alert-info-foreground-muted: color-mix(in srgb, var(--alert-info-foreground) 85%, transparent);
349
+ --primitive-red-1: #100807;
350
+ --primitive-red-2: #1f1210;
351
+ --primitive-red-3: #3c110e;
352
+ --primitive-red-4: #530b0a;
353
+ --primitive-red-5: #641210;
354
+ --primitive-red-6: #76201c;
355
+ --primitive-red-7: #8f312a;
356
+ --primitive-red-8: #b94038;
357
+ --primitive-red-9: #dc2626;
358
+ --primitive-red-10: #b63d36;
359
+ --primitive-red-11: #ff9083;
360
+ --primitive-red-12: #ffd1ca;
361
+ --primitive-red-a1: #e5000007;
362
+ --primitive-red-a2: #fe675016;
363
+ --primitive-red-a3: #fb2c1e35;
364
+ --primitive-red-a4: #ff0e0a4c;
365
+ --primitive-red-a5: #ff201b5e;
366
+ --primitive-red-a6: #fd3b3271;
367
+ --primitive-red-a7: #fe51448b;
368
+ --primitive-red-a8: #fe554ab7;
369
+ --primitive-red-a9: #ff2b2bdb;
370
+ --primitive-red-a10: #fe5248b4;
371
+ --primitive-red-a11: #ff9083;
372
+ --primitive-red-a12: #ffd1ca;
373
+ --primitive-red-contrast: #ffffff;
374
+ }
375
+
376
+ /*
377
+ * 7. SEMANTIC — product-wide; inherited by all palettes, do not override.
378
+ *
379
+ * Declared for both `:root` and `.dark` so a nested `.dark` wrapper re-resolves
380
+ * the roles against its own hue scales (6). The values are identical in both
381
+ * selectors; only the hue scales differ per mode. The one per-mode exception,
382
+ * `--warning-text`, is declared in the `.dark` rule after this block.
383
+ *
384
+ * Roles: `--{info|success|warning|danger|neutral}-{surface|surface-hover|
385
+ * border|solid|solid-hover|text|contrast|indicator}`. Hue intents read the hue
386
+ * scales; `neutral` reads the system tokens. `--status-*` and `--alert-*` below
387
+ * are aliases of these roles, so both families agree by construction.
388
+ */
389
+ :root,
390
+ .dark {
391
+ --neutral-surface: var(--muted);
392
+ --neutral-surface-hover: var(--accent);
393
+ --neutral-border: var(--border);
394
+ --neutral-solid: var(--secondary);
395
+ --neutral-solid-hover: var(--accent);
396
+ --neutral-text: var(--foreground);
397
+ --neutral-contrast: var(--secondary-foreground);
398
+ --neutral-indicator: var(--muted-foreground);
399
+ --info-surface: var(--primitive-blue-a3);
400
+ --info-surface-hover: var(--primitive-blue-a4);
401
+ --info-border: var(--primitive-blue-a6);
402
+ --info-solid: var(--primitive-blue-9);
403
+ --info-solid-hover: var(--primitive-blue-10);
404
+ --info-text: var(--primitive-blue-11);
405
+ --info-contrast: var(--primitive-blue-contrast);
406
+ --info-indicator: var(--primitive-blue-9);
407
+ --success-surface: var(--primitive-green-a3);
408
+ --success-surface-hover: var(--primitive-green-a4);
409
+ --success-border: var(--primitive-green-a6);
410
+ --success-solid: var(--primitive-green-9);
411
+ --success-solid-hover: var(--primitive-green-10);
412
+ --success-text: var(--primitive-green-11);
413
+ --success-contrast: var(--primitive-green-contrast);
414
+ --success-indicator: var(--primitive-green-9);
415
+ --warning-surface: var(--primitive-amber-a3);
416
+ --warning-surface-hover: var(--primitive-amber-a4);
417
+ --warning-border: var(--primitive-amber-a6);
418
+ --warning-solid: var(--primitive-amber-9);
419
+ --warning-solid-hover: var(--primitive-amber-10);
420
+ --warning-text: var(--primitive-amber-12);
421
+ --warning-contrast: var(--primitive-amber-contrast);
422
+ --warning-indicator: var(--primitive-amber-9);
423
+ --danger-surface: var(--primitive-red-a3);
424
+ --danger-surface-hover: var(--primitive-red-a4);
425
+ --danger-border: var(--primitive-red-a6);
426
+ --danger-solid: var(--primitive-red-9);
427
+ --danger-solid-hover: var(--primitive-red-10);
428
+ --danger-text: var(--primitive-red-11);
429
+ --danger-contrast: var(--primitive-red-contrast);
430
+ --danger-indicator: var(--primitive-red-9);
431
+
432
+ --status-default: var(--neutral-indicator);
433
+ --status-neutral: var(--info-solid);
434
+ --status-completed: var(--success-solid);
435
+ --status-attention: var(--warning-solid);
436
+ --status-danger: var(--danger-solid);
437
+ --alert-neutral-background: var(--neutral-surface);
438
+ --alert-neutral-foreground: var(--neutral-text);
439
+ --alert-neutral-foreground-muted: var(--muted-foreground);
440
+ --alert-neutral-border: var(--neutral-border);
441
+ --alert-success-background: var(--success-surface);
442
+ --alert-success-foreground: var(--success-text);
443
+ --alert-success-foreground-muted: var(--alert-success-foreground);
444
+ --alert-success-border: var(--success-border);
445
+ --alert-warning-background: var(--warning-surface);
446
+ --alert-warning-foreground: var(--warning-text);
447
+ --alert-warning-foreground-muted: var(--alert-warning-foreground);
448
+ --alert-warning-border: var(--warning-border);
449
+ --alert-error-background: var(--danger-surface);
450
+ --alert-error-foreground: var(--danger-text);
451
+ --alert-error-foreground-muted: var(--alert-error-foreground);
452
+ --alert-error-border: var(--danger-border);
453
+ --alert-info-background: var(--info-surface);
454
+ --alert-info-foreground: var(--info-text);
455
+ --alert-info-foreground-muted: var(--alert-info-foreground);
456
+ --alert-info-border: var(--info-border);
457
+ }
458
+
459
+ .dark {
460
+ /* Warning text: step 12 on the light surface, step 11 on the dark one. */
461
+ --warning-text: var(--primitive-amber-11);
462
+ }
463
+
464
+ /*
465
+ * 8. TYPOGRAPHY — composite roles; light only, no dark variant.
466
+ *
467
+ * Four variables per role: size, line-height (unitless ratio), weight and
468
+ * letter-spacing. theme.bridge.css maps them to `text-<role>` utilities.
469
+ * Palettes inherit these; override `--type-*` on `:root` to change
470
+ * a role. See decisions/typography-roles.md.
471
+ *
472
+ * 1.17.0 shipped these as `--app-shell-type-*`. theme.bridge.css reads the
473
+ * old name first, so an override of an old name keeps working. The old names
474
+ * are deprecated and will be removed in the next major.
475
+ */
476
+ :root {
477
+ --type-heading-lg-size: 1.5rem;
478
+ --type-heading-lg-line-height: calc(32 / 24);
479
+ --type-heading-lg-weight: 700;
480
+ --type-heading-lg-letter-spacing: -0.025em;
481
+ --type-heading-md-size: 1.125rem;
482
+ --type-heading-md-line-height: calc(28 / 18);
483
+ --type-heading-md-weight: 600;
484
+ --type-heading-md-letter-spacing: 0em;
485
+ --type-heading-sm-size: 0.875rem;
486
+ --type-heading-sm-line-height: calc(20 / 14);
487
+ --type-heading-sm-weight: 600;
488
+ --type-heading-sm-letter-spacing: 0em;
489
+ --type-body-md-size: 0.875rem;
490
+ --type-body-md-line-height: calc(20 / 14);
491
+ --type-body-md-weight: 400;
492
+ --type-body-md-letter-spacing: 0em;
493
+ --type-body-sm-size: 0.75rem;
494
+ --type-body-sm-line-height: calc(16 / 12);
495
+ --type-body-sm-weight: 400;
496
+ --type-body-sm-letter-spacing: 0em;
497
+ --type-label-md-size: 0.875rem;
498
+ --type-label-md-line-height: calc(20 / 14);
499
+ --type-label-md-weight: 500;
500
+ --type-label-md-letter-spacing: 0em;
501
+ --type-label-sm-size: 0.75rem;
502
+ --type-label-sm-line-height: calc(16 / 12);
503
+ --type-label-sm-weight: 500;
504
+ --type-label-sm-letter-spacing: 0em;
505
+ --type-code-sm-size: 0.75rem;
506
+ --type-code-sm-line-height: calc(18 / 12);
507
+ --type-code-sm-weight: 400;
508
+ --type-code-sm-letter-spacing: 0em;
509
+ --type-body-md-relaxed-size: 0.875rem;
510
+ --type-body-md-relaxed-line-height: calc(24 / 14);
511
+ --type-body-md-relaxed-weight: 400;
512
+ --type-body-md-relaxed-letter-spacing: 0em;
513
+ --type-body-sm-relaxed-size: 0.75rem;
514
+ --type-body-sm-relaxed-line-height: calc(20 / 12);
515
+ --type-body-sm-relaxed-weight: 400;
516
+ --type-body-sm-relaxed-letter-spacing: 0em;
162
517
  }