@oddessentials/agent-guild 0.5.0 → 0.7.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.
Files changed (86) hide show
  1. package/README.md +182 -135
  2. package/package.json +1 -1
  3. package/src/manager/changelog.mjs +195 -0
  4. package/src/manager/config.mjs +1 -0
  5. package/src/manager/github.mjs +842 -0
  6. package/src/manager/main.mjs +10 -3
  7. package/src/manager/news.mjs +5 -5
  8. package/src/manager/server.mjs +70 -8
  9. package/src/manager/session-manager.mjs +32 -3
  10. package/src/manager/session.mjs +4 -1
  11. package/web/app.js +1005 -11
  12. package/web/art/art.css +374 -159
  13. package/web/art/characters/anthropic/idle.avif +0 -0
  14. package/web/art/characters/anthropic/idle.webp +0 -0
  15. package/web/art/characters/anthropic/locked.avif +0 -0
  16. package/web/art/characters/anthropic/locked.webp +0 -0
  17. package/web/art/characters/anthropic/working.avif +0 -0
  18. package/web/art/characters/anthropic/working.webp +0 -0
  19. package/web/art/characters/google/idle.avif +0 -0
  20. package/web/art/characters/google/idle.webp +0 -0
  21. package/web/art/characters/google/locked.avif +0 -0
  22. package/web/art/characters/google/locked.webp +0 -0
  23. package/web/art/characters/google/working.avif +0 -0
  24. package/web/art/characters/google/working.webp +0 -0
  25. package/web/art/characters/openai/idle.avif +0 -0
  26. package/web/art/characters/openai/idle.webp +0 -0
  27. package/web/art/characters/openai/locked.avif +0 -0
  28. package/web/art/characters/openai/locked.webp +0 -0
  29. package/web/art/characters/openai/working.avif +0 -0
  30. package/web/art/characters/openai/working.webp +0 -0
  31. package/web/art/characters/shell/idle.avif +0 -0
  32. package/web/art/characters/shell/idle.webp +0 -0
  33. package/web/art/characters/shell/locked.avif +0 -0
  34. package/web/art/characters/shell/locked.webp +0 -0
  35. package/web/art/characters/shell/working.avif +0 -0
  36. package/web/art/characters/shell/working.webp +0 -0
  37. package/web/art/characters/xai/idle.avif +0 -0
  38. package/web/art/characters/xai/idle.webp +0 -0
  39. package/web/art/characters/xai/locked.avif +0 -0
  40. package/web/art/characters/xai/locked.webp +0 -0
  41. package/web/art/characters/xai/working.avif +0 -0
  42. package/web/art/characters/xai/working.webp +0 -0
  43. package/web/art/icons/anthropic.avif +0 -0
  44. package/web/art/icons/anthropic.webp +0 -0
  45. package/web/art/icons/google.avif +0 -0
  46. package/web/art/icons/google.webp +0 -0
  47. package/web/art/icons/openai.avif +0 -0
  48. package/web/art/icons/openai.webp +0 -0
  49. package/web/art/icons/shell.avif +0 -0
  50. package/web/art/icons/shell.webp +0 -0
  51. package/web/art/icons/xai.avif +0 -0
  52. package/web/art/icons/xai.webp +0 -0
  53. package/web/art/page-light.avif +0 -0
  54. package/web/art/page-light.webp +0 -0
  55. package/web/art/page.avif +0 -0
  56. package/web/art/page.webp +0 -0
  57. package/web/art/ui/empty-state.avif +0 -0
  58. package/web/art/ui/empty-state.webp +0 -0
  59. package/web/art/ui/favicon.png +0 -0
  60. package/web/art/ui/frame-ornate.png +0 -0
  61. package/web/art/ui/guild-crest.png +0 -0
  62. package/web/fonts/OFL.txt +93 -0
  63. package/web/fonts/cinzel.woff2 +0 -0
  64. package/web/index.html +101 -15
  65. package/web/styles.css +240 -71
  66. package/web/art/characters/anthropic/idle.png +0 -0
  67. package/web/art/characters/anthropic/locked.png +0 -0
  68. package/web/art/characters/anthropic/working.png +0 -0
  69. package/web/art/characters/google/idle.png +0 -0
  70. package/web/art/characters/google/locked.png +0 -0
  71. package/web/art/characters/google/working.png +0 -0
  72. package/web/art/characters/openai/idle.png +0 -0
  73. package/web/art/characters/openai/locked.png +0 -0
  74. package/web/art/characters/openai/working.png +0 -0
  75. package/web/art/characters/shell/idle.png +0 -0
  76. package/web/art/characters/shell/locked.png +0 -0
  77. package/web/art/characters/shell/working.png +0 -0
  78. package/web/art/characters/xai/idle.png +0 -0
  79. package/web/art/characters/xai/locked.png +0 -0
  80. package/web/art/characters/xai/working.png +0 -0
  81. package/web/art/icons/anthropic.png +0 -0
  82. package/web/art/icons/google.png +0 -0
  83. package/web/art/icons/openai.png +0 -0
  84. package/web/art/icons/shell.png +0 -0
  85. package/web/art/icons/xai.png +0 -0
  86. package/web/art/page.png +0 -0
