@hcu-lab.me/mcp-device 1.0.2 → 1.0.3

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 (41) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +70 -51
  3. package/dist/bootstrap.js +0 -0
  4. package/dist/command-manager.js +0 -0
  5. package/dist/config-field-definitions.js +0 -0
  6. package/dist/config-manager.js +0 -0
  7. package/dist/config.js +0 -0
  8. package/dist/custom-stdio.js +0 -0
  9. package/dist/data/official-app-ca.pem +12 -12
  10. package/dist/data/onboarding-prompts.json +70 -70
  11. package/dist/error-handlers.js +0 -0
  12. package/dist/handlers/filesystem-handlers.js +2 -2
  13. package/dist/index.js +0 -0
  14. package/dist/mcp-device.js +0 -0
  15. package/dist/search-manager.js +0 -0
  16. package/dist/server.js +656 -656
  17. package/dist/terminal-manager.js +0 -0
  18. package/dist/tools/edit.js +2 -2
  19. package/dist/tools/fuzzySearch.js +9 -9
  20. package/dist/tools/improved-process-tools.js +10 -10
  21. package/dist/tools/prompts.js +1 -1
  22. package/dist/types.js +0 -0
  23. package/dist/ui/config-editor/index.html +13 -13
  24. package/dist/ui/config-editor/src/app.js +30 -30
  25. package/dist/ui/config-editor/src/array-modal.js +32 -32
  26. package/dist/ui/config-editor/styles.css +586 -586
  27. package/dist/ui/file-preview/index.html +16 -16
  28. package/dist/ui/file-preview/src/app.js +8 -8
  29. package/dist/ui/file-preview/src/document-layout.js +31 -31
  30. package/dist/ui/file-preview/src/document-outline.js +8 -8
  31. package/dist/ui/file-preview/src/markdown/conflict-dialog.js +33 -33
  32. package/dist/ui/file-preview/src/markdown/controller.js +9 -9
  33. package/dist/ui/file-preview/src/markdown/editor.js +31 -31
  34. package/dist/ui/file-preview/styles.css +1630 -1630
  35. package/dist/utils/files/binary.js +4 -4
  36. package/dist/utils/files/excel.js +3 -3
  37. package/dist/utils/system-info.js +90 -90
  38. package/dist/utils/usageTracker.js +49 -49
  39. package/dist/version.d.ts +1 -1
  40. package/dist/version.js +1 -1
  41. package/package.json +131 -131
