securityclaw 0.0.1

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 (62) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/LICENSE +21 -0
  3. package/README.md +135 -0
  4. package/README.zh-CN.md +135 -0
  5. package/admin/public/app.js +148 -0
  6. package/admin/public/favicon.svg +21 -0
  7. package/admin/public/index.html +31 -0
  8. package/admin/public/styles.css +2715 -0
  9. package/admin/server.ts +1053 -0
  10. package/bin/install-lib.mjs +88 -0
  11. package/bin/securityclaw.mjs +66 -0
  12. package/config/policy.default.yaml +520 -0
  13. package/index.ts +2662 -0
  14. package/install.sh +22 -0
  15. package/openclaw.plugin.json +60 -0
  16. package/package.json +69 -0
  17. package/src/admin/build.ts +113 -0
  18. package/src/admin/console_notice.ts +195 -0
  19. package/src/admin/dashboard_url_state.ts +80 -0
  20. package/src/admin/openclaw_session_catalog.ts +137 -0
  21. package/src/admin/runtime_guard.ts +51 -0
  22. package/src/admin/skill_interception_store.ts +1606 -0
  23. package/src/application/commands/approval_commands.ts +189 -0
  24. package/src/approvals/chat_approval_store.ts +433 -0
  25. package/src/config/live_config.ts +144 -0
  26. package/src/config/loader.ts +168 -0
  27. package/src/config/runtime_override.ts +66 -0
  28. package/src/config/strategy_store.ts +121 -0
  29. package/src/config/validator.ts +222 -0
  30. package/src/domain/models/resource_context.ts +31 -0
  31. package/src/domain/ports/approval_repository.ts +40 -0
  32. package/src/domain/ports/notification_port.ts +29 -0
  33. package/src/domain/ports/openclaw_adapter.ts +22 -0
  34. package/src/domain/services/account_policy_engine.ts +163 -0
  35. package/src/domain/services/approval_service.ts +336 -0
  36. package/src/domain/services/approval_subject_resolver.ts +37 -0
  37. package/src/domain/services/context_inference_service.ts +502 -0
  38. package/src/domain/services/file_rule_registry.ts +171 -0
  39. package/src/domain/services/formatting_service.ts +101 -0
  40. package/src/domain/services/path_candidate_inference.ts +111 -0
  41. package/src/domain/services/sensitive_path_registry.ts +288 -0
  42. package/src/domain/services/sensitivity_label_inference.ts +161 -0
  43. package/src/domain/services/shell_filesystem_inference.ts +360 -0
  44. package/src/engine/approval_fsm.ts +104 -0
  45. package/src/engine/decision_engine.ts +39 -0
  46. package/src/engine/dlp_engine.ts +91 -0
  47. package/src/engine/rule_engine.ts +208 -0
  48. package/src/events/emitter.ts +86 -0
  49. package/src/events/schema.ts +27 -0
  50. package/src/hooks/context_guard.ts +36 -0
  51. package/src/hooks/output_guard.ts +66 -0
  52. package/src/hooks/persist_guard.ts +69 -0
  53. package/src/hooks/policy_guard.ts +222 -0
  54. package/src/hooks/result_guard.ts +88 -0
  55. package/src/i18n/locale.ts +36 -0
  56. package/src/index.ts +255 -0
  57. package/src/infrastructure/adapters/notification_adapter.ts +173 -0
  58. package/src/infrastructure/adapters/openclaw_adapter_impl.ts +59 -0
  59. package/src/infrastructure/config/plugin_config_parser.ts +105 -0
  60. package/src/monitoring/status_store.ts +612 -0
  61. package/src/types.ts +409 -0
  62. package/src/utils.ts +97 -0
