@happy-nut/monacori 0.1.20 → 0.1.22
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.
- package/assets/icon.icns +0 -0
- package/dist/app-main.js +441 -158
- package/dist/assets.js +8 -1
- package/dist/build.d.ts +1 -0
- package/dist/build.js +13 -7
- package/dist/diff.d.ts +2 -1
- package/dist/diff.js +3 -3
- package/dist/i18n.js +56 -8
- package/dist/preload.cjs +15 -0
- package/dist/render.d.ts +5 -0
- package/dist/render.js +154 -29
- package/dist/util.d.ts +5 -0
- package/dist/util.js +21 -0
- package/dist/viewer.client.js +582 -153
- package/dist/viewer.client.min.js +1 -0
- package/dist/viewer.css +202 -72
- package/package.json +10 -2
- package/scripts/patch-electron-name.mjs +23 -14
package/dist/viewer.css
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
2
|
:root {
|
|
3
3
|
color-scheme: dark;
|
|
4
|
-
--bg: #
|
|
5
|
-
--panel: #
|
|
4
|
+
--bg: #1e1e1e;
|
|
5
|
+
--panel: #252526;
|
|
6
6
|
--text: #a9b7c6;
|
|
7
7
|
--muted: #808080;
|
|
8
8
|
--border: #393b3d;
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
--add-strong: #1f5b34;
|
|
13
13
|
--del-strong: #6e2c2c;
|
|
14
14
|
--active: #4a88c7;
|
|
15
|
-
--sidebar: #
|
|
15
|
+
--sidebar: #2a2a2b;
|
|
16
16
|
--token-comment: #808080;
|
|
17
17
|
--token-keyword: #cc7832;
|
|
18
18
|
--token-string: #6a8759;
|
|
@@ -69,8 +69,9 @@ html, body { margin: 0; min-height: 100%; }
|
|
|
69
69
|
/* Reserve the scrollbar gutter so collapsing/expanding a file does not shift the layout. */
|
|
70
70
|
html { scrollbar-gutter: stable; }
|
|
71
71
|
body {
|
|
72
|
+
--rail-width: 46px;
|
|
72
73
|
display: grid;
|
|
73
|
-
grid-template-columns: var(--sidebar-width, 280px) minmax(0, 1fr);
|
|
74
|
+
grid-template-columns: var(--rail-width) var(--sidebar-width, 280px) minmax(0, 1fr);
|
|
74
75
|
/* Row 1 = content, row 2 = the integrated terminal. The terminal is a real grid row (not a fixed
|
|
75
76
|
overlay), so content shrinks above it and the caret can never scroll behind it. When the terminal
|
|
76
77
|
is .hidden (display:none) the auto row collapses to 0 and content fills the viewport. */
|
|
@@ -82,6 +83,7 @@ body {
|
|
|
82
83
|
}
|
|
83
84
|
.sidebar {
|
|
84
85
|
grid-row: 1 / -1; /* full height, left of both the content and terminal rows */
|
|
86
|
+
grid-column: 2;
|
|
85
87
|
height: 100vh;
|
|
86
88
|
display: flex;
|
|
87
89
|
flex-direction: column;
|
|
@@ -98,7 +100,7 @@ body {
|
|
|
98
100
|
.sidebar-resizer {
|
|
99
101
|
position: fixed;
|
|
100
102
|
top: 0;
|
|
101
|
-
left: var(--sidebar-width, 280px);
|
|
103
|
+
left: calc(var(--rail-width, 46px) + var(--sidebar-width, 280px));
|
|
102
104
|
width: 9px;
|
|
103
105
|
height: 100vh;
|
|
104
106
|
margin-left: -5px;
|
|
@@ -150,9 +152,61 @@ body {
|
|
|
150
152
|
text-overflow: ellipsis;
|
|
151
153
|
}
|
|
152
154
|
.tabs { display: none; }
|
|
155
|
+
/* ===== IntelliJ-style activity rail: icon-per-view column, hover tooltip with the shortcut. ===== */
|
|
156
|
+
.activity-rail {
|
|
157
|
+
grid-row: 1 / -1;
|
|
158
|
+
grid-column: 1;
|
|
159
|
+
display: flex;
|
|
160
|
+
flex-direction: column;
|
|
161
|
+
align-items: center;
|
|
162
|
+
padding: 8px 0;
|
|
163
|
+
background: var(--sidebar);
|
|
164
|
+
border-right: 1px solid var(--border);
|
|
165
|
+
overflow: visible; /* let tooltips escape to the right, over the sidebar */
|
|
166
|
+
z-index: 32;
|
|
167
|
+
}
|
|
168
|
+
.rail-group { display: flex; flex-direction: column; align-items: center; gap: 2px; }
|
|
169
|
+
.rail-bottom { margin-top: auto; } /* pin terminal + settings to the bottom */
|
|
170
|
+
.rail-btn {
|
|
171
|
+
position: relative;
|
|
172
|
+
flex: none;
|
|
173
|
+
width: 34px; height: 34px;
|
|
174
|
+
display: flex; align-items: center; justify-content: center;
|
|
175
|
+
border: 0; border-radius: 7px;
|
|
176
|
+
background: transparent; color: var(--muted);
|
|
177
|
+
cursor: pointer; padding: 0;
|
|
178
|
+
}
|
|
179
|
+
.rail-btn:hover { color: var(--text); background: color-mix(in srgb, var(--active) 12%, transparent); }
|
|
180
|
+
.rail-btn.is-active { color: var(--active); background: color-mix(in srgb, var(--active) 16%, transparent); }
|
|
181
|
+
/* Left accent bar at the rail edge marks the active view (like IntelliJ). */
|
|
182
|
+
.rail-btn.is-active::before {
|
|
183
|
+
content: ""; position: absolute; left: -6px; top: 5px; bottom: 5px; width: 2px;
|
|
184
|
+
background: var(--active); border-radius: 0 2px 2px 0;
|
|
185
|
+
}
|
|
186
|
+
.rail-gear { font-size: 16px; line-height: 1; }
|
|
187
|
+
.rail-tip {
|
|
188
|
+
position: absolute; left: calc(100% + 10px); top: 50%; transform: translateY(-50%);
|
|
189
|
+
display: flex; align-items: center; gap: 8px; white-space: nowrap;
|
|
190
|
+
background: var(--panel); color: var(--text);
|
|
191
|
+
border: 1px solid var(--border); border-radius: 6px;
|
|
192
|
+
padding: 5px 9px; font-size: 12px;
|
|
193
|
+
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);
|
|
194
|
+
opacity: 0; pointer-events: none; transition: opacity .12s ease;
|
|
195
|
+
z-index: 90;
|
|
196
|
+
}
|
|
197
|
+
.rail-btn:hover .rail-tip, .rail-btn:focus-visible .rail-tip { opacity: 1; }
|
|
198
|
+
.rail-tip kbd {
|
|
199
|
+
font: 11px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
200
|
+
color: var(--muted); background: var(--bg);
|
|
201
|
+
border: 1px solid var(--border); border-radius: 4px; padding: 1px 5px;
|
|
202
|
+
}
|
|
203
|
+
/* Current branch chip under the project name in the sidebar header. */
|
|
204
|
+
.brand-branch { display: inline-flex; align-items: center; gap: 5px; margin-top: 3px; min-width: 0; color: var(--muted); font-size: 12px; }
|
|
205
|
+
.brand-branch-icon { flex: none; opacity: 0.8; }
|
|
206
|
+
.brand-branch-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums; }
|
|
153
207
|
.tab, .plain-button {
|
|
154
208
|
border: 1px solid var(--border);
|
|
155
|
-
border-radius:
|
|
209
|
+
border-radius: 0;
|
|
156
210
|
padding: 6px 9px;
|
|
157
211
|
color: var(--text);
|
|
158
212
|
background: var(--panel);
|
|
@@ -186,7 +240,7 @@ body {
|
|
|
186
240
|
.settings-btn {
|
|
187
241
|
flex: none;
|
|
188
242
|
border: 1px solid transparent;
|
|
189
|
-
border-radius:
|
|
243
|
+
border-radius: 0;
|
|
190
244
|
background: transparent;
|
|
191
245
|
color: var(--muted);
|
|
192
246
|
font-size: 14px;
|
|
@@ -206,7 +260,7 @@ body {
|
|
|
206
260
|
overflow: auto;
|
|
207
261
|
padding: 12px;
|
|
208
262
|
border: 1px solid var(--border);
|
|
209
|
-
border-radius:
|
|
263
|
+
border-radius: 0;
|
|
210
264
|
background: var(--panel);
|
|
211
265
|
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5);
|
|
212
266
|
font-size: 12px;
|
|
@@ -231,7 +285,7 @@ body {
|
|
|
231
285
|
.settings-panel {
|
|
232
286
|
display: flex;
|
|
233
287
|
width: 980px; max-width: 90vw; height: 700px; max-height: 88vh;
|
|
234
|
-
background: var(--panel); border: 1px solid var(--border); border-radius:
|
|
288
|
+
background: var(--panel); border: 1px solid var(--border); border-radius: 0;
|
|
235
289
|
overflow: hidden; box-shadow: 0 12px 48px rgba(0, 0, 0, 0.55);
|
|
236
290
|
}
|
|
237
291
|
.settings-nav {
|
|
@@ -240,7 +294,7 @@ body {
|
|
|
240
294
|
display: flex; flex-direction: column; gap: 4px;
|
|
241
295
|
}
|
|
242
296
|
.settings-nav-title { font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); padding: 4px 10px 8px; }
|
|
243
|
-
.settings-cat { text-align: left; border: 0; background: transparent; color: var(--text); padding: 7px 10px; border-radius:
|
|
297
|
+
.settings-cat { text-align: left; border: 0; background: transparent; color: var(--text); padding: 7px 10px; border-radius: 0; font-size: 13px; cursor: pointer; }
|
|
244
298
|
.settings-cat:hover { background: color-mix(in srgb, var(--active) 12%, transparent); }
|
|
245
299
|
.settings-cat.active { background: color-mix(in srgb, var(--active) 20%, transparent); color: var(--active); font-weight: 600; }
|
|
246
300
|
.settings-body { flex: 1 1 auto; min-width: 0; padding: 24px 28px; overflow: auto; }
|
|
@@ -251,14 +305,14 @@ body {
|
|
|
251
305
|
.settings-textarea {
|
|
252
306
|
width: 100%; box-sizing: border-box; resize: vertical; min-height: 70px;
|
|
253
307
|
background: var(--bg); color: var(--text);
|
|
254
|
-
border: 1px solid var(--border); border-radius:
|
|
308
|
+
border: 1px solid var(--border); border-radius: 0; padding: 10px 12px;
|
|
255
309
|
font: 12px/1.55 ui-sans-serif, system-ui, sans-serif;
|
|
256
310
|
}
|
|
257
311
|
.settings-textarea:focus { outline: none; border-color: var(--active); }
|
|
258
312
|
.settings-select {
|
|
259
313
|
width: auto; box-sizing: border-box;
|
|
260
314
|
background: var(--bg); color: var(--text);
|
|
261
|
-
border: 1px solid var(--border); border-radius:
|
|
315
|
+
border: 1px solid var(--border); border-radius: 0; padding: 8px 12px;
|
|
262
316
|
font: 12px/1.55 ui-sans-serif, system-ui, sans-serif;
|
|
263
317
|
}
|
|
264
318
|
.settings-select:focus { outline: none; border-color: var(--active); }
|
|
@@ -274,11 +328,11 @@ body {
|
|
|
274
328
|
.keys-grid { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 5px 10px; align-items: center; margin-bottom: 2px; }
|
|
275
329
|
.keys-grid kbd {
|
|
276
330
|
justify-self: start;
|
|
277
|
-
font:
|
|
331
|
+
font: 12.5px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
278
332
|
background: var(--bg);
|
|
279
333
|
border: 1px solid var(--border);
|
|
280
|
-
border-radius:
|
|
281
|
-
padding:
|
|
334
|
+
border-radius: 0;
|
|
335
|
+
padding: 3px 7px;
|
|
282
336
|
color: var(--text);
|
|
283
337
|
white-space: nowrap;
|
|
284
338
|
}
|
|
@@ -308,7 +362,7 @@ body {
|
|
|
308
362
|
flex: none;
|
|
309
363
|
padding: 3px 10px;
|
|
310
364
|
border: 1px solid var(--border);
|
|
311
|
-
border-radius:
|
|
365
|
+
border-radius: 0;
|
|
312
366
|
color: var(--muted);
|
|
313
367
|
background: var(--panel);
|
|
314
368
|
font-size: 11px;
|
|
@@ -325,7 +379,7 @@ body {
|
|
|
325
379
|
width: 13px;
|
|
326
380
|
height: 13px;
|
|
327
381
|
border: 1px solid currentColor;
|
|
328
|
-
border-radius:
|
|
382
|
+
border-radius: 0;
|
|
329
383
|
opacity: 0.75;
|
|
330
384
|
}
|
|
331
385
|
.diff-viewed-toggle.is-viewed {
|
|
@@ -431,7 +485,7 @@ td.d2h-del:not(.d2h-code-side-linenumber) { color: #d8e0e8; }
|
|
|
431
485
|
.d2h-ins .d2h-change { background: var(--add-strong); }
|
|
432
486
|
.d2h-code-line-ctn ins, .d2h-code-line-ctn del {
|
|
433
487
|
text-decoration: none;
|
|
434
|
-
border-radius:
|
|
488
|
+
border-radius: 0;
|
|
435
489
|
padding: 0 1px;
|
|
436
490
|
box-decoration-break: clone;
|
|
437
491
|
-webkit-box-decoration-break: clone;
|
|
@@ -446,10 +500,10 @@ td.d2h-del:not(.d2h-code-side-linenumber) { color: #d8e0e8; }
|
|
|
446
500
|
}
|
|
447
501
|
.d2h-diff-table tr.diff-active-row td { background: rgba(74, 136, 199, 0.16) !important; }
|
|
448
502
|
.d2h-diff-table tr.diff-active-row td.d2h-code-side-linenumber { box-shadow: inset 2px 0 0 var(--active); }
|
|
449
|
-
.review-status .ws-ignored { color: var(--token-tag); border: 1px solid color-mix(in srgb, var(--token-tag) 45%, transparent); border-radius:
|
|
450
|
-
.index-progress { display: inline-flex; width: 54px; height: 4px; border-radius:
|
|
503
|
+
.review-status .ws-ignored { color: var(--token-tag); border: 1px solid color-mix(in srgb, var(--token-tag) 45%, transparent); border-radius: 0; padding: 0 7px; }
|
|
504
|
+
.index-progress { display: inline-flex; width: 54px; height: 4px; border-radius: 0; background: color-mix(in srgb, var(--muted) 30%, transparent); overflow: hidden; vertical-align: middle; }
|
|
451
505
|
.index-progress.hidden { display: none; }
|
|
452
|
-
.index-progress-bar { width: 0; height: 100%; background: var(--active); border-radius:
|
|
506
|
+
.index-progress-bar { width: 0; height: 100%; background: var(--active); border-radius: 0; transition: width 0.18s ease; }
|
|
453
507
|
.d2h-file-collapse {
|
|
454
508
|
display: inline-flex;
|
|
455
509
|
align-items: center;
|
|
@@ -457,7 +511,7 @@ td.d2h-del:not(.d2h-code-side-linenumber) { color: #d8e0e8; }
|
|
|
457
511
|
margin-left: 8px;
|
|
458
512
|
padding: 3px 10px;
|
|
459
513
|
border: 1px solid var(--border);
|
|
460
|
-
border-radius:
|
|
514
|
+
border-radius: 0;
|
|
461
515
|
color: var(--muted);
|
|
462
516
|
background: var(--panel);
|
|
463
517
|
font-size: 11px;
|
|
@@ -475,7 +529,7 @@ td.d2h-del:not(.d2h-code-side-linenumber) { color: #d8e0e8; }
|
|
|
475
529
|
width: 13px;
|
|
476
530
|
height: 13px;
|
|
477
531
|
border: 1px solid currentColor;
|
|
478
|
-
border-radius:
|
|
532
|
+
border-radius: 0;
|
|
479
533
|
opacity: 0.75;
|
|
480
534
|
}
|
|
481
535
|
.d2h-file-collapse-input { display: none; }
|
|
@@ -507,7 +561,7 @@ td.d2h-del:not(.d2h-code-side-linenumber) { color: #d8e0e8; }
|
|
|
507
561
|
min-height: 18px;
|
|
508
562
|
padding: 1px 5px 1px calc(7px + (var(--depth) * 14px));
|
|
509
563
|
color: var(--text);
|
|
510
|
-
border-radius:
|
|
564
|
+
border-radius: 0;
|
|
511
565
|
cursor: default;
|
|
512
566
|
list-style: none;
|
|
513
567
|
}
|
|
@@ -524,8 +578,11 @@ td.d2h-del:not(.d2h-code-side-linenumber) { color: #d8e0e8; }
|
|
|
524
578
|
.tree-dir[open] > summary .fi-closed { display: none; }
|
|
525
579
|
.tree-dir[open] > summary .fi-open { display: block; }
|
|
526
580
|
.file-link.tree-file { padding-left: calc(8px + (var(--depth) * 14px)); }
|
|
527
|
-
|
|
528
|
-
|
|
581
|
+
/* Arrow-key focus in the tree (changes/files) matches the active-file highlight — a tinted fill + accent
|
|
582
|
+
border — so navigating the file tree reads the same as the diff-side selection (not a faint 1px outline). */
|
|
583
|
+
.tree-focus { background: color-mix(in srgb, var(--active) 20%, transparent); border-radius: 0; }
|
|
584
|
+
.file-link.tree-focus { border-color: var(--active); }
|
|
585
|
+
summary.tree-focus { background: color-mix(in srgb, var(--active) 20%, transparent); }
|
|
529
586
|
.file-link {
|
|
530
587
|
display: grid;
|
|
531
588
|
grid-template-columns: auto minmax(0, 1fr) auto;
|
|
@@ -535,7 +592,7 @@ summary.tree-focus { background: var(--bg); }
|
|
|
535
592
|
padding: 1px 6px;
|
|
536
593
|
color: var(--text);
|
|
537
594
|
text-decoration: none;
|
|
538
|
-
border-radius:
|
|
595
|
+
border-radius: 0;
|
|
539
596
|
border: 1px solid transparent;
|
|
540
597
|
background: transparent;
|
|
541
598
|
width: 100%;
|
|
@@ -543,7 +600,10 @@ summary.tree-focus { background: var(--bg); }
|
|
|
543
600
|
font: inherit;
|
|
544
601
|
cursor: pointer;
|
|
545
602
|
}
|
|
546
|
-
.file-link:hover
|
|
603
|
+
.file-link:hover { background: color-mix(in srgb, var(--text) 7%, transparent); border-color: var(--border); }
|
|
604
|
+
/* The file being viewed stands out clearly: a tinted fill + accent border, not just a faint outline. */
|
|
605
|
+
.file-link.active { background: color-mix(in srgb, var(--active) 26%, transparent); border-color: var(--active); }
|
|
606
|
+
.file-link.active:hover { background: color-mix(in srgb, var(--active) 32%, transparent); }
|
|
547
607
|
.file-link.viewed { opacity: 0.58; }
|
|
548
608
|
.file-link.viewed:hover, .file-link.viewed.active { opacity: 1; }
|
|
549
609
|
.path { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; }
|
|
@@ -559,7 +619,7 @@ summary.tree-focus { background: var(--bg); }
|
|
|
559
619
|
justify-content: center;
|
|
560
620
|
min-width: 16px;
|
|
561
621
|
height: 16px;
|
|
562
|
-
border-radius:
|
|
622
|
+
border-radius: 0;
|
|
563
623
|
padding: 0 3px;
|
|
564
624
|
font-size: 9px;
|
|
565
625
|
font-weight: 700;
|
|
@@ -574,7 +634,7 @@ summary.tree-focus { background: var(--bg); }
|
|
|
574
634
|
.status-deleted { background: var(--del); color: #cf222e; }
|
|
575
635
|
.status-renamed { background: #fff8c5; color: #9a6700; }
|
|
576
636
|
.status-source { background: var(--line); color: var(--muted); }
|
|
577
|
-
.content { min-width: 0; padding: 0; display: flex; flex-direction: column; min-height: 0; overflow: hidden; grid-column:
|
|
637
|
+
.content { min-width: 0; padding: 0; display: flex; flex-direction: column; min-height: 0; overflow: hidden; grid-column: 3; grid-row: 1; }
|
|
578
638
|
/* Pin the diff's horizontal scrollbar to the viewport bottom instead of letting it float
|
|
579
639
|
mid-screen when a file's diff is short: fill the content column vertically so the last
|
|
580
640
|
file's diff body extends all the way down. */
|
|
@@ -589,7 +649,7 @@ summary.tree-focus { background: var(--bg); }
|
|
|
589
649
|
scrolls naturally inside .diff2html-container. */
|
|
590
650
|
/* Slimmer scrollbars — the default overlay bars read as chunky on the dark UI. */
|
|
591
651
|
::-webkit-scrollbar { width: 9px; height: 9px; }
|
|
592
|
-
::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--muted) 32%, transparent); border-radius:
|
|
652
|
+
::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--muted) 32%, transparent); border-radius: 0; }
|
|
593
653
|
::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--muted) 52%, transparent); }
|
|
594
654
|
::-webkit-scrollbar-track { background: transparent; }
|
|
595
655
|
.toolbar {
|
|
@@ -632,7 +692,7 @@ h1 { margin: 0; font-size: 18px; }
|
|
|
632
692
|
.toolbar p { margin: 4px 0 0; color: var(--muted); font-size: 12px; }
|
|
633
693
|
.empty { padding: 24px; color: var(--muted); }
|
|
634
694
|
.source-viewer { min-height: 0; } /* grid sizes this; a 100vh min would overflow the content row */
|
|
635
|
-
.source-toolbar { margin-bottom: 0; }
|
|
695
|
+
.source-toolbar { flex: none; margin-bottom: 0; padding: 4px 12px; } /* flex:none (don't shrink, same crush as the tabs); compact: the file-meta row needs far less height than the diff toolbar */
|
|
636
696
|
.source-file-meta {
|
|
637
697
|
display: flex;
|
|
638
698
|
flex: 1;
|
|
@@ -659,12 +719,17 @@ h1 { margin: 0; font-size: 18px; }
|
|
|
659
719
|
/* Files-mode tabs: one row of tabs above the source toolbar (open files, click to switch, × to close). */
|
|
660
720
|
.source-tabs {
|
|
661
721
|
display: flex;
|
|
722
|
+
/* NEVER shrink: #source-viewer is a flex column whose source-body holds a tall (min-content) code
|
|
723
|
+
table, so a shrinkable header row got crushed (the bar collapsed to ~7px and clipped the tabs in
|
|
724
|
+
half). flex:none keeps the bar at its natural height; the body absorbs the overflow and scrolls. */
|
|
725
|
+
flex: none;
|
|
662
726
|
overflow-x: auto;
|
|
663
727
|
gap: 1px;
|
|
664
|
-
|
|
728
|
+
/* Breathing room from the window's top edge so the first row of tabs isn't flush against it. */
|
|
729
|
+
margin: 6px 8px 6px;
|
|
665
730
|
background: var(--sidebar);
|
|
666
731
|
border: 1px solid var(--border);
|
|
667
|
-
border-radius:
|
|
732
|
+
border-radius: 0;
|
|
668
733
|
scrollbar-width: thin;
|
|
669
734
|
}
|
|
670
735
|
.source-tab {
|
|
@@ -681,19 +746,21 @@ h1 { margin: 0; font-size: 18px; }
|
|
|
681
746
|
cursor: pointer;
|
|
682
747
|
white-space: nowrap;
|
|
683
748
|
}
|
|
684
|
-
.source-tab:first-child { border-top-left-radius:
|
|
749
|
+
.source-tab:first-child { border-top-left-radius: 0; border-bottom-left-radius: 0; }
|
|
685
750
|
.source-tab:hover { color: var(--text); }
|
|
686
751
|
.source-tab.active { color: var(--text); background: var(--bg); box-shadow: inset 0 -2px 0 var(--active); }
|
|
687
752
|
.source-tab-name { overflow: hidden; text-overflow: ellipsis; }
|
|
688
753
|
.source-tab-close {
|
|
689
754
|
flex: none; border: 0; background: transparent; color: var(--muted);
|
|
690
|
-
font-size: 14px; line-height: 1; padding: 0 3px; cursor: pointer; border-radius:
|
|
755
|
+
font-size: 14px; line-height: 1; padding: 0 3px; cursor: pointer; border-radius: 0;
|
|
691
756
|
}
|
|
692
757
|
.source-tab-close:hover { background: var(--line); color: var(--text); }
|
|
693
|
-
/* Scrolloff
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
758
|
+
/* Scrolloff for the sidebar tree only. NOTE: this is deliberately NOT on the source-body or the diff
|
|
759
|
+
container. Chromium insets the text-selection autoscroll region by scroll-padding, so a 35vh inset made
|
|
760
|
+
a drag-select rocket-scroll the moment the pointer left the middle band (runaway scroll + the selection
|
|
761
|
+
flying to the file end). Those two panes get their caret/F7 scroll-off from manual scrollTop math
|
|
762
|
+
(scheduleSourceReveal / scrolloffReveal), so they don't need — and must not have — scroll-padding. */
|
|
763
|
+
.sidebar-scroll { scroll-padding-block: 35vh; }
|
|
697
764
|
.source-body {
|
|
698
765
|
border: 1px solid var(--border);
|
|
699
766
|
overflow: auto;
|
|
@@ -809,7 +876,7 @@ h1 { margin: 0; font-size: 18px; }
|
|
|
809
876
|
.source-type-icon { display: inline-flex; align-items: center; flex: none; margin-right: 2px; }
|
|
810
877
|
.source-type-icon .ftype { width: 16px; height: 16px; display: block; }
|
|
811
878
|
.mc-file-badge { display: inline-flex; gap: 4px; align-items: center; }
|
|
812
|
-
.mc-fb { font-size: 10px; line-height: 1; padding: 1px 6px; border-radius:
|
|
879
|
+
.mc-fb { font-size: 10px; line-height: 1; padding: 1px 6px; border-radius: 0; font-weight: 700; font-variant-numeric: tabular-nums; border: 1px solid transparent; }
|
|
813
880
|
.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); }
|
|
814
881
|
.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); }
|
|
815
882
|
/* Lines kept highlighted while composing a comment on a drag selection */
|
|
@@ -822,7 +889,7 @@ h1 { margin: 0; font-size: 18px; }
|
|
|
822
889
|
.source-table .mc-thread-cell { padding: 4px 12px 8px 66px; }
|
|
823
890
|
.mc-card {
|
|
824
891
|
border: 1px solid var(--border);
|
|
825
|
-
border-radius:
|
|
892
|
+
border-radius: 0; background: var(--panel); margin: 8px 0; max-width: 760px;
|
|
826
893
|
font: 12px/1.5 Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
827
894
|
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.28);
|
|
828
895
|
overflow: hidden;
|
|
@@ -839,30 +906,35 @@ body.mc-composing .source-row.csv-row.cursor-line .csv-cell { background: transp
|
|
|
839
906
|
body.mc-composing .source-row.cursor-line .num { color: inherit; }
|
|
840
907
|
/* Same single-caret rule for a floating overlay (merged comments / prompt memo / settings): it owns the only
|
|
841
908
|
caret while open, so hide the file's blinking caret behind it — never two carets across visible panels. */
|
|
842
|
-
|
|
843
|
-
|
|
909
|
+
/* A focused merged/memo dock owns the only caret: hide the file caret behind it while it has focus
|
|
910
|
+
(single-caret rule). Focus elsewhere with the dock still open -> the file caret returns. */
|
|
911
|
+
body:has(.dock-panel:focus-within) .code-cursor,
|
|
844
912
|
body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
845
913
|
.mc-kind {
|
|
846
914
|
font-weight: 700; font-size: 10px; letter-spacing: 0.05em; text-transform: uppercase;
|
|
847
|
-
padding: 2px 8px; border-radius:
|
|
915
|
+
padding: 2px 8px; border-radius: 0;
|
|
848
916
|
color: var(--muted); background: color-mix(in srgb, var(--muted) 16%, transparent);
|
|
849
917
|
}
|
|
850
918
|
.mc-card.mc-q .mc-kind { color: var(--token-number); background: color-mix(in srgb, var(--token-number) 18%, transparent); }
|
|
851
919
|
.mc-card.mc-c .mc-kind { color: var(--token-tag); background: color-mix(in srgb, var(--token-tag) 18%, transparent); }
|
|
852
|
-
.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:
|
|
920
|
+
.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: 0; }
|
|
853
921
|
.mc-del:hover { color: var(--del-strong); background: color-mix(in srgb, var(--del-strong) 16%, transparent); }
|
|
854
922
|
.mc-card-body { padding: 2px 12px 11px; color: var(--text); white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
855
923
|
.mc-input {
|
|
856
924
|
display: block; box-sizing: border-box; resize: vertical;
|
|
857
925
|
margin: 0 10px 10px; width: calc(100% - 20px); min-height: 60px;
|
|
858
926
|
background: var(--bg); color: var(--text);
|
|
859
|
-
|
|
927
|
+
/* The composer is injected INSIDE #diff2html-container, which sets caret-color: transparent (the file
|
|
928
|
+
view uses a fake .code-cursor). caret-color inherits, so restore it here — a focused textarea must show
|
|
929
|
+
its real caret. The single-caret rule hides the FILE caret while composing, not the textarea's own. */
|
|
930
|
+
caret-color: var(--text);
|
|
931
|
+
border: 1px solid var(--border); border-radius: 0; padding: 9px 11px;
|
|
860
932
|
font: 12px/1.55 Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
861
933
|
transition: border-color 120ms ease, box-shadow 120ms ease;
|
|
862
934
|
}
|
|
863
935
|
.mc-input:focus { outline: none; border-color: var(--active); box-shadow: 0 0 0 3px color-mix(in srgb, var(--active) 22%, transparent); }
|
|
864
936
|
.mc-actions { display: flex; align-items: center; gap: 8px; padding: 0 10px 9px; }
|
|
865
|
-
.mc-btn { background: var(--active); color: #fff; border: 0; border-radius:
|
|
937
|
+
.mc-btn { background: var(--active); color: #fff; border: 0; border-radius: 0; padding: 5px 12px; font-size: 12px; cursor: pointer; }
|
|
866
938
|
.mc-btn:hover { filter: brightness(1.1); }
|
|
867
939
|
.mc-btn.mc-ghost { background: transparent; border: 1px solid var(--border); color: var(--text); }
|
|
868
940
|
/* Terminal-send buttons in the merged modal: green to read as "send to the live session", with a clear
|
|
@@ -872,24 +944,59 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
872
944
|
.mc-hint { color: var(--muted); font-size: 11px; }
|
|
873
945
|
.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); }
|
|
874
946
|
.mc-modal.hidden { display: none; }
|
|
875
|
-
.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:
|
|
947
|
+
.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: 0; background: var(--panel); overflow: hidden; }
|
|
876
948
|
.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; }
|
|
877
949
|
.mc-modal-head span { margin-right: auto; }
|
|
878
950
|
.mc-modal-text { width: 100%; height: 100%; box-sizing: border-box; resize: none; border: 0; padding: 12px; background: var(--bg); color: var(--text); caret-color: var(--text); font: 12px/1.55 Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
|
|
879
951
|
.mc-modal-text:focus { outline: none; }
|
|
880
|
-
.mc-dropdown { position: fixed; z-index: 70; min-width: 0; background: var(--panel); border: 1px solid var(--border); border-radius:
|
|
881
|
-
.mc-dropdown-item { display: block; width: 100%; text-align: left; padding: 4px 10px; border: 0; background: transparent; color: var(--text); border-radius:
|
|
952
|
+
.mc-dropdown { position: fixed; z-index: 70; min-width: 0; background: var(--panel); border: 1px solid var(--border); border-radius: 0; box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4); padding: 3px; }
|
|
953
|
+
.mc-dropdown-item { display: block; width: 100%; text-align: left; padding: 4px 10px; border: 0; background: transparent; color: var(--text); border-radius: 0; font-size: 12px; line-height: 1.5; cursor: pointer; white-space: nowrap; }
|
|
882
954
|
.mc-dropdown-item.active, .mc-dropdown-item:hover { background: var(--active); color: #fff; }
|
|
883
955
|
#mc-toasts { position: fixed; left: 16px; bottom: 16px; z-index: 80; display: flex; flex-direction: column; gap: 8px; max-width: 360px; pointer-events: none; }
|
|
884
|
-
.mc-toast { background: var(--panel); color: var(--text); border: 1px solid var(--border); border-left: 3px solid var(--active); border-radius:
|
|
956
|
+
.mc-toast { background: var(--panel); color: var(--text); border: 1px solid var(--border); border-left: 3px solid var(--active); border-radius: 0; padding: 10px 14px; font-size: 13px; line-height: 1.45; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); opacity: 0; transform: translateY(8px); transition: opacity .25s ease, transform .25s ease; }
|
|
885
957
|
.mc-toast.show { opacity: 1; transform: translateY(0); }
|
|
886
958
|
.mc-toast.hide { opacity: 0; transform: translateY(8px); }
|
|
959
|
+
/* Inline hint anchored just under the diff caret (F7 "last change" boundary announcement); fades on its own. */
|
|
960
|
+
.mc-caret-hint { position: fixed; z-index: 75; max-width: 460px; background: var(--panel); color: var(--text); border: 1px solid var(--border); border-left: 3px solid var(--active); border-radius: 0; padding: 5px 10px; font-size: 12px; line-height: 1.4; box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4); opacity: 0; transform: translateY(-4px); pointer-events: none; transition: opacity .16s ease, transform .16s ease; }
|
|
961
|
+
.mc-caret-hint.show { opacity: 1; transform: translateY(0); }
|
|
887
962
|
/* Prompt memo: split editor | live Markdown preview inside the standard modal shell. */
|
|
888
963
|
.mc-memo-body { display: grid; grid-template-columns: 1fr 1fr; min-height: 0; height: 100%; }
|
|
889
964
|
.mc-memo-edit { height: 100%; border-right: 1px solid var(--border); }
|
|
890
965
|
.mc-memo-preview { height: 100%; overflow: auto; padding: 12px 16px; background: var(--panel); color: var(--text); }
|
|
891
966
|
.mc-memo-preview > :first-child { margin-top: 0; }
|
|
892
967
|
.mc-memo-empty { color: var(--muted); font-size: 12px; font-style: italic; }
|
|
968
|
+
|
|
969
|
+
/* ===== Merged-prompt & memo: a large FLOATING overlay (~90% of the window), sharing ONE slot with the
|
|
970
|
+
terminal (opening one closes the others). Cmd/Ctrl+Shift+' maximizes the active panel to full screen. =====
|
|
971
|
+
(These used to dock below the editor; they now float so a big writing surface doesn't shrink the diff.) */
|
|
972
|
+
.dock-panel {
|
|
973
|
+
position: fixed; inset: 5vh 5vw; z-index: 60; min-height: 0; /* ~90vw x 90vh, centered */
|
|
974
|
+
display: flex; flex-direction: column; background: var(--panel);
|
|
975
|
+
border: 1px solid var(--border); border-radius: 12px;
|
|
976
|
+
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.55);
|
|
977
|
+
overflow: hidden;
|
|
978
|
+
}
|
|
979
|
+
/* Dim the editor behind the floating panel; clicking it closes (handler wired in mountDock). */
|
|
980
|
+
.dock-backdrop { position: fixed; inset: 0; z-index: 59; background: color-mix(in srgb, #000 40%, transparent); }
|
|
981
|
+
.dock-resizer { display: none; } /* a centered ~90% floating panel has no bottom edge to drag */
|
|
982
|
+
.dock-bar {
|
|
983
|
+
flex: none; display: flex; align-items: center; gap: 8px; padding: 6px 10px;
|
|
984
|
+
background: var(--sidebar); border-bottom: 1px solid var(--border);
|
|
985
|
+
color: var(--text); font-weight: 650; font-size: 12px;
|
|
986
|
+
}
|
|
987
|
+
.dock-title { margin-right: auto; letter-spacing: 0.02em; }
|
|
988
|
+
.dock-btn { border: 0; background: transparent; color: var(--muted); cursor: pointer; padding: 2px 7px; border-radius: 0; font: inherit; font-weight: 500; }
|
|
989
|
+
.dock-btn:hover { color: var(--text); background: color-mix(in srgb, var(--muted) 22%, transparent); }
|
|
990
|
+
.dock-max { font-size: 14px; line-height: 1; }
|
|
991
|
+
.dock-body { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
|
|
992
|
+
.dock-body > .mc-modal-text { flex: 1 1 auto; height: auto; }
|
|
993
|
+
.dock-body > .mc-memo-body { flex: 1 1 auto; height: auto; }
|
|
994
|
+
/* Maximize. The floating merged/memo panel fills the whole viewport. The terminal is still a grid dock, so
|
|
995
|
+
its maximize hides the editor area (next rule) — but the floating panels do NOT hide content (their overlay
|
|
996
|
+
already covers it, and hiding the diff would force an expensive reflow on every maximize toggle). */
|
|
997
|
+
body.dock-maximized .dock-panel { inset: 0; border-radius: 0; }
|
|
998
|
+
body.dock-maximized:not(.floating-dock) .content { display: none; }
|
|
999
|
+
body.dock-maximized .terminal-panel:not(.hidden) { grid-row: 1 / 3; height: auto; }
|
|
893
1000
|
.tok-comment { color: var(--token-comment); font-style: italic; }
|
|
894
1001
|
.tok-keyword { color: var(--token-keyword); font-weight: 650; }
|
|
895
1002
|
.tok-string { color: var(--token-string); }
|
|
@@ -908,13 +1015,16 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
908
1015
|
padding-top: min(12vh, 96px);
|
|
909
1016
|
background: color-mix(in srgb, #000 24%, transparent);
|
|
910
1017
|
}
|
|
1018
|
+
/* Usages popup anchored under the caret: drop the dim backdrop and centering; JS sets panel left/top. */
|
|
1019
|
+
.quick-open.anchored { display: block; padding: 0; background: transparent; }
|
|
1020
|
+
.quick-open.anchored .quick-open-panel { position: absolute; max-height: none; }
|
|
911
1021
|
.quick-open-panel {
|
|
912
1022
|
width: min(720px, calc(100vw - 32px));
|
|
913
1023
|
max-height: min(680px, calc(100vh - 64px));
|
|
914
1024
|
display: grid;
|
|
915
1025
|
grid-template-rows: auto auto minmax(0, 1fr);
|
|
916
1026
|
border: 1px solid var(--border);
|
|
917
|
-
border-radius:
|
|
1027
|
+
border-radius: 0;
|
|
918
1028
|
background: var(--panel);
|
|
919
1029
|
box-shadow: 0 18px 60px rgba(0, 0, 0, 0.28);
|
|
920
1030
|
overflow: hidden;
|
|
@@ -929,6 +1039,13 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
929
1039
|
font-size: 12px;
|
|
930
1040
|
}
|
|
931
1041
|
.quick-open-hint { font-family: Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
|
|
1042
|
+
/* Recent files: no search box — typed letters filter the list (speed search). */
|
|
1043
|
+
.quick-open.quick-recent #quick-open-input { display: none; }
|
|
1044
|
+
.quick-open-filter { font-size: 12px; }
|
|
1045
|
+
.quick-open-filter.is-hint { color: var(--muted); opacity: 0.7; font-style: italic; }
|
|
1046
|
+
.quick-open-filter.has-filter { color: var(--active); font-family: Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
|
|
1047
|
+
.quick-open-filter.has-filter::after { content: "\258F"; opacity: 0.7; animation: mc-caret-blink 1.1s steps(1) infinite; }
|
|
1048
|
+
@keyframes mc-caret-blink { 50% { opacity: 0; } }
|
|
932
1049
|
#quick-open-input {
|
|
933
1050
|
width: 100%;
|
|
934
1051
|
border: 0;
|
|
@@ -940,7 +1057,9 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
940
1057
|
font: 15px Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
941
1058
|
}
|
|
942
1059
|
.quick-open-results { overflow: auto; padding: 6px; max-height: 232px; }
|
|
943
|
-
|
|
1060
|
+
/* Compound selector beats the later `.quick-open-item { display: grid }` (equal specificity, source order)
|
|
1061
|
+
that would otherwise drop the loc/code columns onto each other. */
|
|
1062
|
+
.quick-open-item.usage-item { display: flex; align-items: baseline; gap: 10px; }
|
|
944
1063
|
.usage-loc { flex: none; color: var(--active); font-variant-numeric: tabular-nums; white-space: nowrap; font-size: 12px; }
|
|
945
1064
|
.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; }
|
|
946
1065
|
.quick-open-main { min-width: 0; display: flex; align-items: baseline; gap: 8px; }
|
|
@@ -972,7 +1091,7 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
972
1091
|
width: 100%;
|
|
973
1092
|
min-height: 24px;
|
|
974
1093
|
border: 1px solid transparent;
|
|
975
|
-
border-radius:
|
|
1094
|
+
border-radius: 0;
|
|
976
1095
|
padding: 2px 8px;
|
|
977
1096
|
background: transparent;
|
|
978
1097
|
color: var(--text);
|
|
@@ -1000,10 +1119,17 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1000
1119
|
.quick-open-badge { align-self: center; color: var(--muted); font-size: 12px; }
|
|
1001
1120
|
.quick-open-empty { padding: 28px 14px; color: var(--muted); font-size: 13px; }
|
|
1002
1121
|
@media (max-width: 900px) {
|
|
1003
|
-
body { grid-template-columns: 1fr; grid-template-rows: auto minmax(0, 1fr) auto; }
|
|
1004
|
-
|
|
1005
|
-
.
|
|
1006
|
-
.
|
|
1122
|
+
body { grid-template-columns: 1fr; grid-template-rows: auto auto minmax(0, 1fr) auto; }
|
|
1123
|
+
/* Rail becomes a horizontal strip at the top; tooltips drop below the icon. */
|
|
1124
|
+
.activity-rail { grid-row: 1; grid-column: 1; width: auto; height: auto; flex-direction: row; padding: 4px 8px; border-right: 0; border-bottom: 1px solid var(--border); }
|
|
1125
|
+
.activity-rail .rail-group { flex-direction: row; }
|
|
1126
|
+
.activity-rail .rail-bottom { margin-left: auto; margin-top: 0; }
|
|
1127
|
+
.rail-tip { left: 50%; top: calc(100% + 8px); transform: translateX(-50%); }
|
|
1128
|
+
.rail-btn.is-active::before { left: 5px; right: 5px; top: auto; bottom: -4px; width: auto; height: 2px; }
|
|
1129
|
+
.sidebar { grid-row: 2; grid-column: 1; height: auto; border-right: 0; border-bottom: 1px solid var(--border); }
|
|
1130
|
+
.content { grid-row: 3; grid-column: 1; padding: 16px; }
|
|
1131
|
+
.terminal-panel { grid-column: 1; grid-row: 4; }
|
|
1132
|
+
.dock-panel { grid-column: 1; grid-row: 4; }
|
|
1007
1133
|
.toolbar { margin: -16px -16px 16px; padding: 12px 16px; }
|
|
1008
1134
|
.d2h-files-diff { grid-template-columns: 1fr; }
|
|
1009
1135
|
.d2h-file-side-diff:first-child { border-right: 0; border-bottom: 1px solid var(--border); }
|
|
@@ -1013,7 +1139,7 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1013
1139
|
background: var(--panel);
|
|
1014
1140
|
color: var(--fg);
|
|
1015
1141
|
border: 1px solid var(--border);
|
|
1016
|
-
border-radius:
|
|
1142
|
+
border-radius: 0;
|
|
1017
1143
|
padding: 3px 8px;
|
|
1018
1144
|
font-size: 12px;
|
|
1019
1145
|
}
|
|
@@ -1027,7 +1153,7 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1027
1153
|
margin-right: 4px;
|
|
1028
1154
|
padding: 0;
|
|
1029
1155
|
border: 0;
|
|
1030
|
-
border-radius:
|
|
1156
|
+
border-radius: 0;
|
|
1031
1157
|
background: transparent;
|
|
1032
1158
|
color: #59a869;
|
|
1033
1159
|
font-size: 10px;
|
|
@@ -1039,14 +1165,14 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1039
1165
|
.http-request-line .source-code { font-weight: 600; }
|
|
1040
1166
|
.http-method { color: var(--token-keyword); font-weight: 700; }
|
|
1041
1167
|
.http-sep { color: var(--muted); }
|
|
1042
|
-
.http-var { border-radius:
|
|
1168
|
+
.http-var { border-radius: 0; padding: 0 1px; }
|
|
1043
1169
|
.http-var.known { color: var(--token-string); background: color-mix(in srgb, var(--token-string) 15%, transparent); }
|
|
1044
1170
|
.http-var.unknown { color: #e06c75; background: color-mix(in srgb, #e06c75 16%, transparent); text-decoration: underline dotted; }
|
|
1045
1171
|
.http-response-row td { padding: 0 14px 0 0; border: 0; background: transparent; }
|
|
1046
1172
|
.http-response {
|
|
1047
1173
|
margin: 6px 0 12px;
|
|
1048
1174
|
border: 1px solid var(--border);
|
|
1049
|
-
border-radius:
|
|
1175
|
+
border-radius: 0;
|
|
1050
1176
|
background: color-mix(in srgb, var(--active) 5%, var(--panel));
|
|
1051
1177
|
overflow: hidden;
|
|
1052
1178
|
font-size: 12px;
|
|
@@ -1069,7 +1195,7 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1069
1195
|
margin-left: auto;
|
|
1070
1196
|
background: transparent;
|
|
1071
1197
|
border: 1px solid var(--border);
|
|
1072
|
-
border-radius:
|
|
1198
|
+
border-radius: 0;
|
|
1073
1199
|
color: var(--fg);
|
|
1074
1200
|
padding: 2px 8px;
|
|
1075
1201
|
font-size: 11px;
|
|
@@ -1108,7 +1234,7 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1108
1234
|
max-height: calc(100vh - 230px);
|
|
1109
1235
|
object-fit: contain;
|
|
1110
1236
|
border: 1px solid var(--border);
|
|
1111
|
-
border-radius:
|
|
1237
|
+
border-radius: 0;
|
|
1112
1238
|
background: repeating-conic-gradient(#3a3a3a 0% 25%, #2f2f2f 0% 50%) 50% / 20px 20px;
|
|
1113
1239
|
cursor: zoom-in;
|
|
1114
1240
|
}
|
|
@@ -1149,16 +1275,16 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1149
1275
|
.md-cell del { color: var(--muted); }
|
|
1150
1276
|
.md-cell code {
|
|
1151
1277
|
font: 0.86em Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
1152
|
-
background: var(--line); border: 1px solid var(--border); border-radius:
|
|
1278
|
+
background: var(--line); border: 1px solid var(--border); border-radius: 0; padding: 0.1em 0.4em;
|
|
1153
1279
|
}
|
|
1154
|
-
.md-code { background: var(--panel); border: 1px solid var(--border); border-radius:
|
|
1280
|
+
.md-code { background: var(--panel); border: 1px solid var(--border); border-radius: 0; padding: 10px 12px; overflow: auto; margin: 0.3em 0; }
|
|
1155
1281
|
.md-code code { font: 12px/1.5 Monaco, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; background: none; border: 0; padding: 0; white-space: pre; }
|
|
1156
1282
|
.md-quote { margin: 0.3em 0; padding: 2px 14px; color: var(--muted); border-left: 3px solid var(--border); }
|
|
1157
1283
|
.md-quote p { margin: 0.3em 0; }
|
|
1158
1284
|
.md-list { margin: 0.2em 0; padding-left: 1.5em; }
|
|
1159
1285
|
.md-list li { margin: 0.15em 0; }
|
|
1160
1286
|
.md-hr { border: 0; border-top: 1px solid var(--border); margin: 0.5em 0; }
|
|
1161
|
-
.md-img { max-width: 100%; border-radius:
|
|
1287
|
+
.md-img { max-width: 100%; border-radius: 0; }
|
|
1162
1288
|
/* Embedded raw HTML in Markdown (README <div>/<img>/<table>/…). Minimal styling so it reads sanely. */
|
|
1163
1289
|
.md-html { overflow-x: auto; }
|
|
1164
1290
|
.md-html img { max-width: 100%; height: auto; }
|
|
@@ -1181,15 +1307,14 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1181
1307
|
/* --- Integrated terminal panel (Electron only): fixed to the content column's bottom, height-resizable.
|
|
1182
1308
|
The active border-top marks it as the merged-prompt send target ("highlighted while it's open"). --- */
|
|
1183
1309
|
.terminal-panel {
|
|
1184
|
-
grid-column:
|
|
1310
|
+
grid-column: 3;
|
|
1185
1311
|
grid-row: 2;
|
|
1186
1312
|
min-height: 0;
|
|
1187
1313
|
height: var(--terminal-height, 320px);
|
|
1188
1314
|
display: flex;
|
|
1189
1315
|
flex-direction: column;
|
|
1190
1316
|
background: var(--bg);
|
|
1191
|
-
border-top:
|
|
1192
|
-
box-shadow: 0 -10px 28px rgba(0, 0, 0, 0.45);
|
|
1317
|
+
border-top: 1px solid var(--border);
|
|
1193
1318
|
}
|
|
1194
1319
|
.terminal-resizer { flex: none; height: 6px; margin-top: -3px; cursor: row-resize; }
|
|
1195
1320
|
.terminal-resizer:hover, .terminal-resizer.resizing { background: var(--active); }
|
|
@@ -1213,7 +1338,12 @@ body:has(#settings-modal:not(.hidden)) .code-cursor { display: none; }
|
|
|
1213
1338
|
.terminal-pane-label:hover { color: var(--text); }
|
|
1214
1339
|
.terminal-pane-label[contenteditable="true"] { color: var(--text); background: var(--bg); outline: none; }
|
|
1215
1340
|
.terminal-pane.is-active .terminal-pane-label { color: var(--text); }
|
|
1216
|
-
.terminal-pane-host { flex: 1 1 auto; min-width: 0; min-height: 0; padding: 4px
|
|
1341
|
+
.terminal-pane-host { flex: 1 1 auto; min-width: 0; min-height: 0; padding: 4px 8px; } /* right padding too, so xterm's last column isn't clipped against the pane edge */
|
|
1342
|
+
/* Bell badge: a small dot on a pane's label when its TUI rang the bell while you were looking elsewhere. */
|
|
1343
|
+
.terminal-pane-label.has-bell::after { content: "\25CF"; margin-left: 6px; color: var(--active); font-size: 9px; vertical-align: middle; }
|
|
1344
|
+
/* Settings on/off row (terminal-bell notification toggle). */
|
|
1345
|
+
.settings-check { display: flex; align-items: center; gap: 8px; margin-top: 12px; color: var(--text); font-size: 13px; cursor: pointer; }
|
|
1346
|
+
.settings-check input { accent-color: var(--active); margin: 0; }
|
|
1217
1347
|
/* No border on the active pane — the inactive panes dim back instead, so the focused one stands out
|
|
1218
1348
|
cleanly without an outline. Only applies with 2+ panes (a lone pane is never dimmed; see setActive). */
|
|
1219
1349
|
.terminal-pane { transition: opacity 120ms ease; }
|