cursor-guard 4.9.8 → 4.9.12

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 (32) hide show
  1. package/README.md +10 -1
  2. package/README.zh-CN.md +10 -1
  3. package/ROADMAP.md +50 -5
  4. package/docs/RELEASE.md +196 -0
  5. package/package.json +69 -68
  6. package/references/dashboard/public/app.js +313 -95
  7. package/references/dashboard/public/style.css +320 -160
  8. package/references/dashboard/server.js +197 -4
  9. package/references/lib/core/backups.js +36 -21
  10. package/references/lib/core/core.test.js +1629 -1484
  11. package/references/lib/core/snapshot.js +59 -8
  12. package/references/mcp/server.js +73 -72
  13. package/references/vscode-extension/{dist/cursor-guard-ide-4.9.8.vsix → cursor-guard-ide-4.9.12.vsix} +0 -0
  14. package/references/vscode-extension/dist/cursor-guard-ide-4.9.12.vsix +0 -0
  15. package/references/vscode-extension/dist/dashboard/public/app.js +313 -95
  16. package/references/vscode-extension/dist/dashboard/public/style.css +320 -160
  17. package/references/vscode-extension/dist/dashboard/server.js +197 -4
  18. package/references/vscode-extension/dist/extension.js +9 -2
  19. package/references/vscode-extension/dist/guard-version.json +1 -1
  20. package/references/vscode-extension/dist/lib/core/backups.js +36 -21
  21. package/references/vscode-extension/dist/lib/core/snapshot.js +59 -8
  22. package/references/vscode-extension/dist/lib/dashboard-manager.js +110 -103
  23. package/references/vscode-extension/dist/lib/poller.js +161 -21
  24. package/references/vscode-extension/dist/lib/sidebar-webview.js +469 -156
  25. package/references/vscode-extension/dist/mcp/server.js +85 -31
  26. package/references/vscode-extension/dist/package.json +1 -1
  27. package/references/vscode-extension/dist/skill/ROADMAP.md +50 -5
  28. package/references/vscode-extension/extension.js +9 -2
  29. package/references/vscode-extension/lib/dashboard-manager.js +110 -103
  30. package/references/vscode-extension/lib/poller.js +161 -21
  31. package/references/vscode-extension/lib/sidebar-webview.js +469 -156
  32. package/references/vscode-extension/package.json +140 -140
@@ -1,50 +1,68 @@
1
1
  /* ═══════════════════════════════════════════════════════════════
2
- Cursor Guard Dashboard — Ops Console Theme v2
2
+ Cursor Guard Dashboard — theme aligned with IDE sidebar webview
3
3
  ═══════════════════════════════════════════════════════════════ */
4
4
 