package/web/styles.css CHANGED
@@ -1,21 +1,51 @@
1
+ @font-face {
2
+ font-family: "Cinzel";
3
+ src: url("/fonts/cinzel.woff2") format("woff2");
4
+ font-weight: 400 900;
5
+ font-display: swap;
6
+ }
7
+ @font-face {
8
+ font-family: "Cinzel Fallback";
9
+ src: local("Palatino Linotype"), local("Palatino"), local("Georgia");
10
+ ascent-override: 97.6%;
11
+ descent-override: 37.2%;
12
+ line-gap-override: 0%;
13
+ }
14
+
1
15
  :root {
2
- --bg: #f6f7f9;
3
- --surface: #ffffff;
4
- --surface-2: #f0f2f5;
5
- --border: #dde1e7;
6
- --text: #1b1f24;
7
- --muted: #5f6b7a;
8
- --accent: #5b5bd6;
16
+ --bg: #f3eee3;
17
+ --surface: #fffcf6;
18
+ --surface-2: #f5eedf;
19
+ --border: #e3d7bd;
20
+ --text: #221b12;
21
+ --muted: #6b5c45;
22
+ --heading: #2c2216;
23
+ --accent: #5a3fc0;
24
+ --accent-fill: #5a3fc0;
9
25
  --accent-text: #ffffff;
10
- --danger: #c93c37;
11
- --ok: #1f8a4c;
12
- --warn: #b7791f;
13
- --shadow: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 3px rgba(16, 24, 40, 0.08);
26
+ --danger: #a8302b;
27
+ --ok: #1d6e40;
28
+ --warn: #8a5300;
29
+ --gold: #b8892f;
30
+ --gold-ink: #7a5715;
31
+ --focus: #5a3fc0;
32
+ --wordmark: linear-gradient(180deg, #a77a26 0%, #7a5715 55%, #563c0b 100%);
33
+ --shadow: 0 1px 2px rgba(70, 48, 12, 0.08), 0 4px 14px rgba(70, 48, 12, 0.08);
14
34
  --term-bg: #0f1115;
15
- --radius: 10px;
35
+ --radius: 6px;
36
+ --ease: cubic-bezier(0.2, 0.8, 0.2, 1);
37
+ --font-display: "Cinzel", "Cinzel Fallback", "Palatino Linotype", Palatino, Georgia, serif;
38
+ --font-mono: ui-monospace, "Cascadia Code", "SF Mono", Menlo, Consolas, monospace;
39
+ --icon-sun: 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'%3E%3Ccircle cx='12' cy='12' r='4.2'/%3E%3Cpath d='M12 2.5v2.2M12 19.3v2.2M2.5 12h2.2M19.3 12h2.2M5.3 5.3l1.6 1.6M17.1 17.1l1.6 1.6M5.3 18.7l1.6-1.6M17.1 6.9l1.6-1.6'/%3E%3C/svg%3E");
40
+ --icon-moon: 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%3Cpath d='M19.5 14.6A8 8 0 0 1 9.4 4.5a8 8 0 1 0 10.1 10.1z'/%3E%3C/svg%3E");
41
+ --icon-external: 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' stroke-linejoin='round'%3E%3Cpath d='M7 17L17 7M9 7h8v8'/%3E%3C/svg%3E");
42
+ --icon-chevron: 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.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5.5l6.5 6.5L9 18.5'/%3E%3C/svg%3E");
43
+ --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");
44
+ --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");
16
45
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
17
46
  font-size: 15px;
18
47
  color-scheme: light;
48
+ scrollbar-color: color-mix(in srgb, var(--muted) 45%, transparent) transparent;
19
49
  }
20
50
 
21
51
  /* theme.js sets data-theme from the saved choice or the system setting before the first paint. */
@@ -26,20 +56,31 @@
26
56
  --border: #2a303b;
27
57
  --text: #e6e9ef;
28
58
  --muted: #9aa4b2;
29
- --accent: #7c7cf0;
59
+ --heading: #f1e2c2;
60
+ --accent: #ac9ff7;
61
+ --accent-fill: #5b40d0;
30
62
  --danger: #ef6b66;
31
63
  --ok: #4cc38a;
32
64
  --warn: #e0a84a;
65
+ --gold: #e8c47c;
66
+ --gold-ink: #e8c47c;
67
+ --focus: #e8c47c;
68
+ --wordmark: linear-gradient(180deg, #fbe9bd 0%, #e2b867 55%, #a97b35 100%);
33
69
  --shadow: none;
34
70
  color-scheme: dark;
35
71
  }
36
72
 
37
73
  * { box-sizing: border-box; }
38
74
  body { margin: 0; background: var(--bg); color: var(--text); min-height: 100vh; }
39
- h1, h2 { margin: 0; }
40
- h1 { font-size: 1.1rem; font-weight: 650; }
41
- h2 { font-size: 1rem; font-weight: 600; }
42
- code, pre { font-family: ui-monospace, "Cascadia Code", Menlo, Consolas, monospace; }
75
+ ::selection { background: color-mix(in srgb, var(--accent) 32%, transparent); }
76
+ h1, h2 { margin: 0; font-family: var(--font-display); color: var(--heading); }
77
+ h1 {
78
+ font-size: 1.32rem; font-weight: 700; letter-spacing: 0.02em; white-space: nowrap;
79
+ background: var(--wordmark); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
80
+ }
81
+ h2 { font-size: 1.02rem; font-weight: 600; letter-spacing: 0.03em; }
82
+ h2 .count { font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; letter-spacing: 0; }
83
+ code, pre { font-family: var(--font-mono); }
43
84
  [hidden] { display: none !important; }
44
85
 
45
86
  .topbar {
@@ -48,35 +89,41 @@ code, pre { font-family: ui-monospace, "Cascadia Code", Menlo, Consolas, monospa
48
89
  position: sticky; top: 0; z-index: 5;
49
90
  }
50
91
  .brand { display: flex; align-items: center; gap: 10px; }
51
- .brand-mark { width: 26px; height: 26px; color: var(--accent); flex: none; }
52
92
  .version {
53
- font-size: 0.72rem; font-weight: 600; padding: 1px 7px; border-radius: 999px; white-space: nowrap;
54
- background: var(--surface-2); color: var(--muted); border: 1px solid var(--border); font-variant-numeric: tabular-nums;
93
+ position: relative; font-family: inherit; font-size: 0.72rem; font-weight: 600; padding: 1px 7px; border-radius: 999px; white-space: nowrap;
94
+ background: var(--surface-2); color: var(--muted); border: 1px solid var(--border); font-variant-numeric: tabular-nums; cursor: pointer;
95
+ }
96
+ .version:hover { color: var(--text); border-color: var(--muted); }
97
+ .version:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
98
+ .version.unread::after {
99
+ content: ""; position: absolute; top: -3px; right: -3px; width: 8px; height: 8px; border-radius: 50%;
100
+ background: var(--accent); box-shadow: 0 0 0 2px var(--surface);
55
101
  }
56
102
  .topbar-end { display: flex; align-items: center; justify-content: flex-end; gap: 14px; flex-wrap: wrap; min-width: 0; }
57
103
  .connection { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 0.85rem; }
58
- .connection .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--warn); }
59
- .connection.ok .dot { background: var(--ok); }
60
- .connection.down .dot { background: var(--danger); }
104
+ .connection .dot { --dot: var(--warn); width: 8px; height: 8px; border-radius: 50%; background: var(--dot); }
105
+ .connection.ok .dot { --dot: var(--ok); }
106
+ .connection.down .dot { --dot: var(--danger); }
61
107
 
