viteboard 0.1.1 → 0.1.2

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 (81) hide show
  1. package/content/docs/index.md +1 -1
  2. package/content/docs/product-roadmap.board.json +4 -4
  3. package/content/machine/board-v1.schema.json +138 -0
  4. package/content/machine/example.board.json +217 -0
  5. package/content/machine/guide.md +270 -0
  6. package/content/machine/llms.txt +31 -0
  7. package/content/machine/viteboard.json +62 -0
  8. package/dist/assets/index-D2W76uu9.js +96 -0
  9. package/dist/assets/index-rMkUjGXP.css +1 -0
  10. package/dist/index.html +4 -2
  11. package/package.json +10 -12
  12. package/vite.config.ts +619 -38
  13. package/dist/assets/index-C30zRPsW.js +0 -60
  14. package/dist/assets/index-e5aqtN8W.css +0 -1
  15. package/index.html +0 -13
  16. package/src/app/AppController.ts +0 -962
  17. package/src/app/BoardState.ts +0 -130
  18. package/src/app/ClipboardService.ts +0 -159
  19. package/src/app/CommandManager.ts +0 -66
  20. package/src/app/ElementActions.ts +0 -152
  21. package/src/app/EmbedRegionSelector.ts +0 -103
  22. package/src/app/ExportPng.ts +0 -107
  23. package/src/app/ImageInsertService.ts +0 -141
  24. package/src/app/KeyboardShortcuts.ts +0 -124
  25. package/src/app/main.ts +0 -6
  26. package/src/board/BoardPreview.ts +0 -189
  27. package/src/board/BoardService.ts +0 -222
  28. package/src/canvas/CanvasRenderer.ts +0 -253
  29. package/src/canvas/CanvasSurface.ts +0 -70
  30. package/src/canvas/HitTester.ts +0 -110
  31. package/src/canvas/ImageCache.ts +0 -123
  32. package/src/canvas/PerformanceMonitor.ts +0 -31
  33. package/src/canvas/RenderScheduler.ts +0 -26
  34. package/src/canvas/Viewport.ts +0 -77
  35. package/src/content/ContentApi.ts +0 -258
  36. package/src/content/Markdown.ts +0 -431
  37. package/src/content/MarkdownView.ts +0 -70
  38. package/src/editor/DocEditor.ts +0 -799
  39. package/src/editor/htmlToMarkdown.ts +0 -333
  40. package/src/elements/renderElement.ts +0 -598
  41. package/src/elements/types.ts +0 -119
  42. package/src/shell/Shell.ts +0 -2948
  43. package/src/shell/Sidebar.ts +0 -1651
  44. package/src/storage/AssetStore.ts +0 -86
  45. package/src/storage/BoardSerializer.ts +0 -114
  46. package/src/storage/ImportExportService.ts +0 -153
  47. package/src/storage/IndexedDbStore.ts +0 -92
  48. package/src/storage/LocalBoardStore.ts +0 -104
  49. package/src/styles.css +0 -3332
  50. package/src/templates/handoffTemplate.ts +0 -34
  51. package/src/templates/helpers.ts +0 -132
  52. package/src/templates/index.ts +0 -79
  53. package/src/templates/journeyMapTemplate.ts +0 -52
  54. package/src/templates/opportunityTreeTemplate.ts +0 -45
  55. package/src/templates/personaTemplate.ts +0 -41
  56. package/src/templates/prioritizationMatrixTemplate.ts +0 -44
  57. package/src/templates/requirementsFlowTemplate.ts +0 -45
  58. package/src/templates/screenshotReviewTemplate.ts +0 -52
  59. package/src/templates/systemDiagramTemplate.ts +0 -41
  60. package/src/templates/workflowTemplate.ts +0 -35
  61. package/src/testing/StressTestGenerator.ts +0 -134
  62. package/src/testing/StressTestPanel.ts +0 -64
  63. package/src/tools/ArrowTool.ts +0 -97
  64. package/src/tools/ImageTool.ts +0 -39
  65. package/src/tools/PanTool.ts +0 -34
  66. package/src/tools/SelectTool.ts +0 -377
  67. package/src/tools/ShapeTool.ts +0 -106
  68. package/src/tools/StickyTool.ts +0 -69
  69. package/src/tools/TaskTool.ts +0 -52
  70. package/src/tools/TextTool.ts +0 -45
  71. package/src/tools/ToolContext.ts +0 -51
  72. package/src/tools/ToolController.ts +0 -178
  73. package/src/ui/Modal.ts +0 -58
  74. package/src/ui/PerformanceOverlay.ts +0 -75
  75. package/src/ui/StorageManager.ts +0 -94
  76. package/src/ui/TemplatePicker.ts +0 -67
  77. package/src/ui/TextEditorOverlay.ts +0 -262
  78. package/src/ui/Toolbar.ts +0 -189
  79. package/src/ui/TopControls.ts +0 -137
  80. package/src/ui/icons.ts +0 -56
  81. package/tsconfig.json +0 -19
