samagotchi 0.136.1 → 0.138.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +58 -1
- data/docs/architecture.md +2 -2
- data/docs/cli.md +15 -7
- data/docs/context.md +7 -9
- data/docs/guardrails.md +12 -5
- data/docs/internals/engine.md +4 -4
- data/docs/internals/participants.md +2 -1
- data/docs/internals/web-frontend.md +19 -9
- data/docs/plugins.md +2 -2
- data/docs/sessions.md +8 -8
- data/docs/testing.md +2 -1
- data/lib/samagotchi/bridge.rb +4 -0
- data/lib/samagotchi/bundles/system/manifest.yml +1 -1
- data/lib/samagotchi/desktop/macos.rb +3 -2
- data/lib/samagotchi/engine.rb +6 -1
- data/lib/samagotchi/guardrail_wiring.rb +3 -1
- data/lib/samagotchi/guardrails/chi_dirs.rb +2 -2
- data/lib/samagotchi/guardrails/mise_paths.rb +36 -0
- data/lib/samagotchi/guardrails/outside.rb +5 -5
- data/lib/samagotchi/guardrails/pair_boundary.rb +11 -4
- data/lib/samagotchi/guardrails/pair_command.rb +3 -19
- data/lib/samagotchi/guardrails/protected_paths.rb +5 -2
- data/lib/samagotchi/guardrails/review_paths.rb +3 -2
- data/lib/samagotchi/guardrails/shell_paths.rb +0 -4
- data/lib/samagotchi/guardrails/verdict.rb +1 -1
- data/lib/samagotchi/version.rb +1 -1
- data/lib/samagotchi/web/message_display.rb +6 -3
- data/lib/samagotchi/web/participant_review.rb +2 -1
- data/lib/samagotchi/web/public/answer_fold.js +24 -6
- data/lib/samagotchi/web/public/app.js +24 -19
- data/lib/samagotchi/web/public/chains.js +6 -5
- data/lib/samagotchi/web/public/chip_popover.js +20 -42
- data/lib/samagotchi/web/public/composer.css +15 -11
- data/lib/samagotchi/web/public/composer_grip.js +11 -13
- data/lib/samagotchi/web/public/composer_mount.js +2 -2
- data/lib/samagotchi/web/public/context_chips.js +29 -98
- data/lib/samagotchi/web/public/copy.js +8 -5
- data/lib/samagotchi/web/public/data.js +2 -0
- data/lib/samagotchi/web/public/families_view.js +30 -38
- data/lib/samagotchi/web/public/index.html +176 -132
- data/lib/samagotchi/web/public/info_bar.js +19 -8
- data/lib/samagotchi/web/public/info_bar_model.js +3 -1
- data/lib/samagotchi/web/public/lists_view.js +69 -42
- data/lib/samagotchi/web/public/participants_panel.js +4 -4
- data/lib/samagotchi/web/public/popover_modal.js +57 -0
- data/lib/samagotchi/web/public/revise_stack.js +76 -6
- data/lib/samagotchi/web/public/revise_switch.js +55 -0
- data/lib/samagotchi/web/public/scope.js +3 -3
- data/lib/samagotchi/web/public/send_turn.js +4 -2
- data/lib/samagotchi/web/public/settings_chip.js +2 -2
- data/lib/samagotchi/web/public/stage_view.js +51 -2
- data/lib/samagotchi/web/public/stale_params.js +26 -0
- data/lib/samagotchi/web/public/start_settings.js +1 -1
- data/lib/samagotchi/web/public/start_toolkit.js +1 -1
- data/lib/samagotchi/web/public/stream_handlers.js +10 -5
- data/lib/samagotchi/web/public/working_set_rail.js +2 -0
- data/lib/samagotchi/web/public/working_set_view.js +2 -2
- data/lib/samagotchi/web/session_summary.rb +1 -1
- metadata +5 -1
|
@@ -23,13 +23,13 @@ html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
|
|
|
23
23
|
body{font-family: ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;background:radial-gradient(1100px 700px at 8% 0%,color-mix(in srgb,var(--accent) 13%,transparent),transparent 70%),var(--bg);background-attachment:fixed;color:var(--text);height:100vh;display:flex;flex-direction:column}
|
|
24
24
|
/* Glass: the composer card, the strip cards, the all-sessions cards and the question cards (by selector, so app.js is untouched). */
|
|
25
25
|
.turn-stage,#topStrip .card,#allList .card,.bubble.question,.bubble.plugin-card{background:var(--glass-bg);-webkit-backdrop-filter:blur(18px) saturate(1.35);backdrop-filter:blur(18px) saturate(1.35);border:1px solid var(--glass-border);box-shadow:inset 0 1px 0 var(--glass-highlight),var(--glass-shadow)}
|
|
26
|
-
#topStrip .card:hover,#allList .card:hover{background:color-mix(in srgb,var(--bg-hover) 75%,transparent);border-color:var(--card-hover-border)}
|
|
26
|
+
@media(hover:hover){#topStrip .card:hover,#allList .card:hover{background:color-mix(in srgb,var(--bg-hover) 75%,transparent);border-color:var(--card-hover-border)}}
|
|
27
27
|
#topStrip .card.active,#allList .card.active{background:color-mix(in srgb,var(--accent-bg) 75%,transparent);border-color:color-mix(in srgb,var(--accent) 35%,transparent)}
|
|
28
28
|
/* A parent whose folded family holds the open session: a quieter mark than .active. */
|
|
29
29
|
#topStrip .card.contains-active,#allList .card.contains-active{border-color:color-mix(in srgb,var(--accent) 22%,transparent)}
|
|
30
30
|
/* A session that waits on the user (a question, an approval, a card with actions): the warning colour of its question card, also when active or hovered. */
|
|
31
31
|
#topStrip .card.waiting,#allList .card.waiting{border-color:color-mix(in srgb,var(--warn) 75%,transparent)}
|
|
32
|
-
#topStrip .card.waiting:hover,#allList .card.waiting:hover{border-color:var(--warn)}
|
|
32
|
+
@media(hover:hover){#topStrip .card.waiting:hover,#allList .card.waiting:hover{border-color:var(--warn)}}
|
|
33
33
|
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){.turn-stage,#topStrip .card,#allList .card,#allHead input{background:var(--bg-panel)}.bubble.question{background:color-mix(in srgb,var(--warn) 7%,var(--bg-panel))}.bubble.plugin-card{background:color-mix(in srgb,var(--accent) 6%,var(--bg-panel))}}
|
|
34
34
|
@media (prefers-reduced-transparency:reduce){.turn-stage,#topStrip .card,#allList .card,#allHead input{background:var(--bg-panel);-webkit-backdrop-filter:none;backdrop-filter:none}.bubble.question{background:color-mix(in srgb,var(--warn) 7%,var(--bg-panel));-webkit-backdrop-filter:none;backdrop-filter:none}.bubble.plugin-card{background:color-mix(in srgb,var(--accent) 6%,var(--bg-panel));-webkit-backdrop-filter:none;backdrop-filter:none}}
|
|
35
35
|
body.no-glass .turn-stage,body.no-glass #topStrip .card,body.no-glass #allList .card,body.no-glass #allHead input{background:var(--bg-panel);-webkit-backdrop-filter:none;backdrop-filter:none}
|
|
@@ -37,7 +37,8 @@ body.no-glass .bubble.question{background:color-mix(in srgb,var(--warn) 7%,var(-
|
|
|
37
37
|
body.no-glass .bubble.plugin-card{background:color-mix(in srgb,var(--accent) 6%,var(--bg-panel));-webkit-backdrop-filter:none;backdrop-filter:none}
|
|
38
38
|
button,input,textarea,select{font:inherit}
|
|
39
39
|
button{background:var(--primary);border:0;color:var(--on-solid);padding:8px 12px;border-radius:8px;cursor:pointer;transition:filter .12s ease,background .12s ease}
|
|
40
|
-
|
|
40
|
+
/* Hover tints only where a pointer hovers: a tap on a phone leaves none behind (popover_modal.js's popovers likewise). */
|
|
41
|
+
@media(hover:hover){button:hover:not(:disabled){filter:brightness(1.12)}}
|
|
41
42
|
button:focus-visible,input:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
|
|
42
43
|
button.ghost{background:var(--bg-raised);color:var(--text-2)}
|
|
43
44
|
button:disabled{opacity:.5;cursor:not-allowed}
|
|
@@ -46,7 +47,6 @@ main{flex:1;display:flex;flex-direction:column;gap:16px;padding:16px;overflow:au
|
|
|
46
47
|
#topStrip:empty{display:grid}
|
|
47
48
|
#center{flex:1;display:flex;flex-direction:column;min-height:45vh;background:var(--bg-panel);border:1px solid var(--border);border-radius:12px;overflow:hidden}
|
|
48
49
|
#stage{flex:1;display:flex;flex-direction:column;position:relative;min-height:160px;background:var(--bg);overflow:hidden}
|
|
49
|
-
#composer #cancelBtn{order:2;background:var(--danger-bg)}
|
|
50
50
|
#history{flex:1;overflow:auto;padding:16px max(16px,calc((100% - 960px)/2));display:flex;flex-direction:column;gap:12px;background:var(--bg);min-height:160px}
|
|
51
51
|
/* No child shrinks to fit: a held (overflow:hidden) answer bubble would, clipped under the dock with nothing to scroll. */
|
|
52
52
|
#history>*{flex-shrink:0}
|
|
@@ -69,10 +69,10 @@ main{flex:1;display:flex;flex-direction:column;gap:16px;padding:16px;overflow:au
|
|
|
69
69
|
.answer-fold:not(.folded){margin-bottom:-12px;padding-bottom:0;border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}
|
|
70
70
|
.answer-fold:not(.folded)+.bubble{border-top:0;border-top-left-radius:0;border-top-right-radius:0;padding-top:8px}
|
|
71
71
|
/* A delegate report's row: the report's box (right, its tint, the user accent; dashed when merged mid-turn), closed or
|
|
72
|
-
its top edge. */
|
|
73
|
-
.answer-fold.report{align-self:flex-end;width:85%;background:var(--accent-bg);border-left-color:var(--accent)}
|
|
72
|
+
its top edge; a long prompt's (answer_fold.js PROMPTS, open by default) the same box. */
|
|
73
|
+
.answer-fold:is(.report,.prompt){align-self:flex-end;width:85%;background:var(--accent-bg);border-left-color:var(--accent)}
|
|
74
74
|
.answer-fold.report.steered{border-left-style:dashed}
|
|
75
|
-
.answer-fold.report:not(.folded)+.bubble.user{width:85
|
|
75
|
+
.answer-fold:is(.report,.prompt):not(.folded)+.bubble.user{width:85%;align-items:flex-start}
|
|
76
76
|
.answer-fold-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-2);font-size:13px}
|
|
77
77
|
.answer-fold-label:empty{display:none}
|
|
78
78
|
.answer-fold-size{flex:none;white-space:nowrap;font-variant-numeric:tabular-nums;transition:color .12s ease}
|
|
@@ -81,7 +81,7 @@ main{flex:1;display:flex;flex-direction:column;gap:16px;padding:16px;overflow:au
|
|
|
81
81
|
top's version chip. */
|
|
82
82
|
.stack-hidden,.time-gap.stack-gap{display:none!important}
|
|
83
83
|
.stack-stub{display:flex;align-items:baseline;gap:8px;align-self:stretch;max-width:100%;min-width:0;margin:0;padding:4px 10px;font:inherit;font-size:12px;line-height:1.4;color:var(--text-muted);text-align:left;cursor:pointer;user-select:none;background:transparent;border:1px dashed var(--border-strong);border-radius:8px;transition:background .12s ease}
|
|
84
|
-
.stack-stub:hover{background:var(--bg-panel)}
|
|
84
|
+
@media(hover:hover){.stack-stub:hover{background:var(--bg-panel)}}
|
|
85
85
|
.stack-stub:focus-visible{outline:2px solid var(--accent-ring);outline-offset:1px}
|
|
86
86
|
.stack-stub::before{content:"▸";color:var(--accent);flex:none}
|
|
87
87
|
.stack-stub.open::before{content:"▾"}
|
|
@@ -104,9 +104,20 @@ main{flex:1;display:flex;flex-direction:column;gap:16px;padding:16px;overflow:au
|
|
|
104
104
|
.stack-versions[open]>summary::after{content:"\00a0▴"}
|
|
105
105
|
.stack-versions-list{position:absolute;z-index:5;top:calc(100% + 4px);left:0;display:flex;flex-direction:column;min-width:240px;max-width:min(520px,calc(100vw - 32px));padding:4px;border-radius:8px;border:1px solid var(--border-strong);background:var(--bg-raised);box-shadow:var(--toast-shadow)}
|
|
106
106
|
.stack-version{display:block;min-height:0;padding:4px 8px;border:0;border-radius:6px;background:transparent;color:var(--text-2);font:inherit;font-size:12px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}
|
|
107
|
-
.stack-version:hover:not(:disabled){background:var(--bg-hover);filter:none}
|
|
107
|
+
@media(hover:hover){.stack-version:hover:not(:disabled){background:var(--bg-hover);filter:none}}
|
|
108
108
|
.stack-version.current{color:var(--text-muted);cursor:default}
|
|
109
109
|
.stack-version-n{font-weight:600;color:var(--accent);font-variant-numeric:tabular-nums}
|
|
110
|
+
/* The ‹ N/M › switcher (revise_switch.js): an earlier version's answer read in the top one's place; its copy dashed, the top hidden. */
|
|
111
|
+
.stack-switch{display:inline-flex;align-items:center;gap:2px;font-size:12px;color:var(--text-2);font-variant-numeric:tabular-nums}
|
|
112
|
+
.stack-switch-btn{min-height:0;height:22px;min-width:24px;padding:0 6px;border-radius:6px;border:1px solid var(--border-strong);background:var(--bg-raised);color:var(--text-2);font:inherit;font-size:14px;line-height:20px;cursor:pointer}
|
|
113
|
+
.stack-switch-btn:hover:not([aria-disabled="true"]){color:var(--text-bright);filter:none}
|
|
114
|
+
.stack-switch-btn:focus-visible{outline:2px solid var(--accent-ring);outline-offset:1px}
|
|
115
|
+
.stack-switch-btn[aria-disabled="true"]{opacity:.4;cursor:default}
|
|
116
|
+
.stack-switch-n{min-width:2.6em;text-align:center}
|
|
117
|
+
.stack-switch-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
|
|
118
|
+
@media (pointer:coarse){.stack-switch-btn{height:30px;min-width:34px;line-height:28px}}
|
|
119
|
+
.bubble.output.stack-view{border-left-style:dashed}
|
|
120
|
+
.stack-swapped{display:none!important}
|
|
110
121
|
/* A gap divider (time_gaps.js): one centred dim line where a quiet stretch passed, never wrapped (a phone at 360 px keeps it on one line). Not a .bubble. */
|
|
111
122
|
.time-gap{align-self:stretch;text-align:center;color:var(--time-gap);font-size:12px;line-height:1.4;font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:2px 0;user-select:none}
|
|
112
123
|
.turn-timing{margin-top:8px;color:var(--text-muted);font-size:11px;font-variant-numeric:tabular-nums}
|
|
@@ -163,7 +174,7 @@ main{flex:1;display:flex;flex-direction:column;gap:16px;padding:16px;overflow:au
|
|
|
163
174
|
.markdown-tip[hidden]{display:none}
|
|
164
175
|
.markdown-tip-text{flex:1;min-width:0}
|
|
165
176
|
.markdown-tip-close{flex:none;width:18px;height:18px;padding:0;border:0;border-radius:4px;background:transparent;color:var(--text-muted);font-size:14px;line-height:1;cursor:pointer}
|
|
166
|
-
.markdown-tip-close:hover{background:var(--bg-hover);color:var(--text)}
|
|
177
|
+
@media(hover:hover){.markdown-tip-close:hover{background:var(--bg-hover);color:var(--text)}}
|
|
167
178
|
.bubble.user{border-left:3px solid var(--accent);background:var(--accent-bg);align-self:flex-end;max-width:85%;margin-left:auto;display:flex;align-items:center;justify-content:space-between;gap:10px}
|
|
168
179
|
.bubble.user.queued{border-left-style:dashed;opacity:.8}
|
|
169
180
|
.bubble.user.steered{border-left-style:dashed;border-left-color:var(--accent);opacity:.9}
|
|
@@ -177,7 +188,7 @@ main{flex:1;display:flex;flex-direction:column;gap:16px;padding:16px;overflow:au
|
|
|
177
188
|
.bubble.user .state-badge button.unqueue{position:relative;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin:0 -3px 0 0;padding:0;border:0;border-radius:50%;background:transparent;color:var(--text-muted);font-size:14px;line-height:1;cursor:pointer}
|
|
178
189
|
.bubble.user .state-badge button.unqueue::before{content:"\00d7"}
|
|
179
190
|
.bubble.user .state-badge button.unqueue::after{content:"";position:absolute;inset:-8px}
|
|
180
|
-
.bubble.user .state-badge button.unqueue:hover:not(:disabled){background:var(--danger-bg-dim);color:var(--danger-text);filter:none}
|
|
191
|
+
@media(hover:hover){.bubble.user .state-badge button.unqueue:hover:not(:disabled){background:var(--danger-bg-dim);color:var(--danger-text);filter:none}}
|
|
181
192
|
.bubble.user:not([data-enqueued-id]) .state-badge button.unqueue{display:none}
|
|
182
193
|
.bubble.user .origin-label{font-size:11px;color:var(--text-3);text-transform:uppercase;letter-spacing:.04em;flex-shrink:0}
|
|
183
194
|
/* A participant's prompt: their name in their colour (tokens.css --author-N), and a rule of it on the bubble. */
|
|
@@ -186,7 +197,7 @@ main{flex:1;display:flex;flex-direction:column;gap:16px;padding:16px;overflow:au
|
|
|
186
197
|
/* Apply (review_apply.js) under a participant's review turn's reply. */
|
|
187
198
|
.review-apply{display:flex;align-items:center;gap:10px;margin:6px 0 4px}
|
|
188
199
|
.review-apply-btn{font:inherit;font-size:13px;font-weight:600;padding:5px 16px;border-radius:8px;cursor:pointer;background:var(--accent-bg);color:var(--accent);border:1px solid var(--accent-border)}
|
|
189
|
-
.review-apply-btn:hover{border-color:var(--accent)}
|
|
200
|
+
@media(hover:hover){.review-apply-btn:hover{border-color:var(--accent)}}
|
|
190
201
|
.review-apply-btn:disabled{opacity:.6;cursor:default}
|
|
191
202
|
.review-apply-note{font-size:12px;color:var(--text-muted);border-left:3px solid var(--author-color);padding-left:8px}
|
|
192
203
|
@media (max-width:600px){
|
|
@@ -239,13 +250,13 @@ main{flex:1;display:flex;flex-direction:column;gap:16px;padding:16px;overflow:au
|
|
|
239
250
|
/* The stop-task button on a running task_wait (task_stop.js): a small ghost
|
|
240
251
|
button in the danger colours, at the row's end and in the stage's now slot. */
|
|
241
252
|
button.task-stop{flex:none;margin-left:auto;padding:1px 8px;border:1px solid color-mix(in srgb,var(--danger) 45%,transparent);border-radius:6px;background:transparent;color:var(--danger-text);font-size:11.5px;line-height:18px;white-space:nowrap}
|
|
242
|
-
button.task-stop:hover:not(:disabled){background:var(--danger-bg-dim);filter:none}
|
|
253
|
+
@media(hover:hover){button.task-stop:hover:not(:disabled){background:var(--danger-bg-dim);filter:none}}
|
|
243
254
|
.ts-now button.task-stop{align-self:center}
|
|
244
255
|
.activity-params{color:var(--text-muted);overflow-wrap:anywhere}
|
|
245
256
|
.activity-alias{color:var(--text-faint);white-space:nowrap}
|
|
246
257
|
.activity-auto{color:var(--accent);font-size:11px;white-space:nowrap;cursor:help}
|
|
247
258
|
button.system-one-wrong,.system-one-wrong.marked{flex:none;padding:1px 6px;border:1px solid var(--border-strong);border-radius:6px;background:transparent;color:var(--text-muted);font-size:10px;line-height:16px;white-space:nowrap}
|
|
248
|
-
button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}
|
|
259
|
+
@media(hover:hover){button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:var(--text)}}
|
|
249
260
|
.system-one-wrong.marked{border-color:var(--accent-border);color:var(--text-3)}
|
|
250
261
|
.activity-row.guardrail-wrong .activity-auto{color:var(--text-muted)}
|
|
251
262
|
.activity-duration{color:var(--text-faint);font-size:11px;font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
@@ -323,7 +334,7 @@ button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:va
|
|
|
323
334
|
.bubble.thinking{border-left:3px solid var(--think);background:color-mix(in srgb,var(--think) 6%,var(--bg-panel));padding:8px 12px}
|
|
324
335
|
.bubble.activity:not([open]){padding:3px 10px;background:transparent;border-color:transparent;align-self:flex-start;border-radius:6px;transition:background .12s ease}
|
|
325
336
|
.bubble.activity:not([open]){border-left-color:var(--accent)}
|
|
326
|
-
.bubble.activity:not([open]):hover{background:var(--bg-panel)}
|
|
337
|
+
@media(hover:hover){.bubble.activity:not([open]):hover{background:var(--bg-panel)}}
|
|
327
338
|
.bubble.activity:not([open])>summary{font-size:12px;font-weight:500}
|
|
328
339
|
.bubble.thinking>summary{cursor:pointer;color:var(--text-muted);font-size:13px;font-weight:600;font-style:italic;user-select:none;list-style:none}
|
|
329
340
|
.bubble.thinking>summary::-webkit-details-marker{display:none}
|
|
@@ -399,7 +410,7 @@ button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:va
|
|
|
399
410
|
(which apply whether open or not) recolour it once resolved. */
|
|
400
411
|
.bubble.question:not([open]){padding:3px 10px;background:transparent;border-color:transparent;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;align-self:flex-start;border-radius:6px;transition:background .12s ease}
|
|
401
412
|
.bubble.question:not([open]){border-left-color:var(--warn)}
|
|
402
|
-
.bubble.question:not([open]):hover{background:var(--bg-panel)}
|
|
413
|
+
@media(hover:hover){.bubble.question:not([open]):hover{background:var(--bg-panel)}}
|
|
403
414
|
.bubble.question:not([open])>summary{font-size:12px;font-weight:500}
|
|
404
415
|
.bubble.question>summary{cursor:pointer;color:var(--text-muted);font-size:13px;font-weight:600;user-select:none;list-style:none}
|
|
405
416
|
.bubble.question>summary::-webkit-details-marker{display:none}
|
|
@@ -457,7 +468,7 @@ button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:va
|
|
|
457
468
|
.command-line{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--text-3)}
|
|
458
469
|
.command-output{margin:6px 0 0;white-space:pre-wrap;font-size:12px;color:var(--text-2)}
|
|
459
470
|
.bubble.command .command-confirm{margin-top:8px;padding:3px 10px;border-radius:6px;font:inherit;font-size:12px;cursor:pointer;background:var(--accent-bg);color:var(--accent);border:1px solid var(--accent-border)}
|
|
460
|
-
.bubble.command .command-confirm:hover:not(:disabled){border-color:var(--accent)}
|
|
471
|
+
@media(hover:hover){.bubble.command .command-confirm:hover:not(:disabled){border-color:var(--accent)}}
|
|
461
472
|
.bubble.command .command-confirm:disabled{opacity:.55;cursor:default}
|
|
462
473
|
.bubble.continue{border-left:3px solid var(--accent);background:var(--bg-panel);padding:10px 12px}
|
|
463
474
|
.bubble.continue.resolved{border-left-color:var(--text-muted);opacity:.8}
|
|
@@ -477,7 +488,7 @@ button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:va
|
|
|
477
488
|
.question-text{font-size:14px;color:var(--text);margin-bottom:8px;white-space:pre-wrap}
|
|
478
489
|
.question-options{display:flex;flex-direction:column;gap:4px;margin-bottom:8px}
|
|
479
490
|
.question-option{display:flex;gap:8px;align-items:center;font-size:13px;color:var(--text-2);padding:6px 8px;border:1px solid var(--border);border-radius:8px;cursor:pointer}
|
|
480
|
-
.question-option:hover{background:var(--bg-hover)}
|
|
491
|
+
@media(hover:hover){.question-option:hover{background:var(--bg-hover)}}
|
|
481
492
|
.question-option.selected{border-color:var(--ok);color:var(--text)}
|
|
482
493
|
.question-option input{margin:0;accent-color:var(--warn)}
|
|
483
494
|
/* The model's recommended option (a label ending in "(Recommended)"): an accent row and a small tag. */
|
|
@@ -499,7 +510,7 @@ button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:va
|
|
|
499
510
|
.bubble.question.approval{border-left-color:var(--warn);background:color-mix(in srgb,var(--warn) 7%,var(--glass-bg))}
|
|
500
511
|
.bubble.question.approval.answered:not(.denied){border-left-color:var(--ok)}
|
|
501
512
|
.bubble.question.approval:not([open]){background:transparent}
|
|
502
|
-
.bubble.question.approval:not([open]):hover{background:var(--bg-panel)}
|
|
513
|
+
@media(hover:hover){.bubble.question.approval:not([open]):hover{background:var(--bg-panel)}}
|
|
503
514
|
.bubble.question.answered>summary::before{color:var(--ok)}
|
|
504
515
|
.bubble.question.cancelled>summary::before{color:var(--text-muted)}
|
|
505
516
|
.bubble.question.approval.answered.denied>summary::before{color:var(--danger)}
|
|
@@ -578,7 +589,7 @@ button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:va
|
|
|
578
589
|
.bubble.plugin-card.card-updated{box-shadow:inset 0 1px 0 var(--glass-highlight),0 0 0 1px var(--accent-ring),var(--glass-shadow)}
|
|
579
590
|
/* A notice card (card.js isNoticeCard): a one-line row like a resolved question, "▸ check-in: Nudged …"; opened, the line wraps and the card's glass comes back. */
|
|
580
591
|
.bubble.plugin-card.notice:not([open]){padding:3px 10px;background:transparent;border-color:transparent;border-left-color:var(--accent);box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;align-self:flex-start;max-width:100%;border-radius:6px;transition:background .12s ease}
|
|
581
|
-
.bubble.plugin-card.notice:not([open]):hover{background:var(--bg-panel)}
|
|
592
|
+
@media(hover:hover){.bubble.plugin-card.notice:not([open]):hover{background:var(--bg-panel)}}
|
|
582
593
|
.bubble.plugin-card.notice>summary{cursor:pointer;color:var(--text-muted);font-size:12px;font-weight:500;user-select:none;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
583
594
|
.bubble.plugin-card.notice>summary::-webkit-details-marker{display:none}
|
|
584
595
|
.bubble.plugin-card.notice>summary::before{content:"▸ ";color:var(--accent)}
|
|
@@ -613,12 +624,14 @@ button.system-one-wrong:hover:not(:disabled){background:var(--bg-hover);color:va
|
|
|
613
624
|
.copy-btn[data-copied] svg{display:none}
|
|
614
625
|
.copy-btn[data-copied]::after{content:"copied \2713";padding:0 2px}
|
|
615
626
|
.bubble.user>.copy-btn{right:calc(100% + 4px);top:4px;background:transparent;border-color:transparent}
|
|
616
|
-
.bubble.user>.copy-btn:hover{background:var(--bg-raised);border-color:var(--border-strong)}
|
|
627
|
+
@media(hover:hover){.bubble.user>.copy-btn:hover{background:var(--bg-raised);border-color:var(--border-strong)}}
|
|
617
628
|
.code-wrap{position:relative;margin:0 0 12px}
|
|
618
629
|
.code-wrap:last-child{margin-bottom:0}
|
|
619
630
|
.bubble.output.markdown .code-wrap>pre,.bubble.user>.user-message.markdown .code-wrap>pre{margin:0}
|
|
620
631
|
.code-wrap>.copy-btn{top:5px;right:5px}
|
|
621
632
|
@media (hover:none){.copy-btn{opacity:.55}}
|
|
633
|
+
/* Where the code button always shows (touch) or a phone's narrow block, the code starts under it: a strip above the first line holds the button (a line as wide as the block, or one that scrolls, would run under it). */
|
|
634
|
+
@media (max-width:600px),(hover:none){.bubble.output.markdown .code-wrap>pre,.bubble.user>.user-message.markdown .code-wrap>pre{padding-top:32px}}
|
|
622
635
|
/* The dock is the composer card (composer.css .composer-card): the text field, a toolbar row, the info bar as its footer. */
|
|
623
636
|
#dock{flex-shrink:0;margin:0 12px 12px}
|
|
624
637
|
/* In a session the card floats over the history, so the glass blurs it; the history's bottom padding follows the card (--dock-h, set from dock_reserve.js). */
|
|
@@ -664,7 +677,7 @@ body.has-session #history{padding-bottom:calc(var(--dock-h,160px) + 32px)}
|
|
|
664
677
|
body:not(.has-session) #composer .actions-col{flex-wrap:nowrap}
|
|
665
678
|
body:not(.has-session) #composer .actions-col .model-pick{flex:0 100000 auto;min-width:min(84px,20vw)}
|
|
666
679
|
body:not(.has-session) #composer .actions-col .llmctx-new{flex:0 1 auto;min-width:40px}
|
|
667
|
-
#composer .actions-col .model-pick:hover
|
|
680
|
+
#composer .actions-col .model-pick:hover{filter:none}#composer .actions-col .model-pick[aria-expanded="true"]{background:color-mix(in srgb,var(--bg-hover) 75%,transparent);color:var(--text-2)}@media(hover:hover){#composer .actions-col .model-pick:hover{background:color-mix(in srgb,var(--bg-hover) 75%,transparent);color:var(--text-2)}}
|
|
668
681
|
#composer .actions-col .model-pick[hidden],body.has-session #composer .actions-col .model-pick{display:none}
|
|
669
682
|
.model-pick-name{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
670
683
|
#composer .actions-col .model-pick.unavailable .model-pick-name{color:var(--text-faint)}
|
|
@@ -674,8 +687,8 @@ body:not(.has-session) #composer .actions-col .llmctx-new{flex:0 1 auto;min-widt
|
|
|
674
687
|
body.has-session.fresh-link #composer .actions-col .model-pick:not([hidden]){display:inline-block;flex:0 1 auto;min-width:0;max-width:200px}
|
|
675
688
|
@media(max-width:600px){body.has-session.fresh-link #composer .actions-col .model-pick:not([hidden]){max-width:100px}}
|
|
676
689
|
/* The new session's override chips (start_page.js: what the ⚙ panel has set, only then), right of the key hint next to ⚙: accent; a click opens the panel. A phone has ⚙'s dot instead (below). */
|
|
677
|
-
#composer .actions-col .llmctx-new{order:
|
|
678
|
-
#composer .actions-col .llmctx-new:hover{filter:none;color:var(--accent);background:var(--accent-bg)}
|
|
690
|
+
#composer .actions-col .llmctx-new{order:2;flex:0 1 auto;min-width:0;max-width:min(30%,220px);height:24px;min-height:24px;line-height:22px;padding:0 6px;border-radius:6px;border:1px solid var(--accent-border);background:transparent;color:var(--accent);font-size:11px;font-weight:400;overflow:hidden;text-overflow:ellipsis}
|
|
691
|
+
#composer .actions-col .llmctx-new:hover{filter:none}#composer .actions-col .llmctx-new[aria-expanded="true"]{color:var(--accent);background:var(--accent-bg)}@media(hover:hover){#composer .actions-col .llmctx-new:hover{color:var(--accent);background:var(--accent-bg)}}
|
|
679
692
|
#composer .actions-col .llmctx-new[hidden],body.has-session #composer .actions-col .llmctx-new{display:none}
|
|
680
693
|
/* Phones (the key hint is gone there): still one row, with tighter gaps; the override chips go (⚙'s dot and label say what is set). */
|
|
681
694
|
@media(max-width:600px){#composer .actions-col .model-pick{flex:0 1 auto;min-width:0;max-width:100%}body:not(.has-session) #composer .actions-col{gap:4px}body:not(.has-session) #composer .actions-col .model-pick{flex-shrink:20;min-width:min(84px,20vw)}#composer .actions-col .llmctx-new{display:none}}
|
|
@@ -762,8 +775,16 @@ body.stage-view .turn-stage{position:absolute;left:0;right:0;bottom:100%;margin-
|
|
|
762
775
|
.ts-mini{min-width:0;overflow:hidden;text-overflow:ellipsis;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--text-2)}
|
|
763
776
|
.ts-defer{color:var(--text-faint);font-style:italic;opacity:0;transition:opacity .2s}
|
|
764
777
|
.turn-stage.ended.in-use .ts-defer{opacity:1}
|
|
778
|
+
/* Stop turn (stage_view.js): a ghost in the danger colour at the row's right edge, beside the fold; the fold keeps the edge when it is hidden. */
|
|
779
|
+
.ts-cancel{margin-left:auto;flex:none;padding:1px 10px;border:1px solid color-mix(in srgb,var(--danger) 45%,transparent);border-radius:6px;background:transparent;color:var(--danger-text);font-size:11.5px;font-weight:600;line-height:20px;white-space:nowrap}
|
|
780
|
+
.ts-cancel[hidden]{display:none}
|
|
781
|
+
@media(hover:hover){.ts-cancel:hover:not(:disabled){filter:none;background:var(--danger-bg-dim)}}
|
|
782
|
+
.ts-cancel:not([hidden])+.ts-fold{margin-left:0}
|
|
783
|
+
/* A running turn the stage has nothing of (stage_view.js runningWithoutTurn): its status row alone, Stop turn in it. */
|
|
784
|
+
.turn-stage.bare :is(.ts-scroll,.ts-foot,.ts-queued,.ts-fold){display:none}
|
|
785
|
+
.turn-stage.bare .ts-status{padding-bottom:8px}
|
|
765
786
|
.ts-fold{margin-left:auto;flex:none;width:28px;height:24px;padding:0;border-radius:6px;background:transparent;color:var(--text-muted);font-size:14px}
|
|
766
|
-
.ts-fold:hover:not(:disabled){filter:none;background:var(--bg-hover);color:var(--text)}
|
|
787
|
+
@media(hover:hover){.ts-fold:hover:not(:disabled){filter:none;background:var(--bg-hover);color:var(--text)}}
|
|
767
788
|
.ts-scroll{position:relative;flex:1 1 auto;min-height:0;overflow:auto;overflow-anchor:none;display:flex;flex-direction:column;gap:8px;padding:8px 14px 10px;scrollbar-width:thin}
|
|
768
789
|
.ts-scroll[hidden],.ts-scroll>[hidden]{display:none}
|
|
769
790
|
/* Flex column children with overflow:hidden would shrink to nothing. */
|
|
@@ -781,7 +802,7 @@ body.stage-view .turn-stage{position:absolute;left:0;right:0;bottom:100%;margin-
|
|
|
781
802
|
/* The live slots: fixed heights (two headline lines, one tool row, one trail line). */
|
|
782
803
|
.ts-live{display:flex;flex-direction:column;gap:8px}
|
|
783
804
|
.ts-headline{height:var(--ts-head-h);font-size:14px;line-height:21px;color:var(--narr);overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;cursor:pointer;border-radius:6px}
|
|
784
|
-
.ts-headline:hover{background:var(--bg-hover)}
|
|
805
|
+
@media(hover:hover){.ts-headline:hover{background:var(--bg-hover)}}
|
|
785
806
|
.ts-headline:not(.thinking)::before{content:"\203A";color:var(--accent);font-weight:700;margin-right:7px}
|
|
786
807
|
.ts-headline.thinking{font-size:13.5px;font-style:italic;color:var(--text-muted)}
|
|
787
808
|
.ts-think-tag{font-style:normal;font-size:12.5px;color:var(--think-text);margin-right:6px}
|
|
@@ -825,6 +846,11 @@ body.stage-view .turn-stage{position:absolute;left:0;right:0;bottom:100%;margin-
|
|
|
825
846
|
.ts-extras>.bubble.user{max-width:none;margin:0;padding:4px 10px;font-size:13px;line-height:1.45;background:transparent;color:var(--text-2)}
|
|
826
847
|
.ts-extras>.bubble.user>.copy-btn{display:none}
|
|
827
848
|
.ts-extras>.bubble.user .user-message{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;white-space:normal}
|
|
849
|
+
/* A line's markdown (a delegate report's) reads as a plain row in the clamped rows: its blocks run inline at the
|
|
850
|
+
row's own size, a space between them, rules and copy buttons gone. The prompt line shown whole keeps it. */
|
|
851
|
+
:is(.ts-extras>.bubble.user,.ts-prompt:not(.full)>.bubble.user)>.user-message.markdown :is(p,h1,h2,h3,h4,h5,h6,ul,ol,li,blockquote,pre,table,thead,tbody,tr,th,td,.code-wrap){display:inline;margin:0;padding:0;border:0;border-radius:0;background:transparent;font-size:inherit;font-weight:inherit;line-height:inherit;color:inherit;white-space:normal}
|
|
852
|
+
:is(.ts-extras>.bubble.user,.ts-prompt:not(.full)>.bubble.user)>.user-message.markdown :is(p,h1,h2,h3,h4,h5,h6,li,blockquote,pre,td,th)::after{content:" "}
|
|
853
|
+
:is(.ts-extras>.bubble.user,.ts-prompt:not(.full)>.bubble.user)>.user-message.markdown :is(hr,img,.copy-btn){display:none}
|
|
828
854
|
/* Inside the dock's own blur a second backdrop-filter sees nothing: the cards are opaque here (as #commandList is). */
|
|
829
855
|
.turn-stage .bubble.question,.turn-stage .bubble.plugin-card{-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none}
|
|
830
856
|
.turn-stage .bubble.question{background:color-mix(in srgb,var(--warn) 7%,var(--bg-panel))}
|
|
@@ -839,14 +865,14 @@ body.stage-view .turn-stage{position:absolute;left:0;right:0;bottom:100%;margin-
|
|
|
839
865
|
/* The question room's jump pill (stage_view.js drawPill): at the scroller's bottom edge, above the chip, while the waiting
|
|
840
866
|
card is out of the stage's view; absolute, so the frame never counts it. */
|
|
841
867
|
.ts-room-pill{position:absolute;bottom:100%;right:14px;margin-bottom:6px;padding:4px 11px;border:1px solid var(--warn-border);border-radius:999px;background:var(--warn-bg);color:var(--warn-text);font-size:12.5px;font-weight:600;line-height:1.4;white-space:nowrap;box-shadow:0 2px 8px var(--shadow-strong);animation:ts-fade .2s ease}
|
|
842
|
-
.ts-room-pill:hover:not(:disabled){filter:none;color:var(--warn-bright);border-color:var(--warn);background:var(--warn-bg)}
|
|
868
|
+
@media(hover:hover){.ts-room-pill:hover:not(:disabled){filter:none;color:var(--warn-bright);border-color:var(--warn);background:var(--warn-bg)}}
|
|
843
869
|
.ts-room-pill[hidden]{display:none}
|
|
844
870
|
/* Below the turn's card: the lines queued for after it (each a turn of its own), apart from the turn by a dashed rule. */
|
|
845
871
|
.ts-queued{flex:none;display:flex;flex-direction:column;gap:6px;padding:8px 14px 10px;border-top:1px dashed var(--border-strong);max-height:calc(var(--stage-max,60vh) * .3);overflow:auto;scrollbar-width:thin}
|
|
846
872
|
.ts-queued:empty{display:none}
|
|
847
873
|
.ts-foot[hidden],.turn-stage.collapsed .ts-foot{display:none}
|
|
848
874
|
.ts-chip{display:flex;align-items:center;gap:10px;flex-wrap:nowrap;width:100%;padding:6px 10px;border:1px solid var(--border);border-radius:9px;background:transparent;color:var(--text-muted);text-align:left}
|
|
849
|
-
.ts-chip:hover:not(:disabled){filter:none;background:var(--bg-hover)}
|
|
875
|
+
@media(hover:hover){.ts-chip:hover:not(:disabled){filter:none;background:var(--bg-hover)}}
|
|
850
876
|
.ts-chip-label{font-size:12.5px;font-weight:600;white-space:nowrap;font-variant-numeric:tabular-nums}
|
|
851
877
|
.ts-chip-label::before{content:"\25B8 ";color:var(--accent)}
|
|
852
878
|
.ts-foot.open .ts-chip-label::before{content:"\25BE "}
|
|
@@ -880,13 +906,13 @@ body.stage-view .turn-stage{position:absolute;left:0;right:0;bottom:100%;margin-
|
|
|
880
906
|
body.working-set .turn-stage{container-type:inline-size}
|
|
881
907
|
body.working-set .ts-live{position:relative;padding-right:264px}
|
|
882
908
|
.ts-ws{--ws-line:18px;position:absolute;top:0;right:0;bottom:0;width:248px;box-sizing:border-box;padding:0 4px 0 12px;border-left:1px solid var(--ws-rule);border-radius:0 6px 6px 0;display:flex;flex-direction:column;overflow:hidden;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:var(--ws-line);color:var(--text-2);cursor:pointer}
|
|
883
|
-
.ts-ws:hover{background:var(--bg-hover)}
|
|
909
|
+
@media(hover:hover){.ts-ws:hover{background:var(--bg-hover)}}
|
|
884
910
|
.ts-ws:focus-visible{outline:2px solid var(--accent-ring);outline-offset:1px}
|
|
885
911
|
.ws-head{flex:none;display:flex;align-items:center;gap:6px;min-width:0;height:var(--ws-line);font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ws-muted);white-space:nowrap}
|
|
886
912
|
.ws-count{margin-right:auto;font-weight:400;letter-spacing:0;color:var(--ws-faint);font-variant-numeric:tabular-nums}
|
|
887
913
|
.ws-tick{display:none}
|
|
888
914
|
.ws-fold{flex:none;width:18px;height:18px;padding:0;border:0;border-radius:4px;background:transparent;color:var(--text-muted);font-size:12px;line-height:18px;opacity:0;transition:opacity .15s}
|
|
889
|
-
.ws-fold:hover:not(:disabled){filter:none;background:var(--bg-raised);color:var(--text)}
|
|
915
|
+
@media(hover:hover){.ws-fold:hover:not(:disabled){filter:none;background:var(--bg-raised);color:var(--text)}}
|
|
890
916
|
.ts-ws:hover .ws-fold,.ts-ws:focus-within .ws-fold,.ts-ws.collapsed .ws-fold{opacity:1}
|
|
891
917
|
@media (hover:none){.ws-fold{opacity:1}}
|
|
892
918
|
.ws-ring{flex:none;width:14px;height:14px}
|
|
@@ -947,7 +973,7 @@ body.working-set .turn-stage.waiting .ts-live{min-height:calc(var(--ts-live-h) +
|
|
|
947
973
|
body.working-set .turn-stage.held-wait:not(.waiting) .ts-live{min-height:max(calc(var(--ts-live-h) + var(--ws-row-h,0px)),var(--live-held,0px))}
|
|
948
974
|
/* A finished turn's footprint, under its closed block (working_set_view.js): one faint line; a click opens its list. */
|
|
949
975
|
.ws-foot{display:block;width:fit-content;max-width:calc(100% - 13px);box-sizing:border-box;margin:-4px 0 0 13px;padding:0 6px;border-radius:6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;line-height:18px;color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}
|
|
950
|
-
.ws-foot:hover{color:var(--text-muted);background:var(--bg-hover)}
|
|
976
|
+
@media(hover:hover){.ws-foot:hover{color:var(--text-muted);background:var(--bg-hover)}}
|
|
951
977
|
.ws-foot:focus-visible{outline:2px solid var(--accent-ring);outline-offset:1px}
|
|
952
978
|
.ws-foot .w{font-family:ui-sans-serif,system-ui,sans-serif}
|
|
953
979
|
.ws-foot .sep{color:var(--border-strong)}
|
|
@@ -959,25 +985,25 @@ body.working-set .turn-stage.held-wait:not(.waiting) .ts-live{min-height:max(cal
|
|
|
959
985
|
.ws-step{display:inline-block;padding:0 4px;border:0;border-radius:4px;background:var(--badge-bg);font-family:ui-sans-serif,system-ui,sans-serif;font-size:10.5px;line-height:14px;font-weight:400;color:var(--ws-faint);font-variant-numeric:tabular-nums;vertical-align:1px}
|
|
960
986
|
.ws-step.p{color:var(--think-text)}
|
|
961
987
|
button.ws-step{cursor:pointer}
|
|
962
|
-
button.ws-step:hover:not(:disabled){filter:none
|
|
988
|
+
button.ws-step:hover:not(:disabled){filter:none}@media(hover:hover){button.ws-step:hover:not(:disabled){background:var(--accent-bg);color:var(--accent)}}
|
|
963
989
|
/* The expanded view (a chip popover; a bottom sheet on a phone). */
|
|
964
990
|
.ws-popover{gap:0}
|
|
965
991
|
.ws-popover .ctx-pop-head{align-items:center;flex-wrap:wrap;margin-bottom:4px}
|
|
966
992
|
.ws-scope{display:inline-flex;gap:2px}
|
|
967
993
|
.ws-scope button{padding:1px 8px;border:1px solid transparent;border-radius:999px;background:transparent;color:var(--text-muted);font-size:11px;line-height:16px}
|
|
968
994
|
.ws-scope button.on{color:var(--text-2);border-color:var(--border-strong);background:var(--bg-raised)}
|
|
969
|
-
.ws-scope button:hover:not(:disabled){filter:none
|
|
995
|
+
.ws-scope button:hover:not(:disabled){filter:none}@media(hover:hover){.ws-scope button:hover:not(:disabled){color:var(--text)}}
|
|
970
996
|
.ws-popover .ctx-pop-meta{margin-top:6px;color:var(--ws-muted)}
|
|
971
997
|
.ws-popover .ws-hint{margin-top:10px;color:var(--ws-faint)}
|
|
972
998
|
.ws-row{display:flex;align-items:center;gap:8px;width:100%;min-width:0;height:28px;box-sizing:border-box;padding:0 6px;border:0;border-radius:6px;background:transparent;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;line-height:28px;color:var(--text-2);text-align:left}
|
|
973
|
-
.ws-row:hover{background:var(--bg-hover)}
|
|
974
|
-
button.ws-row:hover:not(:disabled){filter:none
|
|
999
|
+
@media(hover:hover){.ws-row:hover{background:var(--bg-hover)}}
|
|
1000
|
+
button.ws-row:hover:not(:disabled){filter:none}@media(hover:hover){button.ws-row:hover:not(:disabled){background:var(--bg-hover)}}
|
|
975
1001
|
.ws-row .k{flex:none;width:12px;text-align:center;color:var(--ws-faint)}
|
|
976
1002
|
.ws-row.memory .k{color:var(--think-text)}
|
|
977
1003
|
.ws-row.url .k{color:var(--accent)}
|
|
978
1004
|
.ws-row .t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:inherit}
|
|
979
1005
|
.ws-row a.t{text-decoration:none}
|
|
980
|
-
.ws-row a.t:hover{text-decoration:underline}
|
|
1006
|
+
@media(hover:hover){.ws-row a.t:hover{text-decoration:underline}}
|
|
981
1007
|
.ws-row .e{flex:none;color:var(--accent);font-weight:600}
|
|
982
1008
|
.ws-row .n{flex:none;color:var(--ws-faint)}
|
|
983
1009
|
.ws-row .st{flex:0 4 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left:auto;font-family:ui-sans-serif,system-ui,sans-serif;font-size:11px;color:var(--ws-faint)}
|
|
@@ -994,12 +1020,12 @@ button.ws-row:hover:not(:disabled){filter:none;background:var(--bg-hover)}
|
|
|
994
1020
|
.ws-row:hover .ws-act,.ws-row:focus-within .ws-act,.ws-ghead:hover .ws-act,.ws-ghead:focus-within .ws-act,.ws-row.pending .ws-act{opacity:1}
|
|
995
1021
|
@media (hover:none){.ws-act{opacity:1}}
|
|
996
1022
|
.ws-act-b{flex:none;padding:0 6px;border:1px solid var(--ws-act-border);border-radius:4px;background:transparent;font-family:ui-sans-serif,system-ui,sans-serif;font-size:11px;font-weight:400;line-height:16px;color:var(--ws-muted);cursor:pointer}
|
|
997
|
-
.ws-act-b:hover:not(:disabled){filter:none
|
|
1023
|
+
.ws-act-b:hover:not(:disabled){filter:none}@media(hover:hover){.ws-act-b:hover:not(:disabled){color:var(--accent);border-color:var(--accent);background:var(--accent-bg)}}
|
|
998
1024
|
.ws-act-b:disabled{opacity:.5;cursor:default}
|
|
999
1025
|
.ws-ghead{display:flex;align-items:center;gap:4px}
|
|
1000
1026
|
.ws-ghead>.ws-group-head{flex:1;min-width:0}
|
|
1001
1027
|
.ws-row.pending{border:1px dashed var(--warn-border);background:var(--warn-bg)}
|
|
1002
|
-
.ws-row.pending:hover{background:var(--warn-bg)}
|
|
1028
|
+
@media(hover:hover){.ws-row.pending:hover{background:var(--warn-bg)}}
|
|
1003
1029
|
/* A pending row: its pill and undo take the tokens' and the step tag's room, so the name stays readable. */
|
|
1004
1030
|
.ws-row.pending .tk,.ws-row.pending .ws-step{display:none}
|
|
1005
1031
|
.ws-pend{flex:none;padding:0 6px;border:1px solid var(--warn-border);border-radius:999px;background:var(--warn-bg);color:var(--warn-text);font-family:ui-sans-serif,system-ui,sans-serif;font-size:10.5px;line-height:15px;white-space:nowrap}
|
|
@@ -1028,7 +1054,7 @@ button.ws-row:hover:not(:disabled){filter:none;background:var(--bg-hover)}
|
|
|
1028
1054
|
.ws-popover.sheet .ws-add .ws-act-b{line-height:32px;padding:0 14px;font-size:12.5px;border-radius:6px}
|
|
1029
1055
|
/* The session bar's chip, in the mem chip's place: a dot (the accent: changed since its list was last opened) and the count. */
|
|
1030
1056
|
#infoBar .meta .ws-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 7px;border:1px solid transparent;cursor:pointer;font-family:inherit;font-weight:400;white-space:nowrap;font-variant-numeric:tabular-nums}
|
|
1031
|
-
#infoBar .meta .ws-chip:hover:not(:disabled){filter:none;color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}
|
|
1057
|
+
#infoBar .meta .ws-chip:hover:not(:disabled){filter:none}#infoBar .meta .ws-chip[aria-expanded="true"]{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}@media(hover:hover){#infoBar .meta .ws-chip:hover:not(:disabled){color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}}
|
|
1032
1058
|
.ws-dot{width:6px;height:6px;border-radius:50%;background:var(--text-faint);opacity:.6}
|
|
1033
1059
|
#infoBar .meta .ws-chip.empty{color:var(--text-muted);background:transparent;border-color:var(--border)}
|
|
1034
1060
|
.ws-chip.changed .ws-dot{background:var(--accent);opacity:1;box-shadow:0 0 0 2px var(--accent-ring)}
|
|
@@ -1046,6 +1072,7 @@ button.ws-row:hover:not(:disabled){filter:none;background:var(--bg-hover)}
|
|
|
1046
1072
|
.ts-foot{padding:0 10px 10px}
|
|
1047
1073
|
.ts-queued{padding:8px 10px 10px}
|
|
1048
1074
|
.ts-defer{display:none}
|
|
1075
|
+
.ts-cancel{padding:1px 8px}
|
|
1049
1076
|
.ts-trail-item{max-width:24ch}
|
|
1050
1077
|
}
|
|
1051
1078
|
@media (prefers-reduced-motion:reduce){.turn-stage.enter,.ts-arrive,.ts-headline.fresh,.ts-tick.running,.ts-mark,.turn-work:not(.done) .activity-status.running::before{animation:none}.turn-stage.leaving,#center.reserve-easing #history{transition:none}}
|
|
@@ -1059,7 +1086,7 @@ button.ws-row:hover:not(:disabled){filter:none;background:var(--bg-hover)}
|
|
|
1059
1086
|
#infoBar .meta{font-size:11px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
|
|
1060
1087
|
/* The id is a button (a click copies the full id, app.js): its own padding and no button look, the #infoBar button rule aside. */
|
|
1061
1088
|
#infoBar .meta .id{padding:2px 6px;border-radius:6px;border:1px solid transparent;background:transparent;cursor:pointer;font-family:ui-monospace,monospace;font-weight:700;font-size:12px;color:var(--accent)}
|
|
1062
|
-
#infoBar .meta .id:hover:not(:disabled){filter:none;border-color:var(--accent-border);background:var(--accent-bg)}
|
|
1089
|
+
@media(hover:hover){#infoBar .meta .id:hover:not(:disabled){filter:none;border-color:var(--accent-border);background:var(--accent-bg)}}
|
|
1063
1090
|
#infoBar .meta .status{font-size:11px;padding:2px 6px;border-radius:999px}
|
|
1064
1091
|
/* The status word takes the widest word's room (running, stopped; idle and error are narrower), so a turn's idle ↔ running doesn't move the rest of the line. */
|
|
1065
1092
|
#infoBar .meta .status{display:inline-grid;justify-items:center}
|
|
@@ -1070,16 +1097,22 @@ button.ws-row:hover:not(:disabled){filter:none;background:var(--bg-hover)}
|
|
|
1070
1097
|
#infoBar .meta .dir{font-family:ui-monospace,monospace;font-size:11px;color:var(--text-muted);max-width:48ch;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;direction:rtl;text-align:left}
|
|
1071
1098
|
/* The footer sits on the card's glass: its chips are tinted, not solid, so the glass reads through them. */
|
|
1072
1099
|
#infoBar .meta .model{font-size:11px;padding:2px 6px;border-radius:6px;background:color-mix(in srgb,var(--bg-hover) 55%,transparent);color:var(--text-3)}
|
|
1073
|
-
/*
|
|
1074
|
-
|
|
1100
|
+
/* The meta's three groups (info_bar.js): setup | relations | telemetry, a hairline between two. */
|
|
1101
|
+
#infoBar .meta .bar-group{display:flex;gap:8px;align-items:center;min-width:0;flex:none}
|
|
1102
|
+
#infoBar .meta .bar-sep{flex:none;width:1px;height:14px;background:var(--border-strong)}
|
|
1103
|
+
/* Above the phone's one scrolling line the meta is one line too: the telemetry takes the room left and its folder gives
|
|
1104
|
+
way first (it already loses its start); a chip is capped, cut with "…", their full text in the title. */
|
|
1075
1105
|
@media(min-width:601px){
|
|
1076
|
-
#infoBar .meta
|
|
1077
|
-
#infoBar .meta .
|
|
1106
|
+
#infoBar .meta{flex-wrap:nowrap}
|
|
1107
|
+
#infoBar .meta .bar-group.telemetry{flex:1 1 0}
|
|
1108
|
+
#infoBar .meta .telemetry>*{flex:none}
|
|
1109
|
+
#infoBar .meta .telemetry>.dir{flex:0 1 auto;max-width:48ch}
|
|
1110
|
+
#infoBar .meta .model{max-width:40ch;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
1078
1111
|
}
|
|
1079
1112
|
/* The plain chips (spans, links) and the status take the button chips' 1px border, transparent and outside their tint, so every chip is one height: a chip wrapping onto a row of plain ones doesn't grow it. */
|
|
1080
1113
|
#infoBar .meta :is(span,a).model,#infoBar .meta .status{border:1px solid transparent;background-clip:padding-box}
|
|
1081
|
-
/* The chips a running turn rewrites (the session clock each second, the last generation's speed, ctx): tabular digits in a reserved width, so a tick ("9.5s" → "10s" → "1m 00s") or a new number doesn't widen the line and
|
|
1082
|
-
:root{--info-clock-w:
|
|
1114
|
+
/* The chips a running turn rewrites (the session clock each second, the last generation's speed, ctx): tabular digits in a reserved width, so a tick ("9.5s" → "10s" → "1m 00s") or a new number doesn't widen the line and move the chips after it. The speed and the clock show from the session's start, a muted placeholder until there is a number. */
|
|
1115
|
+
:root{--info-clock-w:8ch;--info-speed-w:9ch;--info-ctx-w:7ch}
|
|
1083
1116
|
#infoBar .meta :is(.session-time,.speed,.ctx){font-variant-numeric:tabular-nums;white-space:nowrap;text-align:center}
|
|
1084
1117
|
#infoBar .meta .session-time{min-width:var(--info-clock-w)}
|
|
1085
1118
|
#infoBar .meta .speed{min-width:var(--info-speed-w)}
|
|
@@ -1090,24 +1123,21 @@ button.ws-row:hover:not(:disabled){filter:none;background:var(--bg-hover)}
|
|
|
1090
1123
|
#infoBar .meta .worker-badge{display:inline-flex;align-items:center;gap:6px;font-size:11px;padding:2px 2px 2px 6px;border-radius:6px;background:var(--warn-bg);color:var(--warn-bright);border:1px solid var(--warn-border);white-space:nowrap}
|
|
1091
1124
|
#infoBar .meta .worker-badge:not(:has(button)){padding-right:6px}
|
|
1092
1125
|
#infoBar .meta .worker-restart{padding:1px 8px;border-radius:5px;font-size:11px;font-weight:600;background:var(--bg-raised);color:var(--warn-bright);border:1px solid var(--warn-border)}
|
|
1093
|
-
#infoBar .meta .worker-restart:hover:not(:disabled){background:var(--warn-border);color:var(--on-warn)}
|
|
1126
|
+
@media(hover:hover){#infoBar .meta .worker-restart:hover:not(:disabled){background:var(--warn-border);color:var(--on-warn)}}
|
|
1094
1127
|
#infoBar .meta .worker-restart:disabled{opacity:.7;cursor:default}
|
|
1095
1128
|
#infoBar button{padding:4px 12px;border-radius:8px;font-size:12px;font-weight:600}
|
|
1096
1129
|
#infoBar #infoStopBtn{background:var(--bg-raised);color:var(--warn-text);border:1px solid var(--border-strong)}
|
|
1097
|
-
#infoBar #infoStopBtn:hover{background:var(--warn-bg);border-color:var(--warn-border)}
|
|
1130
|
+
@media(hover:hover){#infoBar #infoStopBtn:hover{background:var(--warn-bg);border-color:var(--warn-border)}}
|
|
1098
1131
|
#infoBar #infoArchiveBtn{background:transparent;color:var(--text-muted);border:1px solid var(--border-strong)}
|
|
1099
|
-
#infoBar #infoArchiveBtn:hover{color:var(--text);background:var(--bg-hover)}
|
|
1132
|
+
@media(hover:hover){#infoBar #infoArchiveBtn:hover{color:var(--text);background:var(--bg-hover)}}
|
|
1100
1133
|
#infoBar #infoDeleteBtn{background:transparent;color:var(--text-muted);border:1px solid transparent}
|
|
1101
|
-
#infoBar #infoDeleteBtn:hover{color:var(--on-solid);background:var(--danger-bg);border-color:var(--danger-bg)}
|
|
1102
|
-
/* The composer folded away (composer_grip.js, composer.css): the info bar is the page's bottom edge; the plugins' setup row folds with it.
|
|
1103
|
-
Stop turn comes into the bar while folded and a turn runs. */
|
|
1134
|
+
@media(hover:hover){#infoBar #infoDeleteBtn:hover{color:var(--on-solid);background:var(--danger-bg);border-color:var(--danger-bg)}}
|
|
1135
|
+
/* The composer folded away (composer_grip.js, composer.css): the info bar is the page's bottom edge; the plugins' setup row folds with it. */
|
|
1104
1136
|
body.has-session.composer-folded #initRow{display:none}
|
|
1105
1137
|
body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
1106
|
-
#infoBar #infoCancelBtn{background:var(--bg-raised);color:var(--danger-text);border:1px solid color-mix(in srgb,var(--danger) 55%,transparent)}
|
|
1107
|
-
#infoBar #infoCancelBtn:hover:not(:disabled){color:var(--on-solid);background:var(--danger-bg);border-color:var(--danger-bg)}
|
|
1108
1138
|
/* The ⚙ chip (settings_chip.js): a model-like chip that opens the session's settings panel; accent when the session set its own (capped like the model chip in the min-width:601px rule above, the full text in its tooltip; a phone shows ⚙ with a dot). */
|
|
1109
1139
|
#infoBar .meta .settings-chip{position:relative;padding:2px 6px;border-radius:6px;font-size:11px;font-weight:400;border:1px solid transparent;cursor:pointer;font-family:inherit;white-space:nowrap}
|
|
1110
|
-
#infoBar .meta .settings-chip:hover{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}
|
|
1140
|
+
#infoBar .meta .settings-chip[aria-expanded="true"]{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}@media(hover:hover){#infoBar .meta .settings-chip:hover{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}}
|
|
1111
1141
|
#infoBar .meta .settings-chip.own{color:var(--accent);border-color:var(--accent-border)}
|
|
1112
1142
|
/* A chip's icon (⚙ here, the start page's own SVG from composer.css): the glyph stays the text, the mask draws it. */
|
|
1113
1143
|
#infoBar .meta :is(.settings-chip,.tools-chip){display:inline-flex;align-items:center;gap:4px}
|
|
@@ -1125,14 +1155,8 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1125
1155
|
/* Attached context (context_chips.js): a row of its own under the meta; not the composer's #chips/.chip. */
|
|
1126
1156
|
#contextChips{order:5;flex-basis:100%;display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-width:0}
|
|
1127
1157
|
#contextChips[hidden]{display:none}
|
|
1128
|
-
#contextChips.only-add{flex-basis:auto}
|
|
1129
|
-
#infoBar .ctx-chip.ctx-add{border-style:dashed;color:var(--text-muted);background:transparent}
|
|
1130
|
-
.ctx-add-form{display:flex;flex-direction:column;gap:6px;margin:0}
|
|
1131
|
-
.ctx-add-form .ctx-pop-head strong{font-family:inherit}
|
|
1132
|
-
.ctx-add-input{width:100%;box-sizing:border-box;padding:6px 8px;border-radius:7px;border:1px solid var(--border-strong);background:var(--bg-inset);color:var(--text);font:inherit;font-size:13px;line-height:1.4}
|
|
1133
|
-
.ctx-add-input:focus{outline:none;border-color:var(--accent-border)}
|
|
1134
1158
|
#infoBar .ctx-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:999px;font:600 11px/1.5 ui-monospace,monospace;background:color-mix(in srgb,var(--bg-hover) 55%,transparent);color:var(--text-3);border:1px solid var(--border-strong);white-space:nowrap}
|
|
1135
|
-
#infoBar .ctx-chip:hover
|
|
1159
|
+
#infoBar .ctx-chip.open{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}@media(hover:hover){#infoBar .ctx-chip:hover{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}}
|
|
1136
1160
|
#infoBar .ctx-chip.empty{color:var(--text-faint);border-style:dashed}
|
|
1137
1161
|
#infoBar .ctx-chip.error{color:var(--danger-text);border-color:color-mix(in srgb,var(--danger) 55%,transparent);background:var(--danger-bg-dim)}
|
|
1138
1162
|
.ctx-dot{width:7px;height:7px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 2px var(--accent-ring)}
|
|
@@ -1140,7 +1164,7 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1140
1164
|
.ctx-popover[hidden]{display:none}
|
|
1141
1165
|
/* The participants chip (info bar) and its panel (participants_panel.js). */
|
|
1142
1166
|
#infoBar .meta .participants-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 7px;border:1px solid transparent;cursor:pointer;font-family:inherit;font-weight:400;white-space:nowrap}
|
|
1143
|
-
#infoBar .meta .participants-chip:hover{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}
|
|
1167
|
+
#infoBar .meta .participants-chip[aria-expanded="true"]{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}@media(hover:hover){#infoBar .meta .participants-chip:hover{color:var(--text);border-color:var(--accent-border);background:var(--accent-bg)}}
|
|
1144
1168
|
#infoBar .meta .participants-chip.none{color:var(--text-muted);background:transparent;border-color:var(--border)}
|
|
1145
1169
|
#infoBar .meta .participants-chip.none .pc-dot{display:none}
|
|
1146
1170
|
.participants-chip .pc-dot{width:7px;height:7px;border-radius:50%;background:var(--text-faint)}
|
|
@@ -1159,7 +1183,7 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1159
1183
|
.pp-capped{color:var(--warn-text);font-weight:600}
|
|
1160
1184
|
.pp-actions{grid-column:2;grid-row:1/3;display:flex;align-items:center;gap:4px}
|
|
1161
1185
|
.pp-actions button,.pp-invite button,.pp-link button,.pp-foot button{padding:3px 9px;border-radius:6px;font-size:12px;background:var(--bg-raised);color:var(--text-2);border:1px solid var(--border-strong);cursor:pointer}
|
|
1162
|
-
.pp-actions button:hover,.pp-invite button:hover,.pp-link button:hover,.pp-foot button:hover{color:var(--text-hover)}
|
|
1186
|
+
@media(hover:hover){.pp-actions button:hover,.pp-invite button:hover,.pp-link button:hover,.pp-foot button:hover{color:var(--text-hover)}}
|
|
1163
1187
|
.pp-actions .pp-revoke{color:var(--danger-text)}
|
|
1164
1188
|
.pp-cap-form{display:flex;gap:4px}
|
|
1165
1189
|
.pp-cap-form input{width:58px}
|
|
@@ -1201,8 +1225,8 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1201
1225
|
.sset-back{margin:0 2px 0 -6px;padding:0 6px;border:0;border-radius:5px;background:transparent;color:var(--text-muted);font-size:18px;line-height:1}
|
|
1202
1226
|
.sset-back:hover{filter:none}
|
|
1203
1227
|
.start-settings.sheet{border-radius:14px;padding:14px 16px}
|
|
1204
|
-
/* Tints only where a pointer hovers: on a touch screen a tapped control would keep it
|
|
1205
|
-
|
|
1228
|
+
/* Tints only where a pointer hovers: on a touch screen a tapped control would keep it. Every popover's (chip_popover.js)
|
|
1229
|
+
controls and its opener's :hover tint sit in @media(hover:hover); an open opener shows it by aria-expanded instead. */
|
|
1206
1230
|
@media(hover:hover){.sset-seg button:hover{color:var(--text);border-color:var(--accent-border)}.sset-link:hover{background:var(--accent-bg)}.sset-back:hover{color:var(--text);background:var(--bg-hover)}.st-row:hover{color:var(--text);background:var(--bg-hover)}}
|
|
1207
1231
|
@media(max-width:400px){.sset-row{flex-direction:column;gap:4px}.sset-label{flex:none;line-height:1.4}.sset-ctx-more,.sset-ctx-form{margin-left:0}}
|
|
1208
1232
|
@media(pointer:coarse){.sset-seg button{height:36px;min-height:36px;line-height:34px;padding:0 12px;font-size:13px}.sset-link,.sset-back{min-height:36px}.sset-label{line-height:36px}}
|
|
@@ -1230,7 +1254,7 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1230
1254
|
.participants-popover.sheet .pp-qr{display:none}
|
|
1231
1255
|
.pp-foot{display:flex;align-items:center;gap:8px;justify-content:flex-end;padding-top:4px}
|
|
1232
1256
|
.pp-view{font-size:12px;color:var(--accent);text-decoration:none}
|
|
1233
|
-
.pp-view:hover{text-decoration:underline}
|
|
1257
|
+
@media(hover:hover){.pp-view:hover{text-decoration:underline}}
|
|
1234
1258
|
/* The Home Screen app's notifications sheet (push_devices.js): the bell opens it; a bottom sheet on a phone. */
|
|
1235
1259
|
.push-devices .ctx-pop-head strong{font-family:inherit}
|
|
1236
1260
|
.push-devices.sheet{border-radius:14px;padding:14px 16px;font-size:14px}
|
|
@@ -1244,7 +1268,7 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1244
1268
|
.pd-error{color:var(--danger-text)}
|
|
1245
1269
|
.pd-done{grid-column:1/3;display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:4px;padding-top:6px;border-top:1px solid var(--border);font-size:12px;color:var(--text-3)}
|
|
1246
1270
|
.pd-remove{padding:3px 10px;border-radius:7px;font-size:12px;background:var(--bg-raised);color:var(--danger-text);border:1px solid var(--border-strong);cursor:pointer}
|
|
1247
|
-
.pd-remove:hover{color:var(--text-hover)}
|
|
1271
|
+
@media(hover:hover){.pd-remove:hover{color:var(--text-hover)}}
|
|
1248
1272
|
.pd-switch{appearance:none;-webkit-appearance:none;position:relative;flex-shrink:0;width:34px;height:20px;margin:0;border-radius:999px;background:var(--bg-raised);border:1px solid var(--border-strong);cursor:pointer;transition:background .15s}
|
|
1249
1273
|
.pd-switch::after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--text-muted);transition:transform .15s,background .15s}
|
|
1250
1274
|
.pd-switch:checked{background:var(--accent-strong);border-color:var(--accent-strong)}
|
|
@@ -1272,9 +1296,9 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1272
1296
|
.ss-note,.ss-more{font-size:11.5px;color:var(--text-muted)}
|
|
1273
1297
|
.ss-acts{display:flex;gap:8px;flex-wrap:wrap}
|
|
1274
1298
|
.ss-acts button{padding:8px 12px;border-radius:8px;font-size:13px;cursor:pointer;border:1px solid var(--border-strong);background:var(--bg-raised);color:var(--text-2)}
|
|
1275
|
-
.ss-acts button:hover{background:var(--bg-hover);color:var(--text-hover)}
|
|
1299
|
+
@media(hover:hover){.ss-acts button:hover{background:var(--bg-hover);color:var(--text-hover)}}
|
|
1276
1300
|
.ss-stop-all{background:var(--warn-bg);border-color:var(--warn-border);color:var(--warn-text)}
|
|
1277
|
-
.ss-stop-all:hover{background:var(--warn-border);color:var(--text-hover)}
|
|
1301
|
+
@media(hover:hover){.ss-stop-all:hover{background:var(--warn-border);color:var(--text-hover)}}
|
|
1278
1302
|
.ss-cancel{background:transparent}
|
|
1279
1303
|
.stop-sheet.sheet .ss-acts button{flex:1 1 auto;font-size:14px;padding:10px 12px}
|
|
1280
1304
|
.ss-foot{font-size:11.5px;color:var(--text-muted);margin-top:6px}
|
|
@@ -1299,7 +1323,7 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1299
1323
|
@media(max-width:600px){#updateSheet{position:fixed;inset:auto 8px 8px;width:auto;max-width:none;max-height:min(80dvh,calc(100dvh - 16px));margin:0}}
|
|
1300
1324
|
.ctx-pop-kind{font-size:11px;color:var(--text-muted)}
|
|
1301
1325
|
.ctx-pop-close{margin-left:auto;padding:0 6px;border:none;background:transparent;color:var(--text-muted);font-size:16px;line-height:1}
|
|
1302
|
-
.ctx-pop-close:hover{color:var(--text)}
|
|
1326
|
+
@media(hover:hover){.ctx-pop-close:hover{color:var(--text)}}
|
|
1303
1327
|
/* A finger's × (the other sheet controls are 36-40 px): the negative margins keep the head's height. */
|
|
1304
1328
|
@media(pointer:coarse){.ctx-pop-close{min-width:36px;min-height:36px;margin:-10px -10px -10px auto;font-size:18px}}
|
|
1305
1329
|
.ctx-pop-why{color:var(--text)}
|
|
@@ -1310,15 +1334,18 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1310
1334
|
.ctx-pop-text{margin:0;max-height:240px;overflow:auto;padding:8px;border-radius:8px;background:var(--bg-inset);font:12px/1.45 ui-monospace,monospace;white-space:pre-wrap;word-break:break-word;color:var(--text-2)}
|
|
1311
1335
|
.ctx-pop-actions{display:flex;gap:8px;justify-content:flex-end}
|
|
1312
1336
|
.ctx-pop-actions button{padding:3px 10px;border-radius:7px;font-size:12px;font-weight:600;background:var(--bg-raised);color:var(--text-2);border:1px solid var(--border-strong)}
|
|
1313
|
-
.ctx-pop-actions button:hover{color:var(--text-hover)}
|
|
1337
|
+
@media(hover:hover){.ctx-pop-actions button:hover{color:var(--text-hover)}}
|
|
1314
1338
|
.ctx-pop-actions .ctx-pop-detach{color:var(--text-muted);background:transparent}
|
|
1315
|
-
.ctx-pop-actions .ctx-pop-detach:hover{color:var(--danger-text);border-color:color-mix(in srgb,var(--danger) 55%,transparent)}
|
|
1339
|
+
@media(hover:hover){.ctx-pop-actions .ctx-pop-detach:hover{color:var(--danger-text);border-color:color-mix(in srgb,var(--danger) 55%,transparent)}}
|
|
1316
1340
|
/* Phones: the footer is one line; its meta scrolls sideways (all of it stays reachable). */
|
|
1317
1341
|
@media(max-width:600px){
|
|
1318
1342
|
#infoBar{flex-wrap:nowrap;align-items:center;gap:6px;padding:6px 10px 8px}
|
|
1319
1343
|
#infoBar .meta{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;white-space:nowrap}
|
|
1320
1344
|
#infoBar .meta::-webkit-scrollbar{display:none}
|
|
1321
|
-
#infoBar .meta>*{flex-shrink:0}
|
|
1345
|
+
#infoBar .meta>*,#infoBar .meta .bar-group>*{flex-shrink:0}
|
|
1346
|
+
/* One scrolling run, as before the groups: their chips are the meta's (the orders below reach across them). */
|
|
1347
|
+
#infoBar .meta .bar-group{display:contents}
|
|
1348
|
+
#infoBar .meta .bar-sep{display:none}
|
|
1322
1349
|
#infoBar .meta .id{order:-2}
|
|
1323
1350
|
#infoBar .meta .status{order:-1}
|
|
1324
1351
|
/* ⚙ alone, the start page's dot when the session set its own (its values in the tooltip and accessible name). */
|
|
@@ -1331,11 +1358,11 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1331
1358
|
#infoBar .meta .children-chip{order:-1}
|
|
1332
1359
|
/* A chain's ← → links too: the way to the other days. */
|
|
1333
1360
|
#infoBar .meta .chain-link{order:-1}
|
|
1361
|
+
/* ⚙ too (an icon here): after the model chip a long model name would push it out of sight. */
|
|
1362
|
+
#infoBar .meta .settings-chip{order:-1}
|
|
1334
1363
|
/* The chips get a second line of their own (only when there are some), scrolling sideways. */
|
|
1335
1364
|
#infoBar:has(#contextChips:not([hidden])){flex-wrap:wrap;row-gap:4px}
|
|
1336
1365
|
#contextChips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
|
|
1337
|
-
/* The meta scrolls here: a lone "+ URL" would take its width, so it gets the row too. */
|
|
1338
|
-
#contextChips.only-add{flex-basis:100%}
|
|
1339
1366
|
#contextChips::-webkit-scrollbar{display:none}
|
|
1340
1367
|
#contextChips>*{flex-shrink:0}
|
|
1341
1368
|
#infoBar button{padding:4px 8px}
|
|
@@ -1345,7 +1372,6 @@ body.has-session.composer-folded #infoBar{border-top-color:transparent}
|
|
|
1345
1372
|
#infoBar #infoArchiveBtn{--icon:var(--icon-archive)}
|
|
1346
1373
|
#infoBar #infoArchiveBtn.archived{--icon:var(--icon-unarchive)}
|
|
1347
1374
|
#infoBar #infoContinueBtn{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 8h9M8.5 4.5 12 8l-3.5 3.5'/%3E%3C/svg%3E")}
|
|
1348
|
-
#infoBar #infoCancelBtn{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='8' height='8' rx='1.5'/%3E%3C/svg%3E")}
|
|
1349
1375
|
#infoBar #infoStopBtn{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 2v5.5M4.6 4.4a5 5 0 1 0 6.8 0'/%3E%3C/svg%3E")}
|
|
1350
1376
|
#infoBar #infoDeleteBtn{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 4.5h11M6 4.5V2.75h4V4.5M4 4.5l.7 8.6a1 1 0 0 0 1 .9h4.6a1 1 0 0 0 1-.9l.7-8.6M6.75 7.25v4.5M9.25 7.25v4.5'/%3E%3C/svg%3E")}
|
|
1351
1377
|
}
|
|
@@ -1383,7 +1409,7 @@ body.has-session #newBtn .brand-new{display:inline}
|
|
|
1383
1409
|
.project-picker .ctx-pop-head strong{font-family:inherit}
|
|
1384
1410
|
.project-list{display:flex;flex-direction:column;gap:6px;margin:2px 0;padding:0}
|
|
1385
1411
|
.project-row{display:flex;align-items:center;gap:12px;padding:8px 10px;border:1px solid transparent;border-radius:9px;background:var(--bg-inset);color:var(--text);text-decoration:none}
|
|
1386
|
-
.project-row:hover{background:var(--bg-hover);color:var(--text-hover)}
|
|
1412
|
+
@media(hover:hover){.project-row:hover{background:var(--bg-hover);color:var(--text-hover)}}
|
|
1387
1413
|
.project-row:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
|
|
1388
1414
|
.project-row[aria-current="page"]{border-color:var(--accent-border);background:var(--accent-bg)}
|
|
1389
1415
|
.project-main{display:flex;flex:1;align-items:center;gap:7px;min-width:0;flex-wrap:wrap}
|
|
@@ -1401,6 +1427,8 @@ body.has-session #newBtn .brand-new{display:inline}
|
|
|
1401
1427
|
body.has-session #scope .scope-where{display:none}
|
|
1402
1428
|
/* A phone has no room for both; the hidden strip's pill (count, live) wins. */
|
|
1403
1429
|
@media(max-width:600px){body.strip-hidden #scope .scope-where{display:none}}
|
|
1430
|
+
/* The all view's header takes the bar's right end: where a new session starts is the start page's line, not this view's. */
|
|
1431
|
+
body.all-view #scope .scope-where{display:none}
|
|
1404
1432
|
/* A phone's top bar stays one row: "chi +" (the rest of "+ new session" goes),
|
|
1405
1433
|
tighter gaps, nothing wraps, and the "← project" link cuts with an
|
|
1406
1434
|
ellipsis before the pill does. */
|
|
@@ -1421,7 +1449,7 @@ body.has-session #scope .scope-where{display:none}
|
|
|
1421
1449
|
#sessionTitle{flex:0 1 auto;min-width:0;font-size:13px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
1422
1450
|
/* The title's ✎ (the top bar's and the active strip card's): quiet, the text's colour on hover. */
|
|
1423
1451
|
.title-rename,.card-rename{flex-shrink:0;min-height:0;padding:0 5px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--text-muted);font-size:13px;line-height:20px;cursor:pointer}
|
|
1424
|
-
.title-rename:hover,.card-rename:hover{color:var(--text);background:var(--bg-hover)}
|
|
1452
|
+
@media(hover:hover){.title-rename:hover,.card-rename:hover{color:var(--text);background:var(--bg-hover)}}
|
|
1425
1453
|
.title-rename[hidden]{display:none}
|
|
1426
1454
|
/* The rename input (session_rename.js): fixed over the title row it renames, at the end of body (the strip draws its cards
|
|
1427
1455
|
anew on every session event); above the selection bar (20), under the popovers (40). */
|
|
@@ -1440,12 +1468,16 @@ body.has-session #scope .scope-where{display:none}
|
|
|
1440
1468
|
.title-rename{font-size:12px;line-height:18px}
|
|
1441
1469
|
#scope,#stripStatus{flex:1 1 0;min-width:0;max-width:max-content}
|
|
1442
1470
|
#stripStatus{flex-grow:1000;overflow:hidden;text-overflow:ellipsis}
|
|
1443
|
-
|
|
1471
|
+
/* A session page: the chip gives way to the pill. The start page has the "new session in …" path beside the chip:
|
|
1472
|
+
there the chip keeps its words and the path is what cuts. */
|
|
1473
|
+
body.has-session #scope .scope-name{flex-shrink:1;min-width:0}
|
|
1474
|
+
body:not(.has-session) #scope .scope-name,body:not(.has-session) #scope .scope-back{flex-shrink:0}
|
|
1475
|
+
body:not(.has-session) #scope .scope-where{flex:1 1 auto;min-width:0}
|
|
1444
1476
|
#stripStatus:has(.live,.waiting) .pill-count{display:none}
|
|
1445
1477
|
}
|
|
1446
1478
|
#notifyBtn{margin-left:auto;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;min-height:0;background:transparent;border:1px solid transparent;border-radius:999px;color:var(--text-muted)}
|
|
1447
1479
|
#notifyBtn[hidden]{display:none}
|
|
1448
|
-
#notifyBtn:hover{color:var(--text-2);border-color:var(--border)}
|
|
1480
|
+
@media(hover:hover){#notifyBtn:hover{color:var(--text-2);border-color:var(--border)}}
|
|
1449
1481
|
#notifyBtn svg{fill:none;stroke:currentColor;stroke-width:1.3;stroke-linejoin:round;stroke-linecap:round}
|
|
1450
1482
|
#notifyBtn .slash{display:none}
|
|
1451
1483
|
#notifyBtn[data-state="on"]{color:var(--accent)}
|
|
@@ -1466,7 +1498,7 @@ body.no-glass :is(#familyPop,#chainPop){background:var(--bg-panel);-webkit-backd
|
|
|
1466
1498
|
/* A chain's chip (chains.js): the card is the latest link of a session chain; a click lists the other links in a popover. */
|
|
1467
1499
|
.card .meta:has(.chain-chip){flex-wrap:wrap;row-gap:4px}
|
|
1468
1500
|
.card .chain-chip{font-family:ui-monospace,monospace;font-size:11px;line-height:1.4;white-space:nowrap;flex-shrink:0;padding:1px 7px;border-radius:999px;border:1px solid var(--accent-border);background:var(--accent-tint);color:var(--accent);cursor:pointer}
|
|
1469
|
-
.card .chain-chip:hover:not(:disabled){filter:none
|
|
1501
|
+
.card .chain-chip:hover:not(:disabled){filter:none}@media(hover:hover){.card .chain-chip:hover:not(:disabled){border-color:var(--accent);background:var(--accent-bg)}}
|
|
1470
1502
|
.card .chain-chip[aria-expanded="true"]{background:var(--accent-bg);border-color:var(--accent)}
|
|
1471
1503
|
.card .chain-chip.waiting{color:var(--warn-text);background:var(--warn-bg);border-color:var(--warn-border)}
|
|
1472
1504
|
.chain-chip .cc-arrow{display:inline-block;margin-right:4px}
|
|
@@ -1478,9 +1510,12 @@ body.no-glass :is(#familyPop,#chainPop){background:var(--bg-panel);-webkit-backd
|
|
|
1478
1510
|
.chain-rows:has(.cr-date.timed) .cr-date{min-width:16ch}
|
|
1479
1511
|
/* The session page's links to the previous and the next link of its chain. */
|
|
1480
1512
|
#infoBar .meta a.chain-link{text-decoration:none;font-family:ui-monospace,monospace;white-space:nowrap;color:var(--accent)}
|
|
1481
|
-
#infoBar .meta a.chain-link:hover{background:var(--accent-bg)}
|
|
1482
|
-
|
|
1483
|
-
#infoBar #infoContinueBtn:
|
|
1513
|
+
@media(hover:hover){#infoBar .meta a.chain-link:hover{background:var(--accent-bg)}}
|
|
1514
|
+
/* continue → is a plain ghost like archive; on an archived session, where it is the thing to do, the accent (app.js updateInfoBar). */
|
|
1515
|
+
#infoBar #infoContinueBtn{background:transparent;color:var(--text-muted);border:1px solid var(--border-strong)}
|
|
1516
|
+
#infoBar #infoContinueBtn:hover:not(:disabled){color:var(--text);background:var(--bg-hover)}
|
|
1517
|
+
#infoBar #infoContinueBtn.accent{background:var(--bg-raised);color:var(--accent);border-color:var(--accent-border)}
|
|
1518
|
+
#infoBar #infoContinueBtn.accent:hover:not(:disabled){background:var(--accent-bg)}
|
|
1484
1519
|
#infoBar #infoContinueBtn:disabled{opacity:.7;cursor:progress}
|
|
1485
1520
|
/* A continue refused for open delegates: the toast names them, each a link. */
|
|
1486
1521
|
#toast .continue-refused ul{margin:4px 0 0;padding-left:18px}
|
|
@@ -1489,9 +1524,9 @@ body.no-glass :is(#familyPop,#chainPop){background:var(--bg-panel);-webkit-backd
|
|
|
1489
1524
|
/* A card with a family chip lets its meta row wrap: the chip goes to a line of its own when the card is narrow. */
|
|
1490
1525
|
.card .meta:has(.family-chip){flex-wrap:wrap;row-gap:4px}
|
|
1491
1526
|
.card .family-chip{font-family:ui-monospace,monospace;font-size:11px;line-height:1.4;white-space:nowrap;flex-shrink:0;padding:1px 7px;border-radius:999px;border:1px solid var(--border-strong);background:transparent;color:var(--text-3);cursor:pointer}
|
|
1492
|
-
.card .family-chip:hover:not(:disabled){filter:none
|
|
1527
|
+
.card .family-chip:hover:not(:disabled){filter:none}@media(hover:hover){.card .family-chip:hover:not(:disabled){color:var(--accent);border-color:var(--accent-border);background:var(--accent-bg)}}
|
|
1493
1528
|
.card .family-chip.waiting{color:var(--warn-text);background:var(--warn-bg);border-color:var(--warn-border)}
|
|
1494
|
-
.card .family-chip.waiting:hover:not(:disabled){color:var(--warn-bright);border-color:var(--warn);background:var(--warn-bg)}
|
|
1529
|
+
@media(hover:hover){.card .family-chip.waiting:hover:not(:disabled){color:var(--warn-bright);border-color:var(--warn);background:var(--warn-bg)}}
|
|
1495
1530
|
.family-chip .fc-arrow{display:inline-block;margin-right:4px;transition:transform .15s ease}
|
|
1496
1531
|
.family-chip[aria-expanded="true"] .fc-arrow{transform:rotate(90deg)}
|
|
1497
1532
|
.family-chip .live-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--ok);margin-right:3px;vertical-align:1px}
|
|
@@ -1499,7 +1534,7 @@ body.no-glass :is(#familyPop,#chainPop){background:var(--bg-panel);-webkit-backd
|
|
|
1499
1534
|
/* The family's list: one compact row per delegate, indented per depth. */
|
|
1500
1535
|
.family-rows{display:flex;flex-direction:column;gap:1px;border-top:1px solid var(--border);margin:2px -6px 0;padding-top:4px;cursor:default}
|
|
1501
1536
|
.family-row{display:flex;align-items:center;border-radius:6px;padding-left:calc((var(--depth,1) - 1) * 14px)}
|
|
1502
|
-
.family-row:hover{background:var(--bg-hover)}
|
|
1537
|
+
@media(hover:hover){.family-row:hover{background:var(--bg-hover)}}
|
|
1503
1538
|
.family-row .fr-open{flex:1;min-width:0;display:flex;align-items:center;gap:6px;padding:6px;background:transparent;color:var(--text-2);border-radius:6px;font-size:12px;line-height:1.3;text-align:left}
|
|
1504
1539
|
.family-row .fr-open:hover:not(:disabled){filter:none}
|
|
1505
1540
|
.family-row .fr-preview{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
@@ -1531,7 +1566,12 @@ body.no-glass :is(#familyPop,#chainPop){background:var(--bg-panel);-webkit-backd
|
|
|
1531
1566
|
#stripStatus{min-height:30px;padding:4px 12px;font-size:12px}
|
|
1532
1567
|
}
|
|
1533
1568
|
body.strip-hidden #stripStatus{display:block}
|
|
1534
|
-
body.strip-hidden #topStrip
|
|
1569
|
+
body.strip-hidden #topStrip{display:none}
|
|
1570
|
+
/* In the all view the pill is the view's own button, pressed (app.js applyView), whatever the strip's state: a click goes
|
|
1571
|
+
back to the chat (lists_view.js), as Esc does. */
|
|
1572
|
+
body.all-view #stripStatus{display:block}
|
|
1573
|
+
.strip-toggle[aria-pressed="true"]{color:var(--accent);background:var(--accent-bg);border-color:var(--accent-border)}
|
|
1574
|
+
.strip-toggle[aria-pressed="true"]:hover{color:var(--accent);border-color:var(--accent)}
|
|
1535
1575
|
/* The strip's grip (strip_grip.js, app.js): the handle on the edge between the
|
|
1536
1576
|
strip and the chat, the composer's twin (the shared .edge-grip look, its own
|
|
1537
1577
|
10 px box). Its box is centred on #center's top edge: main's 16 px gap stands
|
|
@@ -1562,18 +1602,27 @@ body.all-view #stripGrip{display:none}
|
|
|
1562
1602
|
#allView{display:none;flex:1;min-height:0;flex-direction:column;gap:12px}
|
|
1563
1603
|
body.all-view #allView{display:flex}
|
|
1564
1604
|
body.all-view #center, body.all-view #topStrip{display:none}
|
|
1565
|
-
|
|
1605
|
+
/* All sessions' header sits in the top bar (before the bell, at its right end), shown in the all view alone: the search as a
|
|
1606
|
+
pill at chip height, the count, the archived toggle, Select. Its own auto margin pushes it right; the bell drops its own
|
|
1607
|
+
there (two auto margins would split the space). */
|
|
1608
|
+
#allHead{display:none;margin-left:auto;gap:8px;align-items:center;min-width:0;flex-wrap:nowrap;justify-content:flex-end}
|
|
1609
|
+
body.all-view #allHead{display:flex}
|
|
1610
|
+
@media(min-width:601px){body.all-view #notifyBtn{margin-left:0}}
|
|
1566
1611
|
/* The search field is glass too (no shadow: it is a field, not a card); the focus ring below replaces the highlight. */
|
|
1567
|
-
#allHead input{flex:1;min-width:
|
|
1612
|
+
#allHead input{flex:0 1 240px;width:240px;min-width:90px;box-sizing:border-box;height:24px;background:var(--glass-bg);-webkit-backdrop-filter:blur(18px) saturate(1.35);backdrop-filter:blur(18px) saturate(1.35);border:1px solid var(--glass-border);box-shadow:inset 0 1px 0 var(--glass-highlight);color:var(--text);padding:2px 11px;border-radius:999px;font-size:12px}
|
|
1613
|
+
#allHead input::placeholder{color:var(--text-faint)}
|
|
1568
1614
|
#allHead input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-ring)}
|
|
1569
|
-
|
|
1615
|
+
/* Where the sessions are stored: a faint footer line under the list. */
|
|
1616
|
+
#allPath{position:relative;font-size:11px;color:var(--text-faint);margin-top:-32px;word-break:break-all}
|
|
1570
1617
|
#allPath[hidden]{display:none}
|
|
1571
|
-
#allPath code{font-family:ui-monospace,monospace;background:
|
|
1618
|
+
#allPath code{font-family:ui-monospace,monospace;background:transparent;padding:0}
|
|
1572
1619
|
#allHead .count{font-size:11px;color:var(--text-muted);white-space:nowrap;font-variant-numeric:tabular-nums}
|
|
1573
|
-
#allHead #selectBtn{padding:
|
|
1620
|
+
#allHead #selectBtn{padding:3px 8px;min-height:0;font-size:12px;background:transparent;color:var(--text-muted)}
|
|
1621
|
+
#allHead #selectBtn:hover{filter:none;color:var(--text-2)}
|
|
1622
|
+
#includeArchived{white-space:nowrap}
|
|
1574
1623
|
#selectBar{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
|
|
1575
1624
|
#selectBar[hidden],#selectBtn[hidden],#selectBar [hidden]{display:none}
|
|
1576
|
-
#selectBar button{padding:
|
|
1625
|
+
#selectBar button{padding:3px 9px;min-height:0;font-size:12px;white-space:nowrap}
|
|
1577
1626
|
#selectBar button:disabled{opacity:.5;cursor:default}
|
|
1578
1627
|
#selectCount{font-size:12px;color:var(--text-2);white-space:nowrap;font-variant-numeric:tabular-nums;margin-right:2px}
|
|
1579
1628
|
/* Select mode: a checkbox at the card's top left; a pick wears its own outline (.active is the open session's). */
|
|
@@ -1581,8 +1630,9 @@ body.all-view #center, body.all-view #topStrip{display:none}
|
|
|
1581
1630
|
#allList .card-pick{position:absolute;top:13px;left:13px;width:16px;height:16px;margin:0;accent-color:var(--pick-border);cursor:pointer}
|
|
1582
1631
|
#allList .card.picked,#allList .card.picked:hover{border-color:var(--pick-border);box-shadow:inset 0 0 0 1px var(--pick-border),var(--glass-shadow);background:color-mix(in srgb,var(--pick-border) 9%,var(--glass-bg))}
|
|
1583
1632
|
.card .skip-reason{font-size:11px;line-height:1.35;color:var(--warn-text);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;word-break:break-word}
|
|
1584
|
-
|
|
1585
|
-
|
|
1633
|
+
/* A phone: the header is its own row under the bar (the chips stay in the first) and wraps inside it: the search
|
|
1634
|
+
takes the whole first line, so its placeholder reads, and the count, the archived toggle and Select the line under it. */
|
|
1635
|
+
@media(max-width:600px){#allHead{flex-basis:100%;order:20;margin-left:0;justify-content:flex-start;flex-wrap:wrap;row-gap:6px}#allHead input#filter{flex:1 1 100%;width:auto;min-width:0;height:30px;font-size:16px}#allHead.selecting .count{display:none}#selectBar{flex-basis:100%;order:5}#selectCount{flex-basis:100%}#allList .card-pick{width:20px;height:20px;top:12px;left:11px}}
|
|
1586
1636
|
.card.archived{opacity:.6}
|
|
1587
1637
|
.card.archived:hover{opacity:.85}
|
|
1588
1638
|
.card .archived-badge,.family-row .archived-badge{font-size:10px;padding:1px 6px;border-radius:6px;border:1px solid var(--border-strong);color:var(--text-muted)}
|
|
@@ -1595,8 +1645,12 @@ body.all-view #center, body.all-view #topStrip{display:none}
|
|
|
1595
1645
|
#toast .toast-close{background:transparent;border:0;color:var(--text-muted);cursor:pointer;padding:2px 4px;margin-left:-6px}
|
|
1596
1646
|
#toast .toast-close:hover{color:var(--text)}
|
|
1597
1647
|
/* Each row is as tall as its tallest card. An `auto` row in a grid that overflows its
|
|
1598
|
-
height has no free space to grow into, so it collapses to each card's min-height.
|
|
1599
|
-
|
|
1648
|
+
height has no free space to grow into, so it collapses to each card's min-height.
|
|
1649
|
+
As tall as its cards (it shrinks and scrolls past the view's height), so the storage line follows them; its bottom
|
|
1650
|
+
padding lets the cards' shadows fade out instead of ending in a hard edge, the storage line drawn over it (#allPath).
|
|
1651
|
+
The side padding is the same for the scroller's edges, where the glass shadow was cut into a band: the negative
|
|
1652
|
+
margin of the same size keeps the grid the width and place it had. */
|
|
1653
|
+
#allList{flex:0 1 auto;min-height:0;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;align-content:start;grid-auto-rows:max-content;margin:0 -14px;padding:2px 16px 26px}
|
|
1600
1654
|
.card.skeleton{pointer-events:none;border-style:dashed;opacity:.9;animation:skeleton-pulse 1.2s ease-in-out infinite}
|
|
1601
1655
|
.card.skeleton .line{height:10px;background:var(--bg-raised);border-radius:6px}
|
|
1602
1656
|
.card.skeleton .line.long{width:78%}
|
|
@@ -1604,7 +1658,7 @@ body.all-view #center, body.all-view #topStrip{display:none}
|
|
|
1604
1658
|
@keyframes skeleton-pulse{0%,100%{opacity:1}50%{opacity:.55}}
|
|
1605
1659
|
@keyframes fadeIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
|
|
1606
1660
|
/* Only a card new to its list fades in (lists_view.js enteringCards: every draw makes new nodes);
|
|
1607
|
-
--enter-delay carries a fade on across a redraw
|
|
1661
|
+
--enter-delay carries a fade on across a redraw. */
|
|
1608
1662
|
#topStrip:not(.loading) .card.entering, #allList .card.entering{animation:fadeIn .28s ease var(--enter-delay,0s)}
|
|
1609
1663
|
@media (prefers-reduced-motion:reduce){.card.entering{animation:none}}
|
|
1610
1664
|
.card{padding:12px;border-radius:10px;background:var(--bg-panel);border:1px solid var(--border);cursor:pointer;display:flex;flex-direction:column;gap:6px;min-height:72px}
|
|
@@ -1633,21 +1687,14 @@ body.all-view #center, body.all-view #topStrip{display:none}
|
|
|
1633
1687
|
#topStrip .card.active .card-rename{display:block}
|
|
1634
1688
|
.card .time{font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
1635
1689
|
.card .ctx{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--text-3)}
|
|
1636
|
-
|
|
1637
|
-
|
|
1690
|
+
/* An untitled session's title line: "Untitled", muted (its first message is the preview line under it). */
|
|
1691
|
+
.card .preview.untitled{color:var(--text-muted)}
|
|
1638
1692
|
.card .recap{font-size:12px;line-height:1.4;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:-2px 0 2px}
|
|
1639
1693
|
.card .meta{font-size:11px;color:var(--text-muted);display:flex;gap:6px;align-items:center}
|
|
1640
|
-
/*
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
.card .
|
|
1644
|
-
.card .dot.stopped,.family-row .dot.stopped{background:transparent;border:1px solid var(--text-faint)}
|
|
1645
|
-
.card .dot.completed,.family-row .dot.completed{background:var(--accent)}
|
|
1646
|
-
.card .dot.error,.family-row .dot.error{background:var(--danger)}
|
|
1647
|
-
@keyframes dot-pulse{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--ok) 55%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--ok) 0%,transparent)}}
|
|
1648
|
-
.card .dot.waiting,.family-row .dot.waiting{background:var(--warn);animation:attn-pulse 1.6s ease-in-out var(--pulse-delay,0s) infinite}
|
|
1649
|
-
@keyframes attn-pulse{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--warn) 60%,transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--warn) 0%,transparent)}}
|
|
1650
|
-
@media (prefers-reduced-motion:reduce){.card .dot.running,.card .dot.waiting,.family-row .dot.running,.family-row .dot.waiting{animation:none}}
|
|
1694
|
+
/* No status dots on cards or rows: one mark per state. A waiting card has its outline and its chip; an errored one says so in
|
|
1695
|
+
the danger colour; idle, completed and stopped are unmarked (the time says the rest). The .status.* pills below are the
|
|
1696
|
+
info bar's. */
|
|
1697
|
+
.card .error-badge,.family-row .error-badge{font-size:11px;font-weight:600;padding:1px 7px;border-radius:999px;white-space:nowrap;flex-shrink:0;background:var(--danger-bg-dim);color:var(--danger-text);border:1px solid color-mix(in srgb,var(--danger) 45%,transparent)}
|
|
1651
1698
|
.card .attn,.family-row .attn,.project-picker .attn{font-size:11px;font-weight:600;padding:1px 7px;border-radius:999px;white-space:nowrap;flex-shrink:0;background:var(--warn-bg);color:var(--warn-text);border:1px solid var(--warn-border)}
|
|
1652
1699
|
.card .stopped-badge,.family-row .stopped-badge{font-size:11px;font-weight:600;padding:1px 7px;border-radius:999px;white-space:nowrap;flex-shrink:0;background:var(--warn);color:var(--bg)}
|
|
1653
1700
|
.status.running{background:var(--ok-bg);color:var(--ok-text)}
|
|
@@ -1667,7 +1714,7 @@ a{color:var(--accent)}
|
|
|
1667
1714
|
fields in this list (stage.spec.js's phone step checks the visible ones). */
|
|
1668
1715
|
@media (max-width:600px),(pointer:coarse){
|
|
1669
1716
|
#composer textarea,.question-freeform,.continue-reason,.participants-popover input,.participants-popover select,
|
|
1670
|
-
.rs-form textarea,.pp-link input,.llmctx-field select,.llmctx-field input,.
|
|
1717
|
+
.rs-form textarea,.pp-link input,.llmctx-field select,.llmctx-field input,.ws-add-in,.rename-input,
|
|
1671
1718
|
#modelSearch{font-size:16px}
|
|
1672
1719
|
}
|
|
1673
1720
|
</style>
|
|
@@ -1679,6 +1726,19 @@ a{color:var(--accent)}
|
|
|
1679
1726
|
<div id="scope" hidden></div>
|
|
1680
1727
|
<button type="button" class="strip-toggle" id="stripStatus" title="All sessions, with search"><span class="pill-count">sessions</span></button>
|
|
1681
1728
|
<span id="sessionTitleRow" hidden><span id="sessionTitle"></span><button type="button" id="titleRenameBtn" class="title-rename" title="Rename this session" aria-label="Rename this session" hidden>✎</button></span>
|
|
1729
|
+
<div id="allHead">
|
|
1730
|
+
<input id="filter" type="search" placeholder="Search preview, id or status" aria-label="Search sessions" autocomplete="off">
|
|
1731
|
+
<span class="count" id="count"></span>
|
|
1732
|
+
<button type="button" class="strip-toggle" id="includeArchived" aria-pressed="false" title="Show archived sessions too">archived</button>
|
|
1733
|
+
<button class="ghost" id="selectBtn" title="Pick sessions to archive several at once">Select</button>
|
|
1734
|
+
<div id="selectBar" role="toolbar" aria-label="Selected sessions" hidden>
|
|
1735
|
+
<span id="selectCount" aria-live="polite"></span>
|
|
1736
|
+
<button class="ghost" id="selectAllBtn" title="Pick every session the search shows">Select all shown</button>
|
|
1737
|
+
<button id="batchArchiveBtn" title="Archive the picked sessions that are shown (their delegates too)">Archive 0</button>
|
|
1738
|
+
<button class="ghost" id="batchUnarchiveBtn" title="Unarchive the picked archived sessions that are shown" hidden>Unarchive 0</button>
|
|
1739
|
+
<button class="ghost" id="selectDoneBtn" title="Leave select mode (Esc)">Done</button>
|
|
1740
|
+
</div>
|
|
1741
|
+
</div>
|
|
1682
1742
|
<button type="button" id="notifyBtn" aria-label="Notifications" aria-pressed="false" hidden><svg viewBox="0 0 16 16" width="15" height="15" aria-hidden="true"><path class="bell" d="M8 1.75a4 4 0 0 0-4 4v2.6L2.75 10.6v.9h10.5v-.9L12 8.35v-2.6a4 4 0 0 0-4-4Z"/><path class="clapper" d="M6.5 13a1.5 1.5 0 0 0 3 0"/><path class="slash" d="M2.5 2.5l11 11"/></svg></button>
|
|
1683
1743
|
</div>
|
|
1684
1744
|
<section id="topStrip" aria-label="Latest sessions" class="loading"><div class="card skeleton"><div class="line long"></div><div class="meta"><span class="line tiny" style="display:inline-block"></span></div></div><div class="card skeleton"><div class="line long"></div><div class="meta"><span class="line tiny" style="display:inline-block"></span></div></div><div class="card skeleton"><div class="line long"></div><div class="meta"><span class="line tiny" style="display:inline-block"></span></div></div></section>
|
|
@@ -1706,15 +1766,14 @@ a{color:var(--accent)}
|
|
|
1706
1766
|
<div id="reviseChip" hidden></div>
|
|
1707
1767
|
<div id="chips" hidden></div>
|
|
1708
1768
|
<textarea id="prompt" placeholder="Ask chi anything…" aria-controls="commandList" aria-autocomplete="list" aria-expanded="false"></textarea>
|
|
1769
|
+
<div id="composeHint">Enter to start · Shift+Enter for a newline</div>
|
|
1709
1770
|
</div>
|
|
1710
1771
|
<div class="actions-col">
|
|
1711
1772
|
<button type="button" id="modelPick" class="model-pick" title="The model the new session starts on" aria-label="Model for the new session" aria-haspopup="listbox" aria-expanded="false" hidden><span class="model-pick-name"></span></button>
|
|
1712
|
-
<div id="composeHint">Enter to start · Shift+Enter for a newline</div>
|
|
1713
1773
|
<button type="button" id="thinkingNew" class="llmctx-new think-new" aria-haspopup="dialog" aria-expanded="false" hidden></button>
|
|
1714
1774
|
<button type="button" id="llmContextNew" class="llmctx-new" aria-haspopup="dialog" aria-expanded="false" hidden></button>
|
|
1715
1775
|
<button type="button" id="reviewNew" class="llmctx-new review-new" aria-haspopup="dialog" aria-expanded="false" hidden></button>
|
|
1716
1776
|
<button type="button" id="toolkitNew" class="llmctx-new toolkit-new" aria-haspopup="dialog" aria-expanded="false" hidden></button>
|
|
1717
|
-
<button id="cancelBtn" title="Cancel the running turn, whoever sent it" style="display:none">Stop turn</button>
|
|
1718
1777
|
<button type="button" id="settingsNew" class="icon-btn settings-btn" title="Session settings" aria-label="Session settings" aria-haspopup="dialog" aria-expanded="false" hidden></button>
|
|
1719
1778
|
<button type="button" id="toolkitBtn" class="icon-btn toolkit-btn" title="Toolkit" aria-label="Toolkit" aria-haspopup="dialog" aria-expanded="false" hidden></button>
|
|
1720
1779
|
<button type="button" id="attachBtn" class="attach-btn" title="Add images (or paste or drop them here)" aria-label="Add images" hidden></button>
|
|
@@ -1727,7 +1786,6 @@ a{color:var(--accent)}
|
|
|
1727
1786
|
<div id="infoBar" class="composer-card-foot">
|
|
1728
1787
|
<div class="info" id="infoText"></div>
|
|
1729
1788
|
<div id="contextChips" aria-label="Attached context" hidden></div>
|
|
1730
|
-
<button class="ghost" id="infoCancelBtn" title="Cancel the running turn, whoever sent it" style="display:none">Stop turn</button>
|
|
1731
1789
|
<button class="ghost" id="infoContinueBtn" title="Continue: start the next link of this session's chain from its recap (this one is archived)" style="display:none">continue →</button>
|
|
1732
1790
|
<button class="ghost" id="infoArchiveBtn" title="Archive: hide from the lists, keep for good" style="display:none">archive</button>
|
|
1733
1791
|
<button class="ghost" id="infoStopBtn" title="Stop session (terminate worker)" style="display:none">stop session</button>
|
|
@@ -1736,22 +1794,8 @@ a{color:var(--accent)}
|
|
|
1736
1794
|
</div>
|
|
1737
1795
|
</section>
|
|
1738
1796
|
<section id="allView" aria-label="All sessions">
|
|
1739
|
-
<div id="allHead">
|
|
1740
|
-
<button class="ghost" id="allBack" title="Back to the chat (Esc)">← Back</button>
|
|
1741
|
-
<input id="filter" type="search" placeholder="Search… (preview / id / status)" autocomplete="off">
|
|
1742
|
-
<label class="include-archived" title="Show archived sessions too"><input id="includeArchived" type="checkbox"> include archived</label>
|
|
1743
|
-
<span class="count" id="count"></span>
|
|
1744
|
-
<button class="ghost" id="selectBtn" title="Pick sessions to archive several at once">Select</button>
|
|
1745
|
-
<div id="selectBar" role="toolbar" aria-label="Selected sessions" hidden>
|
|
1746
|
-
<span id="selectCount" aria-live="polite"></span>
|
|
1747
|
-
<button class="ghost" id="selectAllBtn" title="Pick every session the search shows">Select all shown</button>
|
|
1748
|
-
<button id="batchArchiveBtn" title="Archive the picked sessions that are shown (their delegates too)">Archive 0</button>
|
|
1749
|
-
<button class="ghost" id="batchUnarchiveBtn" title="Unarchive the picked archived sessions that are shown" hidden>Unarchive 0</button>
|
|
1750
|
-
<button class="ghost" id="selectDoneBtn" title="Leave select mode (Esc)">Done</button>
|
|
1751
|
-
</div>
|
|
1752
|
-
</div>
|
|
1753
|
-
<div id="allPath" hidden>Stored in <code></code></div>
|
|
1754
1797
|
<div id="allList"></div>
|
|
1798
|
+
<div id="allPath" hidden>Stored in <code></code></div>
|
|
1755
1799
|
</section>
|
|
1756
1800
|
</main>
|
|
1757
1801
|
<dialog id="updateSheet" aria-labelledby="updateSheetTitle"></dialog>
|