viteboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/bin/viteboard.mjs +59 -0
  4. package/content/docs/assets/image-mqjpqlyw.png +0 -0
  5. package/content/docs/assets/image-mqjsmenr.png +0 -0
  6. package/content/docs/boards/product-roadmap.board.json +2130 -0
  7. package/content/docs/capabilities.md +89 -0
  8. package/content/docs/docs.md +84 -0
  9. package/content/docs/guide/boards-in-markdown.md +48 -0
  10. package/content/docs/guide/boards.md +92 -0
  11. package/content/docs/guide/getting-started.md +71 -0
  12. package/content/docs/guide/test.md +6 -0
  13. package/content/docs/index.md +47 -0
  14. package/content/docs/product-roadmap.board.json +2130 -0
  15. package/content/docs/test.md +219 -0
  16. package/content/docs/tetst-dir/test-board.board.json +15 -0
  17. package/content/docs/tetst-dir/test-test.md +1 -0
  18. package/content/docs/workspace.md +73 -0
  19. package/dist/assets/index-CEpxLM2o.css +1 -0
  20. package/dist/assets/index-D4xvJdEQ.js +60 -0
  21. package/dist/index.html +13 -0
  22. package/index.html +13 -0
  23. package/package.json +52 -0
  24. package/src/app/AppController.ts +955 -0
  25. package/src/app/BoardState.ts +130 -0
  26. package/src/app/ClipboardService.ts +159 -0
  27. package/src/app/CommandManager.ts +66 -0
  28. package/src/app/ElementActions.ts +152 -0
  29. package/src/app/EmbedRegionSelector.ts +103 -0
  30. package/src/app/ExportPng.ts +107 -0
  31. package/src/app/ImageInsertService.ts +141 -0
  32. package/src/app/KeyboardShortcuts.ts +124 -0
  33. package/src/app/main.ts +6 -0
  34. package/src/board/BoardPreview.ts +189 -0
  35. package/src/board/BoardService.ts +222 -0
  36. package/src/canvas/CanvasRenderer.ts +253 -0
  37. package/src/canvas/CanvasSurface.ts +70 -0
  38. package/src/canvas/HitTester.ts +110 -0
  39. package/src/canvas/ImageCache.ts +123 -0
  40. package/src/canvas/PerformanceMonitor.ts +31 -0
  41. package/src/canvas/RenderScheduler.ts +26 -0
  42. package/src/canvas/Viewport.ts +77 -0
  43. package/src/content/ContentApi.ts +258 -0
  44. package/src/content/Markdown.ts +431 -0
  45. package/src/content/MarkdownView.ts +70 -0
  46. package/src/editor/DocEditor.ts +799 -0
  47. package/src/editor/htmlToMarkdown.ts +333 -0
  48. package/src/elements/renderElement.ts +509 -0
  49. package/src/elements/types.ts +118 -0
  50. package/src/shell/Shell.ts +2950 -0
  51. package/src/shell/Sidebar.ts +1352 -0
  52. package/src/storage/AssetStore.ts +86 -0
  53. package/src/storage/BoardSerializer.ts +114 -0
  54. package/src/storage/ImportExportService.ts +153 -0
  55. package/src/storage/IndexedDbStore.ts +92 -0
  56. package/src/storage/LocalBoardStore.ts +104 -0
  57. package/src/styles.css +3257 -0
  58. package/src/templates/helpers.ts +124 -0
  59. package/src/templates/index.ts +65 -0
  60. package/src/templates/journeyMapTemplate.ts +52 -0
  61. package/src/templates/opportunityTreeTemplate.ts +45 -0
  62. package/src/templates/personaTemplate.ts +41 -0
  63. package/src/templates/prioritizationMatrixTemplate.ts +44 -0
  64. package/src/templates/requirementsFlowTemplate.ts +45 -0
  65. package/src/templates/screenshotReviewTemplate.ts +52 -0
  66. package/src/templates/systemDiagramTemplate.ts +41 -0
  67. package/src/testing/StressTestGenerator.ts +134 -0
  68. package/src/testing/StressTestPanel.ts +64 -0
  69. package/src/tools/ArrowTool.ts +87 -0
  70. package/src/tools/ImageTool.ts +39 -0
  71. package/src/tools/PanTool.ts +34 -0
  72. package/src/tools/SelectTool.ts +377 -0
  73. package/src/tools/ShapeTool.ts +106 -0
  74. package/src/tools/StickyTool.ts +69 -0
  75. package/src/tools/TaskTool.ts +52 -0
  76. package/src/tools/TextTool.ts +45 -0
  77. package/src/tools/ToolContext.ts +44 -0
  78. package/src/tools/ToolController.ts +178 -0
  79. package/src/ui/Modal.ts +58 -0
  80. package/src/ui/PerformanceOverlay.ts +75 -0
  81. package/src/ui/StorageManager.ts +94 -0
  82. package/src/ui/TemplatePicker.ts +67 -0
  83. package/src/ui/TextEditorOverlay.ts +137 -0
  84. package/src/ui/Toolbar.ts +151 -0
  85. package/src/ui/TopControls.ts +137 -0
  86. package/src/ui/icons.ts +50 -0
  87. package/tsconfig.json +19 -0
  88. package/vite.config.ts +694 -0