@@ -0,0 +1,2715 @@
1
+ :root {
2
+ --bg-base: #eef4fb;
3
+ --bg-elevated: #ffffff;
4
+ --bg-subtle: #f8fbff;
5
+ --bg-canvas-start: #f6f9fd;
6
+ --bg-canvas-end: #eef4fb;
7
+ --bg-panel-accent: #f7fbff;
8
+ --bg-panel-muted: #f5f9ff;
9
+ --panel-border: #d8e2ef;
10
+ --ink: #10263e;
11
+ --muted: #4e6783;
12
+ --line: #d8e2ef;
13
+ --line-soft: rgba(141, 171, 201, 0.22);
14
+ --brand: #0f6ea9;
15
+ --brand-strong: #16a0cf;
16
+ --brand-soft: rgba(15, 110, 169, 0.12);
17
+ --brand-soft-strong: rgba(15, 110, 169, 0.16);
18
+ --brand-focus: rgba(15, 110, 169, 0.2);
19
+ --good: #18755f;
20
+ --good-soft: rgba(24, 117, 95, 0.12);
21
+ --good-surface: #f2faf7;
22
+ --good-border: rgba(24, 117, 95, 0.28);
23
+ --good-border-soft: rgba(24, 117, 95, 0.18);
24
+ --warn: #a96211;
25
+ --warn-soft: rgba(169, 98, 17, 0.12);
26
+ --warn-surface: #fff8ef;
27
+ --warn-border: rgba(169, 98, 17, 0.28);
28
+ --warn-border-soft: rgba(169, 98, 17, 0.18);
29
+ --bad: #c03a4b;
30
+ --bad-soft: rgba(192, 58, 75, 0.12);
31
+ --bad-surface: #fff3f5;
32
+ --bad-border: rgba(192, 58, 75, 0.28);
33
+ --bad-border-soft: rgba(192, 58, 75, 0.18);
34
+ --surface-ghost: #f6faff;
35
+ --surface-ghost-strong: #f9fcff;
36
+ --surface-hover: rgba(15, 110, 169, 0.06);
37
+ --surface-tab: #eaf0f7;
38
+ --surface-tab-hover: rgba(255, 255, 255, 0.65);
39
+ --surface-chart-border: #d9e6f4;
40
+ --surface-chart-top: #ffffff;
41
+ --surface-chart-bottom: #f6faff;
42
+ --surface-tooltip: #ffffff;
43
+ --surface-table-head: #f6faff;
44
+ --surface-track: #ecf2f9;
45
+ --surface-neutral-chip: rgba(233, 241, 248, 0.88);
46
+ --surface-neutral-chip-border: rgba(141, 171, 201, 0.18);
47
+ --surface-user-message: rgba(230, 244, 255, 0.9);
48
+ --surface-user-message-border: rgba(15, 110, 169, 0.24);
49
+ --surface-system-message: rgba(255, 248, 239, 0.92);
50
+ --surface-system-message-border: rgba(169, 98, 17, 0.26);
51
+ --surface-account-card-top: #ffffff;
52
+ --surface-account-card-bottom: #f8fbff;
53
+ --shadow-brand: 0 8px 18px rgba(15, 110, 169, 0.24);
54
+ --shadow-brand-hover: 0 10px 22px rgba(15, 110, 169, 0.28);
55
+ --shadow-soft: 0 6px 16px rgba(16, 44, 76, 0.08);
56
+ --shadow-soft-strong: 0 8px 18px rgba(16, 44, 76, 0.08);
57
+ --shadow-float: 0 10px 24px rgba(16, 44, 76, 0.14);
58
+ --shadow-subtle: 0 1px 2px rgba(16, 44, 76, 0.14);
59
+ --shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.7);
60
+ --axis: #c8d8eb;
61
+ --grid: #e7eef8;
62
+ --chart-tick: #607891;
63
+ --chart-total: #1e40af;
64
+ --chart-total-soft: rgba(30, 64, 175, 0.12);
65
+ --chart-risk: #c03a4b;
66
+ --radius-lg: 16px;
67
+ --radius-md: 12px;
68
+ --radius-sm: 10px;
69
+ }
70
+
71
+ :root[data-theme="dark"] {
72
+ --bg-base: #020817;
73
+ --bg-elevated: #081321;
74
+ --bg-subtle: #0c1b2d;
75
+ --bg-canvas-start: #07111f;
76
+ --bg-canvas-end: #020817;
77
+ --bg-panel-accent: #0b1727;
78
+ --bg-panel-muted: #0d1a2b;
79
+ --panel-border: #22364b;
80
+ --ink: #e6eef7;
81
+ --muted: #95a8bc;
82
+ --line: #24384d;
83
+ --line-soft: rgba(96, 124, 156, 0.22);
84
+ --brand: #38bdf8;
85
+ --brand-strong: #0ea5e9;
86
+ --brand-soft: rgba(56, 189, 248, 0.16);
87
+ --brand-soft-strong: rgba(56, 189, 248, 0.22);
88
+ --brand-focus: rgba(56, 189, 248, 0.24);
89
+ --good: #34d399;
90
+ --good-soft: rgba(52, 211, 153, 0.16);
91
+ --good-surface: rgba(16, 185, 129, 0.14);
92
+ --good-border: rgba(52, 211, 153, 0.28);
93
+ --good-border-soft: rgba(52, 211, 153, 0.2);
94
+ --warn: #f59e0b;
95
+ --warn-soft: rgba(245, 158, 11, 0.16);
96
+ --warn-surface: rgba(245, 158, 11, 0.14);
97
+ --warn-border: rgba(245, 158, 11, 0.28);
98
+ --warn-border-soft: rgba(245, 158, 11, 0.2);
99
+ --bad: #fb7185;
100
+ --bad-soft: rgba(251, 113, 133, 0.16);
101
+ --bad-surface: rgba(251, 113, 133, 0.14);
102
+ --bad-border: rgba(251, 113, 133, 0.28);
103
+ --bad-border-soft: rgba(251, 113, 133, 0.2);
104
+ --surface-ghost: #0d1a2a;
105
+ --surface-ghost-strong: #0f1d2f;
106
+ --surface-hover: rgba(56, 189, 248, 0.12);
107
+ --surface-tab: #0d1b2d;
108
+ --surface-tab-hover: rgba(56, 189, 248, 0.12);
109
+ --surface-chart-border: #23364b;
110
+ --surface-chart-top: #0d1726;
111
+ --surface-chart-bottom: #091320;
112
+ --surface-tooltip: #081522;
113
+ --surface-table-head: #0c1725;
114
+ --surface-track: #13263a;
115
+ --surface-neutral-chip: rgba(20, 36, 55, 0.92);
116
+ --surface-neutral-chip-border: rgba(96, 124, 156, 0.2);
117
+ --surface-user-message: rgba(14, 71, 110, 0.35);
118
+ --surface-user-message-border: rgba(56, 189, 248, 0.28);
119
+ --surface-system-message: rgba(115, 75, 13, 0.24);
120
+ --surface-system-message-border: rgba(245, 158, 11, 0.26);
121
+ --surface-account-card-top: #0d1928;
122
+ --surface-account-card-bottom: #091320;
123
+ --shadow-brand: 0 10px 24px rgba(2, 6, 23, 0.36);
124
+ --shadow-brand-hover: 0 14px 30px rgba(2, 6, 23, 0.44);
125
+ --shadow-soft: 0 10px 24px rgba(2, 6, 23, 0.22);
126
+ --shadow-soft-strong: 0 12px 28px rgba(2, 6, 23, 0.3);
127
+ --shadow-float: 0 14px 32px rgba(2, 6, 23, 0.42);
128
+ --shadow-subtle: 0 1px 2px rgba(2, 6, 23, 0.36);
129
+ --shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.04);
130
+ --axis: rgba(148, 163, 184, 0.4);
131
+ --grid: rgba(148, 163, 184, 0.18);
132
+ --chart-tick: #9fb2c7;
133
+ --chart-total: #60a5fa;
134
+ --chart-total-soft: rgba(96, 165, 250, 0.16);
135
+ --chart-risk: #fb7185;
136
+ }
137
+
138
+ * {
139
+ box-sizing: border-box;
140
+ }
141
+
142
+ html {
143
+ background: var(--bg-base);
144
+ }
145
+
146
+ body {
147
+ margin: 0;
148
+ min-height: 100vh;
149
+ color: var(--ink);
150
+ font-family: "IBM Plex Sans", "Segoe UI", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
151
+ background: linear-gradient(180deg, var(--bg-canvas-start) 0%, var(--bg-canvas-end) 100%);
152
+ transition: background 180ms ease, color 180ms ease;
153
+ }
154
+
155
+ button,
156
+ select,
157
+ input {
158
+ font: inherit;
159
+ }
160
+
161
+ button {
162
+ border: 1px solid transparent;
163
+ border-radius: var(--radius-sm);
164
+ cursor: pointer;
165
+ transition: box-shadow 180ms ease, background-color 180ms ease, border-color 180ms ease, color 180ms ease;
166
+ }
167
+
168
+ button:disabled {
169
+ opacity: 0.58;
170
+ cursor: not-allowed;
171
+ transform: none;
172
+ }
173
+
174
+ button:focus-visible,
175
+ select:focus-visible,
176
+ input:focus-visible {
177
+ outline: 3px solid var(--brand-focus);
178
+ outline-offset: 2px;
179
+ }
180
+
181
+ button.primary,
182
+ button.ghost {
183
+ padding: 10px 14px;
184
+ font-weight: 700;
185
+ }
186
+
187
+ button.small {
188
+ min-height: 38px;
189
+ padding: 0 14px;
190
+ font-size: 13px;
191
+ }
192
+
193
+ button.primary {
194
+ color: #fff;
195
+ background: linear-gradient(135deg, var(--brand) 0%, var(--brand-strong) 100%);
196
+ border-color: var(--brand-soft-strong);
197
+ box-shadow: var(--shadow-brand);
198
+ }
199
+
200
+ button.primary:hover {
201
+ box-shadow: var(--shadow-brand-hover);
202
+ }
203
+
204
+ button.ghost {
205
+ color: var(--ink);
206
+ background: var(--surface-ghost);
207
+ border-color: var(--line);
208
+ }
209
+
210
+ .app {
211
+ width: 100%;
212
+ min-height: 100vh;
213
+ margin: 0;
214
+ display: grid;
215
+ gap: 0;
216
+ }
217
+
218
+ .card {
219
+ background: transparent;
220
+ border: 0;
221
+ border-radius: 0;
222
+ box-shadow: none;
223
+ }
224
+
225
+ .workspace-kicker,
226
+ .eyebrow {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ gap: 8px;
230
+ color: var(--brand);
231
+ font-size: 12px;
232
+ font-weight: 800;
233
+ letter-spacing: 0.14em;
234
+ text-transform: uppercase;
235
+ }
236
+
237
+ .workspace-favicon {
238
+ width: 20px;
239
+ height: 20px;
240
+ flex: 0 0 20px;
241
+ border-radius: 5px;
242
+ }
243
+
244
+ .workspace {
245
+ width: 100%;
246
+ min-height: 100vh;
247
+ padding: 0 clamp(18px, 3vw, 42px) 24px;
248
+ display: grid;
249
+ gap: 18px;
250
+ align-content: start;
251
+ animation: rise-in 220ms ease;
252
+ }
253
+
254
+ .workspace-top,
255
+ .card-head {
256
+ display: flex;
257
+ justify-content: space-between;
258
+ align-items: flex-start;
259
+ gap: 14px;
260
+ }
261
+
262
+ .workspace-top {
263
+ padding-top: 22px;
264
+ }
265
+
266
+ .workspace-title {
267
+ min-width: 0;
268
+ }
269
+
270
+ .toolbar-controls {
271
+ margin-left: auto;
272
+ display: flex;
273
+ align-items: center;
274
+ flex-wrap: wrap;
275
+ justify-content: flex-end;
276
+ gap: 8px;
277
+ padding-top: 4px;
278
+ }
279
+
280
+ .control-group {
281
+ display: flex;
282
+ align-items: center;
283
+ gap: 4px;
284
+ padding: 4px;
285
+ border-radius: 14px;
286
+ border: 1px solid var(--line);
287
+ background: var(--bg-elevated);
288
+ box-shadow: var(--shadow-subtle);
289
+ }
290
+
291
+ .control-group:focus-within {
292
+ border-color: var(--brand-soft-strong);
293
+ box-shadow: 0 0 0 1px var(--brand-soft-strong);
294
+ }
295
+
296
+ .toolbar-icon-button {
297
+ width: 36px;
298
+ height: 36px;
299
+ padding: 0;
300
+ border-radius: 11px;
301
+ border: 1px solid transparent;
302
+ background: transparent;
303
+ color: var(--muted);
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: center;
307
+ box-shadow: none;
308
+ transition: transform 180ms ease, box-shadow 180ms ease, background-color 180ms ease, border-color 180ms ease, color 180ms ease;
309
+ }
310
+
311
+ .toolbar-icon-button:hover {
312
+ color: var(--ink);
313
+ background: var(--surface-hover);
314
+ }
315
+
316
+ .toolbar-icon-button:focus-visible {
317
+ outline: 3px solid var(--brand-focus);
318
+ outline-offset: 2px;
319
+ }
320
+
321
+ .toolbar-icon-button.active {
322
+ color: var(--ink);
323
+ border-color: var(--brand-soft-strong);
324
+ background: linear-gradient(135deg, var(--brand-soft-strong) 0%, var(--brand-soft) 100%);
325
+ box-shadow: var(--shadow-subtle);
326
+ }
327
+
328
+ .toolbar-icon-button.active:hover {
329
+ transform: translateY(-1px);
330
+ }
331
+
332
+ .toolbar-icon-button svg {
333
+ width: 18px;
334
+ height: 18px;
335
+ stroke: currentColor;
336
+ fill: none;
337
+ stroke-width: 1.8;
338
+ stroke-linecap: round;
339
+ stroke-linejoin: round;
340
+ }
341
+
342
+ .toolbar-icon-button-text {
343
+ width: 40px;
344
+ }
345
+
346
+ .toolbar-monogram {
347
+ font-size: 14px;
348
+ font-weight: 800;
349
+ line-height: 1;
350
+ letter-spacing: -0.03em;
351
+ }
352
+
353
+ .card-head {
354
+ margin-bottom: 14px;
355
+ }
356
+
357
+ .workspace-title h1 {
358
+ margin: 4px 0 10px;
359
+ font-size: clamp(22px, 3vw, 32px);
360
+ line-height: 1.1;
361
+ letter-spacing: -0.03em;
362
+ }
363
+
364
+ .workspace-heading {
365
+ margin-top: 8px;
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 16px;
369
+ flex-wrap: wrap;
370
+ }
371
+
372
+ .card-head h2,
373
+ .card-head h3 {
374
+ margin: 0;
375
+ font-size: 24px;
376
+ }
377
+
378
+ .status-inline {
379
+ display: flex;
380
+ align-items: center;
381
+ gap: 10px;
382
+ min-height: 42px;
383
+ padding: 0 12px;
384
+ border-radius: var(--radius-sm);
385
+ border: 1px solid var(--line);
386
+ background: var(--bg-elevated);
387
+ font-size: 13px;
388
+ font-weight: 700;
389
+ width: fit-content;
390
+ }
391
+
392
+ .status-banner {
393
+ max-width: min(920px, 100%);
394
+ }
395
+
396
+ .status-dot {
397
+ width: 9px;
398
+ height: 9px;
399
+ flex: 0 0 9px;
400
+ border-radius: 50%;
401
+ background: currentColor;
402
+ }
403
+
404
+ .status-inline.good {
405
+ color: var(--good);
406
+ background: var(--good-surface);
407
+ }
408
+
409
+ .status-inline.warn {
410
+ color: var(--warn);
411
+ background: var(--warn-surface);
412
+ }
413
+
414
+ .status-inline.error {
415
+ color: var(--bad);
416
+ background: var(--bad-surface);
417
+ }
418
+
419
+ .tablist {
420
+ display: inline-flex;
421
+ align-items: center;
422
+ gap: 2px;
423
+ padding: 3px;
424
+ border: 1px solid var(--line);
425
+ border-radius: 10px;
426
+ background: var(--surface-tab);
427
+ }
428
+
429
+ .tab-button {
430
+ min-height: 30px;
431
+ padding: 0 10px;
432
+ text-align: center;
433
+ border: 1px solid transparent;
434
+ background: transparent;
435
+ display: inline-flex;
436
+ align-items: center;
437
+ justify-content: center;
438
+ gap: 7px;
439
+ border-radius: 7px;
440
+ color: var(--muted);
441
+ white-space: nowrap;
442
+ }
443
+
444
+ .tab-button:hover {
445
+ background: var(--surface-tab-hover);
446
+ }
447
+
448
+ .tab-button.active {
449
+ color: var(--ink);
450
+ border-color: var(--panel-border);
451
+ background: var(--bg-elevated);
452
+ box-shadow: var(--shadow-subtle);
453
+ }
454
+
455
+ .tab-label {
456
+ font-size: 13px;
457
+ font-weight: 700;
458
+ }
459
+
460
+ .tab-count {
461
+ min-width: 20px;
462
+ min-height: 18px;
463
+ padding: 0 6px;
464
+ border-radius: 999px;
465
+ background: var(--brand-soft);
466
+ color: var(--brand);
467
+ font-size: 11px;
468
+ font-weight: 700;
469
+ line-height: 1;
470
+ display: inline-flex;
471
+ align-items: center;
472
+ justify-content: center;
473
+ }
474
+
475
+ .tab-panel {
476
+ animation: rise-in 220ms ease;
477
+ }
478
+
479
+ .card-head-compact {
480
+ margin-bottom: 20px;
481
+ }
482
+
483
+ .overview-grid {
484
+ display: grid;
485
+ grid-template-columns: repeat(2, minmax(0, 1fr));
486
+ gap: 14px;
487
+ align-items: stretch;
488
+ }
489
+
490
+ .overview-grid > .panel-card {
491
+ height: 100%;
492
+ }
493
+
494
+ .overview-charts {
495
+ margin-top: 14px;
496
+ display: grid;
497
+ grid-template-columns: repeat(2, minmax(0, 1fr));
498
+ gap: 14px;
499
+ }
500
+
501
+ .panel-card {
502
+ padding: 18px;
503
+ border-radius: var(--radius-lg);
504
+ border: 1px solid var(--panel-border);
505
+ background: var(--bg-elevated);
506
+ }
507
+
508
+ .stats {
509
+ display: grid;
510
+ grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
511
+ gap: 12px;
512
+ }
513
+
514
+ .stat {
515
+ padding: 16px;
516
+ border-radius: var(--radius-md);
517
+ border: 1px solid var(--line);
518
+ background: var(--bg-subtle);
519
+ min-height: 122px;
520
+ }
521
+
522
+ .stat-head {
523
+ display: flex;
524
+ justify-content: space-between;
525
+ align-items: flex-start;
526
+ gap: 12px;
527
+ }
528
+
529
+ .stat b {
530
+ display: block;
531
+ color: var(--muted);
532
+ font-size: 12px;
533
+ letter-spacing: 0.08em;
534
+ text-transform: uppercase;
535
+ }
536
+
537
+ .stat span {
538
+ display: block;
539
+ margin-top: 16px;
540
+ font-size: clamp(30px, 3vw, 40px);
541
+ font-weight: 800;
542
+ line-height: 1;
543
+ letter-spacing: -0.03em;
544
+ }
545
+
546
+ .stat-value,
547
+ .stat-value-button {
548
+ display: block;
549
+ margin-top: 16px;
550
+ font-size: clamp(30px, 3vw, 40px);
551
+ font-weight: 800;
552
+ line-height: 1;
553
+ letter-spacing: -0.03em;
554
+ }
555
+
556
+ .stat-value-button {
557
+ padding: 0;
558
+ border: 0;
559
+ background: transparent;
560
+ color: inherit;
561
+ text-align: left;
562
+ width: fit-content;
563
+ cursor: pointer;
564
+ text-decoration: underline;
565
+ text-decoration-thickness: 2px;
566
+ text-underline-offset: 6px;
567
+ text-decoration-color: currentColor;
568
+ opacity: 0.86;
569
+ transition: transform 180ms ease, opacity 180ms ease;
570
+ }
571
+
572
+ .stat-value-button:hover {
573
+ transform: translateX(1px);
574
+ opacity: 1;
575
+ }
576
+
577
+ .stat-value-button:focus-visible {
578
+ outline: 3px solid var(--brand-focus);
579
+ outline-offset: 4px;
580
+ opacity: 1;
581
+ }
582
+
583
+ .stat.good {
584
+ background: var(--good-surface);
585
+ }
586
+
587
+ .stat.good .stat-value,
588
+ .stat.good .stat-value-button {
589
+ color: var(--good);
590
+ }
591
+
592
+ .stat.warn {
593
+ background: var(--warn-surface);
594
+ }
595
+
596
+ .stat.warn .stat-value,
597
+ .stat.warn .stat-value-button {
598
+ color: var(--warn);
599
+ }
600
+
601
+ .stat.bad {
602
+ background: var(--bad-surface);
603
+ }
604
+
605
+ .stat.bad .stat-value,
606
+ .stat.bad .stat-value-button {
607
+ color: var(--bad);
608
+ }
609
+
610
+ .insight-card {
611
+ display: grid;
612
+ gap: 18px;
613
+ align-content: start;
614
+ background: var(--bg-panel-accent);
615
+ }
616
+
617
+ .overview-skill-card {
618
+ grid-column: 1 / -1;
619
+ display: grid;
620
+ gap: 16px;
621
+ background: linear-gradient(180deg, var(--bg-panel-accent) 0%, var(--bg-elevated) 100%);
622
+ }
623
+
624
+ .overview-skill-head {
625
+ display: flex;
626
+ justify-content: space-between;
627
+ align-items: flex-start;
628
+ gap: 14px;
629
+ }
630
+
631
+ .overview-skill-head h3 {
632
+ margin: 6px 0 0;
633
+ font-size: 20px;
634
+ }
635
+
636
+ .overview-skill-head p {
637
+ margin: 8px 0 0;
638
+ color: var(--muted);
639
+ line-height: 1.65;
640
+ }
641
+
642
+ .overview-skill-stats {
643
+ display: grid;
644
+ grid-template-columns: repeat(5, minmax(0, 1fr));
645
+ gap: 12px;
646
+ }
647
+
648
+ .overview-skill-stat {
649
+ padding: 14px;
650
+ border-radius: var(--radius-md);
651
+ border: 1px solid var(--line);
652
+ background: var(--bg-subtle);
653
+ display: grid;
654
+ gap: 8px;
655
+ }
656
+
657
+ .overview-skill-stat span {
658
+ color: var(--muted);
659
+ font-size: 12px;
660
+ font-weight: 700;
661
+ letter-spacing: 0.05em;
662
+ text-transform: uppercase;
663
+ }
664
+
665
+ .overview-skill-stat strong {
666
+ font-size: 28px;
667
+ line-height: 1;
668
+ }
669
+
670
+ .overview-skill-highlights {
671
+ display: grid;
672
+ gap: 12px;
673
+ }
674
+
675
+ .overview-skill-item {
676
+ width: 100%;
677
+ padding: 14px 16px;
678
+ border-radius: var(--radius-md);
679
+ border: 1px solid var(--line);
680
+ background: var(--bg-elevated);
681
+ display: grid;
682
+ grid-template-columns: minmax(0, 1fr) auto;
683
+ gap: 14px;
684
+ align-items: center;
685
+ text-align: left;
686
+ }
687
+
688
+ .overview-skill-item:hover {
689
+ border-color: var(--brand-soft-strong);
690
+ background: var(--surface-hover);
691
+ }
692
+
693
+ .overview-skill-item-main {
694
+ min-width: 0;
695
+ display: grid;
696
+ gap: 8px;
697
+ }
698
+
699
+ .overview-skill-item-head {
700
+ display: flex;
701
+ justify-content: space-between;
702
+ align-items: flex-start;
703
+ gap: 12px;
704
+ }
705
+
706
+ .overview-skill-item-head strong {
707
+ font-size: 15px;
708
+ }
709
+
710
+ .overview-skill-item-meta {
711
+ color: var(--muted);
712
+ font-size: 13px;
713
+ }
714
+
715
+ .overview-skill-item-side {
716
+ display: grid;
717
+ gap: 6px;
718
+ justify-items: end;
719
+ }
720
+
721
+ .overview-skill-item-side span {
722
+ color: var(--muted);
723
+ font-size: 12px;
724
+ font-weight: 700;
725
+ letter-spacing: 0.04em;
726
+ text-transform: uppercase;
727
+ }
728
+
729
+ .overview-skill-item-side strong {
730
+ font-size: 13px;
731
+ font-weight: 700;
732
+ }
733
+
734
+ .chart-card {
735
+ display: grid;
736
+ gap: 14px;
737
+ align-content: start;
738
+ }
739
+
740
+ .trend-card {
741
+ grid-column: 1 / -1;
742
+ }
743
+
744
+ .chart-head {
745
+ display: flex;
746
+ justify-content: space-between;
747
+ align-items: flex-end;
748
+ gap: 12px;
749
+ flex-wrap: wrap;
750
+ }
751
+
752
+ .chart-head h3 {
753
+ margin: 0;
754
+ font-size: 19px;
755
+ }
756
+
757
+ .chart-subtitle {
758
+ color: var(--muted);
759
+ font-size: 12px;
760
+ font-weight: 700;
761
+ }
762
+
763
+ .chart-empty {
764
+ padding: 12px 14px;
765
+ border-radius: var(--radius-sm);
766
+ border: 1px solid var(--line);
767
+ background: var(--bg-subtle);
768
+ color: var(--muted);
769
+ font-size: 14px;
770
+ }
771
+
772
+ .chart-surface {
773
+ min-height: 230px;
774
+ border-radius: var(--radius-md);
775
+ border: 1px solid var(--surface-chart-border);
776
+ background: linear-gradient(180deg, var(--surface-chart-top) 0%, var(--surface-chart-bottom) 100%);
777
+ box-shadow: var(--shadow-inset);
778
+ padding: 12px 12px 6px;
779
+ position: relative;
780
+ }
781
+
782
+ .chart-card .recharts-legend-item-text {
783
+ color: var(--muted) !important;
784
+ font-size: 12px;
785
+ }
786
+
787
+ .chart-card .recharts-cartesian-axis-tick-value {
788
+ fill: var(--chart-tick);
789
+ }
790
+
791
+ .chart-card .recharts-cartesian-axis-line,
792
+ .chart-card .recharts-cartesian-axis-tick-line {
793
+ stroke: var(--axis);
794
+ }
795
+
796
+ .chart-tooltip {
797
+ min-width: 120px;
798
+ max-width: 260px;
799
+ padding: 8px 10px;
800
+ border-radius: var(--radius-sm);
801
+ border: 1px solid var(--surface-chart-border);
802
+ background: var(--surface-tooltip);
803
+ box-shadow: var(--shadow-float);
804
+ }
805
+
806
+ .chart-tooltip-title {
807
+ color: var(--ink);
808
+ font-size: 12px;
809
+ font-weight: 800;
810
+ }
811
+
812
+ .chart-tooltip-row {
813
+ margin-top: 4px;
814
+ display: flex;
815
+ justify-content: space-between;
816
+ align-items: center;
817
+ gap: 10px;
818
+ }
819
+
820
+ .chart-tooltip-key,
821
+ .chart-tooltip-value {
822
+ color: var(--muted);
823
+ font-size: 12px;
824
+ }
825
+
826
+ .donut-layout {
827
+ display: grid;
828
+ grid-template-columns: 190px minmax(0, 1fr);
829
+ gap: 18px;
830
+ align-items: center;
831
+ }
832
+
833
+ .donut-shell {
834
+ width: 190px;
835
+ height: 190px;
836
+ margin: 0 auto;
837
+ border-radius: 50%;
838
+ display: grid;
839
+ place-items: center;
840
+ }
841
+
842
+ .donut-inner {
843
+ width: 118px;
844
+ height: 118px;
845
+ border-radius: 50%;
846
+ border: 1px solid var(--line);
847
+ background: var(--bg-elevated);
848
+ display: grid;
849
+ place-items: center;
850
+ text-align: center;
851
+ gap: 2px;
852
+ }
853
+
854
+ .donut-inner strong {
855
+ font-size: 28px;
856
+ line-height: 1;
857
+ letter-spacing: -0.02em;
858
+ }
859
+
860
+ .donut-inner span {
861
+ color: var(--muted);
862
+ font-size: 12px;
863
+ font-weight: 700;
864
+ }
865
+
866
+ .donut-legend {
867
+ list-style: none;
868
+ margin: 0;
869
+ padding: 0;
870
+ display: grid;
871
+ gap: 8px;
872
+ }
873
+
874
+ .donut-legend-item {
875
+ min-height: 38px;
876
+ padding: 0 10px;
877
+ border-radius: var(--radius-sm);
878
+ border: 1px solid var(--line);
879
+ background: var(--bg-subtle);
880
+ display: grid;
881
+ grid-template-columns: auto minmax(0, 1fr) auto;
882
+ align-items: center;
883
+ gap: 8px;
884
+ }
885
+
886
+ .legend-dot {
887
+ width: 9px;
888
+ height: 9px;
889
+ border-radius: 50%;
890
+ }
891
+
892
+ .legend-label {
893
+ min-width: 0;
894
+ font-size: 13px;
895
+ font-weight: 700;
896
+ }
897
+
898
+ .legend-value {
899
+ color: var(--muted);
900
+ font-size: 12px;
901
+ font-weight: 700;
902
+ }
903
+
904
+ .distribution-list {
905
+ list-style: none;
906
+ margin: 0;
907
+ padding: 0;
908
+ display: grid;
909
+ gap: 10px;
910
+ }
911
+
912
+ .distribution-item {
913
+ display: grid;
914
+ gap: 6px;
915
+ }
916
+
917
+ .distribution-row {
918
+ display: flex;
919
+ justify-content: space-between;
920
+ align-items: baseline;
921
+ gap: 12px;
922
+ }
923
+
924
+ .distribution-label {
925
+ min-width: 0;
926
+ font-size: 13px;
927
+ font-weight: 700;
928
+ color: var(--ink);
929
+ white-space: nowrap;
930
+ overflow: hidden;
931
+ text-overflow: ellipsis;
932
+ }
933
+
934
+ .distribution-value {
935
+ color: var(--muted);
936
+ font-size: 12px;
937
+ font-weight: 700;
938
+ flex: 0 0 auto;
939
+ }
940
+
941
+ .distribution-track {
942
+ height: 8px;
943
+ border-radius: 999px;
944
+ background: var(--surface-track);
945
+ overflow: hidden;
946
+ }
947
+
948
+ .distribution-bar {
949
+ display: block;
950
+ height: 100%;
951
+ border-radius: 999px;
952
+ }
953
+
954
+ .trend-chart-shell {
955
+ border-radius: var(--radius-md);
956
+ border: 1px solid var(--line);
957
+ background: var(--bg-subtle);
958
+ padding: 10px 10px 4px;
959
+ }
960
+
961
+ .trend-chart {
962
+ width: 100%;
963
+ height: auto;
964
+ display: block;
965
+ }
966
+
967
+ .trend-axis {
968
+ stroke: var(--axis);
969
+ stroke-width: 1.2;
970
+ }
971
+
972
+ .trend-line {
973
+ fill: none;
974
+ stroke-width: 2.4;
975
+ }
976
+
977
+ .trend-line.total {
978
+ stroke: var(--chart-total);
979
+ }
980
+
981
+ .trend-line.risk {
982
+ stroke: var(--chart-risk);
983
+ stroke-dasharray: 5 5;
984
+ }
985
+
986
+ .trend-meta {
987
+ display: flex;
988
+ justify-content: space-between;
989
+ align-items: center;
990
+ gap: 10px;
991
+ flex-wrap: wrap;
992
+ }
993
+
994
+ .trend-legend {
995
+ display: inline-flex;
996
+ align-items: center;
997
+ gap: 8px;
998
+ flex-wrap: wrap;
999
+ }
1000
+
1001
+ .trend-chip {
1002
+ min-height: 28px;
1003
+ padding: 0 10px;
1004
+ border-radius: 999px;
1005
+ font-size: 12px;
1006
+ font-weight: 800;
1007
+ display: inline-flex;
1008
+ align-items: center;
1009
+ }
1010
+
1011
+ .trend-chip.total {
1012
+ color: var(--chart-total);
1013
+ background: var(--chart-total-soft);
1014
+ }
1015
+
1016
+ .trend-chip.risk {
1017
+ color: var(--bad);
1018
+ background: var(--bad-soft);
1019
+ }
1020
+
1021
+ .trend-peak {
1022
+ color: var(--muted);
1023
+ font-size: 12px;
1024
+ font-weight: 700;
1025
+ }
1026
+
1027
+ .insight-head h3 {
1028
+ margin: 8px 0 0;
1029
+ font-size: 24px;
1030
+ line-height: 1.2;
1031
+ }
1032
+
1033
+ .insight-head p {
1034
+ margin: 10px 0 0;
1035
+ color: var(--muted);
1036
+ line-height: 1.65;
1037
+ }
1038
+
1039
+ .insight-list {
1040
+ display: grid;
1041
+ gap: 10px;
1042
+ }
1043
+
1044
+ .insight-item {
1045
+ padding: 14px 16px;
1046
+ border-radius: var(--radius-md);
1047
+ border: 1px solid var(--line);
1048
+ background: var(--bg-elevated);
1049
+ }
1050
+
1051
+ .insight-item {
1052
+ display: flex;
1053
+ justify-content: space-between;
1054
+ align-items: baseline;
1055
+ gap: 12px;
1056
+ }
1057
+
1058
+ .insight-item span {
1059
+ color: var(--muted);
1060
+ font-size: 13px;
1061
+ }
1062
+
1063
+ .insight-item strong {
1064
+ font-size: 18px;
1065
+ }
1066
+
1067
+ .header-actions,
1068
+ .rule-meta {
1069
+ display: flex;
1070
+ align-items: center;
1071
+ gap: 10px;
1072
+ flex-wrap: wrap;
1073
+ }
1074
+
1075
+ .meta-pill {
1076
+ display: inline-flex;
1077
+ align-items: center;
1078
+ min-height: 38px;
1079
+ padding: 0 14px;
1080
+ border-radius: var(--radius-sm);
1081
+ background: var(--bg-panel-muted);
1082
+ color: var(--ink);
1083
+ font-size: 13px;
1084
+ font-weight: 700;
1085
+ border: 1px solid var(--line);
1086
+ }
1087
+
1088
+ .meta-pill-highlight {
1089
+ color: var(--brand);
1090
+ background: var(--brand-soft);
1091
+ border-color: var(--brand-soft-strong);
1092
+ }
1093
+
1094
+ .meta-pill.severity-high,
1095
+ .meta-pill.severity-critical {
1096
+ background: var(--bad-soft);
1097
+ color: var(--bad);
1098
+ }
1099
+
1100
+ .meta-pill.severity-medium {
1101
+ background: var(--warn-soft);
1102
+ color: var(--warn);
1103
+ }
1104
+
1105
+ .meta-pill.severity-low {
1106
+ background: var(--good-soft);
1107
+ color: var(--good);
1108
+ }
1109
+
1110
+ .link-pill {
1111
+ text-decoration: none;
1112
+ }
1113
+
1114
+ .table-wrap {
1115
+ overflow-x: auto;
1116
+ border-radius: var(--radius-md);
1117
+ border: 1px solid var(--line);
1118
+ background: var(--bg-elevated);
1119
+ }
1120
+
1121
+ .decision-toolbar {
1122
+ margin-bottom: 16px;
1123
+ display: grid;
1124
+ gap: 12px;
1125
+ }
1126
+
1127
+ .decision-filter-group {
1128
+ display: flex;
1129
+ align-items: center;
1130
+ gap: 8px;
1131
+ flex-wrap: wrap;
1132
+ }
1133
+
1134
+ .filter-chip {
1135
+ min-height: 36px;
1136
+ padding: 0 12px;
1137
+ border-radius: 999px;
1138
+ border: 1px solid var(--line);
1139
+ background: var(--bg-subtle);
1140
+ color: var(--muted);
1141
+ display: inline-flex;
1142
+ align-items: center;
1143
+ gap: 10px;
1144
+ font-size: 13px;
1145
+ font-weight: 700;
1146
+ }
1147
+
1148
+ .filter-chip:hover {
1149
+ color: var(--ink);
1150
+ background: var(--surface-hover);
1151
+ }
1152
+
1153
+ .filter-chip.active {
1154
+ color: var(--ink);
1155
+ border-color: var(--brand-soft-strong);
1156
+ background: linear-gradient(135deg, var(--brand-soft-strong) 0%, var(--brand-soft) 100%);
1157
+ box-shadow: var(--shadow-subtle);
1158
+ }
1159
+
1160
+ .filter-chip-count {
1161
+ min-width: 22px;
1162
+ min-height: 22px;
1163
+ padding: 0 6px;
1164
+ border-radius: 999px;
1165
+ background: var(--bg-elevated);
1166
+ color: var(--brand);
1167
+ display: inline-flex;
1168
+ align-items: center;
1169
+ justify-content: center;
1170
+ line-height: 1;
1171
+ font-size: 11px;
1172
+ font-weight: 800;
1173
+ }
1174
+
1175
+ .decision-toolbar-note {
1176
+ color: var(--muted);
1177
+ font-size: 13px;
1178
+ line-height: 1.6;
1179
+ }
1180
+
1181
+ table {
1182
+ width: 100%;
1183
+ min-width: 860px;
1184
+ border-collapse: collapse;
1185
+ font-size: 13px;
1186
+ }
1187
+
1188
+ th,
1189
+ td {
1190
+ padding: 14px 12px;
1191
+ text-align: left;
1192
+ border-bottom: 1px solid var(--line-soft);
1193
+ vertical-align: top;
1194
+ }
1195
+
1196
+ th {
1197
+ position: sticky;
1198
+ top: 0;
1199
+ z-index: 1;
1200
+ background: var(--surface-table-head);
1201
+ color: var(--muted);
1202
+ font-size: 12px;
1203
+ font-weight: 800;
1204
+ letter-spacing: 0.06em;
1205
+ text-transform: uppercase;
1206
+ }
1207
+
1208
+ tbody tr {
1209
+ transition: background-color 180ms ease;
1210
+ }
1211
+
1212
+ tbody tr:hover {
1213
+ background: var(--surface-hover);
1214
+ }
1215
+
1216
+ .tag {
1217
+ display: inline-flex;
1218
+ align-items: center;
1219
+ justify-content: center;
1220
+ min-height: 28px;
1221
+ padding: 0 10px;
1222
+ border-radius: 999px;
1223
+ font-size: 12px;
1224
+ font-weight: 800;
1225
+ }
1226
+
1227
+ .tag.meta-tag {
1228
+ color: var(--ink);
1229
+ background: var(--surface-neutral-chip);
1230
+ border: 1px solid var(--surface-neutral-chip-border);
1231
+ }
1232
+
1233
+ .tag.meta-tag.severity-high,
1234
+ .tag.meta-tag.severity-critical {
1235
+ color: var(--bad);
1236
+ background: var(--bad-soft);
1237
+ border-color: var(--bad-border-soft);
1238
+ }
1239
+
1240
+ .tag.meta-tag.severity-medium {
1241
+ color: var(--warn);
1242
+ background: var(--warn-soft);
1243
+ border-color: var(--warn-border-soft);
1244
+ }
1245
+
1246
+ .tag.meta-tag.severity-low {
1247
+ color: var(--good);
1248
+ background: var(--good-soft);
1249
+ border-color: var(--good-border-soft);
1250
+ }
1251
+
1252
+ .tag.allow {
1253
+ color: var(--good);
1254
+ background: var(--good-soft);
1255
+ }
1256
+
1257
+ .tag.warn,
1258
+ .tag.challenge {
1259
+ color: var(--warn);
1260
+ background: var(--warn-soft);
1261
+ }
1262
+
1263
+ .tag.block {
1264
+ color: var(--bad);
1265
+ background: var(--bad-soft);
1266
+ }
1267
+
1268
+ .sensitive-path-panel {
1269
+ margin-bottom: 18px;
1270
+ padding: 18px;
1271
+ border-radius: var(--radius-md);
1272
+ border: 1px solid var(--line);
1273
+ background: var(--bg-panel-accent);
1274
+ display: grid;
1275
+ gap: 16px;
1276
+ }
1277
+
1278
+ .sensitive-path-head {
1279
+ display: flex;
1280
+ justify-content: space-between;
1281
+ align-items: flex-start;
1282
+ gap: 14px;
1283
+ flex-wrap: wrap;
1284
+ }
1285
+
1286
+ .sensitive-path-head h3 {
1287
+ margin: 8px 0 0;
1288
+ font-size: 20px;
1289
+ }
1290
+
1291
+ .sensitive-path-intro {
1292
+ margin: 10px 0 0;
1293
+ color: var(--muted);
1294
+ font-size: 14px;
1295
+ line-height: 1.65;
1296
+ max-width: 780px;
1297
+ }
1298
+
1299
+ .sensitive-path-toolbar {
1300
+ display: grid;
1301
+ grid-template-columns: auto minmax(0, 1fr) minmax(220px, 320px) auto;
1302
+ gap: 12px;
1303
+ align-items: end;
1304
+ }
1305
+
1306
+ .sensitive-path-selected {
1307
+ min-height: 40px;
1308
+ padding: 9px 12px;
1309
+ border-radius: var(--radius-sm);
1310
+ border: 1px solid var(--line);
1311
+ background: var(--bg-elevated);
1312
+ color: var(--ink);
1313
+ font-family: "IBM Plex Mono", "SFMono-Regular", "Consolas", monospace;
1314
+ font-size: 12px;
1315
+ line-height: 1.5;
1316
+ word-break: break-all;
1317
+ }
1318
+
1319
+ .sensitive-path-field {
1320
+ display: grid;
1321
+ gap: 8px;
1322
+ min-width: 0;
1323
+ }
1324
+
1325
+ .sensitive-path-field-wide {
1326
+ min-width: 0;
1327
+ }
1328
+
1329
+ .sensitive-path-field span {
1330
+ color: var(--muted);
1331
+ font-size: 12px;
1332
+ font-weight: 800;
1333
+ letter-spacing: 0.08em;
1334
+ text-transform: uppercase;
1335
+ }
1336
+
1337
+ .sensitive-path-field select,
1338
+ .sensitive-path-field input {
1339
+ min-height: 40px;
1340
+ width: 100%;
1341
+ padding: 0 12px;
1342
+ border-radius: var(--radius-sm);
1343
+ border: 1px solid var(--line);
1344
+ background: var(--bg-elevated);
1345
+ color: var(--ink);
1346
+ }
1347
+
1348
+ .sensitive-path-note {
1349
+ color: var(--muted);
1350
+ font-size: 13px;
1351
+ line-height: 1.6;
1352
+ }
1353
+
1354
+ .sensitive-path-validation {
1355
+ color: var(--bad);
1356
+ font-size: 13px;
1357
+ font-weight: 700;
1358
+ }
1359
+
1360
+ .sensitive-path-groups,
1361
+ .sensitive-path-removed {
1362
+ display: grid;
1363
+ gap: 12px;
1364
+ }
1365
+
1366
+ .sensitive-path-group,
1367
+ .sensitive-path-removed {
1368
+ padding: 14px;
1369
+ border-radius: var(--radius-md);
1370
+ border: 1px solid var(--line);
1371
+ background: var(--bg-elevated);
1372
+ }
1373
+
1374
+ .sensitive-path-group-head {
1375
+ display: flex;
1376
+ justify-content: space-between;
1377
+ align-items: flex-start;
1378
+ gap: 12px;
1379
+ flex-wrap: wrap;
1380
+ }
1381
+
1382
+ .sensitive-path-group-head h4 {
1383
+ margin: 0;
1384
+ font-size: 16px;
1385
+ }
1386
+
1387
+ .sensitive-path-group-head p {
1388
+ margin: 6px 0 0;
1389
+ color: var(--muted);
1390
+ font-size: 13px;
1391
+ }
1392
+
1393
+ .sensitive-path-list {
1394
+ margin-top: 12px;
1395
+ display: grid;
1396
+ gap: 10px;
1397
+ }
1398
+
1399
+ .sensitive-path-item {
1400
+ padding: 12px;
1401
+ border-radius: var(--radius-sm);
1402
+ border: 1px solid var(--line);
1403
+ background: var(--bg-subtle);
1404
+ display: flex;
1405
+ justify-content: space-between;
1406
+ align-items: center;
1407
+ gap: 12px;
1408
+ }
1409
+
1410
+ .sensitive-path-item.configured {
1411
+ border-color: var(--brand-soft-strong);
1412
+ background: var(--bg-elevated);
1413
+ }
1414
+
1415
+ .sensitive-path-item.muted {
1416
+ opacity: 0.86;
1417
+ background: var(--surface-ghost);
1418
+ }
1419
+
1420
+ .sensitive-path-item-main {
1421
+ min-width: 0;
1422
+ display: grid;
1423
+ gap: 8px;
1424
+ }
1425
+
1426
+ .sensitive-path-item-pattern {
1427
+ font-family: "IBM Plex Mono", "SFMono-Regular", "Consolas", monospace;
1428
+ font-size: 13px;
1429
+ line-height: 1.6;
1430
+ word-break: break-all;
1431
+ }
1432
+
1433
+ .sensitive-path-item-tags {
1434
+ display: flex;
1435
+ align-items: center;
1436
+ gap: 8px;
1437
+ flex-wrap: wrap;
1438
+ }
1439
+
1440
+ .file-rule-item-actions {
1441
+ display: grid;
1442
+ grid-template-columns: minmax(160px, 260px) auto;
1443
+ align-items: end;
1444
+ gap: 10px;
1445
+ min-width: 0;
1446
+ }
1447
+
1448
+ .file-rule-action-field {
1449
+ min-width: 0;
1450
+ width: auto;
1451
+ max-width: none;
1452
+ }
1453
+
1454
+ .file-rule-item-actions .ghost.small {
1455
+ white-space: nowrap;
1456
+ }
1457
+
1458
+ .directory-picker-backdrop {
1459
+ position: fixed;
1460
+ inset: 0;
1461
+ z-index: 40;
1462
+ background: rgba(8, 15, 28, 0.52);
1463
+ display: flex;
1464
+ align-items: center;
1465
+ justify-content: center;
1466
+ padding: 20px;
1467
+ }
1468
+
1469
+ .directory-picker-card {
1470
+ width: min(980px, 100%);
1471
+ max-height: min(80vh, 760px);
1472
+ border-radius: var(--radius-md);
1473
+ border: 1px solid var(--line);
1474
+ background: var(--bg-elevated);
1475
+ box-shadow: var(--shadow-float);
1476
+ display: grid;
1477
+ gap: 12px;
1478
+ padding: 14px;
1479
+ }
1480
+
1481
+ .directory-picker-head {
1482
+ display: flex;
1483
+ align-items: center;
1484
+ justify-content: space-between;
1485
+ gap: 10px;
1486
+ }
1487
+
1488
+ .directory-picker-head h4 {
1489
+ margin: 0;
1490
+ font-size: 16px;
1491
+ }
1492
+
1493
+ .directory-picker-toolbar {
1494
+ display: grid;
1495
+ grid-template-columns: auto minmax(0, 1fr) auto;
1496
+ gap: 8px;
1497
+ align-items: center;
1498
+ }
1499
+
1500
+ .directory-picker-current {
1501
+ min-height: 36px;
1502
+ padding: 8px 10px;
1503
+ border-radius: var(--radius-sm);
1504
+ border: 1px solid var(--line);
1505
+ background: var(--bg-subtle);
1506
+ font-family: "IBM Plex Mono", "SFMono-Regular", "Consolas", monospace;
1507
+ font-size: 12px;
1508
+ line-height: 1.5;
1509
+ word-break: break-all;
1510
+ }
1511
+
1512
+ .directory-picker-roots {
1513
+ display: flex;
1514
+ flex-wrap: wrap;
1515
+ gap: 8px;
1516
+ }
1517
+
1518
+ .directory-picker-list {
1519
+ display: grid;
1520
+ gap: 8px;
1521
+ max-height: min(52vh, 520px);
1522
+ overflow: auto;
1523
+ padding-right: 2px;
1524
+ }
1525
+
1526
+ .directory-picker-item {
1527
+ width: 100%;
1528
+ padding: 10px 12px;
1529
+ border-radius: var(--radius-sm);
1530
+ border: 1px solid var(--line);
1531
+ background: var(--bg-subtle);
1532
+ color: var(--ink);
1533
+ display: grid;
1534
+ gap: 3px;
1535
+ text-align: left;
1536
+ }
1537
+
1538
+ .directory-picker-item:hover {
1539
+ border-color: var(--brand-soft-strong);
1540
+ background: var(--bg-elevated);
1541
+ }
1542
+
1543
+ .directory-picker-item-name {
1544
+ font-weight: 700;
1545
+ font-size: 13px;
1546
+ }
1547
+
1548
+ .directory-picker-item-path {
1549
+ color: var(--muted);
1550
+ font-family: "IBM Plex Mono", "SFMono-Regular", "Consolas", monospace;
1551
+ font-size: 12px;
1552
+ line-height: 1.5;
1553
+ word-break: break-all;
1554
+ }
1555
+
1556
+ .confirm-dialog-backdrop {
1557
+ position: fixed;
1558
+ inset: 0;
1559
+ z-index: 50;
1560
+ background: rgba(8, 15, 28, 0.52);
1561
+ display: flex;
1562
+ align-items: center;
1563
+ justify-content: center;
1564
+ padding: 20px;
1565
+ }
1566
+
1567
+ .confirm-dialog-card {
1568
+ width: min(560px, 100%);
1569
+ border-radius: var(--radius-md);
1570
+ border: 1px solid var(--line);
1571
+ background: var(--bg-elevated);
1572
+ box-shadow: var(--shadow-float);
1573
+ padding: 16px;
1574
+ display: grid;
1575
+ gap: 12px;
1576
+ }
1577
+
1578
+ .confirm-dialog-card h4 {
1579
+ margin: 0;
1580
+ font-size: 18px;
1581
+ }
1582
+
1583
+ .confirm-dialog-text {
1584
+ margin: 0;
1585
+ color: var(--muted);
1586
+ font-size: 13px;
1587
+ line-height: 1.6;
1588
+ }
1589
+
1590
+ .confirm-dialog-path {
1591
+ padding: 10px 12px;
1592
+ border-radius: var(--radius-sm);
1593
+ border: 1px solid var(--line);
1594
+ background: var(--bg-subtle);
1595
+ font-family: "IBM Plex Mono", "SFMono-Regular", "Consolas", monospace;
1596
+ font-size: 12px;
1597
+ line-height: 1.5;
1598
+ word-break: break-all;
1599
+ }
1600
+
1601
+ .confirm-dialog-actions {
1602
+ display: flex;
1603
+ justify-content: flex-end;
1604
+ align-items: center;
1605
+ gap: 10px;
1606
+ flex-wrap: wrap;
1607
+ }
1608
+
1609
+ .rules-layout {
1610
+ display: grid;
1611
+ grid-template-columns: minmax(0, 1fr);
1612
+ gap: 14px;
1613
+ align-items: start;
1614
+ }
1615
+
1616
+ .rules-layout.with-side {
1617
+ grid-template-columns: minmax(0, 1fr) minmax(320px, 420px);
1618
+ }
1619
+
1620
+ .rules {
1621
+ display: grid;
1622
+ gap: 18px;
1623
+ }
1624
+
1625
+ .rule-group {
1626
+ display: grid;
1627
+ gap: 10px;
1628
+ }
1629
+
1630
+ .rule-group-title {
1631
+ margin: 4px 4px 0;
1632
+ color: var(--muted);
1633
+ font-size: 12px;
1634
+ font-weight: 800;
1635
+ letter-spacing: 0.14em;
1636
+ text-transform: uppercase;
1637
+ }
1638
+
1639
+ .rule {
1640
+ padding: 16px;
1641
+ border-radius: var(--radius-md);
1642
+ border: 1px solid var(--line);
1643
+ background: var(--bg-elevated);
1644
+ display: grid;
1645
+ gap: 12px;
1646
+ cursor: pointer;
1647
+ transition: box-shadow 180ms ease, border-color 180ms ease, background-color 180ms ease;
1648
+ }
1649
+
1650
+ .rule:hover {
1651
+ box-shadow: var(--shadow-soft);
1652
+ border-color: var(--brand-soft-strong);
1653
+ }
1654
+
1655
+ .rule.active {
1656
+ border-color: var(--brand-soft-strong);
1657
+ box-shadow: var(--shadow-soft-strong);
1658
+ background: var(--bg-panel-muted);
1659
+ }
1660
+
1661
+ .rule:focus-visible {
1662
+ outline: 3px solid var(--brand-focus);
1663
+ outline-offset: 3px;
1664
+ }
1665
+
1666
+ .rule-head {
1667
+ display: flex;
1668
+ justify-content: space-between;
1669
+ align-items: flex-start;
1670
+ gap: 14px;
1671
+ }
1672
+
1673
+ .rule-title {
1674
+ flex: 1 1 auto;
1675
+ min-width: 0;
1676
+ font-size: 16px;
1677
+ font-weight: 800;
1678
+ }
1679
+
1680
+ .rule-head-side {
1681
+ display: flex;
1682
+ flex: 0 0 auto;
1683
+ align-items: center;
1684
+ justify-content: flex-end;
1685
+ flex-wrap: nowrap;
1686
+ gap: 8px;
1687
+ }
1688
+
1689
+ .rule-tags {
1690
+ display: flex;
1691
+ justify-content: flex-end;
1692
+ gap: 8px;
1693
+ flex-wrap: nowrap;
1694
+ }
1695
+
1696
+ .rule-row {
1697
+ display: flex;
1698
+ align-items: center;
1699
+ gap: 12px;
1700
+ flex-wrap: wrap;
1701
+ }
1702
+
1703
+ .rule-meta-row {
1704
+ row-gap: 8px;
1705
+ }
1706
+
1707
+ .rule-actions {
1708
+ display: flex;
1709
+ flex-wrap: wrap;
1710
+ gap: 8px;
1711
+ }
1712
+
1713
+ .rule-action-button {
1714
+ min-height: 38px;
1715
+ padding: 0 14px;
1716
+ border-radius: var(--radius-sm);
1717
+ border: 1px solid var(--line);
1718
+ background: var(--surface-ghost-strong);
1719
+ color: var(--muted);
1720
+ font-size: 13px;
1721
+ font-weight: 700;
1722
+ }
1723
+
1724
+ .rule-action-button.active {
1725
+ color: var(--ink);
1726
+ box-shadow: var(--shadow-soft-strong);
1727
+ }
1728
+
1729
+ .rule-action-button.allow.active {
1730
+ border-color: var(--good-border);
1731
+ background: var(--good-soft);
1732
+ color: var(--good);
1733
+ }
1734
+
1735
+ .rule-action-button.warn.active,
1736
+ .rule-action-button.challenge.active {
1737
+ border-color: var(--warn-border);
1738
+ background: var(--warn-soft);
1739
+ color: var(--warn);
1740
+ }
1741
+
1742
+ .rule-action-button.block.active {
1743
+ border-color: var(--bad-border);
1744
+ background: var(--bad-soft);
1745
+ color: var(--bad);
1746
+ }
1747
+
1748
+ .rule-side-panel {
1749
+ position: sticky;
1750
+ top: 16px;
1751
+ }
1752
+
1753
+ .rule-side-card {
1754
+ border: 1px solid var(--line);
1755
+ border-radius: var(--radius-md);
1756
+ background: var(--bg-subtle);
1757
+ padding: 16px;
1758
+ display: grid;
1759
+ gap: 14px;
1760
+ }
1761
+
1762
+ .rule-side-empty {
1763
+ color: var(--muted);
1764
+ font-size: 14px;
1765
+ line-height: 1.6;
1766
+ }
1767
+
1768
+ .rule-side-head h3 {
1769
+ margin: 8px 0 0;
1770
+ font-size: 19px;
1771
+ line-height: 1.3;
1772
+ }
1773
+
1774
+ .rule-side-head-top {
1775
+ display: flex;
1776
+ justify-content: space-between;
1777
+ align-items: center;
1778
+ gap: 10px;
1779
+ }
1780
+
1781
+ .rule-side-close {
1782
+ min-height: 32px;
1783
+ padding: 0 12px;
1784
+ }
1785
+
1786
+ .rule-side-notes {
1787
+ display: grid;
1788
+ gap: 8px;
1789
+ }
1790
+
1791
+ .rule-side-note {
1792
+ border: 1px solid var(--line);
1793
+ border-radius: var(--radius-sm);
1794
+ background: var(--bg-elevated);
1795
+ padding: 10px 12px;
1796
+ }
1797
+
1798
+ .rule-side-note h5,
1799
+ .rule-chat-panel h5 {
1800
+ margin: 0 0 6px;
1801
+ font-size: 13px;
1802
+ }
1803
+
1804
+ .rule-side-note p {
1805
+ margin: 0;
1806
+ color: var(--muted);
1807
+ font-size: 13px;
1808
+ line-height: 1.6;
1809
+ }
1810
+
1811
+ .rule-chat-panel {
1812
+ border: 1px solid var(--line);
1813
+ border-radius: var(--radius-sm);
1814
+ background: var(--bg-panel-muted);
1815
+ padding: 10px 12px;
1816
+ display: grid;
1817
+ gap: 8px;
1818
+ }
1819
+
1820
+ .rule-chat {
1821
+ display: grid;
1822
+ gap: 8px;
1823
+ }
1824
+
1825
+ .rule-message {
1826
+ max-width: 92%;
1827
+ border-radius: var(--radius-sm);
1828
+ border: 1px solid var(--line-soft);
1829
+ background: var(--bg-elevated);
1830
+ padding: 8px 10px;
1831
+ }
1832
+
1833
+ .rule-message.user {
1834
+ margin-left: auto;
1835
+ border-color: var(--surface-user-message-border);
1836
+ background: var(--surface-user-message);
1837
+ }
1838
+
1839
+ .rule-message.system {
1840
+ border-color: var(--surface-system-message-border);
1841
+ background: var(--surface-system-message);
1842
+ }
1843
+
1844
+ .rule-message-role {
1845
+ display: inline-flex;
1846
+ font-size: 11px;
1847
+ font-weight: 800;
1848
+ letter-spacing: 0.04em;
1849
+ text-transform: uppercase;
1850
+ color: var(--muted);
1851
+ }
1852
+
1853
+ .rule-message p {
1854
+ margin: 4px 0 0;
1855
+ font-size: 13px;
1856
+ line-height: 1.6;
1857
+ }
1858
+
1859
+ .rule-desc {
1860
+ color: var(--muted);
1861
+ font-size: 14px;
1862
+ line-height: 1.65;
1863
+ }
1864
+
1865
+ .pagination {
1866
+ margin-top: 16px;
1867
+ padding-top: 16px;
1868
+ border-top: 1px solid var(--line);
1869
+ display: flex;
1870
+ justify-content: space-between;
1871
+ align-items: center;
1872
+ gap: 12px;
1873
+ flex-wrap: wrap;
1874
+ }
1875
+
1876
+ .pagination-summary {
1877
+ color: var(--muted);
1878
+ font-size: 13px;
1879
+ font-weight: 700;
1880
+ }
1881
+
1882
+ .pagination-controls {
1883
+ display: flex;
1884
+ align-items: center;
1885
+ gap: 8px;
1886
+ flex-wrap: wrap;
1887
+ }
1888
+
1889
+ .page-button {
1890
+ min-width: 38px;
1891
+ min-height: 38px;
1892
+ padding: 0 12px;
1893
+ border-radius: var(--radius-sm);
1894
+ border: 1px solid var(--line);
1895
+ background: var(--bg-elevated);
1896
+ color: var(--muted);
1897
+ font-size: 13px;
1898
+ font-weight: 700;
1899
+ }
1900
+
1901
+ .page-button.active {
1902
+ border-color: var(--brand-soft-strong);
1903
+ background: linear-gradient(135deg, var(--brand-soft-strong) 0%, var(--brand-soft) 100%);
1904
+ color: var(--ink);
1905
+ }
1906
+
1907
+ .accounts-panel {
1908
+ display: grid;
1909
+ gap: 18px;
1910
+ }
1911
+
1912
+ .accounts-intro {
1913
+ margin: 8px 0 0;
1914
+ color: var(--muted);
1915
+ font-size: 14px;
1916
+ line-height: 1.65;
1917
+ max-width: 880px;
1918
+ }
1919
+
1920
+ .account-toolbar {
1921
+ display: flex;
1922
+ justify-content: space-between;
1923
+ align-items: flex-start;
1924
+ gap: 12px;
1925
+ flex-wrap: wrap;
1926
+ }
1927
+
1928
+ .account-picker {
1929
+ display: flex;
1930
+ align-items: center;
1931
+ gap: 10px;
1932
+ flex-wrap: wrap;
1933
+ }
1934
+
1935
+ .account-picker select,
1936
+ .account-field select {
1937
+ min-height: 40px;
1938
+ min-width: min(420px, 80vw);
1939
+ padding: 0 12px;
1940
+ border-radius: var(--radius-sm);
1941
+ border: 1px solid var(--line);
1942
+ background: var(--bg-elevated);
1943
+ color: var(--ink);
1944
+ }
1945
+
1946
+ .account-list {
1947
+ display: grid;
1948
+ gap: 14px;
1949
+ }
1950
+
1951
+ .account-card {
1952
+ padding: 18px;
1953
+ border-radius: var(--radius-md);
1954
+ border: 1px solid var(--line);
1955
+ background: linear-gradient(180deg, var(--surface-account-card-top) 0%, var(--surface-account-card-bottom) 100%);
1956
+ display: grid;
1957
+ gap: 16px;
1958
+ }
1959
+
1960
+ .account-card-head {
1961
+ display: flex;
1962
+ justify-content: space-between;
1963
+ align-items: flex-start;
1964
+ gap: 12px;
1965
+ }
1966
+
1967
+ .account-title-row {
1968
+ display: flex;
1969
+ align-items: center;
1970
+ gap: 8px;
1971
+ flex-wrap: wrap;
1972
+ }
1973
+
1974
+ .account-title-row h3 {
1975
+ margin: 0;
1976
+ font-size: 18px;
1977
+ }
1978
+
1979
+ .account-subject {
1980
+ margin-top: 8px;
1981
+ color: var(--ink);
1982
+ font-size: 13px;
1983
+ font-weight: 700;
1984
+ }
1985
+
1986
+ .account-meta {
1987
+ margin-top: 4px;
1988
+ color: var(--muted);
1989
+ font-size: 13px;
1990
+ }
1991
+
1992
+ .account-controls {
1993
+ display: flex;
1994
+ align-items: flex-end;
1995
+ gap: 16px;
1996
+ flex-wrap: wrap;
1997
+ }
1998
+
1999
+ .account-field {
2000
+ display: grid;
2001
+ gap: 8px;
2002
+ }
2003
+
2004
+ .account-field span {
2005
+ color: var(--muted);
2006
+ font-size: 12px;
2007
+ font-weight: 800;
2008
+ letter-spacing: 0.08em;
2009
+ text-transform: uppercase;
2010
+ }
2011
+
2012
+ .account-toggle {
2013
+ min-height: 40px;
2014
+ padding: 0 14px;
2015
+ border-radius: var(--radius-sm);
2016
+ border: 1px solid var(--line);
2017
+ background: var(--bg-elevated);
2018
+ display: inline-flex;
2019
+ align-items: center;
2020
+ gap: 10px;
2021
+ color: var(--ink);
2022
+ font-size: 13px;
2023
+ font-weight: 700;
2024
+ }
2025
+
2026
+ .account-toggle.disabled {
2027
+ opacity: 0.58;
2028
+ }
2029
+
2030
+ .account-toggle input {
2031
+ width: 16px;
2032
+ height: 16px;
2033
+ margin: 0;
2034
+ }
2035
+
2036
+ .skills-intro,
2037
+ .skill-detail-intro {
2038
+ margin: 8px 0 0;
2039
+ color: var(--muted);
2040
+ line-height: 1.65;
2041
+ }
2042
+
2043
+ .skills-panel {
2044
+ display: grid;
2045
+ gap: 18px;
2046
+ }
2047
+
2048
+ .skills-metrics {
2049
+ display: grid;
2050
+ grid-template-columns: repeat(6, minmax(0, 1fr));
2051
+ gap: 12px;
2052
+ }
2053
+
2054
+ .skills-layout {
2055
+ display: grid;
2056
+ grid-template-columns: minmax(0, 1.1fr) minmax(340px, 0.9fr);
2057
+ gap: 18px;
2058
+ align-items: start;
2059
+ }
2060
+
2061
+ .skill-list-panel,
2062
+ .skill-detail-panel,
2063
+ .skill-policy-panel {
2064
+ background: linear-gradient(180deg, var(--surface-chart-top) 0%, var(--surface-chart-bottom) 100%);
2065
+ border: 1px solid var(--surface-chart-border);
2066
+ box-shadow: var(--shadow-soft);
2067
+ }
2068
+
2069
+ .skill-list-panel,
2070
+ .skill-detail-panel,
2071
+ .skill-policy-panel,
2072
+ .skills-metrics .stat {
2073
+ border-radius: var(--radius-lg);
2074
+ }
2075
+
2076
+ .skill-list-head {
2077
+ display: flex;
2078
+ justify-content: space-between;
2079
+ align-items: flex-start;
2080
+ gap: 14px;
2081
+ margin-bottom: 16px;
2082
+ }
2083
+
2084
+ .skills-toolbar {
2085
+ display: grid;
2086
+ grid-template-columns: repeat(5, minmax(0, 1fr));
2087
+ gap: 12px;
2088
+ margin-bottom: 16px;
2089
+ }
2090
+
2091
+ .skill-filter-field,
2092
+ .skill-policy-field {
2093
+ display: grid;
2094
+ gap: 8px;
2095
+ }
2096
+
2097
+ .skill-filter-field span,
2098
+ .skill-policy-field span {
2099
+ color: var(--muted);
2100
+ font-size: 12px;
2101
+ font-weight: 700;
2102
+ letter-spacing: 0.04em;
2103
+ text-transform: uppercase;
2104
+ }
2105
+
2106
+ .skill-filter-field select,
2107
+ .skill-policy-field select,
2108
+ .skill-policy-field input {
2109
+ width: 100%;
2110
+ min-height: 42px;
2111
+ border-radius: var(--radius-sm);
2112
+ border: 1px solid var(--line);
2113
+ background: var(--bg-elevated);
2114
+ color: var(--ink);
2115
+ padding: 0 12px;
2116
+ box-shadow: var(--shadow-inset);
2117
+ }
2118
+
2119
+ .skill-list {
2120
+ display: grid;
2121
+ gap: 12px;
2122
+ }
2123
+
2124
+ .skill-row {
2125
+ width: 100%;
2126
+ display: grid;
2127
+ grid-template-columns: minmax(0, 1fr) auto;
2128
+ gap: 14px;
2129
+ align-items: center;
2130
+ padding: 16px;
2131
+ text-align: left;
2132
+ background: var(--bg-elevated);
2133
+ border: 1px solid var(--line);
2134
+ border-radius: var(--radius-md);
2135
+ box-shadow: var(--shadow-subtle);
2136
+ }
2137
+
2138
+ .skill-row:hover {
2139
+ border-color: var(--brand-soft-strong);
2140
+ background: var(--surface-hover);
2141
+ }
2142
+
2143
+ .skill-row.active {
2144
+ border-color: var(--brand);
2145
+ background: linear-gradient(180deg, var(--bg-elevated) 0%, var(--brand-soft) 100%);
2146
+ box-shadow: var(--shadow-brand);
2147
+ }
2148
+
2149
+ .skill-row-main {
2150
+ min-width: 0;
2151
+ display: grid;
2152
+ gap: 8px;
2153
+ }
2154
+
2155
+ .skill-row-head {
2156
+ display: flex;
2157
+ justify-content: space-between;
2158
+ align-items: flex-start;
2159
+ gap: 12px;
2160
+ }
2161
+
2162
+ .skill-row-title {
2163
+ font-size: 16px;
2164
+ font-weight: 800;
2165
+ }
2166
+
2167
+ .skill-row-meta,
2168
+ .skill-row-subline,
2169
+ .skill-row-foot {
2170
+ color: var(--muted);
2171
+ font-size: 13px;
2172
+ }
2173
+
2174
+ .skill-row-foot {
2175
+ display: flex;
2176
+ flex-wrap: wrap;
2177
+ gap: 8px 14px;
2178
+ }
2179
+
2180
+ .skill-row-tags {
2181
+ display: flex;
2182
+ flex-wrap: wrap;
2183
+ gap: 8px;
2184
+ justify-content: flex-end;
2185
+ }
2186
+
2187
+ .skill-row-side {
2188
+ min-width: 88px;
2189
+ padding: 12px 14px;
2190
+ border-radius: var(--radius-sm);
2191
+ border: 1px solid var(--line-soft);
2192
+ background: var(--surface-ghost);
2193
+ display: grid;
2194
+ justify-items: end;
2195
+ gap: 4px;
2196
+ }
2197
+
2198
+ .skill-row-side strong {
2199
+ font-size: 22px;
2200
+ line-height: 1;
2201
+ }
2202
+
2203
+ .skill-row-side span {
2204
+ color: var(--muted);
2205
+ font-size: 12px;
2206
+ font-weight: 700;
2207
+ text-transform: uppercase;
2208
+ letter-spacing: 0.05em;
2209
+ }
2210
+
2211
+ .skill-detail-panel {
2212
+ position: sticky;
2213
+ top: 18px;
2214
+ display: grid;
2215
+ gap: 16px;
2216
+ }
2217
+
2218
+ .skill-detail-head {
2219
+ display: flex;
2220
+ justify-content: space-between;
2221
+ align-items: flex-start;
2222
+ gap: 14px;
2223
+ }
2224
+
2225
+ .skill-detail-actions {
2226
+ display: flex;
2227
+ flex-wrap: wrap;
2228
+ gap: 8px;
2229
+ justify-content: flex-end;
2230
+ }
2231
+
2232
+ .skill-score-card {
2233
+ padding: 16px;
2234
+ border-radius: var(--radius-md);
2235
+ border: 1px solid var(--line);
2236
+ background: linear-gradient(180deg, var(--bg-subtle) 0%, var(--bg-elevated) 100%);
2237
+ }
2238
+
2239
+ .skill-score-top {
2240
+ display: flex;
2241
+ justify-content: space-between;
2242
+ align-items: flex-start;
2243
+ gap: 12px;
2244
+ }
2245
+
2246
+ .skill-score-label {
2247
+ color: var(--muted);
2248
+ font-size: 12px;
2249
+ font-weight: 800;
2250
+ letter-spacing: 0.08em;
2251
+ text-transform: uppercase;
2252
+ }
2253
+
2254
+ .skill-score-value {
2255
+ margin-top: 8px;
2256
+ font-size: 38px;
2257
+ font-weight: 800;
2258
+ line-height: 1;
2259
+ }
2260
+
2261
+ .skill-score-side {
2262
+ display: flex;
2263
+ flex-wrap: wrap;
2264
+ gap: 8px;
2265
+ justify-content: flex-end;
2266
+ }
2267
+
2268
+ .skill-score-track {
2269
+ margin-top: 16px;
2270
+ height: 10px;
2271
+ border-radius: 999px;
2272
+ background: var(--surface-track);
2273
+ overflow: hidden;
2274
+ }
2275
+
2276
+ .skill-score-track span {
2277
+ display: block;
2278
+ height: 100%;
2279
+ border-radius: inherit;
2280
+ background: linear-gradient(90deg, var(--brand) 0%, var(--warn) 55%, var(--bad) 100%);
2281
+ }
2282
+
2283
+ .skill-score-meta {
2284
+ margin-top: 12px;
2285
+ display: flex;
2286
+ flex-wrap: wrap;
2287
+ gap: 8px 14px;
2288
+ color: var(--muted);
2289
+ font-size: 13px;
2290
+ }
2291
+
2292
+ .skill-meta-grid {
2293
+ display: grid;
2294
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2295
+ gap: 12px;
2296
+ }
2297
+
2298
+ .skill-meta-item {
2299
+ padding: 14px;
2300
+ border-radius: var(--radius-md);
2301
+ border: 1px solid var(--line);
2302
+ background: var(--bg-elevated);
2303
+ display: grid;
2304
+ gap: 6px;
2305
+ }
2306
+
2307
+ .skill-meta-item span {
2308
+ color: var(--muted);
2309
+ font-size: 12px;
2310
+ font-weight: 700;
2311
+ letter-spacing: 0.05em;
2312
+ text-transform: uppercase;
2313
+ }
2314
+
2315
+ .skill-meta-item strong {
2316
+ min-width: 0;
2317
+ font-size: 14px;
2318
+ line-height: 1.5;
2319
+ word-break: break-word;
2320
+ }
2321
+
2322
+ .skill-meta-item-wide {
2323
+ grid-column: 1 / -1;
2324
+ }
2325
+
2326
+ .skill-section {
2327
+ display: grid;
2328
+ gap: 12px;
2329
+ }
2330
+
2331
+ .skill-section-head {
2332
+ display: flex;
2333
+ justify-content: space-between;
2334
+ align-items: center;
2335
+ gap: 12px;
2336
+ }
2337
+
2338
+ .skill-section h4 {
2339
+ margin: 0;
2340
+ font-size: 16px;
2341
+ }
2342
+
2343
+ .skill-finding-list,
2344
+ .skill-activity-list {
2345
+ display: grid;
2346
+ gap: 12px;
2347
+ }
2348
+
2349
+ .skill-finding-card,
2350
+ .skill-activity-item {
2351
+ padding: 14px;
2352
+ border-radius: var(--radius-md);
2353
+ border: 1px solid var(--line);
2354
+ background: var(--bg-elevated);
2355
+ display: grid;
2356
+ gap: 10px;
2357
+ }
2358
+
2359
+ .skill-finding-head,
2360
+ .skill-activity-top {
2361
+ display: flex;
2362
+ justify-content: space-between;
2363
+ align-items: flex-start;
2364
+ gap: 10px;
2365
+ }
2366
+
2367
+ .skill-finding-card p,
2368
+ .skill-activity-item p {
2369
+ margin: 0;
2370
+ color: var(--muted);
2371
+ line-height: 1.65;
2372
+ }
2373
+
2374
+ .skill-finding-card code {
2375
+ display: block;
2376
+ padding: 10px 12px;
2377
+ border-radius: var(--radius-sm);
2378
+ background: var(--surface-ghost);
2379
+ color: var(--ink);
2380
+ border: 1px solid var(--line-soft);
2381
+ overflow-x: auto;
2382
+ }
2383
+
2384
+ .skill-activity-title {
2385
+ font-size: 14px;
2386
+ font-weight: 700;
2387
+ }
2388
+
2389
+ .skill-policy-grid {
2390
+ display: grid;
2391
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2392
+ gap: 12px;
2393
+ }
2394
+
2395
+ .skill-policy-grid-secondary {
2396
+ margin-top: 16px;
2397
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2398
+ }
2399
+
2400
+ .skill-policy-table-wrap {
2401
+ margin-top: 16px;
2402
+ overflow-x: auto;
2403
+ border: 1px solid var(--line);
2404
+ border-radius: var(--radius-md);
2405
+ }
2406
+
2407
+ .skill-policy-table {
2408
+ width: 100%;
2409
+ min-width: 760px;
2410
+ border-collapse: separate;
2411
+ border-spacing: 0;
2412
+ }
2413
+
2414
+ .skill-policy-table th,
2415
+ .skill-policy-table td {
2416
+ padding: 12px;
2417
+ border-bottom: 1px solid var(--line);
2418
+ border-right: 1px solid var(--line);
2419
+ vertical-align: middle;
2420
+ }
2421
+
2422
+ .skill-policy-table th:last-child,
2423
+ .skill-policy-table td:last-child {
2424
+ border-right: 0;
2425
+ }
2426
+
2427
+ .skill-policy-table tbody tr:last-child th,
2428
+ .skill-policy-table tbody tr:last-child td {
2429
+ border-bottom: 0;
2430
+ }
2431
+
2432
+ .skill-policy-table thead th {
2433
+ background: var(--surface-table-head);
2434
+ color: var(--ink);
2435
+ font-size: 12px;
2436
+ letter-spacing: 0.04em;
2437
+ text-transform: uppercase;
2438
+ }
2439
+
2440
+ .skill-policy-table tbody th {
2441
+ background: var(--bg-elevated);
2442
+ min-width: 180px;
2443
+ text-align: left;
2444
+ }
2445
+
2446
+ .skill-policy-table select {
2447
+ width: 100%;
2448
+ min-height: 40px;
2449
+ border-radius: var(--radius-sm);
2450
+ border: 1px solid var(--line);
2451
+ background: var(--bg-elevated);
2452
+ color: var(--ink);
2453
+ padding: 0 12px;
2454
+ }
2455
+
2456
+ @keyframes rise-in {
2457
+ from {
2458
+ opacity: 0;
2459
+ transform: translateY(10px);
2460
+ }
2461
+
2462
+ to {
2463
+ opacity: 1;
2464
+ transform: translateY(0);
2465
+ }
2466
+ }
2467
+
2468
+ @media (max-width: 1040px) {
2469
+ .overview-grid {
2470
+ grid-template-columns: 1fr;
2471
+ }
2472
+
2473
+ .overview-charts {
2474
+ grid-template-columns: 1fr;
2475
+ }
2476
+
2477
+ .trend-card {
2478
+ grid-column: auto;
2479
+ }
2480
+
2481
+ .rules-layout.with-side {
2482
+ grid-template-columns: 1fr;
2483
+ }
2484
+
2485
+ .rule-side-panel {
2486
+ position: static;
2487
+ margin-top: 0 !important;
2488
+ }
2489
+
2490
+ .skills-metrics,
2491
+ .skill-policy-grid,
2492
+ .skill-policy-grid-secondary,
2493
+ .skills-layout {
2494
+ grid-template-columns: 1fr;
2495
+ }
2496
+
2497
+ .skill-detail-panel {
2498
+ position: static;
2499
+ top: auto;
2500
+ }
2501
+
2502
+ .overview-skill-stats {
2503
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2504
+ }
2505
+ }
2506
+
2507
+ @media (max-width: 760px) {
2508
+ .app {
2509
+ width: 100%;
2510
+ }
2511
+
2512
+ .workspace,
2513
+ .panel-card {
2514
+ padding: 16px;
2515
+ }
2516
+
2517
+ .workspace-top,
2518
+ .card-head,
2519
+ .rule-head,
2520
+ .account-card-head,
2521
+ .sensitive-path-head,
2522
+ .sensitive-path-item,
2523
+ .sensitive-path-group-head,
2524
+ .skill-list-head,
2525
+ .skill-detail-head,
2526
+ .skill-row-head,
2527
+ .skill-finding-head,
2528
+ .skill-activity-top,
2529
+ .skill-score-top,
2530
+ .overview-skill-head,
2531
+ .overview-skill-item-head {
2532
+ flex-direction: column;
2533
+ align-items: stretch;
2534
+ }
2535
+
2536
+ .sensitive-path-toolbar {
2537
+ grid-template-columns: 1fr;
2538
+ }
2539
+
2540
+ .file-rule-item-actions {
2541
+ width: 100%;
2542
+ grid-template-columns: 1fr;
2543
+ }
2544
+
2545
+ .file-rule-action-field {
2546
+ min-width: 0;
2547
+ max-width: none;
2548
+ }
2549
+
2550
+ .directory-picker-backdrop {
2551
+ padding: 12px;
2552
+ }
2553
+
2554
+ .directory-picker-card {
2555
+ max-height: 86vh;
2556
+ padding: 12px;
2557
+ }
2558
+
2559
+ .directory-picker-toolbar {
2560
+ grid-template-columns: 1fr;
2561
+ }
2562
+
2563
+ .confirm-dialog-backdrop {
2564
+ padding: 12px;
2565
+ }
2566
+
2567
+ .confirm-dialog-card {
2568
+ width: 100%;
2569
+ padding: 14px;
2570
+ }
2571
+
2572
+ .toolbar-controls {
2573
+ margin-left: 0;
2574
+ justify-content: flex-start;
2575
+ }
2576
+
2577
+ .control-group {
2578
+ width: auto;
2579
+ justify-content: flex-start;
2580
+ }
2581
+
2582
+ .workspace-heading {
2583
+ align-items: flex-start;
2584
+ gap: 10px;
2585
+ }
2586
+
2587
+ .chart-head {
2588
+ align-items: flex-start;
2589
+ }
2590
+
2591
+ .tablist {
2592
+ max-width: 100%;
2593
+ overflow-x: auto;
2594
+ }
2595
+
2596
+ .tab-button {
2597
+ flex: 0 0 auto;
2598
+ }
2599
+
2600
+ .rule-head-side {
2601
+ width: 100%;
2602
+ align-items: flex-start;
2603
+ justify-content: flex-start;
2604
+ flex-wrap: wrap;
2605
+ }
2606
+
2607
+ .rule-tags {
2608
+ justify-content: flex-start;
2609
+ flex-wrap: wrap;
2610
+ }
2611
+
2612
+ .rule-side-card {
2613
+ padding: 14px;
2614
+ }
2615
+
2616
+ .workspace-title h1 {
2617
+ font-size: 26px;
2618
+ }
2619
+
2620
+ .stats {
2621
+ grid-template-columns: 1fr 1fr;
2622
+ }
2623
+
2624
+ .pagination {
2625
+ align-items: stretch;
2626
+ }
2627
+
2628
+ .account-picker,
2629
+ .account-controls {
2630
+ align-items: stretch;
2631
+ }
2632
+
2633
+ .account-picker select,
2634
+ .account-field select,
2635
+ .skill-filter-field select,
2636
+ .skill-policy-field select,
2637
+ .skill-policy-field input {
2638
+ min-width: 0;
2639
+ width: 100%;
2640
+ }
2641
+
2642
+ .skills-toolbar {
2643
+ grid-template-columns: 1fr;
2644
+ }
2645
+
2646
+ .skills-metrics {
2647
+ grid-template-columns: 1fr 1fr;
2648
+ }
2649
+
2650
+ .overview-skill-stats {
2651
+ grid-template-columns: 1fr 1fr;
2652
+ }
2653
+
2654
+ .skill-row {
2655
+ grid-template-columns: 1fr;
2656
+ }
2657
+
2658
+ .overview-skill-item {
2659
+ grid-template-columns: 1fr;
2660
+ }
2661
+
2662
+ .skill-row-side,
2663
+ .skill-detail-actions,
2664
+ .overview-skill-item-side {
2665
+ justify-items: start;
2666
+ justify-content: flex-start;
2667
+ }
2668
+
2669
+ .skill-meta-grid {
2670
+ grid-template-columns: 1fr;
2671
+ }
2672
+
2673
+ th,
2674
+ td {
2675
+ padding: 12px 10px;
2676
+ }
2677
+ }
2678
+
2679
+ @media (max-width: 560px) {
2680
+ .workspace-title h1 {
2681
+ font-size: 22px;
2682
+ }
2683
+
2684
+ .distribution-row {
2685
+ flex-direction: column;
2686
+ align-items: flex-start;
2687
+ gap: 4px;
2688
+ }
2689
+
2690
+ .stats {
2691
+ grid-template-columns: 1fr;
2692
+ }
2693
+
2694
+ .overview-skill-stats {
2695
+ grid-template-columns: 1fr;
2696
+ }
2697
+
2698
+ .tab-count {
2699
+ min-width: 18px;
2700
+ }
2701
+
2702
+ .pagination-controls {
2703
+ width: 100%;
2704
+ }
2705
+ }
2706
+
2707
+ @media (prefers-reduced-motion: reduce) {
2708
+ *,
2709
+ *::before,
2710
+ *::after {
2711
+ animation: none !important;
2712
+ transition: none !important;
2713
+ scroll-behavior: auto !important;
2714
+ }
2715
+ }