@sienklogic/plan-build-run 2.33.1 → 2.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CHANGELOG.md +678 -0
  2. package/dashboard/public/css/command-center.css +152 -65
  3. package/dashboard/public/css/explorer.css +70 -41
  4. package/dashboard/public/css/layout.css +163 -2
  5. package/dashboard/public/css/settings.css +108 -110
  6. package/dashboard/public/css/timeline.css +2 -1
  7. package/dashboard/public/css/tokens.css +13 -0
  8. package/dashboard/public/js/sidebar-toggle.js +21 -7
  9. package/dashboard/src/components/Layout.tsx +51 -7
  10. package/dashboard/src/components/explorer/tabs/MilestonesTab.tsx +18 -2
  11. package/dashboard/src/components/explorer/tabs/PhasesTab.tsx +11 -1
  12. package/dashboard/src/components/explorer/tabs/TodosTab.tsx +25 -6
  13. package/dashboard/src/components/partials/AttentionPanel.tsx +7 -1
  14. package/dashboard/src/components/partials/CurrentPhaseCard.tsx +26 -24
  15. package/dashboard/src/components/partials/QuickActions.tsx +21 -11
  16. package/dashboard/src/components/partials/StatCardGrid.tsx +67 -0
  17. package/dashboard/src/components/partials/StatusHeader.tsx +2 -1
  18. package/dashboard/src/components/settings/LogEntryList.tsx +43 -5
  19. package/dashboard/src/routes/command-center.routes.tsx +8 -7
  20. package/dashboard/src/routes/index.routes.tsx +32 -29
  21. package/package.json +2 -2
  22. package/plugins/copilot-pbr/agents/audit.agent.md +128 -16
  23. package/plugins/copilot-pbr/agents/codebase-mapper.agent.md +48 -1
  24. package/plugins/copilot-pbr/agents/debugger.agent.md +47 -1
  25. package/plugins/copilot-pbr/agents/executor.agent.md +152 -8
  26. package/plugins/copilot-pbr/agents/general.agent.md +46 -1
  27. package/plugins/copilot-pbr/agents/integration-checker.agent.md +52 -2
  28. package/plugins/copilot-pbr/agents/plan-checker.agent.md +50 -2
  29. package/plugins/copilot-pbr/agents/planner.agent.md +54 -1
  30. package/plugins/copilot-pbr/agents/researcher.agent.md +47 -2
  31. package/plugins/copilot-pbr/agents/synthesizer.agent.md +49 -1
  32. package/plugins/copilot-pbr/agents/verifier.agent.md +86 -2
  33. package/plugins/copilot-pbr/hooks/hooks.json +11 -0
  34. package/plugins/copilot-pbr/plugin.json +1 -1
  35. package/plugins/copilot-pbr/references/agent-contracts.md +27 -0
  36. package/plugins/copilot-pbr/references/checkpoints.md +32 -1
  37. package/plugins/copilot-pbr/references/context-quality-tiers.md +45 -0
  38. package/plugins/copilot-pbr/references/pbr-tools-cli.md +115 -0
  39. package/plugins/copilot-pbr/references/questioning.md +21 -1
  40. package/plugins/copilot-pbr/references/verification-patterns.md +52 -1
  41. package/plugins/copilot-pbr/skills/audit/SKILL.md +19 -3
  42. package/plugins/copilot-pbr/skills/begin/SKILL.md +57 -4
  43. package/plugins/copilot-pbr/skills/build/SKILL.md +39 -2
  44. package/plugins/copilot-pbr/skills/debug/SKILL.md +12 -1
  45. package/plugins/copilot-pbr/skills/explore/SKILL.md +13 -2
  46. package/plugins/copilot-pbr/skills/import/SKILL.md +26 -1
  47. package/plugins/copilot-pbr/skills/milestone/SKILL.md +15 -3
  48. package/plugins/copilot-pbr/skills/plan/SKILL.md +50 -0
  49. package/plugins/copilot-pbr/skills/quick/SKILL.md +21 -0
  50. package/plugins/copilot-pbr/skills/review/SKILL.md +45 -0
  51. package/plugins/copilot-pbr/skills/scan/SKILL.md +20 -0
  52. package/plugins/copilot-pbr/templates/SUMMARY-complex.md.tmpl +95 -0
  53. package/plugins/copilot-pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
  54. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +1 -1
  55. package/plugins/cursor-pbr/agents/audit.md +51 -5
  56. package/plugins/cursor-pbr/agents/codebase-mapper.md +48 -1
  57. package/plugins/cursor-pbr/agents/debugger.md +47 -1
  58. package/plugins/cursor-pbr/agents/executor.md +152 -8
  59. package/plugins/cursor-pbr/agents/general.md +46 -1
  60. package/plugins/cursor-pbr/agents/integration-checker.md +51 -1
  61. package/plugins/cursor-pbr/agents/plan-checker.md +49 -1
  62. package/plugins/cursor-pbr/agents/planner.md +54 -1
  63. package/plugins/cursor-pbr/agents/researcher.md +46 -1
  64. package/plugins/cursor-pbr/agents/synthesizer.md +49 -1
  65. package/plugins/cursor-pbr/agents/verifier.md +85 -1
  66. package/plugins/cursor-pbr/hooks/hooks.json +9 -0
  67. package/plugins/cursor-pbr/references/agent-contracts.md +27 -0
  68. package/plugins/cursor-pbr/references/checkpoints.md +32 -1
  69. package/plugins/cursor-pbr/references/context-quality-tiers.md +45 -0
  70. package/plugins/cursor-pbr/references/pbr-tools-cli.md +115 -0
  71. package/plugins/cursor-pbr/references/questioning.md +21 -1
  72. package/plugins/cursor-pbr/references/verification-patterns.md +52 -1
  73. package/plugins/cursor-pbr/skills/audit/SKILL.md +19 -3
  74. package/plugins/cursor-pbr/skills/begin/SKILL.md +57 -4
  75. package/plugins/cursor-pbr/skills/build/SKILL.md +37 -2
  76. package/plugins/cursor-pbr/skills/debug/SKILL.md +12 -1
  77. package/plugins/cursor-pbr/skills/explore/SKILL.md +13 -2
  78. package/plugins/cursor-pbr/skills/import/SKILL.md +26 -1
  79. package/plugins/cursor-pbr/skills/milestone/SKILL.md +15 -3
  80. package/plugins/cursor-pbr/skills/plan/SKILL.md +50 -0
  81. package/plugins/cursor-pbr/skills/quick/SKILL.md +21 -0
  82. package/plugins/cursor-pbr/skills/review/SKILL.md +45 -0
  83. package/plugins/cursor-pbr/skills/scan/SKILL.md +20 -0
  84. package/plugins/cursor-pbr/templates/SUMMARY-complex.md.tmpl +95 -0
  85. package/plugins/cursor-pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
  86. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
  87. package/plugins/pbr/agents/audit.md +44 -0
  88. package/plugins/pbr/agents/codebase-mapper.md +47 -0
  89. package/plugins/pbr/agents/debugger.md +46 -0
  90. package/plugins/pbr/agents/executor.md +150 -6
  91. package/plugins/pbr/agents/general.md +45 -0
  92. package/plugins/pbr/agents/integration-checker.md +50 -0
  93. package/plugins/pbr/agents/plan-checker.md +48 -0
  94. package/plugins/pbr/agents/planner.md +51 -0
  95. package/plugins/pbr/agents/researcher.md +45 -0
  96. package/plugins/pbr/agents/synthesizer.md +48 -0
  97. package/plugins/pbr/agents/verifier.md +84 -0
  98. package/plugins/pbr/hooks/hooks.json +9 -0
  99. package/plugins/pbr/references/agent-contracts.md +27 -0
  100. package/plugins/pbr/references/checkpoints.md +32 -0
  101. package/plugins/pbr/references/context-quality-tiers.md +45 -0
  102. package/plugins/pbr/references/pbr-tools-cli.md +115 -0
  103. package/plugins/pbr/references/questioning.md +21 -0
  104. package/plugins/pbr/references/verification-patterns.md +52 -0
  105. package/plugins/pbr/scripts/check-plan-format.js +15 -3
  106. package/plugins/pbr/scripts/check-state-sync.js +26 -7
  107. package/plugins/pbr/scripts/check-subagent-output.js +30 -2
  108. package/plugins/pbr/scripts/config-schema.json +11 -1
  109. package/plugins/pbr/scripts/context-bridge.js +259 -0
  110. package/plugins/pbr/scripts/context-budget-check.js +2 -2
  111. package/plugins/pbr/scripts/lib/config.js +178 -0
  112. package/plugins/pbr/scripts/lib/core.js +578 -0
  113. package/plugins/pbr/scripts/lib/history.js +73 -0
  114. package/plugins/pbr/scripts/lib/init.js +166 -0
  115. package/plugins/pbr/scripts/lib/phase.js +364 -0
  116. package/plugins/pbr/scripts/lib/roadmap.js +175 -0
  117. package/plugins/pbr/scripts/lib/state.js +397 -0
  118. package/plugins/pbr/scripts/pbr-tools.js +346 -1235
  119. package/plugins/pbr/scripts/post-write-dispatch.js +5 -4
  120. package/plugins/pbr/scripts/post-write-quality.js +3 -3
  121. package/plugins/pbr/scripts/pre-write-dispatch.js +1 -1
  122. package/plugins/pbr/scripts/progress-tracker.js +1 -1
  123. package/plugins/pbr/scripts/suggest-compact.js +1 -1
  124. package/plugins/pbr/scripts/track-context-budget.js +53 -2
  125. package/plugins/pbr/scripts/validate-task.js +20 -28
  126. package/plugins/pbr/skills/audit/SKILL.md +19 -3
  127. package/plugins/pbr/skills/begin/SKILL.md +48 -2
  128. package/plugins/pbr/skills/build/SKILL.md +39 -2
  129. package/plugins/pbr/skills/debug/SKILL.md +12 -1
  130. package/plugins/pbr/skills/debug/templates/continuation-prompt.md.tmpl +12 -1
  131. package/plugins/pbr/skills/debug/templates/initial-investigation-prompt.md.tmpl +12 -5
  132. package/plugins/pbr/skills/explore/SKILL.md +13 -2
  133. package/plugins/pbr/skills/import/SKILL.md +26 -1
  134. package/plugins/pbr/skills/milestone/SKILL.md +15 -3
  135. package/plugins/pbr/skills/plan/SKILL.md +52 -2
  136. package/plugins/pbr/skills/quick/SKILL.md +21 -0
  137. package/plugins/pbr/skills/review/SKILL.md +46 -0
  138. package/plugins/pbr/skills/scan/SKILL.md +20 -0
  139. package/plugins/pbr/templates/SUMMARY-complex.md.tmpl +95 -0
  140. package/plugins/pbr/templates/SUMMARY-minimal.md.tmpl +48 -0
