@oddessentials/agent-guild 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/web/styles.css CHANGED
@@ -30,6 +30,11 @@
30
30
  --icon-github: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z'/%3E%3C/svg%3E");
31
31
  --icon-info: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 10.8v6.2' stroke-width='2.4'/%3E%3Ccircle cx='12' cy='7.3' r='1.2' fill='black' stroke='none'/%3E%3C/svg%3E");
32
32
  --icon-grip: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Ccircle cx='9' cy='5.5' r='1.9'/%3E%3Ccircle cx='15' cy='5.5' r='1.9'/%3E%3Ccircle cx='9' cy='12' r='1.9'/%3E%3Ccircle cx='15' cy='12' r='1.9'/%3E%3Ccircle cx='9' cy='18.5' r='1.9'/%3E%3Ccircle cx='15' cy='18.5' r='1.9'/%3E%3C/svg%3E");
33
+ --icon-gear: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='3.2'/%3E%3Cpath d='M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z'/%3E%3C/svg%3E");
34
+ --icon-menu: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'%3E%3Cpath d='M4 6.5h16M4 12h16M4 17.5h16'/%3E%3C/svg%3E");
35
+ --icon-close: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'%3E%3Cpath d='M6.5 6.5l11 11M17.5 6.5l-11 11'/%3E%3C/svg%3E");
36
+ --icon-split: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'%3E%3Crect x='3.5' y='4.5' width='17' height='15' rx='2'/%3E%3Cpath d='M12 4.5v15'/%3E%3C/svg%3E");
37
+ --icon-server: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='4' width='16' height='7' rx='1.5'/%3E%3Crect x='4' y='13' width='16' height='7' rx='1.5'/%3E%3Cpath d='M7.5 7.5h.01M7.5 16.5h.01'/%3E%3C/svg%3E");
33
38
  --icon-notes: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 4.5h14v9.5l-5.5 5.5H5z'/%3E%3Cpath d='M13.5 19.5V14H19M8.5 9h7M8.5 12.5h4'/%3E%3C/svg%3E");
34
39
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
35
40
  font-size: 15px;
@@ -82,7 +87,7 @@ code, pre { font-family: var(--font-mono); }
82
87
  .connection.ok .dot { --dot: var(--ok); }
83
88
  .connection.down .dot { --dot: var(--danger); }
84
89
 
85
- main { max-width: 1200px; margin: 0 auto; padding: 26px 16px 56px; display: grid; grid-template-columns: minmax(0, 1fr); gap: 34px; }
90
+ main { max-width: calc(1200px + var(--dock-space, 0px)); margin: 0 auto; padding: 26px calc(16px + var(--dock-space, 0px)) 56px 16px; display: grid; grid-template-columns: minmax(0, 1fr); gap: 34px; }
86
91
  .section-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
87
92
  .count { color: var(--muted); font-weight: 500; }
88
93
 
@@ -92,6 +97,28 @@ main { max-width: 1200px; margin: 0 auto; padding: 26px 16px 56px; display: grid
92
97
  background: var(--surface); color: var(--text); font: inherit; font-size: 0.9rem;
93
98
  }
94
99
  .cwd input:focus, .auth input:focus { outline: 2px solid var(--focus); outline-offset: 1px; }
100
+ .cwd > label { flex: none; }
101
+ .cwd-field { position: relative; display: flex; flex: 1; min-width: 0; }
102
+ .cwd-field input { width: 100%; padding-right: 76px; }
103
+ .cwd-tools { position: absolute; inset: 3px 3px 3px auto; display: flex; gap: 2px; }
104
+ .cwd-tool {
105
+ width: 32px; display: grid; place-items: center;
106
+ padding: 0; border: 1px solid transparent; border-radius: max(3px, calc(var(--radius) - 3px));
107
+ background: transparent; color: var(--muted); cursor: pointer;
108
+ }
109
+ .cwd-tool:hover:not(:disabled), .cwd-tool:focus-visible {
110
+ color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, transparent);
111
+ border-color: color-mix(in srgb, var(--accent) 28%, transparent);
112
+ }
113
+ .cwd-tool:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
114
+ .cwd-tool:active:not(:disabled) { background: color-mix(in srgb, var(--accent) 22%, transparent); }
115
+ .cwd-tool:disabled { opacity: 0.4; cursor: default; }
116
+ .cwd-tool[aria-busy="true"] { opacity: 0.7; cursor: progress; }
117
+ @media (pointer: coarse) {
118
+ .cwd-field input { min-height: 46px; padding-right: 94px; }
119
+ .cwd-tools { inset: 1px 1px 1px auto; gap: 0; }
120
+ .cwd-tool { width: 44px; }
121
+ }
95
122
 