5
5
  :root {
6
- --bg-primary: #0a0f1a;
7
- --bg-secondary: #141c2b;
8
- --bg-tertiary: #1e293b;
9
- --bg-elevated: #182030;
10
- --bg-hover: rgba(148,163,184,.06);
11
-
12
- --border: rgba(71,85,105,.5);
13
- --border-subtle:rgba(71,85,105,.25);
14
- --border-glow: rgba(59,130,246,.2);
15
-
16
- --text-primary: #cbd5e1;
17
- --text-secondary: #8b9cb7;
18
- --text-tertiary: #475569;
19
- --text-heading: #f8fafc;
20
-
21
- --green: #4ade80;
22
- --green-bg: rgba(74,222,128,.12);
23
- --green-glow: rgba(74,222,128,.2);
24
- --yellow: #f59e0b;
25
- --yellow-bg: rgba(245,158,11,.12);
26
- --yellow-glow: rgba(245,158,11,.2);
27
- --red: #ef4444;
28
- --red-bg: rgba(239,68,68,.12);
29
- --red-glow: rgba(239,68,68,.2);
30
- --blue: #3b82f6;
31
- --blue-bg: rgba(59,130,246,.12);
32
- --blue-glow: rgba(59,130,246,.2);
33
- --purple: #a78bfa;
34
- --purple-bg: rgba(167,139,250,.12);
35
- --amber: #f59e0b;
36
- --amber-bg: rgba(245,158,11,.12);
37
- --gray: #64748b;
38
- --gray-bg: rgba(100,116,139,.12);
39
-
40
- --radius: 10px;
41
- --radius-sm: 6px;
42
- --topbar-h: 56px;
6
+ /* Core tokens (parity with references/vscode-extension sidebar webview) */
7
+ --surface: #1f2430;
8
+ --surface-2: #252a38;
9
+ --border: rgba(120, 130, 160, 0.22);
10
+ --text: #e8eaf0;
11
+ --muted: #9aa4bd;
12
+ --green: #89d18a;
13
+ --yellow: #e4c06a;
14
+ --red: #f0a0a0;
15
+ --orange: #f0b070;
16
+ --blue: #8eb6ff;
17
+ --purple: #b8a8e8;
18
+ --radius: 12px;
19
+ --radius-sm: 8px;
20
+ --radius-lg: 14px;
21
+ --shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
22
+ --shadow-soft: 0 4px 14px rgba(0, 0, 0, 0.12);
23
+ --glow-green: color-mix(in srgb, var(--green) 38%, transparent);
24
+ --shell-green-1: color-mix(in srgb, var(--green) 16%, #070907);
25
+ --shell-green-2: color-mix(in srgb, var(--green) 9%, #050805);
26
+
27
+ /* Legacy names used across this file */
28
+ --bg-primary: var(--surface);
29
+ --bg-secondary: var(--surface-2);
30
+ --bg-tertiary: color-mix(in srgb, var(--surface-2) 88%, var(--text));
31
+ --bg-elevated: color-mix(in srgb, var(--surface-2) 94%, #0a0c12);
32
+ --bg-hover: color-mix(in srgb, var(--text) 6%, transparent);
33
+ --border-subtle: color-mix(in srgb, var(--border) 48%, transparent);
34
+ --border-glow: color-mix(in srgb, var(--blue) 38%, var(--border));
35
+ --text-primary: var(--text);
36
+ --text-secondary: var(--muted);
37
+ --text-tertiary: color-mix(in srgb, var(--muted) 72%, var(--surface));
38
+ --text-heading: var(--text);
39
+ --accent: var(--blue);
40
+
41
+ --green-bg: color-mix(in srgb, var(--green) 14%, transparent);
42
+ --green-glow: color-mix(in srgb, var(--green) 30%, transparent);
43
+ --yellow-bg: color-mix(in srgb, var(--yellow) 14%, transparent);
44
+ --yellow-glow: color-mix(in srgb, var(--yellow) 28%, transparent);
45
+ --red-bg: color-mix(in srgb, var(--red) 14%, transparent);
46
+ --red-glow: color-mix(in srgb, var(--red) 30%, transparent);
47
+ --blue-bg: color-mix(in srgb, var(--blue) 14%, transparent);
48
+ --blue-glow: color-mix(in srgb, var(--blue) 24%, transparent);
49
+ --purple-bg: color-mix(in srgb, var(--purple) 14%, transparent);
50
+ --amber: var(--yellow);
51
+ --amber-bg: var(--yellow-bg);
52
+ --gray: var(--muted);
53
+ --gray-bg: color-mix(in srgb, var(--muted) 12%, transparent);
54
+
55
+ --topbar-h: 52px;
43
56
  --drawer-w: 500px;
44
- --shadow-sm: 0 1px 3px rgba(0,0,0,.4), 0 1px 2px rgba(0,0,0,.25);
45
- --shadow-md: 0 4px 20px rgba(0,0,0,.45);
46
- --shadow-lg: 0 8px 32px rgba(0,0,0,.5);
47
- --transition: .2s cubic-bezier(.4,0,.2,1);
57
+ --shadow-sm: var(--shadow);
58
+ --shadow-md: var(--shadow-soft);
59
+ --shadow-lg: 0 8px 28px rgba(0, 0, 0, 0.22);
60
+ --transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
61
+
62
+ --font-mono: ui-monospace, 'Cascadia Code', 'JetBrains Mono', Consolas, monospace;
63
+
64
+ --card-bg: var(--bg-secondary);
65
+ --bg: var(--bg-primary);
48
66
  }
49
67
 
50
68
  /* ── Reset ────────────────────────────────────────────────── */
@@ -52,14 +70,15 @@
52
70
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
53
71
 
54
72
  body {
55
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
56
- font-size: 14px;
57
- line-height: 1.6;
73
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Microsoft YaHei', Roboto, sans-serif;
74
+ font-size: 13px;
75
+ line-height: 1.55;
58
76
  color: var(--text-primary);
59
- background: var(--bg-primary);
77
+ background-color: var(--bg-primary);
60
78
  background-image:
61
- radial-gradient(ellipse 80% 50% at 50% -20%, rgba(59,130,246,.06), transparent),
62
- radial-gradient(ellipse 60% 40% at 80% 100%, rgba(74,222,128,.03), transparent);
79
+ radial-gradient(110% 75% at 8% -15%, var(--shell-green-1), transparent 56%),
80
+ radial-gradient(95% 70% at 102% 108%, var(--shell-green-2), transparent 52%),
81
+ linear-gradient(168deg, #0a0c0f 0%, var(--surface) 48%, #0c100e 100%);
63
82
  padding-top: var(--topbar-h);
64
83
  -webkit-font-smoothing: antialiased;
65
84
  -moz-osx-font-smoothing: grayscale;
@@ -71,14 +90,15 @@ body {
71
90
  position: fixed;
72
91
  top: 0; left: 0; right: 0;
73
92
  height: var(--topbar-h);
74
- background: rgba(14,19,30,.85);
75
- backdrop-filter: blur(16px) saturate(1.5);
76
- -webkit-backdrop-filter: blur(16px) saturate(1.5);
77
- border-bottom: 1px solid var(--border);
93
+ background: color-mix(in srgb, var(--surface-2) 78%, transparent);
94
+ backdrop-filter: blur(12px) saturate(1.2);
95
+ -webkit-backdrop-filter: blur(12px) saturate(1.2);
96
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 82%, transparent);
97
+ box-shadow: var(--shadow);
78
98
  display: flex;
79
99
  align-items: center;
80
100
  justify-content: space-between;
81
- padding: 0 24px;
101
+ padding: 0 20px;
82
102
  z-index: 50;
83
103
  gap: 12px;
84
104
  }
@@ -92,29 +112,42 @@ body {
92
112
  .logo-icon {
93
113
  color: var(--green);
94
114
  flex-shrink: 0;
95
- filter: drop-shadow(0 0 6px var(--green-glow));
115
+ filter: drop-shadow(0 0 8px var(--green-glow));
96
116
  }
97
117
  .logo-text {
98
- font-weight: 700;
99
- font-size: 15px;
118
+ font-weight: 800;
119
+ font-size: 14px;
100
120
  white-space: nowrap;
101
- letter-spacing: -.01em;
102
- color: var(--text-heading);
121
+ letter-spacing: -0.03em;
122
+ line-height: 1.2;
123
+ background: linear-gradient(90deg, var(--text-heading), color-mix(in srgb, var(--text-heading) 72%, var(--blue)));
124
+ -webkit-background-clip: text;
125
+ background-clip: text;
126
+ color: transparent;
103
127
  }
104
128
 
105
129
  #project-select {
106
- background: var(--bg-tertiary);
130
+ background: color-mix(in srgb, var(--surface-2) 88%, var(--text));
107
131
  color: var(--text-primary);
108
- border: 1px solid var(--border);
109
- border-radius: var(--radius-sm);
110
- padding: 5px 10px;
111
- font-size: 13px;
132
+ border: 1px solid color-mix(in srgb, var(--border) 88%, transparent);
133
+ border-radius: 999px;
134
+ padding: 5px 12px;
135
+ font-size: 12px;
136
+ font-weight: 600;
112
137
  max-width: 220px;
113
138
  cursor: pointer;
114
- transition: border-color var(--transition);
139
+ transition: border-color 0.15s ease, box-shadow 0.15s ease, color 0.15s ease;
140
+ }
141
+ #project-select:hover {
142
+ border-color: color-mix(in srgb, var(--blue) 55%, var(--border));
143
+ color: var(--blue);
144
+ box-shadow: var(--shadow-soft);
145
+ }
146
+ #project-select:focus {
147
+ outline: none;
148
+ border-color: color-mix(in srgb, var(--blue) 55%, var(--border));
149
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--blue) 35%, transparent);
115
150
  }