@@ -5,6 +5,83 @@
5
5
  All values use tokens from tokens.css.
6
6
  ============================================ */
7
7
 
8
+ /* --- Stat Card Grid --- */
9
+ .stat-card-grid {
10
+ display: grid;
11
+ grid-template-columns: repeat(4, 1fr);
12
+ gap: var(--space-md);
13
+ margin-bottom: var(--space-lg);
14
+ }
15
+
16
+ .stat-card {
17
+ background: var(--card-bg);
18
+ border: 1px solid var(--card-border);
19
+ border-radius: var(--card-radius);
20
+ box-shadow: var(--card-shadow);
21
+ padding: var(--stat-card-padding);
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: var(--space-xs);
25
+ transition: box-shadow var(--transition-fast);
26
+ }
27
+
28
+ .stat-card:hover {
29
+ box-shadow: var(--shadow-md);
30
+ }
31
+
32
+ .stat-card--accent {
33
+ border-left: 3px solid var(--color-accent);
34
+ }
35
+
36
+ .stat-card__label {
37
+ font-size: var(--stat-card-label-size);
38
+ font-weight: 600;
39
+ text-transform: uppercase;
40
+ letter-spacing: 0.08em;
41
+ color: var(--color-text-muted);
42
+ }
43
+
44
+ .stat-card__value {
45
+ font-size: var(--stat-card-value-size);
46
+ font-weight: 700;
47
+ line-height: 1.1;
48
+ color: var(--color-text);
49
+ letter-spacing: -0.02em;
50
+ }
51
+
52
+ .stat-card__sub {
53
+ font-size: var(--stat-card-sub-size);
54
+ color: var(--color-text-dim);
55
+ line-height: 1.4;
56
+ }
57
+
58
+ .stat-card__mini-bar {
59
+ height: 4px;
60
+ border-radius: var(--radius-lg);
61
+ background: var(--color-border);
62
+ overflow: hidden;
63
+ margin-top: var(--space-xs);
64
+ }
65
+
66
+ .stat-card__mini-bar-fill {
67
+ height: 100%;
68
+ border-radius: var(--radius-lg);
69
+ background: var(--color-accent);
70
+ transition: width var(--transition-base);
71
+ }
72
+
73
+ @media (max-width: 900px) {
74
+ .stat-card-grid {
75
+ grid-template-columns: repeat(2, 1fr);
76
+ }
77
+ }
78
+
79
+ @media (max-width: 480px) {
80
+ .stat-card-grid {
81
+ grid-template-columns: 1fr;
82
+ }
83
+ }
84
+
8
85
  /* --- Command Center Layout --- */
