indira-workspace-ui 0.1.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.
@@ -0,0 +1,725 @@
1
+ /* =====================================================================
2
+ Indira Workspace UI — tokens, scales and component CSS
3
+ Source of truth: docs/design-system.md
4
+ ===================================================================== */
5
+ @import "tailwindcss";
6
+
7
+ /* ---------------------------------------------------------------------
8
+ §1.1 / §1.2 Colour tokens — "R G B" triplets so every colour can take
9
+ an opacity modifier: rgb(var(--c-primary) / 0.12)
10
+ --------------------------------------------------------------------- */
11
+ :root {
12
+ color-scheme: light;
13
+
14
+ --c-primary: 182 30 66;
15
+ --c-on-primary: 255 255 255;
16
+ --c-primary-container: 243 204 219;
17
+ --c-on-primary-container: 122 18 48;
18
+
19
+ --c-canvas: 247 249 251;
20
+ --c-surface: 255 255 255;
21
+ --c-surface-1: 248 250 252;
22
+ --c-surface-2: 241 245 249;
23
+ --c-surface-3: 232 238 245;
24
+ --c-sidebar: 255 255 255;
25
+ --c-sidebar-line: 233 237 243;
26
+
27
+ --c-on-surface: 15 23 42;
28
+ --c-on-surface-var: 71 85 105;
29
+ --c-on-surface-faint: 100 116 139;
30
+ --c-outline-var: 233 237 243;
31
+ --c-outline: 203 213 225;
32
+
33
+ /* Status — the entire data palette */
34
+ --c-st-draft: 148 163 184;
35
+ --c-st-submitted: 37 99 235;
36
+ --c-st-review: 2 132 199;
37
+ --c-st-approved: 22 163 74;
38
+ --c-st-rejected: 220 38 38;
39
+ --c-st-sentback: 217 119 6;
40
+
41
+ /* Status chips: pastel fill / saturated label / tinted border */
42
+ --chip-draft: 241 245 249; --chip-draft-fg: 71 85 105; --chip-draft-bd: 226 232 240;
43
+ --chip-submitted: 239 246 255; --chip-submitted-fg: 29 78 216; --chip-submitted-bd: 219 234 254;
44
+ --chip-review: 224 242 254; --chip-review-fg: 3 105 161; --chip-review-bd: 186 230 253;
45
+ --chip-approved: 220 252 231; --chip-approved-fg: 21 128 61; --chip-approved-bd: 187 247 208;
46
+ --chip-rejected: 254 226 226; --chip-rejected-fg: 185 28 28; --chip-rejected-bd: 254 202 202;
47
+ --chip-sentback: 254 243 199; --chip-sentback-fg: 180 83 9; --chip-sentback-bd: 253 230 138;
48
+
49
+ /* §1.3 Elevation — three steps */
50
+ --elev-1: 0 1px 2px rgb(15 23 42 / 0.04), 0 1px 3px rgb(15 23 42 / 0.06);
51
+ --elev-2: 0 2px 4px rgb(15 23 42 / 0.05), 0 8px 16px rgb(15 23 42 / 0.08);
52
+ --elev-3: 0 4px 8px rgb(15 23 42 / 0.06), 0 16px 32px rgb(15 23 42 / 0.14);
53
+
54
+ /* Cards: no border in light, hairline in dark */
55
+ --card-border: 0 0 0 0 transparent;
56
+
57
+ /* §1.7 Motion */
58
+ --ease-std: cubic-bezier(0.2, 0, 0, 1);
59
+ --dur-fast: 100ms;
60
+ --dur: 150ms;
61
+ --dur-layout: 200ms;
62
+
63
+ /* §3 Shell */
64
+ --shell-header-h: 72px;
65
+ --shell-sidebar-w: 224px;
66
+ --shell-rail-w: 84px;
67
+ }
68
+
69
+ /* Dark set: re-toned, not inverted. Never bottoms out at pure black. */
70
+ @media (prefers-color-scheme: dark) {
71
+ :root:not([data-theme="light"]) {
72
+ color-scheme: dark;
73
+ --c-primary: 242 135 158;
74
+ --c-on-primary: 92 12 36;
75
+ --c-primary-container: 116 18 46;
76
+ --c-on-primary-container: 251 208 218;
77
+ --c-canvas: 15 18 24;
78
+ --c-surface: 22 26 33;
79
+ --c-surface-1: 28 33 41;
80
+ --c-surface-2: 36 42 52;
81
+ --c-surface-3: 45 53 64;
82
+ --c-sidebar: 22 26 33;
83
+ --c-sidebar-line: 42 49 60;
84
+ --c-on-surface: 226 232 240;
85
+ --c-on-surface-var: 160 172 187;
86
+ --c-on-surface-faint: 125 138 154;
87
+ --c-outline-var: 42 49 60;
88
+ --c-outline: 65 74 87;
89
+ --c-st-submitted: 96 165 250;
90
+ --c-st-review: 56 189 248;
91
+ --c-st-approved: 74 222 128;
92
+ --c-st-rejected: 248 113 113;
93
+ --c-st-sentback: 251 191 36;
94
+ --chip-draft: 36 42 52; --chip-draft-fg: 160 172 187; --chip-draft-bd: 51 59 71;
95
+ --chip-submitted: 23 41 77; --chip-submitted-fg: 147 197 253; --chip-submitted-bd: 30 58 107;
96
+ --chip-review: 12 53 80; --chip-review-fg: 125 211 252; --chip-review-bd: 18 73 110;
97
+ --chip-approved: 16 55 31; --chip-approved-fg: 134 239 172; --chip-approved-bd: 23 81 45;
98
+ --chip-rejected: 69 22 26; --chip-rejected-fg: 252 165 165; --chip-rejected-bd: 97 33 38;
99
+ --chip-sentback: 64 48 12; --chip-sentback-fg: 252 211 77; --chip-sentback-bd: 90 68 19;
100
+ --elev-1: 0 1px 2px rgb(0 0 0 / 0.3), 0 1px 3px rgb(0 0 0 / 0.35);
101
+ --elev-2: 0 2px 4px rgb(0 0 0 / 0.35), 0 8px 16px rgb(0 0 0 / 0.4);
102
+ --elev-3: 0 4px 8px rgb(0 0 0 / 0.4), 0 16px 32px rgb(0 0 0 / 0.5);
103
+ --card-border: 0 0 0 1px rgb(var(--c-outline-var));
104
+ }
105
+ }
106
+
107
+ :root[data-theme="dark"] {
108
+ color-scheme: dark;
109
+ --c-primary: 242 135 158;
110
+ --c-on-primary: 92 12 36;
111
+ --c-primary-container: 116 18 46;
112
+ --c-on-primary-container: 251 208 218;
113
+ --c-canvas: 15 18 24;
114
+ --c-surface: 22 26 33;
115
+ --c-surface-1: 28 33 41;
116
+ --c-surface-2: 36 42 52;
117
+ --c-surface-3: 45 53 64;
118
+ --c-sidebar: 22 26 33;
119
+ --c-sidebar-line: 42 49 60;
120
+ --c-on-surface: 226 232 240;
121
+ --c-on-surface-var: 160 172 187;
122
+ --c-on-surface-faint: 125 138 154;
123
+ --c-outline-var: 42 49 60;
124
+ --c-outline: 65 74 87;
125
+ --c-st-submitted: 96 165 250;
126
+ --c-st-review: 56 189 248;
127
+ --c-st-approved: 74 222 128;
128
+ --c-st-rejected: 248 113 113;
129
+ --c-st-sentback: 251 191 36;
130
+ --chip-draft: 36 42 52; --chip-draft-fg: 160 172 187; --chip-draft-bd: 51 59 71;
131
+ --chip-submitted: 23 41 77; --chip-submitted-fg: 147 197 253; --chip-submitted-bd: 30 58 107;
132
+ --chip-review: 12 53 80; --chip-review-fg: 125 211 252; --chip-review-bd: 18 73 110;
133
+ --chip-approved: 16 55 31; --chip-approved-fg: 134 239 172; --chip-approved-bd: 23 81 45;
134
+ --chip-rejected: 69 22 26; --chip-rejected-fg: 252 165 165; --chip-rejected-bd: 97 33 38;
135
+ --chip-sentback: 64 48 12; --chip-sentback-fg: 252 211 77; --chip-sentback-bd: 90 68 19;
136
+ --elev-1: 0 1px 2px rgb(0 0 0 / 0.3), 0 1px 3px rgb(0 0 0 / 0.35);
137
+ --elev-2: 0 2px 4px rgb(0 0 0 / 0.35), 0 8px 16px rgb(0 0 0 / 0.4);
138
+ --elev-3: 0 4px 8px rgb(0 0 0 / 0.4), 0 16px 32px rgb(0 0 0 / 0.5);
139
+ --card-border: 0 0 0 1px rgb(var(--c-outline-var));
140
+ }
141
+
142
+ /* ---------------------------------------------------------------------
143
+ §2 / §7 Closed scales. Defaults are DELETED (`initial`), then only the
144
+ system's values are declared, so an off-scale utility does not exist.
145
+ --------------------------------------------------------------------- */
146
+ @theme inline {
147
+ /* Colour roles — components reference roles, never raw tokens */
148
+ --color-*: initial;
149
+ --color-primary: rgb(var(--c-primary));
150
+ --color-primary-on: rgb(var(--c-on-primary));
151
+ --color-primary-container: rgb(var(--c-primary-container));
152
+ --color-primary-container-on: rgb(var(--c-on-primary-container));
153
+ --color-canvas: rgb(var(--c-canvas));
154
+ --color-surface: rgb(var(--c-surface));
155
+ --color-surface-1: rgb(var(--c-surface-1));
156
+ --color-surface-2: rgb(var(--c-surface-2));
157
+ --color-surface-3: rgb(var(--c-surface-3));
158
+ --color-sidebar: rgb(var(--c-sidebar));
159
+ --color-sidebar-line: rgb(var(--c-sidebar-line));
160
+ --color-ink: rgb(var(--c-on-surface));
161
+ --color-ink-muted: rgb(var(--c-on-surface-var));
162
+ --color-ink-faint: rgb(var(--c-on-surface-faint));
163
+ --color-line: rgb(var(--c-outline-var));
164
+ --color-line-strong: rgb(var(--c-outline));
165
+ --color-st-draft: rgb(var(--c-st-draft));
166
+ --color-st-submitted: rgb(var(--c-st-submitted));
167
+ --color-st-review: rgb(var(--c-st-review));
168
+ --color-st-approved: rgb(var(--c-st-approved));
169
+ --color-st-rejected: rgb(var(--c-st-rejected));
170
+ --color-st-sentback: rgb(var(--c-st-sentback));
171
+ --color-white: #fff;
172
+ --color-black: #000;
173
+ --color-transparent: transparent;
174
+
175
+ /* §1.5 Type — one family, six sizes, four weights */
176
+ --font-*: initial;
177
+ --font-sans: Inter, "Segoe UI Variable Text", "Segoe UI", system-ui, sans-serif;
178
+ --font-mono: "JetBrains Mono", "Cascadia Mono", Consolas, ui-monospace, monospace;
179
+ --font-serif: Georgia, Tinos, "Times New Roman", serif;
180
+
181
+ --text-*: initial;
182
+ --text-xs: 12px; --text-xs--line-height: 16px;
183
+ --text-sm: 14px; --text-sm--line-height: 20px;
184
+ --text-base: 16px; --text-base--line-height: 24px;
185
+ --text-lg: 20px; --text-lg--line-height: 28px;
186
+ --text-xl: 24px; --text-xl--line-height: 32px;
187
+ --text-2xl: 36px; --text-2xl--line-height: 40px;
188
+
189
+ --font-weight-*: initial;
190
+ --font-weight-normal: 400;
191
+ --font-weight-medium: 500;
192
+ --font-weight-semibold: 600;
193
+ --font-weight-bold: 700;
194
+
195
+ /* §1.4 Radius — four values (+ the one 24 for the shell corner) */
196
+ --radius-*: initial;
197
+ --radius-xs: 8px;
198
+ --radius-sm: 12px;
199
+ --radius-lg: 16px;
200
+ --radius-shell: 24px;
201
+ --radius-full: 9999px;
202
+
203
+ /* §1.3 Elevation */
204
+ --shadow-*: initial;
205
+ --inset-shadow-*: initial;
206
+ --shadow-e1: var(--elev-1);
207
+ --shadow-e2: var(--elev-2);
208
+ --shadow-e3: var(--elev-3);
209
+
210
+ /* §1.7 Motion */
211
+ --ease-*: initial;
212
+ --ease-std: var(--ease-std);
213
+ --animate-*: initial;
214
+ --animate-fade-up: fade-up var(--dur) var(--ease-std) both;
215
+
216
+ --default-transition-duration: var(--dur);
217
+ --default-transition-timing-function: var(--ease-std);
218
+ --default-font-family: var(--font-sans);
219
+ --default-mono-font-family: var(--font-mono);
220
+ }
221
+
222
+ @keyframes fade-up {
223
+ from { opacity: 0; transform: translateY(4px); }
224
+ to { opacity: 1; transform: none; }
225
+ }
226
+
227
+ /* ---------------------------------------------------------------------
228
+ Base
229
+ --------------------------------------------------------------------- */
230
+ @layer base {
231
+ html {
232
+ font-family: var(--font-sans);
233
+ -webkit-font-smoothing: antialiased;
234
+ -moz-osx-font-smoothing: grayscale;
235
+ text-rendering: optimizeLegibility;
236
+ }
237
+ body {
238
+ background: rgb(var(--c-canvas));
239
+ color: rgb(var(--c-on-surface));
240
+ font-size: var(--text-sm);
241
+ line-height: var(--text-sm--line-height);
242
+ font-variant-numeric: tabular-nums;
243
+ }
244
+ button, input, optgroup, select, textarea { font: inherit; color: inherit; }
245
+ button { cursor: pointer; }
246
+ a { color: rgb(var(--c-primary)); text-underline-offset: 2px; }
247
+ :focus-visible {
248
+ outline: 2px solid rgb(var(--c-primary));
249
+ outline-offset: 2px;
250
+ }
251
+ /* §1.8 Icons: one family, stroke 1.75, round joins */
252
+ svg.lucide { stroke-width: 1.75; stroke-linejoin: round; stroke-linecap: round; flex-shrink: 0; }
253
+ ::selection { background: rgb(var(--c-primary) / 0.18); }
254
+ .sr-only {
255
+ position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
256
+ overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
257
+ }
258
+ }
259
+
260
+ /* ---------------------------------------------------------------------
261
+ §4 Components. Roles only; hover/press are state layers.
262
+ --------------------------------------------------------------------- */
263
+ @layer components {
264
+ /* ---- state layer helper: inset wash of the on-colour ---- */
265
+ .state-layer { --sl-color: var(--c-on-surface); }
266
+ .state-layer:hover { box-shadow: inset 0 0 0 100px rgb(var(--sl-color) / 0.06); }
267
+ .state-layer:active { box-shadow: inset 0 0 0 100px rgb(var(--sl-color) / 0.1); }
268
+
269
+ /* ---- §4.1 Button ---- */
270
+ .btn {
271
+ display: inline-flex; align-items: center; justify-content: center; gap: 8px;
272
+ height: 40px; padding: 0 20px; border-radius: 9999px;
273
+ font-size: 14px; line-height: 20px; font-weight: 600; white-space: nowrap;
274
+ border: 1px solid transparent; background: transparent; color: rgb(var(--c-on-surface));
275
+ transition: background-color var(--dur) var(--ease-std), box-shadow var(--dur) var(--ease-std),
276
+ color var(--dur) var(--ease-std), transform var(--dur) var(--ease-std);
277
+ user-select: none; text-decoration: none;
278
+ }
279
+ .btn:disabled, .btn[aria-disabled="true"] { opacity: 0.4; pointer-events: none; }
280
+ .btn--sm { height: 34px; padding: 0 16px; font-size: 12px; line-height: 16px; }
281
+ .btn--icon { width: 40px; padding: 0; }
282
+ .btn--icon.btn--sm { width: 34px; }
283
+
284
+ .btn--filled { background: rgb(var(--c-primary)); color: rgb(var(--c-on-primary)); box-shadow: var(--elev-1); }
285
+ .btn--filled:hover { box-shadow: var(--elev-1), inset 0 0 0 100px rgb(var(--c-on-primary) / 0.12); }
286
+ .btn--filled:active { box-shadow: var(--elev-1), inset 0 0 0 100px rgb(var(--c-on-primary) / 0.2); }
287
+
288
+ .btn--tonal { background: rgb(var(--c-primary-container)); color: rgb(var(--c-on-primary-container)); }
289
+ .btn--tonal:hover { box-shadow: inset 0 0 0 100px rgb(var(--c-on-primary-container) / 0.08); }
290
+ .btn--tonal:active { box-shadow: inset 0 0 0 100px rgb(var(--c-on-primary-container) / 0.14); }
291
+
292
+ .btn--outlined { background: rgb(var(--c-surface)); border-color: rgb(var(--c-outline)); color: rgb(var(--c-on-surface)); }
293
+ .btn--outlined:hover { box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.05); }
294
+ .btn--outlined:active { box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.09); }
295
+
296
+ .btn--text { color: rgb(var(--c-on-surface-var)); }
297
+ .btn--text:hover { color: rgb(var(--c-on-surface)); box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.05); }
298
+ .btn--text:active { box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.09); }
299
+
300
+ /* the three decisions — status tinted */
301
+ .btn--approve { background: rgb(var(--chip-approved)); color: rgb(var(--chip-approved-fg)); border-color: rgb(var(--chip-approved-bd)); }
302
+ .btn--sendback { background: rgb(var(--chip-sentback)); color: rgb(var(--chip-sentback-fg)); border-color: rgb(var(--chip-sentback-bd)); }
303
+ .btn--reject { background: rgb(var(--chip-rejected)); color: rgb(var(--chip-rejected-fg)); border-color: rgb(var(--chip-rejected-bd)); }
304
+ .btn--approve:hover, .btn--sendback:hover, .btn--reject:hover { box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.05); }
305
+ .btn--approve:active, .btn--sendback:active, .btn--reject:active { box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.09); }
306
+
307
+ /* attention: still the thing to press, visibly "not ready yet" */
308
+ .btn--attention { box-shadow: var(--elev-1), 0 0 0 3px rgb(var(--c-st-sentback) / 0.35); }
309
+ .btn--attention:hover { box-shadow: var(--elev-1), 0 0 0 3px rgb(var(--c-st-sentback) / 0.35), inset 0 0 0 100px rgb(var(--c-on-primary) / 0.12); }
310
+
311
+ .btn-spinner {
312
+ width: 16px; height: 16px; border-radius: 9999px;
313
+ border: 2px solid currentColor; border-right-color: transparent;
314
+ animation: btn-spin 700ms linear infinite;
315
+ }
316
+
317
+ /* ---- §4.2 Card ---- */
318
+ .card {
319
+ background: rgb(var(--c-surface)); border-radius: 16px;
320
+ box-shadow: var(--elev-2), var(--card-border);
321
+ }
322
+ .card-h {
323
+ display: flex; align-items: center; justify-content: space-between; gap: 16px;
324
+ padding: 20px 24px; border-bottom: 1px solid rgb(var(--c-outline-var));
325
+ }
326
+ .card-h > .card-title, .card-title { font-size: 16px; line-height: 24px; font-weight: 600; margin: 0; min-width: 0; }
327
+ .card-b { padding: 24px; }
328
+ .card-b--compact { padding: 16px; }
329
+
330
+ /* ---- §4.3 Stat tile ---- */
331
+ .stat-tile {
332
+ display: flex; align-items: center; gap: 16px; padding: 20px; text-align: left;
333
+ background: rgb(var(--c-surface)); border-radius: 16px; width: 100%;
334
+ box-shadow: var(--elev-2), var(--card-border); border: 0; color: inherit;
335
+ transition: box-shadow var(--dur) var(--ease-std);
336
+ }
337
+ .stat-tile[data-active="true"] { box-shadow: var(--elev-2), var(--card-border), 0 0 0 2px rgb(var(--c-primary)); }
338
+ .stat-tile__icon {
339
+ width: 44px; height: 44px; border-radius: 8px; display: grid; place-items: center; flex-shrink: 0;
340
+ background: rgb(var(--tile-tone) / 0.14); color: rgb(var(--tile-tone));
341
+ }
342
+ .stat-tile__figure { font-size: 24px; line-height: 32px; font-weight: 600; font-variant-numeric: tabular-nums; }
343
+ .stat-tile__label { font-size: 12px; line-height: 16px; font-weight: 500; color: rgb(var(--c-on-surface-var)); }
344
+
345
+ /* ---- §4.4 Large-icon record card ---- */
346
+ .brd-grid {
347
+ display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
348
+ column-gap: 24px; row-gap: 48px; padding-top: 28px; align-items: start;
349
+ }
350
+ @media (min-width: 760px) { .brd-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
351
+ @media (min-width: 1100px) { .brd-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
352
+
353
+ .brd-card {
354
+ position: relative; display: flex; flex-direction: column;
355
+ background: rgb(var(--c-surface)); border-radius: 16px;
356
+ box-shadow: var(--elev-2), var(--card-border);
357
+ padding: 48px 36px 24px; min-height: 230px; text-align: left; color: inherit; border: 0; width: 100%;
358
+ transition: box-shadow var(--dur) var(--ease-std), transform var(--dur) var(--ease-std);
359
+ }
360
+ .brd-card:hover { box-shadow: var(--elev-3), var(--card-border); }
361
+ .brd-card__orb {
362
+ position: absolute; top: -26px; left: 36px; width: 52px; height: 52px; border-radius: 9999px;
363
+ display: grid; place-items: center; color: #fff; background: rgb(var(--orb-tone));
364
+ box-shadow: 0 6px 14px rgb(15 23 42 / 0.14);
365
+ }
366
+ .brd-card__title {
367
+ font-size: 18px; line-height: 24px; font-weight: 500; margin: 0;
368
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
369
+ min-height: 48px; overflow-wrap: break-word;
370
+ }
371
+ .brd-card__meta { display: flex; flex-direction: column; margin-top: 12px; margin-bottom: 16px; }
372
+ .brd-card__meta-row {
373
+ display: flex; align-items: center; gap: 8px; height: 28px; min-width: 0;
374
+ font-size: 12px; line-height: 16px; color: rgb(var(--c-on-surface-faint));
375
+ }
376
+ .brd-card__meta-row > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
377
+ .brd-card__foot {
378
+ margin-top: auto; padding-top: 16px; border-top: 1px solid rgb(var(--c-outline-var));
379
+ display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap;
380
+ }
381
+ .brd-card__foot-label {
382
+ font-size: 11px; line-height: 16px; font-weight: 700;
383
+ color: rgb(var(--c-on-surface-faint)); display: block; margin-bottom: 6px; white-space: nowrap;
384
+ }
385
+ .brd-card__pct { font-size: 14px; line-height: 20px; font-weight: 700; font-variant-numeric: tabular-nums; }
386
+
387
+ /* ---- §4.5 Table ---- */
388
+ .table { width: 100%; border-collapse: separate; border-spacing: 0; }
389
+ .table-plan { table-layout: fixed; }
390
+ .th {
391
+ font-size: 12px; line-height: 16px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase;
392
+ color: rgb(var(--c-on-surface-faint)); background: rgb(var(--c-surface-1));
393
+ padding: 12px 16px; text-align: left; border-bottom: 1px solid rgb(var(--c-outline-var));
394
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
395
+ }
396
+ .th--sortable { cursor: pointer; user-select: none; }
397
+ .th--sortable:hover { color: rgb(var(--c-on-surface)); }
398
+ .td {
399
+ font-size: 14px; line-height: 20px; padding: 14px 16px; vertical-align: middle;
400
+ border-bottom: 1px solid rgb(var(--c-outline-var)); overflow-wrap: anywhere;
401
+ }
402
+ .td--truncate { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
403
+ .td--num { text-align: right; font-variant-numeric: tabular-nums; }
404
+ .td-sub { display: block; font-size: 12px; line-height: 16px; color: rgb(var(--c-on-surface-faint)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
405
+ .row-link { cursor: pointer; transition: background-color var(--dur) var(--ease-std); }
406
+ .row-link:hover > .td { background: rgb(var(--c-surface-1)); }
407
+ .table tbody tr:last-child > .td { border-bottom: 0; }
408
+
409
+ /* ---- §4.6 Filter chips ---- */
410
+ .fchip {
411
+ display: inline-flex; align-items: center; gap: 8px; height: 32px; padding: 0 4px 0 12px;
412
+ border-radius: 8px; font-size: 13px; line-height: 16px; font-weight: 500;
413
+ color: rgb(var(--c-on-surface-var)); background: transparent; border: 0;
414
+ transition: color var(--dur) var(--ease-std), box-shadow var(--dur) var(--ease-std);
415
+ }
416
+ .fchip:hover { box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.05); }
417
+ .fchip[aria-pressed="true"] { color: rgb(var(--c-on-surface)); }
418
+ .fcount {
419
+ display: inline-grid; place-items: center; min-width: 26px; height: 26px; padding: 0 6px;
420
+ border-radius: 8px; background: rgb(var(--c-surface-2)); font-size: 11px; font-weight: 600;
421
+ font-variant-numeric: tabular-nums; border: 1px solid transparent;
422
+ transition: background-color var(--dur) var(--ease-std), border-color var(--dur) var(--ease-std);
423
+ }
424
+ .fchip[aria-pressed="true"] .fcount { background: rgb(var(--c-surface)); border-color: rgb(var(--c-primary)); color: rgb(var(--c-primary)); }
425
+
426
+ /* ---- §4.7 Tabs — segmented control ---- */
427
+ .tabs { display: inline-flex; padding: 4px; border-radius: 12px; background: rgb(var(--c-surface-2)); gap: 2px; }
428
+ .tab {
429
+ position: relative; display: inline-flex; align-items: center; gap: 8px; height: 34px; padding: 0 14px;
430
+ border-radius: 8px; font-size: 13px; line-height: 16px; font-weight: 500; white-space: nowrap;
431
+ color: rgb(var(--c-on-surface-var)); background: transparent; border: 0;
432
+ transition: background-color var(--dur) var(--ease-std), box-shadow var(--dur) var(--ease-std), color var(--dur) var(--ease-std);
433
+ }
434
+ .tab:hover { color: rgb(var(--c-on-surface)); }
435
+ .tab[aria-selected="true"] { background: rgb(var(--c-surface)); box-shadow: var(--elev-1); color: rgb(var(--c-on-surface)); font-weight: 600; }
436
+ .tab-badge {
437
+ display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 6px;
438
+ border-radius: 6px; background: rgb(var(--c-surface-3)); font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums;
439
+ }
440
+ .tab[aria-selected="true"] .tab-badge { background: rgb(var(--c-primary-container)); color: rgb(var(--c-on-primary-container)); }
441
+ .tab-alert { position: absolute; top: 6px; right: 6px; width: 8px; height: 8px; border-radius: 9999px; background: rgb(var(--c-st-sentback)); }
442
+
443
+ /* ---- §4.8 Toolbar button ---- */
444
+ .tbtn {
445
+ display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 32px; padding: 0 10px;
446
+ border-radius: 8px; background: rgb(var(--c-surface)); box-shadow: var(--elev-1);
447
+ font-size: 12px; line-height: 16px; font-weight: 500; color: rgb(var(--c-on-surface-var)); border: 0;
448
+ transition: background-color var(--dur) var(--ease-std), color var(--dur) var(--ease-std), box-shadow var(--dur) var(--ease-std);
449
+ }
450
+ .tbtn:hover { color: rgb(var(--c-on-surface)); box-shadow: var(--elev-1), inset 0 0 0 100px rgb(var(--c-on-surface) / 0.05); }
451
+ .tbtn--icon { width: 32px; padding: 0; }
452
+ .tbtn[aria-pressed="true"] { background: rgb(var(--c-primary-container)); color: rgb(var(--c-on-primary-container)); }
453
+
454
+ /* ---- §4.9 Inputs ---- */
455
+ .lbl { display: block; font-size: 12px; line-height: 16px; font-weight: 600; color: rgb(var(--c-on-surface-var)); margin-bottom: 8px; }
456
+ .lbl__req { color: rgb(var(--c-primary)); margin-left: 2px; }
457
+ .hint { display: block; font-size: 12px; line-height: 16px; color: rgb(var(--c-on-surface-faint)); margin-top: 8px; }
458
+ .hint--error { color: rgb(var(--chip-rejected-fg)); }
459
+ .inp {
460
+ display: block; width: 100%; height: 40px; padding: 0 16px; border-radius: 8px;
461
+ border: 1px solid rgb(var(--c-outline)); background: rgb(var(--c-surface)); color: rgb(var(--c-on-surface));
462
+ font-size: 14px; line-height: 20px; outline: none;
463
+ transition: border-color var(--dur) var(--ease-std), box-shadow var(--dur) var(--ease-std);
464
+ }
465
+ .inp::placeholder { color: rgb(var(--c-on-surface-faint)); }
466
+ .inp:hover { border-color: rgb(var(--c-on-surface-faint)); }
467
+ .inp:focus { border-color: rgb(var(--c-primary)); box-shadow: 0 0 0 3px rgb(var(--c-primary) / 0.12); }
468
+ .inp[aria-invalid="true"] { border-color: rgb(var(--c-st-rejected)); }
469
+ .inp[aria-invalid="true"]:focus { box-shadow: 0 0 0 3px rgb(var(--c-st-rejected) / 0.12); }
470
+ .inp:disabled { opacity: 0.4; pointer-events: none; }
471
+ .inp--dense { height: 36px; }
472
+ textarea.inp { height: auto; min-height: 96px; padding: 10px 16px; resize: vertical; }
473
+ select.inp { padding-right: 40px; appearance: none; background-image: none; }
474
+ .inp-wrap { position: relative; }
475
+ .inp-wrap > .inp-glyph { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: rgb(var(--c-on-surface-faint)); pointer-events: none; }
476
+ .inp-wrap > .inp-glyph--right { left: auto; right: 12px; }
477
+ .inp-wrap > .inp--glyph { padding-left: 36px; }
478
+ .inp-wrap > .inp--glyph-right { padding-right: 40px; }
479
+ .inp-search { background: rgb(var(--c-surface-1)); border-color: transparent; }
480
+ .inp-search:hover { border-color: transparent; background: rgb(var(--c-surface-2)); }
481
+ .inp-search:focus { background: rgb(var(--c-surface)); border-color: rgb(var(--c-primary)); }
482
+ .checkbox {
483
+ width: 16px; height: 16px; border-radius: 4px; border: 1px solid rgb(var(--c-outline));
484
+ accent-color: rgb(var(--c-primary)); cursor: pointer; margin: 0;
485
+ }
486
+
487
+ /* ---- §4.10 Chip / pill / tag ---- */
488
+ .chip {
489
+ display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px; border-radius: 9999px;
490
+ font-size: 12px; line-height: 16px; font-weight: 600; white-space: nowrap;
491
+ background: rgb(var(--chip-bg)); color: rgb(var(--chip-fg)); border: 1px solid rgb(var(--chip-bd));
492
+ }
493
+ .chip::before { content: ""; width: 6px; height: 6px; border-radius: 9999px; background: rgb(var(--chip-fg)); flex-shrink: 0; }
494
+ .chip--draft { --chip-bg: var(--chip-draft); --chip-fg: var(--chip-draft-fg); --chip-bd: var(--chip-draft-bd); }
495
+ .chip--submitted { --chip-bg: var(--chip-submitted); --chip-fg: var(--chip-submitted-fg); --chip-bd: var(--chip-submitted-bd); }
496
+ .chip--review { --chip-bg: var(--chip-review); --chip-fg: var(--chip-review-fg); --chip-bd: var(--chip-review-bd); }
497
+ .chip--approved { --chip-bg: var(--chip-approved); --chip-fg: var(--chip-approved-fg); --chip-bd: var(--chip-approved-bd); }
498
+ .chip--rejected { --chip-bg: var(--chip-rejected); --chip-fg: var(--chip-rejected-fg); --chip-bd: var(--chip-rejected-bd); }
499
+ .chip--sentback { --chip-bg: var(--chip-sentback); --chip-fg: var(--chip-sentback-fg); --chip-bd: var(--chip-sentback-bd); }
500
+ .tag {
501
+ display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 8px; border-radius: 8px;
502
+ background: rgb(var(--c-surface-1)); border: 1px solid rgb(var(--c-outline-var));
503
+ font-size: 12px; line-height: 16px; font-weight: 500; color: rgb(var(--c-on-surface-var)); white-space: nowrap;
504
+ }
505
+ .vchip { font-family: var(--font-mono); font-weight: 600; }
506
+ .vchip[data-current="true"] { background: rgb(var(--c-primary-container)); color: rgb(var(--c-on-primary-container)); border-color: transparent; }
507
+
508
+ /* ---- §4.11 Notice ---- */
509
+ .notice {
510
+ display: flex; align-items: flex-start; gap: 12px; padding: 16px 20px; border-radius: 8px;
511
+ background: rgb(var(--c-surface-2)); font-size: 14px; line-height: 1.5; color: rgb(var(--c-on-surface));
512
+ }
513
+ .notice > .notice__icon { margin-top: 2px; color: rgb(var(--c-on-surface-var)); }
514
+ .notice > .notice__text { min-width: 0; flex: 1; }
515
+ .notice > .notice__action { flex-shrink: 0; }
516
+ .notice--accent { background: rgb(var(--c-primary-container)); color: rgb(var(--c-on-primary-container)); }
517
+ .notice--accent > .notice__icon { color: rgb(var(--c-on-primary-container)); }
518
+ .notice--alert { background: rgb(var(--chip-rejected)); color: rgb(var(--chip-rejected-fg)); }
519
+ .notice--alert > .notice__icon { color: rgb(var(--c-st-rejected)); }
520
+
521
+ /* ---- §4.12 Avatar ---- */
522
+ .avatar {
523
+ display: inline-grid; place-items: center; border-radius: 9999px; overflow: hidden; flex-shrink: 0;
524
+ font-weight: 600; color: #fff; background: var(--avatar-tint, rgb(var(--c-on-surface-faint)));
525
+ user-select: none; line-height: 1;
526
+ }
527
+ .avatar > img { width: 100%; height: 100%; object-fit: cover; }
528
+ .avatar-stack { display: inline-flex; align-items: center; }
529
+ .avatar-stack > .avatar, .avatar-stack > .avatar-more { box-shadow: 0 0 0 2px rgb(var(--c-surface)); }
530
+ .avatar-stack > * + * { margin-left: -4px; }
531
+ .avatar-more {
532
+ display: inline-grid; place-items: center; border-radius: 9999px; flex-shrink: 0;
533
+ border: 1px dashed rgb(var(--c-outline)); background: rgb(var(--c-surface)); color: rgb(var(--c-on-surface-faint));
534
+ font-size: 10px; font-weight: 600; font-variant-numeric: tabular-nums;
535
+ }
536
+
537
+ /* ---- §4.13 Person + contact card ---- */
538
+ .person {
539
+ display: inline-flex; align-items: center; gap: 12px; min-width: 0; max-width: 100%;
540
+ background: none; border: 0; padding: 0; color: inherit; text-align: left; border-radius: 4px;
541
+ }
542
+ .person__name { font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
543
+ .person__sub { display: block; font-size: 12px; line-height: 16px; color: rgb(var(--c-on-surface-faint)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
544
+ .person-card {
545
+ position: fixed; z-index: 60; width: 300px; border-radius: 12px; background: rgb(var(--c-surface));
546
+ box-shadow: var(--elev-3), 0 0 0 1px rgb(var(--c-outline-var)); animation: fade-up var(--dur) var(--ease-std) both;
547
+ }
548
+ .person-card__head { display: flex; align-items: center; gap: 12px; padding: 16px; border-bottom: 1px solid rgb(var(--c-outline-var)); }
549
+ .person-card__name { font-size: 16px; line-height: 24px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
550
+ .person-card__desig { font-size: 12px; line-height: 16px; color: rgb(var(--c-on-surface-var)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
551
+ .person-card__body { padding: 12px 16px; display: flex; flex-direction: column; gap: 12px; }
552
+ .person-card__row { display: flex; align-items: center; gap: 10px; font-size: 13px; line-height: 16px; min-width: 0; color: rgb(var(--c-on-surface)); }
553
+ .person-card__row > .lucide { color: rgb(var(--c-on-surface-faint)); }
554
+ .person-card__row > span, .person-card__row > a { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
555
+
556
+ /* ---- §4.14 Stepper (approval route) ---- */
557
+ .stepper { display: flex; gap: 0; position: relative; }
558
+ .stepper--h { flex-direction: row; overflow-x: auto; }
559
+ .stepper--h .step { flex: 1 0 168px; min-width: 168px; position: relative; padding: 0 8px; text-align: center; }
560
+ .stepper--h .step + .step::before {
561
+ content: ""; position: absolute; top: 20px; right: 50%; left: -50%; height: 2px; transform: translateY(-1px);
562
+ background: rgb(var(--c-outline-var)); z-index: 0;
563
+ }
564
+ .stepper--h .step[data-state="done"] + .step::before { background: rgb(var(--c-primary)); }
565
+ .stepper--v { flex-direction: column; gap: 24px; }
566
+ .stepper--v .step { display: flex; gap: 12px; position: relative; text-align: left; }
567
+ .stepper--v .step + .step::before {
568
+ content: ""; position: absolute; left: 20px; top: -24px; height: 24px; width: 2px; transform: translateX(-1px);
569
+ background: rgb(var(--c-outline-var));
570
+ }
571
+ .stepper--v .step[data-state="done"] + .step::before { background: rgb(var(--c-primary)); }
572
+ .stamp {
573
+ position: relative; z-index: 1; width: 40px; height: 40px; border-radius: 9999px; display: inline-grid; place-items: center;
574
+ border: 2px solid rgb(var(--c-outline)); background: rgb(var(--c-surface)); color: rgb(var(--c-on-surface-var));
575
+ font-size: 12px; line-height: 16px; font-weight: 500; flex-shrink: 0;
576
+ }
577
+ .step[data-state="done"] .stamp { background: rgb(var(--c-primary)); border-color: rgb(var(--c-primary)); color: rgb(var(--c-on-primary)); }
578
+ .step[data-state="current"] .stamp {
579
+ background: rgb(var(--c-primary-container)); border-color: rgb(var(--c-primary)); color: rgb(var(--c-on-primary-container));
580
+ box-shadow: 0 0 0 4px rgb(var(--c-primary) / 0.14);
581
+ }
582
+ .step[data-state="rejected"] .stamp { background: rgb(var(--chip-rejected)); border-color: rgb(var(--chip-rejected-bd)); color: rgb(var(--chip-rejected-fg)); }
583
+ .step__body { min-width: 0; }
584
+ .stepper--h .step__body { margin-top: 8px; }
585
+ .stepper--v .step__body { padding-top: 10px; }
586
+ .step__title { font-size: 12px; line-height: 16px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
587
+ .step__sub { font-size: 12px; line-height: 16px; color: rgb(var(--c-on-surface-faint)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
588
+
589
+ /* ---- §4.15 Dialog ---- */
590
+ .modal-scrim { position: fixed; inset: 0; z-index: 50; background: rgb(0 0 0 / 0.3); display: grid; place-items: center; padding: 24px; }
591
+ .modal {
592
+ display: flex; flex-direction: column; width: 100%; max-height: calc(100vh - 48px);
593
+ background: rgb(var(--c-surface)); border-radius: 12px; box-shadow: var(--elev-3), var(--card-border);
594
+ animation: fade-up var(--dur) var(--ease-std) both;
595
+ }
596
+ .modal--480 { max-width: 480px; } .modal--640 { max-width: 640px; } .modal--960 { max-width: 960px; }
597
+ .modal__h { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 20px 24px; border-bottom: 1px solid rgb(var(--c-outline-var)); flex-shrink: 0; }
598
+ .modal__title { font-size: 16px; line-height: 24px; font-weight: 600; margin: 0; }
599
+ .modal__b { padding: 24px; overflow-y: auto; min-height: 0; flex: 1 1 auto; }
600
+ .modal__f { display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 16px 24px; border-top: 1px solid rgb(var(--c-outline-var)); flex-shrink: 0; }
601
+
602
+ /* ---- §4.16 Full-screen document ---- */
603
+ .doc-full { position: fixed; inset: 0; z-index: 55; background: rgb(var(--c-canvas)); overflow-y: auto; }
604
+ .doc-full__page { width: min(920px, calc(100% - 48px)); margin: 48px auto; background: rgb(var(--c-surface)); border-radius: 16px; box-shadow: var(--elev-2), var(--card-border); padding: 64px 72px; }
605
+ .doc-full__exit { position: fixed; top: 24px; right: 24px; box-shadow: var(--elev-2); }
606
+ .doc { font-family: var(--font-serif); font-size: 16px; line-height: 1.6; color: rgb(var(--c-on-surface)); }
607
+ .doc h1 { font-size: 24px; line-height: 32px; font-weight: 600; margin: 0 0 16px; }
608
+ .doc h2 { font-size: 20px; line-height: 28px; font-weight: 600; margin: 24px 0 8px; }
609
+ .doc p { margin: 0 0 12px; }
610
+
611
+ /* ---- §4.17 Skeleton ---- */
612
+ .skel { background: rgb(var(--c-surface-2)); border-radius: 8px; display: block; }
613
+ .skel--circle { border-radius: 9999px; }
614
+
615
+ /* ---- §4.18 Empty state ---- */
616
+ .empty { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 48px 24px; gap: 8px; }
617
+ .empty__well { width: 48px; height: 48px; border-radius: 9999px; background: rgb(var(--c-surface-1)); display: grid; place-items: center; color: rgb(var(--c-on-surface-faint)); margin-bottom: 8px; }
618
+ .empty__title { font-size: 14px; line-height: 20px; font-weight: 500; margin: 0; }
619
+ .empty__line { font-size: 14px; line-height: 20px; color: rgb(var(--c-on-surface-var)); max-width: 46ch; margin: 0; }
620
+
621
+ /* ---- §4.19 Toast ---- */
622
+ .toast {
623
+ position: fixed; left: 50%; bottom: 24px; transform: translateX(-50%); z-index: 70;
624
+ display: flex; align-items: center; gap: 12px; padding: 12px 16px; border-radius: 12px; max-width: min(480px, calc(100vw - 48px));
625
+ background: rgb(var(--c-on-surface)); color: rgb(var(--c-surface)); font-size: 14px; line-height: 20px;
626
+ box-shadow: var(--elev-2); animation: fade-up var(--dur) var(--ease-std) both;
627
+ }
628
+ .toast--error { background: rgb(var(--chip-rejected)); color: rgb(var(--chip-rejected-fg)); box-shadow: var(--elev-2), 0 0 0 1px rgb(var(--chip-rejected-bd)); }
629
+ .toast__text { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
630
+ .toast__close { display: inline-grid; place-items: center; width: 28px; height: 28px; border-radius: 9999px; background: none; border: 0; color: inherit; opacity: 0.8; }
631
+ .toast__close:hover { opacity: 1; box-shadow: inset 0 0 0 100px rgb(255 255 255 / 0.12); }
632
+
633
+ /* ---- §3 Shell ---- */
634
+ .shell { display: flex; min-height: 100vh; background: rgb(var(--c-sidebar)); color: rgb(var(--c-on-surface)); }
635
+ .shell__sidebar {
636
+ position: sticky; top: 0; height: 100vh; flex-shrink: 0; display: flex; flex-direction: column;
637
+ width: var(--shell-sidebar-w); background: rgb(var(--c-sidebar)); padding: 20px 16px 16px;
638
+ transition: width var(--dur-layout) var(--ease-std);
639
+ }
640
+ .shell[data-rail="true"] .shell__sidebar { width: var(--shell-rail-w); }
641
+ .shell__brand { display: flex; align-items: center; gap: 12px; height: 40px; padding: 0 12px; margin-bottom: 20px; min-width: 0; }
642
+ .shell__brand-mark { width: 32px; height: 32px; border-radius: 8px; display: grid; place-items: center; flex-shrink: 0; background: rgb(var(--c-primary)); color: rgb(var(--c-on-primary)); font-weight: 700; font-size: 14px; }
643
+ .shell__brand-name { font-size: 14px; line-height: 20px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
644
+ .shell__nav { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
645
+ .shell__nav-gap { height: 12px; flex-shrink: 0; }
646
+ .nav-item {
647
+ display: flex; align-items: center; gap: 12px; height: 48px; padding: 0 14px; border-radius: 12px;
648
+ font-size: 14px; line-height: 20px; font-weight: 500; color: rgb(var(--c-on-surface-var));
649
+ background: transparent; border: 0; width: 100%; text-align: left; white-space: nowrap; min-width: 0;
650
+ transition: background-color var(--dur) var(--ease-std), color var(--dur) var(--ease-std), box-shadow var(--dur) var(--ease-std);
651
+ }
652
+ .nav-item:hover { color: rgb(var(--c-on-surface)); box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.05); }
653
+ .nav-item[aria-current="page"] {
654
+ background: rgb(var(--c-primary)); color: rgb(var(--c-on-primary)); font-weight: 600;
655
+ box-shadow: 0 8px 16px rgb(var(--c-primary) / 0.22);
656
+ }
657
+ .nav-item[aria-current="page"]:hover { box-shadow: 0 8px 16px rgb(var(--c-primary) / 0.22), inset 0 0 0 100px rgb(var(--c-on-primary) / 0.12); }
658
+ .nav-item__label { overflow: hidden; text-overflow: ellipsis; flex: 1; }
659
+ .nav-item__count { font-size: 12px; font-weight: 600; font-variant-numeric: tabular-nums; opacity: 0.85; }
660
+ .shell[data-rail="true"] .nav-item { justify-content: center; padding: 0; }
661
+ .shell[data-rail="true"] .nav-item__label, .shell[data-rail="true"] .nav-item__count, .shell[data-rail="true"] .shell__brand-name { display: none; }
662
+ .shell__foot { margin-top: auto; padding-top: 16px; display: flex; flex-direction: column; gap: 4px; }
663
+ .shell__collapse {
664
+ position: absolute; top: 26px; right: -14px; z-index: 5; width: 28px; height: 28px; border-radius: 9999px;
665
+ display: grid; place-items: center; background: rgb(var(--c-surface)); color: rgb(var(--c-on-surface-var));
666
+ box-shadow: var(--elev-2), 0 0 0 1px rgb(var(--c-outline-var)); border: 0;
667
+ }
668
+ .shell__collapse:hover { color: rgb(var(--c-on-surface)); }
669
+ .shell__main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
670
+ .shell__header {
671
+ height: var(--shell-header-h); flex-shrink: 0; display: flex; align-items: center; gap: 24px; padding: 0 32px;
672
+ background: rgb(var(--c-sidebar));
673
+ }
674
+ .shell[data-rail="true"] .shell__header { display: none; }
675
+ .shell__greeting { min-width: 0; margin-right: auto; }
676
+ .shell__greeting-hi { font-size: 12px; line-height: 16px; color: rgb(var(--c-on-surface-var)); }
677
+ .shell__greeting-name { font-size: 16px; line-height: 24px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
678
+ .shell__search { width: 320px; flex-shrink: 1; min-width: 160px; }
679
+ .bell { position: relative; }
680
+ .bell__badge {
681
+ position: absolute; top: 4px; right: 4px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 9999px;
682
+ background: rgb(var(--c-primary)); color: rgb(var(--c-on-primary)); font-size: 10px; font-weight: 700; line-height: 16px; text-align: center;
683
+ box-shadow: 0 0 0 2px rgb(var(--c-sidebar));
684
+ }
685
+ .user-pill {
686
+ display: flex; align-items: center; gap: 12px; height: 48px; padding: 0 12px 0 4px; border-radius: 9999px;
687
+ background: transparent; border: 0; color: inherit; text-align: left;
688
+ transition: box-shadow var(--dur) var(--ease-std);
689
+ }
690
+ .user-pill:hover { box-shadow: inset 0 0 0 100px rgb(var(--c-on-surface) / 0.05); }
691
+ .user-pill__name { font-size: 14px; line-height: 20px; font-weight: 600; white-space: nowrap; }
692
+ .user-pill__role { font-size: 12px; line-height: 16px; color: rgb(var(--c-on-surface-var)); white-space: nowrap; }
693
+ .shell__content {
694
+ flex: 1; min-width: 0; background: rgb(var(--c-canvas)); border-top-left-radius: 24px;
695
+ padding: 24px;
696
+ }
697
+ @media (min-width: 1280px) { .shell__content { padding: 24px 32px 32px; } }
698
+ .shell[data-rail="true"] .shell__content { border-top-left-radius: 24px; }
699
+ .menu {
700
+ position: absolute; right: 0; top: calc(100% + 8px); z-index: 40; min-width: 200px; padding: 6px;
701
+ background: rgb(var(--c-surface)); border-radius: 12px; box-shadow: var(--elev-2), var(--card-border);
702
+ animation: fade-up var(--dur) var(--ease-std) both;
703
+ }
704
+ .menu__item {
705
+ display: flex; align-items: center; gap: 10px; width: 100%; height: 36px; padding: 0 10px; border-radius: 8px;
706
+ font-size: 14px; background: none; border: 0; color: rgb(var(--c-on-surface)); text-align: left;
707
+ }
708
+ .menu__item:hover { background: rgb(var(--c-surface-1)); }
709
+
710
+ /* ---- Toolbar row at the top of the content panel (law 2) ---- */
711
+ .toolbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 24px; }
712
+ .toolbar__left, .toolbar__right { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; min-width: 0; }
713
+ .toolbar__right { margin-left: auto; gap: 8px; }
714
+ }
715
+
716
+ @keyframes btn-spin { to { transform: rotate(360deg); } }
717
+
718
+ /* ---------------------------------------------------------------------
719
+ Utilities the spec names that Tailwind does not ship
720
+ --------------------------------------------------------------------- */
721
+ @utility clamp-2 {
722
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
723
+ }
724
+ @utility tabular { font-variant-numeric: tabular-nums; }
725
+ @utility hairline { border-color: rgb(var(--c-outline-var)); }