@eltonssouza/development-utility-kit 0.10.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 (131) hide show
  1. package/.claude/agents/README.md +24 -0
  2. package/.claude/agents/analyst.md +198 -0
  3. package/.claude/agents/backend-developer.md +126 -0
  4. package/.claude/agents/brain-keeper.md +229 -0
  5. package/.claude/agents/code-reviewer.md +181 -0
  6. package/.claude/agents/database-engineer.md +94 -0
  7. package/.claude/agents/devops-engineer.md +141 -0
  8. package/.claude/agents/frontend-developer.md +97 -0
  9. package/.claude/agents/gate-keeper.md +118 -0
  10. package/.claude/agents/migrator.md +291 -0
  11. package/.claude/agents/mobile-developer.md +80 -0
  12. package/.claude/agents/n8n-specialist.md +94 -0
  13. package/.claude/agents/product-owner.md +115 -0
  14. package/.claude/agents/qa-engineer.md +232 -0
  15. package/.claude/agents/release-engineer.md +204 -0
  16. package/.claude/agents/scaffold.md +87 -0
  17. package/.claude/agents/security-engineer.md +199 -0
  18. package/.claude/agents/sprint-runner.md +46 -0
  19. package/.claude/agents/stack-resolver.md +104 -0
  20. package/.claude/agents/tech-lead.md +182 -0
  21. package/.claude/agents/update-template.md +54 -0
  22. package/.claude/agents/ux-designer.md +118 -0
  23. package/.claude/hooks/flow-guard.js +261 -0
  24. package/.claude/hooks/flow-state.js +197 -0
  25. package/.claude/local/CLAUDE.md +71 -0
  26. package/.claude/settings.json +55 -0
  27. package/.claude/skills/README.md +331 -0
  28. package/.claude/skills/active-project/SKILL.md +131 -0
  29. package/.claude/skills/api-integration-test/SKILL.md +84 -0
  30. package/.claude/skills/auto-test-guard/SKILL.md +239 -0
  31. package/.claude/skills/auto-test-guard/resources/backend-tests.md +20 -0
  32. package/.claude/skills/auto-test-guard/resources/e2e-tests.md +24 -0
  33. package/.claude/skills/auto-test-guard/resources/execution-report.md +49 -0
  34. package/.claude/skills/auto-test-guard/resources/frontend-tests.md +18 -0
  35. package/.claude/skills/auto-test-guard/resources/initial-setup.md +108 -0
  36. package/.claude/skills/auto-test-guard/resources/run-suite.md +48 -0
  37. package/.claude/skills/auto-test-guard/resources/senior-gate.md +19 -0
  38. package/.claude/skills/brain-keeper/SKILL.md +62 -0
  39. package/.claude/skills/brain-keeper/obsidian/app.json +9 -0
  40. package/.claude/skills/brain-keeper/obsidian/appearance.json +4 -0
  41. package/.claude/skills/brain-keeper/obsidian/core-plugins.json +20 -0
  42. package/.claude/skills/brain-keeper/obsidian/daily-notes.json +5 -0
  43. package/.claude/skills/brain-keeper/obsidian/graph.json +32 -0
  44. package/.claude/skills/brain-keeper/obsidian/snippets/folder-colors.css +90 -0
  45. package/.claude/skills/brain-keeper/obsidian/templates.json +5 -0
  46. package/.claude/skills/brain-keeper/templates/README.md +51 -0
  47. package/.claude/skills/brain-keeper/templates/adr.md +40 -0
  48. package/.claude/skills/brain-keeper/templates/bug.md +35 -0
  49. package/.claude/skills/brain-keeper/templates/daily.md +38 -0
  50. package/.claude/skills/brain-keeper/templates/feature.md +62 -0
  51. package/.claude/skills/brain-keeper/templates/meeting.md +34 -0
  52. package/.claude/skills/brain-keeper/templates/tech-debt.md +21 -0
  53. package/.claude/skills/caveman/SKILL.md +189 -0
  54. package/.claude/skills/create-stack-pack/SKILL.md +281 -0
  55. package/.claude/skills/grill-me/SKILL.md +80 -0
  56. package/.claude/skills/pair-debug/SKILL.md +288 -0
  57. package/.claude/skills/prd-ready-check/SKILL.md +86 -0
  58. package/.claude/skills/project-manager/SKILL.md +334 -0
  59. package/.claude/skills/quality-standards/SKILL.md +203 -0
  60. package/.claude/skills/quick-feature/SKILL.md +266 -0
  61. package/.claude/skills/run-sprint/SKILL.md +41 -0
  62. package/.claude/skills/scaffold/SKILL.md +60 -0
  63. package/.claude/skills/stack-discovery/SKILL.md +161 -0
  64. package/.claude/skills/test-coverage-auditor/SKILL.md +87 -0
  65. package/.claude/skills/to-issues/SKILL.md +163 -0
  66. package/.claude/skills/to-prd/SKILL.md +130 -0
  67. package/.claude/skills/update-template/SKILL.md +256 -0
  68. package/.claude/stacks/CODEOWNERS +30 -0
  69. package/.claude/stacks/README.md +97 -0
  70. package/.claude/stacks/_template.md +116 -0
  71. package/.claude/stacks/dotnet/aspire-9.md +528 -0
  72. package/.claude/stacks/go/gin-1.10.md +570 -0
  73. package/.claude/stacks/java/spring-boot-3.md +376 -0
  74. package/.claude/stacks/java/spring-boot-4.md +438 -0
  75. package/.claude/stacks/node/express-5.md +538 -0
  76. package/.claude/stacks/python/django-5.md +483 -0
  77. package/.claude/stacks/python/fastapi-0.115.md +522 -0
  78. package/.claude/stacks/typescript/angular-18.md +420 -0
  79. package/.claude/stacks/typescript/angular-19.md +397 -0
  80. package/.claude/stacks/typescript/angular-21.md +494 -0
  81. package/CLAUDE.md +472 -0
  82. package/README.md +412 -0
  83. package/bin/cli.js +848 -0
  84. package/bin/lib/adr.js +146 -0
  85. package/bin/lib/backup.js +62 -0
  86. package/bin/lib/detect-stack.js +476 -0
  87. package/bin/lib/doctor.js +527 -0
  88. package/bin/lib/help.js +328 -0
  89. package/bin/lib/identity.js +108 -0
  90. package/bin/lib/lint-allowlist.json +15 -0
  91. package/bin/lib/lint.js +798 -0
  92. package/bin/lib/local-dir.js +68 -0
  93. package/bin/lib/manifest.js +236 -0
  94. package/bin/lib/sync-all.js +394 -0
  95. package/bin/lib/version-check.js +398 -0
  96. package/dashboard/db.js +321 -0
  97. package/dashboard/package.json +22 -0
  98. package/dashboard/public/app.js +853 -0
  99. package/dashboard/public/content/docs/agents-reference.en.md +911 -0
  100. package/dashboard/public/content/docs/architecture-overview.en.md +252 -0
  101. package/dashboard/public/content/docs/autonomy-matrix.en.md +186 -0
  102. package/dashboard/public/content/docs/cli-reference.en.md +538 -0
  103. package/dashboard/public/content/docs/git-flow.en.md +525 -0
  104. package/dashboard/public/content/docs/honcho-memory.en.md +394 -0
  105. package/dashboard/public/content/docs/hooks-reference.en.md +404 -0
  106. package/dashboard/public/content/docs/pipeline.en.md +414 -0
  107. package/dashboard/public/content/docs/plugins.en.md +289 -0
  108. package/dashboard/public/content/docs/quality-gate.en.md +315 -0
  109. package/dashboard/public/content/docs/skills-reference.en.md +484 -0
  110. package/dashboard/public/content/docs/stack-rules.en.md +362 -0
  111. package/dashboard/public/content/docs/troubleshooting.en.md +565 -0
  112. package/dashboard/public/content/manifest.json +114 -0
  113. package/dashboard/public/content/manual/backend.en.md +1053 -0
  114. package/dashboard/public/content/manual/existing-project.en.md +848 -0
  115. package/dashboard/public/content/manual/frontend.en.md +1008 -0
  116. package/dashboard/public/content/manual/fullstack.en.md +1459 -0
  117. package/dashboard/public/content/manual/mobile.en.md +837 -0
  118. package/dashboard/public/content/manual/quickstart.en.md +169 -0
  119. package/dashboard/public/index.html +217 -0
  120. package/dashboard/public/style.css +857 -0
  121. package/dashboard/public/vendor/marked.min.js +69 -0
  122. package/dashboard/rtk.js +143 -0
  123. package/dashboard/server-app.js +421 -0
  124. package/dashboard/server.js +104 -0
  125. package/dashboard/test/sprint1.test.js +406 -0
  126. package/dashboard/test/sprint2.test.js +571 -0
  127. package/dashboard/test/sprint3.test.js +560 -0
  128. package/package.json +33 -0
  129. package/scripts/hooks/subagent-telemetry.sh +14 -0
  130. package/scripts/hooks/telemetry-writer.js +250 -0
  131. package/scripts/latest-versions.json +56 -0