96
123
  .providers { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; }
97
124
  .provider {
@@ -143,7 +170,7 @@ main { max-width: 1200px; margin: 0 auto; padding: 26px 16px 56px; display: grid
143
170
  font: inherit; font-size: 0.78rem; text-align: left; cursor: pointer;
144
171
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
145
172
  }
146
- .model-stats-head::after, .console-link::after, .appearance::after, .model-name::before, .provider .copies summary::before {
173
+ .model-stats-head::after, .console-link::after, .menu-button::after, .model-name::before, .provider .copies summary::before {
147
174
  content: ""; display: inline-block; flex: none; width: 0.75em; height: 0.75em; margin-left: 0.3em; vertical-align: -0.05em;
148
175
  background: currentColor; mask: var(--icon-chevron) center / contain no-repeat;
149
176
  }
@@ -338,34 +365,60 @@ main { max-width: 1200px; margin: 0 auto; padding: 26px 16px 56px; display: grid
338
365
  .btn.danger { color: var(--danger); }
339
366
  .btn.danger:hover { border-color: var(--danger); }
340
367
  .btn:disabled { opacity: 0.6; cursor: progress; }
341
- .stop-manager, .restart-manager, .appearance, .notes-open, .upgrade { white-space: nowrap; }
342
- .appearance::before, .notes-open::before, .appearance-menu .choice > span::before {
368
+ .menu-button, .notes-open, .github-toggle, .upgrade { white-space: nowrap; }
369
+ .settings::before, .manager::before, .notes-open::before, .github-toggle::before, .menu-toggle::before, .btn.split::before, .settings-menu .choice > span::before {
343
370
  content: ""; display: inline-block; width: 1em; height: 1em; margin-right: 0.4em; vertical-align: -0.15em;
344
371
  background: currentColor; mask: var(--icon-sun) center / contain no-repeat;
345
372
  }
346
- :root[data-theme="dark"] .appearance::before, .appearance-menu .choice > .mode-dark::before { mask-image: var(--icon-moon); }
347
- .appearance-menu .choice > .sound-alerts::before { mask-image: var(--icon-sound); }
348
- .appearance-menu .choice > .voice-input::before { mask-image: var(--icon-mic); }
373
+ .settings::before { mask-image: var(--icon-gear); }
374
+ .manager::before { mask-image: var(--icon-server); }
375
+ .github-toggle::before { mask-image: var(--icon-github); }
376
+ .menu-toggle::before { margin: 0; mask-image: var(--icon-menu); }
377
+ .btn.split::before { mask-image: var(--icon-split); }
378
+ .settings-menu .choice > .mode-dark::before { mask-image: var(--icon-moon); }
379
+ .settings-menu .choice > .sound-alerts::before { mask-image: var(--icon-sound); }
380
+ .settings-menu .choice > .voice-input::before { mask-image: var(--icon-mic); }
349
381
  .voice-note { margin: 0 8px 6px; max-width: 26ch; color: var(--muted); font-size: 0.75rem; line-height: 1.35; }
350
382
  .notes-open::before { mask-image: var(--icon-notes); }
351
- .appearance::after { margin-left: 0.45em; transform: rotate(90deg); transition: transform 0.15s var(--ease); }
352
- .appearance:has(+ :popover-open)::after { transform: rotate(-90deg); }
353
- .appearance-menu {
383
+ .notes-open[aria-pressed="true"], .github-toggle[aria-pressed="true"] { border-color: var(--accent); color: var(--accent); }
384
+ .menu-button::after { margin-left: 0.45em; transform: rotate(90deg); transition: transform 0.15s var(--ease); }
385
+ .menu-button:has(+ :popover-open)::after { transform: rotate(-90deg); }
386
+ .manager.pending { color: var(--warn); border-color: var(--warn); }
387
+ .menu {
354
388
  position: fixed; inset: auto; margin: 0; min-width: 190px; padding: 6px; display: none;
355
389
  border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); color: var(--text);
356
390
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.22); font-size: 0.85rem; overflow-y: auto;
357
391
  }
358
- .appearance-menu:popover-open { display: grid; gap: 4px; animation: fade-in 0.12s var(--ease); }
359
- .appearance-menu fieldset { margin: 0; padding: 0; border: 0; display: grid; }
360
- .appearance-menu fieldset + fieldset { padding-top: 4px; border-top: 1px solid var(--border); }
361
- .appearance-menu legend { padding: 6px 8px 4px; font-size: 0.72rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted); }
362
- .appearance-menu .choice { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: calc(var(--radius) - 2px); cursor: pointer; }
363
- .appearance-menu .choice:hover, .appearance-menu .choice:has(:focus-visible) { background: var(--surface-2); }
364
- .appearance-menu .choice:has(:focus-visible) { outline: 2px solid var(--focus); outline-offset: -2px; }
365
- .appearance-menu .choice input { margin: 0; accent-color: var(--accent-fill); }
366
- .appearance-menu .choice:has(:checked) { font-weight: 600; }
392
+ .menu:popover-open { display: grid; gap: 4px; animation: fade-in 0.12s var(--ease); }
393
+ .settings-menu fieldset { margin: 0; padding: 0; border: 0; display: grid; }
394
+ .settings-menu fieldset + fieldset { padding-top: 4px; border-top: 1px solid var(--border); }
395
+ .settings-menu legend { padding: 6px 8px 4px; font-size: 0.72rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted); }
396
+ .settings-menu .choice { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: calc(var(--radius) - 2px); cursor: pointer; }
397
+ .settings-menu .choice:hover, .settings-menu .choice:has(:focus-visible) { background: var(--surface-2); }
398
+ .settings-menu .choice:has(:focus-visible) { outline: 2px solid var(--focus); outline-offset: -2px; }
399
+ .settings-menu .choice input { margin: 0; accent-color: var(--accent-fill); }
400
+ .settings-menu .choice:has(:checked) { font-weight: 600; }
367
401
  #skin-choices .choice > span::before { content: none; }
368
- .btn.upgrade, .btn.restart-manager.pending { color: var(--warn); border-color: var(--warn); }
402
+ .menu-item {
403
+ display: block; width: 100%; padding: 7px 10px; border: 0; border-radius: calc(var(--radius) - 2px); background: none;
404
+ color: var(--text); font: inherit; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer;
405
+ }
406
+ .menu-item:hover, .menu-item:focus-visible { background: var(--surface-2); }
407
+ .menu-item:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
408
+ .menu-item.danger { color: var(--danger); }
409
+ .menu-item[aria-current="true"] { font-weight: 600; }
410
+ .menu-item .menu-note { display: block; color: var(--muted); font-size: 0.75rem; overflow: hidden; text-overflow: ellipsis; }
411
+ .btn.upgrade, .restart-manager.pending { color: var(--warn); border-color: var(--warn); }
412
+ .topbar-menu { min-width: 220px; }
413
+ .topbar-menu:popover-open { top: calc(var(--topbar-h, 56px) - 4px); right: 8px; max-height: calc(100dvh - var(--topbar-h, 56px) - 8px); }
414
+ .topbar-menu:popover-open > .btn { width: 100%; text-align: left; }
415
+ @media (min-width: 900px) {
416
+ .menu-toggle { display: none; }
417
+ .topbar-menu {
418
+ position: static; display: flex; align-items: center; gap: 14px; min-width: 0; padding: 0;
419
+ border: 0; background: none; box-shadow: none; overflow: visible; color: inherit; font-size: inherit;
420
+ }
421
+ }
369
422
  .upgrade-note { font-size: 0.85rem; color: var(--warn); }
370
423
 
371
424
  .empty { color: var(--muted); margin: 8px 0 0; }
@@ -389,8 +442,8 @@ body:has(#app[hidden]):has(#auth[hidden]):has(#stopped[hidden])::after {
389
442
  .error { color: var(--danger); min-height: 1.2em; }
390
443
 
391
444
  .terminal-panel {
392
- /* Below the top bar, whose height the page publishes as --topbar-h; it grows when the bar wraps. */
393
- position: fixed; inset: calc(var(--topbar-h, 52px) + 12px) 16px 16px; z-index: 10; display: flex; flex-direction: column;
445
+ /* Below the top bar, whose bottom edge the page publishes as --topbar-h. */
446
+ position: fixed; inset: calc(var(--topbar-h, 52px) + 12px) calc(16px + var(--dock-stage-space, 0px)) 16px 16px; z-index: 10; display: flex; flex-direction: column;
394
447
  background: var(--term-bg); border: 1px solid var(--border); border-radius: var(--radius);
395
448
  box-shadow: 0 20px 50px rgba(0, 0, 0, 0.35); overflow: hidden;
396
449
  }
@@ -399,9 +452,56 @@ body:has(#app[hidden]):has(#auth[hidden]):has(#stopped[hidden])::after {
399
452
  background: var(--surface); border-bottom: 1px solid var(--border); flex-wrap: wrap;
400
453
  }
401
454
  .panel-title { display: flex; align-items: center; gap: 10px; min-width: 0; flex: 1 1 16rem; }
402
- .panel-title .title { font-weight: 600; }
403
- .panel-title .sub { color: var(--muted); font-size: 0.78rem; }
404
- .panel-actions { display: flex; gap: 8px; }
455
+ .panel-title .title { display: block; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
456
+ .panel-title .sub { display: block; color: var(--muted); font-size: 0.78rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
457
+ .panel-switch {
458
+ min-width: 0; padding: 2px 6px; margin: -2px -6px; border: 0; border-radius: 6px; background: none;
459
+ color: var(--text); font: inherit; text-align: left; cursor: pointer;
460
+ }
461
+ .panel-switch:hover { background: var(--surface-2); }
462
+ .panel-switch:focus-visible { outline: 2px solid var(--focus); outline-offset: 0; }
463
+ .panel-switch .title::after {
464
+ content: ""; display: inline-block; width: 0.7em; height: 0.7em; margin-left: 0.35em; vertical-align: 0;
465
+ background: currentColor; mask: var(--icon-chevron) center / contain no-repeat; transform: rotate(90deg);
466
+ }
467
+ .panel-actions { display: flex; flex-wrap: wrap; gap: 8px; }
468
+ .btn.split, .btn.swap { white-space: nowrap; }
469
+ .btn.swap { max-width: 14em; overflow: hidden; text-overflow: ellipsis; }
470
+ .session-menu { min-width: 240px; max-width: min(420px, calc(100vw - 16px)); }
471
+ .session-menu .menu-empty { margin: 0; padding: 6px 8px; color: var(--muted); }
472
+ .terminal-panes {
473
+ --ratio: 0.5;
474
+ flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr);
475
+ }
476
+ .terminal-panes[data-split="columns"] { grid-template-columns: minmax(0, calc(var(--ratio) * (100% - 8px))) 8px minmax(0, 1fr); }
477
+ .terminal-panes[data-split="rows"] { grid-template-rows: minmax(0, calc(var(--ratio) * (100% - 8px))) 8px minmax(0, 1fr); }
478
+ .terminal-pane { position: relative; display: flex; flex-direction: column; min-width: 0; min-height: 0; }
479
+ .pane-head { display: none; }
480
+ .terminal-panes[data-split] .pane-head {
481
+ display: flex; align-items: center; gap: 8px; padding: 4px 6px 4px 10px; font-size: 0.78rem;
482
+ color: #9aa3b2; border-bottom: 1px solid rgba(255, 255, 255, 0.08);
483
+ }
484
+ .terminal-panes[data-split] .terminal-pane.focused .pane-head { color: #e6e9ef; box-shadow: inset 0 -2px 0 var(--accent); }
485
+ .pane-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
486
+ .pane-close {
487
+ position: relative; flex: none; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 5px;
488
+ background: none; color: inherit; cursor: pointer;
489
+ }
490
+ .pane-close::before { content: ""; position: absolute; inset: 4px; background: currentColor; mask: var(--icon-close) center / contain no-repeat; }
491
+ .pane-close:hover { background: rgba(255, 255, 255, 0.1); }
492
+ .pane-close:focus-visible { outline: 2px solid var(--focus); outline-offset: 0; }
493
+ .splitter { position: relative; z-index: 1; touch-action: none; }
494
+ .splitter::after { content: ""; position: absolute; inset: 0; background: transparent; transition: background-color 0.15s; }
495
+ .splitter:hover::after, .splitter.dragging::after, .splitter:focus-visible::after { background: color-mix(in srgb, var(--accent) 55%, transparent); }
496
+ .splitter:focus-visible { outline: none; }
497
+ .pane-splitter { background: rgba(255, 255, 255, 0.06); }
498
+ @media (pointer: coarse) {
499
+ .pane-splitter::before { content: ""; position: absolute; inset: 0 -10px; }
500
+ .terminal-panes[data-split="rows"] .pane-splitter::before { inset: -10px 0; }
501
+ }
502
+ .terminal-panes[data-split="columns"] .pane-splitter { cursor: col-resize; }
503
+ .terminal-panes[data-split="rows"] .pane-splitter { cursor: row-resize; }
504
+ :root.resizing, :root.resizing * { user-select: none; -webkit-user-select: none; }
405
505
  .btn.voice { white-space: nowrap; }
406
506
  .btn.voice::before {
407
507
  content: ""; display: inline-block; width: 1em; height: 1em; margin-right: 0.35em; vertical-align: -0.15em;
@@ -587,8 +687,7 @@ a.news-link:visited { color: var(--muted); }
587
687
  .changelog-changes li::marker { color: var(--muted); }
588
688
  .changelog-changes code { font-size: 0.8rem; padding: 0 4px; border-radius: 4px; background: var(--surface-2); }
589
689
 
590
- /* Notes: the News side sheet, holding one text field that skins style with their other fields. */
591
- .notes-panel .news-body { display: flex; flex-direction: column; padding-top: 12px; }
690
+ .notes-panel .dock-body { flex: 1; min-height: 0; display: flex; flex-direction: column; padding: 0 14px 14px; }
592
691
  .notes-text {
593
692
  flex: 1; min-height: 8em; margin: 0; padding: 10px 12px; resize: none;
594
693
  border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); color: var(--text);
@@ -636,11 +735,10 @@ a.news-link:visited { color: var(--muted); }
636
735
  .launch-tools { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex: 1 1 360px; flex-wrap: wrap; max-width: 680px; }
637
736
  .launch-tools .cwd { max-width: none; }
638
737
  .github-open { white-space: nowrap; }
639
- .github-open::before, .github-mark {
640
- content: ""; display: inline-block; flex: none; background-color: currentColor; mask: var(--icon-github) center / contain no-repeat;
738
+ .github-open::before {
739
+ content: ""; display: inline-block; flex: none; width: 1em; height: 1em; margin: 0 0.45em 0 0; vertical-align: -0.15em;
740
+ background-color: currentColor; mask: var(--icon-github) center / contain no-repeat;
641
741
  }
642
- .github-open::before { width: 1em; height: 1em; margin: 0 0.45em 0 0; vertical-align: -0.15em; }
643
- .github-mark { width: 26px; height: 26px; color: var(--heading); }
644
742
  .github-accounts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid var(--border); }
645
743
  .github-chips { display: flex; flex-wrap: wrap; gap: 6px; }
646
744
  .github-chip { display: inline-flex; align-items: center; gap: 6px; padding: 2px 10px 2px 3px; font-size: 0.8rem; }
@@ -649,7 +747,7 @@ a.news-link:visited { color: var(--muted); }
649
747
  background: var(--c, var(--muted)); color: #fff; font-size: 0.68rem; font-weight: 700;
650
748
  }
651
749
  .github-add { padding: 3px 10px; font-size: 0.8rem; }
652
- .github .models-body { padding-top: 10px; }
750
+ .github .models-body { flex: 1; min-height: 0; overflow: auto; padding-top: 10px; }
653
751
  .github-card {
654
752
  display: grid; gap: 10px; padding: 14px 16px; margin-bottom: 10px; border: 1px solid var(--border); border-radius: var(--radius);
655
753
  background: var(--surface-2); font-size: 0.9rem; line-height: 1.45;
@@ -698,8 +796,119 @@ a.news-link:visited { color: var(--muted); }
698
796
  .github-options label { display: flex; align-items: center; gap: 6px; cursor: pointer; }
699
797
  .github-options label:has(input:disabled) { opacity: 0.6; cursor: default; }
700
798
  .github .models-note { display: grid; gap: 4px; font-size: 0.85rem; }
799
+ .dock .github-accounts { padding: 10px 14px 0; }
800
+ .dock .history-form { padding: 10px 14px; }
801
+ .dock .models-body { margin: 0; padding: 10px 14px 14px; }
802
+ .github-picker { display: flex; align-items: center; gap: 8px; padding: 10px 14px 0; }
803
+ .github-combo { position: relative; flex: 1; min-width: 0; }
804
+ .github-combo input {
805
+ width: 100%; padding: 7px 10px; border-radius: var(--radius); border: 1px solid var(--border);
806
+ background: var(--surface); color: var(--text); font: inherit; font-size: 0.9rem; font-weight: 600;
807
+ }
808
+ .github-combo input:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
809
+ .github-combo input::placeholder { font-weight: 400; }
810
+ .github-repo-list {
811
+ position: absolute; z-index: 5; left: 0; right: 0; top: calc(100% + 4px); max-height: min(26rem, 60dvh); overflow: auto;
812
+ margin: 0; padding: 4px; list-style: none; background: var(--surface); color: var(--text);
813
+ border: 1px solid var(--border); border-radius: var(--radius); box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
814
+ }
815
+ .github-option { display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: calc(var(--radius) - 2px); cursor: pointer; }
816
+ .github-option[aria-selected="true"] { background: color-mix(in srgb, var(--accent) 14%, var(--surface)); }
817
+ .github-option:hover { background: var(--surface-2); }
818
+ .github-option[aria-selected="true"]:hover { background: color-mix(in srgb, var(--accent) 18%, var(--surface)); }
819
+ .github-option .badge { flex: none; }
820
+ .github-option-text { flex: 1; min-width: 0; display: grid; }
821
+ .github-option-name { font-weight: 600; overflow-wrap: anywhere; }
822
+ .github-option-meta { color: var(--muted); font-size: 0.75rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
823
+ .github-option mark { background: none; color: inherit; font-weight: 800; text-decoration: underline; text-decoration-color: var(--accent); text-underline-offset: 2px; }
824
+ .github-option-empty { padding: 8px; color: var(--muted); }
825
+ .github-picker-note { display: grid; gap: 2px; margin: 0; padding: 6px 14px 0; color: var(--muted); font-size: 0.78rem; overflow-wrap: anywhere; }
826
+ .github-picker-note.warn { color: var(--warn); }
827
+ .github-views { display: flex; gap: 2px; margin: 10px 14px 0; border-bottom: 1px solid var(--border); container-type: inline-size; }
828
+ .github-view {
829
+ position: relative; flex: 1 1 auto; min-width: 0; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
830
+ padding: 7px 8px; margin-bottom: -1px; border: 1px solid transparent; border-radius: var(--radius) var(--radius) 0 0;
831
+ background: none; color: var(--muted); font: inherit; font-size: 0.85rem; font-weight: 600; white-space: nowrap; cursor: pointer;
832
+ }
833
+ .github-view:hover { color: var(--text); }
834
+ .github-view[aria-selected="true"] { color: var(--heading); background: var(--surface-2); border-color: var(--border); border-bottom-color: var(--surface-2); }
835
+ .github-view:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
836
+ .github-view .short { display: none; }
837
+ @container (max-width: 340px) {
838
+ .github-view .long { display: none; }
839
+ .github-view .short { display: inline; }
840
+ }
841
+ .github-running { width: 8px; height: 8px; border-radius: 50%; background: var(--warn); box-shadow: 0 0 0 3px color-mix(in srgb, var(--warn) 25%, transparent); animation: pulse 1.4s ease-in-out infinite; }
842
+ .github-body[hidden] { display: none; }
843
+ .github-view-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding-bottom: 6px; }
844
+ .github-view-tools .btn { padding: 4px 10px; font-size: 0.8rem; }
845
+ .github-spacer { flex: 1 1 0; }
846
+ .github-segment { display: inline-flex; }
847
+ .github-segment .btn { border-radius: 0; }
848
+ .github-segment .btn:first-child { border-radius: var(--radius) 0 0 var(--radius); }
849
+ .github-segment .btn:last-child { border-radius: 0 var(--radius) var(--radius) 0; margin-left: -1px; }
850
+ .github-segment .btn[aria-pressed="true"] { position: relative; background: var(--accent-fill); border-color: var(--accent-fill); color: var(--accent-text); }
851
+ a.btn.github-out { text-decoration: none; white-space: nowrap; }
852
+ a.btn.github-out::after {
853
+ content: ""; display: inline-block; width: 0.8em; height: 0.8em; margin-left: 0.3em; vertical-align: -0.05em;
854
+ background: currentColor; mask: var(--icon-external) center / contain no-repeat;
855
+ }
856
+ .github-view-note { margin: 10px 0; color: var(--muted); font-size: 0.85rem; }
857
+ .github-body .github-error { margin: 10px 0; font-size: 0.85rem; overflow-wrap: anywhere; }
858
+ .github-record { grid-template-columns: minmax(0, 1fr) auto; }
859
+ .github-record .history-title { white-space: normal; overflow-wrap: anywhere; }
860
+ .github-record-title { color: inherit; text-decoration: none; }
861
+ .github-record-title:hover { text-decoration: underline; }
862
+ .github-record-title:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; border-radius: 2px; }
863
+ .github-record .btn { padding: 3px 10px; font-size: 0.8rem; }
864
+ .github-running-note { margin: 4px 0 6px; padding: 6px 10px; border-radius: var(--radius); background: var(--surface-2); font-size: 0.85rem; }
865
+ .github-running-note.on { color: var(--warn); background: color-mix(in srgb, var(--warn) 12%, var(--surface)); }
866
+ .badge.run { --badge: var(--warn); }
867
+ .badge.ok { --badge: var(--ok); }
868
+ .badge.bad { --badge: var(--danger); }
869
+ .badge.run, .badge.ok, .badge.bad { color: color-mix(in srgb, var(--badge) 72%, #000); border-color: color-mix(in srgb, var(--badge) 45%, transparent); }
870
+ :where(:root[data-theme="dark"]) {
871
+ .badge.run, .badge.ok, .badge.bad { color: var(--badge); }
872
+ }
873
+ .github-issue-form .github-fields { grid-template-columns: minmax(0, 1fr); }
874
+ .github-issue-form h3, .github-issue-form .github-small, .github .dock-sub { overflow-wrap: anywhere; }
875
+ .github-issue-body { min-height: 10em; resize: vertical; padding: 8px 10px; border-radius: var(--radius); border: 1px solid var(--border); background: var(--surface); color: var(--text); font: inherit; font-size: 0.9rem; line-height: 1.5; }
876
+ .github-issue-body:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
877
+ @media (pointer: coarse) {
878
+ .github-combo input, .github-issue-body, .github-issue-form input { font-size: 16px; }
879
+ }
701
880
  .toast .toast-action { margin-left: 12px; padding: 2px 10px; background: transparent; box-shadow: none; color: inherit; border-color: currentColor; }
702
881
 
882
+ .dock {
883
+ position: fixed; top: var(--topbar-h, 56px); right: 0; bottom: 0; z-index: 12; width: var(--dock-w, 420px); max-width: 100vw;
884
+ display: flex; flex-direction: column; background: var(--surface); color: var(--text);
885
+ border-left: 1px solid var(--border); box-shadow: -16px 0 48px rgba(0, 0, 0, 0.25);
886
+ }
887
+ :root.dock-push .dock { box-shadow: none; }
888
+ :root.dock-full .dock { width: 100vw; border-left: 0; }
889
+ .dock-splitter { position: absolute; left: -5px; top: 0; bottom: 0; width: 10px; cursor: col-resize; }
890
+ .dock-splitter::after { left: 4px; right: 4px; }
891
+ :root.dock-full .dock-splitter { display: none; }
892
+ @media (pointer: coarse) {
893
+ /* Wider to touch, drawn the same. */
894
+ .dock-splitter { left: -14px; width: 28px; }
895
+ .dock-splitter::after { left: 13px; right: 13px; }
896
+ }
897
+ .dock-bar { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-bottom: 1px solid var(--border); }
898
+ .dock-tabs { flex: 1; display: flex; gap: 4px; min-width: 0; }
899
+ .dock-tab {
900
+ display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border: 1px solid transparent; border-radius: var(--radius);
901
+ background: none; color: var(--muted); font: inherit; font-family: var(--font-display); font-size: 0.95rem; font-weight: 600; cursor: pointer;
902
+ }
903
+ .dock-tab::before { content: ""; width: 1em; height: 1em; background: currentColor; mask: var(--icon-github) center / contain no-repeat; }
904
+ .dock-tab.notes-tab::before { mask-image: var(--icon-notes); }
905
+ .dock-tab:hover { color: var(--text); }
906
+ .dock-tab[aria-selected="true"] { color: var(--heading); background: var(--surface-2); border-color: var(--border); }
907
+ .dock-tab:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
908
+ .dock-panel { flex: 1; min-height: 0; display: flex; flex-direction: column; }
909
+ .dock-sub { margin: 0; padding: 8px 14px 0; color: var(--muted); font-size: 0.78rem; }
910
+ .github .github-accounts { border-bottom: 0; padding-bottom: 0; }
911
+
703
912
  .toast {
704
913
  position: fixed; left: 50%; bottom: 20px; transform: translateX(-50%); z-index: 20;
705
914
  max-width: min(640px, calc(100vw - 32px)); padding: 10px 14px; border-radius: var(--radius);
@@ -724,9 +933,9 @@ a.news-link:visited { color: var(--muted); }
724
933
  }
725
934
 
726
935
  @media (prefers-reduced-motion: reduce) {
727
- .status-pill.active::before, .agent.working::after, .model-detail .stat-fill, .toast:not([hidden]), .tip:not([hidden]), .appearance-menu:popover-open { animation: none; }
728
- .model-name::before, .provider .copies summary::before, .appearance::after, .btn, .models, .news-panel, .models::backdrop, .news-panel::backdrop { transition: none; }
729
- .github-waiting::before, body:has(#app[hidden]):has(#auth[hidden]):has(#stopped[hidden])::after { animation: none; }
936
+ .status-pill.active::before, .agent.working::after, .model-detail .stat-fill, .toast:not([hidden]), .tip:not([hidden]), .menu:popover-open { animation: none; }
937
+ .model-name::before, .provider .copies summary::before, .menu-button::after, .btn, .models, .news-panel, .models::backdrop, .news-panel::backdrop { transition: none; }
938
+ .github-waiting::before, .github-running, body:has(#app[hidden]):has(#auth[hidden]):has(#stopped[hidden])::after { animation: none; }
730
939
  .btn:active:not(:disabled) { transform: none; }
731
940
  .btn.voice[aria-pressed="true"]::before { animation: none; }
732
941
  .drag-handle, .session-grid::before, .session-grid.reordering::before,
@@ -734,9 +943,8 @@ a.news-link:visited { color: var(--muted); }
734
943
  }
735
944
 
736
945
  @media (max-width: 640px) {
737
- .topbar { padding: 10px 16px; flex-wrap: wrap; }
738
- .brand h1 { white-space: nowrap; }
739
- .topbar-end { flex: 1 1 100%; justify-content: space-between; }
946
+ .topbar { padding: 10px 16px; }
947
+ .connection .label { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
740
948
  .terminal-panel { inset: var(--topbar-h, 56px) 0 0; border-radius: 0; }
741
949
  .session-grid { grid-template-columns: 1fr; }
742
950
  .cwd { flex-basis: 100%; }