package/src/styles.css ADDED
@@ -0,0 +1,3257 @@
1
+ :root {
2
+ --brand-100: #ffffff;
3
+ --brand-200: #4dabf7;
4
+ --brand-300: #0078d4;
5
+ --brand-400: #495057;
6
+ --brand-500: #0078d4;
7
+ --brand-600: #005a9e;
8
+ --neutral-100: #f3f2f1;
9
+ --neutral-200: #eaeaea;
10
+ --neutral-300: #d1d1d1;
11
+ --neutral-400: #c8c8c8;
12
+ --neutral-500: #6e6e6e;
13
+ --neutral-600: #7a7a7a;
14
+ --neutral-700: #495057;
15
+ --neutral-800: #4a4a4a;
16
+ --neutral-900: #0f0f0f;
17
+ --neutral-000: #ffffff;
18
+ --success-main: #28a745;
19
+ --success-bg: #e6f4ea;
20
+ --success-text: #1e7e34;
21
+ --warning-main: #dc2626;
22
+ --warning-bg: #fef2f2;
23
+ --warning-text: #ffffff;
24
+ --error-main: #cd0000;
25
+ --error-bg: #ffe5e5;
26
+ --error-text: #b91c1c;
27
+ --info-main: #1080a6;
28
+ --info-bg: #e0f7fa;
29
+ --info-text: #0369a1;
30
+ --bg-canvas: var(--neutral-100);
31
+ --bg-toolbar: rgba(255, 255, 255, 0.92);
32
+ --bg-panel: var(--brand-100);
33
+ --bg-hover: rgba(0, 0, 0, 0.05);
34
+ --bg-active: rgba(0, 120, 212, 0.12);
35
+ --surface-raised: var(--brand-100);
36
+ --accent: var(--neutral-500);
37
+ --accent-quiet: rgba(110, 110, 110, 0.14);
38
+ --accent-soft: rgba(110, 110, 110, 0.08);
39
+ --accent-secondary: var(--brand-300);
40
+ --accent-secondary-quiet: rgba(0, 120, 212, 0.13);
41
+ --focus-glow: rgba(0, 120, 212, 0.26);
42
+ --text-primary: var(--neutral-900);
43
+ --text-secondary: #6e6e6e;
44
+ --border-subtle: rgba(0, 0, 0, 0.08);
45
+ --selection: var(--accent);
46
+ --shadow-soft: 0 4px 24px rgba(0, 0, 0, 0.08), 0 1px 3px rgba(0, 0, 0, 0.06);
47
+ --shadow-modal: 0 12px 48px rgba(0, 0, 0, 0.18);
48
+ --grid-dot: rgba(110, 110, 110, 0.16);
49
+ --danger: var(--error-main);
50
+ }
51
+
52
+ [data-theme="dark"] {
53
+ --bg-canvas: #0d0d0d;
54
+ --bg-toolbar: rgba(20, 22, 23, 0.94);
55
+ --bg-panel: #1a1a1a;
56
+ --bg-hover: rgba(255, 255, 255, 0.055);
57
+ --bg-active: rgba(97, 218, 251, 0.12);
58
+ --surface-raised: #212121;
59
+ --accent: #61dafb;
60
+ --accent-quiet: rgba(97, 218, 251, 0.14);
61
+ --accent-soft: rgba(97, 218, 251, 0.075);
62
+ --accent-secondary: #73d0f4;
63
+ --accent-secondary-quiet: rgba(97, 218, 251, 0.18);
64
+ --focus-glow: rgba(97, 218, 251, 0.28);
65
+ --text-primary: #f6f6f3;
66
+ --text-secondary: #a7aaa8;
67
+ --border-subtle: rgba(255, 255, 255, 0.09);
68
+ --selection: var(--accent);
69
+ --shadow-soft: 0 16px 46px rgba(0, 0, 0, 0.52), 0 1px 1px rgba(255, 255, 255, 0.03);
70
+ --shadow-modal: 0 22px 70px rgba(0, 0, 0, 0.72);
71
+ --grid-dot: rgba(97, 218, 251, 0.1);
72
+ }
73
+
74
+ * {
75
+ margin: 0;
76
+ padding: 0;
77
+ box-sizing: border-box;
78
+ }
79
+
80
+ html,
81
+ body {
82
+ width: 100%;
83
+ height: 100%;
84
+ overflow: hidden;
85
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
86
+ background: var(--bg-canvas);
87
+ color: var(--text-primary);
88
+ }
89
+
90
+ #app {
91
+ position: fixed;
92
+ inset: 0;
93
+ }
94
+
95
+ .canvas-stack {
96
+ position: absolute;
97
+ inset: 0;
98
+ }
99
+
100
+ .canvas-stack canvas {
101
+ position: absolute;
102
+ inset: 0;
103
+ display: block;
104
+ }
105
+
106
+ /* ---------- Toolbar ---------- */
107
+ .bottom-tool-cluster {
108
+ position: fixed;
109
+ bottom: 20px;
110
+ left: 50%;
111
+ transform: translateX(-50%);
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ gap: 10px;
116
+ z-index: 125;
117
+ }
118
+
119
+ .toolbar {
120
+ position: fixed;
121
+ bottom: 20px;
122
+ left: 50%;
123
+ transform: translateX(-50%);
124
+ display: flex;
125
+ align-items: center;
126
+ gap: 2px;
127
+ padding: 6px;
128
+ background: var(--bg-toolbar);
129
+ backdrop-filter: blur(16px);
130
+ -webkit-backdrop-filter: blur(16px);
131
+ border: 1px solid var(--border-subtle);
132
+ border-radius: 14px;
133
+ box-shadow: var(--shadow-soft);
134
+ z-index: 100;
135
+ }
136
+
137
+ .bottom-tool-cluster .toolbar {
138
+ position: relative;
139
+ inset: auto;
140
+ transform: none;
141
+ z-index: 1;
142
+ }
143
+
144
+ .shape-tool-group {
145
+ position: relative;
146
+ display: flex;
147
+ }
148
+
149
+ .shape-tool-popover {
150
+ position: absolute;
151
+ left: 50%;
152
+ bottom: calc(100% + 12px);
153
+ transform: translateX(-50%) translateY(8px) scale(0.96);
154
+ transform-origin: bottom center;
155
+ display: grid;
156
+ grid-template-columns: repeat(3, 38px);
157
+ gap: 4px;
158
+ padding: 6px;
159
+ background: var(--bg-toolbar);
160
+ border: 1px solid var(--border-subtle);
161
+ border-radius: 14px;
162
+ box-shadow: var(--shadow-soft);
163
+ backdrop-filter: blur(16px);
164
+ -webkit-backdrop-filter: blur(16px);
165
+ opacity: 0;
166
+ pointer-events: none;
167
+ transition: opacity 0.16s ease, transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);
168
+ }
169
+
170
+ .shape-tool-group.open .shape-tool-popover {
171
+ opacity: 1;
172
+ pointer-events: auto;
173
+ transform: translateX(-50%) translateY(0) scale(1);
174
+ }
175
+
176
+ .shape-option-btn {
177
+ width: 38px;
178
+ height: 38px;
179
+ }
180
+
181
+ .shape-tool-popover::after {
182
+ content: "";
183
+ position: absolute;
184
+ left: 50%;
185
+ bottom: -5px;
186
+ width: 10px;
187
+ height: 10px;
188
+ transform: translateX(-50%) rotate(45deg);
189
+ background: var(--bg-toolbar);
190
+ border-right: 1px solid var(--border-subtle);
191
+ border-bottom: 1px solid var(--border-subtle);
192
+ }
193
+
194
+ .context-tool-popover {
195
+ position: relative;
196
+ width: 0;
197
+ height: 52px;
198
+ transform: translateX(-14px) scale(0.96);
199
+ transform-origin: left center;
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 8px;
203
+ padding: 6px 0;
204
+ background: var(--bg-toolbar);
205
+ border: 1px solid transparent;
206
+ border-radius: 999px;
207
+ box-shadow: var(--shadow-soft);
208
+ backdrop-filter: blur(16px);
209
+ -webkit-backdrop-filter: blur(16px);
210
+ opacity: 0;
211
+ overflow: hidden;
212
+ pointer-events: none;
213
+ z-index: 0;
214
+ transition:
215
+ width 0.26s cubic-bezier(0.2, 0.8, 0.2, 1),
216
+ padding 0.26s cubic-bezier(0.2, 0.8, 0.2, 1),
217
+ opacity 0.18s ease,
218
+ transform 0.24s cubic-bezier(0.2, 0.8, 0.2, 1),
219
+ border-color 0.18s ease;
220
+ }
221
+
222
+ .context-tool-popover.is-visible {
223
+ padding: 6px 10px;
224
+ border-color: var(--border-subtle);
225
+ opacity: 1;
226
+ pointer-events: auto;
227
+ transform: translateX(0) scale(1);
228
+ }
229
+
230
+ .sticky-color-popover.is-visible {
231
+ width: 286px;
232
+ }
233
+
234
+ .text-size-popover.is-visible {
235
+ width: 300px;
236
+ }
237
+
238
+ .shape-style-popover.is-visible {
239
+ width: 386px;
240
+ }
241
+
242
+ .sticky-color-btn,
243
+ .shape-fill-btn {
244
+ width: 24px;
245
+ height: 24px;
246
+ border: 1px solid rgba(0, 0, 0, 0.16);
247
+ border-radius: 999px;
248
+ background: var(--swatch);
249
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.42);
250
+ cursor: pointer;
251
+ opacity: 0;
252
+ transform: translateX(-6px) scale(0.88);
253
+ transition:
254
+ opacity 0.16s ease,
255
+ transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1),
256
+ box-shadow 0.12s ease,
257
+ border-color 0.12s ease;
258
+ }
259
+
260
+ .shape-text-color-btn {
261
+ flex: 0 0 auto;
262
+ width: 32px;
263
+ height: 32px;
264
+ border: 1px solid var(--border-subtle);
265
+ border-radius: 999px;
266
+ background: var(--surface-raised);
267
+ color: var(--text-primary);
268
+ font-size: 12px;
269
+ font-weight: 800;
270
+ cursor: pointer;
271
+ opacity: 0;
272
+ transform: translateX(-6px) scale(0.88);
273
+ transition:
274
+ opacity 0.16s ease,
275
+ transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1),
276
+ box-shadow 0.12s ease,
277
+ border-color 0.12s ease,
278
+ background 0.12s ease;
279
+ }
280
+
281
+ .shape-text-color-btn[aria-label="White text"] {
282
+ background: #ffffff;
283
+ color: #252829;
284
+ }
285
+
286
+ .shape-text-color-btn[aria-label="Black text"] {
287
+ background: #252829;
288
+ color: #ffffff;
289
+ }
290
+
291
+ .context-tool-divider {
292
+ width: 1px;
293
+ height: 28px;
294
+ background: var(--border-subtle);
295
+ opacity: 0;
296
+ transform: scaleY(0.65);
297
+ transition: opacity 0.16s ease, transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);
298
+ }
299
+
300
+ .text-size-btn {
301
+ flex: 1 1 0;
302
+ min-width: 0;
303
+ height: 38px;
304
+ padding: 0 8px;
305
+ border: 1px solid transparent;
306
+ border-radius: 999px;
307
+ background: transparent;
308
+ color: var(--text-secondary);
309
+ font-size: 12px;
310
+ font-weight: 750;
311
+ line-height: 1;
312
+ text-align: center;
313
+ white-space: nowrap;
314
+ cursor: pointer;
315
+ opacity: 0;
316
+ transform: translateX(-6px) scale(0.88);
317
+ transition:
318
+ opacity 0.16s ease,
319
+ transform 0.2s cubic-bezier(0.2, 0.8, 0.2, 1),
320
+ background 0.12s ease,
321
+ color 0.12s ease,
322
+ border-color 0.12s ease;
323
+ }
324
+
325
+ .context-tool-popover.is-visible .sticky-color-btn,
326
+ .context-tool-popover.is-visible .shape-fill-btn,
327
+ .context-tool-popover.is-visible .shape-text-color-btn,
328
+ .context-tool-popover.is-visible .text-size-btn,
329
+ .context-tool-popover.is-visible .context-tool-divider {
330
+ opacity: 1;
331
+ transform: translateX(0) scale(1);
332
+ }
333
+
334
+ .context-tool-popover.is-visible > :nth-child(2) { transition-delay: 0.015s; }
335
+ .context-tool-popover.is-visible > :nth-child(3) { transition-delay: 0.03s; }
336
+ .context-tool-popover.is-visible > :nth-child(4) { transition-delay: 0.045s; }
337
+ .context-tool-popover.is-visible > :nth-child(5) { transition-delay: 0.06s; }
338
+ .context-tool-popover.is-visible > :nth-child(6) { transition-delay: 0.075s; }
339
+ .context-tool-popover.is-visible > :nth-child(7) { transition-delay: 0.09s; }
340
+ .context-tool-popover.is-visible > :nth-child(8) { transition-delay: 0.105s; }
341
+
342
+ .sticky-color-btn:hover,
343
+ .shape-fill-btn:hover {
344
+ transform: translateY(-1px) scale(1.04);
345
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.52), 0 4px 12px rgba(0, 0, 0, 0.16);
346
+ }
347
+
348
+ .sticky-color-btn:focus-visible,
349
+ .shape-fill-btn:focus-visible {
350
+ outline: 2px solid var(--selection);
351
+ outline-offset: 3px;
352
+ }
353
+
354
+ .text-size-btn:hover,
355
+ .text-size-btn:focus-visible {
356
+ background: var(--bg-hover);
357
+ color: var(--text-primary);
358
+ outline: none;
359
+ }
360
+
361
+ .shape-text-color-btn:hover,
362
+ .shape-text-color-btn:focus-visible {
363
+ border-color: color-mix(in srgb, var(--selection) 45%, var(--border-subtle));
364
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.14);
365
+ outline: none;
366
+ }
367
+
368
+ .sticky-color-btn.active,
369
+ .shape-fill-btn.active {
370
+ border-color: var(--brand-500);
371
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.54), 0 0 0 3px rgba(66, 141, 48, 0.2);
372
+ }
373
+
374
+ .shape-text-color-btn.active {
375
+ border-color: var(--brand-500);
376
+ box-shadow: 0 0 0 3px rgba(66, 141, 48, 0.2);
377
+ }
378
+
379
+ .text-size-btn.active {
380
+ border-color: color-mix(in srgb, var(--selection) 36%, var(--border-subtle));
381
+ background: var(--bg-active);
382
+ color: var(--text-primary);
383
+ }
384
+
385
+ [data-theme="dark"] .sticky-color-btn,
386
+ [data-theme="dark"] .shape-fill-btn {
387
+ border-color: rgba(255, 255, 255, 0.18);
388
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.16);
389
+ }
390
+
391
+ .layer-menu {
392
+ position: fixed;
393
+ min-width: 176px;
394
+ padding: 6px;
395
+ background: var(--surface-raised);
396
+ border: 1px solid var(--border-subtle);
397
+ border-radius: 12px;
398
+ box-shadow: var(--shadow-modal);
399
+ z-index: 150;
400
+ }
401
+
402
+ .layer-menu-label {
403
+ padding: 8px 10px 5px;
404
+ color: var(--text-secondary);
405
+ font-size: 11px;
406
+ font-weight: 750;
407
+ letter-spacing: 0.08em;
408
+ text-transform: uppercase;
409
+ }
410
+
411
+ .layer-menu button {
412
+ width: 100%;
413
+ height: 34px;
414
+ padding: 0 10px;
415
+ border: 0;
416
+ border-radius: 8px;
417
+ background: transparent;
418
+ color: var(--text-primary);
419
+ font: inherit;
420
+ font-size: 13px;
421
+ font-weight: 650;
422
+ text-align: left;
423
+ cursor: pointer;
424
+ }
425
+
426
+ .layer-menu button:hover,
427
+ .layer-menu button:focus-visible {
428
+ background: var(--bg-hover);
429
+ outline: none;
430
+ }
431
+
432
+ .layer-menu-divider {
433
+ height: 1px;
434
+ margin: 5px 6px;
435
+ background: var(--border-subtle);
436
+ }
437
+
438
+ .toolbar-divider {
439
+ width: 1px;
440
+ height: 24px;
441
+ background: var(--border-subtle);
442
+ margin: 0 4px;
443
+ }
444
+
445
+ .tool-btn {
446
+ position: relative;
447
+ display: flex;
448
+ align-items: center;
449
+ justify-content: center;
450
+ width: 38px;
451
+ height: 38px;
452
+ border: none;
453
+ border-radius: 9px;
454
+ background: transparent;
455
+ color: var(--text-primary);
456
+ cursor: pointer;
457
+ transition: background 0.12s ease;
458
+ }
459
+
460
+ .tool-btn:hover {
461
+ background: var(--bg-hover);
462
+ }
463
+
464
+ .tool-btn:focus-visible {
465
+ outline: 2px solid var(--selection);
466
+ outline-offset: 1px;
467
+ }
468
+
469
+ .tool-btn.active {
470
+ background: var(--bg-active);
471
+ color: var(--selection);
472
+ }
473
+
474
+ .tool-btn svg {
475
+ width: 19px;
476
+ height: 19px;
477
+ stroke: currentColor;
478
+ fill: none;
479
+ stroke-width: 1.7;
480
+ stroke-linecap: round;
481
+ stroke-linejoin: round;
482
+ }
483
+
484
+ .tool-btn .tooltip {
485
+ position: absolute;
486
+ bottom: calc(100% + 10px);
487
+ left: 50%;
488
+ transform: translateX(-50%);
489
+ white-space: nowrap;
490
+ padding: 5px 9px;
491
+ font-size: 11.5px;
492
+ font-weight: 500;
493
+ border-radius: 7px;
494
+ background: var(--text-primary);
495
+ color: var(--bg-panel);
496
+ pointer-events: none;
497
+ opacity: 0;
498
+ transition: opacity 0.12s ease;
499
+ }
500
+
501
+ .tool-btn:hover .tooltip {
502
+ opacity: 1;
503
+ }
504
+
505
+ .tooltip kbd {
506
+ font-family: inherit;
507
+ opacity: 0.65;
508
+ margin-left: 5px;
509
+ }
510
+
511
+ /* ---------- Top bar ---------- */
512
+ .top-left {
513
+ position: fixed;
514
+ top: 14px;
515
+ left: 14px;
516
+ z-index: 100;
517
+ display: flex;
518
+ align-items: center;
519
+ gap: 8px;
520
+ }
521
+
522
+ .board-title {
523
+ height: 40px;
524
+ padding: 0 11px;
525
+ background: var(--bg-toolbar);
526
+ backdrop-filter: blur(16px);
527
+ border: 1px solid var(--border-subtle);
528
+ border-radius: 10px;
529
+ box-shadow: var(--shadow-soft);
530
+ font-size: 13px;
531
+ font-weight: 600;
532
+ color: var(--text-primary);
533
+ border: 1px solid var(--border-subtle);
534
+ outline: none;
535
+ min-width: 60px;
536
+ max-width: calc(100vw - 460px);
537
+ }
538
+
539
+ .board-title:focus {
540
+ border-color: var(--selection);
541
+ }
542
+
543
+ .board-title-measure {
544
+ position: absolute;
545
+ visibility: hidden;
546
+ pointer-events: none;
547
+ white-space: pre;
548
+ font-size: 13px;
549
+ font-weight: 600;
550
+ font-family: inherit;
551
+ }
552
+
553
+ .top-right {
554
+ position: fixed;
555
+ top: 14px;
556
+ right: 14px;
557
+ z-index: 100;
558
+ display: flex;
559
+ align-items: center;
560
+ gap: 8px;
561
+ }
562
+
563
+ .control-group {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 2px;
567
+ padding: 4px;
568
+ background: var(--bg-toolbar);
569
+ backdrop-filter: blur(16px);
570
+ border: 1px solid var(--border-subtle);
571
+ border-radius: 10px;
572
+ box-shadow: var(--shadow-soft);
573
+ }
574
+
575
+ .control-btn {
576
+ display: flex;
577
+ align-items: center;
578
+ justify-content: center;
579
+ height: 30px;
580
+ min-width: 30px;
581
+ padding: 0 8px;
582
+ border: none;
583
+ border-radius: 7px;
584
+ background: transparent;
585
+ color: var(--text-primary);
586
+ font-size: 12px;
587
+ font-weight: 500;
588
+ cursor: pointer;
589
+ transition: background 0.12s ease;
590
+ position: relative;
591
+ }
592
+
593
+ .control-btn:hover {
594
+ background: var(--bg-hover);
595
+ }
596
+
597
+ .control-btn.danger-control:hover {
598
+ color: var(--danger);
599
+ }
600
+
601
+ .control-btn:focus-visible {
602
+ outline: 2px solid var(--selection);
603
+ }
604
+
605
+ .control-btn svg {
606
+ width: 16px;
607
+ height: 16px;
608
+ stroke: currentColor;
609
+ fill: none;
610
+ stroke-width: 1.7;
611
+ stroke-linecap: round;
612
+ stroke-linejoin: round;
613
+ }
614
+
615
+ .zoom-label {
616
+ font-variant-numeric: tabular-nums;
617
+ min-width: 48px;
618
+ text-align: center;
619
+ }
620
+
621
+ /* ---------- Performance overlay ---------- */
622
+ .perf-overlay {
623
+ position: fixed;
624
+ top: 60px;
625
+ right: 14px;
626
+ z-index: 99;
627
+ padding: 12px 14px;
628
+ background: var(--bg-toolbar);
629
+ backdrop-filter: blur(16px);
630
+ border: 1px solid var(--border-subtle);
631
+ border-radius: 10px;
632
+ box-shadow: var(--shadow-soft);
633
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
634
+ font-size: 11px;
635
+ line-height: 1.7;
636
+ color: var(--text-primary);
637
+ white-space: pre;
638
+ pointer-events: none;
639
+ display: none;
640
+ }
641
+
642
+ .perf-overlay.visible {
643
+ display: block;
644
+ }
645
+
646
+ /* ---------- Modals ---------- */
647
+ .modal-backdrop {
648
+ position: fixed;
649
+ inset: 0;
650
+ background: rgba(0, 0, 0, 0.4);
651
+ z-index: 200;
652
+ display: flex;
653
+ align-items: center;
654
+ justify-content: center;
655
+ }
656
+
657
+ .modal {
658
+ background: var(--surface-raised);
659
+ border: 1px solid var(--border-subtle);
660
+ border-radius: 16px;
661
+ box-shadow: var(--shadow-modal);
662
+ width: 520px;
663
+ max-width: calc(100vw - 40px);
664
+ max-height: calc(100vh - 80px);
665
+ overflow-y: auto;
666
+ padding: 24px;
667
+ }
668
+
669
+ .modal h2 {
670
+ font-size: 16px;
671
+ font-weight: 600;
672
+ margin-bottom: 16px;
673
+ }
674
+
675
+ .modal-close {
676
+ float: right;
677
+ border: none;
678
+ background: transparent;
679
+ color: var(--text-secondary);
680
+ font-size: 18px;
681
+ cursor: pointer;
682
+ line-height: 1;
683
+ padding: 2px 6px;
684
+ border-radius: 6px;
685
+ }
686
+
687
+ .modal-close:hover {
688
+ background: var(--bg-hover);
689
+ }
690
+
691
+ .modal .board-title {
692
+ height: 38px;
693
+ max-width: none;
694
+ padding: 0 10px;
695
+ background: var(--bg-panel);
696
+ backdrop-filter: none;
697
+ border: 1px solid var(--border-subtle);
698
+ border-radius: 8px;
699
+ box-shadow: none;
700
+ font-size: 13px;
701
+ font-weight: 500;
702
+ }
703
+
704
+ .modal .board-title:focus {
705
+ border-color: color-mix(in srgb, var(--accent) 48%, var(--border-subtle));
706
+ box-shadow: none;
707
+ }
708
+
709
+ .command-palette {
710
+ position: fixed;
711
+ inset: 0;
712
+ z-index: 650;
713
+ display: none;
714
+ align-items: flex-start;
715
+ justify-content: center;
716
+ padding-top: min(120px, 14vh);
717
+ background: rgba(15, 23, 42, 0.28);
718
+ }
719
+
720
+ .command-palette.visible {
721
+ display: flex;
722
+ }
723
+
724
+ .command-panel {
725
+ width: min(640px, calc(100vw - 32px));
726
+ max-height: min(620px, calc(100vh - 80px));
727
+ overflow: hidden;
728
+ border: 1px solid var(--border-subtle);
729
+ border-radius: 12px;
730
+ background: var(--surface-raised);
731
+ box-shadow: var(--shadow-modal);
732
+ }
733
+
734
+ .command-search {
735
+ display: flex;
736
+ align-items: center;
737
+ gap: 10px;
738
+ padding: 13px 16px;
739
+ border-bottom: 1px solid var(--border-subtle);
740
+ color: var(--text-secondary);
741
+ }
742
+
743
+ .command-search svg {
744
+ width: 18px;
745
+ height: 18px;
746
+ stroke: currentColor;
747
+ fill: none;
748
+ stroke-width: 1.8;
749
+ stroke-linecap: round;
750
+ stroke-linejoin: round;
751
+ }
752
+
753
+ .command-search input {
754
+ flex: 1 1 auto;
755
+ min-width: 0;
756
+ border: none;
757
+ outline: none;
758
+ background: transparent;
759
+ color: var(--text-primary);
760
+ font: inherit;
761
+ font-size: 15px;
762
+ }
763
+
764
+ .command-results {
765
+ max-height: min(520px, calc(100vh - 160px));
766
+ overflow-y: auto;
767
+ padding: 6px;
768
+ }
769
+
770
+ .command-result {
771
+ display: block;
772
+ padding: 10px 12px;
773
+ border-radius: 8px;
774
+ color: var(--text-primary);
775
+ text-decoration: none;
776
+ }
777
+
778
+ .command-result:hover,
779
+ .command-result.active {
780
+ background: var(--bg-active);
781
+ }
782
+
783
+ .command-result-title {
784
+ font-size: 14px;
785
+ font-weight: 600;
786
+ line-height: 1.35;
787
+ }
788
+
789
+ .command-result-meta,
790
+ .command-result-summary {
791
+ margin-top: 3px;
792
+ font-size: 12px;
793
+ line-height: 1.45;
794
+ color: var(--text-secondary);
795
+ }
796
+
797
+ .command-result-summary {
798
+ display: -webkit-box;
799
+ -webkit-line-clamp: 2;
800
+ -webkit-box-orient: vertical;
801
+ overflow: hidden;
802
+ }
803
+
804
+ .command-result mark {
805
+ border-radius: 4px;
806
+ padding: 0 2px;
807
+ background: var(--accent-quiet);
808
+ color: inherit;
809
+ }
810
+
811
+ .command-empty {
812
+ padding: 28px 16px;
813
+ text-align: center;
814
+ color: var(--text-secondary);
815
+ font-size: 13px;
816
+ }
817
+
818
+ .template-grid {
819
+ display: grid;
820
+ grid-template-columns: 1fr 1fr;
821
+ gap: 10px;
822
+ }
823
+
824
+ .template-card {
825
+ display: flex;
826
+ flex-direction: column;
827
+ gap: 4px;
828
+ padding: 14px;
829
+ border: 1px solid var(--border-subtle);
830
+ border-radius: 10px;
831
+ background: transparent;
832
+ color: var(--text-primary);
833
+ cursor: pointer;
834
+ text-align: left;
835
+ transition: border-color 0.12s ease, background 0.12s ease;
836
+ }
837
+
838
+ .template-card:hover {
839
+ border-color: var(--selection);
840
+ background: var(--bg-hover);
841
+ }
842
+
843
+ .template-card .t-name {
844
+ font-size: 13px;
845
+ font-weight: 600;
846
+ }
847
+
848
+ .template-card .t-desc {
849
+ font-size: 11.5px;
850
+ color: var(--text-secondary);
851
+ line-height: 1.4;
852
+ }
853
+
854
+ .storage-row {
855
+ display: flex;
856
+ justify-content: space-between;
857
+ padding: 8px 0;
858
+ font-size: 13px;
859
+ border-bottom: 1px solid var(--border-subtle);
860
+ }
861
+
862
+ .storage-row span:last-child {
863
+ color: var(--text-secondary);
864
+ font-variant-numeric: tabular-nums;
865
+ }
866
+
867
+ .modal-actions {
868
+ display: flex;
869
+ flex-wrap: wrap;
870
+ gap: 8px;
871
+ margin-top: 16px;
872
+ }
873
+
874
+ .modal-copy {
875
+ color: var(--text-secondary);
876
+ font-size: 13.5px;
877
+ line-height: 1.6;
878
+ }
879
+
880
+ .btn {
881
+ padding: 8px 14px;
882
+ border: 1px solid var(--border-subtle);
883
+ border-radius: 8px;
884
+ background: transparent;
885
+ color: var(--text-primary);
886
+ font-size: 12.5px;
887
+ font-weight: 500;
888
+ cursor: pointer;
889
+ transition: background 0.12s ease;
890
+ }
891
+
892
+ .btn:hover {
893
+ background: var(--bg-hover);
894
+ }
895
+
896
+ .btn.danger {
897
+ color: var(--danger);
898
+ border-color: var(--danger);
899
+ }
900
+
901
+ .btn.primary {
902
+ background: var(--accent-secondary);
903
+ border-color: var(--selection);
904
+ color: #fff;
905
+ }
906
+
907
+ /* ---------- Stress panel ---------- */
908
+ .stress-panel {
909
+ position: fixed;
910
+ bottom: 84px;
911
+ left: 50%;
912
+ transform: translateX(-50%);
913
+ z-index: 99;
914
+ display: none;
915
+ flex-wrap: wrap;
916
+ gap: 6px;
917
+ max-width: 640px;
918
+ justify-content: center;
919
+ padding: 10px;
920
+ background: var(--bg-toolbar);
921
+ backdrop-filter: blur(16px);
922
+ border: 1px solid var(--border-subtle);
923
+ border-radius: 12px;
924
+ box-shadow: var(--shadow-soft);
925
+ }
926
+
927
+ .stress-panel.visible {
928
+ display: flex;
929
+ }
930
+
931
+ .stress-panel .btn {
932
+ font-size: 11.5px;
933
+ padding: 6px 10px;
934
+ }
935
+
936
+ /* ---------- Text editing overlay ---------- */
937
+ .text-editor {
938
+ position: absolute;
939
+ z-index: 50;
940
+ border: 1.5px solid var(--selection);
941
+ border-radius: 4px;
942
+ background: transparent;
943
+ color: inherit;
944
+ resize: none;
945
+ overflow: hidden;
946
+ outline: none;
947
+ padding: 0;
948
+ line-height: 1.35;
949
+ }
950
+
951
+ /* ---------- Toast ---------- */
952
+ .toast {
953
+ position: fixed;
954
+ bottom: 84px;
955
+ left: 50%;
956
+ transform: translateX(-50%) translateY(8px);
957
+ z-index: 300;
958
+ padding: 10px 18px;
959
+ background: var(--text-primary);
960
+ color: var(--bg-panel);
961
+ border-radius: 10px;
962
+ font-size: 13px;
963
+ font-weight: 500;
964
+ box-shadow: var(--shadow-soft);
965
+ opacity: 0;
966
+ transition: opacity 0.2s ease, transform 0.2s ease;
967
+ pointer-events: none;
968
+ }
969
+
970
+ .toast.visible {
971
+ opacity: 1;
972
+ transform: translateX(-50%) translateY(0);
973
+ }
974
+
975
+ @media (prefers-reduced-motion: reduce) {
976
+ * {
977
+ transition: none !important;
978
+ }
979
+ }
980
+
981
+ /* ============================================================
982
+ Docs shell (sidebar + content)
983
+ ============================================================ */
984
+ .shell {
985
+ display: flex;
986
+ width: 100%;
987
+ height: 100%;
988
+ overflow: hidden;
989
+ }
990
+
991
+ .shell-main {
992
+ flex: 1 1 auto;
993
+ min-width: 0;
994
+ height: 100%;
995
+ display: flex;
996
+ flex-direction: column;
997
+ }
998
+
999
+ .shell.sidebar-collapsed .sidebar {
1000
+ display: none;
1001
+ }
1002
+
1003
+ .shell-topbar {
1004
+ position: relative;
1005
+ flex: 0 0 auto;
1006
+ height: 58px;
1007
+ display: flex;
1008
+ align-items: center;
1009
+ gap: 10px;
1010
+ padding: 12px 18px;
1011
+ border-bottom: 1px solid var(--border-subtle);
1012
+ background: color-mix(in srgb, var(--bg-panel) 94%, transparent);
1013
+ backdrop-filter: blur(16px);
1014
+ }
1015
+
1016
+ .topbar-icon-btn,
1017
+ .topbar-search,
1018
+ .topbar-cart,
1019
+ .topbar-edit,
1020
+ .topbar-theme {
1021
+ height: 34px;
1022
+ border: 1px solid var(--border-subtle);
1023
+ border-radius: 8px;
1024
+ background: transparent;
1025
+ color: var(--text-secondary);
1026
+ cursor: pointer;
1027
+ transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
1028
+ }
1029
+
1030
+ .topbar-icon-btn {
1031
+ width: 34px;
1032
+ display: inline-flex;
1033
+ align-items: center;
1034
+ justify-content: center;
1035
+ flex: 0 0 auto;
1036
+ }
1037
+
1038
+ .topbar-icon-btn:hover,
1039
+ .topbar-search:hover,
1040
+ .topbar-cart:hover,
1041
+ .topbar-edit:hover,
1042
+ .topbar-theme:hover {
1043
+ background: var(--bg-hover);
1044
+ color: var(--text-primary);
1045
+ }
1046
+
1047
+ .topbar-icon-btn:focus-visible,
1048
+ .topbar-search:focus-visible,
1049
+ .topbar-cart:focus-visible,
1050
+ .topbar-edit:focus-visible,
1051
+ .topbar-theme:focus-visible {
1052
+ outline: 2px solid var(--selection);
1053
+ outline-offset: 1px;
1054
+ }
1055
+
1056
+ .topbar-icon-btn svg,
1057
+ .topbar-search svg,
1058
+ .topbar-edit svg,
1059
+ .topbar-theme svg {
1060
+ width: 17px;
1061
+ height: 17px;
1062
+ stroke: currentColor;
1063
+ fill: none;
1064
+ stroke-width: 1.8;
1065
+ stroke-linecap: round;
1066
+ stroke-linejoin: round;
1067
+ }
1068
+
1069
+ .topbar-search {
1070
+ width: min(360px, 42vw);
1071
+ display: inline-flex;
1072
+ align-items: center;
1073
+ gap: 9px;
1074
+ padding: 0 8px 0 10px;
1075
+ text-align: left;
1076
+ font-size: 13px;
1077
+ }
1078
+
1079
+ .topbar-search span {
1080
+ flex: 1 1 auto;
1081
+ min-width: 0;
1082
+ }
1083
+
1084
+ .topbar-search kbd {
1085
+ flex: 0 0 auto;
1086
+ padding: 2px 6px;
1087
+ border-radius: 5px;
1088
+ background: var(--bg-hover);
1089
+ color: var(--text-secondary);
1090
+ font: 11px/1.3 "SF Mono", ui-monospace, Menlo, monospace;
1091
+ }
1092
+
1093
+ .topbar-cart {
1094
+ display: inline-flex;
1095
+ align-items: center;
1096
+ gap: 8px;
1097
+ padding: 0 10px 0 12px;
1098
+ font-size: 13px;
1099
+ font-weight: 500;
1100
+ }
1101
+
1102
+ .topbar-search + .topbar-cart {
1103
+ margin-left: auto;
1104
+ }
1105
+
1106
+ .topbar-cart[hidden] {
1107
+ display: none;
1108
+ }
1109
+
1110
+ .topbar-cart:disabled {
1111
+ opacity: 0.58;
1112
+ cursor: default;
1113
+ }
1114
+
1115
+ .topbar-cart strong {
1116
+ min-width: 22px;
1117
+ height: 22px;
1118
+ display: inline-flex;
1119
+ align-items: center;
1120
+ justify-content: center;
1121
+ border-radius: 999px;
1122
+ background: var(--accent-quiet);
1123
+ color: var(--selection);
1124
+ font-size: 12px;
1125
+ }
1126
+
1127
+ .topbar-edit {
1128
+ display: inline-flex;
1129
+ align-items: center;
1130
+ gap: 7px;
1131
+ padding: 0 12px;
1132
+ font-size: 13px;
1133
+ font-weight: 500;
1134
+ }
1135
+
1136
+ .topbar-edit[hidden] {
1137
+ display: none;
1138
+ }
1139
+
1140
+ .topbar-cart[hidden] + .topbar-edit {
1141
+ margin-left: auto;
1142
+ }
1143
+
1144
+ .shell-topbar.editing-doc .topbar-cart {
1145
+ display: none;
1146
+ }
1147
+
1148
+ .topbar-cart-popover {
1149
+ position: absolute;
1150
+ top: calc(100% + 8px);
1151
+ right: 58px;
1152
+ z-index: 800;
1153
+ display: none;
1154
+ width: 330px;
1155
+ filter: drop-shadow(0 16px 36px rgba(0, 0, 0, 0.16));
1156
+ }
1157
+
1158
+ .topbar-cart-popover.visible {
1159
+ display: block;
1160
+ }
1161
+
1162
+ .topbar-cart-popover .capability-cart {
1163
+ position: static;
1164
+ }
1165
+
1166
+ .content.cart-popover-open .capability-layout > .capability-cart {
1167
+ visibility: hidden;
1168
+ }
1169
+
1170
+ .sidebar {
1171
+ flex: 0 0 270px;
1172
+ width: 270px;
1173
+ height: 100%;
1174
+ min-height: 0;
1175
+ display: flex;
1176
+ flex-direction: column;
1177
+ border-right: 1px solid var(--border-subtle);
1178
+ background: var(--surface-raised);
1179
+ padding: 0 12px;
1180
+ }
1181
+
1182
+ .sidebar-header {
1183
+ display: flex;
1184
+ align-items: center;
1185
+ height: 58px;
1186
+ padding: 0 12px;
1187
+ border-bottom: 1px solid transparent;
1188
+ }
1189
+
1190
+ .sidebar-brand {
1191
+ font-size: 17px;
1192
+ font-weight: 700;
1193
+ letter-spacing: -0.01em;
1194
+ color: var(--text-primary);
1195
+ text-decoration: none;
1196
+ /* reset button defaults */
1197
+ border: none;
1198
+ background: none;
1199
+ cursor: pointer;
1200
+ padding: 0;
1201
+ font-family: inherit;
1202
+ }
1203
+
1204
+ .sidebar-nav {
1205
+ flex: 1 1 auto;
1206
+ min-height: 0;
1207
+ overflow-y: auto;
1208
+ padding-bottom: 18px;
1209
+ }
1210
+
1211
+ .sidebar-footer {
1212
+ flex: 0 0 auto;
1213
+ padding: 10px 0 14px;
1214
+ border-top: 1px solid var(--border-subtle);
1215
+ background: var(--surface-raised);
1216
+ }
1217
+
1218
+ .sidebar-add-repo {
1219
+ width: 100%;
1220
+ height: 36px;
1221
+ border: 1px dashed color-mix(in srgb, var(--selection) 38%, var(--border-subtle));
1222
+ border-radius: 8px;
1223
+ background: transparent;
1224
+ color: var(--text-secondary);
1225
+ font-size: 13px;
1226
+ font-weight: 600;
1227
+ cursor: pointer;
1228
+ transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
1229
+ }
1230
+
1231
+ .sidebar-add-repo:hover {
1232
+ background: var(--accent-soft);
1233
+ border-color: color-mix(in srgb, var(--selection) 58%, var(--border-subtle));
1234
+ color: var(--text-primary);
1235
+ }
1236
+
1237
+ .nav-group { margin-bottom: 18px; }
1238
+
1239
+ .nav-section-head,
1240
+ .nav-root-head {
1241
+ display: flex;
1242
+ align-items: center;
1243
+ justify-content: space-between;
1244
+ gap: 10px;
1245
+ }
1246
+
1247
+ .nav-repo-group {
1248
+ margin-bottom: 10px;
1249
+ }
1250
+
1251
+ .nav-repo-header,
1252
+ .nav-dir-toggle {
1253
+ width: 100%;
1254
+ display: flex;
1255
+ align-items: center;
1256
+ gap: 6px;
1257
+ padding: 6px 8px;
1258
+ border: 0;
1259
+ border-radius: 7px;
1260
+ background: transparent;
1261
+ color: var(--text-secondary);
1262
+ font-size: 11px;
1263
+ font-weight: 700;
1264
+ letter-spacing: 0.06em;
1265
+ text-align: left;
1266
+ text-transform: uppercase;
1267
+ cursor: pointer;
1268
+ }
1269
+
1270
+ .nav-count-pill {
1271
+ flex: 0 0 auto;
1272
+ padding: 3px 8px;
1273
+ border: 1px solid var(--border-subtle);
1274
+ border-radius: 999px;
1275
+ background: color-mix(in srgb, var(--surface-raised) 82%, var(--accent-soft));
1276
+ color: var(--text-secondary);
1277
+ font-size: 10px;
1278
+ font-weight: 700;
1279
+ letter-spacing: 0.06em;
1280
+ text-transform: uppercase;
1281
+ }
1282
+
1283
+ .nav-dir-toggle {
1284
+ padding: 4px 6px;
1285
+ font-size: 11px;
1286
+ text-transform: none;
1287
+ letter-spacing: 0;
1288
+ font-weight: 650;
1289
+ }
1290
+
1291
+ /* Path-segment directories (parents of /docs/) — same weight as docs dirs */
1292
+ .nav-dir-project {
1293
+ opacity: 0.85;
1294
+ color: var(--text-secondary);
1295
+ }
1296
+
1297
+ .nav-dir-project:hover {
1298
+ opacity: 1;
1299
+ }
1300
+
1301
+ /* Docs directories inside a docs root */
1302
+ .nav-dir-docs {
1303
+ opacity: 1;
1304
+ color: var(--text-secondary);
1305
+ font-weight: 600;
1306
+ }
1307
+
1308
+ .nav-repo-header,
1309
+ .nav-dir-toggle {
1310
+ transition: background 0.12s ease, color 0.12s ease, opacity 0.12s ease;
1311
+ }
1312
+
1313
+ .nav-repo-header:hover,
1314
+ .nav-dir-toggle:hover {
1315
+ background: var(--bg-hover);
1316
+ color: var(--text-primary);
1317
+ }
1318
+
1319
+ .nav-repo-header:focus-visible,
1320
+ .nav-dir-toggle:focus-visible {
1321
+ outline: 2px solid var(--selection);
1322
+ outline-offset: 1px;
1323
+ }
1324
+
1325
+ .nav-repo-header > span:not(.nav-repo-chevron),
1326
+ .nav-dir-toggle > span:not(.nav-repo-chevron) {
1327
+ flex: 1 1 auto;
1328
+ min-width: 0;
1329
+ overflow: hidden;
1330
+ text-overflow: ellipsis;
1331
+ white-space: nowrap;
1332
+ }
1333
+
1334
+ .nav-repo-chevron {
1335
+ flex: 0 0 auto;
1336
+ display: inline-flex;
1337
+ align-items: center;
1338
+ justify-content: center;
1339
+ width: 12px;
1340
+ transform: rotate(90deg);
1341
+ transition: transform 0.12s ease;
1342
+ }
1343
+
1344
+ .nav-repo-group.collapsed .nav-repo-chevron {
1345
+ transform: rotate(0deg);
1346
+ }
1347
+
1348
+ .nav-collapsible-dir.collapsed > .nav-dir-header-row .nav-dir-toggle .nav-repo-chevron {
1349
+ transform: rotate(0deg);
1350
+ }
1351
+
1352
+ .nav-dir-header-row {
1353
+ display: flex;
1354
+ align-items: center;
1355
+ gap: 4px;
1356
+ position: relative;
1357
+ }
1358
+
1359
+ .nav-dir-header-row .nav-dir-toggle {
1360
+ flex: 1 1 auto;
1361
+ min-width: 0;
1362
+ }
1363
+
1364
+ .nav-dir-header-row .nav-dir-wiki-link {
1365
+ flex: 0 0 auto;
1366
+ }
1367
+
1368
+ .nav-repo-body[hidden],
1369
+ .nav-dir-body[hidden] {
1370
+ display: none;
1371
+ }
1372
+
1373
+ .nav-label {
1374
+ font-size: 11px;
1375
+ font-weight: 700;
1376
+ text-transform: uppercase;
1377
+ letter-spacing: 0.06em;
1378
+ color: var(--text-secondary);
1379
+ padding: 6px 8px;
1380
+ }
1381
+
1382
+ .nav-empty-copy {
1383
+ font-size: 12px;
1384
+ font-weight: 500;
1385
+ text-transform: none;
1386
+ letter-spacing: 0.01em;
1387
+ line-height: 1.45;
1388
+ }
1389
+
1390
+ .nav-subgroup { margin: 2px 0 2px 8px; }
1391
+ .nav-subgroup .nav-label {
1392
+ font-size: 11px;
1393
+ text-transform: none;
1394
+ letter-spacing: 0;
1395
+ font-weight: 600;
1396
+ color: var(--text-secondary);
1397
+ opacity: 0.85;
1398
+ }
1399
+
1400
+ /* Root-level docs label — just the leaf segment ("docs"), no badge. */
1401
+ .nav-docs-root {
1402
+ margin: 0 0 2px 0;
1403
+ }
1404
+
1405
+ .nav-root-path-label {
1406
+ padding: 4px 8px 3px;
1407
+ font-size: 10px;
1408
+ font-weight: 700;
1409
+ letter-spacing: 0.07em;
1410
+ text-transform: uppercase;
1411
+ color: var(--text-secondary);
1412
+ opacity: 0.6;
1413
+ cursor: default;
1414
+ /* Right-click affordance hint */
1415
+ user-select: none;
1416
+ }
1417
+ .nav-root-path-label:hover {
1418
+ opacity: 1;
1419
+ color: var(--text-secondary);
1420
+ }
1421
+
1422
+ /* Path-segment intermediate toggle — slightly lighter than project header */
1423
+ .nav-path-seg-toggle {
1424
+ font-size: 12px;
1425
+ font-weight: 600;
1426
+ text-transform: none;
1427
+ letter-spacing: 0;
1428
+ color: var(--text-secondary);
1429
+ opacity: 0.9;
1430
+ }
1431
+
1432
+ .nav-link {
1433
+ display: flex;
1434
+ align-items: center;
1435
+ padding: 6px 10px;
1436
+ margin: 1px 0;
1437
+ border-radius: 7px;
1438
+ font-size: 13px;
1439
+ line-height: 1.4;
1440
+ color: var(--text-secondary);
1441
+ text-decoration: none;
1442
+ border-left: 2px solid transparent;
1443
+ transition: background 0.12s ease, color 0.12s ease;
1444
+ }
1445
+ .nav-link:hover {
1446
+ background: var(--bg-hover);
1447
+ color: var(--text-primary);
1448
+ }
1449
+ .nav-link-muted {
1450
+ font-size: 12px;
1451
+ opacity: 0.82;
1452
+ }
1453
+ .nav-link.active {
1454
+ background: var(--bg-active);
1455
+ color: var(--selection);
1456
+ font-weight: 600;
1457
+ }
1458
+
1459
+ [data-theme="dark"] .nav-link.active {
1460
+ color: var(--neutral-100);
1461
+ }
1462
+
1463
+ /* ---------- Sidebar: inline node icons (Doc / Board / Capability) ---------- */
1464
+
1465
+ .nav-node-icon {
1466
+ flex: 0 0 auto;
1467
+ width: 13px;
1468
+ height: 13px;
1469
+ margin-right: 5px;
1470
+ vertical-align: middle;
1471
+ fill: currentColor;
1472
+ stroke: none;
1473
+ opacity: 0.85;
1474
+ position: relative;
1475
+ top: -1px;
1476
+ }
1477
+
1478
+ /* Doc icons: Google Docs blue */
1479
+ .nav-node-icon-doc {
1480
+ fill: #4285f4;
1481
+ opacity: 1;
1482
+ }
1483
+
1484
+ /* Board icons: purple/violet */
1485
+ .nav-node-icon-board {
1486
+ fill: #8b5cf6;
1487
+ opacity: 1;
1488
+ }
1489
+
1490
+ [data-theme="dark"] .nav-node-icon-board {
1491
+ fill: #a78bfa;
1492
+ }
1493
+
1494
+ /* Skill/Capability icons: amber/gold */
1495
+ .nav-node-icon-capability {
1496
+ fill: #f59e0b;
1497
+ opacity: 1;
1498
+ }
1499
+
1500
+ [data-theme="dark"] .nav-node-icon-capability {
1501
+ fill: #fbbf24;
1502
+ }
1503
+
1504
+ /* Board nodes: purple/violet accent */
1505
+ :root {
1506
+ --nav-board-color: #8b5cf6;
1507
+ --nav-board-bg: rgba(139, 92, 246, 0.08);
1508
+ --nav-board-bg-active: rgba(139, 92, 246, 0.15);
1509
+ --nav-cap-color: #8a6800;
1510
+ --nav-cap-bg: rgba(138, 104, 0, 0.08);
1511
+ --nav-cap-bg-active: rgba(138, 104, 0, 0.15);
1512
+ }
1513
+ [data-theme="dark"] {
1514
+ --nav-board-color: #a78bfa;
1515
+ --nav-board-bg: rgba(167, 139, 250, 0.08);
1516
+ --nav-board-bg-active: rgba(167, 139, 250, 0.14);
1517
+ --nav-cap-color: #d4a800;
1518
+ --nav-cap-bg: rgba(212, 168, 0, 0.08);
1519
+ --nav-cap-bg-active: rgba(212, 168, 0, 0.14);
1520
+ }
1521
+
1522
+ .nav-link-board {
1523
+ display: flex;
1524
+ align-items: center;
1525
+ color: var(--nav-board-color);
1526
+ }
1527
+ .nav-link-board:hover {
1528
+ background: var(--nav-board-bg);
1529
+ color: var(--nav-board-color);
1530
+ }
1531
+ .nav-link-board.active {
1532
+ background: var(--nav-board-bg-active);
1533
+ color: var(--nav-board-color);
1534
+ font-weight: 600;
1535
+ }
1536
+
1537
+ /* Capability nodes: amber/gold accent */
1538
+ .nav-link-capability {
1539
+ display: flex;
1540
+ align-items: center;
1541
+ color: var(--nav-cap-color);
1542
+ }
1543
+ .nav-link-capability:hover {
1544
+ background: var(--nav-cap-bg);
1545
+ color: var(--nav-cap-color);
1546
+ }
1547
+ .nav-link-capability.active {
1548
+ background: var(--nav-cap-bg-active);
1549
+ color: var(--nav-cap-color);
1550
+ font-weight: 600;
1551
+ }
1552
+
1553
+ /* "All Boards" row at the bottom of each project */
1554
+ .nav-project-boards-row {
1555
+ margin-top: 4px;
1556
+ padding-top: 4px;
1557
+ border-top: 1px solid var(--border-subtle);
1558
+ }
1559
+
1560
+ /* ---------- Sidebar: right-click context menu ---------- */
1561
+
1562
+ .nav-context-menu {
1563
+ z-index: 900;
1564
+ min-width: 168px;
1565
+ padding: 5px;
1566
+ background: var(--surface-raised);
1567
+ border: 1px solid var(--border-subtle);
1568
+ border-radius: 10px;
1569
+ box-shadow: var(--shadow-modal);
1570
+ user-select: none;
1571
+ }
1572
+
1573
+ .nav-context-label {
1574
+ padding: 5px 10px 4px;
1575
+ font-size: 10.5px;
1576
+ font-weight: 700;
1577
+ letter-spacing: 0.06em;
1578
+ text-transform: uppercase;
1579
+ color: var(--text-secondary);
1580
+ white-space: nowrap;
1581
+ overflow: hidden;
1582
+ text-overflow: ellipsis;
1583
+ max-width: 180px;
1584
+ }
1585
+
1586
+ .nav-context-divider {
1587
+ height: 1px;
1588
+ margin: 4px 5px;
1589
+ background: var(--border-subtle);
1590
+ }
1591
+
1592
+ .nav-context-item {
1593
+ width: 100%;
1594
+ display: flex;
1595
+ align-items: center;
1596
+ gap: 8px;
1597
+ height: 32px;
1598
+ padding: 0 10px;
1599
+ border: 0;
1600
+ border-radius: 7px;
1601
+ background: transparent;
1602
+ color: var(--text-primary);
1603
+ font: inherit;
1604
+ font-size: 13px;
1605
+ text-align: left;
1606
+ cursor: pointer;
1607
+ white-space: nowrap;
1608
+ }
1609
+ .nav-context-item:hover,
1610
+ .nav-context-item:focus-visible {
1611
+ background: var(--bg-hover);
1612
+ outline: none;
1613
+ }
1614
+ .nav-context-item-danger {
1615
+ color: var(--danger);
1616
+ }
1617
+ .nav-context-item-danger:hover,
1618
+ .nav-context-item-danger:focus-visible {
1619
+ background: color-mix(in srgb, var(--danger) 8%, transparent);
1620
+ }
1621
+
1622
+ .nav-dragging {
1623
+ opacity: 0.48;
1624
+ cursor: grabbing !important;
1625
+ }
1626
+
1627
+ /* Draggable items keep pointer cursor — grab only appears during actual drag */
1628
+ .nav-link[draggable="true"],
1629
+ .nav-dir-toggle[draggable="true"] {
1630
+ cursor: pointer;
1631
+ }
1632
+
1633
+ /* VS Code-style drop target - VERY obvious */
1634
+ .nav-drop-target > .nav-dir-toggle,
1635
+ .nav-drop-target > .nav-dir-header-row,
1636
+ .nav-drop-target.nav-repo-header,
1637
+ .nav-drop-target.nav-docs-root {
1638
+ background: color-mix(in srgb, var(--accent) 20%, transparent) !important;
1639
+ outline: 2px solid var(--accent) !important;
1640
+ outline-offset: -2px;
1641
+ box-shadow: inset 0 0 8px color-mix(in srgb, var(--accent) 30%, transparent);
1642
+ border-radius: 6px;
1643
+ position: relative;
1644
+ }
1645
+
1646
+ /* Pulse animation for drop target */
1647
+ @keyframes dropPulse {
1648
+ 0%, 100% { outline-color: var(--accent); }
1649
+ 50% { outline-color: color-mix(in srgb, var(--accent) 60%, transparent); }
1650
+ }
1651
+
1652
+ .nav-drop-target > .nav-dir-toggle,
1653
+ .nav-drop-target > .nav-dir-header-row,
1654
+ .nav-drop-target.nav-repo-header,
1655
+ .nav-drop-target.nav-docs-root {
1656
+ animation: dropPulse 1s ease-in-out infinite;
1657
+ }
1658
+
1659
+ .nav-ctx-icon {
1660
+ flex: 0 0 auto;
1661
+ width: 16px;
1662
+ height: 16px;
1663
+ display: inline-flex;
1664
+ align-items: center;
1665
+ justify-content: center;
1666
+ }
1667
+ /* Fill-based icons (board, doc, capability) */
1668
+ .nav-ctx-icon svg.nav-node-icon {
1669
+ width: 13px;
1670
+ height: 13px;
1671
+ fill: currentColor;
1672
+ stroke: none;
1673
+ }
1674
+ /* Stroke-based icons (edit, rename, trash) */
1675
+ .nav-ctx-svg {
1676
+ width: 14px;
1677
+ height: 14px;
1678
+ }
1679
+
1680
+ /* Doc items in context menu */
1681
+ .nav-ctx-doc { color: var(--text-secondary); }
1682
+ /* Directory items */
1683
+ .nav-ctx-dir { color: var(--text-secondary); }
1684
+ /* Board items */
1685
+ .nav-ctx-board { color: var(--nav-board-color); }
1686
+ /* Capability items */
1687
+ .nav-ctx-cap { color: var(--nav-cap-color); }
1688
+ /* Neutral actions (edit, rename) */
1689
+ .nav-ctx-edit,
1690
+ .nav-ctx-rename { color: var(--text-secondary); }
1691
+ /* Destructive action */
1692
+ .nav-ctx-delete { color: var(--danger); }
1693
+
1694
+ .content-scroll {
1695
+ flex: 1 1 auto;
1696
+ min-height: 0;
1697
+ overflow-y: auto;
1698
+ }
1699
+
1700
+ .content {
1701
+ max-width: 820px;
1702
+ margin: 0 auto;
1703
+ padding: 36px 40px 120px;
1704
+ }
1705
+
1706
+ .content.content-wide {
1707
+ max-width: 1240px;
1708
+ }
1709
+
1710
+ .external-doc-eyebrow {
1711
+ margin: 0 0 18px;
1712
+ color: var(--text-secondary);
1713
+ font-size: 12px;
1714
+ font-weight: 650;
1715
+ letter-spacing: 0.05em;
1716
+ text-transform: uppercase;
1717
+ }
1718
+
1719
+ .external-repo-overview .page-bar {
1720
+ align-items: flex-start;
1721
+ }
1722
+
1723
+ .repo-source-pill {
1724
+ flex: 0 0 auto;
1725
+ padding: 6px 10px;
1726
+ border: 1px solid var(--border-subtle);
1727
+ border-radius: 999px;
1728
+ color: var(--text-secondary);
1729
+ font-size: 12px;
1730
+ font-weight: 600;
1731
+ }
1732
+
1733
+ .external-doc-dir-list {
1734
+ display: grid;
1735
+ gap: 22px;
1736
+ }
1737
+
1738
+ .external-doc-dir h2 {
1739
+ margin: 0 0 10px;
1740
+ color: var(--text-secondary);
1741
+ font-size: 12px;
1742
+ font-weight: 700;
1743
+ letter-spacing: 0.05em;
1744
+ text-transform: uppercase;
1745
+ }
1746
+
1747
+ .external-doc-file-list {
1748
+ display: grid;
1749
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1750
+ gap: 10px;
1751
+ }
1752
+
1753
+ .external-doc-card {
1754
+ display: flex;
1755
+ flex-direction: column;
1756
+ gap: 4px;
1757
+ min-height: 82px;
1758
+ padding: 14px;
1759
+ border: 1px solid var(--border-subtle);
1760
+ border-radius: 8px;
1761
+ background: var(--surface-raised);
1762
+ color: var(--text-primary);
1763
+ text-decoration: none;
1764
+ transition: border-color 0.12s ease, background 0.12s ease, transform 0.12s ease;
1765
+ }
1766
+
1767
+ .external-doc-card:hover {
1768
+ border-color: color-mix(in srgb, var(--selection) 42%, var(--border-subtle));
1769
+ background: color-mix(in srgb, var(--accent) 4%, var(--surface-raised));
1770
+ transform: translateY(-1px);
1771
+ }
1772
+
1773
+ .external-doc-card strong {
1774
+ font-size: 14px;
1775
+ line-height: 1.3;
1776
+ }
1777
+
1778
+ .external-doc-card span {
1779
+ color: var(--text-secondary);
1780
+ font-size: 12px;
1781
+ line-height: 1.35;
1782
+ overflow-wrap: anywhere;
1783
+ }
1784
+
1785
+ /* ---------- generic pages (boards, capabilities index) ---------- */
1786
+ .page-bar {
1787
+ display: flex;
1788
+ align-items: center;
1789
+ justify-content: space-between;
1790
+ gap: 16px;
1791
+ margin-bottom: 8px;
1792
+ }
1793
+ .page-bar h1 { margin: 0; }
1794
+ .page-bar-label {
1795
+ font-size: 12px;
1796
+ font-weight: 600;
1797
+ color: var(--text-secondary);
1798
+ text-transform: uppercase;
1799
+ letter-spacing: 0.05em;
1800
+ }
1801
+ .page-lead {
1802
+ color: var(--text-secondary);
1803
+ font-size: 14px;
1804
+ line-height: 1.6;
1805
+ margin: 4px 0 24px;
1806
+ }
1807
+
1808
+ .card-grid {
1809
+ display: grid;
1810
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1811
+ gap: 14px;
1812
+ }
1813
+ .card {
1814
+ position: relative;
1815
+ display: flex;
1816
+ flex-direction: column;
1817
+ gap: 10px;
1818
+ min-height: 190px;
1819
+ padding: 18px;
1820
+ border: 1px solid var(--border-subtle);
1821
+ border-radius: 8px;
1822
+ text-decoration: none;
1823
+ color: var(--text-primary);
1824
+ background: var(--surface-raised);
1825
+ transition: border-color 0.12s ease, background 0.12s ease, transform 0.12s ease;
1826
+ }
1827
+ .card:hover {
1828
+ border-color: color-mix(in srgb, var(--selection) 42%, var(--border-subtle));
1829
+ transform: translateY(-1px);
1830
+ }
1831
+ .card.selected {
1832
+ border-color: color-mix(in srgb, var(--selection) 72%, var(--border-subtle));
1833
+ background: color-mix(in srgb, var(--accent) 5%, var(--surface-raised));
1834
+ }
1835
+ .card.selected::before {
1836
+ content: "";
1837
+ position: absolute;
1838
+ inset: 0 auto 0 0;
1839
+ width: 3px;
1840
+ border-radius: 8px 0 0 8px;
1841
+ background: var(--selection);
1842
+ }
1843
+ .card-title {
1844
+ max-width: 92%;
1845
+ font-size: 16px;
1846
+ font-weight: 650;
1847
+ line-height: 1.25;
1848
+ letter-spacing: 0;
1849
+ }
1850
+ .card-title a {
1851
+ color: inherit;
1852
+ text-decoration: none;
1853
+ }
1854
+ .card-title a:hover { color: var(--selection); }
1855
+ .card-desc {
1856
+ font-size: 13px;
1857
+ color: var(--text-secondary);
1858
+ line-height: 1.55;
1859
+ }
1860
+ .card-tags {
1861
+ display: flex;
1862
+ flex-wrap: wrap;
1863
+ gap: 6px;
1864
+ margin-top: auto;
1865
+ }
1866
+ .card-actions {
1867
+ padding-top: 4px;
1868
+ }
1869
+ .card-actions .btn {
1870
+ height: 30px;
1871
+ padding: 0 11px;
1872
+ border-radius: 999px;
1873
+ font-size: 12px;
1874
+ }
1875
+ .card-actions .capability-add-btn.primary {
1876
+ background: transparent;
1877
+ border-color: color-mix(in srgb, var(--selection) 42%, var(--border-subtle));
1878
+ color: var(--selection);
1879
+ }
1880
+ .card-actions .capability-add-btn.primary:hover {
1881
+ background: var(--accent-soft);
1882
+ }
1883
+ .card-actions .capability-add-btn:not(.primary) {
1884
+ border-color: transparent;
1885
+ background: var(--bg-hover);
1886
+ color: var(--text-secondary);
1887
+ }
1888
+ .tag {
1889
+ font-size: 11px;
1890
+ padding: 3px 8px;
1891
+ border-radius: 999px;
1892
+ background: var(--accent-secondary-quiet);
1893
+ color: color-mix(in srgb, var(--accent-secondary) 72%, var(--text-primary));
1894
+ }
1895
+ .empty-note {
1896
+ grid-column: 1 / -1;
1897
+ padding: 32px;
1898
+ text-align: center;
1899
+ color: var(--text-secondary);
1900
+ border: 1px dashed var(--border-subtle);
1901
+ border-radius: 12px;
1902
+ }
1903
+
1904
+ .capability-layout {
1905
+ display: grid;
1906
+ grid-template-columns: minmax(0, 1fr) 300px;
1907
+ gap: 28px;
1908
+ align-items: start;
1909
+ }
1910
+
1911
+ .capability-grid {
1912
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1913
+ gap: 16px;
1914
+ }
1915
+
1916
+ .capability-library h1 {
1917
+ font-size: 32px;
1918
+ letter-spacing: 0;
1919
+ margin-bottom: 6px;
1920
+ }
1921
+
1922
+ .capability-library .page-lead {
1923
+ max-width: 680px;
1924
+ margin-bottom: 28px;
1925
+ }
1926
+
1927
+ .board-library .page-lead {
1928
+ max-width: 760px;
1929
+ }
1930
+
1931
+ .board-grid {
1932
+ grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
1933
+ gap: 18px;
1934
+ }
1935
+
1936
+ .token-library .page-bar {
1937
+ margin-bottom: 6px;
1938
+ }
1939
+
1940
+ .token-actions {
1941
+ display: flex;
1942
+ flex-wrap: wrap;
1943
+ justify-content: flex-end;
1944
+ gap: 8px;
1945
+ }
1946
+
1947
+ .token-section {
1948
+ margin-top: 30px;
1949
+ }
1950
+
1951
+ .token-section h2 {
1952
+ margin: 0 0 14px;
1953
+ font-size: 17px;
1954
+ font-weight: 700;
1955
+ }
1956
+
1957
+ .token-grid {
1958
+ display: grid;
1959
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
1960
+ gap: 12px;
1961
+ }
1962
+
1963
+ .token-card {
1964
+ position: relative;
1965
+ display: grid;
1966
+ grid-template-columns: minmax(0, 1fr) 44px;
1967
+ align-items: stretch;
1968
+ min-height: 72px;
1969
+ border: 1px solid var(--border-subtle);
1970
+ border-radius: 8px;
1971
+ background: var(--surface-raised);
1972
+ overflow: hidden;
1973
+ transition: border-color 0.12s ease, background 0.12s ease;
1974
+ }
1975
+
1976
+ .token-card:hover {
1977
+ border-color: color-mix(in srgb, var(--selection) 36%, var(--border-subtle));
1978
+ }
1979
+
1980
+ .token-card.selected {
1981
+ border-color: var(--brand-500);
1982
+ background: color-mix(in srgb, var(--accent) 4%, var(--surface-raised));
1983
+ }
1984
+
1985
+ .token-card input {
1986
+ position: absolute;
1987
+ opacity: 0;
1988
+ pointer-events: none;
1989
+ }
1990
+
1991
+ .token-select-zone {
1992
+ display: grid;
1993
+ grid-template-columns: 42px minmax(0, 1fr);
1994
+ gap: 12px;
1995
+ align-items: center;
1996
+ padding: 10px;
1997
+ cursor: pointer;
1998
+ }
1999
+
2000
+ .token-copy-btn {
2001
+ display: flex;
2002
+ align-items: center;
2003
+ justify-content: center;
2004
+ width: 44px;
2005
+ border: none;
2006
+ border-left: 1px solid var(--border-subtle);
2007
+ background: transparent;
2008
+ color: var(--text-secondary);
2009
+ cursor: pointer;
2010
+ transition: background 0.12s ease, color 0.12s ease;
2011
+ }
2012
+
2013
+ .token-copy-btn:hover {
2014
+ background: var(--accent-soft);
2015
+ color: var(--selection);
2016
+ }
2017
+
2018
+ .token-copy-btn:focus-visible {
2019
+ outline: 2px solid var(--selection);
2020
+ outline-offset: -2px;
2021
+ }
2022
+
2023
+ .token-copy-btn svg {
2024
+ width: 17px;
2025
+ height: 17px;
2026
+ stroke: currentColor;
2027
+ fill: none;
2028
+ stroke-width: 1.8;
2029
+ stroke-linecap: round;
2030
+ stroke-linejoin: round;
2031
+ }
2032
+
2033
+ .token-swatch {
2034
+ width: 42px;
2035
+ height: 42px;
2036
+ border: 1px solid var(--border-subtle);
2037
+ border-radius: 7px;
2038
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.02);
2039
+ }
2040
+
2041
+ [data-theme="dark"] .card,
2042
+ [data-theme="dark"] .token-card,
2043
+ [data-theme="dark"] .capability-cart,
2044
+ [data-theme="dark"] .command-panel,
2045
+ [data-theme="dark"] .modal {
2046
+ border-color: rgba(255, 255, 255, 0.08);
2047
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.025), 0 18px 48px rgba(0, 0, 0, 0.36);
2048
+ }
2049
+
2050
+ [data-theme="dark"] .card:hover,
2051
+ [data-theme="dark"] .token-card:hover {
2052
+ border-color: color-mix(in srgb, var(--accent) 38%, rgba(255, 255, 255, 0.12));
2053
+ }
2054
+
2055
+ [data-theme="dark"] .shell-topbar,
2056
+ [data-theme="dark"] .sidebar {
2057
+ border-color: rgba(255, 255, 255, 0.075);
2058
+ }
2059
+
2060
+ [data-theme="dark"] .nav-link.active {
2061
+ background: rgba(163, 162, 126, 0.16);
2062
+ color: #ffffff;
2063
+ }
2064
+
2065
+ [data-theme="dark"] .btn.primary {
2066
+ color: #111312;
2067
+ }
2068
+
2069
+ .token-copy {
2070
+ min-width: 0;
2071
+ display: grid;
2072
+ gap: 2px;
2073
+ }
2074
+
2075
+ .token-copy strong {
2076
+ font-size: 13px;
2077
+ line-height: 1.25;
2078
+ }
2079
+
2080
+ .token-copy code {
2081
+ color: var(--text-secondary);
2082
+ font: 12px/1.25 "SF Mono", ui-monospace, Menlo, monospace;
2083
+ background: transparent;
2084
+ }
2085
+
2086
+ .token-copy small {
2087
+ color: var(--text-secondary);
2088
+ font-size: 11.5px;
2089
+ line-height: 1.3;
2090
+ }
2091
+
2092
+ .capability-cart {
2093
+ position: sticky;
2094
+ top: 18px;
2095
+ border: 1px solid var(--border-subtle);
2096
+ border-radius: 8px;
2097
+ background: color-mix(in srgb, var(--bg-panel) 96%, var(--bg-hover));
2098
+ overflow: hidden;
2099
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.02);
2100
+ }
2101
+
2102
+ .capability-cart-head,
2103
+ .capability-cart-actions {
2104
+ display: flex;
2105
+ align-items: center;
2106
+ justify-content: space-between;
2107
+ gap: 8px;
2108
+ padding: 14px;
2109
+ border-bottom: 1px solid var(--border-subtle);
2110
+ }
2111
+
2112
+ .capability-cart-actions {
2113
+ border-top: 1px solid var(--border-subtle);
2114
+ border-bottom: none;
2115
+ }
2116
+
2117
+ .capability-cart-head h2 {
2118
+ margin: 0;
2119
+ font-size: 13px;
2120
+ font-weight: 650;
2121
+ text-transform: uppercase;
2122
+ letter-spacing: 0.04em;
2123
+ color: var(--text-secondary);
2124
+ }
2125
+
2126
+ .capability-cart-count {
2127
+ min-width: 24px;
2128
+ height: 24px;
2129
+ display: inline-flex;
2130
+ align-items: center;
2131
+ justify-content: center;
2132
+ border-radius: 999px;
2133
+ background: var(--accent-quiet);
2134
+ color: var(--selection);
2135
+ font-size: 12px;
2136
+ font-weight: 700;
2137
+ }
2138
+
2139
+ .capability-cart-body {
2140
+ display: flex;
2141
+ flex-direction: column;
2142
+ gap: 4px;
2143
+ max-height: 420px;
2144
+ overflow-y: auto;
2145
+ padding: 8px;
2146
+ }
2147
+
2148
+ .capability-cart-empty {
2149
+ padding: 22px 12px;
2150
+ color: var(--text-secondary);
2151
+ font-size: 12.5px;
2152
+ line-height: 1.5;
2153
+ }
2154
+
2155
+ .capability-cart-item {
2156
+ display: flex;
2157
+ align-items: flex-start;
2158
+ justify-content: space-between;
2159
+ gap: 10px;
2160
+ padding: 10px;
2161
+ border-radius: 8px;
2162
+ background: var(--surface-raised);
2163
+ border: 1px solid transparent;
2164
+ }
2165
+
2166
+ .capability-cart-item:hover {
2167
+ border-color: var(--border-subtle);
2168
+ }
2169
+
2170
+ .capability-cart-item-title {
2171
+ font-size: 13px;
2172
+ font-weight: 600;
2173
+ line-height: 1.35;
2174
+ }
2175
+
2176
+ .capability-cart-item-meta {
2177
+ margin-top: 2px;
2178
+ font-size: 11px;
2179
+ color: var(--text-secondary);
2180
+ line-height: 1.35;
2181
+ }
2182
+
2183
+ .capability-cart-remove {
2184
+ border: none;
2185
+ background: transparent;
2186
+ color: var(--text-secondary);
2187
+ font-size: 11.5px;
2188
+ cursor: pointer;
2189
+ padding: 1px 0;
2190
+ }
2191
+
2192
+ .capability-cart-remove:hover {
2193
+ color: var(--danger);
2194
+ }
2195
+
2196
+ /* ---------- markdown body ---------- */
2197
+ .markdown-body { font-size: 15px; line-height: 1.7; color: var(--text-primary); }
2198
+ .markdown-body h1 { font-size: 30px; font-weight: 700; margin: 8px 0 20px; letter-spacing: -0.015em; }
2199
+ .markdown-body h2 {
2200
+ font-size: 22px;
2201
+ font-weight: 650;
2202
+ margin: 36px 0 14px;
2203
+ padding-bottom: 8px;
2204
+ border-bottom: 1px solid var(--border-subtle);
2205
+ }
2206
+ .markdown-body h3 { font-size: 17px; font-weight: 650; margin: 26px 0 10px; }
2207
+ .markdown-body h4 { font-size: 15px; font-weight: 650; margin: 20px 0 8px; }
2208
+ .markdown-body p { margin: 14px 0; }
2209
+ .markdown-body a { color: var(--selection); text-decoration: none; }
2210
+ .markdown-body a:hover { text-decoration: underline; }
2211
+ .markdown-body ul, .markdown-body ol { margin: 14px 0; padding-left: 26px; }
2212
+ .markdown-body li { margin: 5px 0; }
2213
+ .markdown-body li.task { list-style: none; margin-left: -22px; }
2214
+ .markdown-body li.task input { margin-right: 8px; }
2215
+ .markdown-body blockquote {
2216
+ margin: 16px 0;
2217
+ padding: 4px 16px;
2218
+ border-left: 3px solid var(--selection);
2219
+ background: var(--bg-hover);
2220
+ border-radius: 0 8px 8px 0;
2221
+ color: var(--text-secondary);
2222
+ }
2223
+ .markdown-body code {
2224
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
2225
+ font-size: 0.86em;
2226
+ background: var(--bg-hover);
2227
+ padding: 2px 6px;
2228
+ border-radius: 5px;
2229
+ }
2230
+ .markdown-body pre.code-block {
2231
+ margin: 16px 0;
2232
+ padding: 16px;
2233
+ background: var(--bg-hover);
2234
+ border: 1px solid var(--border-subtle);
2235
+ border-radius: 10px;
2236
+ overflow-x: auto;
2237
+ }
2238
+ .markdown-body pre.code-block code { background: none; padding: 0; font-size: 13px; line-height: 1.6; }
2239
+ .markdown-body img { max-width: 100%; border-radius: 8px; }
2240
+ .markdown-body hr { border: none; border-top: 1px solid var(--border-subtle); margin: 32px 0; }
2241
+ .markdown-body table {
2242
+ width: 100%;
2243
+ border-collapse: collapse;
2244
+ margin: 18px 0;
2245
+ font-size: 13.5px;
2246
+ }
2247
+ .markdown-body th, .markdown-body td {
2248
+ border: 1px solid var(--border-subtle);
2249
+ padding: 8px 12px;
2250
+ text-align: left;
2251
+ }
2252
+ .markdown-body th { background: var(--bg-hover); font-weight: 600; }
2253
+ .markdown-body .md-error {
2254
+ margin: 16px 0;
2255
+ padding: 14px 16px;
2256
+ border: 1px solid #ef4444;
2257
+ border-radius: 10px;
2258
+ background: rgba(239, 68, 68, 0.08);
2259
+ color: var(--text-primary);
2260
+ }
2261
+ .markdown-body .md-error pre {
2262
+ margin: 8px 0 0;
2263
+ font-size: 12px;
2264
+ white-space: pre-wrap;
2265
+ color: var(--text-secondary);
2266
+ }
2267
+
2268
+ /* ---------- board embeds in markdown ---------- */
2269
+ .board-embed { margin: 24px 0; }
2270
+ .board-embed-frame {
2271
+ position: relative;
2272
+ width: 100%;
2273
+ border: 1px solid var(--border-subtle);
2274
+ border-radius: 12px;
2275
+ overflow: hidden;
2276
+ background: var(--bg-canvas);
2277
+ box-shadow: var(--shadow-soft);
2278
+ display: flex;
2279
+ align-items: center;
2280
+ justify-content: center;
2281
+ }
2282
+ .board-embed-frame canvas { display: block; }
2283
+ .board-embed-frame.error { color: var(--text-secondary); font-size: 13px; }
2284
+ .board-embed-msg { padding: 24px; }
2285
+ .board-embed-open {
2286
+ position: absolute;
2287
+ bottom: 10px;
2288
+ right: 10px;
2289
+ padding: 5px 10px;
2290
+ font-size: 12px;
2291
+ font-weight: 500;
2292
+ border-radius: 8px;
2293
+ background: var(--bg-toolbar);
2294
+ backdrop-filter: blur(10px);
2295
+ border: 1px solid var(--border-subtle);
2296
+ color: var(--text-primary);
2297
+ text-decoration: none;
2298
+ opacity: 0;
2299
+ transition: opacity 0.15s ease;
2300
+ }
2301
+ .board-embed-frame:hover .board-embed-open { opacity: 1; }
2302
+ .board-embed figcaption {
2303
+ margin-top: 8px;
2304
+ font-size: 12.5px;
2305
+ color: var(--text-secondary);
2306
+ text-align: center;
2307
+ }
2308
+
2309
+ /* ---------- board editor (full-screen mode) ---------- */
2310
+ .board-editor-host { position: fixed; inset: 0; z-index: 500; }
2311
+
2312
+ /* "← Docs" button sits to the left of the title in the top-left cluster */
2313
+ .top-left .back-btn {
2314
+ height: 40px;
2315
+ width: auto;
2316
+ gap: 6px;
2317
+ padding: 0 12px;
2318
+ background: var(--bg-toolbar);
2319
+ backdrop-filter: blur(16px);
2320
+ border: 1px solid var(--border-subtle);
2321
+ box-shadow: var(--shadow-soft);
2322
+ font-size: 13px;
2323
+ font-weight: 500;
2324
+ }
2325
+ .top-left .back-btn span { line-height: 1; }
2326
+
2327
+ /* drag-to-select embed overlay */
2328
+ .embed-select-overlay {
2329
+ position: fixed;
2330
+ inset: 0;
2331
+ z-index: 1000;
2332
+ cursor: crosshair;
2333
+ background: rgba(15, 23, 42, 0.18);
2334
+ }
2335
+ .embed-select-rect {
2336
+ position: absolute;
2337
+ border: 1.5px solid var(--selection);
2338
+ background: color-mix(in srgb, var(--selection) 16%, transparent);
2339
+ box-shadow: 0 0 0 9999px rgba(15, 23, 42, 0.12);
2340
+ pointer-events: none;
2341
+ }
2342
+ .embed-select-hint {
2343
+ position: fixed;
2344
+ top: 16px;
2345
+ left: 50%;
2346
+ transform: translateX(-50%);
2347
+ padding: 8px 14px;
2348
+ border-radius: 10px;
2349
+ font-size: 13px;
2350
+ font-weight: 500;
2351
+ color: #fff;
2352
+ background: rgba(15, 23, 42, 0.82);
2353
+ pointer-events: none;
2354
+ }
2355
+
2356
+ /* ---------- doc page actions + embed chips ---------- */
2357
+ .doc-page { position: relative; }
2358
+ .doc-actions {
2359
+ display: flex;
2360
+ justify-content: flex-end;
2361
+ gap: 8px;
2362
+ margin-bottom: 8px;
2363
+ }
2364
+ /* Subtle, elegant edit affordance: grey border + grey text. */
2365
+ .btn.doc-edit {
2366
+ background: transparent;
2367
+ border-color: var(--border-subtle);
2368
+ color: var(--text-secondary);
2369
+ font-weight: 500;
2370
+ }
2371
+ .btn.doc-edit:hover {
2372
+ background: var(--bg-hover);
2373
+ color: var(--text-primary);
2374
+ }
2375
+
2376
+ .capability-doc-actions {
2377
+ align-items: center;
2378
+ }
2379
+
2380
+ .capability-doc-actions .capability-detail-btn,
2381
+ .capability-doc-actions .capability-detail-btn.primary {
2382
+ height: 34px;
2383
+ padding: 0 13px;
2384
+ border-radius: 999px;
2385
+ background: transparent;
2386
+ border-color: color-mix(in srgb, var(--selection) 34%, var(--border-subtle));
2387
+ color: var(--text-primary);
2388
+ font-size: 12.5px;
2389
+ font-weight: 500;
2390
+ }
2391
+
2392
+ .capability-doc-actions .capability-detail-btn:hover,
2393
+ .capability-doc-actions .capability-detail-btn.primary:hover {
2394
+ background: var(--accent-soft);
2395
+ color: var(--text-primary);
2396
+ }
2397
+
2398
+ .capability-doc-actions .capability-detail-btn.is-selected {
2399
+ background: var(--accent-secondary);
2400
+ border-color: var(--accent-secondary);
2401
+ color: #fff;
2402
+ }
2403
+
2404
+ .capability-doc-actions .capability-detail-btn.is-selected:hover {
2405
+ background: color-mix(in srgb, var(--accent-secondary) 88%, #000);
2406
+ color: #fff;
2407
+ }
2408
+ .markdown-body figure.board-embed.embed-chip {
2409
+ display: flex;
2410
+ align-items: center;
2411
+ gap: 8px;
2412
+ padding: 12px 16px;
2413
+ border: 1px dashed var(--border-subtle);
2414
+ border-radius: 10px;
2415
+ background: var(--bg-hover);
2416
+ color: var(--text-secondary);
2417
+ font-size: 13px;
2418
+ user-select: none;
2419
+ cursor: pointer;
2420
+ outline: none;
2421
+ }
2422
+ .markdown-body figure.board-embed.embed-chip:hover,
2423
+ .markdown-body figure.board-embed.embed-chip.selected,
2424
+ .markdown-body figure.board-embed.embed-chip:focus {
2425
+ border-color: color-mix(in srgb, var(--selection) 54%, var(--border-subtle));
2426
+ background: var(--accent-soft);
2427
+ color: var(--text-primary);
2428
+ }
2429
+ .embed-chip-icon { font-size: 15px; }
2430
+ .embed-chip-remove {
2431
+ margin-left: auto;
2432
+ color: var(--text-secondary);
2433
+ font-size: 12px;
2434
+ font-weight: 600;
2435
+ opacity: 0;
2436
+ transition: opacity 0.12s ease;
2437
+ }
2438
+ .embed-chip:hover .embed-chip-remove,
2439
+ .embed-chip.selected .embed-chip-remove,
2440
+ .embed-chip:focus .embed-chip-remove {
2441
+ opacity: 0.85;
2442
+ }
2443
+ .doc-editor-surface .embed-caret-spacer {
2444
+ min-height: 1.35em;
2445
+ }
2446
+
2447
+ /* ---------- doc editor (WYSIWYG) ---------- */
2448
+ .doc-editor {
2449
+ position: fixed;
2450
+ inset: 0;
2451
+ z-index: 700;
2452
+ display: flex;
2453
+ flex-direction: column;
2454
+ background: var(--bg-canvas);
2455
+ }
2456
+ .doc-editor-bar {
2457
+ display: flex;
2458
+ align-items: center;
2459
+ justify-content: space-between;
2460
+ gap: 16px;
2461
+ padding: 10px 16px;
2462
+ border-bottom: 1px solid var(--border-subtle);
2463
+ background: var(--bg-canvas);
2464
+ }
2465
+ .doc-editor-bar-left { display: flex; align-items: center; gap: 12px; min-width: 0; }
2466
+ .doc-editor-done {
2467
+ padding: 7px 16px;
2468
+ border: 1px solid var(--border-subtle);
2469
+ background: transparent;
2470
+ color: var(--text-secondary);
2471
+ border-radius: 8px;
2472
+ font-size: 13px;
2473
+ font-weight: 500;
2474
+ cursor: pointer;
2475
+ transition: background 0.12s ease, color 0.12s ease;
2476
+ }
2477
+ .doc-editor-done:hover {
2478
+ background: var(--bg-hover);
2479
+ color: var(--text-primary);
2480
+ }
2481
+ .doc-editor-path {
2482
+ font-size: 12.5px;
2483
+ color: var(--text-secondary);
2484
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
2485
+ overflow: hidden;
2486
+ text-overflow: ellipsis;
2487
+ white-space: nowrap;
2488
+ }
2489
+ /* Quiet, ambient indicator: only an error is allowed to stand out. */
2490
+ .doc-editor-status {
2491
+ font-size: 12px;
2492
+ color: var(--text-secondary);
2493
+ opacity: 0.6;
2494
+ white-space: nowrap;
2495
+ }
2496
+ .doc-editor-status[data-state="error"] {
2497
+ color: var(--danger);
2498
+ opacity: 1;
2499
+ font-weight: 600;
2500
+ }
2501
+
2502
+ .doc-editor-toolbar {
2503
+ display: flex;
2504
+ flex-wrap: wrap;
2505
+ align-items: center;
2506
+ gap: 6px;
2507
+ padding: 7px 16px;
2508
+ border-bottom: 1px solid var(--border-subtle);
2509
+ background: var(--bg-canvas);
2510
+ position: sticky;
2511
+ top: 0;
2512
+ z-index: 1;
2513
+ }
2514
+ .doc-editor-tb-group {
2515
+ display: flex;
2516
+ align-items: center;
2517
+ gap: 3px;
2518
+ padding: 3px;
2519
+ border: 1px solid var(--border-subtle);
2520
+ border-radius: 10px;
2521
+ background: color-mix(in srgb, var(--surface-raised) 72%, transparent);
2522
+ }
2523
+ .doc-editor-tb-btn {
2524
+ display: inline-flex;
2525
+ align-items: center;
2526
+ justify-content: center;
2527
+ min-width: 32px;
2528
+ height: 32px;
2529
+ padding: 0 8px;
2530
+ border: none;
2531
+ border-radius: 8px;
2532
+ background: transparent;
2533
+ color: var(--text-secondary);
2534
+ font-size: 13px;
2535
+ font-weight: 600;
2536
+ cursor: pointer;
2537
+ transition: background 0.12s ease, color 0.12s ease;
2538
+ }
2539
+ .doc-editor-tb-btn:hover {
2540
+ background: var(--bg-hover);
2541
+ color: var(--text-primary);
2542
+ }
2543
+ .doc-editor-tb-btn.active {
2544
+ background: var(--accent-secondary-quiet);
2545
+ color: var(--text-primary);
2546
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent-secondary) 28%, transparent);
2547
+ }
2548
+ .doc-editor-tb-btn:focus-visible {
2549
+ outline: 2px solid var(--selection);
2550
+ outline-offset: 2px;
2551
+ }
2552
+ .doc-editor-tb-btn.icon svg {
2553
+ width: 17px;
2554
+ height: 17px;
2555
+ stroke: currentColor;
2556
+ fill: none;
2557
+ stroke-width: 1.8;
2558
+ stroke-linecap: round;
2559
+ stroke-linejoin: round;
2560
+ }
2561
+
2562
+ .doc-editor-scroll {
2563
+ flex: 1 1 auto;
2564
+ overflow-y: auto;
2565
+ }
2566
+ .doc-editor-surface {
2567
+ max-width: 820px;
2568
+ margin: 0 auto;
2569
+ padding: 36px 40px 160px;
2570
+ min-height: 100%;
2571
+ outline: none;
2572
+ background: transparent;
2573
+ }
2574
+ .doc-editor-surface:focus { outline: none; }
2575
+ .doc-editor-surface img { cursor: default; }
2576
+ .doc-editor-surface:empty::before {
2577
+ content: "Start writing...";
2578
+ color: var(--text-secondary);
2579
+ opacity: 0.55;
2580
+ }
2581
+ .doc-editor-surface a {
2582
+ cursor: text;
2583
+ }
2584
+ .doc-editor-surface pre.code-block {
2585
+ position: relative;
2586
+ }
2587
+ .doc-editor-surface pre.code-block:focus-within {
2588
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--selection) 34%, transparent);
2589
+ }
2590
+
2591
+ /* ============================================================
2592
+ Breadcrumb
2593
+ ============================================================ */
2594
+
2595
+ .breadcrumb {
2596
+ display: flex;
2597
+ align-items: center;
2598
+ flex-wrap: wrap;
2599
+ gap: 4px;
2600
+ margin-bottom: 20px;
2601
+ font-size: 12px;
2602
+ font-weight: 500;
2603
+ color: var(--text-secondary);
2604
+ }
2605
+
2606
+ .breadcrumb-link {
2607
+ color: var(--text-secondary);
2608
+ text-decoration: none;
2609
+ padding: 2px 4px;
2610
+ border-radius: 4px;
2611
+ transition: color 0.1s ease, background 0.1s ease;
2612
+ }
2613
+ .breadcrumb-link:hover {
2614
+ color: var(--text-primary);
2615
+ background: var(--bg-hover);
2616
+ }
2617
+
2618
+ .breadcrumb-sep {
2619
+ color: var(--text-secondary);
2620
+ opacity: 0.4;
2621
+ user-select: none;
2622
+ padding: 0 2px;
2623
+ }
2624
+
2625
+ .breadcrumb-current {
2626
+ color: var(--text-primary);
2627
+ font-weight: 600;
2628
+ }
2629
+
2630
+ /* ============================================================
2631
+ Page prev / next navigation
2632
+ ============================================================ */
2633
+
2634
+ .page-nav {
2635
+ display: flex;
2636
+ align-items: stretch;
2637
+ justify-content: space-between;
2638
+ gap: 12px;
2639
+ margin-top: 56px;
2640
+ padding-top: 20px;
2641
+ border-top: 1px solid var(--border-subtle);
2642
+ }
2643
+
2644
+ .page-nav-prev,
2645
+ .page-nav-next {
2646
+ display: flex;
2647
+ align-items: center;
2648
+ gap: 10px;
2649
+ padding: 12px 16px;
2650
+ border: 1px solid var(--border-subtle);
2651
+ border-radius: 10px;
2652
+ text-decoration: none;
2653
+ color: var(--text-secondary);
2654
+ background: var(--surface-raised);
2655
+ font-size: 13px;
2656
+ font-weight: 500;
2657
+ min-width: 0;
2658
+ max-width: 48%;
2659
+ transition: border-color 0.12s ease, background 0.12s ease, color 0.12s ease;
2660
+ }
2661
+ .page-nav-prev:hover,
2662
+ .page-nav-next:hover {
2663
+ border-color: color-mix(in srgb, var(--selection) 45%, var(--border-subtle));
2664
+ background: var(--bg-hover);
2665
+ color: var(--text-primary);
2666
+ }
2667
+
2668
+ .page-nav-prev { margin-right: auto; }
2669
+ .page-nav-next { margin-left: auto; flex-direction: row-reverse; }
2670
+
2671
+ .page-nav-label {
2672
+ overflow: hidden;
2673
+ text-overflow: ellipsis;
2674
+ white-space: nowrap;
2675
+ min-width: 0;
2676
+ }
2677
+
2678
+ .page-nav-arrow {
2679
+ flex: 0 0 auto;
2680
+ font-size: 15px;
2681
+ line-height: 1;
2682
+ color: var(--text-secondary);
2683
+ transition: color 0.12s ease;
2684
+ }
2685
+ .page-nav-prev:hover .page-nav-arrow,
2686
+ .page-nav-next:hover .page-nav-arrow {
2687
+ color: var(--text-primary);
2688
+ }
2689
+
2690
+ .page-nav-spacer { flex: 1; }
2691
+
2692
+ /* ============================================================
2693
+ Sidebar docs mode
2694
+ ============================================================ */
2695
+
2696
+ /* Brand button — same look as a link, activates on click */
2697
+ .sidebar-brand {
2698
+ border: none;
2699
+ background: none;
2700
+ cursor: pointer;
2701
+ font-size: 17px;
2702
+ font-weight: 700;
2703
+ letter-spacing: -0.01em;
2704
+ color: var(--text-primary);
2705
+ text-decoration: none;
2706
+ padding: 0;
2707
+ transition: color 0.12s ease;
2708
+ }
2709
+ .sidebar-brand:hover { color: var(--selection); }
2710
+ .sidebar-brand:focus-visible {
2711
+ outline: 2px solid var(--selection);
2712
+ outline-offset: 3px;
2713
+ border-radius: 4px;
2714
+ }
2715
+
2716
+ /* Docs mode: brand gets an active indicator */
2717
+ .sidebar-docs-mode .sidebar-brand {
2718
+ color: var(--selection);
2719
+ }
2720
+ .sidebar-docs-mode .sidebar-brand::after {
2721
+ content: " ·";
2722
+ opacity: 0.4;
2723
+ }
2724
+
2725
+ /* Back row */
2726
+ .docs-mode-back-row {
2727
+ padding: 8px 0 4px;
2728
+ }
2729
+ .docs-mode-back {
2730
+ display: flex;
2731
+ align-items: center;
2732
+ gap: 6px;
2733
+ border: none;
2734
+ background: none;
2735
+ cursor: pointer;
2736
+ font-size: 12px;
2737
+ font-weight: 600;
2738
+ color: var(--text-secondary);
2739
+ padding: 5px 8px;
2740
+ border-radius: 7px;
2741
+ width: 100%;
2742
+ text-align: left;
2743
+ transition: background 0.1s ease, color 0.1s ease;
2744
+ }
2745
+ .docs-mode-back:hover { background: var(--bg-hover); color: var(--text-primary); }
2746
+ .docs-mode-back svg {
2747
+ width: 12px;
2748
+ height: 12px;
2749
+ flex: 0 0 auto;
2750
+ }
2751
+
2752
+ /* Docs mode tree — auto-expanded, slight indent */
2753
+ .docs-mode-tree { padding-left: 0; }
2754
+
2755
+ /* ============================================================
2756
+ Home page — two-column: guide + workspace panel
2757
+ ============================================================ */
2758
+
2759
+ .home-page { padding-top: 8px; }
2760
+
2761
+ .home-layout {
2762
+ display: grid;
2763
+ grid-template-columns: minmax(0, 1fr) 300px;
2764
+ gap: 36px;
2765
+ align-items: start;
2766
+ }
2767
+
2768
+ /* ── Guide (left) ── */
2769
+ .home-guide { min-width: 0; }
2770
+
2771
+ .home-hero-title {
2772
+ font-size: 30px;
2773
+ font-weight: 750;
2774
+ letter-spacing: -0.02em;
2775
+ line-height: 1.1;
2776
+ margin: 0 0 8px;
2777
+ color: var(--text-primary);
2778
+ }
2779
+ .home-hero-sub {
2780
+ font-size: 14px;
2781
+ line-height: 1.65;
2782
+ color: var(--text-secondary);
2783
+ margin: 0 0 32px;
2784
+ }
2785
+
2786
+ /* Feature sections */
2787
+ .home-feature {
2788
+ margin-bottom: 28px;
2789
+ padding-bottom: 28px;
2790
+ border-bottom: 1px solid var(--border-subtle);
2791
+ }
2792
+ .home-feature:last-of-type { border-bottom: none; }
2793
+
2794
+ .home-feature-header { margin-bottom: 8px; }
2795
+
2796
+ .home-feature-badge {
2797
+ display: inline-block;
2798
+ padding: 2px 10px;
2799
+ border-radius: 999px;
2800
+ font-size: 11px;
2801
+ font-weight: 700;
2802
+ letter-spacing: 0.05em;
2803
+ text-transform: uppercase;
2804
+ border: 1px solid var(--border-subtle);
2805
+ background: var(--accent-soft);
2806
+ color: var(--text-secondary);
2807
+ }
2808
+ .home-feature-badge-board {
2809
+ background: var(--nav-board-bg);
2810
+ color: var(--nav-board-color);
2811
+ border-color: color-mix(in srgb, var(--nav-board-color) 25%, var(--border-subtle));
2812
+ }
2813
+ .home-feature-badge-capability {
2814
+ background: var(--nav-cap-bg);
2815
+ color: var(--nav-cap-color);
2816
+ border-color: color-mix(in srgb, var(--nav-cap-color) 25%, var(--border-subtle));
2817
+ }
2818
+ .home-feature-badge-doc {
2819
+ background: var(--accent-soft);
2820
+ color: var(--text-secondary);
2821
+ }
2822
+
2823
+ .home-feature-body {
2824
+ font-size: 13.5px;
2825
+ line-height: 1.65;
2826
+ color: var(--text-secondary);
2827
+ margin: 0 0 10px;
2828
+ }
2829
+
2830
+ .home-feature-list {
2831
+ margin: 0;
2832
+ padding-left: 18px;
2833
+ display: flex;
2834
+ flex-direction: column;
2835
+ gap: 4px;
2836
+ }
2837
+ .home-feature-list li {
2838
+ font-size: 13px;
2839
+ line-height: 1.55;
2840
+ color: var(--text-secondary);
2841
+ }
2842
+
2843
+ /* Shortcut table */
2844
+ .home-shortcut-title {
2845
+ font-size: 11px;
2846
+ font-weight: 700;
2847
+ letter-spacing: 0.07em;
2848
+ text-transform: uppercase;
2849
+ color: var(--text-secondary);
2850
+ margin: 32px 0 10px;
2851
+ }
2852
+ .home-shortcut-table {
2853
+ display: grid;
2854
+ gap: 1px;
2855
+ background: var(--border-subtle);
2856
+ border: 1px solid var(--border-subtle);
2857
+ border-radius: 10px;
2858
+ overflow: hidden;
2859
+ }
2860
+ .home-shortcut-row {
2861
+ display: flex;
2862
+ align-items: center;
2863
+ gap: 16px;
2864
+ padding: 7px 12px;
2865
+ background: var(--surface-raised);
2866
+ }
2867
+ .home-shortcut-row:hover { background: var(--bg-hover); }
2868
+ .home-shortcut-key {
2869
+ flex: 0 0 auto;
2870
+ min-width: 200px;
2871
+ font: 11.5px/1.4 "SF Mono", ui-monospace, Menlo, monospace;
2872
+ color: var(--text-primary);
2873
+ background: transparent;
2874
+ border: none;
2875
+ padding: 0;
2876
+ }
2877
+ .home-shortcut-desc {
2878
+ font-size: 12.5px;
2879
+ color: var(--text-secondary);
2880
+ }
2881
+
2882
+ /* ── Workspace panel (right) ── */
2883
+ .home-panel {
2884
+ position: sticky;
2885
+ top: 24px;
2886
+ border: 1px solid var(--border-subtle);
2887
+ border-radius: 12px;
2888
+ background: var(--surface-raised);
2889
+ overflow: hidden;
2890
+ }
2891
+
2892
+ .home-panel-head {
2893
+ display: flex;
2894
+ align-items: center;
2895
+ justify-content: space-between;
2896
+ padding: 12px 14px;
2897
+ border-bottom: 1px solid var(--border-subtle);
2898
+ }
2899
+ .home-panel-title {
2900
+ font-size: 11px;
2901
+ font-weight: 700;
2902
+ letter-spacing: 0.07em;
2903
+ text-transform: uppercase;
2904
+ color: var(--text-secondary);
2905
+ }
2906
+ .home-panel-add {
2907
+ padding: 4px 10px;
2908
+ font-size: 12px;
2909
+ height: auto;
2910
+ }
2911
+
2912
+ .home-panel-empty {
2913
+ padding: 20px 14px;
2914
+ font-size: 13px;
2915
+ color: var(--text-secondary);
2916
+ line-height: 1.5;
2917
+ }
2918
+
2919
+ /* Per-project block inside panel */
2920
+ .home-panel-project {
2921
+ border-bottom: 1px solid var(--border-subtle);
2922
+ }
2923
+ .home-panel-project:last-child { border-bottom: none; }
2924
+
2925
+ .home-panel-project-head {
2926
+ display: flex;
2927
+ align-items: baseline;
2928
+ justify-content: space-between;
2929
+ gap: 10px;
2930
+ padding: 10px 14px 6px;
2931
+ text-decoration: none;
2932
+ border-bottom: 1px solid var(--border-subtle);
2933
+ transition: background 0.1s ease;
2934
+ }
2935
+ .home-panel-project-head:hover { background: var(--bg-hover); }
2936
+
2937
+ .home-panel-project-name {
2938
+ font-size: 13px;
2939
+ font-weight: 650;
2940
+ color: var(--text-primary);
2941
+ min-width: 0;
2942
+ overflow: hidden;
2943
+ text-overflow: ellipsis;
2944
+ white-space: nowrap;
2945
+ }
2946
+ .home-panel-project-meta {
2947
+ flex: 0 0 auto;
2948
+ font-size: 11px;
2949
+ color: var(--text-secondary);
2950
+ white-space: nowrap;
2951
+ }
2952
+
2953
+ /* Root rows inside a project block */
2954
+ .home-panel-roots { display: flex; flex-direction: column; }
2955
+
2956
+ .home-panel-root {
2957
+ display: flex;
2958
+ align-items: baseline;
2959
+ justify-content: space-between;
2960
+ gap: 8px;
2961
+ padding: 5px 14px;
2962
+ text-decoration: none;
2963
+ transition: background 0.1s ease;
2964
+ border-bottom: 1px solid color-mix(in srgb, var(--border-subtle) 50%, transparent);
2965
+ }
2966
+ .home-panel-root:last-of-type { border-bottom: none; }
2967
+ .home-panel-root:hover { background: var(--bg-hover); }
2968
+
2969
+ .home-panel-root-path {
2970
+ font-size: 11.5px;
2971
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
2972
+ color: var(--text-secondary);
2973
+ min-width: 0;
2974
+ overflow: hidden;
2975
+ text-overflow: ellipsis;
2976
+ white-space: nowrap;
2977
+ }
2978
+ .home-panel-root:hover .home-panel-root-path { color: var(--text-primary); }
2979
+
2980
+ .home-panel-root-meta {
2981
+ flex: 0 0 auto;
2982
+ font-size: 10.5px;
2983
+ color: var(--text-secondary);
2984
+ opacity: 0.7;
2985
+ white-space: nowrap;
2986
+ }
2987
+
2988
+ .home-panel-more {
2989
+ display: block;
2990
+ padding: 6px 14px 8px;
2991
+ font-size: 11.5px;
2992
+ color: var(--text-secondary);
2993
+ text-decoration: none;
2994
+ }
2995
+ .home-panel-more:hover { color: var(--text-primary); }
2996
+
2997
+ /* ── Wiki link button in sidebar project header ── */
2998
+ .nav-repo-label-text {
2999
+ flex: 1 1 auto;
3000
+ min-width: 0;
3001
+ overflow: hidden;
3002
+ text-overflow: ellipsis;
3003
+ white-space: nowrap;
3004
+ }
3005
+ .nav-repo-wiki-link {
3006
+ flex: 0 0 auto;
3007
+ display: inline-flex;
3008
+ align-items: center;
3009
+ justify-content: center;
3010
+ width: 20px;
3011
+ height: 20px;
3012
+ border-radius: 5px;
3013
+ color: var(--text-secondary);
3014
+ opacity: 0;
3015
+ transition: opacity 0.12s ease, background 0.12s ease;
3016
+ text-decoration: none;
3017
+ }
3018
+ .nav-repo-header:hover .nav-repo-wiki-link,
3019
+ .nav-dir-toggle:hover .nav-repo-wiki-link,
3020
+ .nav-dir-header-row:hover .nav-dir-wiki-link,
3021
+ .nav-repo-wiki-link:focus-visible {
3022
+ opacity: 1;
3023
+ }
3024
+
3025
+ /* Wiki links next to path-segment directories — show on hover */
3026
+ .nav-dir-project ~ .nav-dir-wiki-link {
3027
+ opacity: 0;
3028
+ }
3029
+
3030
+ .nav-dir-header-row:hover .nav-dir-project ~ .nav-dir-wiki-link {
3031
+ opacity: 0.7;
3032
+ }
3033
+ .nav-repo-wiki-link:hover { background: var(--bg-active); color: var(--text-primary); }
3034
+ .nav-repo-wiki-link svg { width: 12px; height: 12px; }
3035
+
3036
+ /* ============================================================
3037
+ Project wiki page
3038
+ ============================================================ */
3039
+
3040
+ .wiki-page { padding-top: 4px; }
3041
+
3042
+ .wiki-head {
3043
+ margin-bottom: 28px;
3044
+ padding-bottom: 20px;
3045
+ border-bottom: 1px solid var(--border-subtle);
3046
+ }
3047
+ .wiki-back {
3048
+ display: inline-block;
3049
+ font-size: 12px;
3050
+ color: var(--text-secondary);
3051
+ text-decoration: none;
3052
+ margin-bottom: 10px;
3053
+ }
3054
+ .wiki-back:hover { color: var(--text-primary); }
3055
+
3056
+ .wiki-title {
3057
+ font-size: 26px;
3058
+ font-weight: 750;
3059
+ letter-spacing: -0.01em;
3060
+ margin: 0 0 16px;
3061
+ }
3062
+
3063
+ .wiki-stats {
3064
+ display: flex;
3065
+ gap: 24px;
3066
+ flex-wrap: wrap;
3067
+ }
3068
+ .wiki-stat { text-align: left; }
3069
+ .wiki-stat-val {
3070
+ font-size: 22px;
3071
+ font-weight: 700;
3072
+ font-variant-numeric: tabular-nums;
3073
+ color: var(--text-primary);
3074
+ line-height: 1;
3075
+ }
3076
+ .wiki-stat-label {
3077
+ font-size: 11px;
3078
+ color: var(--text-secondary);
3079
+ margin-top: 2px;
3080
+ text-transform: uppercase;
3081
+ letter-spacing: 0.05em;
3082
+ font-weight: 600;
3083
+ }
3084
+
3085
+ /* Per-root section */
3086
+ .wiki-root-section {
3087
+ margin-bottom: 24px;
3088
+ padding-bottom: 24px;
3089
+ border-bottom: 1px solid var(--border-subtle);
3090
+ }
3091
+ .wiki-root-section:last-child { border-bottom: none; }
3092
+
3093
+ .wiki-root-head { margin-bottom: 12px; }
3094
+ .wiki-root-path {
3095
+ font-size: 12px;
3096
+ font-weight: 700;
3097
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
3098
+ color: var(--text-secondary);
3099
+ letter-spacing: 0.01em;
3100
+ }
3101
+
3102
+ .wiki-root-empty {
3103
+ font-size: 12px;
3104
+ color: var(--text-secondary);
3105
+ font-style: italic;
3106
+ }
3107
+
3108
+ /* Three-column layout per root */
3109
+ .wiki-root-cols {
3110
+ display: grid;
3111
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
3112
+ gap: 16px;
3113
+ }
3114
+
3115
+ .wiki-col-head {
3116
+ font-size: 10.5px;
3117
+ font-weight: 700;
3118
+ letter-spacing: 0.06em;
3119
+ text-transform: uppercase;
3120
+ color: var(--text-secondary);
3121
+ margin-bottom: 6px;
3122
+ padding-bottom: 5px;
3123
+ border-bottom: 1px solid var(--border-subtle);
3124
+ }
3125
+
3126
+ .wiki-col-list {
3127
+ display: flex;
3128
+ flex-direction: column;
3129
+ gap: 1px;
3130
+ }
3131
+
3132
+ .wiki-col-item {
3133
+ display: block;
3134
+ padding: 4px 6px;
3135
+ border-radius: 5px;
3136
+ font-size: 12.5px;
3137
+ text-decoration: none;
3138
+ color: var(--text-secondary);
3139
+ transition: background 0.1s ease, color 0.1s ease;
3140
+ text-transform: capitalize;
3141
+ }
3142
+ .wiki-col-item:hover {
3143
+ background: var(--bg-hover);
3144
+ color: var(--text-primary);
3145
+ }
3146
+ .wiki-col-item-board { color: var(--nav-board-color); }
3147
+ .wiki-col-item-board:hover { background: var(--nav-board-bg); color: var(--nav-board-color); }
3148
+ .wiki-col-item-cap { color: var(--nav-cap-color); }
3149
+ .wiki-col-item-cap:hover { background: var(--nav-cap-bg); color: var(--nav-cap-color); }
3150
+
3151
+ .wiki-col-item-path {
3152
+ display: block;
3153
+ font-size: 10.5px;
3154
+ font-family: "SF Mono", ui-monospace, Menlo, monospace;
3155
+ color: var(--text-secondary);
3156
+ opacity: 0.6;
3157
+ margin-top: 1px;
3158
+ }
3159
+
3160
+ @media (max-width: 720px) {
3161
+ .sidebar { flex-basis: 220px; width: 220px; }
3162
+ .shell-topbar { padding: 10px 12px; }
3163
+ .topbar-search {
3164
+ width: auto;
3165
+ flex: 1 1 auto;
3166
+ }
3167
+ .topbar-search kbd { display: none; }
3168
+ .topbar-edit span { display: none; }
3169
+ .topbar-edit {
3170
+ width: 34px;
3171
+ padding: 0;
3172
+ justify-content: center;
3173
+ }
3174
+ .capability-layout {
3175
+ grid-template-columns: 1fr;
3176
+ }
3177
+ .capability-cart {
3178
+ position: static;
3179
+ }
3180
+ .content { padding: 32px 20px 100px; }
3181
+ .doc-editor-surface { padding: 24px 18px 140px; }
3182
+ }
3183
+
3184
+ /* ---------- Project three-dot menu button ---------- */
3185
+
3186
+ .nav-repo-more {
3187
+ display: flex;
3188
+ align-items: center;
3189
+ justify-content: center;
3190
+ flex: 0 0 auto;
3191
+ width: 22px;
3192
+ height: 22px;
3193
+ padding: 0;
3194
+ margin-left: auto;
3195
+ margin-right: 2px;
3196
+ background: transparent;
3197
+ border: none;
3198
+ border-radius: 4px;
3199
+ color: var(--text-secondary);
3200
+ cursor: pointer;
3201
+ opacity: 0;
3202
+ transition: opacity 0.12s ease, background 0.12s ease;
3203
+ }
3204
+
3205
+ .nav-repo-header:hover .nav-repo-more {
3206
+ opacity: 0.5;
3207
+ }
3208
+
3209
+ .nav-repo-more:hover {
3210
+ background: var(--bg-hover);
3211
+ opacity: 1 !important;
3212
+ }
3213
+
3214
+ /* ---------- Raw view: non-docs directories (subtly muted) ---------- */
3215
+
3216
+ .nav-browse-dir-toggle {
3217
+ display: flex;
3218
+ align-items: center;
3219
+ gap: 4px;
3220
+ width: 100%;
3221
+ padding: 4px 8px;
3222
+ background: transparent;
3223
+ border: none;
3224
+ border-radius: 6px;
3225
+ color: var(--text-secondary);
3226
+ font-size: 13px;
3227
+ cursor: pointer;
3228
+ text-align: left;
3229
+ opacity: 0.45;
3230
+ transition: opacity 0.12s ease, background 0.12s ease;
3231
+ }
3232
+
3233
+ .nav-browse-dir-toggle:hover {
3234
+ background: var(--bg-hover);
3235
+ opacity: 0.75;
3236
+ }
3237
+
3238
+ /* Inline rename / create input */
3239
+ .nav-inline-input {
3240
+ display: block;
3241
+ width: 100%;
3242
+ padding: 4px 8px;
3243
+ margin: 1px 0;
3244
+ font: inherit;
3245
+ font-size: 13px;
3246
+ color: var(--text-primary);
3247
+ background: var(--bg-canvas);
3248
+ border: 1px solid var(--brand-300);
3249
+ border-radius: 4px;
3250
+ outline: none;
3251
+ box-shadow: 0 0 0 2px rgba(0, 120, 212, 0.15);
3252
+ }
3253
+
3254
+ .nav-inline-input::placeholder {
3255
+ color: var(--text-secondary);
3256
+ opacity: 0.6;
3257
+ }