62
- main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid; gap: 28px; }
108
+ main { max-width: 1200px; margin: 0 auto; padding: 26px 16px 56px; display: grid; grid-template-columns: minmax(0, 1fr); gap: 34px; }
63
109
  .section-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
64
110
  .count { color: var(--muted); font-weight: 500; }
65
111
 
66
112
  .cwd { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 0.85rem; flex: 1 1 280px; max-width: 520px; }
67
113
  .cwd input, .auth input {
68
- flex: 1; min-width: 0; padding: 7px 10px; border-radius: 8px; border: 1px solid var(--border);
114
+ flex: 1; min-width: 0; padding: 7px 10px; border-radius: var(--radius); border: 1px solid var(--border);
69
115
  background: var(--surface); color: var(--text); font: inherit; font-size: 0.9rem;
70
116
  }
71
- .cwd input:focus, .auth input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
117
+ .cwd input:focus, .auth input:focus { outline: 2px solid var(--focus); outline-offset: 1px; }
72
118
 
73
119
  .providers { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; }
74
120
  .provider {
75
- display: grid; grid-template-columns: auto 1fr; align-items: center; align-content: start; gap: 10px 12px; padding: 14px;
121
+ display: flex; flex-direction: column; gap: 10px; padding: 14px;
76
122
  border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); box-shadow: var(--shadow);
77
123
  }
124
+ .provider-head { display: flex; align-items: center; gap: 12px; min-width: 0; }
78
125
  .provider.unavailable .provider-icon { filter: grayscale(1); opacity: 0.45; }
79
- .provider-text { display: grid; gap: 2px; min-width: 0; }
126
+ .provider-text { flex: 1; display: grid; gap: 2px; min-width: 0; }
80
127
  .provider .vendor-line { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 6px; min-width: 0; }
81
128
  .provider .vendor { font-weight: 600; }
