@wonderwhy-er/desktop-commander 0.2.35 → 0.2.37

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 (132) hide show
  1. package/README.md +3 -0
  2. package/dist/handlers/filesystem-handlers.js +58 -11
  3. package/dist/handlers/history-handlers.d.ts +7 -0
  4. package/dist/handlers/history-handlers.js +33 -1
  5. package/dist/remote-device/remote-channel.d.ts +8 -3
  6. package/dist/remote-device/remote-channel.js +68 -21
  7. package/dist/search-manager.d.ts +13 -0
  8. package/dist/search-manager.js +146 -0
  9. package/dist/server.js +56 -4
  10. package/dist/test-docx.d.ts +1 -0
  11. package/dist/tools/docx/builders/image.d.ts +14 -0
  12. package/dist/tools/docx/builders/image.js +84 -0
  13. package/dist/tools/docx/builders/index.d.ts +9 -3
  14. package/dist/tools/docx/builders/index.js +9 -3
  15. package/dist/tools/docx/builders/paragraph.d.ts +12 -0
  16. package/dist/tools/docx/builders/paragraph.js +29 -0
  17. package/dist/tools/docx/builders/table.d.ts +10 -0
  18. package/dist/tools/docx/builders/table.js +138 -0
  19. package/dist/tools/docx/builders/utils.d.ts +5 -0
  20. package/dist/tools/docx/builders/utils.js +18 -0
  21. package/dist/tools/docx/constants.d.ts +28 -32
  22. package/dist/tools/docx/constants.js +56 -52
  23. package/dist/tools/docx/create.d.ts +21 -0
  24. package/dist/tools/docx/create.js +386 -0
  25. package/dist/tools/docx/dom.d.ts +139 -0
  26. package/dist/tools/docx/dom.js +448 -0
  27. package/dist/tools/docx/index.d.ts +8 -12
  28. package/dist/tools/docx/index.js +8 -14
  29. package/dist/tools/docx/modify.d.ts +28 -0
  30. package/dist/tools/docx/modify.js +271 -0
  31. package/dist/tools/docx/ops/delete-paragraph-at-body-index.d.ts +11 -0
  32. package/dist/tools/docx/ops/delete-paragraph-at-body-index.js +23 -0
  33. package/dist/tools/docx/ops/header-replace-text-exact.d.ts +13 -0
  34. package/dist/tools/docx/ops/header-replace-text-exact.js +55 -0
  35. package/dist/tools/docx/ops/index.d.ts +17 -0
  36. package/dist/tools/docx/ops/index.js +70 -0
  37. package/dist/tools/docx/ops/insert-image-after-text.d.ts +24 -0
  38. package/dist/tools/docx/ops/insert-image-after-text.js +128 -0
  39. package/dist/tools/docx/ops/insert-paragraph-after-text.d.ts +12 -0
  40. package/dist/tools/docx/ops/insert-paragraph-after-text.js +74 -0
  41. package/dist/tools/docx/ops/insert-table-after-text.d.ts +19 -0
  42. package/dist/tools/docx/ops/insert-table-after-text.js +57 -0
  43. package/dist/tools/docx/ops/replace-hyperlink-url.d.ts +12 -0
  44. package/dist/tools/docx/ops/replace-hyperlink-url.js +37 -0
  45. package/dist/tools/docx/ops/replace-paragraph-at-body-index.d.ts +9 -0
  46. package/dist/tools/docx/ops/replace-paragraph-at-body-index.js +25 -0
  47. package/dist/tools/docx/ops/replace-paragraph-text-exact.d.ts +21 -0
  48. package/dist/tools/docx/ops/replace-paragraph-text-exact.js +36 -0
  49. package/dist/tools/docx/ops/replace-table-cell-text.d.ts +25 -0
  50. package/dist/tools/docx/ops/replace-table-cell-text.js +85 -0
  51. package/dist/tools/docx/ops/set-color-for-paragraph-exact.d.ts +9 -0
  52. package/dist/tools/docx/ops/set-color-for-paragraph-exact.js +24 -0
  53. package/dist/tools/docx/ops/set-color-for-style.d.ts +13 -0
  54. package/dist/tools/docx/ops/set-color-for-style.js +31 -0
  55. package/dist/tools/docx/ops/set-paragraph-style-at-body-index.d.ts +8 -0
  56. package/dist/tools/docx/ops/set-paragraph-style-at-body-index.js +57 -0
  57. package/dist/tools/docx/ops/table-set-cell-text.d.ts +9 -0
  58. package/dist/tools/docx/ops/table-set-cell-text.js +40 -0
  59. package/dist/tools/docx/read.d.ts +27 -0
  60. package/dist/tools/docx/read.js +308 -0
  61. package/dist/tools/docx/relationships.d.ts +22 -0
  62. package/dist/tools/docx/relationships.js +76 -0
  63. package/dist/tools/docx/types.d.ts +202 -103
  64. package/dist/tools/docx/types.js +2 -5
  65. package/dist/tools/docx/validate.d.ts +33 -0
  66. package/dist/tools/docx/validate.js +49 -0
  67. package/dist/tools/docx/write.d.ts +17 -0
  68. package/dist/tools/docx/write.js +88 -0
  69. package/dist/tools/docx/xml-view-test.d.ts +1 -0
  70. package/dist/tools/docx/xml-view-test.js +63 -0
  71. package/dist/tools/docx/xml-view.d.ts +56 -0
  72. package/dist/tools/docx/xml-view.js +169 -0
  73. package/dist/tools/docx/zip.d.ts +21 -0
  74. package/dist/tools/docx/zip.js +35 -0
  75. package/dist/tools/edit.js +57 -27
  76. package/dist/tools/schemas.d.ts +13 -0
  77. package/dist/tools/schemas.js +6 -1
  78. package/dist/types.d.ts +10 -0
  79. package/dist/ui/contracts.d.ts +14 -0
  80. package/dist/ui/contracts.js +18 -0
  81. package/dist/ui/file-preview/index.html +16 -0
  82. package/dist/ui/file-preview/preview-runtime.js +13983 -0
  83. package/dist/ui/file-preview/shared/preview-file-types.d.ts +5 -0
  84. package/dist/ui/file-preview/shared/preview-file-types.js +57 -0
  85. package/dist/ui/file-preview/src/app.d.ts +4 -0
  86. package/dist/ui/file-preview/src/app.js +800 -0
  87. package/dist/ui/file-preview/src/components/code-viewer.d.ts +6 -0
  88. package/dist/ui/file-preview/src/components/code-viewer.js +73 -0
  89. package/dist/ui/file-preview/src/components/highlighting.d.ts +2 -0
  90. package/dist/ui/file-preview/src/components/highlighting.js +54 -0
  91. package/dist/ui/file-preview/src/components/html-renderer.d.ts +9 -0
  92. package/dist/ui/file-preview/src/components/html-renderer.js +63 -0
  93. package/dist/ui/file-preview/src/components/markdown-renderer.d.ts +1 -0
  94. package/dist/ui/file-preview/src/components/markdown-renderer.js +21 -0
  95. package/dist/ui/file-preview/src/components/toolbar.d.ts +6 -0
  96. package/dist/ui/file-preview/src/components/toolbar.js +75 -0
  97. package/dist/ui/file-preview/src/image-preview.d.ts +3 -0
  98. package/dist/ui/file-preview/src/image-preview.js +21 -0
  99. package/dist/ui/file-preview/src/main.d.ts +1 -0
  100. package/dist/ui/file-preview/src/main.js +5 -0
  101. package/dist/ui/file-preview/src/types.d.ts +1 -0
  102. package/dist/ui/file-preview/src/types.js +1 -0
  103. package/dist/ui/file-preview/styles.css +764 -0
  104. package/dist/ui/resources.d.ts +21 -0
  105. package/dist/ui/resources.js +72 -0
  106. package/dist/ui/shared/escape-html.d.ts +4 -0
  107. package/dist/ui/shared/escape-html.js +11 -0
  108. package/dist/ui/shared/host-lifecycle.d.ts +16 -0
  109. package/dist/ui/shared/host-lifecycle.js +35 -0
  110. package/dist/ui/shared/rpc-client.d.ts +14 -0
  111. package/dist/ui/shared/rpc-client.js +72 -0
  112. package/dist/ui/shared/theme-adaptation.d.ts +10 -0
  113. package/dist/ui/shared/theme-adaptation.js +118 -0
  114. package/dist/ui/shared/tool-header.d.ts +9 -0
  115. package/dist/ui/shared/tool-header.js +25 -0
  116. package/dist/ui/shared/tool-shell.d.ts +16 -0
  117. package/dist/ui/shared/tool-shell.js +65 -0
  118. package/dist/ui/shared/widget-state.d.ts +28 -0
  119. package/dist/ui/shared/widget-state.js +60 -0
  120. package/dist/utils/capture.d.ts +1 -0
  121. package/dist/utils/capture.js +176 -8
  122. package/dist/utils/files/base.d.ts +3 -1
  123. package/dist/utils/files/docx.d.ts +28 -22
  124. package/dist/utils/files/docx.js +630 -196
  125. package/dist/utils/files/factory.d.ts +6 -5
  126. package/dist/utils/files/factory.js +18 -6
  127. package/dist/utils/files/text.js +9 -1
  128. package/dist/utils/system-info.js +1 -1
  129. package/dist/utils/usageTracker.js +5 -0
  130. package/dist/version.d.ts +1 -1
  131. package/dist/version.js +1 -1
  132. package/package.json +6 -2