9
86
  .command-center {
10
87
  display: flex;
@@ -26,6 +103,68 @@
26
103
  }
27
104
  }
28
105
 
106
+ /* --- Command Center Two-Column Layout --- */
107
+ .cc-two-col {
108
+ display: grid;
109
+ grid-template-columns: 1fr 360px;
110
+ gap: var(--space-lg);
111
+ align-items: start;
112
+ }
113
+
114
+ .cc-col-main {
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: var(--space-lg);
118
+ }
119
+
120
+ .cc-col-side {
121
+ display: flex;
122
+ flex-direction: column;
123
+ gap: var(--space-lg);
124
+ }
125
+
126
+ @media (max-width: 900px) {
127
+ .cc-two-col {
128
+ grid-template-columns: 1fr;
129
+ }
130
+ }
131
+
132
+ /* --- Empty State --- */
133
+ .empty-state {
134
+ display: flex;
135
+ flex-direction: column;
136
+ align-items: center;
137
+ justify-content: center;
138
+ padding: var(--space-xl) var(--space-lg);
139
+ text-align: center;
140
+ gap: var(--space-sm);
141
+ }
142
+
143
+ .empty-state__icon {
144
+ font-size: 2rem;
145
+ color: var(--color-text-muted);
146
+ line-height: 1;
147
+ margin-bottom: var(--space-xs);
148
+ }
149
+
150
+ .empty-state__heading {
151
+ font-size: 0.9375rem;
152
+ font-weight: 600;
153
+ color: var(--color-text);
154
+ margin: 0;
155
+ }
156
+
157
+ .empty-state__body {
158
+ font-size: 0.875rem;
159
+ color: var(--color-text-dim);
160
+ margin: 0;
161
+ max-width: 240px;
162
+ }
163
+
164
+ .empty-state__action {
165
+ margin-top: var(--space-xs);
166
+ }
167
+
29
168
  /* --- Status Header --- */
