micro-models-agent 2.10.0 → 2.11.0
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/CHANGELOG.md +23 -0
- package/dist/assets/app.js +22 -4
- package/dist/assets/index.html +29 -0
- package/dist/assets/js/dom.js +2 -1
- package/dist/assets/js/feed.js +38 -26
- package/dist/assets/js/format.js +1 -1
- package/dist/assets/js/rail.js +114 -0
- package/dist/assets/js/settings-controls.js +2 -2
- package/dist/assets/js/settings.js +246 -51
- package/dist/assets/js/store.js +3 -0
- package/dist/assets/js/tabs.js +83 -0
- package/dist/assets/styles.css +215 -66
- package/dist/i18n/en.json +106 -21
- package/dist/i18n/ru.json +109 -21
- package/dist/main.js +24185 -22573
- package/package.json +1 -1
package/dist/assets/styles.css
CHANGED
|
@@ -1,65 +1,64 @@
|
|
|
1
1
|
/* ---- theme tokens (dark default; light override further below) ---- */
|
|
2
2
|
:root {
|
|
3
|
-
--bg: #
|
|
3
|
+
--bg: #141414;
|
|
4
4
|
--fg: #e6edf3;
|
|
5
|
-
--panel: #
|
|
6
|
-
--sb-bg: #
|
|
7
|
-
--stab-bg: #
|
|
8
|
-
--
|
|
9
|
-
--surface: #
|
|
10
|
-
--
|
|
11
|
-
--inp-
|
|
12
|
-
--inp-
|
|
13
|
-
--
|
|
14
|
-
--
|
|
15
|
-
--border: #
|
|
16
|
-
--border-
|
|
17
|
-
--
|
|
18
|
-
--
|
|
19
|
-
--dim-
|
|
20
|
-
--dim-
|
|
21
|
-
--
|
|
22
|
-
--accent: #
|
|
23
|
-
--
|
|
24
|
-
--green: #
|
|
25
|
-
--
|
|
26
|
-
--
|
|
27
|
-
--
|
|
28
|
-
--
|
|
29
|
-
--
|
|
30
|
-
--
|
|
31
|
-
--
|
|
32
|
-
--
|
|
33
|
-
--
|
|
34
|
-
--
|
|
35
|
-
--
|
|
36
|
-
--hover-bg: #
|
|
37
|
-
--hover-bg
|
|
38
|
-
--
|
|
39
|
-
--u-
|
|
40
|
-
--u-
|
|
41
|
-
--u-border: #388bfd;
|
|
5
|
+
--panel: #191919;
|
|
6
|
+
--sb-bg: #181818;
|
|
7
|
+
--stab-bg: #181818;
|
|
8
|
+
--surface: #1f1f1f;
|
|
9
|
+
--input-surface: #1f1f1f;
|
|
10
|
+
--inp-bg: #1d1d1d;
|
|
11
|
+
--inp-border: #c4a8ec44;
|
|
12
|
+
--inp-focus: #c4a8ec;
|
|
13
|
+
--input-shadow: #c4a8ec33;
|
|
14
|
+
--border: #262626;
|
|
15
|
+
--border-2: #2e2e2e;
|
|
16
|
+
--border-3: #262626;
|
|
17
|
+
--muted: #d4d4d4;
|
|
18
|
+
--dim-a: #a3a3a3;
|
|
19
|
+
--dim-b: #737373;
|
|
20
|
+
--dim-c: #737373;
|
|
21
|
+
--accent: #c4a8ec;
|
|
22
|
+
--accent-bg: #241e30;
|
|
23
|
+
--green: #c9c5bd;
|
|
24
|
+
--green-fill: #8a8781;
|
|
25
|
+
--red: #e08080;
|
|
26
|
+
--err: #e08080;
|
|
27
|
+
--red-strong: #e08080;
|
|
28
|
+
--yellow: #d9a45b;
|
|
29
|
+
--purple: #b8b0a6;
|
|
30
|
+
--cyan: #a8a29e;
|
|
31
|
+
--think: #9c9c9c;
|
|
32
|
+
--cmdout: #d4d4d4;
|
|
33
|
+
--meta: #a3a3a3;
|
|
34
|
+
--args: #a3a3a3;
|
|
35
|
+
--hover-bg: #262626;
|
|
36
|
+
--hover-bg-2: #222222;
|
|
37
|
+
--x-hover-bg: #2e2e2e;
|
|
38
|
+
--u-fg: #d3bdf2;
|
|
39
|
+
--u-bg: #221c2e;
|
|
40
|
+
--u-border: #c4a8ec;
|
|
42
41
|
--ans: #a5adb6;
|
|
43
|
-
--toggle-off: #
|
|
44
|
-
--toggle-knob: #
|
|
42
|
+
--toggle-off: #2e2e2e;
|
|
43
|
+
--toggle-knob: #a3a3a3;
|
|
45
44
|
--toggle-knob-on: #fff;
|
|
46
|
-
--scroll-thumb: #
|
|
47
|
-
--scroll-thumb-hover: #
|
|
48
|
-
--stab-thumb: #
|
|
49
|
-
--stab-thumb-hover: #
|
|
50
|
-
--pipe: #
|
|
51
|
-
--rule: #
|
|
52
|
-
--checker-a: #
|
|
53
|
-
--checker-b: #
|
|
54
|
-
--checker-base: #
|
|
55
|
-
--checker-border: #
|
|
45
|
+
--scroll-thumb: #2e2e2e;
|
|
46
|
+
--scroll-thumb-hover: #737373;
|
|
47
|
+
--stab-thumb: #2e2e2e;
|
|
48
|
+
--stab-thumb-hover: #737373;
|
|
49
|
+
--pipe: #2e2e2e;
|
|
50
|
+
--rule: #2e2e2e;
|
|
51
|
+
--checker-a: #222222;
|
|
52
|
+
--checker-b: #2e2e2e;
|
|
53
|
+
--checker-base: #191919;
|
|
54
|
+
--checker-border: #2e2e2e;
|
|
56
55
|
--ph-light: #eaeef2;
|
|
57
|
-
--track: #
|
|
58
|
-
--plan-line: #
|
|
59
|
-
--plan-bar-fg: #
|
|
60
|
-
--sec-h: #
|
|
61
|
-
--sec-h-hover: #
|
|
62
|
-
--stab-fg: #
|
|
56
|
+
--track: #262626;
|
|
57
|
+
--plan-line: #2e2e2e;
|
|
58
|
+
--plan-bar-fg: #a3a3a3;
|
|
59
|
+
--sec-h: #a3a3a3;
|
|
60
|
+
--sec-h-hover: #d4d4d4;
|
|
61
|
+
--stab-fg: #a3a3a3;
|
|
63
62
|
--overlay: rgba(0,0,0,.55);
|
|
64
63
|
--shadow-menu: 0 8px 24px rgba(0,0,0,.5);
|
|
65
64
|
--shadow-dd: 0 12px 32px rgba(0,0,0,.55);
|
|
@@ -76,7 +75,6 @@ body.light {
|
|
|
76
75
|
--panel: #ffffff;
|
|
77
76
|
--sb-bg: #ffffff;
|
|
78
77
|
--stab-bg: #f6f8fa;
|
|
79
|
-
--stab-on-bg: #ffffff;
|
|
80
78
|
--surface: #f6f8fa;
|
|
81
79
|
--input-surface: #ffffff;
|
|
82
80
|
--inp-bg: #ffffff;
|
|
@@ -142,8 +140,12 @@ html, body { height: 100%; }
|
|
|
142
140
|
body {
|
|
143
141
|
background: var(--bg); color: var(--fg);
|
|
144
142
|
font-family: ui-monospace, "Cascadia Code", "JetBrains Mono", Consolas, monospace;
|
|
145
|
-
font-size:
|
|
143
|
+
font-size: 15px; display: flex; flex-direction: column; overflow: hidden;
|
|
146
144
|
}
|
|
145
|
+
/* Chat font size (`ui.fontSize`): the base above is `comfortable` (default).
|
|
146
|
+
`compact` restores the old 13px, `large` steps up to 17px. */
|
|
147
|
+
body[data-font="compact"] { font-size: 13px; }
|
|
148
|
+
body[data-font="large"] { font-size: 17px; }
|
|
147
149
|
|
|
148
150
|
/* ---- topbar: new chat, sessions dropdown, tabstrip, settings ---- */
|
|
149
151
|
.bar-top {
|
|
@@ -157,6 +159,11 @@ body {
|
|
|
157
159
|
}
|
|
158
160
|
.icon-btn:hover { background: var(--hover-bg); color: var(--fg); }
|
|
159
161
|
.icon-btn.primary { color: var(--accent); }
|
|
162
|
+
.icon-btn:disabled { opacity: .35; cursor: default; }
|
|
163
|
+
.icon-btn:disabled:hover { background: none; color: var(--muted); }
|
|
164
|
+
/* Mobile session sub-header (see #sessBar): hidden on desktop, flex ≤760px.
|
|
165
|
+
The + / list tools relocate into #sessTools (placeTopTools in tabs.js). */
|
|
166
|
+
.bar-sub { display: none; }
|
|
160
167
|
#openSettings { margin-left: auto; margin-right: 6px; }
|
|
161
168
|
#toggleSidebar { display: none; }
|
|
162
169
|
.conn { color: var(--dim-a); font-size: 11.5px; white-space: nowrap; }
|
|
@@ -172,12 +179,12 @@ body {
|
|
|
172
179
|
.tabstrip::-webkit-scrollbar-thumb:hover { background: var(--stab-thumb-hover); }
|
|
173
180
|
.stab {
|
|
174
181
|
display: flex; gap: 7px; align-items: center; white-space: nowrap;
|
|
175
|
-
height: 24px; padding: 0 6px 0 10px; border-radius:
|
|
182
|
+
height: 24px; padding: 0 6px 0 10px; border-radius: 7px; cursor: pointer;
|
|
176
183
|
color: var(--stab-fg); font-size: 12.5px; background: var(--stab-bg);
|
|
177
|
-
border: 1px solid transparent;
|
|
184
|
+
border: 1px solid transparent; max-width: 220px;
|
|
178
185
|
}
|
|
179
186
|
.stab:hover { color: var(--fg); }
|
|
180
|
-
.stab.on { background: var(--
|
|
187
|
+
.stab.on { background: var(--accent-bg); color: var(--accent); border-color: transparent; }
|
|
181
188
|
.stab .name { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
182
189
|
.stab .stab-x {
|
|
183
190
|
flex: 0 0 auto; width: 18px; height: 18px; padding: 0; justify-content: center;
|
|
@@ -392,6 +399,9 @@ body.light .imgcard .ph { background: var(--ph-light); }
|
|
|
392
399
|
}
|
|
393
400
|
.filecard .fc-open:hover { border-color: var(--accent); text-decoration: none; }
|
|
394
401
|
.filecard .fc-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
402
|
+
.filecard button.fc-open { font: inherit; }
|
|
403
|
+
.filecard .fc-actions { display: flex; gap: 6px; align-items: center; margin-left: auto; flex: 0 0 auto; }
|
|
404
|
+
.filecard .fc-hint { color: var(--dim-a); font-size: 12px; }
|
|
395
405
|
.linkline { margin-left: 26px; min-width: 0; overflow-wrap: anywhere; }
|
|
396
406
|
.linkline a { color: var(--accent); text-decoration: none; overflow-wrap: anywhere; word-break: break-word; }
|
|
397
407
|
.linkline a:hover { text-decoration: underline; }
|
|
@@ -444,16 +454,25 @@ body.light .imgcard .ph { background: var(--ph-light); }
|
|
|
444
454
|
|
|
445
455
|
/* ---- composer: selectors, attachments, input, autocomplete ---- */
|
|
446
456
|
.input-area { margin: 14px 22px 16px; position: relative; }
|
|
447
|
-
.selectors { display: flex; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
|
|
448
|
-
.sel { position: relative; }
|
|
457
|
+
.selectors { display: flex; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; min-width: 0; }
|
|
458
|
+
.sel { position: relative; min-width: 0; max-width: 100%; }
|
|
449
459
|
.sel > button {
|
|
450
460
|
font: inherit; font-size: 12.5px; cursor: pointer;
|
|
451
461
|
background: var(--surface); color: var(--muted); border: none; border-radius: 4px;
|
|
452
462
|
padding: 4px 10px; display: inline-flex; align-items: center; gap: 6px;
|
|
463
|
+
min-width: 0; max-width: 100%;
|
|
453
464
|
}
|
|
454
465
|
body.light .sel > button { border: 1px solid var(--border); }
|
|
455
|
-
.sel > button b { font-weight: 400; color: var(--purple); }
|
|
466
|
+
.sel > button b { font-weight: 400; color: var(--purple); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
|
|
456
467
|
.sel > button .svg-icon { width: 13px; height: 13px; color: var(--dim-a); }
|
|
468
|
+
/* Selector switch pending (boot + provider/model/context/reasoning writes):
|
|
469
|
+
buttons and menus go inert while the `⋯` mark shows. The mark is a static
|
|
470
|
+
glyph via `::after` — no animation, so `prefers-reduced-motion` needs no
|
|
471
|
+
special case and no label rewrites desync the DOM. */
|
|
472
|
+
.selectors[data-pending] .sel > button,
|
|
473
|
+
.selectors[data-pending] .menu { pointer-events: none; }
|
|
474
|
+
.sel > button.pending { cursor: wait; }
|
|
475
|
+
.sel > button.pending b::after { content: " ⋯"; color: var(--dim-b); }
|
|
457
476
|
.menu {
|
|
458
477
|
display: none; position: absolute; bottom: calc(100% + 4px); left: 0; z-index: 30;
|
|
459
478
|
background: var(--panel); border: 1px solid var(--border-2); border-radius: 6px;
|
|
@@ -571,9 +590,79 @@ body.light .sel > button { border: 1px solid var(--border); }
|
|
|
571
590
|
.input-area.dragover .composer { border-color: var(--accent); box-shadow: 0 0 0 2px var(--input-shadow); }
|
|
572
591
|
@keyframes blink { 50% { opacity: 0; } }
|
|
573
592
|
|
|
593
|
+
/* ---- activity rail — indicator above the composer while a turn runs ----
|
|
594
|
+
Reproduces docs/design/ui/demo-activity-rail-chat.html (variant №12).
|
|
595
|
+
`l-line` (default) = compact one-liner, `l-meta` = inside the hint row,
|
|
596
|
+
`l-full` = full width; `off` hides the node entirely. */
|
|
597
|
+
.rail-wrap { display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
|
|
598
|
+
.rail-wrap[hidden] { display: none; }
|
|
599
|
+
.rail-wrap.l-line, .rail-wrap.l-meta {
|
|
600
|
+
flex-direction: row; align-items: center; gap: 6px 10px; margin-bottom: 8px;
|
|
601
|
+
flex-wrap: wrap;
|
|
602
|
+
}
|
|
603
|
+
.rail-wrap.l-line .rl-track { order: -1; flex: 1 1 120px; min-width: 80px; max-width: 180px; }
|
|
604
|
+
.rail-wrap.l-meta .rl-track { order: -1; flex: 1 1 90px; min-width: 64px; max-width: 110px; }
|
|
605
|
+
.rail-wrap.l-line .rail-l1, .rail-wrap.l-line .rail-l2 { flex: 1 1 auto; min-width: 0; }
|
|
606
|
+
.rail-wrap.l-line .rail-l1 .right { display: none; } /* Esc уже есть в .inp-meta */
|
|
607
|
+
.rail-wrap.l-line .rail-l2::before { content: '·'; color: var(--dim-a); margin-right: -2px; }
|
|
608
|
+
.rail-wrap.l-meta { margin-bottom: 0; }
|
|
609
|
+
.rail-wrap.l-meta .rail-l1 { font-size: 11.5px; }
|
|
610
|
+
.rail-wrap.l-meta .rail-l1 .st, .rail-wrap.l-meta .rail-l1 .s, .rail-wrap.l-meta .rail-l1 .right { display: none; }
|
|
611
|
+
.rail-wrap.l-meta .rail-l2 { display: none; } /* в строке подсказок только самое важное */
|
|
612
|
+
.rail-wrap.l-full .rl-track { flex: 1 1 auto; }
|
|
613
|
+
.rail-l1 {
|
|
614
|
+
display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap;
|
|
615
|
+
font-size: 13px; color: var(--think);
|
|
616
|
+
}
|
|
617
|
+
.rail-l1 .s, .rail-l1 .right { color: var(--dim-a); }
|
|
618
|
+
.rail-l1 .right { margin-left: auto; font-size: 11.5px; }
|
|
619
|
+
.rail-l2 { display: flex; gap: 8px; align-items: baseline; font-size: 11.5px; color: var(--dim-a); flex-wrap: wrap; min-width: 0; }
|
|
620
|
+
.rail-l2 .last { color: var(--args); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
|
|
621
|
+
|
|
622
|
+
.rl-track {
|
|
623
|
+
position: relative; height: 12px; border-radius: 6px;
|
|
624
|
+
background: var(--border); overflow: hidden;
|
|
625
|
+
}
|
|
626
|
+
.rl-fill {
|
|
627
|
+
position: absolute; left: 0; top: 0; bottom: 0; width: calc(var(--prog, 0) * 1%);
|
|
628
|
+
background: linear-gradient(90deg, var(--think), var(--accent));
|
|
629
|
+
transition: width .2s linear;
|
|
630
|
+
}
|
|
631
|
+
.rl-fill::after {
|
|
632
|
+
content: ''; position: absolute; inset: 0;
|
|
633
|
+
background: linear-gradient(90deg, transparent, rgba(255,255,255,.45), transparent);
|
|
634
|
+
transform: translateX(-100%); animation: rlSweep 1.5s linear infinite;
|
|
635
|
+
}
|
|
636
|
+
@keyframes rlSweep { to { transform: translateX(100%); } }
|
|
637
|
+
/* Засечки шагов плана — только в режиме plan */
|
|
638
|
+
.rl-track[data-mode="plan"]::after {
|
|
639
|
+
content: ''; position: absolute; inset: 0; pointer-events: none;
|
|
640
|
+
background: repeating-linear-gradient(90deg,
|
|
641
|
+
transparent 0, transparent calc(33.333% - 1.5px),
|
|
642
|
+
var(--bg) calc(33.333% - 1.5px), var(--bg) 33.333%);
|
|
643
|
+
}
|
|
644
|
+
/* indeterminate: бегущий сканер по всей длине */
|
|
645
|
+
.rl-track[data-mode="scan"] .rl-fill { display: none; }
|
|
646
|
+
.rl-scan {
|
|
647
|
+
display: none; position: absolute; top: 0; bottom: 0; width: 30%; left: -30%;
|
|
648
|
+
background: linear-gradient(90deg, transparent, var(--think) 40%, var(--accent) 72%, transparent);
|
|
649
|
+
}
|
|
650
|
+
.rl-track[data-mode="scan"] .rl-scan {
|
|
651
|
+
display: block; animation: rlScan 1.7s cubic-bezier(.4, .1, .6, .9) infinite;
|
|
652
|
+
}
|
|
653
|
+
@keyframes rlScan { to { left: 100%; } }
|
|
654
|
+
.rail-wrap.phase-tool .rl-track[data-mode="scan"] .rl-scan { animation-duration: 1s; }
|
|
655
|
+
.rail-wrap.phase-compose .rl-track[data-mode="scan"] .rl-scan { animation-duration: 1.3s; }
|
|
656
|
+
/* Вспышка на реальное событие (tool_start / tool_end / text / plan) */
|
|
657
|
+
.rl-track.flash {
|
|
658
|
+
box-shadow: 0 0 0 1px var(--accent), 0 0 14px rgba(196,168,236,.35);
|
|
659
|
+
animation: rlFlash .45s ease-out;
|
|
660
|
+
}
|
|
661
|
+
@keyframes rlFlash { 0% { filter: brightness(1.9); } 100% { filter: brightness(1); } }
|
|
662
|
+
|
|
574
663
|
/* ---- sidebar — plan / usage / environment sections ---- */
|
|
575
664
|
.sb {
|
|
576
|
-
width:
|
|
665
|
+
width: 340px; min-width: 340px; display: flex; flex-direction: column;
|
|
577
666
|
border-left: 1px solid var(--border); background: var(--sb-bg); min-height: 0;
|
|
578
667
|
}
|
|
579
668
|
.sec {
|
|
@@ -879,12 +968,30 @@ body.light .toggle { background: var(--toggle-off); }
|
|
|
879
968
|
background: var(--input-surface); border: 1px solid var(--border-2); border-radius: 4px;
|
|
880
969
|
color: var(--fg); font: inherit; font-size: 12.5px; padding: 6px 8px; width: 100%; min-width: 0;
|
|
881
970
|
}
|
|
971
|
+
/* base-URL field: the free-text input sits under the dropdown when "custom" */
|
|
972
|
+
.pform-base { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
|
|
882
973
|
/* preset row sits above the field grid — keep it off the fields */
|
|
883
974
|
.provider-body .pform > .pform-field { margin-bottom: 16px; }
|
|
884
975
|
.pform-adv { margin-top: 18px; }
|
|
885
976
|
.pform-adv summary { cursor: pointer; font-size: 11.5px; color: var(--dim-a); text-transform: uppercase; letter-spacing: .04em; }
|
|
886
977
|
.pform-adv .pform-grid { margin-top: 12px; }
|
|
887
978
|
|
|
979
|
+
/* titled groups inside "advanced" (retry numbers / cache flags) */
|
|
980
|
+
.pform-checks { display: flex; flex-direction: column; gap: 10px; margin-top: 16px; }
|
|
981
|
+
.pform-checks-title {
|
|
982
|
+
font-size: 11.5px; color: var(--dim-a); text-transform: uppercase; letter-spacing: .04em;
|
|
983
|
+
}
|
|
984
|
+
/* the group gap already separates the title from its grid */
|
|
985
|
+
.pform-checks .pform-grid { margin-top: 0; }
|
|
986
|
+
.pform-checks-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 6px 16px; }
|
|
987
|
+
.pform-check {
|
|
988
|
+
display: inline-flex; align-items: center; gap: 7px; min-width: 0;
|
|
989
|
+
font-size: 12.5px; color: var(--muted); cursor: pointer;
|
|
990
|
+
}
|
|
991
|
+
.pform-check input[type="checkbox"] { width: auto; flex: 0 0 auto; margin: 0; accent-color: var(--accent); }
|
|
992
|
+
.pform-check span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
993
|
+
.pform-check:hover { color: var(--fg); }
|
|
994
|
+
|
|
888
995
|
.sec-desc { color: var(--dim-a); font-size: 11.5px; line-height: 1.4; padding: 6px 0 0; max-width: 70ch; }
|
|
889
996
|
|
|
890
997
|
/* structured editors (tags / checkboxes / table) own the full row width */
|
|
@@ -1078,6 +1185,25 @@ button.toggle:disabled { opacity: .5; cursor: default; }
|
|
|
1078
1185
|
/* ---- responsive layout ---- */
|
|
1079
1186
|
@media (max-width: 760px) {
|
|
1080
1187
|
.bar-top { gap: 8px; padding: 8px 10px; }
|
|
1188
|
+
.bar-sub {
|
|
1189
|
+
display: flex; gap: 2px; align-items: center;
|
|
1190
|
+
padding: 5px 10px; background: var(--panel); border-bottom: 1px solid var(--border);
|
|
1191
|
+
color: var(--muted); font-size: 12.5px;
|
|
1192
|
+
}
|
|
1193
|
+
.bar-sub .icon-btn { height: 28px; min-width: 28px; }
|
|
1194
|
+
.sess-name {
|
|
1195
|
+
flex: 1 1 auto; min-width: 0; display: flex; cursor: pointer;
|
|
1196
|
+
background: none; border: none; font: inherit; color: var(--fg);
|
|
1197
|
+
padding: 5px 6px; border-radius: 4px; text-align: left;
|
|
1198
|
+
}
|
|
1199
|
+
.sess-name:hover { background: var(--hover-bg); }
|
|
1200
|
+
.sess-name:disabled { cursor: default; }
|
|
1201
|
+
.sess-name:disabled:hover { background: none; }
|
|
1202
|
+
.sess-name span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1203
|
+
/* + / list tools live here on phones; the dropdown opens below the bar. */
|
|
1204
|
+
.sess-tools { display: flex; gap: 2px; align-items: center; margin-left: auto; }
|
|
1205
|
+
.sess-tools .dd-menu { left: auto; right: 0; }
|
|
1206
|
+
#sessClose:hover { color: var(--red-strong); }
|
|
1081
1207
|
.conn { display: none; }
|
|
1082
1208
|
/* Sidebar toggle lives next to settings; settings keeps the right edge. */
|
|
1083
1209
|
#toggleSidebar { display: inline-flex; }
|
|
@@ -1088,7 +1214,7 @@ button.toggle:disabled { opacity: .5; cursor: default; }
|
|
|
1088
1214
|
.sb { display: none; }
|
|
1089
1215
|
body.sb-open .sb {
|
|
1090
1216
|
display: flex; position: fixed; top: 41px; right: 0; bottom: 0; z-index: 45;
|
|
1091
|
-
width: min(
|
|
1217
|
+
width: min(360px, 85vw); min-width: 0; max-height: none;
|
|
1092
1218
|
border-left: 1px solid var(--border); border-top: none;
|
|
1093
1219
|
box-shadow: var(--shadow-dd);
|
|
1094
1220
|
}
|
|
@@ -1116,6 +1242,29 @@ button.toggle:disabled { opacity: .5; cursor: default; }
|
|
|
1116
1242
|
.row { font-size: 12.5px; }
|
|
1117
1243
|
.input-area { margin: 8px 10px 10px; }
|
|
1118
1244
|
.msgs { padding: 12px 10px; }
|
|
1245
|
+
/* narrow phones: rail stacks vertically, track takes the full row */
|
|
1246
|
+
.rail-wrap.l-line, .rail-wrap.l-meta {
|
|
1247
|
+
flex-direction: column; align-items: stretch; gap: 6px;
|
|
1248
|
+
}
|
|
1249
|
+
.rail-wrap.l-line .rl-track, .rail-wrap.l-meta .rl-track {
|
|
1250
|
+
order: -1; flex: none; width: 100%; max-width: none;
|
|
1251
|
+
}
|
|
1252
|
+
.rail-wrap.l-line .rail-l1, .rail-wrap.l-line .rail-l2 { flex: none; }
|
|
1253
|
+
.rail-wrap.l-meta { width: 100%; flex-basis: 100%; }
|
|
1254
|
+
.selectors { gap: 6px; }
|
|
1255
|
+
.composer-main { gap: 4px; }
|
|
1256
|
+
/* phones have no Enter/Shift+Enter/Esc/Ctrl+V — hints only take up space.
|
|
1257
|
+
Spans only (not the whole row): the `meta` rail layout lives inside
|
|
1258
|
+
.inp-meta and must stay visible. */
|
|
1259
|
+
.inp-meta > span { display: none; }
|
|
1260
|
+
.inp-meta { gap: 0; margin-top: 0; padding: 0 2px; }
|
|
1261
|
+
.inp-meta:empty { display: none; }
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
/* touch devices at any width: keyboard hints don't apply */
|
|
1265
|
+
@media (pointer: coarse) {
|
|
1266
|
+
.inp-meta > span { display: none; }
|
|
1267
|
+
.inp-meta { gap: 0; }
|
|
1119
1268
|
}
|
|
1120
1269
|
|
|
1121
1270
|
/* --- First-run setup gate ---------------------------------------------------
|