82
129
  .provider .tier {
@@ -89,17 +136,17 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
89
136
  .provider .state.update-available { color: var(--warn); }
90
137
  .provider.unavailable .state { color: var(--muted); }
91
138
  .provider .update { color: var(--warn); border-color: var(--warn); }
92
- .provider .accounts { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 6px; }
139
+ .provider .accounts { display: flex; flex-wrap: wrap; gap: 6px; }
93
140
  .account-chip {
94
141
  font: inherit; font-size: 0.75rem; font-weight: 600; padding: 2px 10px; border-radius: 999px; cursor: pointer;
95
142
  border: 1px solid var(--border); background: var(--surface-2); color: var(--muted); max-width: 100%;
96
143
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
97
144
  }
98
145
  .account-chip:hover { border-color: var(--muted); }
99
- .account-chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
100
- .account-chip[aria-selected="true"] { background: var(--accent); border-color: var(--accent); color: var(--accent-text); }
146
+ .account-chip:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
147
+ .account-chip[aria-selected="true"] { background: var(--accent-fill); border-color: var(--accent-fill); color: var(--accent-text); }
101
148
  .account-chip.unsigned { border-style: dashed; }
102
- .provider .usage { grid-column: 1 / -1; display: grid; gap: 4px; }
149
+ .provider .usage { display: grid; gap: 4px; }
103
150
  .provider .usage:empty { display: none; }
104
151
  .meter { display: grid; grid-template-columns: 5.5em 1fr auto; align-items: center; gap: 8px; font-size: 0.75rem; color: var(--muted); }
105
152
  .meter-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@@ -110,7 +157,7 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
110
157
  .meter-value { white-space: nowrap; font-variant-numeric: tabular-nums; }
111
158
  .usage-note { font-size: 0.75rem; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
112
159
  .provider .model-stats {
113
- grid-column: 1 / -1; display: grid; grid-template-columns: max-content minmax(24px, 1fr) auto; align-items: center; gap: 2px 8px;
160
+ display: grid; grid-template-columns: max-content minmax(24px, 1fr) auto; align-items: center; gap: 2px 8px;
114
161
  }
115
162
  .provider .model-stats:empty { display: none; }
116
163
  .provider .model-stats > .usage-note { grid-column: 1 / -1; contain: inline-size; }
@@ -119,9 +166,13 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
119
166
  font: inherit; font-size: 0.78rem; text-align: left; cursor: pointer;
120
167
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
121
168
  }
122
- .model-stats-head::after { content: " ›"; }
169
+ .model-stats-head::after, .console-link::after, .theme-toggle::before, .model-name::before, .provider .copies summary::before {
170
+ content: ""; display: inline-block; flex: none; width: 0.75em; height: 0.75em; margin-left: 0.3em; vertical-align: -0.05em;
171
+ background: currentColor; mask: var(--icon-chevron) center / contain no-repeat;
172
+ }
173
+ .console-link::after { width: 0.7em; height: 0.7em; margin-left: 0.25em; mask-image: var(--icon-external); }
123
174
  .model-stats-head:hover { text-decoration: underline; }
124
- .model-stats-head:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 3px; }
175
+ .model-stats-head:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: 3px; }
125
176
 
126
177
  .stat {
127
178
  --tier: var(--border);
@@ -131,16 +182,16 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
131
182
  .stat-label { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap; }
132
183
  .stat-reading { grid-column: 2 / -1; display: grid; grid-template-columns: subgrid; align-items: center; }
133
184
  .info {
134
- position: relative; flex: none; display: inline-grid; place-items: center; width: 1.3em; height: 1.3em; padding: 0;
135
- border: 1px solid color-mix(in srgb, currentColor 50%, transparent); border-radius: 50%; background: none; color: var(--muted);
136
- font: italic 700 0.68rem/1 Georgia, "Times New Roman", serif; cursor: help;
185
+ position: relative; flex: none; display: inline-grid; place-items: center; width: 0.9rem; height: 0.9rem; padding: 0;
186
+ border: 0; border-radius: 50%; background: none; color: var(--muted); font-size: 0; cursor: help;
137
187
  }
188
+ .info::before { content: ""; position: absolute; inset: 0; background: currentColor; mask: var(--icon-info) center / contain no-repeat; }
138
189
  .info::after { content: ""; position: absolute; inset: -6px; }
139
- .info:hover, .info:focus-visible { color: var(--accent); border-color: currentColor; }
140
- .info:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
190
+ .info:hover, .info:focus-visible { color: var(--accent); }
191
+ .info:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
141
192
  .tip {
142
193
  position: fixed; z-index: 30; width: max-content; max-width: min(320px, calc(100vw - 16px)); margin: 0; padding: 9px 11px;
143
- border-radius: 8px; background: var(--text); color: var(--bg); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
194
+ border-radius: var(--radius); background: var(--text); color: var(--bg); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
144
195
  font-size: 0.78rem; line-height: 1.45; pointer-events: none;
145
196
  }
146
197
  .tip strong { font-weight: 600; }
@@ -172,14 +223,17 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
172
223
  .tier-c { --tier: #4ade80; --tier-ink: #c6f6d5; }
173
224
  .tier-d { --tier: #94a3b8; --tier-ink: #d4dbe4; }
174
225
  }
175
- .provider-links { grid-column: 1 / -1; display: flex; gap: 14px; font-size: 0.78rem; }
226
+ .provider-links { display: flex; gap: 14px; font-size: 0.78rem; }
176
227
  .console-link { color: var(--accent); text-decoration: none; }
177
228
  .console-link:hover { text-decoration: underline; }
178
- .console-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 3px; }
179
- .provider-actions { grid-column: 1 / -1; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
229
+ .console-link:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: 3px; }
230
+ .provider-actions { margin-top: auto; display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
180
231
  .provider .hint { font-size: 0.78rem; color: var(--muted); overflow-wrap: anywhere; }
181
- .provider .copies { grid-column: 1 / -1; font-size: 0.78rem; color: var(--muted); overflow-wrap: anywhere; }
182
- .provider .copies summary { cursor: pointer; color: var(--warn); }
232
+ .provider .copies { font-size: 0.78rem; color: var(--muted); overflow-wrap: anywhere; }
233
+ .provider .copies summary { cursor: pointer; color: var(--warn); list-style: none; }
234
+ .provider .copies summary::-webkit-details-marker { display: none; }
235
+ .provider .copies summary::before { margin: 0 0.3em 0 0; transition: transform 0.15s var(--ease); }
236
+ .provider .copies[open] summary::before { transform: rotate(90deg); }
183
237
  .provider .copies ul { margin: 6px 0 0; padding: 0; list-style: none; display: grid; gap: 8px; }
184
238
  .provider .copies li span { display: block; }
185
239
  .provider .copies .copy-name { color: var(--text); }
@@ -200,8 +254,8 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
200
254
  display: grid; gap: 12px; padding: 14px; border: 1px solid var(--border); border-radius: var(--radius);
201
255
  background: var(--surface); box-shadow: var(--shadow); cursor: pointer;
202
256
  }
203
- .session-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
204
- .session-card.exited { opacity: 0.75; }
257
+ .session-card:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
258
+ .session-card.exited .name { color: var(--muted); }
205
259
  .card-top { display: flex; align-items: center; gap: 12px; }
206
260
  .card-title { flex: 1; min-width: 0; }
207
261
  .card-title .name { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -218,10 +272,13 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
218
272
  border: 0; font-family: inherit; cursor: pointer;
219
273
  }
220
274
  .model-pill:hover { background: color-mix(in srgb, var(--accent) 24%, var(--surface)); }
221
- .model-pill:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
275
+ .model-pill:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
222
276
  .model-pill.screen { font-weight: 500; }
223
277
  .status-pill.active { color: var(--ok); }
224
- .status-pill.active::before { content: "● "; animation: pulse 1.2s ease-in-out infinite; }
278
+ .status-pill.active::before {
279
+ content: ""; display: inline-block; width: 6px; height: 6px; margin-right: 5px; vertical-align: 1px; border-radius: 50%;
280
+ background: currentColor; box-shadow: 0 0 6px currentColor; animation: pulse 1.2s ease-in-out infinite;
281
+ }
225
282
  .status-pill.exited { color: var(--danger); }
226
283
 
227
284
  .agents-row { display: flex; align-items: center; gap: 10px; min-height: 30px; }
@@ -244,16 +301,20 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
244
301
 
245
302
  .card-actions { display: flex; gap: 8px; flex-wrap: wrap; }
246
303
  .btn {
247
- padding: 6px 12px; border-radius: 8px; border: 1px solid var(--border); background: var(--surface-2);
304
+ padding: 6px 12px; border-radius: var(--radius); border: 1px solid var(--border); background: var(--surface-2);
248
305
  color: var(--text); font: inherit; font-size: 0.85rem; cursor: pointer;
306
+ transition: border-color 0.15s, box-shadow 0.15s, filter 0.15s, transform 0.1s;
249
307
  }
308
+ .btn:active:not(:disabled) { transform: translateY(1px); }
250
309
  .btn:hover { border-color: var(--muted); }
251
- .btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
252
- .btn.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-text); }
310
+ .btn:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
311
+ .btn.primary { background: var(--accent-fill); border-color: var(--accent-fill); color: var(--accent-text); }
253
312
  .btn.danger { color: var(--danger); }
