@happy-nut/monacori 0.1.0 → 0.1.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.
@@ -0,0 +1,1094 @@
1
+
2
+ :root {
3
+ color-scheme: dark;
4
+ --bg: #161616;
5
+ --panel: #1b1b1b;
6
+ --text: #a9b7c6;
7
+ --muted: #808080;
8
+ --border: #393b3d;
9
+ --line: #313335;
10
+ --add: #16351f;
11
+ --del: #3f1d1d;
12
+ --add-strong: #1f5b34;
13
+ --del-strong: #6e2c2c;
14
+ --active: #4a88c7;
15
+ --sidebar: #1c1c1c;
16
+ --token-comment: #808080;
17
+ --token-keyword: #cc7832;
18
+ --token-string: #6a8759;
19
+ --token-number: #6897bb;
20
+ --token-literal: #cc7832;
21
+ --token-tag: #e8bf6a;
22
+ --d2h-bg-color: var(--panel);
23
+ --d2h-border-color: var(--border);
24
+ --d2h-dim-color: var(--muted);
25
+ --d2h-line-border-color: var(--border);
26
+ --d2h-file-header-bg-color: var(--line);
27
+ --d2h-file-header-border-color: var(--border);
28
+ --d2h-empty-placeholder-bg-color: var(--line);
29
+ --d2h-code-line-bg-color: var(--panel);
30
+ --d2h-code-line-color: var(--text);
31
+ --d2h-code-side-line-border-color: var(--border);
32
+ --d2h-del-bg-color: var(--del);
33
+ --d2h-ins-bg-color: var(--add);
34
+ --d2h-info-bg-color: var(--line);
35
+ --d2h-info-color: var(--muted);
36
+ }
37
+ * { box-sizing: border-box; }
38
+ html, body { margin: 0; min-height: 100%; }
39
+ /* Reserve the scrollbar gutter so collapsing/expanding a file does not shift the layout. */
40
+ html { scrollbar-gutter: stable; }
41
+ body {
42
+ display: grid;
43
+ grid-template-columns: var(--sidebar-width, 280px) minmax(0, 1fr);
44
+ background: var(--bg);
45
+ color: var(--text);
46
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
47
+ }
48
+ .sidebar {
49
+ position: sticky;
50
+ top: 0;
51
+ height: 100vh;
52
+ display: flex;
53
+ flex-direction: column;
54
+ overflow: hidden;
55
+ border-right: 1px solid var(--border);
56
+ background: var(--sidebar);
57
+ }
58
+ .sidebar-scroll {
59
+ flex: 1 1 auto;
60
+ min-height: 0;
61
+ overflow: auto;
62
+ padding: 12px;
63
+ }
64
+ .sidebar-resizer {
65
+ position: fixed;
66
+ top: 0;
67
+ left: var(--sidebar-width, 280px);
68
+ width: 9px;
69
+ height: 100vh;
70
+ margin-left: -5px;
71
+ cursor: col-resize;
72
+ z-index: 30;
73
+ }
74
+ .sidebar-resizer::after {
75
+ content: "";
76
+ position: absolute;
77
+ inset: 0 4px;
78
+ background: transparent;
79
+ transition: background 120ms ease;
80
+ }
81
+ .sidebar-resizer:hover::after, .sidebar-resizer.resizing::after { background: var(--active); }
82
+ .visually-hidden {
83
+ position: absolute;
84
+ width: 1px;
85
+ height: 1px;
86
+ padding: 0;
87
+ margin: -1px;
88
+ overflow: hidden;
89
+ clip: rect(0, 0, 0, 0);
90
+ white-space: nowrap;
91
+ border: 0;
92
+ }
93
+ .live-status { color: var(--muted); }
94
+ .live-status.watching { color: var(--active); }
95
+ .sidebar-brand {
96
+ display: flex;
97
+ flex-direction: column;
98
+ gap: 2px;
99
+ margin-bottom: 12px;
100
+ padding-bottom: 10px;
101
+ border-bottom: 1px solid var(--border);
102
+ min-width: 0;
103
+ }
104
+ .sidebar-brand .brand-mark {
105
+ font-size: 11px;
106
+ letter-spacing: 0.12em;
107
+ text-transform: uppercase;
108
+ color: var(--muted);
109
+ }
110
+ .sidebar-brand .brand-project {
111
+ font-size: 14px;
112
+ font-weight: 600;
113
+ color: var(--text);
114
+ white-space: nowrap;
115
+ overflow: hidden;
116
+ text-overflow: ellipsis;
117
+ }
118
+ .tabs { display: none; }
119
+ .tab, .plain-button {
120
+ border: 1px solid var(--border);
121
+ border-radius: 6px;
122
+ padding: 6px 9px;
123
+ color: var(--text);
124
+ background: var(--panel);
125
+ font: 12px ui-sans-serif, system-ui, sans-serif;
126
+ cursor: pointer;
127
+ }
128
+ .tab.active, .plain-button:hover { border-color: var(--active); color: var(--active); }
129
+ .hidden { display: none !important; }
130
+ /* IntelliJ-style git status on sidebar file names: untracked(new)=red, modified=blue, staged(git add)=green. */
131
+ .vcs-new.source-link .path, .vcs-new.change-row .change-name { color: #d36c6c; }
132
+ .vcs-edited.source-link .path, .vcs-edited.change-row .change-name { color: #6c9fd4; }
133
+ .vcs-staged.source-link .path, .vcs-staged.change-row .change-name { color: #7faf6b; }
134
+ .sidebar-footer {
135
+ flex: 0 0 auto;
136
+ padding: 8px 12px;
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 8px;
140
+ background: var(--sidebar);
141
+ border-top: 1px solid var(--border);
142
+ font-size: 11px;
143
+ color: var(--muted);
144
+ }
145
+ .sidebar-footer .app-version { margin-right: auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
146
+ .app-update-flag { color: var(--active); font-weight: 600; cursor: pointer; white-space: nowrap; }
147
+ .settings-btn {
148
+ flex: none;
149
+ border: 1px solid transparent;
150
+ border-radius: 6px;
151
+ background: transparent;
152
+ color: var(--muted);
153
+ font-size: 14px;
154
+ line-height: 1;
155
+ padding: 3px 6px;
156
+ cursor: pointer;
157
+ }
158
+ .settings-btn:hover { color: var(--text); background: color-mix(in srgb, var(--active) 12%, transparent); }
159
+ .app-info {
160
+ position: fixed;
161
+ left: 12px;
162
+ bottom: 46px;
163
+ z-index: 60;
164
+ width: 320px;
165
+ max-width: calc(100vw - 24px);
166
+ max-height: calc(100vh - 64px);
167
+ overflow: auto;
168
+ padding: 12px;
169
+ border: 1px solid var(--border);
170
+ border-radius: 10px;
171
+ background: var(--panel);
172
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5);
173
+ font-size: 12px;
174
+ color: var(--text);
175
+ }
176
+ .app-info-head { font-size: 13px; font-weight: 600; margin-bottom: 6px; }
177
+ .app-info-head .app-info-ver { color: var(--muted); font-weight: 500; }
178
+ .app-info-status { color: var(--muted); margin-bottom: 10px; }
179
+ .app-info-status.has-update { color: var(--active); font-weight: 600; }
180
+ .app-info-update { width: 100%; margin: 0 0 10px; border-color: var(--active); color: var(--active); font-weight: 600; }
181
+ .app-info-update:hover { background: color-mix(in srgb, var(--active) 14%, transparent); color: var(--active); }
182
+ .app-info-update:disabled { opacity: 0.55; cursor: default; }
183
+ .app-info-keys { margin-top: 12px; border-top: 1px solid var(--border); padding-top: 10px; }
184
+
185
+ /* Settings modal (Cmd+Shift+/ merge prompts, etc.) — sidebar categories + form, like a desktop app. */
186
+ .settings-modal {
187
+ position: fixed; inset: 0; z-index: 70;
188
+ display: flex; align-items: center; justify-content: center;
189
+ background: rgba(0, 0, 0, 0.6); padding: 32px;
190
+ }
191
+ .settings-modal.hidden { display: none; }
192
+ .settings-panel {
193
+ display: flex;
194
+ width: 980px; max-width: 90vw; height: 700px; max-height: 88vh;
195
+ background: var(--panel); border: 1px solid var(--border); border-radius: 12px;
196
+ overflow: hidden; box-shadow: 0 12px 48px rgba(0, 0, 0, 0.55);
197
+ }
198
+ .settings-nav {
199
+ flex: 0 0 200px; padding: 16px 10px;
200
+ background: var(--sidebar); border-right: 1px solid var(--border);
201
+ display: flex; flex-direction: column; gap: 4px;
202
+ }
203
+ .settings-nav-title { font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); padding: 4px 10px 8px; }
204
+ .settings-cat { text-align: left; border: 0; background: transparent; color: var(--text); padding: 7px 10px; border-radius: 6px; font-size: 13px; cursor: pointer; }
205
+ .settings-cat:hover { background: color-mix(in srgb, var(--active) 12%, transparent); }
206
+ .settings-cat.active { background: color-mix(in srgb, var(--active) 20%, transparent); color: var(--active); font-weight: 600; }
207
+ .settings-body { flex: 1 1 auto; min-width: 0; padding: 24px 28px; overflow: auto; }
208
+ .settings-h { font-size: 16px; font-weight: 650; color: var(--text); margin-bottom: 6px; }
209
+ .settings-ver { color: var(--muted); font-weight: 500; font-size: 0.62em; letter-spacing: 0.02em; }
210
+ .settings-desc { font-size: 12px; color: var(--muted); line-height: 1.6; margin-bottom: 18px; }
211
+ .settings-label { display: block; font-size: 12px; font-weight: 600; color: var(--text); margin: 14px 0 6px; }
212
+ .settings-textarea {
213
+ width: 100%; box-sizing: border-box; resize: vertical; min-height: 70px;
214
+ background: var(--bg); color: var(--text);
215
+ border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px;
216
+ font: 12px/1.55 ui-sans-serif, system-ui, sans-serif;
217
+ }
218
+ .settings-textarea:focus { outline: none; border-color: var(--active); }
219
+ .settings-select {
220
+ width: auto; box-sizing: border-box;
221
+ background: var(--bg); color: var(--text);
222
+ border: 1px solid var(--border); border-radius: 8px; padding: 8px 12px;
223
+ font: 12px/1.55 ui-sans-serif, system-ui, sans-serif;
224
+ }
225
+ .settings-select:focus { outline: none; border-color: var(--active); }
226
+ .settings-actions { display: flex; align-items: center; gap: 12px; margin-top: 18px; }
227
+ .settings-saved { font-size: 12px; color: var(--active); }
228
+ .app-info-keys-h { font-weight: 600; color: var(--text); margin-bottom: 8px; }
229
+ .keys-cat { font-size: 10px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); margin: 14px 0 6px; }
230
+ .app-info-keys .keys-cat:first-of-type { margin-top: 4px; }
231
+ .keys-grid { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 5px 10px; align-items: center; margin-bottom: 2px; }
232
+ .keys-grid kbd {
233
+ justify-self: start;
234
+ font: 10px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
235
+ background: var(--bg);
236
+ border: 1px solid var(--border);
237
+ border-radius: 4px;
238
+ padding: 2px 5px;
239
+ color: var(--text);
240
+ white-space: nowrap;
241
+ }
242
+ .keys-grid span { color: var(--muted); }
243
+ .diff2html-container { min-width: 0; caret-color: transparent; }
244
+ .mc-diff-cursor-row .d2h-code-side-line { box-shadow: inset 2px 0 0 color-mix(in srgb, var(--active) 70%, transparent); }
245
+ #diff2html-container[contenteditable] { outline: none; }
246
+ #diff2html-container [contenteditable="false"] { caret-color: transparent; }
247
+ .d2h-wrapper { background: transparent; color: var(--text); }
248
+ .d2h-file-wrapper {
249
+ margin: 0;
250
+ overflow: hidden;
251
+ border: 0;
252
+ border-radius: 0;
253
+ background: var(--panel);
254
+ }
255
+ /* The per-file header is merged into the sticky toolbar (path + status + Viewed) to save vertical space. */
256
+ .d2h-file-header { display: none; }
257
+ .diff-viewed-toggle {
258
+ display: inline-flex;
259
+ align-items: center;
260
+ gap: 6px;
261
+ flex: none;
262
+ padding: 3px 10px;
263
+ border: 1px solid var(--border);
264
+ border-radius: 999px;
265
+ color: var(--muted);
266
+ background: var(--panel);
267
+ font-size: 11px;
268
+ font-weight: 600;
269
+ line-height: 1;
270
+ cursor: pointer;
271
+ white-space: nowrap;
272
+ }
273
+ .diff-viewed-toggle[hidden] { display: none; }
274
+ .diff-viewed-toggle:hover { border-color: var(--active); color: var(--text); }
275
+ .diff-viewed-toggle::before {
276
+ content: "";
277
+ box-sizing: border-box;
278
+ width: 13px;
279
+ height: 13px;
280
+ border: 1px solid currentColor;
281
+ border-radius: 4px;
282
+ opacity: 0.75;
283
+ }
284
+ .diff-viewed-toggle.is-viewed {
285
+ color: #6ab04c;
286
+ border-color: color-mix(in srgb, #6ab04c 55%, transparent);
287
+ background: color-mix(in srgb, #6ab04c 16%, transparent);
288
+ }
289
+ .diff-viewed-toggle.is-viewed:hover { border-color: #6ab04c; color: #6ab04c; }
290
+ .diff-viewed-toggle.is-viewed::before {
291
+ content: "✓";
292
+ display: inline-flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ border-color: #6ab04c;
296
+ background: #6ab04c;
297
+ color: #fff;
298
+ font-size: 9px;
299
+ font-weight: 700;
300
+ opacity: 1;
301
+ }
302
+ .d2h-file-wrapper.file-viewed {
303
+ opacity: 0.68;
304
+ }
305
+ .d2h-file-wrapper.file-viewed:hover {
306
+ opacity: 1;
307
+ }
308
+ /* Marking a file viewed folds its diff down to just the header; toggle viewed again to reopen. */
309
+ .d2h-file-wrapper.file-viewed .d2h-files-diff { display: none; }
310
+ .d2h-file-name { color: var(--text); }
311
+ .d2h-icon { fill: var(--muted); }
312
+ .d2h-tag { border-color: var(--border); }
313
+ .d2h-files-diff { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
314
+ .d2h-file-side-diff { min-width: 0; width: 100%; overflow-x: auto; }
315
+ .d2h-file-side-diff:first-child { border-right: 1px solid var(--border); }
316
+ .d2h-code-wrapper { width: 100%; }
317
+ .d2h-diff-table {
318
+ width: 100%;
319
+ font: 12px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
320
+ }
321
+ .d2h-diff-table td { line-height: 1.45; }
322
+ .d2h-code-side-linenumber, .d2h-code-linenumber {
323
+ width: 58px;
324
+ color: var(--muted);
325
+ /* diff2html absolutely-positions each line number; a distinct gutter background exposed the tiny
326
+ gaps between those boxes as horizontal "dividers", so keep the gutter transparent + borderless. */
327
+ background: transparent;
328
+ border: 0;
329
+ }
330
+ .d2h-code-side-line, .d2h-code-line {
331
+ /* left pad must exceed the 58px absolutely-positioned line-number, else the +/- prefix renders behind it and looks clipped */
332
+ padding: 0 0.6em 0 64px;
333
+ width: 100%;
334
+ color: var(--text);
335
+ cursor: text;
336
+ -webkit-user-select: text;
337
+ user-select: text;
338
+ }
339
+ /* Changed lines: lift the base text brighter than the gray context so additions/deletions read as
340
+ edits, not the same gray. hljs tokens keep their own colors; this only affects unhighlighted text. */
341
+ td.d2h-ins:not(.d2h-code-side-linenumber),
342
+ td.d2h-del:not(.d2h-code-side-linenumber) { color: #d8e0e8; }
343
+ .d2h-code-line-prefix { -webkit-user-select: none; user-select: none; }
344
+ .d2h-code-side-linenumber, .d2h-code-linenumber { -webkit-user-select: none; user-select: none; }
345
+ .d2h-code-line-ctn .hljs-keyword,
346
+ .d2h-code-line-ctn .hljs-built_in,
347
+ .d2h-code-line-ctn .hljs-literal,
348
+ .d2h-code-line-ctn .hljs-selector-tag,
349
+ .d2h-code-line-ctn .hljs-section { color: #cc7832; }
350
+ .d2h-code-line-ctn .hljs-string,
351
+ .d2h-code-line-ctn .hljs-regexp,
352
+ .d2h-code-line-ctn .hljs-char.escape_ { color: #6a8759; }
353
+ .d2h-code-line-ctn .hljs-number { color: #6897bb; }
354
+ .d2h-code-line-ctn .hljs-comment,
355
+ .d2h-code-line-ctn .hljs-quote { color: #808080; font-style: italic; }
356
+ .d2h-code-line-ctn .hljs-meta,
357
+ .d2h-code-line-ctn .hljs-doctag { color: #bbb529; }
358
+ .d2h-code-line-ctn .hljs-title,
359
+ .d2h-code-line-ctn .hljs-title.function_,
360
+ .d2h-code-line-ctn .hljs-function .hljs-title { color: #ffc66d; }
361
+ .d2h-code-line-ctn .hljs-title.class_,
362
+ .d2h-code-line-ctn .hljs-class .hljs-title,
363
+ .d2h-code-line-ctn .hljs-type { color: #a9b7c6; }
364
+ .d2h-code-line-ctn .hljs-attr,
365
+ .d2h-code-line-ctn .hljs-variable,
366
+ .d2h-code-line-ctn .hljs-template-variable,
367
+ .d2h-code-line-ctn .hljs-property { color: #9876aa; }
368
+ .d2h-code-line-ctn .hljs-attribute { color: #a9b7c6; }
369
+ .d2h-code-line-ctn .hljs-tag,
370
+ .d2h-code-line-ctn .hljs-name { color: #e8bf6a; }
371
+ .d2h-code-line-ctn .hljs-symbol,
372
+ .d2h-code-line-ctn .hljs-bullet,
373
+ .d2h-code-line-ctn .hljs-link { color: #6897bb; }
374
+ .d2h-code-line-ctn .hljs-emphasis { font-style: italic; }
375
+ .d2h-code-line-ctn .hljs-strong { font-weight: 700; }
376
+ .d2h-info { background: var(--line); color: var(--muted); border-color: var(--border); }
377
+ .d2h-info .d2h-code-side-line, .d2h-info .d2h-code-line { color: transparent; user-select: none; }
378
+ .d2h-info td, td.d2h-info { border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
379
+ .d2h-file-wrapper.df-inactive { display: none; }
380
+ .d2h-del { background: var(--del); }
381
+ .d2h-ins { background: var(--add); }
382
+ .d2h-del .d2h-change { background: var(--del-strong); }
383
+ .d2h-ins .d2h-change { background: var(--add-strong); }
384
+ .d2h-code-line-ctn ins, .d2h-code-line-ctn del {
385
+ text-decoration: none;
386
+ border-radius: 2px;
387
+ padding: 0 1px;
388
+ box-decoration-break: clone;
389
+ -webkit-box-decoration-break: clone;
390
+ }
391
+ .d2h-code-line-ctn ins { background: var(--add-strong); }
392
+ .d2h-code-line-ctn del { background: var(--del-strong); }
393
+ .d2h-code-side-linenumber.d2h-del, .d2h-code-linenumber.d2h-del { background: var(--del); }
394
+ .d2h-code-side-linenumber.d2h-ins, .d2h-code-linenumber.d2h-ins { background: var(--add); }
395
+ .d2h-diff-table tr.hunk, .d2h-diff-table tr.hunk-peer { scroll-margin-top: 76px; }
396
+ .d2h-diff-table tr.hunk.active td, .d2h-diff-table tr.hunk-peer.active td {
397
+ box-shadow: none;
398
+ }
399
+ .d2h-diff-table tr.diff-active-row td { background: rgba(74, 136, 199, 0.16) !important; }
400
+ .d2h-diff-table tr.diff-active-row td.d2h-code-side-linenumber { box-shadow: inset 2px 0 0 var(--active); }
401
+ .review-status .ws-ignored { color: var(--token-tag); border: 1px solid color-mix(in srgb, var(--token-tag) 45%, transparent); border-radius: 999px; padding: 0 7px; }
402
+ .index-progress { display: inline-flex; width: 54px; height: 4px; border-radius: 999px; background: color-mix(in srgb, var(--muted) 30%, transparent); overflow: hidden; vertical-align: middle; }
403
+ .index-progress.hidden { display: none; }
404
+ .index-progress-bar { width: 0; height: 100%; background: var(--active); border-radius: 999px; transition: width 0.18s ease; }
405
+ .d2h-file-collapse {
406
+ display: inline-flex;
407
+ align-items: center;
408
+ gap: 6px;
409
+ margin-left: 8px;
410
+ padding: 3px 10px;
411
+ border: 1px solid var(--border);
412
+ border-radius: 999px;
413
+ color: var(--muted);
414
+ background: var(--panel);
415
+ font-size: 11px;
416
+ font-weight: 600;
417
+ line-height: 1;
418
+ cursor: pointer;
419
+ user-select: none;
420
+ -webkit-user-select: none;
421
+ white-space: nowrap;
422
+ }
423
+ .d2h-file-collapse:hover { border-color: var(--active); color: var(--text); }
424
+ .d2h-file-collapse::before {
425
+ content: '';
426
+ box-sizing: border-box;
427
+ width: 13px;
428
+ height: 13px;
429
+ border: 1px solid currentColor;
430
+ border-radius: 4px;
431
+ opacity: 0.75;
432
+ }
433
+ .d2h-file-collapse-input { display: none; }
434
+ .d2h-file-wrapper.file-viewed .d2h-file-collapse {
435
+ color: #6ab04c;
436
+ border-color: color-mix(in srgb, #6ab04c 55%, transparent);
437
+ background: color-mix(in srgb, #6ab04c 16%, transparent);
438
+ }
439
+ .d2h-file-wrapper.file-viewed .d2h-file-collapse:hover { border-color: #6ab04c; color: #6ab04c; }
440
+ .d2h-file-wrapper.file-viewed .d2h-file-collapse::before {
441
+ content: '✓';
442
+ display: inline-flex;
443
+ align-items: center;
444
+ justify-content: center;
445
+ border-color: #6ab04c;
446
+ background: #6ab04c;
447
+ color: #fff;
448
+ font-size: 9px;
449
+ font-weight: 700;
450
+ opacity: 1;
451
+ }
452
+ .tree { display: grid; gap: 1px; font-size: 11.5px; font-family: Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
453
+ .tree-dir { display: grid; gap: 1px; }
454
+ .tree-dir summary {
455
+ display: grid;
456
+ grid-template-columns: 14px minmax(0, 1fr);
457
+ align-items: center;
458
+ gap: 4px;
459
+ min-height: 18px;
460
+ padding: 1px 5px 1px calc(7px + (var(--depth) * 14px));
461
+ color: var(--text);
462
+ border-radius: 6px;
463
+ cursor: default;
464
+ list-style: none;
465
+ }
466
+ .tree-dir summary::-webkit-details-marker { display: none; }
467
+ .tree-dir summary:hover { background: var(--bg); }
468
+ .tree-dir:not([open]) .folder-icon { transform: rotate(-90deg); }
469
+ .folder-icon {
470
+ display: inline-grid;
471
+ place-items: center;
472
+ font-size: 9px;
473
+ color: var(--muted);
474
+ transition: transform 120ms ease;
475
+ }
476
+ .file-link.tree-file { padding-left: calc(8px + (var(--depth) * 14px)); }
477
+ .tree-focus { box-shadow: inset 0 0 0 1px var(--active); border-radius: 6px; }
478
+ summary.tree-focus { background: var(--bg); }
479
+ .file-link {
480
+ display: grid;
481
+ grid-template-columns: auto minmax(0, 1fr) auto;
482
+ align-items: center;
483
+ gap: 6px;
484
+ min-height: 18px;
485
+ padding: 1px 6px;
486
+ color: var(--text);
487
+ text-decoration: none;
488
+ border-radius: 6px;
489
+ border: 1px solid transparent;
490
+ background: transparent;
491
+ width: 100%;
492
+ text-align: left;
493
+ font: inherit;
494
+ cursor: pointer;
495
+ }
496
+ .file-link:hover, .file-link.active { background: var(--bg); border-color: var(--border); }
497
+ .file-link.viewed { opacity: 0.58; }
498
+ .file-link.viewed:hover, .file-link.viewed.active { opacity: 1; }
499
+ .path { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; }
500
+ .count { color: var(--muted); font-size: 11px; }
501
+ .change-name { display: flex; align-items: baseline; gap: 7px; min-width: 0; overflow: hidden; }
502
+ .change-dir { color: var(--muted); opacity: 0.5; font-size: 10px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
503
+ .diffstat { display: flex; gap: 6px; font-size: 11px; font-variant-numeric: tabular-nums; white-space: nowrap; }
504
+ .diffstat .adds { color: #6ab04c; }
505
+ .diffstat .dels { color: #cf6679; }
506
+ .status {
507
+ display: inline-flex;
508
+ align-items: center;
509
+ justify-content: center;
510
+ min-width: 16px;
511
+ height: 16px;
512
+ border-radius: 4px;
513
+ padding: 0 3px;
514
+ font-size: 9px;
515
+ font-weight: 700;
516
+ text-transform: uppercase;
517
+ background: var(--line);
518
+ color: var(--muted);
519
+ }
520
+ /* Viewed: dim the row and collapse the status chip into one green check (no stacked glyph). */
521
+ .file-link.viewed .status { font-size: 0; background: color-mix(in srgb, #6ab04c 24%, transparent); color: #6ab04c; }
522
+ .file-link.viewed .status::after { content: '✓'; font-size: 10px; font-weight: 700; line-height: 1; }
523
+ .status-added { background: var(--add); color: #1a7f37; }
524
+ .status-deleted { background: var(--del); color: #cf222e; }
525
+ .status-renamed { background: #fff8c5; color: #9a6700; }
526
+ .status-source { background: var(--line); color: var(--muted); }
527
+ .content { min-width: 0; padding: 0; }
528
+ .toolbar {
529
+ position: sticky;
530
+ top: 0;
531
+ z-index: 5;
532
+ display: flex;
533
+ justify-content: space-between;
534
+ align-items: center;
535
+ gap: 16px;
536
+ margin: 0;
537
+ padding: 10px 12px;
538
+ background: color-mix(in srgb, var(--bg) 88%, transparent);
539
+ backdrop-filter: blur(12px);
540
+ border-bottom: 1px solid var(--border);
541
+ }
542
+ h1 { margin: 0; font-size: 18px; }
543
+ .breadcrumb {
544
+ display: flex;
545
+ align-items: center;
546
+ gap: 5px;
547
+ min-width: 0;
548
+ flex: 1 1 auto;
549
+ overflow: hidden;
550
+ white-space: nowrap;
551
+ font: 13px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
552
+ }
553
+ .crumb { color: var(--muted); }
554
+ .crumb-leaf { color: var(--text); font-weight: 500; }
555
+ .crumb-sep { color: var(--muted); opacity: 0.55; }
556
+ .review-status {
557
+ display: flex;
558
+ align-items: center;
559
+ gap: 12px;
560
+ min-width: 0;
561
+ color: var(--muted);
562
+ font-size: 12px;
563
+ }
564
+ .toolbar p { margin: 4px 0 0; color: var(--muted); font-size: 12px; }
565
+ .empty { padding: 24px; color: var(--muted); }
566
+ .source-viewer { min-height: 100vh; }
567
+ .source-toolbar { margin-bottom: 0; }
568
+ .source-file-meta {
569
+ display: flex;
570
+ flex: 1;
571
+ align-items: center;
572
+ gap: 12px;
573
+ min-width: 0;
574
+ color: var(--muted);
575
+ font-size: 12px;
576
+ }
577
+ .source-file-meta #source-title {
578
+ min-width: 0;
579
+ max-width: min(56vw, 720px);
580
+ overflow: hidden;
581
+ text-overflow: ellipsis;
582
+ white-space: nowrap;
583
+ color: var(--text);
584
+ font: 13px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
585
+ }
586
+ .source-file-meta #source-meta {
587
+ overflow: hidden;
588
+ text-overflow: ellipsis;
589
+ white-space: nowrap;
590
+ }
591
+ /* Files-mode tabs: one row of tabs above the source toolbar (open files, click to switch, × to close). */
592
+ .source-tabs {
593
+ display: flex;
594
+ overflow-x: auto;
595
+ gap: 1px;
596
+ margin-bottom: 8px;
597
+ background: var(--sidebar);
598
+ border: 1px solid var(--border);
599
+ border-radius: 8px;
600
+ scrollbar-width: thin;
601
+ }
602
+ .source-tab {
603
+ display: inline-flex;
604
+ align-items: center;
605
+ gap: 6px;
606
+ flex: 0 0 auto;
607
+ max-width: 220px;
608
+ padding: 6px 8px 6px 12px;
609
+ border-right: 1px solid var(--border);
610
+ background: var(--panel);
611
+ color: var(--muted);
612
+ font-size: 12px;
613
+ cursor: pointer;
614
+ white-space: nowrap;
615
+ }
616
+ .source-tab:first-child { border-top-left-radius: 8px; border-bottom-left-radius: 8px; }
617
+ .source-tab:hover { color: var(--text); }
618
+ .source-tab.active { color: var(--text); background: var(--bg); box-shadow: inset 0 -2px 0 var(--active); }
619
+ .source-tab-name { overflow: hidden; text-overflow: ellipsis; }
620
+ .source-tab-close {
621
+ flex: none; border: 0; background: transparent; color: var(--muted);
622
+ font-size: 14px; line-height: 1; padding: 0 3px; cursor: pointer; border-radius: 3px;
623
+ }
624
+ .source-tab-close:hover { background: var(--line); color: var(--text); }
625
+ .source-body {
626
+ border: 1px solid var(--border);
627
+ border-radius: 8px;
628
+ overflow: auto;
629
+ background: var(--panel);
630
+ user-select: text;
631
+ }
632
+ /* Empty state ("Select a file…") centered in the available space, not top-left. */
633
+ .source-body.empty {
634
+ display: flex;
635
+ align-items: center;
636
+ justify-content: center;
637
+ min-height: calc(100vh - 7rem);
638
+ font-size: 13px;
639
+ }
640
+ .source-table {
641
+ width: 100%;
642
+ border-collapse: collapse;
643
+ font: 12px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
644
+ }
645
+ .source-table td {
646
+ vertical-align: top;
647
+ white-space: pre-wrap;
648
+ overflow-wrap: anywhere;
649
+ line-height: 1.45;
650
+ }
651
+ /* perf: let the browser skip layout/paint for off-screen rows in large files/diffs.
652
+ DOM is unchanged (nav, search, comment anchoring still query every row); degrades
653
+ gracefully where unsupported. contain-intrinsic-size keeps the scrollbar stable. */
654
+ .source-row { content-visibility: auto; contain-intrinsic-size: auto 19px; }
655
+ .d2h-diff-table tr { content-visibility: auto; contain-intrinsic-size: auto 18px; }
656
+ /* Comment/composer rows are tall and interactive (a textarea lives here). Skip-rendering them
657
+ with a tiny 18px placeholder made the browser re-evaluate their render state on every
658
+ keystroke, so typing in the composer stuttered — keep these rows always rendered. */
659
+ .d2h-diff-table tr.mc-comment-row, .d2h-diff-table tr.mc-spacer-row { content-visibility: visible; contain-intrinsic-size: auto; }
660
+ .source-row.search-hit .source-code { background: color-mix(in srgb, var(--active) 14%, transparent); }
661
+ .source-row.changed-line .source-code { background: color-mix(in srgb, var(--active) 9%, transparent); box-shadow: inset 2px 0 0 color-mix(in srgb, var(--active) 55%, transparent); }
662
+ .source-row.symbol-target .source-code {
663
+ background: color-mix(in srgb, var(--active) 18%, transparent);
664
+ }
665
+ .source-code {
666
+ padding: 2px 10px;
667
+ cursor: text;
668
+ user-select: text;
669
+ }
670
+ .code-cursor {
671
+ display: inline-block;
672
+ width: 2px;
673
+ height: 1.25em;
674
+ margin: -1px -1px;
675
+ background: #fff;
676
+ vertical-align: text-bottom;
677
+ pointer-events: none;
678
+ animation: cursor-blink 1.06s step-end infinite;
679
+ }
680
+ @keyframes cursor-blink {
681
+ 50% { opacity: 0; }
682
+ }
683
+ /* Keep the caret solid while it is actively moving (held arrow key / typing); blink only when idle. */
684
+ .caret-busy .code-cursor { animation: none; opacity: 1; }
685
+ /* Markdown/CSV rendered rows have no inline caret span — mark the whole cursor row instead. */
686
+ .source-row.md-row.cursor-line .md-cell,
687
+ .source-row.csv-row.cursor-line .csv-cell { background: color-mix(in srgb, #000 26%, transparent); }
688
+ .source-row.md-row.cursor-line .num,
689
+ .source-row.csv-row.cursor-line .num { color: var(--active); }
690
+ .num {
691
+ width: 58px;
692
+ user-select: none;
693
+ text-align: right;
694
+ color: var(--muted);
695
+ background: var(--line);
696
+ border-right: 1px solid var(--border);
697
+ padding: 2px 8px;
698
+ }
699
+ /* Review comments (questions / change-requests) — per-file sidebar count badges (no emoji) */
700
+ .change-row { grid-template-columns: auto auto minmax(0, 1fr) auto auto; }
701
+ .source-link { grid-template-columns: auto minmax(0, 1fr) auto; }
702
+ .file-link .ftype { width: 15px; height: 15px; flex: none; display: block; }
703
+ .source-link.not-embedded { opacity: 0.45; }
704
+ .source-link.not-embedded:hover { opacity: 0.72; }
705
+ .source-type-icon { display: inline-flex; align-items: center; flex: none; margin-right: 2px; }
706
+ .source-type-icon .ftype { width: 16px; height: 16px; display: block; }
707
+ .mc-file-badge { display: inline-flex; gap: 4px; align-items: center; }
708
+ .mc-fb { font-size: 10px; line-height: 1; padding: 1px 6px; border-radius: 999px; font-weight: 700; font-variant-numeric: tabular-nums; border: 1px solid transparent; }
709
+ .mc-fb-q { color: var(--token-number); background: color-mix(in srgb, var(--token-number) 16%, transparent); border-color: color-mix(in srgb, var(--token-number) 38%, transparent); }
710
+ .mc-fb-c { color: var(--token-tag); background: color-mix(in srgb, var(--token-tag) 16%, transparent); border-color: color-mix(in srgb, var(--token-tag) 38%, transparent); }
711
+ /* Lines kept highlighted while composing a comment on a drag selection */
712
+ .mc-sel-line .d2h-code-side-line { background: color-mix(in srgb, var(--active) 20%, transparent); }
713
+ .source-row.mc-sel-line .source-code { background: color-mix(in srgb, var(--active) 20%, transparent); }
714
+ /* A comment box "selected" while navigating with arrows (caret hidden; Backspace deletes it) */
715
+ .mc-comment-row.mc-row-selected .mc-card { box-shadow: 0 0 0 2px var(--active); }
716
+ .mc-comment-row td { padding: 0; background: var(--bg); }
717
+ .mc-thread-cell { padding: 4px 12px 8px 64px; }
718
+ .source-table .mc-thread-cell { padding: 4px 12px 8px 66px; }
719
+ .mc-card {
720
+ border: 1px solid var(--border);
721
+ border-radius: 8px; background: var(--panel); margin: 8px 0; max-width: 760px;
722
+ font: 12px/1.5 Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
723
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.28);
724
+ overflow: hidden;
725
+ }
726
+ /* Question vs change-request is a small colored pill on the kind label — no heavy left bar. */
727
+ .mc-card-head { display: flex; align-items: center; gap: 8px; padding: 8px 10px 6px; color: var(--muted); }
728
+ .mc-kind {
729
+ font-weight: 700; font-size: 10px; letter-spacing: 0.05em; text-transform: uppercase;
730
+ padding: 2px 8px; border-radius: 999px;
731
+ color: var(--muted); background: color-mix(in srgb, var(--muted) 16%, transparent);
732
+ }
733
+ .mc-card.mc-q .mc-kind { color: var(--token-number); background: color-mix(in srgb, var(--token-number) 18%, transparent); }
734
+ .mc-card.mc-c .mc-kind { color: var(--token-tag); background: color-mix(in srgb, var(--token-tag) 18%, transparent); }
735
+ .mc-del { margin-left: auto; background: transparent; border: 0; color: var(--muted); cursor: pointer; font-size: 15px; line-height: 1; padding: 1px 5px; border-radius: 5px; }
736
+ .mc-del:hover { color: var(--del-strong); background: color-mix(in srgb, var(--del-strong) 16%, transparent); }
737
+ .mc-card-body { padding: 2px 12px 11px; color: var(--text); white-space: pre-wrap; overflow-wrap: anywhere; }
738
+ .mc-input {
739
+ display: block; box-sizing: border-box; resize: vertical;
740
+ margin: 0 10px 10px; width: calc(100% - 20px); min-height: 60px;
741
+ background: var(--bg); color: var(--text);
742
+ border: 1px solid var(--border); border-radius: 7px; padding: 9px 11px;
743
+ font: 12px/1.55 Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
744
+ transition: border-color 120ms ease, box-shadow 120ms ease;
745
+ }
746
+ .mc-input:focus { outline: none; border-color: var(--active); box-shadow: 0 0 0 3px color-mix(in srgb, var(--active) 22%, transparent); }
747
+ .mc-actions { display: flex; align-items: center; gap: 8px; padding: 0 10px 9px; }
748
+ .mc-btn { background: var(--active); color: #fff; border: 0; border-radius: 6px; padding: 5px 12px; font-size: 12px; cursor: pointer; }
749
+ .mc-btn:hover { filter: brightness(1.1); }
750
+ .mc-btn.mc-ghost { background: transparent; border: 1px solid var(--border); color: var(--text); }
751
+ /* Terminal-send buttons in the merged modal: green to read as "send to the live session", with a clear
752
+ focus ring so arrow-key selection between split panes is visible. */
753
+ .mc-send-term { background: #2f8f46; }
754
+ .mc-send-term:focus, .mc-send-term:focus-visible { outline: 2px solid #fff; outline-offset: 1px; }
755
+ .mc-hint { color: var(--muted); font-size: 11px; }
756
+ .mc-modal { position: fixed; inset: 0; z-index: 60; display: grid; place-items: start center; padding-top: min(10vh, 80px); background: color-mix(in srgb, #000 32%, transparent); }
757
+ .mc-modal.hidden { display: none; }
758
+ .mc-modal-panel { width: min(900px, calc(100vw - 40px)); height: 80vh; max-height: 80vh; display: grid; grid-template-rows: auto minmax(0, 1fr); border: 1px solid var(--border); border-radius: 10px; background: var(--panel); overflow: hidden; }
759
+ .mc-modal-head { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-bottom: 1px solid var(--border); color: var(--text); font-weight: 650; }
760
+ .mc-modal-head span { margin-right: auto; }
761
+ .mc-modal-text { width: 100%; height: 100%; box-sizing: border-box; resize: none; border: 0; padding: 12px; background: var(--bg); color: var(--text); font: 12px/1.55 Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
762
+ .mc-modal-text:focus { outline: none; }
763
+ .tok-comment { color: var(--token-comment); font-style: italic; }
764
+ .tok-keyword { color: var(--token-keyword); font-weight: 650; }
765
+ .tok-string { color: var(--token-string); }
766
+ .tok-number { color: var(--token-number); }
767
+ .tok-literal { color: var(--token-literal); }
768
+ .tok-tag { color: var(--token-tag); font-weight: 650; }
769
+ .quick-open {
770
+ position: fixed;
771
+ inset: 0;
772
+ z-index: 50;
773
+ display: grid;
774
+ place-items: start center;
775
+ padding-top: min(12vh, 96px);
776
+ background: color-mix(in srgb, #000 24%, transparent);
777
+ }
778
+ .quick-open-panel {
779
+ width: min(720px, calc(100vw - 32px));
780
+ max-height: min(680px, calc(100vh - 64px));
781
+ display: grid;
782
+ grid-template-rows: auto auto minmax(0, 1fr);
783
+ border: 1px solid var(--border);
784
+ border-radius: 8px;
785
+ background: var(--panel);
786
+ box-shadow: 0 18px 60px rgba(0, 0, 0, 0.28);
787
+ overflow: hidden;
788
+ }
789
+ .quick-open-title {
790
+ display: flex;
791
+ justify-content: space-between;
792
+ gap: 12px;
793
+ padding: 10px 12px;
794
+ border-bottom: 1px solid var(--border);
795
+ color: var(--muted);
796
+ font-size: 12px;
797
+ }
798
+ .quick-open-hint { font-family: Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
799
+ #quick-open-input {
800
+ width: 100%;
801
+ border: 0;
802
+ border-bottom: 1px solid var(--border);
803
+ outline: 0;
804
+ padding: 13px 14px;
805
+ background: var(--bg);
806
+ color: var(--text);
807
+ font: 15px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
808
+ }
809
+ .quick-open-results { overflow: auto; padding: 6px; max-height: 232px; }
810
+ .usage-item { display: flex; align-items: baseline; gap: 10px; }
811
+ .usage-loc { flex: none; color: var(--active); font-variant-numeric: tabular-nums; white-space: nowrap; font-size: 12px; }
812
+ .usage-code { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); font: 12px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
813
+ .quick-open-main { min-width: 0; display: flex; align-items: baseline; gap: 8px; }
814
+ .quick-open-path { flex: 1 1 auto; }
815
+ .quick-open-preview {
816
+ border-top: 1px solid var(--border);
817
+ max-height: 320px;
818
+ overflow: auto;
819
+ background: var(--bg);
820
+ }
821
+ .qp-head {
822
+ position: sticky;
823
+ top: 0;
824
+ padding: 5px 10px;
825
+ background: var(--panel);
826
+ border-bottom: 1px solid var(--border);
827
+ color: var(--muted);
828
+ font: 11px Monaco, ui-monospace, SFMono-Regular, Menlo, monospace;
829
+ }
830
+ .qp-body { padding: 4px 0; font: 12px Monaco, ui-monospace, SFMono-Regular, Menlo, monospace; }
831
+ .qp-line { display: grid; grid-template-columns: 46px minmax(0, 1fr); gap: 6px; padding: 0 8px; white-space: pre; line-height: 1.5; }
832
+ .qp-num { color: var(--muted); text-align: right; user-select: none; }
833
+ .qp-hit { background: color-mix(in srgb, var(--active) 20%, transparent); }
834
+ .qp-empty { padding: 20px; color: var(--muted); }
835
+ .quick-open-item {
836
+ display: grid;
837
+ grid-template-columns: minmax(0, 1fr) auto;
838
+ gap: 8px;
839
+ width: 100%;
840
+ min-height: 24px;
841
+ border: 1px solid transparent;
842
+ border-radius: 5px;
843
+ padding: 2px 8px;
844
+ background: transparent;
845
+ color: var(--text);
846
+ text-align: left;
847
+ cursor: pointer;
848
+ }
849
+ .quick-open-item.active, .quick-open-item:hover { background: var(--bg); border-color: var(--active); }
850
+ .quick-open-main { min-width: 0; }
851
+ .quick-open-name {
852
+ display: block;
853
+ overflow: hidden;
854
+ text-overflow: ellipsis;
855
+ white-space: nowrap;
856
+ font: 13px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
857
+ }
858
+ .quick-open-path {
859
+ display: block;
860
+ overflow: hidden;
861
+ text-overflow: ellipsis;
862
+ white-space: nowrap;
863
+ color: var(--muted);
864
+ font-size: 12px;
865
+ margin-top: 2px;
866
+ }
867
+ .quick-open-badge { align-self: center; color: var(--muted); font-size: 12px; }
868
+ .quick-open-empty { padding: 28px 14px; color: var(--muted); font-size: 13px; }
869
+ @media (max-width: 900px) {
870
+ body { grid-template-columns: 1fr; }
871
+ .sidebar { position: relative; height: auto; border-right: 0; border-bottom: 1px solid var(--border); }
872
+ .content { padding: 16px; }
873
+ .toolbar { margin: -16px -16px 16px; padding: 12px 16px; }
874
+ .d2h-files-diff { grid-template-columns: 1fr; }
875
+ .d2h-file-side-diff:first-child { border-right: 0; border-bottom: 1px solid var(--border); }
876
+ }
877
+ .http-env-select {
878
+ margin-left: auto;
879
+ background: var(--panel);
880
+ color: var(--fg);
881
+ border: 1px solid var(--border);
882
+ border-radius: 6px;
883
+ padding: 3px 8px;
884
+ font-size: 12px;
885
+ }
886
+ .http-gutter { white-space: nowrap; }
887
+ .http-run {
888
+ display: inline-flex;
889
+ align-items: center;
890
+ justify-content: center;
891
+ width: 15px;
892
+ height: 15px;
893
+ margin-right: 4px;
894
+ padding: 0;
895
+ border: 0;
896
+ border-radius: 3px;
897
+ background: transparent;
898
+ color: #59a869;
899
+ font-size: 10px;
900
+ line-height: 1;
901
+ cursor: pointer;
902
+ vertical-align: middle;
903
+ }
904
+ .http-run:hover { background: color-mix(in srgb, #59a869 28%, transparent); color: #6cc17b; }
905
+ .http-request-line .source-code { font-weight: 600; }
906
+ .http-method { color: var(--token-keyword); font-weight: 700; }
907
+ .http-sep { color: var(--muted); }
908
+ .http-var { border-radius: 3px; padding: 0 1px; }
909
+ .http-var.known { color: var(--token-string); background: color-mix(in srgb, var(--token-string) 15%, transparent); }
910
+ .http-var.unknown { color: #e06c75; background: color-mix(in srgb, #e06c75 16%, transparent); text-decoration: underline dotted; }
911
+ .http-response-row td { padding: 0 14px 0 0; border: 0; background: transparent; }
912
+ .http-response {
913
+ margin: 6px 0 12px;
914
+ border: 1px solid var(--border);
915
+ border-radius: 8px;
916
+ background: color-mix(in srgb, var(--active) 5%, var(--panel));
917
+ overflow: hidden;
918
+ font-size: 12px;
919
+ }
920
+ .http-response.loading { padding: 10px 12px; color: var(--muted); font-style: italic; }
921
+ .http-resp-head {
922
+ display: flex;
923
+ align-items: center;
924
+ gap: 12px;
925
+ padding: 7px 12px;
926
+ border-bottom: 1px solid var(--border);
927
+ background: color-mix(in srgb, var(--active) 8%, transparent);
928
+ }
929
+ .http-status { font-weight: 700; }
930
+ .http-status.ok { color: #59a869; }
931
+ .http-status.warn { color: #d9a343; }
932
+ .http-status.bad { color: #e06c75; }
933
+ .http-resp-meta { color: var(--muted); }
934
+ .http-resp-toggle {
935
+ margin-left: auto;
936
+ background: transparent;
937
+ border: 1px solid var(--border);
938
+ border-radius: 6px;
939
+ color: var(--fg);
940
+ padding: 2px 8px;
941
+ font-size: 11px;
942
+ cursor: pointer;
943
+ }
944
+ .http-resp-toggle:hover { border-color: var(--active); color: var(--active); }
945
+ .http-resp-headers {
946
+ padding: 8px 12px;
947
+ border-bottom: 1px solid var(--border);
948
+ display: grid;
949
+ gap: 3px;
950
+ max-height: 180px;
951
+ overflow: auto;
952
+ }
953
+ .http-resp-headers.hidden { display: none; }
954
+ .http-h { display: flex; gap: 10px; }
955
+ .http-h-k { color: var(--token-keyword); min-width: 170px; flex-shrink: 0; }
956
+ .http-h-v { color: var(--fg); word-break: break-all; }
957
+ .http-resp-body {
958
+ margin: 0;
959
+ padding: 10px 12px;
960
+ max-height: 460px;
961
+ overflow: auto;
962
+ white-space: pre-wrap;
963
+ word-break: break-word;
964
+ font-size: 12px;
965
+ line-height: 1.55;
966
+ }
967
+ .http-resp-empty { color: var(--muted); font-style: italic; }
968
+
969
+ /* --- Image preview (raster images embedded as data URIs) --- */
970
+ .source-body.image-body { display: flex; align-items: flex-start; justify-content: center; padding: 24px; }
971
+ .image-view { display: flex; flex-direction: column; align-items: center; gap: 12px; max-width: 100%; }
972
+ .image-preview {
973
+ max-width: 100%;
974
+ max-height: calc(100vh - 230px);
975
+ object-fit: contain;
976
+ border: 1px solid var(--border);
977
+ border-radius: 6px;
978
+ background: repeating-conic-gradient(#3a3a3a 0% 25%, #2f2f2f 0% 50%) 50% / 20px 20px;
979
+ cursor: zoom-in;
980
+ }
981
+ .image-cap { color: var(--muted); font: 11px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
982
+
983
+ /* --- Lightbox (click an image to zoom) --- */
984
+ .mc-lightbox {
985
+ position: fixed; inset: 0; z-index: 50;
986
+ display: flex; align-items: center; justify-content: center;
987
+ background: rgba(0, 0, 0, 0.82); cursor: zoom-out; padding: 32px;
988
+ }
989
+ .mc-lightbox.hidden { display: none; }
990
+ .mc-lightbox-img { max-width: 96vw; max-height: 94vh; object-fit: contain; box-shadow: 0 8px 40px rgba(0, 0, 0, 0.6); }
991
+
992
+ /* --- Rendered markdown: a .source-table whose cells hold rendered HTML, so the line-number gutter
993
+ and per-line/-block comments keep working exactly as in the plain source view. --- */
994
+ .source-body.rendered-body { padding: 0; }
995
+ .md-doc .num { vertical-align: top; }
996
+ .md-doc .md-cell {
997
+ white-space: normal;
998
+ overflow-wrap: anywhere;
999
+ padding: 2px 24px 2px 14px;
1000
+ color: var(--text);
1001
+ font: 14px/1.7 -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
1002
+ }
1003
+ .md-cell > :first-child { margin-top: 0; }
1004
+ .md-cell > :last-child { margin-bottom: 0; }
1005
+ .md-h { line-height: 1.3; margin: 0.25em 0; font-weight: 650; color: #d7e0ea; }
1006
+ .md-h1 { font-size: 1.7em; }
1007
+ .md-h2 { font-size: 1.4em; }
1008
+ .md-h3 { font-size: 1.18em; }
1009
+ .md-h4 { font-size: 1.05em; }
1010
+ .md-h5, .md-h6 { font-size: 0.95em; color: var(--muted); }
1011
+ .md-p { margin: 0.2em 0; }
1012
+ .md-cell a { color: var(--active); text-decoration: none; }
1013
+ .md-cell a:hover { text-decoration: underline; }
1014
+ .md-cell strong { color: #c9d4df; }
1015
+ .md-cell del { color: var(--muted); }
1016
+ .md-cell code {
1017
+ font: 0.86em Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1018
+ background: var(--line); border: 1px solid var(--border); border-radius: 4px; padding: 0.1em 0.4em;
1019
+ }
1020
+ .md-code { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; padding: 10px 12px; overflow: auto; margin: 0.3em 0; }
1021
+ .md-code code { font: 12px/1.5 Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; background: none; border: 0; padding: 0; white-space: pre; }
1022
+ .md-quote { margin: 0.3em 0; padding: 2px 14px; color: var(--muted); border-left: 3px solid var(--border); }
1023
+ .md-quote p { margin: 0.3em 0; }
1024
+ .md-list { margin: 0.2em 0; padding-left: 1.5em; }
1025
+ .md-list li { margin: 0.15em 0; }
1026
+ .md-hr { border: 0; border-top: 1px solid var(--border); margin: 0.5em 0; }
1027
+ .md-img { max-width: 100%; border-radius: 6px; }
1028
+ .md-table { border-collapse: collapse; margin: 0.3em 0; font-size: 0.92em; }
1029
+ .md-table th, .md-table td { border: 1px solid var(--border); padding: 5px 11px; text-align: left; }
1030
+ .md-table thead th { background: var(--line); }
1031
+
1032
+ /* --- CSV/TSV: an aligned table that is still a .source-table (gutter + per-row comments). --- */
1033
+ .csv-doc { width: auto; }
1034
+ .csv-cell { border: 1px solid var(--border); padding: 3px 10px; text-align: left; white-space: pre; vertical-align: top; font: 12px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
1035
+ .csv-head .csv-cell { background: var(--line); color: #d7e0ea; font-weight: 650; }
1036
+ .csv-row:nth-child(even) .csv-cell { background: rgba(255, 255, 255, 0.018); }
1037
+ .csv-empty { color: var(--muted); font-style: italic; padding: 16px; }
1038
+
1039
+ /* --- Integrated terminal panel (Electron only): fixed to the content column's bottom, height-resizable.
1040
+ The active border-top marks it as the merged-prompt send target ("highlighted while it's open"). --- */
1041
+ .terminal-panel {
1042
+ position: fixed;
1043
+ left: var(--sidebar-width, 280px);
1044
+ right: 0;
1045
+ bottom: 0;
1046
+ height: var(--terminal-height, 320px);
1047
+ z-index: 40;
1048
+ display: flex;
1049
+ flex-direction: column;
1050
+ background: var(--bg);
1051
+ border-top: 2px solid var(--active);
1052
+ box-shadow: 0 -10px 28px rgba(0, 0, 0, 0.45);
1053
+ }
1054
+ .terminal-resizer { flex: none; height: 6px; margin-top: -3px; cursor: row-resize; }
1055
+ .terminal-resizer:hover, .terminal-resizer.resizing { background: var(--active); }
1056
+ .terminal-bar {
1057
+ flex: none; display: flex; align-items: center; justify-content: space-between;
1058
+ padding: 4px 10px; background: var(--sidebar); border-bottom: 1px solid var(--border);
1059
+ font-size: 11px; color: var(--muted);
1060
+ }
1061
+ .terminal-title { letter-spacing: 0.08em; text-transform: uppercase; }
1062
+ .terminal-x { border: 0; background: transparent; color: var(--muted); font-size: 16px; line-height: 1; padding: 0 4px; cursor: pointer; }
1063
+ .terminal-x:hover { color: var(--text); }
1064
+ /* Split panes sit side by side (no tabs); the 1px gap shows the --border underneath as a divider. */
1065
+ .terminal-host { flex: 1 1 auto; min-height: 0; display: flex; gap: 1px; overflow: hidden; background: var(--border); }
1066
+ .terminal-pane { flex: 1 1 0; min-width: 0; background: var(--bg); overflow: hidden; display: flex; flex-direction: column; }
1067
+ /* Per-pane name strip at the top; double-click or Cmd/Ctrl+Alt+R to rename inline. */
1068
+ .terminal-pane-label {
1069
+ flex: none; padding: 2px 10px; font-size: 10px; letter-spacing: 0.04em;
1070
+ color: var(--muted); background: var(--sidebar); border-bottom: 1px solid var(--border);
1071
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: text;
1072
+ }
1073
+ .terminal-pane-label:hover { color: var(--text); }
1074
+ .terminal-pane-label[contenteditable="true"] { color: var(--text); background: var(--bg); outline: none; }
1075
+ .terminal-pane.is-active .terminal-pane-label { color: var(--text); }
1076
+ .terminal-pane-host { flex: 1 1 auto; min-width: 0; min-height: 0; padding: 4px 0 4px 8px; }
1077
+ .terminal-pane.is-active { box-shadow: inset 2px 0 0 var(--active); }
1078
+ /* Pane-pick mode (merged "Send to terminal"): chosen pane ringed + full opacity, the rest dimmed. */
1079
+ .terminal-panel.send-mode .terminal-pane { transition: opacity 120ms ease; }
1080
+ .terminal-pane.is-dimmed { opacity: 0.3; }
1081
+ .terminal-pane.is-send-target { box-shadow: inset 0 0 0 2px var(--active); opacity: 1; position: relative; }
1082
+ /* Faint ⏎ hint floating over the chosen pane; it vanishes the instant Enter exits send mode. */
1083
+ .terminal-pane.is-send-target::after {
1084
+ content: "⏎";
1085
+ position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
1086
+ font-size: 56px; color: var(--active); opacity: 0.32; pointer-events: none; z-index: 5;
1087
+ }
1088
+ /* Send mode dims the rest of the app (sidebar + file/diff view) so only the terminal pops. */
1089
+ body.terminal-send-mode .sidebar,
1090
+ body.terminal-send-mode .content,
1091
+ body.terminal-send-mode .sidebar-resizer { opacity: 0.25; pointer-events: none; }
1092
+ /* Pad the content tail so it isn't hidden behind the fixed panel while the terminal is open. */
1093
+ body.terminal-open .content { padding-bottom: var(--terminal-height, 320px); }
1094
+ .terminal-toggle.is-active { color: var(--active); }