116
- #project-select:hover { border-color: var(--blue); }
117
- #project-select:focus { outline: none; border-color: var(--blue); box-shadow: 0 0 0 3px var(--blue-bg); }
118
151
 
119
152
  #last-refresh { font-size: 12px; white-space: nowrap; opacity: .7; }
120
153
 
@@ -211,31 +244,32 @@ body {
211
244
  display: inline-flex;
212
245
  align-items: center;
213
246
  gap: 6px;
214
- padding: 7px 14px;
247
+ padding: 8px 12px;
215
248
  border: 1px solid var(--border);
216
- border-radius: var(--radius-sm);
217
- background: var(--bg-tertiary);
249
+ border-radius: var(--radius);
250
+ background: color-mix(in srgb, var(--surface-2) 88%, var(--text));
218
251
  color: var(--text-primary);
219
- font-size: 13px;
220
- font-weight: 500;
252
+ font-size: 12px;
253
+ font-weight: 600;
254
+ font-family: inherit;
221
255
  cursor: pointer;
222
- transition: all var(--transition);
256
+ transition: border-color 0.15s ease, background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease;
223
257
  white-space: nowrap;
224
258
  }
225
259
  .btn:hover {
226
- background: rgba(59,130,246,.1);
227
- border-color: rgba(59,130,246,.3);
228
- color: var(--text-heading);
260
+ border-color: color-mix(in srgb, var(--blue) 55%, var(--border));
261
+ color: var(--blue);
262
+ box-shadow: var(--shadow-soft);
229
263
  }