254
313
  .btn.danger:hover { border-color: var(--danger); }
255
314
  .btn:disabled { opacity: 0.6; cursor: progress; }
256
315
  .stop-manager, .restart-manager, .theme-toggle, .upgrade { white-space: nowrap; }
316
+ .theme-toggle::before { width: 1em; height: 1em; margin: 0 0.4em 0 0; vertical-align: -0.15em; mask-image: var(--icon-sun); }
317
+ .theme-toggle[data-next="dark"]::before { mask-image: var(--icon-moon); }
257
318
  .btn.upgrade, .btn.restart-manager.pending { color: var(--warn); border-color: var(--warn); }
258
319
  .upgrade-note { font-size: 0.85rem; color: var(--warn); }
259
320
 
@@ -261,7 +322,7 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
261
322
 
262
323
  .auth { max-width: 560px; margin: 60px auto; padding: 24px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); display: grid; gap: 12px; }
263
324
  .auth p { margin: 0; color: var(--muted); line-height: 1.5; }
264
- .auth pre { margin: 0; padding: 10px 12px; background: var(--surface-2); border-radius: 8px; }
325
+ .auth pre { margin: 0; padding: 10px 12px; background: var(--surface-2); border-radius: var(--radius); }
265
326
  .auth form { display: flex; gap: 8px; }
266
327
  .stopped-help { display: grid; gap: 12px; }
267
328
  .command { display: flex; align-items: center; gap: 8px; }
@@ -313,10 +374,10 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
313
374
  font: inherit; font-size: 0.85rem; text-align: left; cursor: pointer;
314
375
  }
315
376
  .model-toggle:hover { background: var(--surface-2); }
316
- .model-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
377
+ .model-toggle:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
317
378
  .model-title { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; min-width: 0; }
318
379
  .model-name { font-weight: 600; overflow-wrap: anywhere; }
319
- .model-name::before { content: "▸"; content: "▸" / ""; display: inline-block; width: 1em; color: var(--muted); transition: transform 0.15s; }
380
+ .model-name::before { width: 0.7em; height: 0.7em; margin: 0 0.3em 0 0; background-color: var(--muted); transition: transform 0.15s var(--ease); }
320
381
  .model-toggle[aria-expanded="true"] .model-name::before { transform: rotate(90deg); }
321
382
  .model-context { color: var(--muted); font-variant-numeric: tabular-nums; }
322
383
  .badge {
@@ -325,10 +386,10 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
325
386
  }