package/src/styles.css DELETED
@@ -1,3332 +0,0 @@
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
- /* Canonical project tree: every visible row receives its depth explicitly. */
1460
- .nav-tree-group,
1461
- .nav-tree-children {
1462
- margin: 0;
1463
- padding: 0;
1464
- }
1465
-
1466
- .nav-tree-row {
1467
- --tree-depth: 0;
1468
- width: 100%;
1469
- min-height: 28px;
1470
- display: flex;
1471
- align-items: center;
1472
- gap: 6px;
1473
- padding: 4px 8px 4px calc(8px + var(--tree-depth) * 16px);
1474
- border: 0;
1475
- border-radius: 6px;
1476
- background: transparent;
1477
- color: var(--text-secondary);
1478
- font: inherit;
1479
- font-size: 13px;
1480
- line-height: 1.35;
1481
- text-align: left;
1482
- text-decoration: none;
1483
- }
1484
-
1485
- button.nav-tree-row { cursor: pointer; }
1486
- .nav-tree-row:hover { background: var(--bg-hover); color: var(--text-primary); }
1487
- .nav-tree-row:focus-visible { outline: 2px solid var(--selection); outline-offset: -1px; }
1488
- .nav-tree-row.active { background: var(--bg-active); color: var(--selection); font-weight: 600; }
1489
-
1490
- .nav-tree-folder { font-weight: 550; }
1491
- .nav-tree-docs-root { color: var(--text-primary); font-weight: 650; }
1492
- .nav-tree-badge { margin-left: auto; color: var(--selection); font-size: 9px; font-weight: 700; letter-spacing: 0.06em; }
1493
- .nav-tree-doc { color: var(--text-secondary); }
1494
- .nav-tree-board { color: var(--nav-board-color); }
1495
- .nav-tree-capability { color: var(--nav-cap-color); }
1496
- .nav-tree-file,
1497
- .nav-tree-scaffold { opacity: 0.52; }
1498
- .nav-tree-file { cursor: default; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1499
- .nav-tree-scaffold:hover { opacity: 0.8; }
1500
- .nav-tree-group.collapsed > .nav-tree-row .nav-repo-chevron { transform: rotate(0deg); }
1501
-
1502
- /* A valid folder destination gets one unambiguous, local drop affordance. */
1503
- .nav-tree-group.nav-drop-target > .nav-tree-row {
1504
- position: relative;
1505
- background: color-mix(in srgb, var(--selection) 13%, var(--surface-raised));
1506
- color: var(--text-primary);
1507
- outline: 2px solid var(--selection);
1508
- outline-offset: 0;
1509
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--selection) 17%, transparent);
1510
- }
1511
-
1512
- .nav-tree-group.nav-drop-target > .nav-tree-row::after {
1513
- content: "Drop into";
1514
- margin-left: auto;
1515
- padding: 2px 6px;
1516
- border-radius: 4px;
1517
- background: var(--selection);
1518
- color: var(--bg-canvas);
1519
- font-size: 10px;
1520
- font-weight: 700;
1521
- letter-spacing: 0.03em;
1522
- text-transform: uppercase;
1523
- }
1524
-
1525
- /* After the hover delay opens a folder, show the newly revealed drop area. */
1526
- .nav-tree-group.nav-drop-target.nav-drop-auto-expanded > .nav-tree-children {
1527
- position: relative;
1528
- margin: 3px 0;
1529
- border: 1px dashed color-mix(in srgb, var(--selection) 68%, transparent);
1530
- border-radius: 5px;
1531
- background: color-mix(in srgb, var(--selection) 5%, transparent);
1532
- }
1533
-
1534
- [data-theme="dark"] .nav-link.active {
1535
- color: var(--neutral-100);
1536
- }
1537
-
1538
- /* ---------- Sidebar: inline node icons (Doc / Board / Capability) ---------- */
1539
-
1540
- .nav-node-icon {
1541
- flex: 0 0 auto;
1542
- width: 13px;
1543
- height: 13px;
1544
- margin-right: 5px;
1545
- vertical-align: middle;
1546
- fill: currentColor;
1547
- stroke: none;
1548
- opacity: 0.85;
1549
- position: relative;
1550
- top: -1px;
1551
- }
1552
-
1553
- /* Doc icons: Google Docs blue */
1554
- .nav-node-icon-doc {
1555
- fill: #4285f4;
1556
- opacity: 1;
1557
- }
1558
-
1559
- /* Board icons: purple/violet */
1560
- .nav-node-icon-board {
1561
- fill: #8b5cf6;
1562
- opacity: 1;
1563
- }
1564
-
1565
- [data-theme="dark"] .nav-node-icon-board {
1566
- fill: #a78bfa;
1567
- }
1568
-
1569
- /* Skill/Capability icons: amber/gold */
1570
- .nav-node-icon-capability {
1571
- fill: #f59e0b;
1572
- opacity: 1;
1573
- }
1574
-
1575
- [data-theme="dark"] .nav-node-icon-capability {
1576
- fill: #fbbf24;
1577
- }
1578
-
1579
- /* Board nodes: purple/violet accent */
1580
- :root {
1581
- --nav-board-color: #8b5cf6;
1582
- --nav-board-bg: rgba(139, 92, 246, 0.08);
1583
- --nav-board-bg-active: rgba(139, 92, 246, 0.15);
1584
- --nav-cap-color: #8a6800;
1585
- --nav-cap-bg: rgba(138, 104, 0, 0.08);
1586
- --nav-cap-bg-active: rgba(138, 104, 0, 0.15);
1587
- }
1588
- [data-theme="dark"] {
1589
- --nav-board-color: #a78bfa;
1590
- --nav-board-bg: rgba(167, 139, 250, 0.08);
1591
- --nav-board-bg-active: rgba(167, 139, 250, 0.14);
1592
- --nav-cap-color: #d4a800;
1593
- --nav-cap-bg: rgba(212, 168, 0, 0.08);
1594
- --nav-cap-bg-active: rgba(212, 168, 0, 0.14);
1595
- }
1596
-
1597
- .nav-link-board {
1598
- display: flex;
1599
- align-items: center;
1600
- color: var(--nav-board-color);
1601
- }
1602
- .nav-link-board:hover {
1603
- background: var(--nav-board-bg);
1604
- color: var(--nav-board-color);
1605
- }
1606
- .nav-link-board.active {
1607
- background: var(--nav-board-bg-active);
1608
- color: var(--nav-board-color);
1609
- font-weight: 600;
1610
- }
1611
-
1612
- /* Capability nodes: amber/gold accent */
1613
- .nav-link-capability {
1614
- display: flex;
1615
- align-items: center;
1616
- color: var(--nav-cap-color);
1617
- }
1618
- .nav-link-capability:hover {
1619
- background: var(--nav-cap-bg);
1620
- color: var(--nav-cap-color);
1621
- }
1622
- .nav-link-capability.active {
1623
- background: var(--nav-cap-bg-active);
1624
- color: var(--nav-cap-color);
1625
- font-weight: 600;
1626
- }
1627
-
1628
- /* "All Boards" row at the bottom of each project */
1629
- .nav-project-boards-row {
1630
- margin-top: 4px;
1631
- padding-top: 4px;
1632
- border-top: 1px solid var(--border-subtle);
1633
- }
1634
-
1635
- /* ---------- Sidebar: right-click context menu ---------- */
1636
-
1637
- .nav-context-menu {
1638
- z-index: 900;
1639
- min-width: 168px;
1640
- padding: 5px;
1641
- background: var(--surface-raised);
1642
- border: 1px solid var(--border-subtle);
1643
- border-radius: 10px;
1644
- box-shadow: var(--shadow-modal);
1645
- user-select: none;
1646
- }
1647
-
1648
- .nav-context-label {
1649
- padding: 5px 10px 4px;
1650
- font-size: 10.5px;
1651
- font-weight: 700;
1652
- letter-spacing: 0.06em;
1653
- text-transform: uppercase;
1654
- color: var(--text-secondary);
1655
- white-space: nowrap;
1656
- overflow: hidden;
1657
- text-overflow: ellipsis;
1658
- max-width: 180px;
1659
- }
1660
-
1661
- .nav-context-divider {
1662
- height: 1px;
1663
- margin: 4px 5px;
1664
- background: var(--border-subtle);
1665
- }
1666
-
1667
- .nav-context-item {
1668
- width: 100%;
1669
- display: flex;
1670
- align-items: center;
1671
- gap: 8px;
1672
- height: 32px;
1673
- padding: 0 10px;
1674
- border: 0;
1675
- border-radius: 7px;
1676
- background: transparent;
1677
- color: var(--text-primary);
1678
- font: inherit;
1679
- font-size: 13px;
1680
- text-align: left;
1681
- cursor: pointer;
1682
- white-space: nowrap;
1683
- }
1684
- .nav-context-item:hover,
1685
- .nav-context-item:focus-visible {
1686
- background: var(--bg-hover);
1687
- outline: none;
1688
- }
1689
- .nav-context-item-danger {
1690
- color: var(--danger);
1691
- }
1692
- .nav-context-item-danger:hover,
1693
- .nav-context-item-danger:focus-visible {
1694
- background: color-mix(in srgb, var(--danger) 8%, transparent);
1695
- }
1696
-
1697
- .nav-dragging {
1698
- opacity: 0.48;
1699
- cursor: grabbing !important;
1700
- }
1701
-
1702
- /* Draggable items keep pointer cursor — grab only appears during actual drag */
1703
- .nav-link[draggable="true"],
1704
- .nav-dir-toggle[draggable="true"] {
1705
- cursor: pointer;
1706
- }
1707
-
1708
- /* VS Code-style drop target - VERY obvious */
1709
- .nav-drop-target > .nav-dir-toggle,
1710
- .nav-drop-target > .nav-dir-header-row,
1711
- .nav-drop-target.nav-repo-header,
1712
- .nav-drop-target.nav-docs-root {
1713
- background: color-mix(in srgb, var(--accent) 20%, transparent) !important;
1714
- outline: 2px solid var(--accent) !important;
1715
- outline-offset: -2px;
1716
- box-shadow: inset 0 0 8px color-mix(in srgb, var(--accent) 30%, transparent);
1717
- border-radius: 6px;
1718
- position: relative;
1719
- }
1720
-
1721
- /* Pulse animation for drop target */
1722
- @keyframes dropPulse {
1723
- 0%, 100% { outline-color: var(--accent); }
1724
- 50% { outline-color: color-mix(in srgb, var(--accent) 60%, transparent); }
1725
- }
1726
-
1727
- .nav-drop-target > .nav-dir-toggle,
1728
- .nav-drop-target > .nav-dir-header-row,
1729
- .nav-drop-target.nav-repo-header,
1730
- .nav-drop-target.nav-docs-root {
1731
- animation: dropPulse 1s ease-in-out infinite;
1732
- }
1733
-
1734
- .nav-ctx-icon {
1735
- flex: 0 0 auto;
1736
- width: 16px;
1737
- height: 16px;
1738
- display: inline-flex;
1739
- align-items: center;
1740
- justify-content: center;
1741
- }
1742
- /* Fill-based icons (board, doc, capability) */
1743
- .nav-ctx-icon svg.nav-node-icon {
1744
- width: 13px;
1745
- height: 13px;
1746
- fill: currentColor;
1747
- stroke: none;
1748
- }
1749
- /* Stroke-based icons (edit, rename, trash) */
1750
- .nav-ctx-svg {
1751
- width: 14px;
1752
- height: 14px;
1753
- }
1754
-
1755
- /* Doc items in context menu */
1756
- .nav-ctx-doc { color: var(--text-secondary); }
1757
- /* Directory items */
1758
- .nav-ctx-dir { color: var(--text-secondary); }
1759
- /* Board items */
1760
- .nav-ctx-board { color: var(--nav-board-color); }
1761
- /* Capability items */
1762
- .nav-ctx-cap { color: var(--nav-cap-color); }
1763
- /* Neutral actions (edit, rename) */
1764
- .nav-ctx-edit,
1765
- .nav-ctx-rename { color: var(--text-secondary); }
1766
- /* Destructive action */
1767
- .nav-ctx-delete { color: var(--danger); }
1768
-
1769
- .content-scroll {
1770
- flex: 1 1 auto;
1771
- min-height: 0;
1772
- overflow-y: auto;
1773
- }
1774
-
1775
- .content {
1776
- max-width: 820px;
1777
- margin: 0 auto;
1778
- padding: 36px 40px 120px;
1779
- }
1780
-
1781
- .content.content-wide {
1782
- max-width: 1240px;
1783
- }
1784
-
1785
- .external-doc-eyebrow {
1786
- margin: 0 0 18px;
1787
- color: var(--text-secondary);
1788
- font-size: 12px;
1789
- font-weight: 650;
1790
- letter-spacing: 0.05em;
1791
- text-transform: uppercase;
1792
- }
1793
-
1794
- .external-repo-overview .page-bar {
1795
- align-items: flex-start;
1796
- }
1797
-
1798
- .repo-source-pill {
1799
- flex: 0 0 auto;
1800
- padding: 6px 10px;
1801
- border: 1px solid var(--border-subtle);
1802
- border-radius: 999px;
1803
- color: var(--text-secondary);
1804
- font-size: 12px;
1805
- font-weight: 600;
1806
- }
1807
-
1808
- .external-doc-dir-list {
1809
- display: grid;
1810
- gap: 22px;
1811
- }
1812
-
1813
- .external-doc-dir h2 {
1814
- margin: 0 0 10px;
1815
- color: var(--text-secondary);
1816
- font-size: 12px;
1817
- font-weight: 700;
1818
- letter-spacing: 0.05em;
1819
- text-transform: uppercase;
1820
- }
1821
-
1822
- .external-doc-file-list {
1823
- display: grid;
1824
- grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1825
- gap: 10px;
1826
- }
1827
-
1828
- .external-doc-card {
1829
- display: flex;
1830
- flex-direction: column;
1831
- gap: 4px;
1832
- min-height: 82px;
1833
- padding: 14px;
1834
- border: 1px solid var(--border-subtle);
1835
- border-radius: 8px;
1836
- background: var(--surface-raised);
1837
- color: var(--text-primary);
1838
- text-decoration: none;
1839
- transition: border-color 0.12s ease, background 0.12s ease, transform 0.12s ease;
1840
- }
1841
-
1842
- .external-doc-card:hover {
1843
- border-color: color-mix(in srgb, var(--selection) 42%, var(--border-subtle));
1844
- background: color-mix(in srgb, var(--accent) 4%, var(--surface-raised));
1845
- transform: translateY(-1px);
1846
- }
1847
-
1848
- .external-doc-card strong {
1849
- font-size: 14px;
1850
- line-height: 1.3;
1851
- }
1852
-
1853
- .external-doc-card span {
1854
- color: var(--text-secondary);
1855
- font-size: 12px;
1856
- line-height: 1.35;
1857
- overflow-wrap: anywhere;
1858
- }
1859
-
1860
- /* ---------- generic pages (boards, capabilities index) ---------- */
1861
- .page-bar {
1862
- display: flex;
1863
- align-items: center;
1864
- justify-content: space-between;
1865
- gap: 16px;
1866
- margin-bottom: 8px;
1867
- }
1868
- .page-bar h1 { margin: 0; }
1869
- .page-bar-label {
1870
- font-size: 12px;
1871
- font-weight: 600;
1872
- color: var(--text-secondary);
1873
- text-transform: uppercase;
1874
- letter-spacing: 0.05em;
1875
- }
1876
- .page-lead {
1877
- color: var(--text-secondary);
1878
- font-size: 14px;
1879
- line-height: 1.6;
1880
- margin: 4px 0 24px;
1881
- }
1882
-
1883
- .card-grid {
1884
- display: grid;
1885
- grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1886
- gap: 14px;
1887
- }
1888
- .card {
1889
- position: relative;
1890
- display: flex;
1891
- flex-direction: column;
1892
- gap: 10px;
1893
- min-height: 190px;
1894
- padding: 18px;
1895
- border: 1px solid var(--border-subtle);
1896
- border-radius: 8px;
1897
- text-decoration: none;
1898
- color: var(--text-primary);
1899
- background: var(--surface-raised);
1900
- transition: border-color 0.12s ease, background 0.12s ease, transform 0.12s ease;
1901
- }
1902
- .card:hover {
1903
- border-color: color-mix(in srgb, var(--selection) 42%, var(--border-subtle));
1904
- transform: translateY(-1px);
1905
- }
1906
- .card.selected {
1907
- border-color: color-mix(in srgb, var(--selection) 72%, var(--border-subtle));
1908
- background: color-mix(in srgb, var(--accent) 5%, var(--surface-raised));
1909
- }
1910
- .card.selected::before {
1911
- content: "";
1912
- position: absolute;
1913
- inset: 0 auto 0 0;
1914
- width: 3px;
1915
- border-radius: 8px 0 0 8px;
1916
- background: var(--selection);
1917
- }
1918
- .card-title {
1919
- max-width: 92%;
1920
- font-size: 16px;
1921
- font-weight: 650;
1922
- line-height: 1.25;
1923
- letter-spacing: 0;
1924
- }
1925
- .card-title a {
1926
- color: inherit;
1927
- text-decoration: none;
1928
- }
1929
- .card-title a:hover { color: var(--selection); }
1930
- .card-desc {
1931
- font-size: 13px;
1932
- color: var(--text-secondary);
1933
- line-height: 1.55;
1934
- }
1935
- .card-tags {
1936
- display: flex;
1937
- flex-wrap: wrap;
1938
- gap: 6px;
1939
- margin-top: auto;
1940
- }
1941
- .card-actions {
1942
- padding-top: 4px;
1943
- }
1944
- .card-actions .btn {
1945
- height: 30px;
1946
- padding: 0 11px;
1947
- border-radius: 999px;
1948
- font-size: 12px;
1949
- }
1950
- .card-actions .capability-add-btn.primary {
1951
- background: transparent;
1952
- border-color: color-mix(in srgb, var(--selection) 42%, var(--border-subtle));
1953
- color: var(--selection);
1954
- }
1955
- .card-actions .capability-add-btn.primary:hover {
1956
- background: var(--accent-soft);
1957
- }
1958
- .card-actions .capability-add-btn:not(.primary) {
1959
- border-color: transparent;
1960
- background: var(--bg-hover);
1961
- color: var(--text-secondary);
1962
- }
1963
- .tag {
1964
- font-size: 11px;
1965
- padding: 3px 8px;
1966
- border-radius: 999px;
1967
- background: var(--accent-secondary-quiet);
1968
- color: color-mix(in srgb, var(--accent-secondary) 72%, var(--text-primary));
1969
- }
1970
- .empty-note {
1971
- grid-column: 1 / -1;
1972
- padding: 32px;
1973
- text-align: center;
1974
- color: var(--text-secondary);
1975
- border: 1px dashed var(--border-subtle);
1976
- border-radius: 12px;
1977
- }
1978
-
1979
- .capability-layout {
1980
- display: grid;
1981
- grid-template-columns: minmax(0, 1fr) 300px;
1982
- gap: 28px;
1983
- align-items: start;
1984
- }
1985
-
1986
- .capability-grid {
1987
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1988
- gap: 16px;
1989
- }
1990
-
1991
- .capability-library h1 {
1992
- font-size: 32px;
1993
- letter-spacing: 0;
1994
- margin-bottom: 6px;
1995
- }
1996
-
1997
- .capability-library .page-lead {
1998
- max-width: 680px;
1999
- margin-bottom: 28px;
2000
- }
2001
-
2002
- .board-library .page-lead {
2003
- max-width: 760px;
2004
- }
2005
-
2006
- .board-grid {
2007
- grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
2008
- gap: 18px;
2009
- }
2010
-
2011
- .token-library .page-bar {
2012
- margin-bottom: 6px;
2013
- }
2014
-
2015
- .token-actions {
2016
- display: flex;
2017
- flex-wrap: wrap;
2018
- justify-content: flex-end;
2019
- gap: 8px;
2020
- }
2021
-
2022
- .token-section {
2023
- margin-top: 30px;
2024
- }
2025
-
2026
- .token-section h2 {
2027
- margin: 0 0 14px;
2028
- font-size: 17px;
2029
- font-weight: 700;
2030
- }
2031
-
2032
- .token-grid {
2033
- display: grid;
2034
- grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
2035
- gap: 12px;
2036
- }
2037
-
2038
- .token-card {
2039
- position: relative;
2040
- display: grid;
2041
- grid-template-columns: minmax(0, 1fr) 44px;
2042
- align-items: stretch;
2043
- min-height: 72px;
2044
- border: 1px solid var(--border-subtle);
2045
- border-radius: 8px;
2046
- background: var(--surface-raised);
2047
- overflow: hidden;
2048
- transition: border-color 0.12s ease, background 0.12s ease;
2049
- }
2050
-
2051
- .token-card:hover {
2052
- border-color: color-mix(in srgb, var(--selection) 36%, var(--border-subtle));
2053
- }
2054
-
2055
- .token-card.selected {
2056
- border-color: var(--brand-500);
2057
- background: color-mix(in srgb, var(--accent) 4%, var(--surface-raised));
2058
- }
2059
-
2060
- .token-card input {
2061
- position: absolute;
2062
- opacity: 0;
2063
- pointer-events: none;
2064
- }
2065
-
2066
- .token-select-zone {
2067
- display: grid;
2068
- grid-template-columns: 42px minmax(0, 1fr);
2069
- gap: 12px;
2070
- align-items: center;
2071
- padding: 10px;
2072
- cursor: pointer;
2073
- }
2074
-
2075
- .token-copy-btn {
2076
- display: flex;
2077
- align-items: center;
2078
- justify-content: center;
2079
- width: 44px;
2080
- border: none;
2081
- border-left: 1px solid var(--border-subtle);
2082
- background: transparent;
2083
- color: var(--text-secondary);
2084
- cursor: pointer;
2085
- transition: background 0.12s ease, color 0.12s ease;
2086
- }
2087
-
2088
- .token-copy-btn:hover {
2089
- background: var(--accent-soft);
2090
- color: var(--selection);
2091
- }
2092
-
2093
- .token-copy-btn:focus-visible {
2094
- outline: 2px solid var(--selection);
2095
- outline-offset: -2px;
2096
- }
2097
-
2098
- .token-copy-btn svg {
2099
- width: 17px;
2100
- height: 17px;
2101
- stroke: currentColor;
2102
- fill: none;
2103
- stroke-width: 1.8;
2104
- stroke-linecap: round;
2105
- stroke-linejoin: round;
2106
- }
2107
-
2108
- .token-swatch {
2109
- width: 42px;
2110
- height: 42px;
2111
- border: 1px solid var(--border-subtle);
2112
- border-radius: 7px;
2113
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.02);
2114
- }
2115
-
2116
- [data-theme="dark"] .card,
2117
- [data-theme="dark"] .token-card,
2118
- [data-theme="dark"] .capability-cart,
2119
- [data-theme="dark"] .command-panel,
2120
- [data-theme="dark"] .modal {
2121
- border-color: rgba(255, 255, 255, 0.08);
2122
- box-shadow: 0 1px 0 rgba(255, 255, 255, 0.025), 0 18px 48px rgba(0, 0, 0, 0.36);
2123
- }
2124
-
2125
- [data-theme="dark"] .card:hover,
2126
- [data-theme="dark"] .token-card:hover {
2127
- border-color: color-mix(in srgb, var(--accent) 38%, rgba(255, 255, 255, 0.12));
2128
- }
2129
-
2130
- [data-theme="dark"] .shell-topbar,
2131
- [data-theme="dark"] .sidebar {
2132
- border-color: rgba(255, 255, 255, 0.075);
2133
- }
2134
-
2135
- [data-theme="dark"] .nav-link.active {
2136
- background: rgba(163, 162, 126, 0.16);
2137
- color: #ffffff;
2138
- }
2139
-
2140
- [data-theme="dark"] .btn.primary {
2141
- color: #111312;
2142
- }
2143
-
2144
- .token-copy {
2145
- min-width: 0;
2146
- display: grid;
2147
- gap: 2px;
2148
- }
2149
-
2150
- .token-copy strong {
2151
- font-size: 13px;
2152
- line-height: 1.25;
2153
- }
2154
-
2155
- .token-copy code {
2156
- color: var(--text-secondary);
2157
- font: 12px/1.25 "SF Mono", ui-monospace, Menlo, monospace;
2158
- background: transparent;
2159
- }
2160
-
2161
- .token-copy small {
2162
- color: var(--text-secondary);
2163
- font-size: 11.5px;
2164
- line-height: 1.3;
2165
- }
2166
-
2167
- .capability-cart {
2168
- position: sticky;
2169
- top: 18px;
2170
- border: 1px solid var(--border-subtle);
2171
- border-radius: 8px;
2172
- background: color-mix(in srgb, var(--bg-panel) 96%, var(--bg-hover));
2173
- overflow: hidden;
2174
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.02);
2175
- }
2176
-
2177
- .capability-cart-head,
2178
- .capability-cart-actions {
2179
- display: flex;
2180
- align-items: center;
2181
- justify-content: space-between;
2182
- gap: 8px;
2183
- padding: 14px;
2184
- border-bottom: 1px solid var(--border-subtle);
2185
- }
2186
-
2187
- .capability-cart-actions {
2188
- border-top: 1px solid var(--border-subtle);
2189
- border-bottom: none;
2190
- }
2191
-
2192
- .capability-cart-head h2 {
2193
- margin: 0;
2194
- font-size: 13px;
2195
- font-weight: 650;
2196
- text-transform: uppercase;
2197
- letter-spacing: 0.04em;
2198
- color: var(--text-secondary);
2199
- }
2200
-
2201
- .capability-cart-count {
2202
- min-width: 24px;
2203
- height: 24px;
2204
- display: inline-flex;
2205
- align-items: center;
2206
- justify-content: center;
2207
- border-radius: 999px;
2208
- background: var(--accent-quiet);
2209
- color: var(--selection);
2210
- font-size: 12px;
2211
- font-weight: 700;
2212
- }
2213
-
2214
- .capability-cart-body {
2215
- display: flex;
2216
- flex-direction: column;
2217
- gap: 4px;
2218
- max-height: 420px;
2219
- overflow-y: auto;
2220
- padding: 8px;
2221
- }
2222
-
2223
- .capability-cart-empty {
2224
- padding: 22px 12px;
2225
- color: var(--text-secondary);
2226
- font-size: 12.5px;
2227
- line-height: 1.5;
2228
- }
2229
-
2230
- .capability-cart-item {
2231
- display: flex;
2232
- align-items: flex-start;
2233
- justify-content: space-between;
2234
- gap: 10px;
2235
- padding: 10px;
2236
- border-radius: 8px;
2237
- background: var(--surface-raised);
2238
- border: 1px solid transparent;
2239
- }
2240
-
2241
- .capability-cart-item:hover {
2242
- border-color: var(--border-subtle);
2243
- }
2244
-
2245
- .capability-cart-item-title {
2246
- font-size: 13px;
2247
- font-weight: 600;
2248
- line-height: 1.35;
2249
- }
2250
-
2251
- .capability-cart-item-meta {
2252
- margin-top: 2px;
2253
- font-size: 11px;
2254
- color: var(--text-secondary);
2255
- line-height: 1.35;
2256
- }
2257
-
2258
- .capability-cart-remove {
2259
- border: none;
2260
- background: transparent;
2261
- color: var(--text-secondary);
2262
- font-size: 11.5px;
2263
- cursor: pointer;
2264
- padding: 1px 0;
2265
- }
2266
-
2267
- .capability-cart-remove:hover {
2268
- color: var(--danger);
2269
- }
2270
-
2271
- /* ---------- markdown body ---------- */
2272
- .markdown-body { font-size: 15px; line-height: 1.7; color: var(--text-primary); }
2273
- .markdown-body h1 { font-size: 30px; font-weight: 700; margin: 8px 0 20px; letter-spacing: -0.015em; }
2274
- .markdown-body h2 {
2275
- font-size: 22px;
2276
- font-weight: 650;
2277
- margin: 36px 0 14px;
2278
- padding-bottom: 8px;
2279
- border-bottom: 1px solid var(--border-subtle);
2280
- }
2281
- .markdown-body h3 { font-size: 17px; font-weight: 650; margin: 26px 0 10px; }
2282
- .markdown-body h4 { font-size: 15px; font-weight: 650; margin: 20px 0 8px; }
2283
- .markdown-body p { margin: 14px 0; }
2284
- .markdown-body a { color: var(--selection); text-decoration: none; }
2285
- .markdown-body a:hover { text-decoration: underline; }
2286
- .markdown-body ul, .markdown-body ol { margin: 14px 0; padding-left: 26px; }
2287
- .markdown-body li { margin: 5px 0; }
2288
- .markdown-body li.task { list-style: none; margin-left: -22px; }
2289
- .markdown-body li.task input { margin-right: 8px; }
2290
- .markdown-body blockquote {
2291
- margin: 16px 0;
2292
- padding: 4px 16px;
2293
- border-left: 3px solid var(--selection);
2294
- background: var(--bg-hover);
2295
- border-radius: 0 8px 8px 0;
2296
- color: var(--text-secondary);
2297
- }
2298
- .markdown-body code {
2299
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
2300
- font-size: 0.86em;
2301
- background: var(--bg-hover);
2302
- padding: 2px 6px;
2303
- border-radius: 5px;
2304
- }
2305
- .markdown-body pre.code-block {
2306
- margin: 16px 0;
2307
- padding: 16px;
2308
- background: var(--bg-hover);
2309
- border: 1px solid var(--border-subtle);
2310
- border-radius: 10px;
2311
- overflow-x: auto;
2312
- }
2313
- .markdown-body pre.code-block code { background: none; padding: 0; font-size: 13px; line-height: 1.6; }
2314
- .markdown-body img { max-width: 100%; border-radius: 8px; }
2315
- .markdown-body hr { border: none; border-top: 1px solid var(--border-subtle); margin: 32px 0; }
2316
- .markdown-body table {
2317
- width: 100%;
2318
- border-collapse: collapse;
2319
- margin: 18px 0;
2320
- font-size: 13.5px;
2321
- }
2322
- .markdown-body th, .markdown-body td {
2323
- border: 1px solid var(--border-subtle);
2324
- padding: 8px 12px;
2325
- text-align: left;
2326
- }
2327
- .markdown-body th { background: var(--bg-hover); font-weight: 600; }
2328
- .markdown-body .md-error {
2329
- margin: 16px 0;
2330
- padding: 14px 16px;
2331
- border: 1px solid #ef4444;
2332
- border-radius: 10px;
2333
- background: rgba(239, 68, 68, 0.08);
2334
- color: var(--text-primary);
2335
- }
2336
- .markdown-body .md-error pre {
2337
- margin: 8px 0 0;
2338
- font-size: 12px;
2339
- white-space: pre-wrap;
2340
- color: var(--text-secondary);
2341
- }
2342
-
2343
- /* ---------- board embeds in markdown ---------- */
2344
- .board-embed { margin: 24px 0; }
2345
- .board-embed-frame {
2346
- position: relative;
2347
- width: 100%;
2348
- border: 1px solid var(--border-subtle);
2349
- border-radius: 12px;
2350
- overflow: hidden;
2351
- background: var(--bg-canvas);
2352
- box-shadow: var(--shadow-soft);
2353
- display: flex;
2354
- align-items: center;
2355
- justify-content: center;
2356
- }
2357
- .board-embed-frame canvas { display: block; }
2358
- .board-embed-frame.error { color: var(--text-secondary); font-size: 13px; }
2359
- .board-embed-msg { padding: 24px; }
2360
- .board-embed-open {
2361
- position: absolute;
2362
- bottom: 10px;
2363
- right: 10px;
2364
- padding: 5px 10px;
2365
- font-size: 12px;
2366
- font-weight: 500;
2367
- border-radius: 8px;
2368
- background: var(--bg-toolbar);
2369
- backdrop-filter: blur(10px);
2370
- border: 1px solid var(--border-subtle);
2371
- color: var(--text-primary);
2372
- text-decoration: none;
2373
- opacity: 0;
2374
- transition: opacity 0.15s ease;
2375
- }
2376
- .board-embed-frame:hover .board-embed-open { opacity: 1; }
2377
- .board-embed figcaption {
2378
- margin-top: 8px;
2379
- font-size: 12.5px;
2380
- color: var(--text-secondary);
2381
- text-align: center;
2382
- }
2383
-
2384
- /* ---------- board editor (full-screen mode) ---------- */
2385
- .board-editor-host { position: fixed; inset: 0; z-index: 500; }
2386
-
2387
- /* "← Docs" button sits to the left of the title in the top-left cluster */
2388
- .top-left .back-btn {
2389
- height: 40px;
2390
- width: auto;
2391
- gap: 6px;
2392
- padding: 0 12px;
2393
- background: var(--bg-toolbar);
2394
- backdrop-filter: blur(16px);
2395
- border: 1px solid var(--border-subtle);
2396
- box-shadow: var(--shadow-soft);
2397
- font-size: 13px;
2398
- font-weight: 500;
2399
- }
2400
- .top-left .back-btn span { line-height: 1; }
2401
-
2402
- /* drag-to-select embed overlay */
2403
- .embed-select-overlay {
2404
- position: fixed;
2405
- inset: 0;
2406
- z-index: 1000;
2407
- cursor: crosshair;
2408
- background: rgba(15, 23, 42, 0.18);
2409
- }
2410
- .embed-select-rect {
2411
- position: absolute;
2412
- border: 1.5px solid var(--selection);
2413
- background: color-mix(in srgb, var(--selection) 16%, transparent);
2414
- box-shadow: 0 0 0 9999px rgba(15, 23, 42, 0.12);
2415
- pointer-events: none;
2416
- }
2417
- .embed-select-hint {
2418
- position: fixed;
2419
- top: 16px;
2420
- left: 50%;
2421
- transform: translateX(-50%);
2422
- padding: 8px 14px;
2423
- border-radius: 10px;
2424
- font-size: 13px;
2425
- font-weight: 500;
2426
- color: #fff;
2427
- background: rgba(15, 23, 42, 0.82);
2428
- pointer-events: none;
2429
- }
2430
-
2431
- /* ---------- doc page actions + embed chips ---------- */
2432
- .doc-page { position: relative; }
2433
- .doc-actions {
2434
- display: flex;
2435
- justify-content: flex-end;
2436
- gap: 8px;
2437
- margin-bottom: 8px;
2438
- }
2439
- /* Subtle, elegant edit affordance: grey border + grey text. */
2440
- .btn.doc-edit {
2441
- background: transparent;
2442
- border-color: var(--border-subtle);
2443
- color: var(--text-secondary);
2444
- font-weight: 500;
2445
- }
2446
- .btn.doc-edit:hover {
2447
- background: var(--bg-hover);
2448
- color: var(--text-primary);
2449
- }
2450
-
2451
- .capability-doc-actions {
2452
- align-items: center;
2453
- }
2454
-
2455
- .capability-doc-actions .capability-detail-btn,
2456
- .capability-doc-actions .capability-detail-btn.primary {
2457
- height: 34px;
2458
- padding: 0 13px;
2459
- border-radius: 999px;
2460
- background: transparent;
2461
- border-color: color-mix(in srgb, var(--selection) 34%, var(--border-subtle));
2462
- color: var(--text-primary);
2463
- font-size: 12.5px;
2464
- font-weight: 500;
2465
- }
2466
-
2467
- .capability-doc-actions .capability-detail-btn:hover,
2468
- .capability-doc-actions .capability-detail-btn.primary:hover {
2469
- background: var(--accent-soft);
2470
- color: var(--text-primary);
2471
- }
2472
-
2473
- .capability-doc-actions .capability-detail-btn.is-selected {
2474
- background: var(--accent-secondary);
2475
- border-color: var(--accent-secondary);
2476
- color: #fff;
2477
- }
2478
-
2479
- .capability-doc-actions .capability-detail-btn.is-selected:hover {
2480
- background: color-mix(in srgb, var(--accent-secondary) 88%, #000);
2481
- color: #fff;
2482
- }
2483
- .markdown-body figure.board-embed.embed-chip {
2484
- display: flex;
2485
- align-items: center;
2486
- gap: 8px;
2487
- padding: 12px 16px;
2488
- border: 1px dashed var(--border-subtle);
2489
- border-radius: 10px;
2490
- background: var(--bg-hover);
2491
- color: var(--text-secondary);
2492
- font-size: 13px;
2493
- user-select: none;
2494
- cursor: pointer;
2495
- outline: none;
2496
- }
2497
- .markdown-body figure.board-embed.embed-chip:hover,
2498
- .markdown-body figure.board-embed.embed-chip.selected,
2499
- .markdown-body figure.board-embed.embed-chip:focus {
2500
- border-color: color-mix(in srgb, var(--selection) 54%, var(--border-subtle));
2501
- background: var(--accent-soft);
2502
- color: var(--text-primary);
2503
- }
2504
- .embed-chip-icon { font-size: 15px; }
2505
- .embed-chip-remove {
2506
- margin-left: auto;
2507
- color: var(--text-secondary);
2508
- font-size: 12px;
2509
- font-weight: 600;
2510
- opacity: 0;
2511
- transition: opacity 0.12s ease;
2512
- }
2513
- .embed-chip:hover .embed-chip-remove,
2514
- .embed-chip.selected .embed-chip-remove,
2515
- .embed-chip:focus .embed-chip-remove {
2516
- opacity: 0.85;
2517
- }
2518
- .doc-editor-surface .embed-caret-spacer {
2519
- min-height: 1.35em;
2520
- }
2521
-
2522
- /* ---------- doc editor (WYSIWYG) ---------- */
2523
- .doc-editor {
2524
- position: fixed;
2525
- inset: 0;
2526
- z-index: 700;
2527
- display: flex;
2528
- flex-direction: column;
2529
- background: var(--bg-canvas);
2530
- }
2531
- .doc-editor-bar {
2532
- display: flex;
2533
- align-items: center;
2534
- justify-content: space-between;
2535
- gap: 16px;
2536
- padding: 10px 16px;
2537
- border-bottom: 1px solid var(--border-subtle);
2538
- background: var(--bg-canvas);
2539
- }
2540
- .doc-editor-bar-left { display: flex; align-items: center; gap: 12px; min-width: 0; }
2541
- .doc-editor-done {
2542
- padding: 7px 16px;
2543
- border: 1px solid var(--border-subtle);
2544
- background: transparent;
2545
- color: var(--text-secondary);
2546
- border-radius: 8px;
2547
- font-size: 13px;
2548
- font-weight: 500;
2549
- cursor: pointer;
2550
- transition: background 0.12s ease, color 0.12s ease;
2551
- }
2552
- .doc-editor-done:hover {
2553
- background: var(--bg-hover);
2554
- color: var(--text-primary);
2555
- }
2556
- .doc-editor-path {
2557
- font-size: 12.5px;
2558
- color: var(--text-secondary);
2559
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
2560
- overflow: hidden;
2561
- text-overflow: ellipsis;
2562
- white-space: nowrap;
2563
- }
2564
- /* Quiet, ambient indicator: only an error is allowed to stand out. */
2565
- .doc-editor-status {
2566
- font-size: 12px;
2567
- color: var(--text-secondary);
2568
- opacity: 0.6;
2569
- white-space: nowrap;
2570
- }
2571
- .doc-editor-status[data-state="error"] {
2572
- color: var(--danger);
2573
- opacity: 1;
2574
- font-weight: 600;
2575
- }
2576
-
2577
- .doc-editor-toolbar {
2578
- display: flex;
2579
- flex-wrap: wrap;
2580
- align-items: center;
2581
- gap: 6px;
2582
- padding: 7px 16px;
2583
- border-bottom: 1px solid var(--border-subtle);
2584
- background: var(--bg-canvas);
2585
- position: sticky;
2586
- top: 0;
2587
- z-index: 1;
2588
- }
2589
- .doc-editor-tb-group {
2590
- display: flex;
2591
- align-items: center;
2592
- gap: 3px;
2593
- padding: 3px;
2594
- border: 1px solid var(--border-subtle);
2595
- border-radius: 10px;
2596
- background: color-mix(in srgb, var(--surface-raised) 72%, transparent);
2597
- }
2598
- .doc-editor-tb-btn {
2599
- display: inline-flex;
2600
- align-items: center;
2601
- justify-content: center;
2602
- min-width: 32px;
2603
- height: 32px;
2604
- padding: 0 8px;
2605
- border: none;
2606
- border-radius: 8px;
2607
- background: transparent;
2608
- color: var(--text-secondary);
2609
- font-size: 13px;
2610
- font-weight: 600;
2611
- cursor: pointer;
2612
- transition: background 0.12s ease, color 0.12s ease;
2613
- }
2614
- .doc-editor-tb-btn:hover {
2615
- background: var(--bg-hover);
2616
- color: var(--text-primary);
2617
- }
2618
- .doc-editor-tb-btn.active {
2619
- background: var(--accent-secondary-quiet);
2620
- color: var(--text-primary);
2621
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent-secondary) 28%, transparent);
2622
- }
2623
- .doc-editor-tb-btn:focus-visible {
2624
- outline: 2px solid var(--selection);
2625
- outline-offset: 2px;
2626
- }
2627
- .doc-editor-tb-btn.icon svg {
2628
- width: 17px;
2629
- height: 17px;
2630
- stroke: currentColor;
2631
- fill: none;
2632
- stroke-width: 1.8;
2633
- stroke-linecap: round;
2634
- stroke-linejoin: round;
2635
- }
2636
-
2637
- .doc-editor-scroll {
2638
- flex: 1 1 auto;
2639
- overflow-y: auto;
2640
- }
2641
- .doc-editor-surface {
2642
- max-width: 820px;
2643
- margin: 0 auto;
2644
- padding: 36px 40px 160px;
2645
- min-height: 100%;
2646
- outline: none;
2647
- background: transparent;
2648
- }
2649
- .doc-editor-surface:focus { outline: none; }
2650
- .doc-editor-surface img { cursor: default; }
2651
- .doc-editor-surface:empty::before {
2652
- content: "Start writing...";
2653
- color: var(--text-secondary);
2654
- opacity: 0.55;
2655
- }
2656
- .doc-editor-surface a {
2657
- cursor: text;
2658
- }
2659
- .doc-editor-surface pre.code-block {
2660
- position: relative;
2661
- }
2662
- .doc-editor-surface pre.code-block:focus-within {
2663
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--selection) 34%, transparent);
2664
- }
2665
-
2666
- /* ============================================================
2667
- Breadcrumb
2668
- ============================================================ */
2669
-
2670
- .breadcrumb {
2671
- display: flex;
2672
- align-items: center;
2673
- flex-wrap: wrap;
2674
- gap: 4px;
2675
- margin-bottom: 20px;
2676
- font-size: 12px;
2677
- font-weight: 500;
2678
- color: var(--text-secondary);
2679
- }
2680
-
2681
- .breadcrumb-link {
2682
- color: var(--text-secondary);
2683
- text-decoration: none;
2684
- padding: 2px 4px;
2685
- border-radius: 4px;
2686
- transition: color 0.1s ease, background 0.1s ease;
2687
- }
2688
- .breadcrumb-link:hover {
2689
- color: var(--text-primary);
2690
- background: var(--bg-hover);
2691
- }
2692
-
2693
- .breadcrumb-sep {
2694
- color: var(--text-secondary);
2695
- opacity: 0.4;
2696
- user-select: none;
2697
- padding: 0 2px;
2698
- }
2699
-
2700
- .breadcrumb-current {
2701
- color: var(--text-primary);
2702
- font-weight: 600;
2703
- }
2704
-
2705
- /* ============================================================
2706
- Page prev / next navigation
2707
- ============================================================ */
2708
-
2709
- .page-nav {
2710
- display: flex;
2711
- align-items: stretch;
2712
- justify-content: space-between;
2713
- gap: 12px;
2714
- margin-top: 56px;
2715
- padding-top: 20px;
2716
- border-top: 1px solid var(--border-subtle);
2717
- }
2718
-
2719
- .page-nav-prev,
2720
- .page-nav-next {
2721
- display: flex;
2722
- align-items: center;
2723
- gap: 10px;
2724
- padding: 12px 16px;
2725
- border: 1px solid var(--border-subtle);
2726
- border-radius: 10px;
2727
- text-decoration: none;
2728
- color: var(--text-secondary);
2729
- background: var(--surface-raised);
2730
- font-size: 13px;
2731
- font-weight: 500;
2732
- min-width: 0;
2733
- max-width: 48%;
2734
- transition: border-color 0.12s ease, background 0.12s ease, color 0.12s ease;
2735
- }
2736
- .page-nav-prev:hover,
2737
- .page-nav-next:hover {
2738
- border-color: color-mix(in srgb, var(--selection) 45%, var(--border-subtle));
2739
- background: var(--bg-hover);
2740
- color: var(--text-primary);
2741
- }
2742
-
2743
- .page-nav-prev { margin-right: auto; }
2744
- .page-nav-next { margin-left: auto; flex-direction: row-reverse; }
2745
-
2746
- .page-nav-label {
2747
- overflow: hidden;
2748
- text-overflow: ellipsis;
2749
- white-space: nowrap;
2750
- min-width: 0;
2751
- }
2752
-
2753
- .page-nav-arrow {
2754
- flex: 0 0 auto;
2755
- font-size: 15px;
2756
- line-height: 1;
2757
- color: var(--text-secondary);
2758
- transition: color 0.12s ease;
2759
- }
2760
- .page-nav-prev:hover .page-nav-arrow,
2761
- .page-nav-next:hover .page-nav-arrow {
2762
- color: var(--text-primary);
2763
- }
2764
-
2765
- .page-nav-spacer { flex: 1; }
2766
-
2767
- /* ============================================================
2768
- Sidebar docs mode
2769
- ============================================================ */
2770
-
2771
- /* Brand button — same look as a link, activates on click */
2772
- .sidebar-brand {
2773
- border: none;
2774
- background: none;
2775
- cursor: pointer;
2776
- font-size: 17px;
2777
- font-weight: 700;
2778
- letter-spacing: -0.01em;
2779
- color: var(--text-primary);
2780
- text-decoration: none;
2781
- padding: 0;
2782
- transition: color 0.12s ease;
2783
- }
2784
- .sidebar-brand:hover { color: var(--selection); }
2785
- .sidebar-brand:focus-visible {
2786
- outline: 2px solid var(--selection);
2787
- outline-offset: 3px;
2788
- border-radius: 4px;
2789
- }
2790
-
2791
- /* Docs mode: brand gets an active indicator */
2792
- .sidebar-docs-mode .sidebar-brand {
2793
- color: var(--selection);
2794
- }
2795
- .sidebar-docs-mode .sidebar-brand::after {
2796
- content: " ·";
2797
- opacity: 0.4;
2798
- }
2799
-
2800
- /* Back row */
2801
- .docs-mode-back-row {
2802
- padding: 8px 0 4px;
2803
- }
2804
- .docs-mode-back {
2805
- display: flex;
2806
- align-items: center;
2807
- gap: 6px;
2808
- border: none;
2809
- background: none;
2810
- cursor: pointer;
2811
- font-size: 12px;
2812
- font-weight: 600;
2813
- color: var(--text-secondary);
2814
- padding: 5px 8px;
2815
- border-radius: 7px;
2816
- width: 100%;
2817
- text-align: left;
2818
- transition: background 0.1s ease, color 0.1s ease;
2819
- }
2820
- .docs-mode-back:hover { background: var(--bg-hover); color: var(--text-primary); }
2821
- .docs-mode-back svg {
2822
- width: 12px;
2823
- height: 12px;
2824
- flex: 0 0 auto;
2825
- }
2826
-
2827
- /* Docs mode tree — auto-expanded, slight indent */
2828
- .docs-mode-tree { padding-left: 0; }
2829
-
2830
- /* ============================================================
2831
- Home page — two-column: guide + workspace panel
2832
- ============================================================ */
2833
-
2834
- .home-page { padding-top: 8px; }
2835
-
2836
- .home-layout {
2837
- display: grid;
2838
- grid-template-columns: minmax(0, 1fr) 300px;
2839
- gap: 36px;
2840
- align-items: start;
2841
- }
2842
-
2843
- /* ── Guide (left) ── */
2844
- .home-guide { min-width: 0; }
2845
-
2846
- .home-hero-title {
2847
- font-size: 30px;
2848
- font-weight: 750;
2849
- letter-spacing: -0.02em;
2850
- line-height: 1.1;
2851
- margin: 0 0 8px;
2852
- color: var(--text-primary);
2853
- }
2854
- .home-hero-sub {
2855
- font-size: 14px;
2856
- line-height: 1.65;
2857
- color: var(--text-secondary);
2858
- margin: 0 0 32px;
2859
- }
2860
-
2861
- /* Feature sections */
2862
- .home-feature {
2863
- margin-bottom: 28px;
2864
- padding-bottom: 28px;
2865
- border-bottom: 1px solid var(--border-subtle);
2866
- }
2867
- .home-feature:last-of-type { border-bottom: none; }
2868
-
2869
- .home-feature-header { margin-bottom: 8px; }
2870
-
2871
- .home-feature-badge {
2872
- display: inline-block;
2873
- padding: 2px 10px;
2874
- border-radius: 999px;
2875
- font-size: 11px;
2876
- font-weight: 700;
2877
- letter-spacing: 0.05em;
2878
- text-transform: uppercase;
2879
- border: 1px solid var(--border-subtle);
2880
- background: var(--accent-soft);
2881
- color: var(--text-secondary);
2882
- }
2883
- .home-feature-badge-board {
2884
- background: var(--nav-board-bg);
2885
- color: var(--nav-board-color);
2886
- border-color: color-mix(in srgb, var(--nav-board-color) 25%, var(--border-subtle));
2887
- }
2888
- .home-feature-badge-capability {
2889
- background: var(--nav-cap-bg);
2890
- color: var(--nav-cap-color);
2891
- border-color: color-mix(in srgb, var(--nav-cap-color) 25%, var(--border-subtle));
2892
- }
2893
- .home-feature-badge-doc {
2894
- background: var(--accent-soft);
2895
- color: var(--text-secondary);
2896
- }
2897
-
2898
- .home-feature-body {
2899
- font-size: 13.5px;
2900
- line-height: 1.65;
2901
- color: var(--text-secondary);
2902
- margin: 0 0 10px;
2903
- }
2904
-
2905
- .home-feature-list {
2906
- margin: 0;
2907
- padding-left: 18px;
2908
- display: flex;
2909
- flex-direction: column;
2910
- gap: 4px;
2911
- }
2912
- .home-feature-list li {
2913
- font-size: 13px;
2914
- line-height: 1.55;
2915
- color: var(--text-secondary);
2916
- }
2917
-
2918
- /* Shortcut table */
2919
- .home-shortcut-title {
2920
- font-size: 11px;
2921
- font-weight: 700;
2922
- letter-spacing: 0.07em;
2923
- text-transform: uppercase;
2924
- color: var(--text-secondary);
2925
- margin: 32px 0 10px;
2926
- }
2927
- .home-shortcut-table {
2928
- display: grid;
2929
- gap: 1px;
2930
- background: var(--border-subtle);
2931
- border: 1px solid var(--border-subtle);
2932
- border-radius: 10px;
2933
- overflow: hidden;
2934
- }
2935
- .home-shortcut-row {
2936
- display: flex;
2937
- align-items: center;
2938
- gap: 16px;
2939
- padding: 7px 12px;
2940
- background: var(--surface-raised);
2941
- }
2942
- .home-shortcut-row:hover { background: var(--bg-hover); }
2943
- .home-shortcut-key {
2944
- flex: 0 0 auto;
2945
- min-width: 200px;
2946
- font: 11.5px/1.4 "SF Mono", ui-monospace, Menlo, monospace;
2947
- color: var(--text-primary);
2948
- background: transparent;
2949
- border: none;
2950
- padding: 0;
2951
- }
2952
- .home-shortcut-desc {
2953
- font-size: 12.5px;
2954
- color: var(--text-secondary);
2955
- }
2956
-
2957
- /* ── Workspace panel (right) ── */
2958
- .home-panel {
2959
- position: sticky;
2960
- top: 24px;
2961
- border: 1px solid var(--border-subtle);
2962
- border-radius: 12px;
2963
- background: var(--surface-raised);
2964
- overflow: hidden;
2965
- }
2966
-
2967
- .home-panel-head {
2968
- display: flex;
2969
- align-items: center;
2970
- justify-content: space-between;
2971
- padding: 12px 14px;
2972
- border-bottom: 1px solid var(--border-subtle);
2973
- }
2974
- .home-panel-title {
2975
- font-size: 11px;
2976
- font-weight: 700;
2977
- letter-spacing: 0.07em;
2978
- text-transform: uppercase;
2979
- color: var(--text-secondary);
2980
- }
2981
- .home-panel-add {
2982
- padding: 4px 10px;
2983
- font-size: 12px;
2984
- height: auto;
2985
- }
2986
-
2987
- .home-panel-empty {
2988
- padding: 20px 14px;
2989
- font-size: 13px;
2990
- color: var(--text-secondary);
2991
- line-height: 1.5;
2992
- }
2993
-
2994
- /* Per-project block inside panel */
2995
- .home-panel-project {
2996
- border-bottom: 1px solid var(--border-subtle);
2997
- }
2998
- .home-panel-project:last-child { border-bottom: none; }
2999
-
3000
- .home-panel-project-head {
3001
- display: flex;
3002
- align-items: baseline;
3003
- justify-content: space-between;
3004
- gap: 10px;
3005
- padding: 10px 14px 6px;
3006
- text-decoration: none;
3007
- border-bottom: 1px solid var(--border-subtle);
3008
- transition: background 0.1s ease;
3009
- }
3010
- .home-panel-project-head:hover { background: var(--bg-hover); }
3011
-
3012
- .home-panel-project-name {
3013
- font-size: 13px;
3014
- font-weight: 650;
3015
- color: var(--text-primary);
3016
- min-width: 0;
3017
- overflow: hidden;
3018
- text-overflow: ellipsis;
3019
- white-space: nowrap;
3020
- }
3021
- .home-panel-project-meta {
3022
- flex: 0 0 auto;
3023
- font-size: 11px;
3024
- color: var(--text-secondary);
3025
- white-space: nowrap;
3026
- }
3027
-
3028
- /* Root rows inside a project block */
3029
- .home-panel-roots { display: flex; flex-direction: column; }
3030
-
3031
- .home-panel-root {
3032
- display: flex;
3033
- align-items: baseline;
3034
- justify-content: space-between;
3035
- gap: 8px;
3036
- padding: 5px 14px;
3037
- text-decoration: none;
3038
- transition: background 0.1s ease;
3039
- border-bottom: 1px solid color-mix(in srgb, var(--border-subtle) 50%, transparent);
3040
- }
3041
- .home-panel-root:last-of-type { border-bottom: none; }
3042
- .home-panel-root:hover { background: var(--bg-hover); }
3043
-
3044
- .home-panel-root-path {
3045
- font-size: 11.5px;
3046
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
3047
- color: var(--text-secondary);
3048
- min-width: 0;
3049
- overflow: hidden;
3050
- text-overflow: ellipsis;
3051
- white-space: nowrap;
3052
- }
3053
- .home-panel-root:hover .home-panel-root-path { color: var(--text-primary); }
3054
-
3055
- .home-panel-root-meta {
3056
- flex: 0 0 auto;
3057
- font-size: 10.5px;
3058
- color: var(--text-secondary);
3059
- opacity: 0.7;
3060
- white-space: nowrap;
3061
- }
3062
-
3063
- .home-panel-more {
3064
- display: block;
3065
- padding: 6px 14px 8px;
3066
- font-size: 11.5px;
3067
- color: var(--text-secondary);
3068
- text-decoration: none;
3069
- }
3070
- .home-panel-more:hover { color: var(--text-primary); }
3071
-
3072
- /* ── Wiki link button in sidebar project header ── */
3073
- .nav-repo-label-text {
3074
- flex: 1 1 auto;
3075
- min-width: 0;
3076
- overflow: hidden;
3077
- text-overflow: ellipsis;
3078
- white-space: nowrap;
3079
- }
3080
- .nav-repo-wiki-link {
3081
- flex: 0 0 auto;
3082
- display: inline-flex;
3083
- align-items: center;
3084
- justify-content: center;
3085
- width: 20px;
3086
- height: 20px;
3087
- border-radius: 5px;
3088
- color: var(--text-secondary);
3089
- opacity: 0;
3090
- transition: opacity 0.12s ease, background 0.12s ease;
3091
- text-decoration: none;
3092
- }
3093
- .nav-repo-header:hover .nav-repo-wiki-link,
3094
- .nav-dir-toggle:hover .nav-repo-wiki-link,
3095
- .nav-dir-header-row:hover .nav-dir-wiki-link,
3096
- .nav-repo-wiki-link:focus-visible {
3097
- opacity: 1;
3098
- }
3099
-
3100
- /* Wiki links next to path-segment directories — show on hover */
3101
- .nav-dir-project ~ .nav-dir-wiki-link {
3102
- opacity: 0;
3103
- }
3104
-
3105
- .nav-dir-header-row:hover .nav-dir-project ~ .nav-dir-wiki-link {
3106
- opacity: 0.7;
3107
- }
3108
- .nav-repo-wiki-link:hover { background: var(--bg-active); color: var(--text-primary); }
3109
- .nav-repo-wiki-link svg { width: 12px; height: 12px; }
3110
-
3111
- /* ============================================================
3112
- Project wiki page
3113
- ============================================================ */
3114
-
3115
- .wiki-page { padding-top: 4px; }
3116
-
3117
- .wiki-head {
3118
- margin-bottom: 28px;
3119
- padding-bottom: 20px;
3120
- border-bottom: 1px solid var(--border-subtle);
3121
- }
3122
- .wiki-back {
3123
- display: inline-block;
3124
- font-size: 12px;
3125
- color: var(--text-secondary);
3126
- text-decoration: none;
3127
- margin-bottom: 10px;
3128
- }
3129
- .wiki-back:hover { color: var(--text-primary); }
3130
-
3131
- .wiki-title {
3132
- font-size: 26px;
3133
- font-weight: 750;
3134
- letter-spacing: -0.01em;
3135
- margin: 0 0 16px;
3136
- }
3137
-
3138
- .wiki-stats {
3139
- display: flex;
3140
- gap: 24px;
3141
- flex-wrap: wrap;
3142
- }
3143
- .wiki-stat { text-align: left; }
3144
- .wiki-stat-val {
3145
- font-size: 22px;
3146
- font-weight: 700;
3147
- font-variant-numeric: tabular-nums;
3148
- color: var(--text-primary);
3149
- line-height: 1;
3150
- }
3151
- .wiki-stat-label {
3152
- font-size: 11px;
3153
- color: var(--text-secondary);
3154
- margin-top: 2px;
3155
- text-transform: uppercase;
3156
- letter-spacing: 0.05em;
3157
- font-weight: 600;
3158
- }
3159
-
3160
- /* Per-root section */
3161
- .wiki-root-section {
3162
- margin-bottom: 24px;
3163
- padding-bottom: 24px;
3164
- border-bottom: 1px solid var(--border-subtle);
3165
- }
3166
- .wiki-root-section:last-child { border-bottom: none; }
3167
-
3168
- .wiki-root-head { margin-bottom: 12px; }
3169
- .wiki-root-path {
3170
- font-size: 12px;
3171
- font-weight: 700;
3172
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
3173
- color: var(--text-secondary);
3174
- letter-spacing: 0.01em;
3175
- }
3176
-
3177
- .wiki-root-empty {
3178
- font-size: 12px;
3179
- color: var(--text-secondary);
3180
- font-style: italic;
3181
- }
3182
-
3183
- /* Three-column layout per root */
3184
- .wiki-root-cols {
3185
- display: grid;
3186
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
3187
- gap: 16px;
3188
- }
3189
-
3190
- .wiki-col-head {
3191
- font-size: 10.5px;
3192
- font-weight: 700;
3193
- letter-spacing: 0.06em;
3194
- text-transform: uppercase;
3195
- color: var(--text-secondary);
3196
- margin-bottom: 6px;
3197
- padding-bottom: 5px;
3198
- border-bottom: 1px solid var(--border-subtle);
3199
- }
3200
-
3201
- .wiki-col-list {
3202
- display: flex;
3203
- flex-direction: column;
3204
- gap: 1px;
3205
- }
3206
-
3207
- .wiki-col-item {
3208
- display: block;
3209
- padding: 4px 6px;
3210
- border-radius: 5px;
3211
- font-size: 12.5px;
3212
- text-decoration: none;
3213
- color: var(--text-secondary);
3214
- transition: background 0.1s ease, color 0.1s ease;
3215
- text-transform: capitalize;
3216
- }
3217
- .wiki-col-item:hover {
3218
- background: var(--bg-hover);
3219
- color: var(--text-primary);
3220
- }
3221
- .wiki-col-item-board { color: var(--nav-board-color); }
3222
- .wiki-col-item-board:hover { background: var(--nav-board-bg); color: var(--nav-board-color); }
3223
- .wiki-col-item-cap { color: var(--nav-cap-color); }
3224
- .wiki-col-item-cap:hover { background: var(--nav-cap-bg); color: var(--nav-cap-color); }
3225
-
3226
- .wiki-col-item-path {
3227
- display: block;
3228
- font-size: 10.5px;
3229
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
3230
- color: var(--text-secondary);
3231
- opacity: 0.6;
3232
- margin-top: 1px;
3233
- }
3234
-
3235
- @media (max-width: 720px) {
3236
- .sidebar { flex-basis: 220px; width: 220px; }
3237
- .shell-topbar { padding: 10px 12px; }
3238
- .topbar-search {
3239
- width: auto;
3240
- flex: 1 1 auto;
3241
- }
3242
- .topbar-search kbd { display: none; }
3243
- .topbar-edit span { display: none; }
3244
- .topbar-edit {
3245
- width: 34px;
3246
- padding: 0;
3247
- justify-content: center;
3248
- }
3249
- .capability-layout {
3250
- grid-template-columns: 1fr;
3251
- }
3252
- .capability-cart {
3253
- position: static;
3254
- }
3255
- .content { padding: 32px 20px 100px; }
3256
- .doc-editor-surface { padding: 24px 18px 140px; }
3257
- }
3258
-
3259
- /* ---------- Project three-dot menu button ---------- */
3260
-
3261
- .nav-repo-more {
3262
- display: flex;
3263
- align-items: center;
3264
- justify-content: center;
3265
- flex: 0 0 auto;
3266
- width: 22px;
3267
- height: 22px;
3268
- padding: 0;
3269
- margin-left: auto;
3270
- margin-right: 2px;
3271
- background: transparent;
3272
- border: none;
3273
- border-radius: 4px;
3274
- color: var(--text-secondary);
3275
- cursor: pointer;
3276
- opacity: 0;
3277
- transition: opacity 0.12s ease, background 0.12s ease;
3278
- }
3279
-
3280
- .nav-repo-header:hover .nav-repo-more {
3281
- opacity: 0.5;
3282
- }
3283
-
3284
- .nav-repo-more:hover {
3285
- background: var(--bg-hover);
3286
- opacity: 1 !important;
3287
- }
3288
-
3289
- /* ---------- Raw view: non-docs directories (subtly muted) ---------- */
3290
-
3291
- .nav-browse-dir-toggle {
3292
- display: flex;
3293
- align-items: center;
3294
- gap: 4px;
3295
- width: 100%;
3296
- padding: 4px 8px;
3297
- background: transparent;
3298
- border: none;
3299
- border-radius: 6px;
3300
- color: var(--text-secondary);
3301
- font-size: 13px;
3302
- cursor: pointer;
3303
- text-align: left;
3304
- opacity: 0.45;
3305
- transition: opacity 0.12s ease, background 0.12s ease;
3306
- }
3307
-
3308
- .nav-browse-dir-toggle:hover {
3309
- background: var(--bg-hover);
3310
- opacity: 0.75;
3311
- }
3312
-
3313
- /* Inline rename / create input */
3314
- .nav-inline-input {
3315
- display: block;
3316
- width: 100%;
3317
- padding: 4px 8px;
3318
- margin: 1px 0;
3319
- font: inherit;
3320
- font-size: 13px;
3321
- color: var(--text-primary);
3322
- background: var(--bg-canvas);
3323
- border: 1px solid var(--brand-300);
3324
- border-radius: 4px;
3325
- outline: none;
3326
- box-shadow: 0 0 0 2px rgba(0, 120, 212, 0.15);
3327
- }
3328
-
3329
- .nav-inline-input::placeholder {
3330
- color: var(--text-secondary);
3331
- opacity: 0.6;
3332
- }