230
- .btn:active { transform: scale(.97); }
264
+ .btn:active { transform: scale(0.98); }
231
265
 
232
266
  .btn-ghost {
233
267
  background: transparent;
234
- border-color: transparent;
268
+ border-color: color-mix(in srgb, var(--border) 55%, transparent);
235
269
  }
236
270
  .btn-ghost:hover {
237
271
  background: var(--bg-hover);
238
- border-color: transparent;
272
+ border-color: color-mix(in srgb, var(--blue) 40%, var(--border));
239
273
  }
240
274
 
241
275
  .btn-sm { padding: 4px 10px; font-size: 12px; }
@@ -243,9 +277,9 @@ body {
243
277
  /* ── Main ─────────────────────────────────────────────────── */
244
278
 
245
279
  main {
246
- max-width: 1200px;
280
+ max-width: 1120px;
247
281
  margin: 0 auto;
248
- padding: 28px 24px 60px;
282
+ padding: 22px 20px 56px;
249
283
  }
250
284
 
251
285
  /* ── Sections ─────────────────────────────────────────────── */
@@ -253,11 +287,11 @@ main {
253
287
  .screen { margin-bottom: 44px; }
254
288
 
255
289
  .section-title {
256
- font-size: 13px;
290
+ font-size: 11px;
257
291
  font-weight: 700;
258
- color: var(--text-tertiary);
259
- margin-bottom: 18px;
260
- letter-spacing: .08em;
292
+ color: var(--muted);
293
+ margin-bottom: 14px;
294
+ letter-spacing: 0.1em;
261
295
  text-transform: uppercase;
262
296
  }
263
297
 
@@ -266,38 +300,28 @@ main {
266
300
  .card-grid {
267
301
  display: grid;
268
302
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
269
- gap: 16px;
303
+ gap: 12px;
270
304
  }
271
305
 
272
306
  .card {
273
- background: var(--bg-secondary);
274
- border: 1px solid var(--border);
275
- border-radius: var(--radius);
276
- padding: 18px 22px;
277
- transition: all var(--transition);
307
+ background: linear-gradient(
308
+ 165deg,
309
+ color-mix(in srgb, var(--bg-secondary) 100%, var(--text-primary)) 0%,
310
+ color-mix(in srgb, var(--bg-secondary) 96%, transparent) 100%
311
+ );
312
+ border: 1px solid color-mix(in srgb, var(--border) 90%, transparent);
313
+ border-radius: var(--radius-lg);
314
+ padding: 14px 16px;
315
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
278
316
  position: relative;
279
317
  overflow: hidden;
280
- }
281
- .card::before {
282
- content: '';
283
- position: absolute;
284
- inset: 0;
285
- border-radius: var(--radius);
286
- padding: 1px;
287
- background: linear-gradient(135deg, rgba(59,130,246,.1), transparent 50%);
288
- -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
289
- -webkit-mask-composite: xor;
290
- mask-composite: exclude;
291
- pointer-events: none;
292
- opacity: 0;
293
- transition: opacity var(--transition);
318
+ box-shadow: var(--shadow);
294
319
  }
295
320
  .card:hover {
296
- transform: translateY(-2px);
297
- box-shadow: var(--shadow-md);
298
- border-color: var(--border-glow);
321
+ transform: translateY(-1px);
322
+ border-color: color-mix(in srgb, var(--border) 70%, var(--blue));
323
+ box-shadow: var(--shadow-soft);
299
324
  }
300
- .card:hover::before { opacity: 1; }
301
325
 
302
326
  .card-health {
303
327
  grid-column: 1 / -1;
@@ -305,7 +329,11 @@ main {
305
329
  align-items: center;
306
330
  gap: 18px;
307
331
  flex-wrap: wrap;
308
- background: linear-gradient(135deg, var(--bg-secondary), var(--bg-elevated));
332
+ background: linear-gradient(
333
+ 165deg,
334
+ color-mix(in srgb, var(--bg-secondary) 100%, var(--text-primary)) 0%,
335
+ color-mix(in srgb, var(--bg-elevated) 92%, transparent) 100%
336
+ );
309
337
  }
310
338
 
311
339
  .card-label {
@@ -414,9 +442,27 @@ main {
414
442
  .badge-intent { background: var(--blue-bg); color: var(--blue); font-size: 0.7rem; border-color: rgba(59,130,246,.18); max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: inline-block; vertical-align: middle; }
415
443
 
416
444
  .backup-summary-cell { max-width: 420px; min-width: 180px; }
445
+ .summary-meta {
446
+ display: flex;
447
+ flex-wrap: wrap;
448
+ align-items: baseline;
449
+ gap: 8px 12px;
450
+ }
451
+ .summary-line-delta {
452
+ font-size: 12px;
453
+ font-weight: 700;
454
+ font-variant-numeric: tabular-nums;
455
+ color: var(--muted);
456
+ letter-spacing: 0.02em;
457
+ }
458
+ .summary-file-row .text-muted {
459
+ font-weight: 600;
460
+ }
461
+ .backup-meta-cell { max-width: 220px; min-width: 140px; vertical-align: top; }
462
+ .backup-human-meta { display: flex; flex-direction: column; gap: 3px; font-size: 11px; line-height: 1.35; color: var(--text-secondary); }
463
+ .backup-meta-line { display: block; }
417
464
 
418
465
  .summary-stack { display: flex; flex-direction: column; gap: 6px; padding: 4px 0; }
419
- .summary-meta { display: flex; align-items: center; gap: 8px; }
420
466
  .summary-files {
421
467
  font-size: 13px;
422
468
  font-weight: 700;
@@ -547,15 +593,23 @@ main {
547
593
  }
548
594
 
549
595
  .stat-card {
550
- background: var(--bg-secondary);
551
- border: 1px solid var(--border);
552
- border-radius: var(--radius);
553
- padding: 14px 18px;
596
+ background: linear-gradient(
597
+ 165deg,
598
+ color-mix(in srgb, var(--bg-secondary) 100%, var(--text-primary)) 0%,
599
+ color-mix(in srgb, var(--bg-secondary) 96%, transparent) 100%
600
+ );
601
+ border: 1px solid color-mix(in srgb, var(--border) 90%, transparent);
602
+ border-radius: var(--radius-lg);
603
+ padding: 12px 16px;
554
604
  min-width: 150px;
555
605
  flex: 1;
556
- transition: border-color var(--transition);
606
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
607
+ box-shadow: var(--shadow);
608
+ }
609
+ .stat-card:hover {
610
+ border-color: color-mix(in srgb, var(--border) 70%, var(--blue));
611
+ box-shadow: var(--shadow-soft);
557
612
  }
558
- .stat-card:hover { border-color: var(--border-glow); }
559
613
  .stat-label {
560
614
  font-size: 10px;
561
615
  font-weight: 700;
@@ -599,18 +653,23 @@ main {
599
653
  .filter-btn.active {
600
654
  background: var(--blue-bg);
601
655
  color: var(--blue);
602
- border-color: rgba(59,130,246,.35);
656
+ border-color: color-mix(in srgb, var(--blue) 42%, var(--border));
603
657
  font-weight: 600;
604
658
  }
605
659
 
606
660
  /* ── Table ────────────────────────────────────────────────── */
607
661
 
608
662
  .table-wrap {
609
- background: var(--bg-secondary);
610
- border: 1px solid var(--border);
611
- border-radius: var(--radius);
663
+ background: linear-gradient(
664
+ 165deg,
665
+ color-mix(in srgb, var(--bg-secondary) 100%, var(--text-primary)) 0%,
666
+ color-mix(in srgb, var(--bg-secondary) 97%, transparent) 100%
667
+ );
668
+ border: 1px solid color-mix(in srgb, var(--border) 88%, transparent);
669
+ border-radius: var(--radius-lg);
612
670
  overflow: auto;
613
671
  max-height: 440px;
672
+ box-shadow: var(--shadow);
614
673
  }
615
674
 
616
675
  .data-table {
@@ -642,13 +701,13 @@ main {
642
701
  transition: background var(--transition);
643
702
  }
644
703
  .data-table tbody tr:hover {
645
- background: rgba(59,130,246,.05);
704
+ background: color-mix(in srgb, var(--blue) 6%, transparent);
646
705
  }
647
706
  .data-table tbody tr:nth-child(even) {
648
- background: rgba(255,255,255,.015);
707
+ background: color-mix(in srgb, var(--text-primary) 2.5%, transparent);
649
708
  }
650
709
  .data-table tbody tr:nth-child(even):hover {
651
- background: rgba(59,130,246,.05);
710
+ background: color-mix(in srgb, var(--blue) 6%, transparent);
652
711
  }
653
712
 
654
713
  /* ── Protection ───────────────────────────────────────────── */
@@ -660,21 +719,58 @@ main {
660
719
  }
661
720
 
662
721
  .pattern-card {
663
- background: var(--bg-secondary);
664
- border: 1px solid var(--border);
665
- border-radius: var(--radius);
666
- padding: 18px;
667
- transition: border-color var(--transition);
722
+ background: linear-gradient(
723
+ 165deg,
724
+ color-mix(in srgb, var(--bg-secondary) 100%, var(--text-primary)) 0%,
725
+ color-mix(in srgb, var(--bg-secondary) 96%, transparent) 100%
726
+ );
727
+ border: 1px solid color-mix(in srgb, var(--border) 90%, transparent);
728
+ border-radius: var(--radius-lg);
729
+ padding: 16px;
730
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
731
+ box-shadow: var(--shadow);
732
+ }
733
+ .pattern-card:hover {
734
+ box-shadow: var(--shadow-soft);
735
+ }
736
+ .pattern-card--protect {
737
+ border-color: color-mix(in srgb, var(--green) 34%, var(--border));
738
+ background: linear-gradient(
739
+ 165deg,
740
+ color-mix(in srgb, var(--green) 9%, var(--bg-secondary)) 0%,
741
+ color-mix(in srgb, var(--bg-secondary) 98%, var(--text-primary)) 100%
742
+ );
743
+ }
744
+ .pattern-card--protect:hover {
745
+ border-color: color-mix(in srgb, var(--green) 48%, var(--border));
746
+ }
747
+ .pattern-card--ignore {
748
+ border-color: color-mix(in srgb, var(--muted) 26%, var(--border));
749
+ background: linear-gradient(
750
+ 165deg,
751
+ color-mix(in srgb, var(--muted) 7%, var(--bg-secondary)) 0%,
752
+ color-mix(in srgb, var(--bg-secondary) 98%, var(--text-primary)) 100%
753
+ );
754
+ }
755
+ .pattern-card--ignore:hover {
756
+ border-color: color-mix(in srgb, var(--muted) 38%, var(--border));
668
757
  }
669
- .pattern-card:hover { border-color: var(--border-glow); }
670
758
  .pattern-card h4 {
671
759
  font-size: 10px;
672
760
  font-weight: 700;
673
761
  text-transform: uppercase;
674
- letter-spacing: .08em;
675
- color: var(--text-tertiary);
762
+ letter-spacing: .1em;
676
763
  margin-bottom: 12px;
677
764
  }
765
+ .pattern-card--protect h4 { color: var(--green); }
766
+ .pattern-card--ignore h4 { color: color-mix(in srgb, var(--muted) 88%, var(--text)); }
767
+
768
+ .pattern-empty {
769
+ margin: 0;
770
+ line-height: 1.5;
771
+ }
772
+ .pattern-empty--protect { color: color-mix(in srgb, var(--green) 65%, var(--muted)); }
773
+ .pattern-empty--ignore { color: color-mix(in srgb, var(--muted) 95%, var(--text)); }
678
774
 
679
775
  .pattern-list {
680
776
  list-style: none;
@@ -683,16 +779,30 @@ main {
683
779
  gap: 8px;
684
780
  }
685
781
  .pattern-item {
686
- font-family: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
687
- font-size: 12px;
688
- background: var(--bg-tertiary);
689
- border: 1px solid var(--border-subtle);
690
- padding: 3px 10px;
691
- border-radius: 4px;
692
- color: var(--blue);
693
- transition: border-color var(--transition);
782
+ font-family: var(--font-mono);
783
+ font-size: 11px;
784
+ padding: 5px 10px;
785
+ border-radius: 8px;
786
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
787
+ }
788
+ .pattern-item--protect {
789
+ color: color-mix(in srgb, var(--green) 90%, #fff);
790
+ background: color-mix(in srgb, var(--green) 13%, var(--bg-tertiary));
791
+ border: 1px solid color-mix(in srgb, var(--green) 40%, transparent);
792
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--green) 8%, transparent);
793
+ }
794
+ .pattern-item--protect:hover {
795
+ border-color: color-mix(in srgb, var(--green) 58%, transparent);
796
+ box-shadow: var(--shadow-soft);
797
+ }
798
+ .pattern-item--ignore {
799
+ color: color-mix(in srgb, var(--muted) 96%, var(--text));
800
+ background: color-mix(in srgb, var(--muted) 11%, var(--bg-tertiary));
801
+ border: 1px solid color-mix(in srgb, var(--muted) 32%, var(--border));
802
+ }
803
+ .pattern-item--ignore:hover {
804
+ border-color: color-mix(in srgb, var(--muted) 50%, var(--border));
694
805
  }
695
- .pattern-item:hover { border-color: var(--blue); }
696
806
 
697
807
  .protection-note {
698
808
  margin-top: 16px;
@@ -712,20 +822,25 @@ main {
712
822
  /* ── Diagnostics Summary ──────────────────────────────────── */
713
823
 
714
824
  .diag-summary {
715
- background: linear-gradient(135deg, var(--bg-secondary), var(--bg-elevated));
716
- border: 1px solid var(--border);
717
- border-radius: var(--radius);
718
- padding: 20px 24px;
825
+ background: linear-gradient(
826
+ 165deg,
827
+ color-mix(in srgb, var(--bg-secondary) 100%, var(--text-primary)) 0%,
828
+ color-mix(in srgb, var(--bg-elevated) 94%, transparent) 100%
829
+ );
830
+ border: 1px solid color-mix(in srgb, var(--border) 88%, transparent);
831
+ border-radius: var(--radius-lg);
832
+ padding: 18px 22px;
719
833
  display: flex;
720
834
  align-items: center;
721
835
  gap: 24px;
722
836
  cursor: pointer;
723
- transition: all var(--transition);
837
+ transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
838
+ box-shadow: var(--shadow);
724
839
  }
725
840
  .diag-summary:hover {
726
- transform: translateY(-2px);
727
- box-shadow: var(--shadow-md);
728
- border-color: var(--border-glow);
841
+ transform: translateY(-1px);
842
+ box-shadow: var(--shadow-soft);
843
+ border-color: color-mix(in srgb, var(--border) 70%, var(--blue));
729
844
  }
730
845
 
731
846
  .diag-counts {
@@ -778,9 +893,13 @@ main {
778
893
  top: 0; right: 0; bottom: 0;
779
894
  width: var(--drawer-w);
780
895
  max-width: 92vw;
781
- background: var(--bg-secondary);
782
- border-left: 1px solid var(--border);
783
- box-shadow: -8px 0 32px rgba(0,0,0,.4);
896
+ background: linear-gradient(
897
+ 180deg,
898
+ color-mix(in srgb, var(--bg-secondary) 100%, var(--text-primary)) 0%,
899
+ var(--bg-primary) 100%
900
+ );
901
+ border-left: 1px solid color-mix(in srgb, var(--border) 85%, transparent);
902
+ box-shadow: -8px 0 32px rgba(0, 0, 0, 0.2);
784
903
  z-index: 101;
785
904
  display: flex;
786
905
  flex-direction: column;
@@ -1170,6 +1289,43 @@ main {
1170
1289
  }
1171
1290
  .alert-files-toggle:hover { color: var(--text-heading); }
1172
1291
 
1292
+ .alert-card-actions {
1293
+ margin-top: 10px;
1294
+ border-top: 1px solid var(--border-subtle);
1295
+ padding-top: 10px;
1296
+ display: flex;
1297
+ flex-wrap: wrap;
1298
+ align-items: center;
1299
+ gap: 10px 14px;
1300
+ }
1301
+ .alert-card-actions .alert-files-section {
1302
+ margin-top: 0;
1303
+ border-top: none;
1304
+ padding-top: 0;
1305
+ flex: 1 1 auto;
1306
+ min-width: 0;
1307
+ }
1308
+ .btn-alert-dismiss {
1309
+ border: 1px solid var(--border-subtle);
1310
+ border-radius: var(--radius-sm);
1311
+ background: color-mix(in srgb, var(--surface-2) 90%, var(--muted));
1312
+ color: var(--text-secondary);
1313
+ font: inherit;
1314
+ font-size: 12px;
1315
+ font-weight: 600;
1316
+ padding: 6px 12px;
1317
+ cursor: pointer;
1318
+ transition: border-color var(--transition), color var(--transition), background var(--transition);
1319
+ }
1320
+ .btn-alert-dismiss:hover:not(:disabled) {
1321
+ border-color: color-mix(in srgb, var(--muted) 40%, var(--border));
1322
+ color: var(--text-primary);
1323
+ }
1324
+ .btn-alert-dismiss:disabled {
1325
+ opacity: 0.65;
1326
+ cursor: not-allowed;
1327
+ }
1328
+
1173
1329
  .alert-files-table-wrap {
1174
1330
  margin-top: 8px;
1175
1331
  max-height: 220px;
@@ -1317,16 +1473,16 @@ main {
1317
1473
  left: 50%;
1318
1474
  transform: translateX(-50%) translateY(20px);
1319
1475
  background: var(--green);
1320
- color: #000;
1476
+ color: var(--surface);
1321
1477
  padding: 8px 20px;
1322
- border-radius: var(--radius-sm);
1323
- font-size: 13px;
1478
+ border-radius: var(--radius);
1479
+ font-size: 12px;
1324
1480
  font-weight: 700;
1325
1481
  opacity: 0;
1326
1482
  transition: opacity .25s, transform .25s;
1327
1483
  z-index: 200;
1328
1484
  pointer-events: none;
1329
- box-shadow: 0 4px 16px rgba(74,222,128,.3);
1485
+ box-shadow: var(--shadow-soft), 0 0 0 1px color-mix(in srgb, var(--green) 45%, transparent);
1330
1486
  }
1331
1487
  .copy-toast.show {
1332
1488
  opacity: 1;
@@ -1343,7 +1499,7 @@ main {
1343
1499
  /* ── Selection ───────────────────────────────────────────── */
1344
1500
 
1345
1501
  ::selection {
1346
- background: rgba(59,130,246,.3);
1502
+ background: color-mix(in srgb, var(--blue) 32%, transparent);
1347
1503
  color: var(--text-heading);
1348
1504
  }
1349
1505
 
@@ -1363,15 +1519,19 @@ main {
1363
1519
  display: flex;
1364
1520
  }
1365
1521
  .file-modal {
1366
- background: var(--card-bg);
1367
- border: 1px solid var(--border);
1368
- border-radius: var(--radius);
1522
+ background: linear-gradient(
1523
+ 165deg,
1524
+ color-mix(in srgb, var(--card-bg) 100%, var(--text-primary)) 0%,
1525
+ color-mix(in srgb, var(--card-bg) 96%, transparent) 100%
1526
+ );
1527
+ border: 1px solid color-mix(in srgb, var(--border) 88%, transparent);
1528
+ border-radius: var(--radius-lg);
1369
1529
  width: 90vw;
1370
1530
  max-width: 720px;
1371
1531
  max-height: 80vh;
1372
1532
  display: flex;
1373
1533
  flex-direction: column;
1374
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.3);
1534
+ box-shadow: var(--shadow-lg), var(--shadow-soft);
1375
1535
  }
1376
1536
  .file-modal-header {
1377
1537
  display: flex;