@@ -1,1631 +1,1631 @@
1
- /*
2
- * Global UI design tokens and base element styling shared by all MCP tool apps. It establishes color, spacing, typography, and accessibility-friendly defaults.
3
- */
4
- :root {
5
- color-scheme: light dark;
6
-
7
- /* Spec variables with light-dark() fallbacks (following customer-segmentation pattern).
8
- When a host provides --color-* via applyHostStyleVariables, the var() picks it up;
9
- otherwise the light-dark() fallback keeps the UI legible. */
10
- --bg: transparent;
11
- --panel: var(--color-background-primary, light-dark(#ffffff, #1e1e2e));
12
- --panel-subtle: var(--color-background-tertiary, light-dark(#f5f5f5, #2a2a3c));
13
- --panel-muted: var(--color-background-tertiary, light-dark(#f5f5f5, #2a2a3c));
14
- --text: var(--color-text-primary, light-dark(#1a1a2e, #e4e4ef));
15
- --text-secondary: var(--color-text-secondary, light-dark(#4a4a5a, #a0a0b8));
16
- --muted: var(--color-text-tertiary, light-dark(#94a3b8, #64748b));
17
- --border: var(--color-border-primary, light-dark(#e2e8f0, #334155));
18
- --accent: var(--color-text-info, light-dark(#2563eb, #60a5fa));
19
- --accent-hover: var(--color-text-info, var(--accent));
20
- --accent-soft: var(--color-background-info, var(--panel-subtle));
21
- --focus-ring: var(--color-border-primary, var(--accent));
22
- --shadow-sm: var(--shadow-sm, none);
23
- --success-bg: var(--color-background-success, var(--panel-subtle));
24
- --success-border: var(--color-border-success, var(--border));
25
- --success-text: var(--color-text-success, light-dark(#059669, #34d399));
26
- --error-bg: var(--color-background-danger, var(--panel-subtle));
27
- --error-border: var(--color-border-danger, var(--border));
28
- --error-text: var(--color-text-danger, light-dark(#dc2626, #f87171));
29
- --warning-bg: var(--color-background-warning, var(--panel-subtle));
30
- --warning-border: var(--color-border-warning, var(--border));
31
- --warning-text: var(--color-text-warning, light-dark(#d97706, #fbbf24));
32
- }
33
-
34
- html {
35
- background: var(--bg);
36
- }
37
-
38
- * {
39
- box-sizing: border-box;
40
- }
41
-
42
- body {
43
- margin: 0;
44
- background: var(--bg);
45
- color: var(--text);
46
- font-family: var(--font-sans, system-ui, sans-serif);
47
- max-height: 32px;
48
- overflow: hidden;
49
- }
50
-
51
- body.dc-ready {
52
- max-height: none;
53
- overflow: auto;
54
- overflow: clip;
55
- }
56
-
57
- #app {
58
- min-height: 0;
59
- }
60
-
61
- .shell {
62
- max-width: none;
63
- margin: 0;
64
- padding: 6px;
65
- }
66
-
67
- .tool-shell.collapsed .panel {
68
- display: none;
69
- }
70
-
71
- .hidden {
72
- display: none !important;
73
- }
74
-
75
-
76
- .compact-row {
77
- display: flex;
78
- align-items: center;
79
- gap: 6px;
80
- padding: 6px 2px;
81
- font-size: 13px;
82
- color: var(--muted);
83
- line-height: 1;
84
- user-select: none;
85
- }
86
-
87
- .compact-row--ready {
88
- cursor: pointer;
89
- border-radius: 8px;
90
- transition: color 150ms ease;
91
- }
92
-
93
- .compact-row--ready:hover {
94
- color: var(--text-secondary);
95
- }
96
-
97
- .compact-row--ready:hover .compact-chevron {
98
- color: var(--text-secondary);
99
- }
100
-
101
- .compact-chevron {
102
- width: 14px;
103
- height: 14px;
104
- fill: currentColor;
105
- color: var(--muted);
106
- flex-shrink: 0;
107
- transition: transform 200ms ease, color 150ms ease;
108
- }
109
-
110
- .tool-shell.expanded .compact-chevron {
111
- transform: rotate(90deg);
112
- }
113
-
114
- .compact-label {
115
- color: inherit;
116
- }
117
-
118
- .compact-filename {
119
- color: var(--text);
120
- font-weight: 600;
121
- }
122
-
123
- .compact-row--ready .compact-label::after {
124
- content: ' · ';
125
- }
126
-
127
- .compact-row--loading {
128
- animation: fade-pulse 1.5s ease-in-out infinite;
129
- }
130
-
131
- @keyframes fade-pulse {
132
- 0%,
133
- 100% {
134
- opacity: 0.5;
135
- }
136
-
137
- 50% {
138
- opacity: 1;
139
- }
140
- }
141
-
142
-
143
- /*
144
- * App-specific styling for File Preview — tuned to blend with Claude's UI.
145
- */
146
- :root {
147
- --code-bg: var(--panel);
148
- --code-text: var(--color-text-primary, var(--text));
149
- --hljs-keyword: light-dark(#8b5cf6, #a78bfa);
150
- --hljs-string: var(--color-text-success, light-dark(#059669, #34d399));
151
- --hljs-comment: var(--color-text-tertiary, light-dark(#94a3b8, #64748b));
152
- --hljs-type: var(--color-text-info, light-dark(#0f766e, #5eead4));
153
- --hljs-number: var(--color-text-warning, light-dark(#b45309, #fbbf24));
154
- --hljs-attr: var(--color-text-info, light-dark(#2563eb, #60a5fa));
155
- --hljs-built-in: light-dark(#6366f1, #818cf8);
156
- --hljs-tag: var(--color-text-info, light-dark(#0ea5a8, #67e8f9));
157
- --content-height: 920px;
158
- --markdown-text: var(--text);
159
- --markdown-muted: var(--text-secondary);
160
- --inline-code-bg: var(--panel-subtle);
161
- --inline-code-border: var(--border);
162
- --inline-code-text: var(--text);
163
- --notice-bg: var(--panel-subtle);
164
- --notice-border: var(--border);
165
- --notice-text: var(--text-secondary);
166
- --toc-rail-width: 320px;
167
- }
168
-
169
- /* ── Panel (Claude-style card) ── */
170
-
171
- .panel {
172
- margin-top: 6px;
173
- border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
174
- border-radius: 16px;
175
- background: var(--panel);
176
- overflow: hidden;
177
- }
178
-
179
- /* Panel background comes directly from host --color-background-primary.
180
- No dark-mode adjustment — the host provides the correct color. */
181
-
182
- .tool-shell.collapsed .panel { display: none; }
183
-
184
- /* When the host hides the summary row (hideSummaryRow: true), it means the host
185
- provides its own outer frame/card. Strip inner chrome so only content remains. */
186
- html:has(.fullscreen) {
187
- height: 100%;
188
- }
189
-
190
- html:has(.fullscreen) body {
191
- height: 100%;
192
- display: flex;
193
- flex-direction: column;
194
- }
195
-
196
- html:has(.fullscreen) #app {
197
- flex: 1;
198
- display: flex;
199
- flex-direction: column;
200
- }
201
-
202
- .tool-shell.fullscreen {
203
- flex: 1;
204
- display: flex;
205
- flex-direction: column;
206
- }
207
-
208
- .tool-shell.fullscreen .panel {
209
- margin-top: 0;
210
- border: none;
211
- border-radius: 0;
212
- flex: 1;
213
- display: flex;
214
- flex-direction: column;
215
- }
216
-
217
- .tool-shell.fullscreen {
218
- --content-height: 89vh;
219
- }
220
-
221
- .tool-shell.fullscreen .panel-content-wrapper {
222
- flex: 1;
223
- }
224
-
225
- .tool-shell.host-framed .compact-row { display: none; }
226
- .tool-shell.host-framed .panel {
227
- margin-top: 0;
228
- border: none;
229
- border-radius: 0;
230
- background: transparent;
231
- }
232
- .tool-shell.host-framed .panel-breadcrumb { display: none; }
233
- .tool-shell.host-framed .panel-footer { display: none; }
234
- .tool-shell.host-framed .panel { position: relative; }
235
- .tool-shell.host-framed .panel-topbar {
236
- position: absolute;
237
- top: 0;
238
- right: 0;
239
- z-index: 10;
240
- width: auto;
241
- opacity: 0;
242
- transition: opacity 0.2s ease 1.5s;
243
- pointer-events: none;
244
- padding: 4px 8px;
245
- gap: 6px;
246
- background: var(--panel);
247
- border-radius: 0 0 0 var(--border-radius-md, 6px);
248
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
249
- }
250
- .tool-shell.host-framed .panel:hover .panel-topbar,
251
- .tool-shell.host-framed .panel:focus-within .panel-topbar {
252
- opacity: 1;
253
- pointer-events: auto;
254
- transition: opacity 0.2s ease;
255
- }
256
- .tool-shell.host-framed .panel-content-wrapper { max-height: none; overflow: hidden; }
257
- .tool-shell.host-framed .image-content { background: transparent; }
258
-
259
- /* ── Top bar ── */
260
-
261
- .panel-topbar {
262
- display: flex;
263
- flex-wrap: nowrap;
264
- align-items: center;
265
- gap: 12px;
266
- padding: 10px 16px;
267
- border-bottom: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
268
- overflow: visible;
269
- }
270
-
271
- .panel-breadcrumb {
272
- font-size: 13px;
273
- color: var(--text-secondary);
274
- direction: rtl;
275
- text-align: left;
276
- white-space: nowrap;
277
- overflow: hidden;
278
- text-overflow: ellipsis;
279
- flex: 0 1 auto;
280
- max-width: 50%;
281
- min-width: 0;
282
- }
283
-
284
- .breadcrumb-sep {
285
- color: color-mix(in srgb, var(--muted) 50%, transparent);
286
- margin: 0 2px;
287
- }
288
-
289
- .panel-topbar-actions {
290
- display: flex;
291
- flex-wrap: nowrap;
292
- align-items: center;
293
- gap: 4px;
294
- flex: 0 0 auto;
295
- margin-left: auto;
296
- }
297
-
298
- .panel-action {
299
- font-size: 13px;
300
- font-weight: 500;
301
- color: var(--muted);
302
- background: none;
303
- border: none;
304
- border-radius: 8px;
305
- padding: 5px 12px;
306
- cursor: pointer;
307
- white-space: nowrap;
308
- transition: color 150ms ease, background 150ms ease;
309
- line-height: 1.4;
310
- font-family: inherit;
311
- display: inline-flex;
312
- align-items: center;
313
- gap: 5px;
314
- }
315
-
316
- .panel-action:hover {
317
- color: var(--text);
318
- background: var(--panel-subtle);
319
- }
320
-
321
- .panel-action--primary {
322
- color: var(--text);
323
- background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
324
- }
325
-
326
- .panel-action--primary:hover {
327
- background: color-mix(in srgb, var(--panel-subtle) 58%, var(--border) 42%);
328
- }
329
-
330
- .panel-action:disabled {
331
- opacity: 0.35;
332
- cursor: not-allowed;
333
- }
334
-
335
- .panel-action svg { flex-shrink: 0; opacity: 0.7; }
336
-
337
- .panel-action[title] {
338
- position: relative;
339
- }
340
-
341
- .panel-action[title]::after {
342
- content: attr(title);
343
- position: absolute;
344
- bottom: -28px;
345
- left: 50%;
346
- transform: translateX(-50%);
347
- padding: 3px 8px;
348
- border-radius: 6px;
349
- background: var(--panel);
350
- color: var(--text);
351
- font-size: 11px;
352
- font-weight: 400;
353
- white-space: nowrap;
354
- pointer-events: none;
355
- opacity: 0;
356
- transition: opacity 150ms ease;
357
- z-index: 10;
358
- box-shadow: 0 2px 8px rgba(0,0,0,0.25);
359
- }
360
-
361
- .panel-action[title]:hover::after {
362
- opacity: 1;
363
- }
364
- .panel-action:hover svg { opacity: 1; }
365
-
366
- /* ── Footer ── */
367
-
368
- .panel-footer {
369
- display: flex;
370
- align-items: center;
371
- justify-content: space-between;
372
- padding: 8px 16px;
373
- border-top: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
374
- font-size: 12px;
375
- color: var(--muted);
376
- letter-spacing: 0.01em;
377
- }
378
-
379
- .footer-comment-btn {
380
- margin-left: auto;
381
- }
382
-
383
- /* ── Selection hint (floating tooltip near selection) ── */
384
-
385
- .selection-hint {
386
- position: absolute;
387
- z-index: 10;
388
- padding: 4px 10px;
389
- font-size: 11px;
390
- color: var(--text-secondary);
391
- background: var(--panel);
392
- border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
393
- border-radius: 6px;
394
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
395
- white-space: nowrap;
396
- pointer-events: none;
397
- opacity: 0;
398
- transition: opacity 150ms ease;
399
- }
400
-
401
- .selection-hint.visible {
402
- opacity: 1;
403
- }
404
-
405
- /* ── Content areas ── */
406
-
407
- .panel-content-wrapper {
408
- max-height: var(--content-height);
409
- overflow: auto;
410
- position: relative;
411
- }
412
-
413
- .panel-content {
414
- min-height: 0;
415
- }
416
-
417
- .source-content .code-viewer { height: 100%; overflow: auto; }
418
- .html-content .html-rendered-frame { min-height: 300px; height: var(--content-height); }
419
- .markdown-content { overflow: auto; padding: 0 4px 0 0; }
420
-
421
- .markdown-content--workspace {
422
- padding: 0;
423
- overflow: visible;
424
- }
425
-
426
- .markdown-workspace {
427
- display: flex;
428
- background: transparent;
429
- }
430
-
431
- .markdown-workspace--edit {
432
- min-height: min(70vh, 880px);
433
- }
434
-
435
- .markdown-workspace--with-toc {
436
- align-items: stretch;
437
- }
438
-
439
- .markdown-workspace-main {
440
- flex: 1 1 auto;
441
- min-width: 0;
442
- padding-left: 18px;
443
- }
444
-
445
- .markdown-workspace-main--editor {
446
- display: flex;
447
- min-height: min(70vh, 880px);
448
- }
449
-
450
- .markdown-editor-shell {
451
- display: grid;
452
- gap: 14px;
453
- width: 100%;
454
- padding: 20px;
455
- position: relative;
456
- }
457
-
458
- .markdown-editor-mode-toggle {
459
- position: relative;
460
- display: inline-grid;
461
- grid-template-columns: repeat(2, minmax(0, 1fr));
462
- align-items: center;
463
- gap: 4px;
464
- padding: 3px 4.5px 3px 3px;
465
- border-radius: 999px;
466
- background: color-mix(in srgb, var(--panel-subtle) 72%, transparent);
467
- border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
468
- }
469
-
470
- .markdown-editor-mode-toggle-indicator {
471
- position: absolute;
472
- top: 3px;
473
- bottom: 3px;
474
- left: 3px;
475
- width: calc(50% - 3.5px);
476
- border-radius: 999px;
477
- background: color-mix(in srgb, var(--panel) 96%, transparent);
478
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
479
- transition: transform 220ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 220ms ease, background-color 220ms ease;
480
- pointer-events: none;
481
- }
482
-
483
- .markdown-editor-mode-toggle-indicator--markdown {
484
- transform: translateX(calc(100% + 2.5px));
485
- }
486
-
487
- .markdown-editor-mode-option {
488
- position: relative;
489
- z-index: 1;
490
- border: none;
491
- background: transparent;
492
- color: var(--text-secondary);
493
- min-width: 0;
494
- height: 32px;
495
- padding: 0 12px;
496
- border-radius: 999px;
497
- display: inline-flex;
498
- align-items: center;
499
- justify-content: center;
500
- gap: 6px;
501
- font: inherit;
502
- font-size: 12px;
503
- cursor: pointer;
504
- transition: color 180ms ease, opacity 180ms ease, transform 220ms cubic-bezier(0.22, 1, 0.36, 1);
505
- }
506
-
507
- .markdown-editor-mode-option.is-active {
508
- color: var(--text);
509
- transform: translateY(-0.5px);
510
- }
511
-
512
- .markdown-editor-mode-option span {
513
- white-space: nowrap;
514
- transition: opacity 180ms ease;
515
- }
516
-
517
- .markdown-editor-mode-option:not(.is-active) {
518
- opacity: 0.82;
519
- }
520
-
521
- .markdown-editor-mode-option.is-active svg,
522
- .markdown-editor-mode-option.is-active span {
523
- opacity: 1;
524
- }
525
-
526
- .markdown-editor-pane {
527
- display: flex;
528
- flex-direction: column;
529
- min-height: min(70vh, 840px);
530
- overflow: visible;
531
- background: transparent;
532
- }
533
-
534
- .markdown-editor-pane--raw {
535
- max-width: none;
536
- }
537
-
538
- .markdown-editor-pane--markdown {
539
- max-width: none;
540
- }
541
-
542
- .markdown-editor-context-menu {
543
- display: flex;
544
- flex-wrap: wrap;
545
- align-items: center;
546
- gap: 6px;
547
- padding: 6px;
548
- background: #171717;
549
- border: 1px solid color-mix(in srgb, var(--border) 34%, transparent);
550
- border-radius: 10px;
551
- position: absolute;
552
- z-index: 20;
553
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
554
- }
555
-
556
- .markdown-editor-context-menu[hidden] {
557
- display: none;
558
- }
559
-
560
- .markdown-format-button {
561
- border: none;
562
- background: transparent;
563
- color: rgba(255, 255, 255, 0.9);
564
- border-radius: 6px;
565
- width: 32px;
566
- height: 32px;
567
- padding: 0;
568
- font: inherit;
569
- font-size: 13px;
570
- cursor: pointer;
571
- white-space: nowrap;
572
- display: inline-flex;
573
- align-items: center;
574
- justify-content: center;
575
- }
576
-
577
- .markdown-format-button:hover {
578
- background: rgba(255, 255, 255, 0.14);
579
- }
580
-
581
- .markdown-format-button--swatch {
582
- padding: 0;
583
- }
584
-
585
- .markdown-format-size {
586
- display: inline-flex;
587
- align-items: center;
588
- justify-content: center;
589
- height: 32px;
590
- border-radius: 6px;
591
- overflow: hidden;
592
- background: rgba(255, 255, 255, 0.08);
593
- }
594
-
595
- .markdown-format-size select {
596
- height: 32px;
597
- border: none;
598
- background: transparent;
599
- color: rgba(255, 255, 255, 0.9);
600
- padding: 0 8px;
601
- font: inherit;
602
- font-size: 12px;
603
- outline: none;
604
- }
605
-
606
- .markdown-format-sep {
607
- width: 1px;
608
- height: 20px;
609
- background: rgba(255, 255, 255, 0.14);
610
- }
611
-
612
- .markdown-link-modal {
613
- position: fixed;
614
- inset: 0;
615
- display: flex;
616
- align-items: center;
617
- justify-content: center;
618
- background: transparent;
619
- z-index: 30;
620
- }
621
-
622
- .markdown-link-modal[hidden] {
623
- display: none;
624
- }
625
-
626
- .markdown-link-modal-card {
627
- width: min(420px, calc(100% - 32px));
628
- background: var(--panel);
629
- border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
630
- border-radius: 14px;
631
- padding: 14px;
632
- box-shadow: 0 18px 44px rgba(15, 23, 42, 0.22);
633
- }
634
-
635
- .markdown-link-mode-tabs {
636
- display: inline-flex;
637
- gap: 6px;
638
- margin-bottom: 12px;
639
- }
640
-
641
- .markdown-link-mode-tab {
642
- border: 1px solid color-mix(in srgb, var(--border) 55%, transparent);
643
- background: transparent;
644
- color: var(--text-secondary);
645
- border-radius: 999px;
646
- padding: 7px 12px;
647
- font: inherit;
648
- font-size: 12px;
649
- cursor: pointer;
650
- }
651
-
652
- .markdown-link-mode-tab.is-active {
653
- color: var(--text);
654
- background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
655
- }
656
-
657
- .markdown-link-modal-label {
658
- display: block;
659
- margin-bottom: 8px;
660
- font-size: 12px;
661
- font-weight: 600;
662
- color: var(--text-secondary);
663
- }
664
-
665
- .markdown-link-modal-input {
666
- width: 100%;
667
- border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
668
- border-radius: 10px;
669
- padding: 10px 12px;
670
- font: inherit;
671
- font-size: 13px;
672
- color: var(--text);
673
- background: color-mix(in srgb, var(--panel-subtle) 68%, transparent);
674
- }
675
-
676
- .markdown-link-modal-select {
677
- appearance: none;
678
- }
679
-
680
- .markdown-link-results {
681
- display: flex;
682
- flex-direction: column;
683
- gap: 6px;
684
- max-height: 160px;
685
- overflow: auto;
686
- margin: 10px 0 12px;
687
- }
688
-
689
- .markdown-link-results-empty {
690
- padding: 10px 12px;
691
- font-size: 12px;
692
- color: var(--text-secondary);
693
- border: 1px dashed color-mix(in srgb, var(--border) 45%, transparent);
694
- border-radius: 10px;
695
- }
696
-
697
- .markdown-link-result {
698
- display: flex;
699
- flex-direction: column;
700
- align-items: flex-start;
701
- gap: 4px;
702
- width: 100%;
703
- border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
704
- background: transparent;
705
- border-radius: 10px;
706
- padding: 10px 12px;
707
- cursor: pointer;
708
- text-align: left;
709
- }
710
-
711
- .markdown-link-result.is-active {
712
- background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
713
- }
714
-
715
- .markdown-link-result-title {
716
- font-size: 13px;
717
- color: var(--text);
718
- }
719
-
720
- .markdown-link-result-path {
721
- font-size: 11px;
722
- color: var(--text-secondary);
723
- }
724
-
725
- .markdown-link-modal-actions {
726
- display: flex;
727
- justify-content: flex-end;
728
- gap: 8px;
729
- margin-top: 12px;
730
- }
731
-
732
- .markdown-link-modal-button {
733
- border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
734
- background: transparent;
735
- color: var(--text-secondary);
736
- border-radius: 10px;
737
- padding: 8px 12px;
738
- font: inherit;
739
- font-size: 13px;
740
- cursor: pointer;
741
- }
742
-
743
- .markdown-link-modal-button--primary {
744
- color: var(--text);
745
- background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
746
- }
747
-
748
- .markdown-editor-copy-button {
749
- display: inline-flex;
750
- align-items: center;
751
- gap: 5px;
752
- background: none;
753
- border: none;
754
- border-radius: 8px;
755
- padding: 5px 12px;
756
- font-size: 13px;
757
- font-weight: 500;
758
- color: var(--muted);
759
- cursor: pointer;
760
- white-space: nowrap;
761
- transition: color 150ms ease, background 150ms ease;
762
- line-height: 1.4;
763
- font-family: inherit;
764
- }
765
-
766
- .markdown-editor-copy-button span {
767
- white-space: nowrap;
768
- }
769
-
770
- .markdown-editor-copy-button:hover {
771
- color: var(--text);
772
- }
773
-
774
- .markdown-editor-copy-button[data-status="Copied!"] {
775
- color: var(--text);
776
- }
777
-
778
- .markdown-editor-copy-button[data-status="Copy failed"] {
779
- color: #b91c1c;
780
- }
781
-
782
- .panel-save-status {
783
- padding: 4px 10px;
784
- border-radius: 999px;
785
- font-size: 12px;
786
- font-weight: 400;
787
- color: var(--muted);
788
- background: none;
789
- white-space: nowrap;
790
- pointer-events: none;
791
- line-height: 1;
792
- }
793
-
794
- .panel-save-status--saving {
795
- color: var(--text);
796
- }
797
-
798
- .panel-save-status--saved {
799
- color: var(--muted);
800
- opacity: 0.7;
801
- }
802
-
803
- .panel-save-status--pending {
804
- color: var(--muted);
805
- }
806
-
807
- .panel-topbar .markdown-editor-mode-toggle {
808
- margin-left: 2px;
809
- }
810
-
811
- .markdown-toc-shell {
812
- flex: 0 0 var(--toc-rail-width);
813
- width: var(--toc-rail-width);
814
- border-right: 1px solid color-mix(in srgb, var(--border) 18%, transparent);
815
- background: color-mix(in srgb, var(--panel-subtle) 90%, transparent);
816
- padding: 18px 14px 18px 16px;
817
- display: flex;
818
- flex-direction: column;
819
- align-self: flex-start;
820
- position: sticky;
821
- top: 12px;
822
- max-height: calc(100vh - 120px);
823
- overflow: visible;
824
- transition: flex-basis 0.2s ease, width 0.2s ease, padding 0.2s ease;
825
- }
826
-
827
- .markdown-toc-header {
828
- display: flex;
829
- align-items: center;
830
- justify-content: space-between;
831
- margin-bottom: 12px;
832
- min-height: 20px;
833
- }
834
-
835
- .markdown-toc-title {
836
- font-size: 11px;
837
- font-weight: 700;
838
- letter-spacing: 0.08em;
839
- text-transform: uppercase;
840
- color: var(--text-secondary);
841
- }
842
-
843
- .document-outline-toggle {
844
- border: none;
845
- background: transparent;
846
- color: var(--text-secondary);
847
- cursor: pointer;
848
- width: 24px;
849
- height: 24px;
850
- padding: 0;
851
- border-radius: 6px;
852
- display: flex;
853
- align-items: center;
854
- justify-content: center;
855
- flex-shrink: 0;
856
- opacity: 0.5;
857
- transition: opacity 0.15s, background 0.15s;
858
- }
859
- .document-outline-toggle:hover {
860
- opacity: 1;
861
- background: color-mix(in srgb, var(--border) 20%, transparent);
862
- }
863
-
864
- .markdown-toc-collapsed {
865
- flex: 0 0 44px !important;
866
- width: 44px !important;
867
- padding: 12px 6px !important;
868
- overflow: hidden;
869
- background: transparent !important;
870
- border-right: none !important;
871
- }
872
- .markdown-toc-collapsed .markdown-toc-header {
873
- justify-content: center;
874
- }
875
- .markdown-toc-collapsed .markdown-toc-title,
876
- .markdown-toc-collapsed .markdown-toc-nav {
877
- display: none;
878
- }
879
- .markdown-toc-collapsed .document-outline-toggle {
880
- width: 30px;
881
- height: 30px;
882
- border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
883
- border-radius: 8px;
884
- opacity: 0.7;
885
- }
886
-
887
- .markdown-toc-nav {
888
- display: flex;
889
- flex-direction: column;
890
- gap: 4px;
891
- overflow: auto;
892
- min-height: 0;
893
- }
894
-
895
- .markdown-toc-link {
896
- border: none;
897
- background: transparent;
898
- color: var(--text-secondary);
899
- text-align: left;
900
- font: inherit;
901
- font-size: 13px;
902
- line-height: 1.35;
903
- padding: 6px 8px;
904
- border-radius: 8px;
905
- cursor: pointer;
906
- }
907
-
908
- .markdown-toc-link[data-level="2"] { padding-left: 16px; }
909
- .markdown-toc-link[data-level="3"] { padding-left: 24px; }
910
- .markdown-toc-link[data-level="4"] { padding-left: 32px; }
911
- .markdown-toc-link[data-level="5"] { padding-left: 40px; }
912
- .markdown-toc-link[data-level="6"] { padding-left: 48px; }
913
-
914
- .markdown-toc-link:hover {
915
- color: var(--text);
916
- background: color-mix(in srgb, var(--panel) 72%, transparent);
917
- }
918
-
919
- .markdown-toc-link.is-active {
920
- color: var(--text);
921
- background: color-mix(in srgb, var(--panel) 82%, var(--border) 18%);
922
- }
923
-
924
- .markdown-link-popover {
925
- position: absolute;
926
- z-index: 10;
927
- display: flex;
928
- align-items: center;
929
- gap: 2px;
930
- background: var(--panel);
931
- border: 1px solid var(--border);
932
- border-radius: 8px;
933
- padding: 4px;
934
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
935
- }
936
- .markdown-link-popover[hidden] { display: none; }
937
- .markdown-link-popover-btn {
938
- border: none;
939
- background: transparent;
940
- color: var(--text-secondary);
941
- cursor: pointer;
942
- width: 28px;
943
- height: 28px;
944
- padding: 0;
945
- border-radius: 6px;
946
- display: flex;
947
- align-items: center;
948
- justify-content: center;
949
- }
950
- .markdown-link-popover-btn:hover {
951
- color: var(--text);
952
- background: color-mix(in srgb, var(--border) 30%, transparent);
953
- }
954
-
955
- .markdown-editor-root {
956
- flex: 1 1 auto;
957
- min-height: 0;
958
- padding: 0;
959
- position: relative;
960
- }
961
-
962
- .markdown-editor-surface {
963
- flex: 1 1 auto;
964
- min-height: min(70vh, 760px);
965
- outline: none;
966
- }
967
-
968
- .markdown-editor-surface--markdown {
969
- max-width: none;
970
- margin: 0;
971
- padding: 22px 24px 28px;
972
- }
973
-
974
- .markdown-editor-textarea {
975
- width: 100%;
976
- min-height: min(70vh, 760px);
977
- border: 0;
978
- border-radius: 0;
979
- background: transparent;
980
- color: var(--text);
981
- font-family: var(--font-mono, ui-monospace, monospace);
982
- font-size: 14px;
983
- line-height: 1.65;
984
- padding: 18px 20px 24px;
985
- resize: none;
986
- overflow: hidden;
987
- outline: none;
988
- }
989
-
990
- .markdown-editor-textarea:focus {
991
- box-shadow: none;
992
- }
993
-
994
- .image-content {
995
- display: flex;
996
- align-items: center;
997
- justify-content: center;
998
- background: linear-gradient(135deg, color-mix(in oklab, var(--panel) 86%, var(--panel-muted) 14%), var(--panel));
999
- padding: 16px;
1000
- }
1001
-
1002
- .image-preview {
1003
- width: 100%;
1004
- max-width: 920px;
1005
- display: flex;
1006
- align-items: center;
1007
- justify-content: center;
1008
- }
1009
-
1010
- .image-preview img {
1011
- max-width: 100%;
1012
- max-height: var(--content-height);
1013
- object-fit: contain;
1014
- border-radius: 8px;
1015
- border: 1px solid var(--border);
1016
- background: var(--panel);
1017
- }
1018
-
1019
- .notice {
1020
- background: var(--notice-bg);
1021
- color: var(--notice-text);
1022
- padding: 10px 16px;
1023
- font-size: 13px;
1024
- }
1025
-
1026
- /* ── Load-more banners ── */
1027
-
1028
- .load-lines-banner {
1029
- display: block;
1030
- width: 100%;
1031
- padding: 8px 16px;
1032
- font-size: 12px;
1033
- font-family: inherit;
1034
- color: var(--text-secondary);
1035
- background: color-mix(in srgb, var(--panel-muted) 40%, transparent);
1036
- border: none;
1037
- cursor: pointer;
1038
- text-align: center;
1039
- transition: color 150ms ease, background 150ms ease;
1040
- }
1041
-
1042
- #load-before {
1043
- border-bottom: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
1044
- }
1045
-
1046
- #load-after {
1047
- border-top: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
1048
- }
1049
-
1050
- .load-lines-banner:hover {
1051
- color: var(--text-secondary);
1052
- background: var(--panel-muted);
1053
- }
1054
-
1055
- .load-lines-banner:disabled {
1056
- opacity: 0.5;
1057
- cursor: not-allowed;
1058
- }
1059
-
1060
- /* ── Code viewer ── */
1061
-
1062
- .code-viewer {
1063
- background: transparent;
1064
- color: var(--code-text);
1065
- overflow-x: auto;
1066
- padding: 12px 0;
1067
- margin: 0;
1068
- font-family: var(--font-mono, ui-monospace, monospace);
1069
- line-height: 1.5;
1070
- font-size: 13px;
1071
- white-space: pre;
1072
- border: 0;
1073
- border-radius: 0;
1074
- }
1075
-
1076
- .code-table {
1077
- border-collapse: collapse;
1078
- border-spacing: 0;
1079
- width: 100%;
1080
- }
1081
-
1082
- .code-line {
1083
- transition: background 80ms ease;
1084
- }
1085
-
1086
- .code-line:hover {
1087
- background: color-mix(in srgb, var(--panel-muted) 50%, transparent);
1088
- }
1089
-
1090
- .code-line.selected {
1091
- background: color-mix(in srgb, var(--border) 40%, transparent);
1092
- }
1093
-
1094
- .code-line.selected:hover {
1095
- background: color-mix(in srgb, var(--border) 55%, transparent);
1096
- }
1097
-
1098
- .line-num {
1099
- padding: 0 12px 0 18px;
1100
- text-align: right;
1101
- color: var(--muted);
1102
- opacity: 0.5;
1103
- user-select: none;
1104
- cursor: pointer;
1105
- vertical-align: top;
1106
- white-space: nowrap;
1107
- font-size: 12px;
1108
- min-width: 2.5em;
1109
- transition: opacity 120ms ease;
1110
- }
1111
-
1112
- .line-num:hover {
1113
- opacity: 1;
1114
- color: var(--text-secondary);
1115
- }
1116
-
1117
- .code-line.selected .line-num {
1118
- opacity: 0.8;
1119
- }
1120
-
1121
- .line-content {
1122
- padding: 0 18px 0 8px;
1123
- white-space: pre;
1124
- width: 100%;
1125
- }
1126
-
1127
- .code-viewer .hljs {
1128
- display: block;
1129
- background: transparent;
1130
- color: inherit;
1131
- }
1132
-
1133
- /* ── Syntax tokens ── */
1134
-
1135
- .hljs-comment, .hljs-quote { color: var(--hljs-comment); }
1136
- .hljs-keyword, .hljs-selector-tag, .hljs-name, .hljs-section,
1137
- .hljs-selector-id, .hljs-selector-class, .hljs-doctag, .hljs-regexp { color: var(--hljs-keyword); }
1138
- .hljs-string, .hljs-template-tag, .hljs-template-variable, .hljs-variable { color: var(--hljs-string); }
1139
- .hljs-type, .hljs-params, .hljs-variable.language_ { color: var(--hljs-type); }
1140
-
1141
- .hljs-number, .hljs-literal, .hljs-symbol, .hljs-bullet { color: var(--hljs-number); }
1142
- .hljs-attr, .hljs-attribute, .hljs-property { color: var(--hljs-attr); }
1143
- .hljs-built_in, .hljs-built-in { color: var(--hljs-built-in); }
1144
- .hljs-tag, .hljs-selector-pseudo, .hljs-selector-attr { color: var(--hljs-tag); }
1145
- .hljs-title, .hljs-title.class_, .hljs-title.function_,
1146
- .hljs-meta, .hljs-meta .hljs-keyword, .hljs-subst,
1147
- .hljs-punctuation, .hljs-operator { color: inherit; }
1148
-
1149
- /* ── Markdown (typographic, airy, Medium-inspired) ── */
1150
-
1151
- .markdown h1, .markdown h2, .markdown h3 { letter-spacing: -.015em; }
1152
- .markdown p { margin: 1em 0; }
1153
- .markdown ul, .markdown ol { margin: .8em 0; padding-left: 1.4rem; }
1154
-
1155
- .markdown-doc {
1156
- max-width: 720px;
1157
- margin: 0 auto;
1158
- padding: 32px 28px 36px;
1159
- line-height: 1.8;
1160
- color: var(--markdown-text);
1161
- font-size: 16px;
1162
- background: transparent;
1163
- border: 0;
1164
- border-radius: 0;
1165
- }
1166
-
1167
- .markdown-doc h1 {
1168
- margin: 0 0 24px;
1169
- font-size: 28px;
1170
- font-weight: 600;
1171
- line-height: 1.25;
1172
- letter-spacing: -0.02em;
1173
- color: var(--markdown-text);
1174
- }
1175
-
1176
- .markdown-doc h2 {
1177
- margin: 36px 0 16px;
1178
- font-size: 22px;
1179
- font-weight: 600;
1180
- line-height: 1.3;
1181
- letter-spacing: -0.01em;
1182
- color: var(--markdown-text);
1183
- }
1184
-
1185
- .markdown-doc h3 {
1186
- margin: 28px 0 12px;
1187
- font-size: 18px;
1188
- font-weight: 600;
1189
- line-height: 1.35;
1190
- color: var(--markdown-text);
1191
- }
1192
-
1193
- .markdown-doc p {
1194
- font-size: 15px;
1195
- line-height: 1.75;
1196
- color: var(--markdown-muted);
1197
- margin: 0 0 1.2em;
1198
- }
1199
-
1200
- .markdown-doc li {
1201
- font-size: 15px;
1202
- line-height: 1.7;
1203
- color: var(--markdown-muted);
1204
- margin-bottom: 0.3em;
1205
- }
1206
-
1207
- .markdown-doc ul, .markdown-doc ol {
1208
- margin: 8px 0 20px;
1209
- padding-left: 1.3em;
1210
- }
1211
-
1212
- .markdown-doc blockquote {
1213
- margin: 20px 0;
1214
- padding: 2px 0 2px 20px;
1215
- border-left: 3px solid color-mix(in srgb, var(--border) 70%, transparent);
1216
- color: var(--markdown-muted);
1217
- font-style: italic;
1218
- }
1219
-
1220
- .markdown-doc hr {
1221
- border: none;
1222
- border-top: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
1223
- margin: 32px 0;
1224
- }
1225
-
1226
- .markdown-doc img {
1227
- max-width: 100%;
1228
- border-radius: 8px;
1229
- margin: 16px 0;
1230
- }
1231
-
1232
- .markdown-doc code:not(.hljs) {
1233
- font-family: var(--font-mono, ui-monospace, monospace);
1234
- font-size: .9em;
1235
- background: var(--inline-code-bg);
1236
- color: var(--inline-code-text);
1237
- border: 1px solid var(--inline-code-border);
1238
- border-radius: 6px;
1239
- padding: 2px 6px;
1240
- }
1241
-
1242
- .markdown-doc .code-viewer {
1243
- margin: 14px 0;
1244
- border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
1245
- border-radius: 10px;
1246
- }
1247
-
1248
- .markdown-doc a {
1249
- color: inherit;
1250
- text-decoration: underline;
1251
- text-decoration-color: color-mix(in srgb, var(--text-secondary) 45%, transparent);
1252
- text-underline-offset: 0.18em;
1253
- }
1254
-
1255
- .markdown-doc a:hover {
1256
- text-decoration-color: currentcolor;
1257
- }
1258
-
1259
- /* ── HTML frame ── */
1260
-
1261
- .html-rendered-frame {
1262
- width: 100%;
1263
- border: 0;
1264
- border-radius: 0;
1265
- background: var(--panel);
1266
- display: block;
1267
- overflow: hidden;
1268
- }
1269
-
1270
- /* ── Responsive ── */
1271
-
1272
- @media (max-width: 720px) {
1273
- .markdown-workspace {
1274
- flex-direction: column;
1275
- }
1276
- .markdown-workspace--edit {
1277
- min-height: auto;
1278
- }
1279
- .markdown-workspace--with-toc {
1280
- background: transparent;
1281
- }
1282
- .markdown-editor-shell {
1283
- padding: 12px;
1284
- }
1285
- .markdown-toc-shell {
1286
- position: static;
1287
- top: auto;
1288
- max-height: none;
1289
- overflow: visible;
1290
- align-self: stretch;
1291
- width: 100% !important;
1292
- flex-basis: auto !important;
1293
- border-right: none;
1294
- border-bottom: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
1295
- }
1296
- .markdown-toc-collapsed .markdown-toc-title,
1297
- .markdown-toc-collapsed .markdown-toc-nav {
1298
- display: flex;
1299
- }
1300
- .document-outline-toggle {
1301
- display: none;
1302
- }
1303
- .markdown-workspace-main {
1304
- padding-left: 0;
1305
- }
1306
- .markdown-toc-nav {
1307
- max-height: 40vh;
1308
- }
1309
- .markdown-editor-root {
1310
- padding: 0;
1311
- }
1312
- .markdown-editor-textarea {
1313
- min-height: 58vh;
1314
- padding: 14px;
1315
- }
1316
- .markdown-editor-surface--markdown {
1317
- padding: 16px;
1318
- }
1319
- .markdown-doc { padding: 16px; }
1320
- .markdown-doc h1 { font-size: 27px; }
1321
- .markdown-doc h2 { font-size: 22px; }
1322
- .markdown-doc h3 { font-size: 18px; }
1323
- .markdown-doc p, .markdown-doc li { font-size: 15px; }
1324
- }
1325
-
1326
- /* ── Directory tree ── */
1327
-
1328
- .directory-content {
1329
- padding: 12px 16px;
1330
- font-family: var(--font-mono, ui-monospace, monospace);
1331
- font-size: 13px;
1332
- line-height: 1.6;
1333
- }
1334
-
1335
- .dir-tree {
1336
- display: flex;
1337
- flex-direction: column;
1338
- }
1339
-
1340
- .dir-entry, .dir-entry-group {
1341
- display: flex;
1342
- flex-direction: column;
1343
- }
1344
-
1345
- .dir-row {
1346
- display: flex;
1347
- align-items: center;
1348
- gap: 4px;
1349
- padding: 2px 6px;
1350
- border-radius: 4px;
1351
- cursor: pointer;
1352
- user-select: none;
1353
- }
1354
-
1355
- .dir-row:hover {
1356
- background: color-mix(in srgb, var(--text) 8%, transparent);
1357
- }
1358
-
1359
- .dir-row-file:active {
1360
- background: color-mix(in srgb, var(--text) 14%, transparent);
1361
- }
1362
-
1363
- .dir-row.dir-loading {
1364
- opacity: 0.5;
1365
- pointer-events: none;
1366
- }
1367
-
1368
- .dir-children {
1369
- padding-left: 20px;
1370
- border-left: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
1371
- margin-left: 11px;
1372
- }
1373
-
1374
- .dir-children.dir-collapsed {
1375
- display: none;
1376
- }
1377
-
1378
- .dir-chevron {
1379
- display: inline-block;
1380
- width: 14px;
1381
- text-align: center;
1382
- font-size: 10px;
1383
- color: var(--secondary);
1384
- flex-shrink: 0;
1385
- transition: transform 0.15s ease;
1386
- }
1387
-
1388
- .dir-icon, .file-icon {
1389
- font-size: 14px;
1390
- flex-shrink: 0;
1391
- }
1392
-
1393
- .dir-name {
1394
- font-weight: 600;
1395
- color: var(--text);
1396
- }
1397
-
1398
- .dir-name-denied {
1399
- color: var(--secondary);
1400
- text-decoration: line-through;
1401
- }
1402
-
1403
- .file-name {
1404
- color: var(--secondary);
1405
- }
1406
-
1407
- .dir-row-file:hover .file-name {
1408
- color: var(--text);
1409
- }
1410
-
1411
- .dir-empty {
1412
- color: var(--secondary);
1413
- font-style: italic;
1414
- padding: 4px 6px;
1415
- }
1416
-
1417
- .dir-row-warning {
1418
- cursor: default;
1419
- opacity: 0.7;
1420
- font-style: italic;
1421
- font-size: 12px;
1422
- }
1423
-
1424
- .dir-row-warning:hover {
1425
- background: none;
1426
- }
1427
-
1428
- .dir-load-more {
1429
- cursor: pointer;
1430
- }
1431
-
1432
- .dir-load-more:hover {
1433
- background: color-mix(in srgb, var(--text) 8%, transparent) !important;
1434
- opacity: 1;
1435
- }
1436
-
1437
- .dir-load-more:hover .dir-warning-text {
1438
- text-decoration: underline;
1439
- }
1440
-
1441
- .dir-warning-text {
1442
- color: var(--secondary);
1443
- }
1444
-
1445
- .dir-back-btn {
1446
- flex-shrink: 0;
1447
- margin-right: 4px;
1448
- font-weight: 600;
1449
- }
1450
-
1451
- .dir-open-btn {
1452
- margin-left: 6px;
1453
- padding: 0 4px;
1454
- border: none;
1455
- background: none;
1456
- cursor: pointer;
1457
- font-size: 13px;
1458
- opacity: 0;
1459
- flex-shrink: 0;
1460
- border-radius: 3px;
1461
- pointer-events: none;
1462
- transition: opacity 0.1s ease;
1463
- }
1464
-
1465
- .dir-open-btn:hover {
1466
- background: color-mix(in srgb, var(--text) 10%, transparent);
1467
- }
1468
-
1469
- .dir-row-folder:hover .dir-open-btn {
1470
- opacity: 0.6;
1471
- pointer-events: auto;
1472
- }
1473
-
1474
- .dir-row-folder:hover .dir-open-btn:hover {
1475
- opacity: 1;
1476
- }
1477
-
1478
- /* === File-changed-on-disk conflict modal === */
1479
-
1480
- .md-conflict-modal[hidden] {
1481
- display: none;
1482
- }
1483
-
1484
- .md-conflict-modal {
1485
- position: fixed;
1486
- inset: 0;
1487
- background: rgba(0, 0, 0, 0.42);
1488
- display: grid;
1489
- place-items: center;
1490
- z-index: 50;
1491
- padding: 16px;
1492
- box-sizing: border-box;
1493
- }
1494
-
1495
- .md-conflict-card {
1496
- width: min(480px, 100%);
1497
- max-height: min(80vh, 560px);
1498
- background: var(--panel);
1499
- color: var(--text);
1500
- border: 1px solid var(--border);
1501
- border-radius: 10px;
1502
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
1503
- padding: 0;
1504
- display: flex;
1505
- flex-direction: column;
1506
- overflow: hidden;
1507
- }
1508
-
1509
- .md-conflict-header {
1510
- display: flex;
1511
- align-items: center;
1512
- justify-content: space-between;
1513
- padding: 14px 16px 10px;
1514
- border-bottom: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
1515
- }
1516
-
1517
- .md-conflict-header h3 {
1518
- margin: 0;
1519
- font-size: 14px;
1520
- font-weight: 600;
1521
- color: var(--text);
1522
- }
1523
-
1524
- .md-conflict-close {
1525
- display: inline-flex;
1526
- align-items: center;
1527
- justify-content: center;
1528
- width: 24px;
1529
- height: 24px;
1530
- padding: 0;
1531
- background: transparent;
1532
- border: none;
1533
- border-radius: 4px;
1534
- color: var(--text-secondary);
1535
- cursor: pointer;
1536
- transition: background-color 120ms ease, color 120ms ease;
1537
- }
1538
-
1539
- .md-conflict-close:hover {
1540
- background: var(--panel-subtle);
1541
- color: var(--text);
1542
- }
1543
-
1544
- .md-conflict-close svg {
1545
- width: 16px;
1546
- height: 16px;
1547
- }
1548
-
1549
- .md-conflict-body {
1550
- padding: 14px 16px;
1551
- overflow-y: auto;
1552
- font-size: 13px;
1553
- line-height: 1.5;
1554
- color: var(--text);
1555
- }
1556
-
1557
- .md-conflict-body p {
1558
- margin: 0 0 10px;
1559
- }
1560
-
1561
- .md-conflict-body p:last-of-type {
1562
- margin-bottom: 8px;
1563
- }
1564
-
1565
- .md-conflict-body ul {
1566
- margin: 0 0 4px;
1567
- padding-left: 20px;
1568
- color: var(--text-secondary);
1569
- }
1570
-
1571
- .md-conflict-body li {
1572
- margin-bottom: 4px;
1573
- }
1574
-
1575
- .md-conflict-filename {
1576
- font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
1577
- font-weight: 600;
1578
- word-break: break-all;
1579
- }
1580
-
1581
- .md-conflict-footer {
1582
- display: flex;
1583
- justify-content: flex-end;
1584
- gap: 8px;
1585
- padding: 12px 16px 14px;
1586
- border-top: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
1587
- background: color-mix(in srgb, var(--panel-subtle) 50%, transparent);
1588
- }
1589
-
1590
- .md-conflict-btn {
1591
- appearance: none;
1592
- font: inherit;
1593
- font-size: 13px;
1594
- font-weight: 500;
1595
- padding: 7px 14px;
1596
- border-radius: 6px;
1597
- cursor: pointer;
1598
- border: 1px solid var(--border);
1599
- background: var(--panel);
1600
- color: var(--text);
1601
- transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
1602
- }
1603
-
1604
- .md-conflict-btn:hover {
1605
- background: var(--panel-subtle);
1606
- }
1607
-
1608
- .md-conflict-btn:focus-visible {
1609
- outline: 2px solid var(--accent, #4a8cff);
1610
- outline-offset: 2px;
1611
- }
1612
-
1613
- .md-conflict-btn--secondary {
1614
- color: var(--text-secondary);
1615
- }
1616
-
1617
- .md-conflict-btn--secondary:hover {
1618
- color: var(--text);
1619
- border-color: color-mix(in srgb, var(--border) 80%, var(--text) 20%);
1620
- }
1621
-
1622
- .md-conflict-btn--primary {
1623
- background: var(--accent, #4a8cff);
1624
- color: #fff;
1625
- border-color: color-mix(in srgb, var(--accent, #4a8cff) 85%, black 15%);
1626
- }
1627
-
1628
- .md-conflict-btn--primary:hover {
1629
- background: color-mix(in srgb, var(--accent, #4a8cff) 88%, black 12%);
1630
- }
1
+ /*
2
+ * Global UI design tokens and base element styling shared by all MCP tool apps. It establishes color, spacing, typography, and accessibility-friendly defaults.
3
+ */
4
+ :root {
5
+ color-scheme: light dark;
6
+
7
+ /* Spec variables with light-dark() fallbacks (following customer-segmentation pattern).
8
+ When a host provides --color-* via applyHostStyleVariables, the var() picks it up;
9
+ otherwise the light-dark() fallback keeps the UI legible. */
10
+ --bg: transparent;
11
+ --panel: var(--color-background-primary, light-dark(#ffffff, #1e1e2e));
12
+ --panel-subtle: var(--color-background-tertiary, light-dark(#f5f5f5, #2a2a3c));
13
+ --panel-muted: var(--color-background-tertiary, light-dark(#f5f5f5, #2a2a3c));
14
+ --text: var(--color-text-primary, light-dark(#1a1a2e, #e4e4ef));
15
+ --text-secondary: var(--color-text-secondary, light-dark(#4a4a5a, #a0a0b8));
16
+ --muted: var(--color-text-tertiary, light-dark(#94a3b8, #64748b));
17
+ --border: var(--color-border-primary, light-dark(#e2e8f0, #334155));
18
+ --accent: var(--color-text-info, light-dark(#2563eb, #60a5fa));
19
+ --accent-hover: var(--color-text-info, var(--accent));
20
+ --accent-soft: var(--color-background-info, var(--panel-subtle));
21
+ --focus-ring: var(--color-border-primary, var(--accent));
22
+ --shadow-sm: var(--shadow-sm, none);
23
+ --success-bg: var(--color-background-success, var(--panel-subtle));
24
+ --success-border: var(--color-border-success, var(--border));
25
+ --success-text: var(--color-text-success, light-dark(#059669, #34d399));
26
+ --error-bg: var(--color-background-danger, var(--panel-subtle));
27
+ --error-border: var(--color-border-danger, var(--border));
28
+ --error-text: var(--color-text-danger, light-dark(#dc2626, #f87171));
29
+ --warning-bg: var(--color-background-warning, var(--panel-subtle));
30
+ --warning-border: var(--color-border-warning, var(--border));
31
+ --warning-text: var(--color-text-warning, light-dark(#d97706, #fbbf24));
32
+ }
33
+
34
+ html {
35
+ background: var(--bg);
36
+ }
37
+
38
+ * {
39
+ box-sizing: border-box;
40
+ }
41
+
42
+ body {
43
+ margin: 0;
44
+ background: var(--bg);
45
+ color: var(--text);
46
+ font-family: var(--font-sans, system-ui, sans-serif);
47
+ max-height: 32px;
48
+ overflow: hidden;
49
+ }
50
+
51
+ body.dc-ready {
52
+ max-height: none;
53
+ overflow: auto;
54
+ overflow: clip;
55
+ }
56
+
57
+ #app {
58
+ min-height: 0;
59
+ }
60
+
61
+ .shell {
62
+ max-width: none;
63
+ margin: 0;
64
+ padding: 6px;
65
+ }
66
+
67
+ .tool-shell.collapsed .panel {
68
+ display: none;
69
+ }
70
+
71
+ .hidden {
72
+ display: none !important;
73
+ }
74
+
75
+
76
+ .compact-row {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 6px;
80
+ padding: 6px 2px;
81
+ font-size: 13px;
82
+ color: var(--muted);
83
+ line-height: 1;
84
+ user-select: none;
85
+ }
86
+
87
+ .compact-row--ready {
88
+ cursor: pointer;
89
+ border-radius: 8px;
90
+ transition: color 150ms ease;
91
+ }
92
+
93
+ .compact-row--ready:hover {
94
+ color: var(--text-secondary);
95
+ }
96
+
97
+ .compact-row--ready:hover .compact-chevron {
98
+ color: var(--text-secondary);
99
+ }
100
+
101
+ .compact-chevron {
102
+ width: 14px;
103
+ height: 14px;
104
+ fill: currentColor;
105
+ color: var(--muted);
106
+ flex-shrink: 0;
107
+ transition: transform 200ms ease, color 150ms ease;
108
+ }
109
+
110
+ .tool-shell.expanded .compact-chevron {
111
+ transform: rotate(90deg);
112
+ }
113
+
114
+ .compact-label {
115
+ color: inherit;
116
+ }
117
+
118
+ .compact-filename {
119
+ color: var(--text);
120
+ font-weight: 600;
121
+ }
122
+
123
+ .compact-row--ready .compact-label::after {
124
+ content: ' · ';
125
+ }
126
+
127
+ .compact-row--loading {
128
+ animation: fade-pulse 1.5s ease-in-out infinite;
129
+ }
130
+
131
+ @keyframes fade-pulse {
132
+ 0%,
133
+ 100% {
134
+ opacity: 0.5;
135
+ }
136
+
137
+ 50% {
138
+ opacity: 1;
139
+ }
140
+ }
141
+
142
+
143
+ /*
144
+ * App-specific styling for File Preview — tuned to blend with Claude's UI.
145
+ */
146
+ :root {
147
+ --code-bg: var(--panel);
148
+ --code-text: var(--color-text-primary, var(--text));
149
+ --hljs-keyword: light-dark(#8b5cf6, #a78bfa);
150
+ --hljs-string: var(--color-text-success, light-dark(#059669, #34d399));
151
+ --hljs-comment: var(--color-text-tertiary, light-dark(#94a3b8, #64748b));
152
+ --hljs-type: var(--color-text-info, light-dark(#0f766e, #5eead4));
153
+ --hljs-number: var(--color-text-warning, light-dark(#b45309, #fbbf24));
154
+ --hljs-attr: var(--color-text-info, light-dark(#2563eb, #60a5fa));
155
+ --hljs-built-in: light-dark(#6366f1, #818cf8);
156
+ --hljs-tag: var(--color-text-info, light-dark(#0ea5a8, #67e8f9));
157
+ --content-height: 920px;
158
+ --markdown-text: var(--text);
159
+ --markdown-muted: var(--text-secondary);
160
+ --inline-code-bg: var(--panel-subtle);
161
+ --inline-code-border: var(--border);
162
+ --inline-code-text: var(--text);
163
+ --notice-bg: var(--panel-subtle);
164
+ --notice-border: var(--border);
165
+ --notice-text: var(--text-secondary);
166
+ --toc-rail-width: 320px;
167
+ }
168
+
169
+ /* ── Panel (Claude-style card) ── */
170
+
171
+ .panel {
172
+ margin-top: 6px;
173
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
174
+ border-radius: 16px;
175
+ background: var(--panel);
176
+ overflow: hidden;
177
+ }
178
+
179
+ /* Panel background comes directly from host --color-background-primary.
180
+ No dark-mode adjustment — the host provides the correct color. */
181
+
182
+ .tool-shell.collapsed .panel { display: none; }
183
+
184
+ /* When the host hides the summary row (hideSummaryRow: true), it means the host
185
+ provides its own outer frame/card. Strip inner chrome so only content remains. */
186
+ html:has(.fullscreen) {
187
+ height: 100%;
188
+ }
189
+
190
+ html:has(.fullscreen) body {
191
+ height: 100%;
192
+ display: flex;
193
+ flex-direction: column;
194
+ }
195
+
196
+ html:has(.fullscreen) #app {
197
+ flex: 1;
198
+ display: flex;
199
+ flex-direction: column;
200
+ }
201
+
202
+ .tool-shell.fullscreen {
203
+ flex: 1;
204
+ display: flex;
205
+ flex-direction: column;
206
+ }
207
+
208
+ .tool-shell.fullscreen .panel {
209
+ margin-top: 0;
210
+ border: none;
211
+ border-radius: 0;
212
+ flex: 1;
213
+ display: flex;
214
+ flex-direction: column;
215
+ }
216
+
217
+ .tool-shell.fullscreen {
218
+ --content-height: 89vh;
219
+ }
220
+
221
+ .tool-shell.fullscreen .panel-content-wrapper {
222
+ flex: 1;
223
+ }
224
+
225
+ .tool-shell.host-framed .compact-row { display: none; }
226
+ .tool-shell.host-framed .panel {
227
+ margin-top: 0;
228
+ border: none;
229
+ border-radius: 0;
230
+ background: transparent;
231
+ }
232
+ .tool-shell.host-framed .panel-breadcrumb { display: none; }
233
+ .tool-shell.host-framed .panel-footer { display: none; }
234
+ .tool-shell.host-framed .panel { position: relative; }
235
+ .tool-shell.host-framed .panel-topbar {
236
+ position: absolute;
237
+ top: 0;
238
+ right: 0;
239
+ z-index: 10;
240
+ width: auto;
241
+ opacity: 0;
242
+ transition: opacity 0.2s ease 1.5s;
243
+ pointer-events: none;
244
+ padding: 4px 8px;
245
+ gap: 6px;
246
+ background: var(--panel);
247
+ border-radius: 0 0 0 var(--border-radius-md, 6px);
248
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
249
+ }
250
+ .tool-shell.host-framed .panel:hover .panel-topbar,
251
+ .tool-shell.host-framed .panel:focus-within .panel-topbar {
252
+ opacity: 1;
253
+ pointer-events: auto;
254
+ transition: opacity 0.2s ease;
255
+ }
256
+ .tool-shell.host-framed .panel-content-wrapper { max-height: none; overflow: hidden; }
257
+ .tool-shell.host-framed .image-content { background: transparent; }
258
+
259
+ /* ── Top bar ── */
260
+
261
+ .panel-topbar {
262
+ display: flex;
263
+ flex-wrap: nowrap;
264
+ align-items: center;
265
+ gap: 12px;
266
+ padding: 10px 16px;
267
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
268
+ overflow: visible;
269
+ }
270
+
271
+ .panel-breadcrumb {
272
+ font-size: 13px;
273
+ color: var(--text-secondary);
274
+ direction: rtl;
275
+ text-align: left;
276
+ white-space: nowrap;
277
+ overflow: hidden;
278
+ text-overflow: ellipsis;
279
+ flex: 0 1 auto;
280
+ max-width: 50%;
281
+ min-width: 0;
282
+ }
283
+
284
+ .breadcrumb-sep {
285
+ color: color-mix(in srgb, var(--muted) 50%, transparent);
286
+ margin: 0 2px;
287
+ }
288
+
289
+ .panel-topbar-actions {
290
+ display: flex;
291
+ flex-wrap: nowrap;
292
+ align-items: center;
293
+ gap: 4px;
294
+ flex: 0 0 auto;
295
+ margin-left: auto;
296
+ }
297
+
298
+ .panel-action {
299
+ font-size: 13px;
300
+ font-weight: 500;
301
+ color: var(--muted);
302
+ background: none;
303
+ border: none;
304
+ border-radius: 8px;
305
+ padding: 5px 12px;
306
+ cursor: pointer;
307
+ white-space: nowrap;
308
+ transition: color 150ms ease, background 150ms ease;
309
+ line-height: 1.4;
310
+ font-family: inherit;
311
+ display: inline-flex;
312
+ align-items: center;
313
+ gap: 5px;
314
+ }
315
+
316
+ .panel-action:hover {
317
+ color: var(--text);
318
+ background: var(--panel-subtle);
319
+ }
320
+
321
+ .panel-action--primary {
322
+ color: var(--text);
323
+ background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
324
+ }
325
+
326
+ .panel-action--primary:hover {
327
+ background: color-mix(in srgb, var(--panel-subtle) 58%, var(--border) 42%);
328
+ }
329
+
330
+ .panel-action:disabled {
331
+ opacity: 0.35;
332
+ cursor: not-allowed;
333
+ }
334
+
335
+ .panel-action svg { flex-shrink: 0; opacity: 0.7; }
336
+
337
+ .panel-action[title] {
338
+ position: relative;
339
+ }
340
+
341
+ .panel-action[title]::after {
342
+ content: attr(title);
343
+ position: absolute;
344
+ bottom: -28px;
345
+ left: 50%;
346
+ transform: translateX(-50%);
347
+ padding: 3px 8px;
348
+ border-radius: 6px;
349
+ background: var(--panel);
350
+ color: var(--text);
351
+ font-size: 11px;
352
+ font-weight: 400;
353
+ white-space: nowrap;
354
+ pointer-events: none;
355
+ opacity: 0;
356
+ transition: opacity 150ms ease;
357
+ z-index: 10;
358
+ box-shadow: 0 2px 8px rgba(0,0,0,0.25);
359
+ }
360
+
361
+ .panel-action[title]:hover::after {
362
+ opacity: 1;
363
+ }
364
+ .panel-action:hover svg { opacity: 1; }
365
+
366
+ /* ── Footer ── */
367
+
368
+ .panel-footer {
369
+ display: flex;
370
+ align-items: center;
371
+ justify-content: space-between;
372
+ padding: 8px 16px;
373
+ border-top: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
374
+ font-size: 12px;
375
+ color: var(--muted);
376
+ letter-spacing: 0.01em;
377
+ }
378
+
379
+ .footer-comment-btn {
380
+ margin-left: auto;
381
+ }
382
+
383
+ /* ── Selection hint (floating tooltip near selection) ── */
384
+
385
+ .selection-hint {
386
+ position: absolute;
387
+ z-index: 10;
388
+ padding: 4px 10px;
389
+ font-size: 11px;
390
+ color: var(--text-secondary);
391
+ background: var(--panel);
392
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
393
+ border-radius: 6px;
394
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
395
+ white-space: nowrap;
396
+ pointer-events: none;
397
+ opacity: 0;
398
+ transition: opacity 150ms ease;
399
+ }
400
+
401
+ .selection-hint.visible {
402
+ opacity: 1;
403
+ }
404
+
405
+ /* ── Content areas ── */
406
+
407
+ .panel-content-wrapper {
408
+ max-height: var(--content-height);
409
+ overflow: auto;
410
+ position: relative;
411
+ }
412
+
413
+ .panel-content {
414
+ min-height: 0;
415
+ }
416
+
417
+ .source-content .code-viewer { height: 100%; overflow: auto; }
418
+ .html-content .html-rendered-frame { min-height: 300px; height: var(--content-height); }
419
+ .markdown-content { overflow: auto; padding: 0 4px 0 0; }
420
+
421
+ .markdown-content--workspace {
422
+ padding: 0;
423
+ overflow: visible;
424
+ }
425
+
426
+ .markdown-workspace {
427
+ display: flex;
428
+ background: transparent;
429
+ }
430
+
431
+ .markdown-workspace--edit {
432
+ min-height: min(70vh, 880px);
433
+ }
434
+
435
+ .markdown-workspace--with-toc {
436
+ align-items: stretch;
437
+ }
438
+
439
+ .markdown-workspace-main {
440
+ flex: 1 1 auto;
441
+ min-width: 0;
442
+ padding-left: 18px;
443
+ }
444
+
445
+ .markdown-workspace-main--editor {
446
+ display: flex;
447
+ min-height: min(70vh, 880px);
448
+ }
449
+
450
+ .markdown-editor-shell {
451
+ display: grid;
452
+ gap: 14px;
453
+ width: 100%;
454
+ padding: 20px;
455
+ position: relative;
456
+ }
457
+
458
+ .markdown-editor-mode-toggle {
459
+ position: relative;
460
+ display: inline-grid;
461
+ grid-template-columns: repeat(2, minmax(0, 1fr));
462
+ align-items: center;
463
+ gap: 4px;
464
+ padding: 3px 4.5px 3px 3px;
465
+ border-radius: 999px;
466
+ background: color-mix(in srgb, var(--panel-subtle) 72%, transparent);
467
+ border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
468
+ }
469
+
470
+ .markdown-editor-mode-toggle-indicator {
471
+ position: absolute;
472
+ top: 3px;
473
+ bottom: 3px;
474
+ left: 3px;
475
+ width: calc(50% - 3.5px);
476
+ border-radius: 999px;
477
+ background: color-mix(in srgb, var(--panel) 96%, transparent);
478
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
479
+ transition: transform 220ms cubic-bezier(0.22, 1, 0.36, 1), box-shadow 220ms ease, background-color 220ms ease;
480
+ pointer-events: none;
481
+ }
482
+
483
+ .markdown-editor-mode-toggle-indicator--markdown {
484
+ transform: translateX(calc(100% + 2.5px));
485
+ }
486
+
487
+ .markdown-editor-mode-option {
488
+ position: relative;
489
+ z-index: 1;
490
+ border: none;
491
+ background: transparent;
492
+ color: var(--text-secondary);
493
+ min-width: 0;
494
+ height: 32px;
495
+ padding: 0 12px;
496
+ border-radius: 999px;
497
+ display: inline-flex;
498
+ align-items: center;
499
+ justify-content: center;
500
+ gap: 6px;
501
+ font: inherit;
502
+ font-size: 12px;
503
+ cursor: pointer;
504
+ transition: color 180ms ease, opacity 180ms ease, transform 220ms cubic-bezier(0.22, 1, 0.36, 1);
505
+ }
506
+
507
+ .markdown-editor-mode-option.is-active {
508
+ color: var(--text);
509
+ transform: translateY(-0.5px);
510
+ }
511
+
512
+ .markdown-editor-mode-option span {
513
+ white-space: nowrap;
514
+ transition: opacity 180ms ease;
515
+ }
516
+
517
+ .markdown-editor-mode-option:not(.is-active) {
518
+ opacity: 0.82;
519
+ }
520
+
521
+ .markdown-editor-mode-option.is-active svg,
522
+ .markdown-editor-mode-option.is-active span {
523
+ opacity: 1;
524
+ }
525
+
526
+ .markdown-editor-pane {
527
+ display: flex;
528
+ flex-direction: column;
529
+ min-height: min(70vh, 840px);
530
+ overflow: visible;
531
+ background: transparent;
532
+ }
533
+
534
+ .markdown-editor-pane--raw {
535
+ max-width: none;
536
+ }
537
+
538
+ .markdown-editor-pane--markdown {
539
+ max-width: none;
540
+ }
541
+
542
+ .markdown-editor-context-menu {
543
+ display: flex;
544
+ flex-wrap: wrap;
545
+ align-items: center;
546
+ gap: 6px;
547
+ padding: 6px;
548
+ background: #171717;
549
+ border: 1px solid color-mix(in srgb, var(--border) 34%, transparent);
550
+ border-radius: 10px;
551
+ position: absolute;
552
+ z-index: 20;
553
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
554
+ }
555
+
556
+ .markdown-editor-context-menu[hidden] {
557
+ display: none;
558
+ }
559
+
560
+ .markdown-format-button {
561
+ border: none;
562
+ background: transparent;
563
+ color: rgba(255, 255, 255, 0.9);
564
+ border-radius: 6px;
565
+ width: 32px;
566
+ height: 32px;
567
+ padding: 0;
568
+ font: inherit;
569
+ font-size: 13px;
570
+ cursor: pointer;
571
+ white-space: nowrap;
572
+ display: inline-flex;
573
+ align-items: center;
574
+ justify-content: center;
575
+ }
576
+
577
+ .markdown-format-button:hover {
578
+ background: rgba(255, 255, 255, 0.14);
579
+ }
580
+
581
+ .markdown-format-button--swatch {
582
+ padding: 0;
583
+ }
584
+
585
+ .markdown-format-size {
586
+ display: inline-flex;
587
+ align-items: center;
588
+ justify-content: center;
589
+ height: 32px;
590
+ border-radius: 6px;
591
+ overflow: hidden;
592
+ background: rgba(255, 255, 255, 0.08);
593
+ }
594
+
595
+ .markdown-format-size select {
596
+ height: 32px;
597
+ border: none;
598
+ background: transparent;
599
+ color: rgba(255, 255, 255, 0.9);
600
+ padding: 0 8px;
601
+ font: inherit;
602
+ font-size: 12px;
603
+ outline: none;
604
+ }
605
+
606
+ .markdown-format-sep {
607
+ width: 1px;
608
+ height: 20px;
609
+ background: rgba(255, 255, 255, 0.14);
610
+ }
611
+
612
+ .markdown-link-modal {
613
+ position: fixed;
614
+ inset: 0;
615
+ display: flex;
616
+ align-items: center;
617
+ justify-content: center;
618
+ background: transparent;
619
+ z-index: 30;
620
+ }
621
+
622
+ .markdown-link-modal[hidden] {
623
+ display: none;
624
+ }
625
+
626
+ .markdown-link-modal-card {
627
+ width: min(420px, calc(100% - 32px));
628
+ background: var(--panel);
629
+ border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
630
+ border-radius: 14px;
631
+ padding: 14px;
632
+ box-shadow: 0 18px 44px rgba(15, 23, 42, 0.22);
633
+ }
634
+
635
+ .markdown-link-mode-tabs {
636
+ display: inline-flex;
637
+ gap: 6px;
638
+ margin-bottom: 12px;
639
+ }
640
+
641
+ .markdown-link-mode-tab {
642
+ border: 1px solid color-mix(in srgb, var(--border) 55%, transparent);
643
+ background: transparent;
644
+ color: var(--text-secondary);
645
+ border-radius: 999px;
646
+ padding: 7px 12px;
647
+ font: inherit;
648
+ font-size: 12px;
649
+ cursor: pointer;
650
+ }
651
+
652
+ .markdown-link-mode-tab.is-active {
653
+ color: var(--text);
654
+ background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
655
+ }
656
+
657
+ .markdown-link-modal-label {
658
+ display: block;
659
+ margin-bottom: 8px;
660
+ font-size: 12px;
661
+ font-weight: 600;
662
+ color: var(--text-secondary);
663
+ }
664
+
665
+ .markdown-link-modal-input {
666
+ width: 100%;
667
+ border: 1px solid color-mix(in srgb, var(--border) 60%, transparent);
668
+ border-radius: 10px;
669
+ padding: 10px 12px;
670
+ font: inherit;
671
+ font-size: 13px;
672
+ color: var(--text);
673
+ background: color-mix(in srgb, var(--panel-subtle) 68%, transparent);
674
+ }
675
+
676
+ .markdown-link-modal-select {
677
+ appearance: none;
678
+ }
679
+
680
+ .markdown-link-results {
681
+ display: flex;
682
+ flex-direction: column;
683
+ gap: 6px;
684
+ max-height: 160px;
685
+ overflow: auto;
686
+ margin: 10px 0 12px;
687
+ }
688
+
689
+ .markdown-link-results-empty {
690
+ padding: 10px 12px;
691
+ font-size: 12px;
692
+ color: var(--text-secondary);
693
+ border: 1px dashed color-mix(in srgb, var(--border) 45%, transparent);
694
+ border-radius: 10px;
695
+ }
696
+
697
+ .markdown-link-result {
698
+ display: flex;
699
+ flex-direction: column;
700
+ align-items: flex-start;
701
+ gap: 4px;
702
+ width: 100%;
703
+ border: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
704
+ background: transparent;
705
+ border-radius: 10px;
706
+ padding: 10px 12px;
707
+ cursor: pointer;
708
+ text-align: left;
709
+ }
710
+
711
+ .markdown-link-result.is-active {
712
+ background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
713
+ }
714
+
715
+ .markdown-link-result-title {
716
+ font-size: 13px;
717
+ color: var(--text);
718
+ }
719
+
720
+ .markdown-link-result-path {
721
+ font-size: 11px;
722
+ color: var(--text-secondary);
723
+ }
724
+
725
+ .markdown-link-modal-actions {
726
+ display: flex;
727
+ justify-content: flex-end;
728
+ gap: 8px;
729
+ margin-top: 12px;
730
+ }
731
+
732
+ .markdown-link-modal-button {
733
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
734
+ background: transparent;
735
+ color: var(--text-secondary);
736
+ border-radius: 10px;
737
+ padding: 8px 12px;
738
+ font: inherit;
739
+ font-size: 13px;
740
+ cursor: pointer;
741
+ }
742
+
743
+ .markdown-link-modal-button--primary {
744
+ color: var(--text);
745
+ background: color-mix(in srgb, var(--panel-subtle) 72%, var(--border) 28%);
746
+ }
747
+
748
+ .markdown-editor-copy-button {
749
+ display: inline-flex;
750
+ align-items: center;
751
+ gap: 5px;
752
+ background: none;
753
+ border: none;
754
+ border-radius: 8px;
755
+ padding: 5px 12px;
756
+ font-size: 13px;
757
+ font-weight: 500;
758
+ color: var(--muted);
759
+ cursor: pointer;
760
+ white-space: nowrap;
761
+ transition: color 150ms ease, background 150ms ease;
762
+ line-height: 1.4;
763
+ font-family: inherit;
764
+ }
765
+
766
+ .markdown-editor-copy-button span {
767
+ white-space: nowrap;
768
+ }
769
+
770
+ .markdown-editor-copy-button:hover {
771
+ color: var(--text);
772
+ }
773
+
774
+ .markdown-editor-copy-button[data-status="Copied!"] {
775
+ color: var(--text);
776
+ }
777
+
778
+ .markdown-editor-copy-button[data-status="Copy failed"] {
779
+ color: #b91c1c;
780
+ }
781
+
782
+ .panel-save-status {
783
+ padding: 4px 10px;
784
+ border-radius: 999px;
785
+ font-size: 12px;
786
+ font-weight: 400;
787
+ color: var(--muted);
788
+ background: none;
789
+ white-space: nowrap;
790
+ pointer-events: none;
791
+ line-height: 1;
792
+ }
793
+
794
+ .panel-save-status--saving {
795
+ color: var(--text);
796
+ }
797
+
798
+ .panel-save-status--saved {
799
+ color: var(--muted);
800
+ opacity: 0.7;
801
+ }
802
+
803
+ .panel-save-status--pending {
804
+ color: var(--muted);
805
+ }
806
+
807
+ .panel-topbar .markdown-editor-mode-toggle {
808
+ margin-left: 2px;
809
+ }
810
+
811
+ .markdown-toc-shell {
812
+ flex: 0 0 var(--toc-rail-width);
813
+ width: var(--toc-rail-width);
814
+ border-right: 1px solid color-mix(in srgb, var(--border) 18%, transparent);
815
+ background: color-mix(in srgb, var(--panel-subtle) 90%, transparent);
816
+ padding: 18px 14px 18px 16px;
817
+ display: flex;
818
+ flex-direction: column;
819
+ align-self: flex-start;
820
+ position: sticky;
821
+ top: 12px;
822
+ max-height: calc(100vh - 120px);
823
+ overflow: visible;
824
+ transition: flex-basis 0.2s ease, width 0.2s ease, padding 0.2s ease;
825
+ }
826
+
827
+ .markdown-toc-header {
828
+ display: flex;
829
+ align-items: center;
830
+ justify-content: space-between;
831
+ margin-bottom: 12px;
832
+ min-height: 20px;
833
+ }
834
+
835
+ .markdown-toc-title {
836
+ font-size: 11px;
837
+ font-weight: 700;
838
+ letter-spacing: 0.08em;
839
+ text-transform: uppercase;
840
+ color: var(--text-secondary);
841
+ }
842
+
843
+ .document-outline-toggle {
844
+ border: none;
845
+ background: transparent;
846
+ color: var(--text-secondary);
847
+ cursor: pointer;
848
+ width: 24px;
849
+ height: 24px;
850
+ padding: 0;
851
+ border-radius: 6px;
852
+ display: flex;
853
+ align-items: center;
854
+ justify-content: center;
855
+ flex-shrink: 0;
856
+ opacity: 0.5;
857
+ transition: opacity 0.15s, background 0.15s;
858
+ }
859
+ .document-outline-toggle:hover {
860
+ opacity: 1;
861
+ background: color-mix(in srgb, var(--border) 20%, transparent);
862
+ }
863
+
864
+ .markdown-toc-collapsed {
865
+ flex: 0 0 44px !important;
866
+ width: 44px !important;
867
+ padding: 12px 6px !important;
868
+ overflow: hidden;
869
+ background: transparent !important;
870
+ border-right: none !important;
871
+ }
872
+ .markdown-toc-collapsed .markdown-toc-header {
873
+ justify-content: center;
874
+ }
875
+ .markdown-toc-collapsed .markdown-toc-title,
876
+ .markdown-toc-collapsed .markdown-toc-nav {
877
+ display: none;
878
+ }
879
+ .markdown-toc-collapsed .document-outline-toggle {
880
+ width: 30px;
881
+ height: 30px;
882
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
883
+ border-radius: 8px;
884
+ opacity: 0.7;
885
+ }
886
+
887
+ .markdown-toc-nav {
888
+ display: flex;
889
+ flex-direction: column;
890
+ gap: 4px;
891
+ overflow: auto;
892
+ min-height: 0;
893
+ }
894
+
895
+ .markdown-toc-link {
896
+ border: none;
897
+ background: transparent;
898
+ color: var(--text-secondary);
899
+ text-align: left;
900
+ font: inherit;
901
+ font-size: 13px;
902
+ line-height: 1.35;
903
+ padding: 6px 8px;
904
+ border-radius: 8px;
905
+ cursor: pointer;
906
+ }
907
+
908
+ .markdown-toc-link[data-level="2"] { padding-left: 16px; }
909
+ .markdown-toc-link[data-level="3"] { padding-left: 24px; }
910
+ .markdown-toc-link[data-level="4"] { padding-left: 32px; }
911
+ .markdown-toc-link[data-level="5"] { padding-left: 40px; }
912
+ .markdown-toc-link[data-level="6"] { padding-left: 48px; }
913
+
914
+ .markdown-toc-link:hover {
915
+ color: var(--text);
916
+ background: color-mix(in srgb, var(--panel) 72%, transparent);
917
+ }
918
+
919
+ .markdown-toc-link.is-active {
920
+ color: var(--text);
921
+ background: color-mix(in srgb, var(--panel) 82%, var(--border) 18%);
922
+ }
923
+
924
+ .markdown-link-popover {
925
+ position: absolute;
926
+ z-index: 10;
927
+ display: flex;
928
+ align-items: center;
929
+ gap: 2px;
930
+ background: var(--panel);
931
+ border: 1px solid var(--border);
932
+ border-radius: 8px;
933
+ padding: 4px;
934
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
935
+ }
936
+ .markdown-link-popover[hidden] { display: none; }
937
+ .markdown-link-popover-btn {
938
+ border: none;
939
+ background: transparent;
940
+ color: var(--text-secondary);
941
+ cursor: pointer;
942
+ width: 28px;
943
+ height: 28px;
944
+ padding: 0;
945
+ border-radius: 6px;
946
+ display: flex;
947
+ align-items: center;
948
+ justify-content: center;
949
+ }
950
+ .markdown-link-popover-btn:hover {
951
+ color: var(--text);
952
+ background: color-mix(in srgb, var(--border) 30%, transparent);
953
+ }
954
+
955
+ .markdown-editor-root {
956
+ flex: 1 1 auto;
957
+ min-height: 0;
958
+ padding: 0;
959
+ position: relative;
960
+ }
961
+
962
+ .markdown-editor-surface {
963
+ flex: 1 1 auto;
964
+ min-height: min(70vh, 760px);
965
+ outline: none;
966
+ }
967
+
968
+ .markdown-editor-surface--markdown {
969
+ max-width: none;
970
+ margin: 0;
971
+ padding: 22px 24px 28px;
972
+ }
973
+
974
+ .markdown-editor-textarea {
975
+ width: 100%;
976
+ min-height: min(70vh, 760px);
977
+ border: 0;
978
+ border-radius: 0;
979
+ background: transparent;
980
+ color: var(--text);
981
+ font-family: var(--font-mono, ui-monospace, monospace);
982
+ font-size: 14px;
983
+ line-height: 1.65;
984
+ padding: 18px 20px 24px;
985
+ resize: none;
986
+ overflow: hidden;
987
+ outline: none;
988
+ }
989
+
990
+ .markdown-editor-textarea:focus {
991
+ box-shadow: none;
992
+ }
993
+
994
+ .image-content {
995
+ display: flex;
996
+ align-items: center;
997
+ justify-content: center;
998
+ background: linear-gradient(135deg, color-mix(in oklab, var(--panel) 86%, var(--panel-muted) 14%), var(--panel));
999
+ padding: 16px;
1000
+ }
1001
+
1002
+ .image-preview {
1003
+ width: 100%;
1004
+ max-width: 920px;
1005
+ display: flex;
1006
+ align-items: center;
1007
+ justify-content: center;
1008
+ }
1009
+
1010
+ .image-preview img {
1011
+ max-width: 100%;
1012
+ max-height: var(--content-height);
1013
+ object-fit: contain;
1014
+ border-radius: 8px;
1015
+ border: 1px solid var(--border);
1016
+ background: var(--panel);
1017
+ }
1018
+
1019
+ .notice {
1020
+ background: var(--notice-bg);
1021
+ color: var(--notice-text);
1022
+ padding: 10px 16px;
1023
+ font-size: 13px;
1024
+ }
1025
+
1026
+ /* ── Load-more banners ── */
1027
+
1028
+ .load-lines-banner {
1029
+ display: block;
1030
+ width: 100%;
1031
+ padding: 8px 16px;
1032
+ font-size: 12px;
1033
+ font-family: inherit;
1034
+ color: var(--text-secondary);
1035
+ background: color-mix(in srgb, var(--panel-muted) 40%, transparent);
1036
+ border: none;
1037
+ cursor: pointer;
1038
+ text-align: center;
1039
+ transition: color 150ms ease, background 150ms ease;
1040
+ }
1041
+
1042
+ #load-before {
1043
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
1044
+ }
1045
+
1046
+ #load-after {
1047
+ border-top: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
1048
+ }
1049
+
1050
+ .load-lines-banner:hover {
1051
+ color: var(--text-secondary);
1052
+ background: var(--panel-muted);
1053
+ }
1054
+
1055
+ .load-lines-banner:disabled {
1056
+ opacity: 0.5;
1057
+ cursor: not-allowed;
1058
+ }
1059
+
1060
+ /* ── Code viewer ── */
1061
+
1062
+ .code-viewer {
1063
+ background: transparent;
1064
+ color: var(--code-text);
1065
+ overflow-x: auto;
1066
+ padding: 12px 0;
1067
+ margin: 0;
1068
+ font-family: var(--font-mono, ui-monospace, monospace);
1069
+ line-height: 1.5;
1070
+ font-size: 13px;
1071
+ white-space: pre;
1072
+ border: 0;
1073
+ border-radius: 0;
1074
+ }
1075
+
1076
+ .code-table {
1077
+ border-collapse: collapse;
1078
+ border-spacing: 0;
1079
+ width: 100%;
1080
+ }
1081
+
1082
+ .code-line {
1083
+ transition: background 80ms ease;
1084
+ }
1085
+
1086
+ .code-line:hover {
1087
+ background: color-mix(in srgb, var(--panel-muted) 50%, transparent);
1088
+ }
1089
+
1090
+ .code-line.selected {
1091
+ background: color-mix(in srgb, var(--border) 40%, transparent);
1092
+ }
1093
+
1094
+ .code-line.selected:hover {
1095
+ background: color-mix(in srgb, var(--border) 55%, transparent);
1096
+ }
1097
+
1098
+ .line-num {
1099
+ padding: 0 12px 0 18px;
1100
+ text-align: right;
1101
+ color: var(--muted);
1102
+ opacity: 0.5;
1103
+ user-select: none;
1104
+ cursor: pointer;
1105
+ vertical-align: top;
1106
+ white-space: nowrap;
1107
+ font-size: 12px;
1108
+ min-width: 2.5em;
1109
+ transition: opacity 120ms ease;
1110
+ }
1111
+
1112
+ .line-num:hover {
1113
+ opacity: 1;
1114
+ color: var(--text-secondary);
1115
+ }
1116
+
1117
+ .code-line.selected .line-num {
1118
+ opacity: 0.8;
1119
+ }
1120
+
1121
+ .line-content {
1122
+ padding: 0 18px 0 8px;
1123
+ white-space: pre;
1124
+ width: 100%;
1125
+ }
1126
+
1127
+ .code-viewer .hljs {
1128
+ display: block;
1129
+ background: transparent;
1130
+ color: inherit;
1131
+ }
1132
+
1133
+ /* ── Syntax tokens ── */
1134
+
1135
+ .hljs-comment, .hljs-quote { color: var(--hljs-comment); }
1136
+ .hljs-keyword, .hljs-selector-tag, .hljs-name, .hljs-section,
1137
+ .hljs-selector-id, .hljs-selector-class, .hljs-doctag, .hljs-regexp { color: var(--hljs-keyword); }
1138
+ .hljs-string, .hljs-template-tag, .hljs-template-variable, .hljs-variable { color: var(--hljs-string); }
1139
+ .hljs-type, .hljs-params, .hljs-variable.language_ { color: var(--hljs-type); }
1140
+
1141
+ .hljs-number, .hljs-literal, .hljs-symbol, .hljs-bullet { color: var(--hljs-number); }
1142
+ .hljs-attr, .hljs-attribute, .hljs-property { color: var(--hljs-attr); }
1143
+ .hljs-built_in, .hljs-built-in { color: var(--hljs-built-in); }
1144
+ .hljs-tag, .hljs-selector-pseudo, .hljs-selector-attr { color: var(--hljs-tag); }
1145
+ .hljs-title, .hljs-title.class_, .hljs-title.function_,
1146
+ .hljs-meta, .hljs-meta .hljs-keyword, .hljs-subst,
1147
+ .hljs-punctuation, .hljs-operator { color: inherit; }
1148
+
1149
+ /* ── Markdown (typographic, airy, Medium-inspired) ── */
1150
+
1151
+ .markdown h1, .markdown h2, .markdown h3 { letter-spacing: -.015em; }
1152
+ .markdown p { margin: 1em 0; }
1153
+ .markdown ul, .markdown ol { margin: .8em 0; padding-left: 1.4rem; }
1154
+
1155
+ .markdown-doc {
1156
+ max-width: 720px;
1157
+ margin: 0 auto;
1158
+ padding: 32px 28px 36px;
1159
+ line-height: 1.8;
1160
+ color: var(--markdown-text);
1161
+ font-size: 16px;
1162
+ background: transparent;
1163
+ border: 0;
1164
+ border-radius: 0;
1165
+ }
1166
+
1167
+ .markdown-doc h1 {
1168
+ margin: 0 0 24px;
1169
+ font-size: 28px;
1170
+ font-weight: 600;
1171
+ line-height: 1.25;
1172
+ letter-spacing: -0.02em;
1173
+ color: var(--markdown-text);
1174
+ }
1175
+
1176
+ .markdown-doc h2 {
1177
+ margin: 36px 0 16px;
1178
+ font-size: 22px;
1179
+ font-weight: 600;
1180
+ line-height: 1.3;
1181
+ letter-spacing: -0.01em;
1182
+ color: var(--markdown-text);
1183
+ }
1184
+
1185
+ .markdown-doc h3 {
1186
+ margin: 28px 0 12px;
1187
+ font-size: 18px;
1188
+ font-weight: 600;
1189
+ line-height: 1.35;
1190
+ color: var(--markdown-text);
1191
+ }
1192
+
1193
+ .markdown-doc p {
1194
+ font-size: 15px;
1195
+ line-height: 1.75;
1196
+ color: var(--markdown-muted);
1197
+ margin: 0 0 1.2em;
1198
+ }
1199
+
1200
+ .markdown-doc li {
1201
+ font-size: 15px;
1202
+ line-height: 1.7;
1203
+ color: var(--markdown-muted);
1204
+ margin-bottom: 0.3em;
1205
+ }
1206
+
1207
+ .markdown-doc ul, .markdown-doc ol {
1208
+ margin: 8px 0 20px;
1209
+ padding-left: 1.3em;
1210
+ }
1211
+
1212
+ .markdown-doc blockquote {
1213
+ margin: 20px 0;
1214
+ padding: 2px 0 2px 20px;
1215
+ border-left: 3px solid color-mix(in srgb, var(--border) 70%, transparent);
1216
+ color: var(--markdown-muted);
1217
+ font-style: italic;
1218
+ }
1219
+
1220
+ .markdown-doc hr {
1221
+ border: none;
1222
+ border-top: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
1223
+ margin: 32px 0;
1224
+ }
1225
+
1226
+ .markdown-doc img {
1227
+ max-width: 100%;
1228
+ border-radius: 8px;
1229
+ margin: 16px 0;
1230
+ }
1231
+
1232
+ .markdown-doc code:not(.hljs) {
1233
+ font-family: var(--font-mono, ui-monospace, monospace);
1234
+ font-size: .9em;
1235
+ background: var(--inline-code-bg);
1236
+ color: var(--inline-code-text);
1237
+ border: 1px solid var(--inline-code-border);
1238
+ border-radius: 6px;
1239
+ padding: 2px 6px;
1240
+ }
1241
+
1242
+ .markdown-doc .code-viewer {
1243
+ margin: 14px 0;
1244
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
1245
+ border-radius: 10px;
1246
+ }
1247
+
1248
+ .markdown-doc a {
1249
+ color: inherit;
1250
+ text-decoration: underline;
1251
+ text-decoration-color: color-mix(in srgb, var(--text-secondary) 45%, transparent);
1252
+ text-underline-offset: 0.18em;
1253
+ }
1254
+
1255
+ .markdown-doc a:hover {
1256
+ text-decoration-color: currentcolor;
1257
+ }
1258
+
1259
+ /* ── HTML frame ── */
1260
+
1261
+ .html-rendered-frame {
1262
+ width: 100%;
1263
+ border: 0;
1264
+ border-radius: 0;
1265
+ background: var(--panel);
1266
+ display: block;
1267
+ overflow: hidden;
1268
+ }
1269
+
1270
+ /* ── Responsive ── */
1271
+
1272
+ @media (max-width: 720px) {
1273
+ .markdown-workspace {
1274
+ flex-direction: column;
1275
+ }
1276
+ .markdown-workspace--edit {
1277
+ min-height: auto;
1278
+ }
1279
+ .markdown-workspace--with-toc {
1280
+ background: transparent;
1281
+ }
1282
+ .markdown-editor-shell {
1283
+ padding: 12px;
1284
+ }
1285
+ .markdown-toc-shell {
1286
+ position: static;
1287
+ top: auto;
1288
+ max-height: none;
1289
+ overflow: visible;
1290
+ align-self: stretch;
1291
+ width: 100% !important;
1292
+ flex-basis: auto !important;
1293
+ border-right: none;
1294
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 45%, transparent);
1295
+ }
1296
+ .markdown-toc-collapsed .markdown-toc-title,
1297
+ .markdown-toc-collapsed .markdown-toc-nav {
1298
+ display: flex;
1299
+ }
1300
+ .document-outline-toggle {
1301
+ display: none;
1302
+ }
1303
+ .markdown-workspace-main {
1304
+ padding-left: 0;
1305
+ }
1306
+ .markdown-toc-nav {
1307
+ max-height: 40vh;
1308
+ }
1309
+ .markdown-editor-root {
1310
+ padding: 0;
1311
+ }
1312
+ .markdown-editor-textarea {
1313
+ min-height: 58vh;
1314
+ padding: 14px;
1315
+ }
1316
+ .markdown-editor-surface--markdown {
1317
+ padding: 16px;
1318
+ }
1319
+ .markdown-doc { padding: 16px; }
1320
+ .markdown-doc h1 { font-size: 27px; }
1321
+ .markdown-doc h2 { font-size: 22px; }
1322
+ .markdown-doc h3 { font-size: 18px; }
1323
+ .markdown-doc p, .markdown-doc li { font-size: 15px; }
1324
+ }
1325
+
1326
+ /* ── Directory tree ── */
1327
+
1328
+ .directory-content {
1329
+ padding: 12px 16px;
1330
+ font-family: var(--font-mono, ui-monospace, monospace);
1331
+ font-size: 13px;
1332
+ line-height: 1.6;
1333
+ }
1334
+
1335
+ .dir-tree {
1336
+ display: flex;
1337
+ flex-direction: column;
1338
+ }
1339
+
1340
+ .dir-entry, .dir-entry-group {
1341
+ display: flex;
1342
+ flex-direction: column;
1343
+ }
1344
+
1345
+ .dir-row {
1346
+ display: flex;
1347
+ align-items: center;
1348
+ gap: 4px;
1349
+ padding: 2px 6px;
1350
+ border-radius: 4px;
1351
+ cursor: pointer;
1352
+ user-select: none;
1353
+ }
1354
+
1355
+ .dir-row:hover {
1356
+ background: color-mix(in srgb, var(--text) 8%, transparent);
1357
+ }
1358
+
1359
+ .dir-row-file:active {
1360
+ background: color-mix(in srgb, var(--text) 14%, transparent);
1361
+ }
1362
+
1363
+ .dir-row.dir-loading {
1364
+ opacity: 0.5;
1365
+ pointer-events: none;
1366
+ }
1367
+
1368
+ .dir-children {
1369
+ padding-left: 20px;
1370
+ border-left: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
1371
+ margin-left: 11px;
1372
+ }
1373
+
1374
+ .dir-children.dir-collapsed {
1375
+ display: none;
1376
+ }
1377
+
1378
+ .dir-chevron {
1379
+ display: inline-block;
1380
+ width: 14px;
1381
+ text-align: center;
1382
+ font-size: 10px;
1383
+ color: var(--secondary);
1384
+ flex-shrink: 0;
1385
+ transition: transform 0.15s ease;
1386
+ }
1387
+
1388
+ .dir-icon, .file-icon {
1389
+ font-size: 14px;
1390
+ flex-shrink: 0;
1391
+ }
1392
+
1393
+ .dir-name {
1394
+ font-weight: 600;
1395
+ color: var(--text);
1396
+ }
1397
+
1398
+ .dir-name-denied {
1399
+ color: var(--secondary);
1400
+ text-decoration: line-through;
1401
+ }
1402
+
1403
+ .file-name {
1404
+ color: var(--secondary);
1405
+ }
1406
+
1407
+ .dir-row-file:hover .file-name {
1408
+ color: var(--text);
1409
+ }
1410
+
1411
+ .dir-empty {
1412
+ color: var(--secondary);
1413
+ font-style: italic;
1414
+ padding: 4px 6px;
1415
+ }
1416
+
1417
+ .dir-row-warning {
1418
+ cursor: default;
1419
+ opacity: 0.7;
1420
+ font-style: italic;
1421
+ font-size: 12px;
1422
+ }
1423
+
1424
+ .dir-row-warning:hover {
1425
+ background: none;
1426
+ }
1427
+
1428
+ .dir-load-more {
1429
+ cursor: pointer;
1430
+ }
1431
+
1432
+ .dir-load-more:hover {
1433
+ background: color-mix(in srgb, var(--text) 8%, transparent) !important;
1434
+ opacity: 1;
1435
+ }
1436
+
1437
+ .dir-load-more:hover .dir-warning-text {
1438
+ text-decoration: underline;
1439
+ }
1440
+
1441
+ .dir-warning-text {
1442
+ color: var(--secondary);
1443
+ }
1444
+
1445
+ .dir-back-btn {
1446
+ flex-shrink: 0;
1447
+ margin-right: 4px;
1448
+ font-weight: 600;
1449
+ }
1450
+
1451
+ .dir-open-btn {
1452
+ margin-left: 6px;
1453
+ padding: 0 4px;
1454
+ border: none;
1455
+ background: none;
1456
+ cursor: pointer;
1457
+ font-size: 13px;
1458
+ opacity: 0;
1459
+ flex-shrink: 0;
1460
+ border-radius: 3px;
1461
+ pointer-events: none;
1462
+ transition: opacity 0.1s ease;
1463
+ }
1464
+
1465
+ .dir-open-btn:hover {
1466
+ background: color-mix(in srgb, var(--text) 10%, transparent);
1467
+ }
1468
+
1469
+ .dir-row-folder:hover .dir-open-btn {
1470
+ opacity: 0.6;
1471
+ pointer-events: auto;
1472
+ }
1473
+
1474
+ .dir-row-folder:hover .dir-open-btn:hover {
1475
+ opacity: 1;
1476
+ }
1477
+
1478
+ /* === File-changed-on-disk conflict modal === */
1479
+
1480
+ .md-conflict-modal[hidden] {
1481
+ display: none;
1482
+ }
1483
+
1484
+ .md-conflict-modal {
1485
+ position: fixed;
1486
+ inset: 0;
1487
+ background: rgba(0, 0, 0, 0.42);
1488
+ display: grid;
1489
+ place-items: center;
1490
+ z-index: 50;
1491
+ padding: 16px;
1492
+ box-sizing: border-box;
1493
+ }
1494
+
1495
+ .md-conflict-card {
1496
+ width: min(480px, 100%);
1497
+ max-height: min(80vh, 560px);
1498
+ background: var(--panel);
1499
+ color: var(--text);
1500
+ border: 1px solid var(--border);
1501
+ border-radius: 10px;
1502
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
1503
+ padding: 0;
1504
+ display: flex;
1505
+ flex-direction: column;
1506
+ overflow: hidden;
1507
+ }
1508
+
1509
+ .md-conflict-header {
1510
+ display: flex;
1511
+ align-items: center;
1512
+ justify-content: space-between;
1513
+ padding: 14px 16px 10px;
1514
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
1515
+ }
1516
+
1517
+ .md-conflict-header h3 {
1518
+ margin: 0;
1519
+ font-size: 14px;
1520
+ font-weight: 600;
1521
+ color: var(--text);
1522
+ }
1523
+
1524
+ .md-conflict-close {
1525
+ display: inline-flex;
1526
+ align-items: center;
1527
+ justify-content: center;
1528
+ width: 24px;
1529
+ height: 24px;
1530
+ padding: 0;
1531
+ background: transparent;
1532
+ border: none;
1533
+ border-radius: 4px;
1534
+ color: var(--text-secondary);
1535
+ cursor: pointer;
1536
+ transition: background-color 120ms ease, color 120ms ease;
1537
+ }
1538
+
1539
+ .md-conflict-close:hover {
1540
+ background: var(--panel-subtle);
1541
+ color: var(--text);
1542
+ }
1543
+
1544
+ .md-conflict-close svg {
1545
+ width: 16px;
1546
+ height: 16px;
1547
+ }
1548
+
1549
+ .md-conflict-body {
1550
+ padding: 14px 16px;
1551
+ overflow-y: auto;
1552
+ font-size: 13px;
1553
+ line-height: 1.5;
1554
+ color: var(--text);
1555
+ }
1556
+
1557
+ .md-conflict-body p {
1558
+ margin: 0 0 10px;
1559
+ }
1560
+
1561
+ .md-conflict-body p:last-of-type {
1562
+ margin-bottom: 8px;
1563
+ }
1564
+
1565
+ .md-conflict-body ul {
1566
+ margin: 0 0 4px;
1567
+ padding-left: 20px;
1568
+ color: var(--text-secondary);
1569
+ }
1570
+
1571
+ .md-conflict-body li {
1572
+ margin-bottom: 4px;
1573
+ }
1574
+
1575
+ .md-conflict-filename {
1576
+ font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
1577
+ font-weight: 600;
1578
+ word-break: break-all;
1579
+ }
1580
+
1581
+ .md-conflict-footer {
1582
+ display: flex;
1583
+ justify-content: flex-end;
1584
+ gap: 8px;
1585
+ padding: 12px 16px 14px;
1586
+ border-top: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
1587
+ background: color-mix(in srgb, var(--panel-subtle) 50%, transparent);
1588
+ }
1589
+
1590
+ .md-conflict-btn {
1591
+ appearance: none;
1592
+ font: inherit;
1593
+ font-size: 13px;
1594
+ font-weight: 500;
1595
+ padding: 7px 14px;
1596
+ border-radius: 6px;
1597
+ cursor: pointer;
1598
+ border: 1px solid var(--border);
1599
+ background: var(--panel);
1600
+ color: var(--text);
1601
+ transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease;
1602
+ }
1603
+
1604
+ .md-conflict-btn:hover {
1605
+ background: var(--panel-subtle);
1606
+ }
1607
+
1608
+ .md-conflict-btn:focus-visible {
1609
+ outline: 2px solid var(--accent, #4a8cff);
1610
+ outline-offset: 2px;
1611
+ }
1612
+
1613
+ .md-conflict-btn--secondary {
1614
+ color: var(--text-secondary);
1615
+ }
1616
+
1617
+ .md-conflict-btn--secondary:hover {
1618
+ color: var(--text);
1619
+ border-color: color-mix(in srgb, var(--border) 80%, var(--text) 20%);
1620
+ }
1621
+
1622
+ .md-conflict-btn--primary {
1623
+ background: var(--accent, #4a8cff);
1624
+ color: #fff;
1625
+ border-color: color-mix(in srgb, var(--accent, #4a8cff) 85%, black 15%);
1626
+ }
1627
+
1628
+ .md-conflict-btn--primary:hover {
1629
+ background: color-mix(in srgb, var(--accent, #4a8cff) 88%, black 12%);
1630
+ }
1631
1631