@stratum-hq/react 0.2.1 → 0.2.2

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 (50) hide show
  1. package/dist/components/ConfigDriftIndicator.d.ts +9 -0
  2. package/dist/components/ConfigDriftIndicator.d.ts.map +1 -0
  3. package/dist/components/ConfigDriftIndicator.js +24 -0
  4. package/dist/components/ConfigDriftIndicator.js.map +1 -0
  5. package/dist/components/EmptyState.d.ts +12 -0
  6. package/dist/components/EmptyState.d.ts.map +1 -0
  7. package/dist/components/EmptyState.js +5 -0
  8. package/dist/components/EmptyState.js.map +1 -0
  9. package/dist/components/TenantHealthCard.d.ts +15 -0
  10. package/dist/components/TenantHealthCard.d.ts.map +1 -0
  11. package/dist/components/TenantHealthCard.js +12 -0
  12. package/dist/components/TenantHealthCard.js.map +1 -0
  13. package/dist/components/TenantThemeProvider.d.ts +14 -0
  14. package/dist/components/TenantThemeProvider.d.ts.map +1 -0
  15. package/dist/components/TenantThemeProvider.js +19 -0
  16. package/dist/components/TenantThemeProvider.js.map +1 -0
  17. package/dist/index.d.ts +8 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +4 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/styles/default.css +1143 -0
  22. package/package.json +2 -1
  23. package/dist/components/ConfigEditor.stories.d.ts +0 -35
  24. package/dist/components/ConfigEditor.stories.d.ts.map +0 -1
  25. package/dist/components/ConfigEditor.stories.js +0 -73
  26. package/dist/components/ConfigEditor.stories.js.map +0 -1
  27. package/dist/components/PermissionEditor.stories.d.ts +0 -34
  28. package/dist/components/PermissionEditor.stories.d.ts.map +0 -1
  29. package/dist/components/PermissionEditor.stories.js +0 -90
  30. package/dist/components/PermissionEditor.stories.js.map +0 -1
  31. package/dist/components/Skeleton.stories.d.ts +0 -46
  32. package/dist/components/Skeleton.stories.d.ts.map +0 -1
  33. package/dist/components/Skeleton.stories.js +0 -125
  34. package/dist/components/Skeleton.stories.js.map +0 -1
  35. package/dist/components/TenantSwitcher.stories.d.ts +0 -30
  36. package/dist/components/TenantSwitcher.stories.d.ts.map +0 -1
  37. package/dist/components/TenantSwitcher.stories.js +0 -76
  38. package/dist/components/TenantSwitcher.stories.js.map +0 -1
  39. package/dist/components/TenantTree.stories.d.ts +0 -28
  40. package/dist/components/TenantTree.stories.d.ts.map +0 -1
  41. package/dist/components/TenantTree.stories.js +0 -71
  42. package/dist/components/TenantTree.stories.js.map +0 -1
  43. package/dist/components/Toast.stories.d.ts +0 -36
  44. package/dist/components/Toast.stories.d.ts.map +0 -1
  45. package/dist/components/Toast.stories.js +0 -105
  46. package/dist/components/Toast.stories.js.map +0 -1
  47. package/dist/components/storybook-helpers.d.ts +0 -96
  48. package/dist/components/storybook-helpers.d.ts.map +0 -1
  49. package/dist/components/storybook-helpers.js +0 -473
  50. package/dist/components/storybook-helpers.js.map +0 -1