30
169
  .status-header {
31
170
  display: flex;
@@ -119,11 +258,11 @@
119
258
  }
120
259
 
121
260
  .card__header {
122
- font-size: 0.75rem;
123
- font-weight: 600;
261
+ font-size: var(--section-label-size);
262
+ font-weight: var(--section-label-weight);
124
263
  text-transform: uppercase;
125
- letter-spacing: 0.08em;
126
- color: var(--color-text-muted);
264
+ letter-spacing: var(--section-label-spacing);
265
+ color: var(--section-label-color);
127
266
  padding-bottom: var(--space-sm);
128
267
  border-bottom: 1px solid var(--color-border);
129
268
  margin-bottom: var(--space-md);
@@ -203,11 +342,11 @@
203
342
  }
204
343
 
205
344
  .phase-timeline__label {
206
- font-size: 0.75rem;
207
- font-weight: 600;
345
+ font-size: var(--section-label-size);
346
+ font-weight: var(--section-label-weight);
208
347
  text-transform: uppercase;
209
- letter-spacing: 0.08em;
210
- color: var(--color-text-muted);
348
+ letter-spacing: var(--section-label-spacing);
349
+ color: var(--section-label-color);
211
350
  margin-bottom: var(--space-sm);
212
351
  }
213
352
 
@@ -314,11 +453,11 @@
314
453
  }
315
454
 
316
455
  .quick-actions__label {
317
- font-size: 0.75rem;
318
- font-weight: 600;
456
+ font-size: var(--section-label-size);
457
+ font-weight: var(--section-label-weight);
319
458
  text-transform: uppercase;
320
- letter-spacing: 0.08em;
321
- color: var(--color-text-muted);
459
+ letter-spacing: var(--section-label-spacing);
460
+ color: var(--section-label-color);
322
461
  }
323
462
 