@@ -0,0 +1,764 @@
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
+ --bg: transparent;
7
+ --panel: var(--color-background-primary, Canvas);
8
+ --panel-subtle: var(--color-background-tertiary, ButtonFace);
9
+ --panel-muted: var(--color-background-muted, ButtonFace);
10
+ --text: var(--color-text-primary, CanvasText);
11
+ --text-secondary: var(--color-text-secondary, CanvasText);
12
+ --muted: var(--color-text-tertiary, GrayText);
13
+ --border: var(--color-border-default, GrayText);
14
+ --accent: var(--color-accent-primary, LinkText);
15
+ --accent-hover: var(--color-accent-primary-hover, var(--accent));
16
+ --accent-soft: var(--color-accent-subtle, var(--panel-subtle));
17
+ --focus-ring: var(--color-border-focused, var(--accent));
18
+ --shadow-sm: var(--shadow-sm, none);
19
+ --success-bg: var(--color-background-success, var(--panel-subtle));
20
+ --success-border: var(--color-border-success, var(--border));
21
+ --success-text: var(--color-text-success, var(--text));
22
+ --error-bg: var(--color-background-danger, var(--panel-subtle));
23
+ --error-border: var(--color-border-danger, var(--border));
24
+ --error-text: var(--color-text-danger, var(--text));
25
+ --warning-bg: var(--color-background-warning, var(--panel-subtle));
26
+ --warning-border: var(--color-border-warning, var(--border));
27
+ --warning-text: var(--color-text-warning, var(--text));
28
+ }
29
+
30
+ * {
31
+ box-sizing: border-box;
32
+ }
33
+
34
+ body {
35
+ margin: 0;
36
+ background: var(--bg);
37
+ color: var(--text);
38
+ font-family: var(--font-sans, system-ui, sans-serif);
39
+ max-height: 32px;
40
+ overflow: hidden;
41
+ }
42
+
43
+ body.dc-ready {
44
+ max-height: none;
45
+ overflow: visible;
46
+ }
47
+
48
+ #app {
49
+ min-height: 0;
50
+ }
51
+
52
+ .shell {
53
+ max-width: none;
54
+ margin: 0;
55
+ padding: 6px;
56
+ }
57
+
58
+ .tool-shell.collapsed .panel {
59
+ display: none;
60
+ }
61
+
62
+ .hidden {
63
+ display: none !important;
64
+ }
65
+
66
+
67
+ /*
68
+ * Reusable styles for the shared tool header component. It provides consistent spacing, alignment, and action presentation across apps.
69
+ */
70
+ .toolbar {
71
+ display: flex;
72
+ gap: 10px;
73
+ align-items: center;
74
+ justify-content: space-between;
75
+ padding: 8px 10px;
76
+ border: 1px solid var(--border);
77
+ border-radius: 12px;
78
+ background: var(--panel);
79
+ margin-bottom: 0;
80
+ box-shadow: var(--shadow-sm);
81
+ }
82
+
83
+ .meta {
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: space-between;
87
+ gap: 12px;
88
+ min-width: 0;
89
+ width: 100%;
90
+ flex: 1 1 auto;
91
+ }
92
+
93
+ .meta-main {
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 10px;
97
+ min-width: 0;
98
+ }
99
+
100
+ .file-pill {
101
+ width: 52px;
102
+ height: 20px;
103
+ border-radius: 6px;
104
+ display: inline-flex;
105
+ align-items: center;
106
+ justify-content: center;
107
+ font-size: 10px;
108
+ font-weight: 700;
109
+ letter-spacing: 0.2px;
110
+ background: transparent;
111
+ color: var(--text);
112
+ border: 1px solid var(--border);
113
+ flex-shrink: 0;
114
+ text-align: center;
115
+ }
116
+
117
+ .file-pill--md {
118
+ background: transparent;
119
+ color: var(--text);
120
+ border-color: var(--border);
121
+ }
122
+
123
+ .file-pill--html {
124
+ background: transparent;
125
+ color: var(--text);
126
+ border-color: var(--border);
127
+ }
128
+
129
+ .file-pill--json {
130
+ background: transparent;
131
+ color: var(--text);
132
+ border-color: var(--border);
133
+ }
134
+
135
+ .file-pill--text {
136
+ background: transparent;
137
+ color: var(--muted);
138
+ border-color: var(--border);
139
+ }
140
+
141
+ .meta-text {
142
+ display: flex;
143
+ flex-direction: row;
144
+ align-items: baseline;
145
+ min-width: 0;
146
+ gap: 8px;
147
+ }
148
+
149
+ .filename {
150
+ font-weight: 600;
151
+ white-space: nowrap;
152
+ overflow: hidden;
153
+ text-overflow: ellipsis;
154
+ max-width: 460px;
155
+ font-size: 12px;
156
+ }
157
+
158
+ .filepath {
159
+ color: var(--muted);
160
+ font-size: 10px;
161
+ white-space: nowrap;
162
+ overflow: hidden;
163
+ text-overflow: ellipsis;
164
+ max-width: 360px;
165
+ }
166
+
167
+ .meta-badges {
168
+ display: flex;
169
+ align-items: center;
170
+ gap: 6px;
171
+ flex-shrink: 0;
172
+ }
173
+
174
+ .badge {
175
+ border-radius: 999px;
176
+ border: 1px solid var(--border);
177
+ color: var(--muted);
178
+ padding: 2px 7px;
179
+ font-size: 10px;
180
+ background: var(--panel-subtle);
181
+ }
182
+
183
+ .actions {
184
+ display: flex;
185
+ align-items: center;
186
+ gap: 6px;
187
+ padding-left: 8px;
188
+ border-left: 1px solid var(--border);
189
+ flex: 0 0 auto;
190
+ }
191
+
192
+ .icon-button {
193
+ width: 30px;
194
+ height: 30px;
195
+ border: 1px solid var(--border);
196
+ background: var(--panel);
197
+ color: var(--muted);
198
+ border-radius: 9px;
199
+ padding: 0;
200
+ display: inline-flex;
201
+ align-items: center;
202
+ justify-content: center;
203
+ cursor: pointer;
204
+ transition: transform 120ms ease, box-shadow 120ms ease, background 120ms ease;
205
+ }
206
+
207
+ .icon-button svg {
208
+ width: 14px;
209
+ height: 14px;
210
+ fill: currentColor;
211
+ }
212
+
213
+ .icon-button:hover {
214
+ background: var(--panel-muted);
215
+ border-color: var(--border);
216
+ box-shadow: var(--shadow-sm);
217
+ }
218
+
219
+ .icon-button:active {
220
+ transform: translateY(1px);
221
+ }
222
+
223
+ .icon-button:disabled {
224
+ cursor: not-allowed;
225
+ opacity: 0.6;
226
+ }
227
+
228
+ .icon-button:focus-visible {
229
+ outline: 2px solid var(--border);
230
+ outline-offset: 2px;
231
+ }
232
+
233
+ .icon-button--secondary {
234
+ border-color: var(--border);
235
+ background: var(--panel-subtle);
236
+ color: var(--text-secondary);
237
+ }
238
+
239
+ @media (max-width: 720px) {
240
+ .shell {
241
+ padding: 12px;
242
+ }
243
+
244
+ .toolbar {
245
+ gap: 8px;
246
+ }
247
+
248
+ .meta {
249
+ gap: 8px;
250
+ }
251
+
252
+ .actions {
253
+ padding-left: 6px;
254
+ }
255
+
256
+ .meta-badges {
257
+ display: none;
258
+ }
259
+
260
+ .meta-text {
261
+ flex-direction: column;
262
+ align-items: flex-start;
263
+ gap: 0;
264
+ }
265
+
266
+ .filename,
267
+ .filepath {
268
+ max-width: 100%;
269
+ }
270
+ }
271
+
272
+
273
+ /*
274
+ * App-specific styling for File Preview — tuned to blend with Claude's UI.
275
+ */
276
+ :root {
277
+ --code-bg: var(--panel);
278
+ --code-text: var(--color-text-primary, var(--text));
279
+ --hljs-keyword: var(--color-text-accent, #8b5cf6);
280
+ --hljs-string: var(--color-text-success, #059669);
281
+ --hljs-comment: var(--color-text-tertiary, #94a3b8);
282
+ --hljs-type: var(--color-text-info, #0f766e);
283
+ --hljs-number: var(--color-text-warning, #b45309);
284
+ --hljs-attr: var(--color-text-info, #2563eb);
285
+ --hljs-built-in: var(--color-text-accent, #6366f1);
286
+ --hljs-tag: var(--color-text-info, #0ea5a8);
287
+ --content-height: min(82vh, 920px);
288
+ --markdown-text: var(--text);
289
+ --markdown-muted: var(--text-secondary);
290
+ --inline-code-bg: var(--panel-subtle);
291
+ --inline-code-border: var(--border);
292
+ --inline-code-text: var(--text);
293
+ --notice-bg: var(--warning-bg);
294
+ --notice-border: var(--warning-border);
295
+ --notice-text: var(--warning-text);
296
+ }
297
+
298
+ /* ── Compact row ── */
299
+
300
+ .compact-row {
301
+ display: flex;
302
+ align-items: center;
303
+ gap: 6px;
304
+ padding: 6px 2px;
305
+ font-size: 13px;
306
+ color: var(--muted);
307
+ line-height: 1;
308
+ user-select: none;
309
+ }
310
+
311
+ .compact-row--ready {
312
+ cursor: pointer;
313
+ border-radius: 8px;
314
+ transition: color 150ms ease;
315
+ }
316
+
317
+ .compact-row--ready:hover { color: var(--text-secondary); }
318
+ .compact-row--ready:hover .compact-chevron { color: var(--text-secondary); }
319
+
320
+ .compact-chevron {
321
+ width: 14px;
322
+ height: 14px;
323
+ fill: currentColor;
324
+ color: var(--muted);
325
+ flex-shrink: 0;
326
+ transition: transform 200ms ease, color 150ms ease;
327
+ }
328
+
329
+ .tool-shell.expanded .compact-chevron { transform: rotate(90deg); }
330
+
331
+ .compact-label { color: inherit; }
332
+ .compact-filename { color: var(--text-secondary); font-weight: 500; }
333
+ .compact-row--ready .compact-label::after { content: ' · '; }
334
+
335
+ .compact-row--loading {
336
+ animation: fade-pulse 1.5s ease-in-out infinite;
337
+ }
338
+
339
+ @keyframes fade-pulse {
340
+ 0%, 100% { opacity: 0.5; }
341
+ 50% { opacity: 1; }
342
+ }
343
+
344
+ /* ── Panel (Claude-style card) ── */
345
+
346
+ .panel {
347
+ margin-top: 6px;
348
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
349
+ border-radius: 16px;
350
+ background: var(--panel);
351
+ overflow: hidden;
352
+ }
353
+
354
+ @media (prefers-color-scheme: dark) {
355
+ .panel {
356
+ background: color-mix(in srgb, var(--panel), white 6%);
357
+ }
358
+ }
359
+
360
+ [data-theme="dark"] .panel {
361
+ background: color-mix(in srgb, var(--panel), white 6%);
362
+ }
363
+
364
+ .tool-shell.collapsed .panel { display: none; }
365
+
366
+ /* ── Top bar ── */
367
+
368
+ .panel-topbar {
369
+ display: flex;
370
+ flex-wrap: nowrap;
371
+ align-items: center;
372
+ gap: 12px;
373
+ padding: 10px 16px;
374
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
375
+ }
376
+
377
+ .panel-breadcrumb {
378
+ font-size: 13px;
379
+ color: var(--text-secondary);
380
+ white-space: nowrap;
381
+ overflow: hidden;
382
+ text-overflow: ellipsis;
383
+ flex: 1 1 0;
384
+ width: 0;
385
+ min-width: 0;
386
+ }
387
+
388
+ .breadcrumb-sep {
389
+ color: color-mix(in srgb, var(--muted) 50%, transparent);
390
+ margin: 0 2px;
391
+ }
392
+
393
+ .panel-topbar-actions {
394
+ display: flex;
395
+ flex-wrap: nowrap;
396
+ align-items: center;
397
+ gap: 4px;
398
+ flex: 0 0 auto;
399
+ margin-left: auto;
400
+ }
401
+
402
+ .panel-action {
403
+ font-size: 13px;
404
+ font-weight: 500;
405
+ color: var(--muted);
406
+ background: none;
407
+ border: none;
408
+ border-radius: 8px;
409
+ padding: 5px 12px;
410
+ cursor: pointer;
411
+ white-space: nowrap;
412
+ transition: color 150ms ease, background 150ms ease;
413
+ line-height: 1.4;
414
+ font-family: inherit;
415
+ display: inline-flex;
416
+ align-items: center;
417
+ gap: 5px;
418
+ }
419
+
420
+ .panel-action:hover {
421
+ color: var(--text);
422
+ background: var(--panel-subtle);
423
+ }
424
+
425
+ .panel-action:disabled {
426
+ opacity: 0.35;
427
+ cursor: not-allowed;
428
+ }
429
+
430
+ .panel-action svg { flex-shrink: 0; opacity: 0.7; }
431
+ .panel-action:hover svg { opacity: 1; }
432
+
433
+ /* ── Footer ── */
434
+
435
+ .panel-footer {
436
+ display: flex;
437
+ align-items: center;
438
+ justify-content: space-between;
439
+ padding: 8px 16px;
440
+ border-top: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
441
+ font-size: 12px;
442
+ color: var(--muted);
443
+ letter-spacing: 0.01em;
444
+ }
445
+
446
+ .footer-comment-btn {
447
+ margin-left: auto;
448
+ }
449
+
450
+ /* ── Selection hint (floating tooltip near selection) ── */
451
+
452
+ .selection-hint {
453
+ position: absolute;
454
+ z-index: 10;
455
+ padding: 4px 10px;
456
+ font-size: 11px;
457
+ color: var(--text-secondary);
458
+ background: var(--panel);
459
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
460
+ border-radius: 6px;
461
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
462
+ white-space: nowrap;
463
+ pointer-events: none;
464
+ opacity: 0;
465
+ transition: opacity 150ms ease;
466
+ }
467
+
468
+ .selection-hint.visible {
469
+ opacity: 1;
470
+ }
471
+
472
+ /* ── Content areas ── */
473
+
474
+ .panel-content-wrapper {
475
+ max-height: var(--content-height);
476
+ overflow: auto;
477
+ position: relative;
478
+ }
479
+
480
+ .panel-content {
481
+ min-height: 0;
482
+ }
483
+
484
+ .source-content .code-viewer { height: 100%; overflow: auto; }
485
+ .html-content .html-rendered-frame { min-height: 300px; height: var(--content-height); }
486
+ .markdown-content { overflow: auto; padding: 0 4px 0 0; }
487
+
488
+ .image-content {
489
+ display: flex;
490
+ align-items: center;
491
+ justify-content: center;
492
+ background: linear-gradient(135deg, color-mix(in oklab, var(--panel) 86%, var(--panel-muted) 14%), var(--panel));
493
+ padding: 16px;
494
+ }
495
+
496
+ .image-preview {
497
+ width: 100%;
498
+ height: var(--content-height);
499
+ max-width: 920px;
500
+ max-height: 100%;
501
+ display: flex;
502
+ align-items: center;
503
+ justify-content: center;
504
+ }
505
+
506
+ .image-preview img {
507
+ max-width: 100%;
508
+ max-height: 100%;
509
+ object-fit: contain;
510
+ border-radius: 8px;
511
+ border: 1px solid var(--border);
512
+ background: var(--panel);
513
+ }
514
+
515
+ .notice {
516
+ background: var(--notice-bg);
517
+ color: var(--notice-text);
518
+ padding: 10px 16px;
519
+ font-size: 13px;
520
+ }
521
+
522
+ /* ── Load-more banners ── */
523
+
524
+ .load-lines-banner {
525
+ display: block;
526
+ width: 100%;
527
+ padding: 8px 16px;
528
+ font-size: 12px;
529
+ font-family: inherit;
530
+ color: var(--text-secondary);
531
+ background: color-mix(in srgb, var(--panel-muted) 40%, transparent);
532
+ border: none;
533
+ cursor: pointer;
534
+ text-align: center;
535
+ transition: color 150ms ease, background 150ms ease;
536
+ }
537
+
538
+ #load-before {
539
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
540
+ }
541
+
542
+ #load-after {
543
+ border-top: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
544
+ }
545
+
546
+ .load-lines-banner:hover {
547
+ color: var(--text-secondary);
548
+ background: var(--panel-muted);
549
+ }
550
+
551
+ .load-lines-banner:disabled {
552
+ opacity: 0.5;
553
+ cursor: not-allowed;
554
+ }
555
+
556
+ /* ── Code viewer ── */
557
+
558
+ .code-viewer {
559
+ background: transparent;
560
+ color: var(--code-text);
561
+ overflow-x: auto;
562
+ padding: 12px 0;
563
+ margin: 0;
564
+ font-family: var(--font-mono, ui-monospace, monospace);
565
+ line-height: 1.5;
566
+ font-size: 13px;
567
+ white-space: pre;
568
+ border: 0;
569
+ border-radius: 0;
570
+ }
571
+
572
+ .code-table {
573
+ border-collapse: collapse;
574
+ border-spacing: 0;
575
+ width: 100%;
576
+ }
577
+
578
+ .code-line {
579
+ transition: background 80ms ease;
580
+ }
581
+
582
+ .code-line:hover {
583
+ background: color-mix(in srgb, var(--panel-muted) 50%, transparent);
584
+ }
585
+
586
+ .code-line.selected {
587
+ background: color-mix(in srgb, var(--border) 40%, transparent);
588
+ }
589
+
590
+ .code-line.selected:hover {
591
+ background: color-mix(in srgb, var(--border) 55%, transparent);
592
+ }
593
+
594
+ .line-num {
595
+ padding: 0 12px 0 18px;
596
+ text-align: right;
597
+ color: var(--muted);
598
+ opacity: 0.5;
599
+ user-select: none;
600
+ cursor: pointer;
601
+ vertical-align: top;
602
+ white-space: nowrap;
603
+ font-size: 12px;
604
+ min-width: 2.5em;
605
+ transition: opacity 120ms ease;
606
+ }
607
+
608
+ .line-num:hover {
609
+ opacity: 1;
610
+ color: var(--text-secondary);
611
+ }
612
+
613
+ .code-line.selected .line-num {
614
+ opacity: 0.8;
615
+ }
616
+
617
+ .line-content {
618
+ padding: 0 18px 0 8px;
619
+ white-space: pre;
620
+ width: 100%;
621
+ }
622
+
623
+ .code-viewer .hljs {
624
+ display: block;
625
+ background: transparent;
626
+ color: inherit;
627
+ }
628
+
629
+ /* ── Syntax tokens ── */
630
+
631
+ .hljs-comment, .hljs-quote { color: var(--hljs-comment); }
632
+ .hljs-keyword, .hljs-selector-tag, .hljs-name, .hljs-section,
633
+ .hljs-selector-id, .hljs-selector-class, .hljs-doctag, .hljs-regexp { color: var(--hljs-keyword); }
634
+ .hljs-string, .hljs-template-tag, .hljs-template-variable, .hljs-variable { color: var(--hljs-string); }
635
+ .hljs-type, .hljs-params, .hljs-variable.language_ { color: var(--hljs-type); }
636
+
637
+ .hljs-number, .hljs-literal, .hljs-symbol, .hljs-bullet { color: var(--hljs-number); }
638
+ .hljs-attr, .hljs-attribute, .hljs-property { color: var(--hljs-attr); }
639
+ .hljs-built_in, .hljs-built-in { color: var(--hljs-built-in); }
640
+ .hljs-tag, .hljs-selector-pseudo, .hljs-selector-attr { color: var(--hljs-tag); }
641
+ .hljs-title, .hljs-title.class_, .hljs-title.function_,
642
+ .hljs-meta, .hljs-meta .hljs-keyword, .hljs-subst,
643
+ .hljs-punctuation, .hljs-operator { color: inherit; }
644
+
645
+ /* ── Markdown (typographic, airy, Medium-inspired) ── */
646
+
647
+ .markdown h1, .markdown h2, .markdown h3 { letter-spacing: -.015em; }
648
+ .markdown p { margin: 1em 0; }
649
+ .markdown ul, .markdown ol { margin: .8em 0; padding-left: 1.4rem; }
650
+
651
+ .markdown-doc {
652
+ max-width: 720px;
653
+ margin: 0 auto;
654
+ padding: 32px 28px 36px;
655
+ line-height: 1.8;
656
+ color: var(--markdown-text);
657
+ font-size: 16px;
658
+ background: transparent;
659
+ border: 0;
660
+ border-radius: 0;
661
+ }
662
+
663
+ .markdown-doc h1 {
664
+ margin: 0 0 24px;
665
+ font-size: 28px;
666
+ font-weight: 600;
667
+ line-height: 1.25;
668
+ letter-spacing: -0.02em;
669
+ color: var(--markdown-text);
670
+ }
671
+
672
+ .markdown-doc h2 {
673
+ margin: 36px 0 16px;
674
+ font-size: 22px;
675
+ font-weight: 600;
676
+ line-height: 1.3;
677
+ letter-spacing: -0.01em;
678
+ color: var(--markdown-text);
679
+ }
680
+
681
+ .markdown-doc h3 {
682
+ margin: 28px 0 12px;
683
+ font-size: 18px;
684
+ font-weight: 600;
685
+ line-height: 1.35;
686
+ color: var(--markdown-text);
687
+ }
688
+
689
+ .markdown-doc p {
690
+ font-size: 15px;
691
+ line-height: 1.75;
692
+ color: var(--markdown-muted);
693
+ margin: 0 0 1.2em;
694
+ }
695
+
696
+ .markdown-doc li {
697
+ font-size: 15px;
698
+ line-height: 1.7;
699
+ color: var(--markdown-muted);
700
+ margin-bottom: 0.3em;
701
+ }
702
+
703
+ .markdown-doc ul, .markdown-doc ol {
704
+ margin: 8px 0 20px;
705
+ padding-left: 1.3em;
706
+ }
707
+
708
+ .markdown-doc blockquote {
709
+ margin: 20px 0;
710
+ padding: 2px 0 2px 20px;
711
+ border-left: 3px solid color-mix(in srgb, var(--border) 70%, transparent);
712
+ color: var(--markdown-muted);
713
+ font-style: italic;
714
+ }
715
+
716
+ .markdown-doc hr {
717
+ border: none;
718
+ border-top: 1px solid color-mix(in srgb, var(--border) 40%, transparent);
719
+ margin: 32px 0;
720
+ }
721
+
722
+ .markdown-doc img {
723
+ max-width: 100%;
724
+ border-radius: 8px;
725
+ margin: 16px 0;
726
+ }
727
+
728
+ .markdown-doc code:not(.hljs) {
729
+ font-family: var(--font-mono, ui-monospace, monospace);
730
+ font-size: .9em;
731
+ background: var(--inline-code-bg);
732
+ color: var(--inline-code-text);
733
+ border: 1px solid var(--inline-code-border);
734
+ border-radius: 6px;
735
+ padding: 2px 6px;
736
+ }
737
+
738
+ .markdown-doc .code-viewer {
739
+ margin: 14px 0;
740
+ border: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
741
+ border-radius: 10px;
742
+ }
743
+
744
+ /* ── HTML frame ── */
745
+
746
+ .html-rendered-frame {
747
+ width: 100%;
748
+ border: 0;
749
+ border-radius: 0;
750
+ background: var(--panel);
751
+ display: block;
752
+ overflow: hidden;
753
+ }
754
+
755
+ /* ── Responsive ── */
756
+
757
+ @media (max-width: 720px) {
758
+ .markdown-doc { padding: 16px; }
759
+ .markdown-doc h1 { font-size: 27px; }
760
+ .markdown-doc h2 { font-size: 22px; }
761
+ .markdown-doc h3 { font-size: 18px; }
762
+ .markdown-doc p, .markdown-doc li { font-size: 15px; }
763
+ }
764
+