@@ -0,0 +1,1143 @@
1
+ /* Stratum Design System — @stratum-hq/react-ui */
2
+
3
+ /* ============================================================
4
+ Font Imports
5
+ ============================================================ */
6
+ @import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wdth,wght@0,75..100,400..700;1,75..100,400..700&family=JetBrains+Mono:wght@400;500;600&display=swap');
7
+
8
+ /* ============================================================
9
+ Design Tokens — Dark Mode (Primary / Default)
10
+ ============================================================ */
11
+ :root {
12
+ /* --- Surfaces — deep earth, not pure black --- */
13
+ --surface-0: #0F0E0C;
14
+ --surface-1: #1A1815;
15
+ --surface-2: #252220;
16
+ --surface-3: #302D2A;
17
+
18
+ /* --- Text --- */
19
+ --text-primary: #E8E2D9;
20
+ --text-secondary: #A39E95;
21
+ --text-tertiary: #6B6560;
22
+
23
+ /* --- Accent — terracotta (used sparingly) --- */
24
+ --accent: #C05746;
25
+ --accent-hover: #D4654E;
26
+ --accent-muted: #C0574620;
27
+
28
+ /* --- Warm neutrals — sandstone --- */
29
+ --sandstone: #C4A882;
30
+ --sandstone-muted: #C4A88240;
31
+
32
+ /* --- Semantic --- */
33
+ --success: #5B8C5A;
34
+ --success-bg: #1A2E19;
35
+ --warning: #C4A244;
36
+ --warning-bg: #2E2610;
37
+ --error: #C05746;
38
+ --error-bg: #2E1410;
39
+ --info: #7A8B9A;
40
+ --info-bg: #1A2430;
41
+
42
+ /* --- Borders --- */
43
+ --border: #2A2725;
44
+ --border-hover: #3D3935;
45
+
46
+ /* --- Code --- */
47
+ --code-bg: #161412;
48
+ --code-text: #C4A882;
49
+
50
+ /* --- Legacy aliases (component compatibility) --- */
51
+ --color-primary: var(--accent);
52
+ --color-primary-hover: var(--accent-hover);
53
+ --color-accent: var(--accent);
54
+ --color-accent-hover: var(--accent-hover);
55
+ --color-accent-light: var(--accent-muted);
56
+ --color-accent-muted: var(--accent-muted);
57
+
58
+ --color-success: var(--success);
59
+ --color-success-bg: var(--success-bg);
60
+ --color-warning: var(--warning);
61
+ --color-warning-bg: var(--warning-bg);
62
+ --color-error: var(--error);
63
+ --color-error-bg: var(--error-bg);
64
+ --color-info: var(--info);
65
+ --color-info-bg: var(--info-bg);
66
+
67
+ --color-bg-page: var(--surface-0);
68
+ --color-bg-surface: var(--surface-1);
69
+ --color-bg-elevated: var(--surface-2);
70
+ --color-bg-hover: var(--surface-2);
71
+ --color-bg-active: var(--surface-3);
72
+ --color-bg-sidebar: var(--surface-0);
73
+ --color-bg-sidebar-hover: var(--surface-1);
74
+
75
+ --color-text-primary: var(--text-primary);
76
+ --color-text-secondary: var(--text-secondary);
77
+ --color-text-tertiary: var(--text-tertiary);
78
+ --color-text-disabled: var(--text-tertiary);
79
+ --color-text-on-primary: #E8E2D9;
80
+ --color-text-active: var(--accent-hover);
81
+
82
+ --color-border-default: var(--border);
83
+ --color-border-strong: var(--border-hover);
84
+ --color-border-input: var(--border-hover);
85
+
86
+ /* --- Badge: Inherited — sandstone --- */
87
+ --color-badge-inherited-bg: var(--sandstone-muted);
88
+ --color-badge-inherited-text: var(--sandstone);
89
+
90
+ /* --- Badge: Locked — warning amber --- */
91
+ --color-badge-locked-bg: var(--warning-bg);
92
+ --color-badge-locked-text: var(--warning);
93
+
94
+ /* --- Badge: Own --- */
95
+ --color-badge-own-bg: var(--surface-2);
96
+ --color-badge-own-text: var(--text-secondary);
97
+
98
+ /* --- Badge: Delegated --- */
99
+ --color-badge-delegated-bg: var(--success-bg);
100
+ --color-badge-delegated-text: var(--success);
101
+
102
+ /* --- Typography --- */
103
+ --font-display: "Instrument Sans", system-ui, sans-serif;
104
+ --font-body: "Instrument Sans", system-ui, sans-serif;
105
+ --font-code: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
106
+
107
+ --font-size-xs: 0.6875rem; /* 11px */
108
+ --font-size-sm: 0.75rem; /* 12px */
109
+ --font-size-base: 0.8125rem; /* 13px */
110
+ --font-size-md: 0.875rem; /* 14px */
111
+ --font-size-lg: 1rem; /* 16px */
112
+ --font-size-xl: 1.25rem; /* 20px */
113
+ --font-size-2xl: 1.5rem; /* 24px */
114
+ --font-size-3xl: 2rem; /* 32px */
115
+ --font-size-4xl: 2.5rem; /* 40px */
116
+
117
+ /* --- Spacing — 8px base scale --- */
118
+ --space-1: 4px;
119
+ --space-2: 8px;
120
+ --space-3: 12px;
121
+ --space-4: 16px;
122
+ --space-6: 24px;
123
+ --space-8: 32px;
124
+ --space-12: 48px;
125
+ --space-16: 64px;
126
+ --space-24: 96px;
127
+ --space-32: 128px;
128
+
129
+ /* Legacy spacing aliases */
130
+ --space-2xs: 2px;
131
+ --space-xs: var(--space-1);
132
+ --space-sm: var(--space-2);
133
+ --space-md: var(--space-3);
134
+ --space-lg: var(--space-4);
135
+ --space-xl: var(--space-6);
136
+ --space-2xl: var(--space-8);
137
+ --space-3xl: var(--space-12);
138
+ --space-4xl: var(--space-16);
139
+
140
+ /* --- Border Radius — hierarchy, not uniform --- */
141
+ --radius-sm: 4px; /* buttons, inputs, tags */
142
+ --radius-md: 8px; /* cards, containers */
143
+ --radius-lg: 12px; /* modals, large surfaces */
144
+ --radius-full: 9999px;
145
+
146
+ /* --- Shadows — warm-toned --- */
147
+ --shadow-sm: 0 1px 2px rgba(15, 14, 12, 0.4);
148
+ --shadow-md: 0 2px 8px rgba(15, 14, 12, 0.5), 0 1px 2px rgba(15, 14, 12, 0.3);
149
+ --shadow-lg: 0 4px 16px rgba(15, 14, 12, 0.6), 0 2px 4px rgba(15, 14, 12, 0.3);
150
+ --shadow-xl: 0 8px 32px rgba(15, 14, 12, 0.7), 0 4px 8px rgba(15, 14, 12, 0.4);
151
+
152
+ /* --- Motion --- */
153
+ --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
154
+ --ease-in: cubic-bezier(0.5, 0, 0.75, 0);
155
+ --ease-in-out: cubic-bezier(0.45, 0, 0.55, 1);
156
+ --duration-fast: 150ms;
157
+ --duration-normal: 250ms;
158
+ --duration-slow: 400ms;
159
+
160
+ /* Legacy motion aliases */
161
+ --duration-micro: var(--duration-fast);
162
+ --duration-short: var(--duration-fast);
163
+ --duration-medium: var(--duration-normal);
164
+ --duration-long: var(--duration-slow);
165
+ --ease-enter: var(--ease-out);
166
+ --ease-exit: var(--ease-in);
167
+ --ease-move: var(--ease-in-out);
168
+ }
169
+
170
+ /* ============================================================
171
+ Light Mode — for docs only
172
+ ============================================================ */
173
+ [data-theme="light"] {
174
+ --surface-0: #FAF8F5;
175
+ --surface-1: #F0EDE8;
176
+ --surface-2: #E5E0DA;
177
+ --surface-3: #D6D0C8;
178
+
179
+ --text-primary: #1A1815;
180
+ --text-secondary: #5C5650;
181
+ --text-tertiary: #8A847D;
182
+
183
+ --accent: #A84535;
184
+ --accent-hover: #C05746;
185
+ --accent-muted: #A8453520;
186
+
187
+ --sandstone: #8B6F4E;
188
+ --sandstone-muted: #8B6F4E20;
189
+
190
+ --success: #3D6B3C;
191
+ --success-bg: #D8EDCC;
192
+ --warning: #8B6E10;
193
+ --warning-bg: #F5E8C0;
194
+ --error: #A84535;
195
+ --error-bg: #F5D5CC;
196
+ --info: #4A5D6E;
197
+ --info-bg: #D8E4EC;
198
+
199
+ --border: #D6D0C8;
200
+ --border-hover: #C4BDB4;
201
+
202
+ --code-bg: #F0EDE8;
203
+ --code-text: #8B6F4E;
204
+
205
+ /* --- Legacy aliases (light) --- */
206
+ --color-primary: var(--accent);
207
+ --color-primary-hover: var(--accent-hover);
208
+ --color-accent: var(--accent);
209
+ --color-accent-hover: var(--accent-hover);
210
+ --color-accent-light: var(--accent-muted);
211
+ --color-accent-muted: var(--accent-muted);
212
+
213
+ --color-success: var(--success);
214
+ --color-success-bg: var(--success-bg);
215
+ --color-warning: var(--warning);
216
+ --color-warning-bg: var(--warning-bg);
217
+ --color-error: var(--error);
218
+ --color-error-bg: var(--error-bg);
219
+ --color-info: var(--info);
220
+ --color-info-bg: var(--info-bg);
221
+
222
+ --color-bg-page: var(--surface-0);
223
+ --color-bg-surface: var(--surface-1);
224
+ --color-bg-elevated: var(--surface-2);
225
+ --color-bg-hover: var(--surface-2);
226
+ --color-bg-active: var(--surface-3);
227
+ --color-bg-sidebar: var(--surface-0);
228
+ --color-bg-sidebar-hover: var(--surface-1);
229
+
230
+ --color-text-primary: var(--text-primary);
231
+ --color-text-secondary: var(--text-secondary);
232
+ --color-text-tertiary: var(--text-tertiary);
233
+ --color-text-disabled: var(--text-tertiary);
234
+ --color-text-on-primary: #FAF8F5;
235
+ --color-text-active: var(--accent);
236
+
237
+ --color-border-default: var(--border);
238
+ --color-border-strong: var(--border-hover);
239
+ --color-border-input: var(--border-hover);
240
+
241
+ --color-badge-inherited-bg: var(--sandstone-muted);
242
+ --color-badge-inherited-text: var(--sandstone);
243
+
244
+ --color-badge-locked-bg: var(--warning-bg);
245
+ --color-badge-locked-text: var(--warning);
246
+
247
+ --color-badge-own-bg: var(--surface-2);
248
+ --color-badge-own-text: var(--text-secondary);
249
+
250
+ --color-badge-delegated-bg: var(--success-bg);
251
+ --color-badge-delegated-text: var(--success);
252
+
253
+ --shadow-sm: 0 1px 2px rgba(26, 24, 21, 0.06);
254
+ --shadow-md: 0 2px 8px rgba(26, 24, 21, 0.09), 0 1px 2px rgba(26, 24, 21, 0.05);
255
+ --shadow-lg: 0 4px 16px rgba(26, 24, 21, 0.12), 0 2px 4px rgba(26, 24, 21, 0.06);
256
+ --shadow-xl: 0 8px 32px rgba(26, 24, 21, 0.14), 0 4px 8px rgba(26, 24, 21, 0.07);
257
+ }
258
+
259
+ /* ============================================================
260
+ Dark Mode — Auto-detect (when no data-theme is set, prefer dark)
261
+ ============================================================ */
262
+ @media (prefers-color-scheme: light) {
263
+ :root:not([data-theme]) {
264
+ --surface-0: #FAF8F5;
265
+ --surface-1: #F0EDE8;
266
+ --surface-2: #E5E0DA;
267
+ --surface-3: #D6D0C8;
268
+
269
+ --text-primary: #1A1815;
270
+ --text-secondary: #5C5650;
271
+ --text-tertiary: #8A847D;
272
+
273
+ --accent: #A84535;
274
+ --accent-hover: #C05746;
275
+ --accent-muted: #A8453520;
276
+
277
+ --sandstone: #8B6F4E;
278
+ --sandstone-muted: #8B6F4E20;
279
+
280
+ --success: #3D6B3C;
281
+ --success-bg: #D8EDCC;
282
+ --warning: #8B6E10;
283
+ --warning-bg: #F5E8C0;
284
+ --error: #A84535;
285
+ --error-bg: #F5D5CC;
286
+ --info: #4A5D6E;
287
+ --info-bg: #D8E4EC;
288
+
289
+ --border: #D6D0C8;
290
+ --border-hover: #C4BDB4;
291
+
292
+ --code-bg: #F0EDE8;
293
+ --code-text: #8B6F4E;
294
+
295
+ --color-primary: var(--accent);
296
+ --color-primary-hover: var(--accent-hover);
297
+ --color-accent: var(--accent);
298
+ --color-accent-hover: var(--accent-hover);
299
+ --color-accent-light: var(--accent-muted);
300
+ --color-accent-muted: var(--accent-muted);
301
+
302
+ --color-success: var(--success);
303
+ --color-success-bg: var(--success-bg);
304
+ --color-warning: var(--warning);
305
+ --color-warning-bg: var(--warning-bg);
306
+ --color-error: var(--error);
307
+ --color-error-bg: var(--error-bg);
308
+ --color-info: var(--info);
309
+ --color-info-bg: var(--info-bg);
310
+
311
+ --color-bg-page: var(--surface-0);
312
+ --color-bg-surface: var(--surface-1);
313
+ --color-bg-elevated: var(--surface-2);
314
+ --color-bg-hover: var(--surface-2);
315
+ --color-bg-active: var(--surface-3);
316
+ --color-bg-sidebar: var(--surface-0);
317
+ --color-bg-sidebar-hover: var(--surface-1);
318
+
319
+ --color-text-primary: var(--text-primary);
320
+ --color-text-secondary: var(--text-secondary);
321
+ --color-text-tertiary: var(--text-tertiary);
322
+ --color-text-disabled: var(--text-tertiary);
323
+ --color-text-on-primary: #FAF8F5;
324
+ --color-text-active: var(--accent);
325
+
326
+ --color-border-default: var(--border);
327
+ --color-border-strong: var(--border-hover);
328
+ --color-border-input: var(--border-hover);
329
+
330
+ --color-badge-inherited-bg: var(--sandstone-muted);
331
+ --color-badge-inherited-text: var(--sandstone);
332
+
333
+ --color-badge-locked-bg: var(--warning-bg);
334
+ --color-badge-locked-text: var(--warning);
335
+
336
+ --color-badge-own-bg: var(--surface-2);
337
+ --color-badge-own-text: var(--text-secondary);
338
+
339
+ --color-badge-delegated-bg: var(--success-bg);
340
+ --color-badge-delegated-text: var(--success);
341
+
342
+ --shadow-sm: 0 1px 2px rgba(26, 24, 21, 0.06);
343
+ --shadow-md: 0 2px 8px rgba(26, 24, 21, 0.09), 0 1px 2px rgba(26, 24, 21, 0.05);
344
+ --shadow-lg: 0 4px 16px rgba(26, 24, 21, 0.12), 0 2px 4px rgba(26, 24, 21, 0.06);
345
+ --shadow-xl: 0 8px 32px rgba(26, 24, 21, 0.14), 0 4px 8px rgba(26, 24, 21, 0.07);
346
+ }
347
+ }
348
+
349
+ /* ============================================================
350
+ Accessibility — Focus Visible
351
+ ============================================================ */
352
+ .stratum-tenant-switcher button:focus-visible,
353
+ .stratum-tenant-switcher input:focus-visible,
354
+ .stratum-tenant-switcher [tabindex]:focus-visible,
355
+ .stratum-tree button:focus-visible,
356
+ .stratum-tree [tabindex]:focus-visible,
357
+ .stratum-config-editor button:focus-visible,
358
+ .stratum-config-editor input:focus-visible,
359
+ .stratum-permission-editor button:focus-visible,
360
+ .stratum-permission-editor input:focus-visible,
361
+ .stratum-permission-editor select:focus-visible {
362
+ outline: 2px solid var(--accent);
363
+ outline-offset: 3px;
364
+ }
365
+
366
+ /* ============================================================
367
+ Accessibility — Reduced Motion
368
+ ============================================================ */
369
+ @media (prefers-reduced-motion: reduce) {
370
+ *,
371
+ *::before,
372
+ *::after {
373
+ animation-duration: 0.01ms !important;
374
+ animation-iteration-count: 1 !important;
375
+ transition-duration: 0.01ms !important;
376
+ scroll-behavior: auto !important;
377
+ }
378
+ }
379
+
380
+ /* ============================================================
381
+ Tenant Switcher
382
+ ============================================================ */
383
+ .stratum-tenant-switcher {
384
+ position: relative;
385
+ display: inline-block;
386
+ font-family: var(--font-body);
387
+ }
388
+
389
+ .stratum-tenant-switcher__trigger {
390
+ padding: var(--space-sm) var(--space-md);
391
+ border: 1px solid var(--color-border-input);
392
+ border-radius: var(--radius-sm);
393
+ background: var(--color-bg-surface);
394
+ color: var(--color-text-primary);
395
+ cursor: pointer;
396
+ font-family: var(--font-body);
397
+ font-size: var(--font-size-md);
398
+ min-width: 200px;
399
+ text-align: start;
400
+ transition: border-color var(--duration-fast) var(--ease-out),
401
+ box-shadow var(--duration-fast) var(--ease-out);
402
+ }
403
+
404
+ .stratum-tenant-switcher__trigger:hover {
405
+ border-color: var(--color-border-strong);
406
+ }
407
+
408
+ .stratum-tenant-switcher__dropdown {
409
+ position: absolute;
410
+ top: 100%;
411
+ inset-inline-start: 0;
412
+ inset-inline-end: 0;
413
+ margin-top: var(--space-xs);
414
+ border: 1px solid var(--color-border-default);
415
+ border-radius: var(--radius-md);
416
+ background: var(--color-bg-surface);
417
+ box-shadow: var(--shadow-md);
418
+ z-index: 50;
419
+ max-height: 300px;
420
+ overflow-y: auto;
421
+ }
422
+
423
+ .stratum-tenant-switcher__search {
424
+ width: 100%;
425
+ padding: var(--space-sm) var(--space-md);
426
+ border: none;
427
+ border-bottom: 1px solid var(--color-border-default);
428
+ background: var(--color-bg-surface);
429
+ color: var(--color-text-primary);
430
+ font-family: var(--font-body);
431
+ font-size: var(--font-size-md);
432
+ outline: none;
433
+ box-sizing: border-box;
434
+ }
435
+
436
+ .stratum-tenant-switcher__search::placeholder {
437
+ color: var(--color-text-tertiary);
438
+ }
439
+
440
+ .stratum-tenant-switcher__list {
441
+ list-style: none;
442
+ margin: 0;
443
+ padding: var(--space-xs) 0;
444
+ }
445
+
446
+ .stratum-tenant-switcher__item {
447
+ padding: var(--space-sm) var(--space-md);
448
+ cursor: pointer;
449
+ font-family: var(--font-body);
450
+ font-size: var(--font-size-md);
451
+ color: var(--color-text-primary);
452
+ transition: background-color var(--duration-fast) var(--ease-out);
453
+ }
454
+
455
+ .stratum-tenant-switcher__item:hover {
456
+ background: var(--color-bg-hover);
457
+ }
458
+
459
+ .stratum-tenant-switcher__item--active {
460
+ background: var(--color-bg-active);
461
+ color: var(--color-text-active);
462
+ }
463
+
464
+ .stratum-tenant-switcher__slug {
465
+ color: var(--color-text-tertiary);
466
+ font-size: var(--font-size-sm);
467
+ }
468
+
469
+ /* ============================================================
470
+ Tenant Tree
471
+ ============================================================ */
472
+ .stratum-tree {
473
+ font-family: var(--font-body);
474
+ font-size: var(--font-size-md);
475
+ }
476
+
477
+ .stratum-tree__root {
478
+ list-style: none;
479
+ margin: 0;
480
+ padding: 0;
481
+ }
482
+
483
+ .stratum-tree__root ul {
484
+ list-style: none;
485
+ margin: 0;
486
+ padding: 0;
487
+ }
488
+
489
+ .stratum-tree__node {
490
+ display: flex;
491
+ align-items: center;
492
+ gap: var(--space-sm);
493
+ padding: var(--space-xs) var(--space-sm);
494
+ cursor: default;
495
+ border-radius: var(--radius-sm);
496
+ color: var(--color-text-primary);
497
+ transition: background-color var(--duration-fast) var(--ease-out);
498
+ }
499
+
500
+ .stratum-tree__node:hover {
501
+ background: var(--color-bg-hover);
502
+ }
503
+
504
+ .stratum-tree__node--selected {
505
+ background: var(--color-bg-active);
506
+ }
507
+
508
+ .stratum-tree__toggle {
509
+ border: none;
510
+ background: none;
511
+ cursor: pointer;
512
+ padding: 0;
513
+ font-size: 10px;
514
+ width: var(--space-lg);
515
+ color: var(--color-text-tertiary);
516
+ transition: color var(--duration-fast) var(--ease-out);
517
+ }
518
+
519
+ .stratum-tree__toggle:hover {
520
+ color: var(--color-text-primary);
521
+ }
522
+
523
+ .stratum-tree__spacer {
524
+ width: var(--space-lg);
525
+ display: inline-block;
526
+ }
527
+
528
+ .stratum-tree__label {
529
+ cursor: pointer;
530
+ flex: 1;
531
+ font-family: var(--font-body);
532
+ color: var(--color-text-primary);
533
+ }
534
+
535
+ .stratum-tree__badge {
536
+ margin-left: var(--space-xs);
537
+ font-size: 10px;
538
+ padding: var(--space-2xs) var(--space-sm);
539
+ border-radius: var(--radius-full);
540
+ background: var(--info-bg);
541
+ color: var(--info);
542
+ border: 1px solid currentColor;
543
+ font-family: var(--font-body);
544
+ font-weight: 500;
545
+ line-height: 1;
546
+ white-space: nowrap;
547
+ flex-shrink: 0;
548
+ }
549
+
550
+ .stratum-tree__meta {
551
+ color: var(--color-text-tertiary);
552
+ font-size: var(--font-size-sm);
553
+ }
554
+
555
+ /* ============================================================
556
+ Config Editor
557
+ ============================================================ */
558
+ .stratum-config-editor__table {
559
+ width: 100%;
560
+ border-collapse: collapse;
561
+ font-family: var(--font-body);
562
+ font-size: var(--font-size-md);
563
+ }
564
+
565
+ .stratum-config-editor__table th {
566
+ text-align: start;
567
+ padding: var(--space-sm) var(--space-md);
568
+ border-bottom: 2px solid var(--color-border-default);
569
+ font-weight: 600;
570
+ color: var(--color-text-secondary);
571
+ font-family: var(--font-body);
572
+ font-size: var(--font-size-xs);
573
+ text-transform: uppercase;
574
+ letter-spacing: 0.05em;
575
+ }
576
+
577
+ .stratum-config-editor__table td {
578
+ padding: var(--space-sm) var(--space-md);
579
+ border-bottom: 1px solid var(--color-bg-hover);
580
+ color: var(--color-text-primary);
581
+ }
582
+
583
+ .stratum-config-editor__table code {
584
+ font-family: var(--font-code);
585
+ font-size: var(--font-size-sm);
586
+ background: var(--code-bg);
587
+ color: var(--code-text);
588
+ padding: 1px 4px;
589
+ border-radius: var(--radius-sm);
590
+ }
591
+
592
+ .stratum-config-editor__row--locked {
593
+ background: var(--color-warning-bg);
594
+ }
595
+
596
+ .stratum-config-editor__source {
597
+ color: var(--color-text-tertiary);
598
+ font-family: var(--font-code);
599
+ font-size: var(--font-size-sm);
600
+ }
601
+
602
+ .stratum-config-editor__add {
603
+ display: flex;
604
+ gap: var(--space-sm);
605
+ margin-top: var(--space-md);
606
+ padding: var(--space-sm) 0;
607
+ }
608
+
609
+ .stratum-config-editor__add input {
610
+ padding: var(--space-sm) var(--space-md);
611
+ border: 1px solid var(--color-border-input);
612
+ border-radius: var(--radius-sm);
613
+ background: var(--color-bg-surface);
614
+ color: var(--color-text-primary);
615
+ font-family: var(--font-body);
616
+ font-size: var(--font-size-md);
617
+ transition: border-color var(--duration-fast) var(--ease-out);
618
+ }
619
+
620
+ .stratum-config-editor__add input:hover {
621
+ border-color: var(--color-border-strong);
622
+ }
623
+
624
+ .stratum-config-editor__add input::placeholder {
625
+ color: var(--color-text-tertiary);
626
+ }
627
+
628
+ /* ============================================================
629
+ Permission Editor
630
+ ============================================================ */
631
+ .stratum-permission-editor__table {
632
+ width: 100%;
633
+ border-collapse: collapse;
634
+ font-family: var(--font-body);
635
+ font-size: var(--font-size-md);
636
+ }
637
+
638
+ .stratum-permission-editor__table th {
639
+ text-align: start;
640
+ padding: var(--space-sm) var(--space-md);
641
+ border-bottom: 2px solid var(--color-border-default);
642
+ font-weight: 600;
643
+ color: var(--color-text-secondary);
644
+ font-family: var(--font-body);
645
+ font-size: var(--font-size-xs);
646
+ text-transform: uppercase;
647
+ letter-spacing: 0.05em;
648
+ }
649
+
650
+ .stratum-permission-editor__table td {
651
+ padding: var(--space-sm) var(--space-md);
652
+ border-bottom: 1px solid var(--color-bg-hover);
653
+ color: var(--color-text-primary);
654
+ }
655
+
656
+ .stratum-permission-editor__table code {
657
+ font-family: var(--font-code);
658
+ font-size: var(--font-size-sm);
659
+ background: var(--code-bg);
660
+ color: var(--code-text);
661
+ padding: 1px 4px;
662
+ border-radius: var(--radius-sm);
663
+ }
664
+
665
+ .stratum-permission-editor__source {
666
+ color: var(--color-text-tertiary);
667
+ font-family: var(--font-code);
668
+ font-size: var(--font-size-sm);
669
+ }
670
+
671
+ .stratum-permission-editor__add {
672
+ display: flex;
673
+ gap: var(--space-sm);
674
+ margin-top: var(--space-md);
675
+ padding: var(--space-sm) 0;
676
+ }
677
+
678
+ .stratum-permission-editor__add input,
679
+ .stratum-permission-editor__add select {
680
+ padding: var(--space-sm) var(--space-md);
681
+ border: 1px solid var(--color-border-input);
682
+ border-radius: var(--radius-sm);
683
+ background: var(--color-bg-surface);
684
+ color: var(--color-text-primary);
685
+ font-family: var(--font-body);
686
+ font-size: var(--font-size-md);
687
+ transition: border-color var(--duration-fast) var(--ease-out);
688
+ }
689
+
690
+ .stratum-permission-editor__add input:hover,
691
+ .stratum-permission-editor__add select:hover {
692
+ border-color: var(--color-border-strong);
693
+ }
694
+
695
+ .stratum-permission-editor__add input::placeholder {
696
+ color: var(--color-text-tertiary);
697
+ }
698
+
699
+ /* ============================================================
700
+ Badges
701
+ ============================================================ */
702
+ .stratum-badge {
703
+ display: inline-block;
704
+ padding: var(--space-2xs) var(--space-sm);
705
+ border-radius: var(--radius-sm);
706
+ font-family: var(--font-body);
707
+ font-size: var(--font-size-xs);
708
+ font-weight: 500;
709
+ }
710
+
711
+ .stratum-badge--locked {
712
+ background: var(--color-badge-locked-bg);
713
+ color: var(--color-badge-locked-text);
714
+ }
715
+
716
+ .stratum-badge--inherited {
717
+ background: var(--color-badge-inherited-bg);
718
+ color: var(--color-badge-inherited-text);
719
+ }
720
+
721
+ .stratum-badge--delegated {
722
+ background: var(--color-badge-delegated-bg);
723
+ color: var(--color-badge-delegated-text);
724
+ }
725
+
726
+ .stratum-badge--own {
727
+ background: var(--color-badge-own-bg);
728
+ color: var(--color-badge-own-text);
729
+ }
730
+
731
+ /* ============================================================
732
+ Buttons (Config + Permission Editors)
733
+ ============================================================ */
734
+ .stratum-config-editor button,
735
+ .stratum-permission-editor button {
736
+ padding: var(--space-xs) var(--space-md);
737
+ border: 1px solid var(--color-border-input);
738
+ border-radius: var(--radius-sm);
739
+ background: var(--color-bg-surface);
740
+ color: var(--color-text-primary);
741
+ cursor: pointer;
742
+ font-family: var(--font-body);
743
+ font-size: var(--font-size-base);
744
+ transition: background-color var(--duration-fast) var(--ease-out),
745
+ border-color var(--duration-fast) var(--ease-out);
746
+ }
747
+
748
+ .stratum-config-editor button:hover,
749
+ .stratum-permission-editor button:hover {
750
+ background: var(--color-bg-hover);
751
+ border-color: var(--color-border-strong);
752
+ }
753
+
754
+ .stratum-config-editor button:disabled,
755
+ .stratum-permission-editor button:disabled {
756
+ opacity: 0.5;
757
+ cursor: not-allowed;
758
+ }
759
+
760
+ /* ============================================================
761
+ Skeleton Loaders
762
+ ============================================================ */
763
+ .stratum-skeleton {
764
+ background: var(--surface-2);
765
+ border-radius: var(--radius-sm);
766
+ animation: stratum-shimmer 1.5s ease-in-out infinite;
767
+ }
768
+
769
+ .stratum-skeleton--circle {
770
+ border-radius: var(--radius-full);
771
+ }
772
+
773
+ @keyframes stratum-shimmer {
774
+ 0% { opacity: 0.4; }
775
+ 50% { opacity: 0.7; }
776
+ 100% { opacity: 0.4; }
777
+ }
778
+
779
+ /* Table Skeleton — matches ConfigEditor/PermissionEditor table styling */
780
+ .stratum-table-skeleton__table {
781
+ width: 100%;
782
+ border-collapse: collapse;
783
+ font-family: var(--font-body);
784
+ }
785
+
786
+ .stratum-table-skeleton__table th {
787
+ text-align: start;
788
+ padding: var(--space-sm) var(--space-md);
789
+ border-bottom: 2px solid var(--color-border-default);
790
+ }
791
+
792
+ .stratum-table-skeleton__table td {
793
+ padding: var(--space-sm) var(--space-md);
794
+ border-bottom: 1px solid var(--color-bg-hover);
795
+ }
796
+
797
+ /* ============================================================
798
+ Toast Notifications
799
+ ============================================================ */
800
+ .stratum-toast-container {
801
+ position: fixed;
802
+ top: var(--space-lg);
803
+ inset-inline-end: var(--space-lg);
804
+ z-index: 9999;
805
+ display: flex;
806
+ flex-direction: column;
807
+ gap: var(--space-sm);
808
+ pointer-events: none;
809
+ max-width: 400px;
810
+ }
811
+
812
+ .stratum-toast {
813
+ display: flex;
814
+ align-items: center;
815
+ gap: var(--space-sm);
816
+ padding: var(--space-md) var(--space-lg);
817
+ background: var(--color-bg-surface);
818
+ border: 1px solid var(--color-border-default);
819
+ border-inline-start: 3px solid var(--text-tertiary);
820
+ border-radius: var(--radius-md);
821
+ box-shadow: var(--shadow-md);
822
+ font-family: var(--font-body);
823
+ font-size: var(--font-size-md);
824
+ color: var(--color-text-primary);
825
+ pointer-events: auto;
826
+ animation: stratum-toast-enter var(--duration-normal) var(--ease-out);
827
+ }
828
+
829
+ .stratum-toast--success {
830
+ border-inline-start-color: var(--success);
831
+ }
832
+
833
+ .stratum-toast--error {
834
+ border-inline-start-color: var(--error);
835
+ }
836
+
837
+ .stratum-toast--warning {
838
+ border-inline-start-color: var(--warning);
839
+ }
840
+
841
+ .stratum-toast--info {
842
+ border-inline-start-color: var(--info);
843
+ }
844
+
845
+ .stratum-toast__message {
846
+ flex: 1;
847
+ line-height: 1.4;
848
+ }
849
+
850
+ .stratum-toast__dismiss {
851
+ flex-shrink: 0;
852
+ border: none;
853
+ background: none;
854
+ color: var(--color-text-tertiary);
855
+ cursor: pointer;
856
+ font-size: var(--font-size-lg);
857
+ padding: var(--space-xs);
858
+ line-height: 1;
859
+ border-radius: var(--radius-sm);
860
+ transition: color var(--duration-fast) var(--ease-out),
861
+ background-color var(--duration-fast) var(--ease-out);
862
+ }
863
+
864
+ .stratum-toast__dismiss:hover {
865
+ color: var(--color-text-primary);
866
+ background: var(--color-bg-hover);
867
+ }
868
+
869
+ .stratum-toast__dismiss:focus-visible {
870
+ outline: 2px solid var(--accent);
871
+ outline-offset: 3px;
872
+ }
873
+
874
+ @keyframes stratum-toast-enter {
875
+ from {
876
+ opacity: 0;
877
+ transform: translateX(100%);
878
+ }
879
+ to {
880
+ opacity: 1;
881
+ transform: translateX(0);
882
+ }
883
+ }
884
+
885
+ /* ============================================================
886
+ Empty State
887
+ ============================================================ */
888
+ .stratum-empty-state {
889
+ display: flex;
890
+ flex-direction: column;
891
+ align-items: center;
892
+ justify-content: center;
893
+ text-align: center;
894
+ padding: var(--space-3xl) var(--space-xl);
895
+ font-family: var(--font-body);
896
+ }
897
+
898
+ .stratum-empty-state__icon {
899
+ display: flex;
900
+ align-items: center;
901
+ justify-content: center;
902
+ margin-bottom: var(--space-lg);
903
+ color: var(--color-text-tertiary);
904
+ }
905
+
906
+ .stratum-empty-state__title {
907
+ margin: 0 0 var(--space-sm);
908
+ font-family: var(--font-display);
909
+ font-size: var(--font-size-lg);
910
+ font-weight: 700;
911
+ color: var(--color-text-primary);
912
+ line-height: 1.3;
913
+ text-wrap: balance;
914
+ }
915
+
916
+ .stratum-empty-state__description {
917
+ margin: 0 0 var(--space-xl);
918
+ font-size: var(--font-size-md);
919
+ color: var(--color-text-secondary);
920
+ max-width: 420px;
921
+ line-height: 1.6;
922
+ }
923
+
924
+ .stratum-empty-state__actions {
925
+ display: flex;
926
+ flex-wrap: wrap;
927
+ align-items: center;
928
+ justify-content: center;
929
+ gap: var(--space-md);
930
+ }
931
+
932
+ .stratum-empty-state__action {
933
+ padding: var(--space-sm) var(--space-lg);
934
+ background: var(--accent);
935
+ color: var(--color-text-on-primary);
936
+ border: none;
937
+ border-radius: var(--radius-sm);
938
+ font-family: var(--font-body);
939
+ font-size: var(--font-size-md);
940
+ font-weight: 500;
941
+ cursor: pointer;
942
+ transition: background-color var(--duration-fast) var(--ease-out);
943
+ }
944
+
945
+ .stratum-empty-state__action:hover {
946
+ background: var(--accent-hover);
947
+ }
948
+
949
+ .stratum-empty-state__action:focus-visible {
950
+ outline: 2px solid var(--accent);
951
+ outline-offset: 3px;
952
+ }
953
+
954
+ .stratum-empty-state__docs {
955
+ font-size: var(--font-size-md);
956
+ color: var(--sandstone);
957
+ text-decoration: none;
958
+ font-family: var(--font-body);
959
+ transition: color var(--duration-fast) var(--ease-out);
960
+ }
961
+
962
+ .stratum-empty-state__docs:hover {
963
+ color: var(--text-primary);
964
+ text-decoration: underline;
965
+ }
966
+
967
+ .stratum-empty-state__docs:focus-visible {
968
+ outline: 2px solid var(--accent);
969
+ outline-offset: 3px;
970
+ border-radius: var(--radius-sm);
971
+ }
972
+
973
+ /* ============================================================
974
+ Tenant Health Card
975
+ ============================================================ */
976
+ .stratum-tenant-health-card {
977
+ display: flex;
978
+ align-items: flex-start;
979
+ gap: var(--space-md);
980
+ padding: var(--space-lg);
981
+ background: var(--color-bg-surface);
982
+ border: 1px solid var(--color-border-default);
983
+ border-radius: var(--radius-md);
984
+ box-shadow: var(--shadow-md);
985
+ font-family: var(--font-body);
986
+ }
987
+
988
+ .stratum-tenant-health-card--clickable {
989
+ cursor: pointer;
990
+ transition: box-shadow var(--duration-fast) var(--ease-out),
991
+ border-color var(--duration-fast) var(--ease-out);
992
+ }
993
+
994
+ .stratum-tenant-health-card--clickable:hover {
995
+ box-shadow: var(--shadow-lg);
996
+ border-color: var(--color-border-strong);
997
+ }
998
+
999
+ .stratum-tenant-health-card--clickable:focus-visible {
1000
+ outline: 2px solid var(--accent);
1001
+ outline-offset: 3px;
1002
+ }
1003
+
1004
+ .stratum-tenant-health-card__dot {
1005
+ flex-shrink: 0;
1006
+ width: 10px;
1007
+ height: 10px;
1008
+ border-radius: var(--radius-full);
1009
+ margin-top: 4px;
1010
+ }
1011
+
1012
+ .stratum-tenant-health-card__dot--ok {
1013
+ background: var(--success);
1014
+ }
1015
+
1016
+ .stratum-tenant-health-card__dot--override {
1017
+ background: var(--warning);
1018
+ }
1019
+
1020
+ .stratum-tenant-health-card__dot--missing,
1021
+ .stratum-tenant-health-card__dot--conflict {
1022
+ background: var(--error);
1023
+ }
1024
+
1025
+ .stratum-tenant-health-card__body {
1026
+ display: flex;
1027
+ flex-direction: column;
1028
+ gap: var(--space-xs);
1029
+ flex: 1;
1030
+ min-width: 0;
1031
+ }
1032
+
1033
+ .stratum-tenant-health-card__header {
1034
+ display: flex;
1035
+ align-items: center;
1036
+ gap: var(--space-sm);
1037
+ flex-wrap: wrap;
1038
+ }
1039
+
1040
+ .stratum-tenant-health-card__name {
1041
+ font-size: var(--font-size-md);
1042
+ font-weight: 600;
1043
+ color: var(--color-text-primary);
1044
+ }
1045
+
1046
+ .stratum-tenant-health-card__industry {
1047
+ display: inline-block;
1048
+ padding: var(--space-2xs) var(--space-sm);
1049
+ border-radius: var(--radius-sm);
1050
+ background: var(--color-badge-own-bg);
1051
+ color: var(--color-badge-own-text);
1052
+ font-size: var(--font-size-xs);
1053
+ font-weight: 500;
1054
+ }
1055
+
1056
+ .stratum-tenant-health-card__slug {
1057
+ font-size: var(--font-size-xs);
1058
+ color: var(--color-text-secondary);
1059
+ }
1060
+
1061
+ .stratum-tenant-health-card__stats {
1062
+ display: flex;
1063
+ flex-wrap: wrap;
1064
+ gap: var(--space-xs);
1065
+ font-size: var(--font-size-xs);
1066
+ color: var(--color-text-tertiary);
1067
+ }
1068
+
1069
+ .stratum-tenant-health-card__stats span + span::before {
1070
+ content: " · ";
1071
+ margin-inline-end: var(--space-xs);
1072
+ }
1073
+
1074
+ .stratum-tenant-health-card__activity {
1075
+ font-size: var(--font-size-xs);
1076
+ color: var(--color-text-tertiary);
1077
+ }
1078
+
1079
+ /* ============================================================
1080
+ Config Drift Indicator
1081
+ ============================================================ */
1082
+ .stratum-config-drift-indicator {
1083
+ display: inline-flex;
1084
+ align-items: center;
1085
+ gap: var(--space-xs);
1086
+ border-radius: var(--radius-sm);
1087
+ font-family: var(--font-body);
1088
+ font-weight: 500;
1089
+ white-space: nowrap;
1090
+ }
1091
+
1092
+ .stratum-config-drift-indicator--sm {
1093
+ padding: var(--space-2xs) var(--space-sm);
1094
+ font-size: var(--font-size-xs);
1095
+ }
1096
+
1097
+ .stratum-config-drift-indicator--md {
1098
+ padding: var(--space-xs) var(--space-md);
1099
+ font-size: var(--font-size-sm);
1100
+ }
1101
+
1102
+ .stratum-config-drift-indicator__dot {
1103
+ width: 6px;
1104
+ height: 6px;
1105
+ border-radius: var(--radius-full);
1106
+ flex-shrink: 0;
1107
+ }
1108
+
1109
+ .stratum-config-drift-indicator__dot--ok {
1110
+ background: var(--success);
1111
+ }
1112
+
1113
+ .stratum-config-drift-indicator__dot--override {
1114
+ background: var(--warning);
1115
+ }
1116
+
1117
+ .stratum-config-drift-indicator__dot--missing,
1118
+ .stratum-config-drift-indicator__dot--conflict {
1119
+ background: var(--error);
1120
+ }
1121
+
1122
+ .stratum-config-drift-indicator--ok {
1123
+ background: var(--success-bg);
1124
+ color: var(--success);
1125
+ }
1126
+
1127
+ .stratum-config-drift-indicator--override {
1128
+ background: var(--warning-bg);
1129
+ color: var(--warning);
1130
+ }
1131
+
1132
+ .stratum-config-drift-indicator--missing,
1133
+ .stratum-config-drift-indicator--conflict {
1134
+ background: var(--error-bg);
1135
+ color: var(--error);
1136
+ }
1137
+
1138
+ /* ============================================================
1139
+ Tenant Theme Provider
1140
+ ============================================================ */
1141
+ .stratum-tenant-theme-provider {
1142
+ display: contents;
1143
+ }