@@ -0,0 +1,857 @@
1
+ /* dashboard/public/style.css — NeuralPath design system */
2
+
3
+ *, *::before, *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ :root {
10
+ /* NeuralPath color tokens */
11
+ --blue-dark: #0a1628;
12
+ --blue-deep: #0f2847;
13
+ --blue-primary: #1a6bff;
14
+ --blue-light: #4d9aff;
15
+ --blue-glow: #6db3ff;
16
+ --orange-primary: #ff6b2b;
17
+ --orange-light: #ff9a5c;
18
+ --white-soft: #f0f4fa;
19
+ --white-muted: #c8d4e8;
20
+ --gray: #8892a4;
21
+ --glass-bg: rgba(255, 255, 255, 0.04);
22
+ --glass-border: rgba(255, 255, 255, 0.08);
23
+ --glass-border-2: rgba(255, 255, 255, 0.14);
24
+
25
+ /* Semantic aliases — app.js reads these */
26
+ --bg: var(--blue-dark);
27
+ --bg-card: var(--blue-deep);
28
+ --border: var(--glass-border);
29
+ --text: var(--white-soft);
30
+ --text-muted: var(--gray);
31
+ --accent: #39d353;
32
+ --accent2: var(--blue-glow);
33
+ --danger: #f85149;
34
+ --font: 'Inter', system-ui, -apple-system, sans-serif;
35
+ --font-mono: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
36
+ }
37
+
38
+ html {
39
+ scroll-behavior: smooth;
40
+ }
41
+
42
+ html, body {
43
+ height: 100%;
44
+ background-color: var(--blue-dark);
45
+ color: var(--white-soft);
46
+ font-family: var(--font);
47
+ font-size: 14px;
48
+ line-height: 1.6;
49
+ }
50
+
51
+ a {
52
+ color: var(--blue-glow);
53
+ text-decoration: none;
54
+ }
55
+
56
+ a:hover {
57
+ color: var(--white-soft);
58
+ }
59
+
60
+ /* ── custom scrollbar ── */
61
+
62
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
63
+ ::-webkit-scrollbar-track { background: var(--blue-dark); }
64
+ ::-webkit-scrollbar-thumb {
65
+ background: linear-gradient(180deg, var(--blue-primary), var(--orange-primary));
66
+ border-radius: 10px;
67
+ }
68
+
69
+ /* ── neural canvas ── */
70
+
71
+ #neuralCanvas {
72
+ position: fixed;
73
+ top: 0; left: 0;
74
+ width: 100%; height: 100%;
75
+ z-index: 0;
76
+ pointer-events: none;
77
+ }
78
+
79
+ /* ── loading screen ── */
80
+
81
+ .loader {
82
+ position: fixed;
83
+ top: 0; left: 0;
84
+ width: 100%; height: 100%;
85
+ background: var(--blue-dark);
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ z-index: 10000;
90
+ transition: opacity 0.7s ease, visibility 0.7s ease;
91
+ }
92
+
93
+ .loader.hidden {
94
+ opacity: 0;
95
+ visibility: hidden;
96
+ }
97
+
98
+ .loader-ring-wrap {
99
+ width: 56px;
100
+ height: 56px;
101
+ position: relative;
102
+ margin: 0 auto 16px;
103
+ }
104
+
105
+ .loader-ring {
106
+ position: absolute;
107
+ border: 2px solid transparent;
108
+ border-radius: 50%;
109
+ }
110
+
111
+ .loader-ring:nth-child(1) {
112
+ width: 56px; height: 56px;
113
+ border-top-color: var(--blue-primary);
114
+ animation: spin 1.2s linear infinite;
115
+ }
116
+
117
+ .loader-ring:nth-child(2) {
118
+ width: 40px; height: 40px;
119
+ top: 8px; left: 8px;
120
+ border-right-color: var(--orange-primary);
121
+ animation: spin 0.8s linear infinite reverse;
122
+ }
123
+
124
+ .loader-ring:nth-child(3) {
125
+ width: 24px; height: 24px;
126
+ top: 16px; left: 16px;
127
+ border-bottom-color: var(--blue-glow);
128
+ animation: spin 1.5s linear infinite;
129
+ }
130
+
131
+ .loader-text {
132
+ font-family: var(--font-mono);
133
+ font-size: 11px;
134
+ color: var(--blue-glow);
135
+ letter-spacing: 3px;
136
+ text-align: center;
137
+ text-transform: uppercase;
138
+ }
139
+
140
+ @keyframes spin { to { transform: rotate(360deg); } }
141
+
142
+ /* ── layout ── */
143
+
144
+ .app-header {
145
+ position: relative;
146
+ z-index: 100;
147
+ padding: 0.7rem 2rem;
148
+ border-bottom: 1px solid var(--glass-border);
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 0.75rem;
152
+ background: rgba(10, 22, 40, 0.88);
153
+ backdrop-filter: blur(20px);
154
+ }
155
+
156
+ .app-header h1 {
157
+ font-size: 0.95rem;
158
+ font-weight: 700;
159
+ letter-spacing: 0.02em;
160
+ background: linear-gradient(135deg, var(--blue-glow), var(--orange-light));
161
+ -webkit-background-clip: text;
162
+ -webkit-text-fill-color: transparent;
163
+ background-clip: text;
164
+ }
165
+
166
+ .app-header .badge {
167
+ background: var(--glass-bg);
168
+ border: 1px solid var(--glass-border-2);
169
+ color: var(--gray);
170
+ border-radius: 20px;
171
+ padding: 0.15rem 0.6rem;
172
+ font-size: 0.7rem;
173
+ font-weight: 500;
174
+ }
175
+
176
+ .grid {
177
+ position: relative;
178
+ z-index: 1;
179
+ display: grid;
180
+ grid-template-columns: repeat(3, 1fr);
181
+ gap: 1.25rem;
182
+ padding: 1.5rem 2rem;
183
+ }
184
+
185
+ @media (max-width: 768px) {
186
+ .grid {
187
+ grid-template-columns: 1fr;
188
+ padding: 1rem;
189
+ }
190
+ }
191
+
192
+ /* ── cards ── */
193
+
194
+ .card {
195
+ position: relative;
196
+ z-index: 1;
197
+ background: var(--glass-bg);
198
+ border: 1px solid var(--glass-border);
199
+ border-radius: 16px;
200
+ padding: 1.25rem;
201
+ min-height: 320px;
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: 0.75rem;
205
+ backdrop-filter: blur(10px);
206
+ transition: border-color 0.3s ease, box-shadow 0.3s ease, transform 0.3s ease;
207
+ overflow: hidden;
208
+ }
209
+
210
+ .card::before {
211
+ content: '';
212
+ position: absolute;
213
+ top: 0; left: 0;
214
+ width: 100%; height: 2px;
215
+ background: linear-gradient(90deg, var(--blue-primary), var(--orange-primary));
216
+ opacity: 0;
217
+ transition: opacity 0.3s ease;
218
+ }
219
+
220
+ .card:hover::before { opacity: 1; }
221
+
222
+ .card:hover {
223
+ border-color: var(--glass-border-2);
224
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.35);
225
+ transform: translateY(-2px);
226
+ }
227
+
228
+ .card-title {
229
+ font-size: 0.68rem;
230
+ font-weight: 600;
231
+ text-transform: uppercase;
232
+ letter-spacing: 0.12em;
233
+ color: var(--gray);
234
+ border-bottom: 1px solid var(--glass-border);
235
+ padding-bottom: 0.5rem;
236
+ }
237
+
238
+ /* ── projects list ── */
239
+
240
+ .project-list {
241
+ list-style: none;
242
+ flex: 1;
243
+ overflow-y: auto;
244
+ }
245
+
246
+ .project-item {
247
+ border-bottom: 1px solid var(--glass-border);
248
+ }
249
+
250
+ .project-item:last-child { border-bottom: none; }
251
+
252
+ .project-select-btn {
253
+ background: transparent;
254
+ border: none;
255
+ width: 100%;
256
+ display: flex;
257
+ justify-content: space-between;
258
+ align-items: center;
259
+ padding: 0.45rem 0.35rem;
260
+ font-family: var(--font);
261
+ font-size: 0.83rem;
262
+ cursor: pointer;
263
+ border-radius: 6px;
264
+ text-align: left;
265
+ transition: background 0.15s, padding-left 0.15s;
266
+ }
267
+
268
+ .project-select-btn:hover {
269
+ background: rgba(26, 107, 255, 0.07);
270
+ padding-left: 0.6rem;
271
+ }
272
+
273
+ .project-select-btn.active {
274
+ background: rgba(26, 107, 255, 0.12);
275
+ padding-left: 0.6rem;
276
+ }
277
+
278
+ .project-name {
279
+ color: var(--blue-glow);
280
+ max-width: 65%;
281
+ overflow: hidden;
282
+ text-overflow: ellipsis;
283
+ white-space: nowrap;
284
+ font-weight: 500;
285
+ }
286
+
287
+ .project-meta {
288
+ display: flex;
289
+ flex-direction: column;
290
+ align-items: flex-end;
291
+ gap: 0.1rem;
292
+ }
293
+
294
+ .project-date {
295
+ color: var(--gray);
296
+ font-size: 0.7rem;
297
+ }
298
+
299
+ .project-sessions {
300
+ color: var(--accent);
301
+ font-size: 0.7rem;
302
+ font-weight: 600;
303
+ }
304
+
305
+ /* ── RTK numbers ── */
306
+
307
+ .rtk-summary {
308
+ display: flex;
309
+ gap: 1.5rem;
310
+ margin-bottom: 0.5rem;
311
+ }
312
+
313
+ .rtk-stat {
314
+ display: flex;
315
+ flex-direction: column;
316
+ gap: 0.15rem;
317
+ }
318
+
319
+ .rtk-stat .value {
320
+ font-size: 1.5rem;
321
+ font-weight: 800;
322
+ background: linear-gradient(135deg, #ffffff, var(--blue-glow));
323
+ -webkit-background-clip: text;
324
+ -webkit-text-fill-color: transparent;
325
+ background-clip: text;
326
+ }
327
+
328
+ .rtk-stat .label {
329
+ font-size: 0.67rem;
330
+ color: var(--gray);
331
+ text-transform: uppercase;
332
+ letter-spacing: 0.1em;
333
+ font-weight: 500;
334
+ }
335
+
336
+ /* ── charts ── */
337
+
338
+ .chart-wrap {
339
+ flex: 1;
340
+ position: relative;
341
+ min-height: 180px;
342
+ }
343
+
344
+ canvas:not(#neuralCanvas) {
345
+ max-height: 220px;
346
+ }
347
+
348
+ /* ── status bar ── */
349
+
350
+ .status-bar {
351
+ position: relative;
352
+ z-index: 1;
353
+ padding: 0.4rem 2rem;
354
+ font-size: 0.7rem;
355
+ color: var(--gray);
356
+ border-top: 1px solid var(--glass-border);
357
+ display: flex;
358
+ justify-content: space-between;
359
+ background: rgba(10, 22, 40, 0.8);
360
+ backdrop-filter: blur(10px);
361
+ }
362
+
363
+ .status-bar .dot {
364
+ display: inline-block;
365
+ width: 6px; height: 6px;
366
+ border-radius: 50%;
367
+ background: var(--accent);
368
+ box-shadow: 0 0 6px var(--accent);
369
+ margin-right: 0.4rem;
370
+ animation: pulse 2s infinite;
371
+ }
372
+
373
+ @keyframes pulse {
374
+ 0%, 100% { opacity: 1; transform: scale(1); }
375
+ 50% { opacity: 0.5; transform: scale(1.4); }
376
+ }
377
+
378
+ .empty-state {
379
+ color: var(--gray);
380
+ font-size: 0.83rem;
381
+ text-align: center;
382
+ padding: 2rem 0;
383
+ }
384
+
385
+ /* ── tab navigation ── */
386
+
387
+ .tab-nav {
388
+ display: flex;
389
+ gap: 0.2rem;
390
+ margin-left: 1rem;
391
+ flex: 1;
392
+ }
393
+
394
+ .tab-btn {
395
+ background: transparent;
396
+ border: 1px solid transparent;
397
+ color: var(--gray);
398
+ cursor: pointer;
399
+ font-family: var(--font);
400
+ font-size: 0.79rem;
401
+ font-weight: 500;
402
+ padding: 0.3rem 0.9rem;
403
+ border-radius: 6px;
404
+ transition: color 0.2s, border-color 0.2s, background 0.2s;
405
+ }
406
+
407
+ .tab-btn:hover {
408
+ color: var(--white-muted);
409
+ border-color: var(--glass-border-2);
410
+ }
411
+
412
+ .tab-btn.active {
413
+ color: var(--blue-glow);
414
+ border-color: rgba(26, 107, 255, 0.4);
415
+ background: rgba(26, 107, 255, 0.08);
416
+ }
417
+
418
+ /* ── tab panels ── */
419
+
420
+ .tab-panel {
421
+ position: relative;
422
+ z-index: 1;
423
+ display: flex;
424
+ flex-direction: column;
425
+ min-height: calc(100vh - 56px - 32px);
426
+ }
427
+
428
+ .tab-panel[hidden] { display: none; }
429
+
430
+ /* ── lang selector ── */
431
+
432
+ .lang-selector {
433
+ display: flex;
434
+ align-items: center;
435
+ gap: 0.25rem;
436
+ margin-left: auto;
437
+ }
438
+
439
+ .lang-btn {
440
+ background: transparent;
441
+ border: 1px solid transparent;
442
+ color: var(--gray);
443
+ cursor: pointer;
444
+ font-family: var(--font);
445
+ font-size: 0.73rem;
446
+ font-weight: 500;
447
+ padding: 0.2rem 0.5rem;
448
+ border-radius: 4px;
449
+ transition: color 0.15s, border-color 0.15s;
450
+ }
451
+
452
+ .lang-btn:hover { color: var(--white-muted); }
453
+
454
+ .lang-btn.active {
455
+ color: var(--accent);
456
+ border-color: rgba(57, 211, 83, 0.35);
457
+ background: rgba(57, 211, 83, 0.06);
458
+ }
459
+
460
+ .lang-sep { color: var(--glass-border-2); font-size: 0.75rem; }
461
+
462
+ /* ── panel layout (toc + content) ── */
463
+
464
+ .panel-layout {
465
+ display: flex;
466
+ gap: 1.5rem;
467
+ padding: 1.5rem 2rem;
468
+ align-items: flex-start;
469
+ }
470
+
471
+ .panel-content {
472
+ flex: 1;
473
+ min-width: 0;
474
+ }
475
+
476
+ /* ── toc sidebar ── */
477
+
478
+ .toc-sidebar {
479
+ width: 220px;
480
+ min-width: 180px;
481
+ flex-shrink: 0;
482
+ position: sticky;
483
+ top: 1.5rem;
484
+ max-height: calc(100vh - 80px);
485
+ overflow-y: auto;
486
+ font-size: 0.78rem;
487
+ color: var(--gray);
488
+ }
489
+
490
+ .toc-sidebar ul { list-style: none; padding: 0; }
491
+
492
+ .toc-sidebar li {
493
+ padding: 0.2rem 0;
494
+ border-left: 2px solid var(--glass-border);
495
+ padding-left: 0.6rem;
496
+ margin-bottom: 0.15rem;
497
+ transition: border-color 0.15s;
498
+ }
499
+
500
+ .toc-sidebar li a {
501
+ color: var(--gray);
502
+ text-decoration: none;
503
+ display: block;
504
+ transition: color 0.15s;
505
+ }
506
+
507
+ .toc-sidebar li a:hover,
508
+ .toc-sidebar li.active a { color: var(--blue-glow); }
509
+
510
+ .toc-sidebar li.active { border-left-color: var(--blue-primary); }
511
+
512
+ /* ── accordion ── */
513
+
514
+ .accordion {
515
+ border: 1px solid var(--glass-border);
516
+ border-radius: 10px;
517
+ margin-bottom: 0.6rem;
518
+ overflow: hidden;
519
+ }
520
+
521
+ .accordion-header {
522
+ background: var(--glass-bg);
523
+ border: none;
524
+ color: var(--white-muted);
525
+ cursor: pointer;
526
+ display: flex;
527
+ align-items: center;
528
+ justify-content: space-between;
529
+ font-family: var(--font);
530
+ font-size: 0.87rem;
531
+ font-weight: 500;
532
+ padding: 0.75rem 1rem;
533
+ text-align: left;
534
+ width: 100%;
535
+ transition: background 0.15s, color 0.15s;
536
+ }
537
+
538
+ .accordion-header:hover {
539
+ background: rgba(26, 107, 255, 0.06);
540
+ color: #ffffff;
541
+ }
542
+
543
+ .accordion-header.open {
544
+ border-bottom: 1px solid var(--glass-border);
545
+ color: var(--blue-glow);
546
+ }
547
+
548
+ .accordion-chevron {
549
+ font-size: 0.65rem;
550
+ color: var(--gray);
551
+ transition: transform 0.2s;
552
+ }
553
+
554
+ .accordion-header.open .accordion-chevron { transform: rotate(180deg); }
555
+
556
+ .accordion-body {
557
+ display: none;
558
+ padding: 1rem;
559
+ background: rgba(10, 22, 40, 0.5);
560
+ }
561
+
562
+ .accordion-body.open { display: block; }
563
+
564
+ /* ── markdown content body ── */
565
+
566
+ .content-body {
567
+ line-height: 1.75;
568
+ color: var(--white-muted);
569
+ }
570
+
571
+ .content-body h1,
572
+ .content-body h2,
573
+ .content-body h3 {
574
+ margin-top: 1.75rem;
575
+ margin-bottom: 0.6rem;
576
+ font-weight: 700;
577
+ }
578
+
579
+ .content-body h1 {
580
+ font-size: 1.35rem;
581
+ letter-spacing: -0.5px;
582
+ color: #ffffff;
583
+ }
584
+
585
+ .content-body h2 {
586
+ font-size: 1.05rem;
587
+ color: var(--blue-glow);
588
+ border-bottom: 1px solid var(--glass-border);
589
+ padding-bottom: 0.4rem;
590
+ }
591
+
592
+ .content-body h3 {
593
+ font-size: 0.94rem;
594
+ color: var(--white-muted);
595
+ }
596
+
597
+ .content-body p { margin-bottom: 0.8rem; }
598
+
599
+ .content-body pre {
600
+ background: rgba(10, 22, 40, 0.8);
601
+ border: 1px solid var(--glass-border);
602
+ border-radius: 10px;
603
+ padding: 1rem 1.25rem;
604
+ overflow-x: auto;
605
+ font-family: var(--font-mono);
606
+ font-size: 0.8rem;
607
+ line-height: 1.7;
608
+ margin-bottom: 0.8rem;
609
+ }
610
+
611
+ .content-body code {
612
+ font-family: var(--font-mono);
613
+ background: rgba(26, 107, 255, 0.08);
614
+ border: 1px solid rgba(26, 107, 255, 0.15);
615
+ border-radius: 4px;
616
+ font-size: 0.8rem;
617
+ padding: 0.1rem 0.35rem;
618
+ color: var(--blue-glow);
619
+ }
620
+
621
+ .content-body pre code {
622
+ background: none;
623
+ border: none;
624
+ padding: 0;
625
+ color: var(--white-muted);
626
+ }
627
+
628
+ .content-body table {
629
+ border-collapse: collapse;
630
+ width: 100%;
631
+ margin-bottom: 0.8rem;
632
+ font-size: 0.83rem;
633
+ }
634
+
635
+ .content-body th,
636
+ .content-body td {
637
+ border: 1px solid var(--glass-border);
638
+ padding: 0.45rem 0.75rem;
639
+ }
640
+
641
+ .content-body th {
642
+ background: var(--glass-bg);
643
+ color: var(--gray);
644
+ text-transform: uppercase;
645
+ font-size: 0.68rem;
646
+ letter-spacing: 0.08em;
647
+ font-weight: 600;
648
+ }
649
+
650
+ .content-body tr:hover td { background: rgba(26, 107, 255, 0.04); }
651
+
652
+ .content-body ul,
653
+ .content-body ol {
654
+ padding-left: 1.5rem;
655
+ margin-bottom: 0.8rem;
656
+ }
657
+
658
+ .content-body li { margin-bottom: 0.3rem; }
659
+
660
+ .content-body strong {
661
+ color: #ffffff;
662
+ font-weight: 600;
663
+ }
664
+
665
+ .content-body blockquote {
666
+ border-left: 3px solid var(--blue-primary);
667
+ padding-left: 1rem;
668
+ color: var(--gray);
669
+ margin-bottom: 0.8rem;
670
+ font-style: italic;
671
+ }
672
+
673
+ /* ── scenario selector ── */
674
+
675
+ .scenario-selector {
676
+ display: flex;
677
+ flex-wrap: wrap;
678
+ gap: 0.4rem;
679
+ margin-bottom: 1.25rem;
680
+ }
681
+
682
+ .scenario-btn {
683
+ background: var(--glass-bg);
684
+ border: 1px solid var(--glass-border);
685
+ color: var(--gray);
686
+ cursor: pointer;
687
+ font-family: var(--font);
688
+ font-size: 0.76rem;
689
+ font-weight: 500;
690
+ padding: 0.3rem 0.85rem;
691
+ border-radius: 20px;
692
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
693
+ }
694
+
695
+ .scenario-btn:hover {
696
+ color: var(--white-muted);
697
+ border-color: rgba(26, 107, 255, 0.4);
698
+ }
699
+
700
+ .scenario-btn.active {
701
+ color: var(--blue-glow);
702
+ border-color: rgba(26, 107, 255, 0.5);
703
+ background: rgba(26, 107, 255, 0.1);
704
+ }
705
+
706
+ /* ── translation banner ── */
707
+
708
+ .translation-banner {
709
+ background: rgba(210, 153, 34, 0.1);
710
+ border: 1px solid rgba(210, 153, 34, 0.35);
711
+ border-radius: 8px;
712
+ color: #e3b341;
713
+ font-size: 0.78rem;
714
+ margin-bottom: 1rem;
715
+ padding: 0.5rem 1rem;
716
+ }
717
+
718
+ .translation-banner[hidden] { display: none; }
719
+
720
+ /* ── loading spinner ── */
721
+
722
+ .loading-spinner {
723
+ color: var(--gray);
724
+ font-size: 0.83rem;
725
+ padding: 2rem;
726
+ text-align: center;
727
+ }
728
+
729
+ /* ── docs index lists ── */
730
+
731
+ .docs-index-list { list-style: none; padding: 0; }
732
+
733
+ .docs-index-item {
734
+ border: 1px solid var(--glass-border);
735
+ border-radius: 10px;
736
+ margin-bottom: 0.4rem;
737
+ overflow: hidden;
738
+ transition: border-color 0.2s;
739
+ }
740
+
741
+ .docs-index-item:hover { border-color: var(--glass-border-2); }
742
+
743
+ .docs-index-item-header {
744
+ align-items: center;
745
+ background: var(--glass-bg);
746
+ cursor: pointer;
747
+ display: flex;
748
+ gap: 0.5rem;
749
+ justify-content: space-between;
750
+ padding: 0.6rem 1rem;
751
+ transition: background 0.15s;
752
+ }
753
+
754
+ .docs-index-item-header:hover { background: rgba(26, 107, 255, 0.06); }
755
+
756
+ .docs-index-item-name {
757
+ color: var(--blue-glow);
758
+ font-size: 0.84rem;
759
+ font-weight: 600;
760
+ }
761
+
762
+ .docs-index-item-model,
763
+ .docs-index-item-desc {
764
+ color: var(--gray);
765
+ font-size: 0.72rem;
766
+ }
767
+
768
+ .docs-index-item-body {
769
+ display: none;
770
+ padding: 0.75rem 1rem;
771
+ background: rgba(10, 22, 40, 0.5);
772
+ border-top: 1px solid var(--glass-border);
773
+ }
774
+
775
+ .docs-index-item-body.open { display: block; }
776
+
777
+ /* ── processes panel ── */
778
+
779
+ .processes-panel {
780
+ position: relative;
781
+ z-index: 1;
782
+ margin: 0 2rem 1.5rem;
783
+ background: var(--glass-bg);
784
+ border: 1px solid var(--glass-border);
785
+ border-radius: 16px;
786
+ backdrop-filter: blur(10px);
787
+ overflow: hidden;
788
+ }
789
+
790
+ .processes-header {
791
+ display: flex;
792
+ align-items: center;
793
+ justify-content: space-between;
794
+ padding: 0.7rem 1.25rem;
795
+ border-bottom: 1px solid var(--glass-border);
796
+ background: rgba(26, 107, 255, 0.05);
797
+ }
798
+
799
+ .processes-title {
800
+ font-size: 0.7rem;
801
+ font-weight: 600;
802
+ text-transform: uppercase;
803
+ letter-spacing: 0.12em;
804
+ color: var(--blue-glow);
805
+ }
806
+
807
+ .processes-close {
808
+ background: none;
809
+ border: none;
810
+ color: var(--gray);
811
+ cursor: pointer;
812
+ font-size: 1.1rem;
813
+ line-height: 1;
814
+ padding: 0.1rem 0.4rem;
815
+ border-radius: 4px;
816
+ transition: color 0.15s, background 0.15s;
817
+ }
818
+
819
+ .processes-close:hover {
820
+ color: #ffffff;
821
+ background: rgba(255, 255, 255, 0.06);
822
+ }
823
+
824
+ .processes-list { padding: 0.75rem 1.25rem; }
825
+
826
+ /* ── responsive ── */
827
+
828
+ @media (max-width: 768px) {
829
+ .toc-sidebar { display: none; }
830
+ .panel-layout { padding: 1rem; }
831
+ .accordion-body { padding: 0.75rem; }
832
+ .tab-nav { margin-left: 0; flex-wrap: wrap; }
833
+ .app-header { flex-wrap: wrap; gap: 0.5rem; }
834
+ .processes-panel { margin: 0 1rem 1rem; }
835
+ }
836
+
837
+ /* ── reveal animation ── */
838
+
839
+ .reveal {
840
+ opacity: 0;
841
+ transform: translateY(20px);
842
+ transition: opacity 0.6s ease, transform 0.6s ease;
843
+ }
844
+
845
+ .reveal.active {
846
+ opacity: 1;
847
+ transform: translateY(0);
848
+ }
849
+
850
+ /* ── gradient text utility ── */
851
+
852
+ .gradient-text {
853
+ background: linear-gradient(135deg, var(--blue-glow), var(--orange-light));
854
+ -webkit-background-clip: text;
855
+ -webkit-text-fill-color: transparent;
856
+ background-clip: text;
857
+ }