324
463
  .quick-actions__buttons {
@@ -327,56 +466,4 @@
327
466
  gap: var(--space-sm);
328
467
  }
329
468
 
330
- /* --- Buttons --- */
331
- .btn {
332
- display: inline-flex;
333
- align-items: center;
334
- justify-content: center;
335
- padding: var(--space-xs) var(--space-md);
336
- border-radius: var(--radius-sm);
337
- font-size: 0.875rem;
338
- font-weight: 500;
339
- text-decoration: none;
340
- cursor: pointer;
341
- border: 1px solid transparent;
342
- transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
343
- }
344
-
345
- .btn--primary {
346
- background: var(--color-accent);
347
- color: #fff;
348
- border-color: var(--color-accent);
349
- }
350
-
351
- .btn--primary:hover {
352
- background: var(--color-accent-hover);
353
- border-color: var(--color-accent-hover);
354
- color: #fff;
355
- text-decoration: none;
356
- }
357
-
358
- .btn--secondary {
359
- background: transparent;
360
- color: var(--color-text);
361
- border-color: var(--color-border);
362
- }
363
-
364
- .btn--secondary:hover {
365
- background: var(--color-surface-hover);
366
- text-decoration: none;
367
- }
368
-
369
- .btn--ghost {
370
- background: transparent;
371
- color: var(--color-text-dim);
372
- border-color: transparent;
373
- }
374
-
375
- .btn--ghost:hover {
376
- background: var(--color-surface-hover);
377
- }
378
-
379
- .btn--sm {
380
- padding: 2px var(--space-sm);
381
- font-size: 0.75rem;
382
- }
469
+ /* .btn system defined in layout.css */
@@ -312,6 +312,23 @@
312
312
  font-size: 0.9rem;
313
313
  }
314
314
 
315
+ .explorer-filter-select {
316
+ padding: var(--space-xs) var(--space-sm);
317
+ border: 1px solid var(--color-border);
318
+ border-radius: var(--radius-sm);
319
+ background: var(--color-surface);
320
+ color: var(--color-text);
321
+ font-size: 0.875rem;
322
+ font-family: var(--font-sans);
323
+ cursor: pointer;
324
+ min-width: 120px;
325
+ }
326
+
327
+ .explorer-filter-select:focus {
328
+ outline: 2px solid var(--color-accent);
329
+ outline-offset: 1px;
330
+ }
331
+
315
332
  .explorer-create-form {
316
333
  background: var(--color-surface-raised);
317
334
  border: 1px solid var(--color-border);
@@ -321,51 +338,15 @@
321
338
  }
322
339
 
323
340
  .explorer-section-title {
324
- font-size: 0.85rem;
325
- font-weight: 600;
326
- color: var(--color-text-dim);
341
+ font-size: var(--section-label-size);
342
+ font-weight: var(--section-label-weight);
343
+ color: var(--section-label-color);
327
344
  text-transform: uppercase;
328
- letter-spacing: 0.05em;
345
+ letter-spacing: var(--section-label-spacing);
329
346
  margin: var(--space-md) 0 var(--space-sm);
330
347
  }
331
348
 
332
- /* ---- Button system ---- */
333
-
334
- .btn {
335
- display: inline-flex;
336
- align-items: center;
337
- gap: 4px;
338
- padding: var(--space-xs) var(--space-sm);
339
- border-radius: var(--radius-sm);
340
- border: 1px solid transparent;
341
- cursor: pointer;
342
- font-size: 0.875rem;
343
- font-weight: 500;
344
- transition: all 0.15s;
345
- }
346
-
347
- .btn--primary {
348
- background: var(--color-accent);
349
- color: white;
350
- border-color: var(--color-accent);
351
- }
352
-
353
- .btn--ghost {
354
- background: none;
355
- color: var(--color-text-dim);
356
- border-color: var(--color-border);
357
- }
358
-
359
- .btn--sm {
360
- padding: 2px var(--space-xs);
361
- font-size: 0.8rem;
362
- }
363
-
364
- .btn--danger {
365
- background: var(--color-error-bg);
366
- color: var(--color-error);
367
- border-color: var(--color-error);
368
- }
349
+ /* .btn system defined in layout.css */
369
350
 
370
351
  /* ---- Priority badge modifiers ---- */
371
352
 
@@ -418,6 +399,54 @@
418
399
  gap: var(--space-md);
419
400
  }
420
401
 
