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