326
387
  .badge.in-use { --badge: var(--accent); color: color-mix(in srgb, var(--badge) 80%, #000); }
327
388
  .badge.new { --badge: var(--ok); color: color-mix(in srgb, var(--badge) 72%, #000); }
328
- .badge.expires { --badge: var(--warn); color: color-mix(in srgb, var(--badge) 62%, #000); }
329
- .badge.in-use, .badge.new, .badge.expires { border-color: color-mix(in srgb, var(--badge) 45%, transparent); }
389
+ .badge.expires, .badge.installed { --badge: var(--warn); color: color-mix(in srgb, var(--badge) 62%, #000); }
390
+ .badge.in-use, .badge.new, .badge.expires, .badge.installed { border-color: color-mix(in srgb, var(--badge) 45%, transparent); }
330
391
  :where(:root[data-theme="dark"]) {
331
- .badge.in-use, .badge.new, .badge.expires { color: var(--badge); }
392
+ .badge.in-use, .badge.new, .badge.expires, .badge.installed { color: var(--badge); }
332
393
  }
333
394
  .model-detail {
334
395
  display: grid; grid-template-columns: max-content minmax(48px, 1fr) auto minmax(0, 19em); gap: 14px 10px;
@@ -360,7 +421,7 @@ main { max-width: 1200px; margin: 0 auto; padding: 20px 16px 48px; display: grid
360
421
  .news-link { color: var(--text); font-weight: 600; text-decoration: none; }
361
422
  a.news-link:hover, .news-discussion:hover { text-decoration: underline; }
362
423
  a.news-link:visited { color: var(--muted); }
363
- .news-link:focus-visible, .news-discussion:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 3px; }
424
+ .news-link:focus-visible, .news-discussion:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: 3px; }
364
425
  .news-meta { color: var(--muted); font-size: 0.78rem; white-space: nowrap; font-variant-numeric: tabular-nums; }
365
426
 
366
427
  .news-panel {
@@ -368,7 +429,19 @@ a.news-link:visited { color: var(--muted); }
368
429
  border: 0; border-left: 1px solid var(--border); background: var(--surface); color: var(--text);
369
430
  box-shadow: -16px 0 48px rgba(0, 0, 0, 0.25);
370
431
  }
371
- .news-panel[open] { display: flex; flex-direction: column; animation: news-in 0.18s ease-out; }
432
+ .news-panel[open] { display: flex; flex-direction: column; }
433
+ .models, .news-panel {
434
+ transition: opacity 0.22s var(--ease), transform 0.22s var(--ease), overlay 0.22s allow-discrete, display 0.22s allow-discrete;
435
+ }
436
+ .models:not([open]) { opacity: 0; transform: translateY(12px) scale(0.98); }
437
+ .news-panel:not([open]) { opacity: 0; transform: translateX(28px); }
438
+ .models::backdrop, .news-panel::backdrop { transition: opacity 0.22s, overlay 0.22s allow-discrete, display 0.22s allow-discrete; }
439
+ .models:not([open])::backdrop, .news-panel:not([open])::backdrop { opacity: 0; }
440
+ @starting-style {
441
+ .models[open] { opacity: 0; transform: translateY(12px) scale(0.98); }
442
+ .news-panel[open] { opacity: 0; transform: translateX(28px); }
443
+ .models[open]::backdrop, .news-panel[open]::backdrop { opacity: 0; }
444
+ }
372
445
  .news-panel::backdrop { background: rgba(15, 17, 21, 0.4); }
373
446
  .news-bar { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--border); }
374
447
  .news-heading { flex: 1; min-width: 0; }
@@ -379,8 +452,8 @@ a.news-link:visited { color: var(--muted); }
379
452
  border: 1px solid var(--border); background: var(--surface-2); color: var(--muted);
380
453
  }
381
454
  .news-filter:hover { border-color: var(--muted); }
382
- .news-filter:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
383
- .news-filter[aria-pressed="true"] { background: var(--accent); border-color: var(--accent); color: var(--accent-text); }
455
+ .news-filter:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
456
+ .news-filter[aria-pressed="true"] { background: var(--accent-fill); border-color: var(--accent-fill); color: var(--accent-text); }
384
457
  .news-body { flex: 1; min-height: 0; overflow: auto; padding: 0 14px 14px; }
385
458
  .news-fresh { width: 100%; margin-top: 12px; }
386
459
  .news-day {
@@ -402,12 +475,25 @@ a.news-link:visited { color: var(--muted); }
402
475
  .news-status { margin: 0; padding: 10px 14px; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.75rem; line-height: 1.45; }
403
476
  .news-status span { display: block; }
404
477
 
478
+ .changelog-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
479
+ .changelog-actions .btn { flex: 1 1 auto; }
480
+ .changelog-list { list-style: none; margin: 0; padding: 0; }
481
+ .changelog-release { padding: 14px 0 12px; }
482
+ .changelog-release + .changelog-release { border-top: 1px solid var(--border); }
483
+ .changelog-release h3 { margin: 0; font-size: 1rem; }
484
+ .changelog-release .news-meta { display: block; margin-top: 2px; }
485
+ .changelog-type { margin: 10px 0 4px; font-size: 0.7rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted); }
486
+ .changelog-type.breaking { color: var(--danger); }
487
+ .changelog-changes { margin: 0; padding-left: 1.2em; display: grid; gap: 4px; list-style: disc; font-size: 0.85rem; line-height: 1.45; overflow-wrap: anywhere; }
488
+ .changelog-changes li::marker { color: var(--muted); }
489
+ .changelog-changes code { font-size: 0.8rem; padding: 0 4px; border-radius: 4px; background: var(--surface-2); }
490
+
405
491
  .history-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 10px 14px 0; }
406
492
  .history-tools input[type="search"] {
407
- flex: 1 1 220px; min-width: 0; padding: 7px 10px; border-radius: 8px; border: 1px solid var(--border);
493
+ flex: 1 1 220px; min-width: 0; padding: 7px 10px; border-radius: var(--radius); border: 1px solid var(--border);
408
494
  background: var(--surface); color: var(--text); font: inherit; font-size: 0.9rem;
409
495
  }
410
- .history-tools input:focus-visible, .history-form input:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
496
+ .history-tools input:focus-visible, .history-form input:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
411
497
  .history-here { display: flex; align-items: center; gap: 6px; font-size: 0.8rem; color: var(--muted); white-space: nowrap; cursor: pointer; }
412
498
  .history-here:has(input:disabled) { opacity: 0.6; cursor: default; }
413
499
  .history .models-body { padding-top: 6px; }
@@ -425,29 +511,109 @@ a.news-link:visited { color: var(--muted); }
425
511
  border-radius: 6px; border: 1px solid var(--border); background: var(--surface-2); color: var(--muted); cursor: copy; white-space: nowrap;
426
512
  }
427
513
  .session-id:hover { color: var(--text); border-color: var(--muted); }
428
- .session-id:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
514
+ .session-id:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
429
515
  .card-title .meta { display: flex; align-items: center; gap: 8px; min-width: 0; }
430
516
  .card-title .meta-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
431
517
  .history-form { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-top: 1px solid var(--border); font-size: 0.85rem; color: var(--muted); }
432
518
  .history-form input {
433
- flex: 1; min-width: 0; padding: 6px 10px; border-radius: 8px; border: 1px solid var(--border);
519
+ flex: 1; min-width: 0; padding: 6px 10px; border-radius: var(--radius); border: 1px solid var(--border);
434
520
  background: var(--surface); color: var(--text); font: inherit; font-size: 0.85rem;
435
521
  }
436
522
 
523
+ .launch-tools { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex: 1 1 360px; flex-wrap: wrap; max-width: 680px; }
524
+ .launch-tools .cwd { max-width: none; }
525
+ .github-open { white-space: nowrap; }
526
+ .github-open::before, .github-mark {
527
+ content: ""; display: inline-block; flex: none; background-color: currentColor; mask: var(--icon-github) center / contain no-repeat;
528
+ }
529
+ .github-open::before { width: 1em; height: 1em; margin: 0 0.45em 0 0; vertical-align: -0.15em; }
530
+ .github-mark { width: 26px; height: 26px; color: var(--heading); }
531
+ .github-accounts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid var(--border); }
532
+ .github-chips { display: flex; flex-wrap: wrap; gap: 6px; }
533
+ .github-chip { display: inline-flex; align-items: center; gap: 6px; padding: 2px 10px 2px 3px; font-size: 0.8rem; }
534
+ .github-avatar {
535
+ display: inline-grid; place-items: center; width: 20px; height: 20px; border-radius: 50%; flex: none; object-fit: cover;
536
+ background: var(--c, var(--muted)); color: #fff; font-size: 0.68rem; font-weight: 700;
537
+ }
538
+ .github-add { padding: 3px 10px; font-size: 0.8rem; }
539
+ .github .models-body { padding-top: 10px; }
540
+ .github-card {
541
+ display: grid; gap: 10px; padding: 14px 16px; margin-bottom: 10px; border: 1px solid var(--border); border-radius: var(--radius);
542
+ background: var(--surface-2); font-size: 0.9rem; line-height: 1.45;
543
+ }
544
+ .github-card h3 { margin: 0; font-size: 1rem; }
545
+ .github-card p { margin: 0; }
546
+ .github-small { color: var(--muted); font-size: 0.8rem; }
547
+ .github-error { color: var(--danger); }
548
+ .github-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
549
+ .github-actions a.btn { text-decoration: none; }
550
+ .github-scopes { margin: 0; padding-left: 1.2em; display: grid; gap: 4px; font-size: 0.85rem; }
551
+ .github-scopes code, .github-card code { font-size: 0.8rem; padding: 0 4px; border-radius: 4px; background: var(--surface); }
552
+ .github-steps { margin: 0; padding-left: 1.4em; display: grid; gap: 4px; }
553
+ .github-steps li.done { color: var(--ok); }
554
+ .github-steps li.done::after { content: " ✓"; }
555
+ .github-code { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
556
+ .github-code-text {
557
+ font-family: var(--font-mono); font-size: 1.7rem; font-weight: 700; letter-spacing: 0.12em; padding: 6px 14px;
558
+ border-radius: var(--radius); border: 1px dashed var(--muted); background: var(--surface); color: var(--heading); user-select: all;
559
+ }
560
+ .github-waiting::before {
561
+ content: ""; display: inline-block; width: 8px; height: 8px; margin-right: 8px; border-radius: 50%; background: var(--warn);
562
+ animation: pulse 1.4s ease-in-out infinite;
563
+ }
564
+ .github-status { display: flex; align-items: center; justify-content: space-between; gap: 8px 12px; flex-wrap: wrap; padding: 2px 0 8px; font-size: 0.85rem; }
565
+ .github-ready { color: var(--ok); font-weight: 600; }
566
+ .github-ready::before { content: "✓ "; }
567
+ .github-status-actions { display: flex; gap: 8px; }
568
+ .history-tools.github-tools { padding: 0 0 4px; }
569
+ .github-repo { grid-template-columns: minmax(0, 1fr) auto; }
570
+ .github-repo .history-title { display: flex; align-items: center; gap: 6px; min-width: 0; }
571
+ .github-repo .repo-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
572
+ .github-repo .repo-owner { color: var(--muted); font-weight: 500; }
573
+ .github-repo .badge { flex: none; }
574
+ .github-repo.conflict .history-meta { color: var(--warn); }
575
+ .github-create { margin-top: 10px; }
576
+ .github-fields { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 10px; }
577
+ .github-fields label { display: grid; gap: 4px; font-size: 0.8rem; color: var(--muted); }
578
+ .github-fields label.wide { grid-column: 1 / -1; }
579
+ .github-fields input, .github-fields select {
580
+ min-width: 0; padding: 6px 10px; border-radius: var(--radius); border: 1px solid var(--border);
581
+ background: var(--surface); color: var(--text); font: inherit; font-size: 0.9rem;
582
+ }
583
+ .github-fields input:focus-visible, .github-fields select:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
584
+ .github-options { display: flex; flex-wrap: wrap; gap: 6px 16px; font-size: 0.85rem; }
585
+ .github-options label { display: flex; align-items: center; gap: 6px; cursor: pointer; }
586
+ .github-options label:has(input:disabled) { opacity: 0.6; cursor: default; }
587
+ .github .models-note { display: grid; gap: 4px; font-size: 0.85rem; }
588
+ .toast .toast-action { margin-left: 12px; padding: 2px 10px; background: transparent; box-shadow: none; color: inherit; border-color: currentColor; }
589
+
437
590
  .toast {
438
591
  position: fixed; left: 50%; bottom: 20px; transform: translateX(-50%); z-index: 20;
439
- max-width: min(640px, calc(100vw - 32px)); padding: 10px 14px; border-radius: 8px;
592
+ max-width: min(640px, calc(100vw - 32px)); padding: 10px 14px; border-radius: var(--radius);
440
593
  background: var(--text); color: var(--bg); font-size: 0.9rem; box-shadow: var(--shadow); white-space: pre-wrap;
441
594
  }
442
595
 
596
+ .toast:not([hidden]) { animation: toast-in 0.25s var(--ease); }
597
+ .tip:not([hidden]) { animation: fade-in 0.12s ease-out; }
598
+
599
+ ::view-transition-old(root), ::view-transition-new(root) { animation: none; mix-blend-mode: normal; }
600
+ ::view-transition-new(root) { animation: theme-reveal 0.6s var(--ease); }
601
+
443
602
  @keyframes pulse { 50% { opacity: 0.35; } }
444
603
  @keyframes ring { 0% { transform: scale(0.85); opacity: 0.8; } 100% { transform: scale(1.3); opacity: 0; } }
445
604
  @keyframes stat-fill { from { transform: scaleX(0); } }
446
- @keyframes news-in { from { transform: translateX(24px); opacity: 0; } }
605
+ @keyframes toast-in { from { opacity: 0; transform: translate(-50%, 10px); } }
606
+ @keyframes fade-in { from { opacity: 0; } }
607
+ @keyframes theme-reveal {
608
+ from { clip-path: circle(0 at var(--reveal-x) var(--reveal-y)); }
609
+ to { clip-path: circle(var(--reveal-r) at var(--reveal-x) var(--reveal-y)); }
610
+ }
447
611
 
448
612
  @media (prefers-reduced-motion: reduce) {
449
- .status-pill.active::before, .agent.working::after, .model-detail .stat-fill, .news-panel[open] { animation: none; }
450
- .model-name::before { transition: none; }
613
+ .status-pill.active::before, .agent.working::after, .model-detail .stat-fill, .toast:not([hidden]), .tip:not([hidden]) { animation: none; }
614
+ .model-name::before, .provider .copies summary::before, .btn, .models, .news-panel, .models::backdrop, .news-panel::backdrop { transition: none; }
615
+ .github-waiting::before { animation: none; }
616
+ .btn:active:not(:disabled) { transform: none; }
451
617
  }
452
618
 
453
619
  @media (max-width: 640px) {
@@ -457,6 +623,9 @@ a.news-link:visited { color: var(--muted); }
457
623
  .terminal-panel { inset: var(--topbar-h, 56px) 0 0; border-radius: 0; }
458
624
  .session-grid { grid-template-columns: 1fr; }
459
625
  .cwd { flex-basis: 100%; }
626
+ .launch-tools { flex-basis: 100%; justify-content: stretch; }
627
+ .launch-tools .github-open { flex: 1 1 auto; }
628
+ .github-fields { grid-template-columns: minmax(0, 1fr); }
460
629
  .models { width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh; margin: 0; border-radius: 0; }
461
630
  .model-columns, .model-toggle { grid-template-columns: minmax(0, 1fr) repeat(3, 4.6rem); }
462
631
  .model-columns span:last-child, .model-context { display: none; }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/web/art/page.png DELETED
Binary file