402
+ /* ---- Todo cards ---- */
403
+
404
+ .todo-card {
405
+ display: flex;
406
+ flex-direction: column;
407
+ gap: var(--space-xs);
408
+ background: var(--color-surface-raised);
409
+ border: 1px solid var(--color-border);
410
+ border-radius: var(--radius-md);
411
+ border-left-width: 4px;
412
+ padding: var(--space-sm) var(--space-md);
413
+ overflow: hidden;
414
+ }
415
+
416
+ .todo-card--high {
417
+ border-left-color: var(--color-error, #ef4444);
418
+ }
419
+
420
+ .todo-card--medium {
421
+ border-left-color: var(--color-warning, #f59e0b);
422
+ }
423
+
424
+ .todo-card--low {
425
+ border-left-color: var(--color-border);
426
+ }
427
+
428
+ .todo-card__main {
429
+ display: flex;
430
+ align-items: center;
431
+ gap: var(--space-sm);
432
+ }
433
+
434
+ .todo-card__main .explorer-item__title {
435
+ flex: 1;
436
+ }
437
+
438
+ .todo-card__meta {
439
+ display: flex;
440
+ gap: var(--space-md);
441
+ font-size: 0.8rem;
442
+ color: var(--color-text-dim);
443
+ padding-left: calc(var(--space-sm) + 60px);
444
+ }
445
+
446
+ .todo-card__meta:empty {
447
+ display: none;
448
+ }
449
+
421
450
  /* ---- Requirements traceability table ---- */
422
451
 
423
452
  .explorer-req-section {
@@ -42,6 +42,10 @@ a:hover {
42
42
  text-decoration: underline;
43
43
  }
44
44
 
45
+ button, [role="button"], summary, label[for] {
46
+ cursor: pointer;
47
+ }
48
+
45
49
  code, pre, kbd, samp {
46
50
  font-family: var(--font-mono);
47
51
  font-size: 0.875em;
@@ -103,13 +107,39 @@ ul, ol {
103
107
  z-index: 10;
104
108
  }
105
109
 
110
+ .sidebar__toggle {
111
+ display: none;
112
+ align-items: center;
113
+ justify-content: center;
114
+ position: fixed;
115
+ top: var(--space-sm);
116
+ left: var(--space-sm);
117
+ z-index: 20;
118
+ width: 2.5rem;
119
+ height: 2.5rem;
120
+ border: 1px solid var(--color-border);
121
+ border-radius: var(--radius-sm);
122
+ background: var(--color-surface-raised);
123
+ color: var(--color-text);
124
+ font-size: 1.25rem;
125
+ cursor: pointer;
126
+ }
127
+
128
+ body.sidebar-visible .main-content::before {
129
+ content: '';
130
+ position: fixed;
131
+ inset: 0;
132
+ background: rgba(0,0,0,0.4);
133
+ z-index: 5;
134
+ }
135
+
106
136
  .main-content {
107
137
  margin-left: var(--size-sidebar);
108
138
  flex: 1;
109
139
  padding: var(--space-lg) var(--space-xl);
110
140
  min-height: 100vh;
111
141
  background: var(--color-surface);
112
- max-width: 100%;
142
+ max-width: 1400px;
113
143
  }
114
144
 
115
145
  /* --- Sidebar Brand --- */
@@ -134,6 +164,38 @@ ul, ol {
134
164
  letter-spacing: 0.02em;
135
165
  }
136
166
 
167
+ /* --- Sidebar Brand Icon --- */
168
+ .sidebar__brand {
169
+ flex-direction: row;
170
+ align-items: center;
171
+ gap: var(--space-sm);
172
+ }
173
+
174
+ .sidebar__brand-icon {
175
+ display: flex;
176
+ align-items: center;
177
+ color: var(--color-accent);
178
+ flex-shrink: 0;
179
+ }
180
+
181
+ .sidebar__brand-text {
182
+ display: flex;
183
+ flex-direction: column;
184
+ }
185
+
186
+ /* --- Sidebar Nav Icon --- */
187
+ .sidebar__nav-icon {
188
+ display: flex;
189
+ align-items: center;
190
+ flex-shrink: 0;
191
+ opacity: 0.7;
192
+ }
193
+
194
+ .sidebar__nav-link--active .sidebar__nav-icon,
195
+ .sidebar__nav-link[aria-current="page"] .sidebar__nav-icon {
196
+ opacity: 1;
197
+ }
198
+
137
199
  /* --- Sidebar Navigation --- */
138
200
  .sidebar__nav {
139
201
  list-style: none;
@@ -147,7 +209,9 @@ ul, ol {
147
209
  }
148
210
 
149
211
  .sidebar__nav-link {
150
- display: block;
212
+ display: flex;
213
+ align-items: center;
214
+ gap: var(--space-sm);
151
215
  padding: var(--space-sm) var(--space-lg);
152
216
  font-size: 0.875rem;
153
217
  font-weight: 500;
@@ -241,6 +305,71 @@ ul, ol {
241
305
  text-align: center;
242
306
  }
243
307
 
308
+ /* --- Button System (single source of truth) --- */
309
+ .btn {
310
+ display: inline-flex;
311
+ align-items: center;
312
+ gap: 4px;
313
+ padding: var(--space-xs) var(--space-md);
314
+ border-radius: var(--radius-sm);
315
+ font-size: 0.875rem;
316
+ font-weight: 500;
317
+ cursor: pointer;
318
+ border: 1px solid transparent;
319
+ transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast);
320
+ text-decoration: none;
321
+ }
322
+
323
+ .btn:focus-visible {
324
+ outline: 2px solid var(--color-accent);
325
+ outline-offset: 2px;
326
+ }
327
+
328
+ .btn--primary {
329
+ background: var(--color-accent);
330
+ color: #fff;
331
+ border-color: var(--color-accent);
332
+ }
333
+
334
+ .btn--primary:hover {
335
+ background: var(--color-accent-hover);
336
+ border-color: var(--color-accent-hover);
337
+ color: #fff;
338
+ text-decoration: none;
339
+ }
340
+
341
+ .btn--secondary {
342
+ background: transparent;
343
+ color: var(--color-text);
344
+ border-color: var(--color-border);
345
+ }
346
+
347
+ .btn--secondary:hover {
348
+ background: var(--color-surface-hover);
349
+ text-decoration: none;
350
+ }
351
+
352
+ .btn--ghost {
353
+ background: transparent;
354
+ color: var(--color-text-dim);
355
+ border-color: transparent;
356
+ }
357
+
358
+ .btn--ghost:hover {
359
+ background: var(--color-surface-hover);
360
+ }
361
+
362
+ .btn--sm {
363
+ padding: 2px var(--space-sm);
364
+ font-size: 0.75rem;
365
+ }
366
+
367
+ .btn--danger {
368
+ background: var(--color-error-bg);
369
+ color: var(--color-error);
370
+ border-color: var(--color-error);
371
+ }
372
+
244
373
  /* --- Card Component --- */
245
374
  .card,
246
375
  article {
@@ -249,6 +378,12 @@ article {
249
378
  background: var(--card-bg);
250
379
  box-shadow: var(--card-shadow);
251
380
  margin-bottom: var(--space-lg);
381
+ transition: box-shadow var(--transition-fast);
382
+ }
383
+
384
+ .card:hover,
385
+ article:hover {
386
+ box-shadow: var(--shadow-md);
252
387
  }
253
388
 
254
389
  .card__header,
@@ -265,6 +400,15 @@ article > header strong {
265
400
  font-weight: 600;
266
401
  }
267
402
 
403
+ /* Reusable section label — same treatment as card headers */
404
+ .section-label {
405
+ font-size: var(--section-label-size);
406
+ font-weight: var(--section-label-weight);
407
+ text-transform: uppercase;
408
+ letter-spacing: var(--section-label-spacing);
409
+ color: var(--section-label-color);
410
+ }
411
+
268
412
  .card__body {
269
413
  padding: var(--card-padding) var(--space-lg);
270
414
  }
@@ -843,6 +987,23 @@ details li {
843
987
  min-width: 100px;
844
988
  font-size: 0.75rem;
845
989
  }
990
+
991
+ .sidebar {
992
+ transform: translateX(-100%);
993
+ transition: transform 0.2s ease;
994
+ }
995
+
996
+ .sidebar--open {
997
+ transform: translateX(0);
998
+ }
999
+
1000
+ .sidebar__toggle {
1001
+ display: flex;
1002
+ }
1003
+
1004
+ .main-content {
1005
+ margin-left: 0;
1006
+ }
846
1007
  }
847
1008
 
848
1009
  @media (max-width: 480px) {