nexus-agentd 0.2.3 → 0.2.5

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.
@@ -1,257 +1,617 @@
1
1
  export const styles = String.raw `
2
+ /* 全局设计约定:间距用 --sp-*、字号用 --fs-*,扩展时不要引入散落的像素值。 */
3
+
2
4
  :root {
3
5
  color-scheme: light;
4
- --bg: #f7f7f8;
5
- --surface: #ffffff;
6
- --surface-subtle: #f1f1f3;
7
- --surface-hover: #ebebee;
8
- --text: #17171a;
9
- --text-muted: #696970;
10
- --text-faint: #929299;
11
- --border: #ddddE2;
12
- --border-strong: #c7c7cd;
13
- --accent: #6d5dfc;
14
- --accent-soft: #eeeafe;
15
- --accent-text: #ffffff;
16
- --success: #18864b;
17
- --success-soft: #e8f5ed;
18
- --danger: #c93636;
19
- --danger-soft: #fceaea;
20
- --focus: #6d5dfc;
21
- --overlay: rgba(18, 18, 20, .42);
22
- --radius: 8px;
23
- --radius-small: 6px;
6
+ --background: 0 0% 100%;
7
+ --foreground: 0 0% 3.9%;
8
+ --card: 0 0% 100%;
9
+ --card-foreground: 0 0% 3.9%;
10
+ --popover: 0 0% 100%;
11
+ --popover-foreground: 0 0% 3.9%;
12
+ --primary: 0 0% 9%;
13
+ --primary-foreground: 0 0% 98%;
14
+ --secondary: 0 0% 96.1%;
15
+ --secondary-foreground: 0 0% 9%;
16
+ --muted: 0 0% 96.1%;
17
+ --muted-foreground: 0 0% 45.1%;
18
+ --accent: 0 0% 96.1%;
19
+ --accent-foreground: 0 0% 9%;
20
+ --destructive: 0 84.2% 60.2%;
21
+ --destructive-foreground: 0 0% 98%;
22
+ --success: 142 76% 36%;
23
+ --warning: 32 95% 44%;
24
+ --info: 217 91% 60%;
25
+ --border: 0 0% 89.8%;
26
+ --input: 0 0% 89.8%;
27
+ --ring: 0 0% 63.9%;
28
+
29
+ --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px;
30
+ --sp-5: 20px; --sp-6: 24px; --sp-8: 32px;
31
+
32
+ /* 字号阶梯,全站只用这六级:
33
+ 2xs 大写微标签(表头 / badge)· xs 辅助说明 · sm 正文与表格
34
+ md 面板与 drawer 标题 · lg 页面标题 · stat 统计数字 */
35
+ --fs-2xs: 11px; --fs-xs: 12px; --fs-sm: 13px;
36
+ --fs-md: 14px; --fs-lg: 16px; --fs-stat: 28px;
37
+
38
+ --radius: 6px;
24
39
  --sidebar-width: 232px;
40
+ --gutter: clamp(var(--sp-6), 4vw, 48px);
25
41
  }
26
42
 
27
43
  html[data-theme="dark"] {
28
44
  color-scheme: dark;
29
- --bg: #111113;
30
- --surface: #19191c;
31
- --surface-subtle: #222226;
32
- --surface-hover: #29292e;
33
- --text: #f3f3f4;
34
- --text-muted: #a3a3aa;
35
- --text-faint: #777780;
36
- --border: #303036;
37
- --border-strong: #44444c;
38
- --accent: #8b7cff;
39
- --accent-soft: #292447;
40
- --accent-text: #ffffff;
41
- --success: #48bd79;
42
- --success-soft: #173525;
43
- --danger: #f06a6a;
44
- --danger-soft: #402020;
45
- --focus: #8b7cff;
46
- --overlay: rgba(0, 0, 0, .62);
47
- }
48
-
49
- * { box-sizing: border-box; }
50
- html, body { margin: 0; min-height: 100%; background: var(--bg); color: var(--text); font-family: "Noto Sans SC", "Microsoft YaHei UI", "PingFang SC", "Hiragino Sans GB", ui-sans-serif, sans-serif; }
51
- body { font-size: 14px; line-height: 1.45; }
52
- button, input, select, textarea { font: inherit; }
53
- button { color: inherit; }
45
+ --background: 0 0% 3.9%;
46
+ --foreground: 0 0% 98%;
47
+ --card: 0 0% 3.9%;
48
+ --card-foreground: 0 0% 98%;
49
+ --popover: 0 0% 3.9%;
50
+ --popover-foreground: 0 0% 98%;
51
+ --primary: 0 0% 98%;
52
+ --primary-foreground: 0 0% 9%;
53
+ --secondary: 0 0% 14.9%;
54
+ --secondary-foreground: 0 0% 98%;
55
+ --muted: 0 0% 14.9%;
56
+ --muted-foreground: 0 0% 63.9%;
57
+ --accent: 0 0% 14.9%;
58
+ --accent-foreground: 0 0% 98%;
59
+ --destructive: 0 62.8% 30.6%;
60
+ --destructive-foreground: 0 0% 98%;
61
+ --success: 142 71% 45%;
62
+ --warning: 38 92% 50%;
63
+ --info: 217 91% 65%;
64
+ --border: 0 0% 14.9%;
65
+ --input: 0 0% 14.9%;
66
+ --ring: 0 0% 83.1%;
67
+ }
68
+
69
+ /* ── Base ─────────────────────────────────────────────────────────── */
70
+ *, *::before, *::after { box-sizing: border-box; }
71
+ html, body { height: 100%; }
72
+ html { scrollbar-gutter: stable; }
73
+ body {
74
+ margin: 0;
75
+ background: hsl(var(--background));
76
+ color: hsl(var(--foreground));
77
+ font: var(--fs-sm)/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans",
78
+ "PingFang SC", "Microsoft YaHei", Helvetica, Arial, sans-serif;
79
+ -webkit-font-smoothing: antialiased;
80
+ text-rendering: optimizeLegibility;
81
+ }
82
+ h1, h2, h3, p { margin: 0; }
83
+ button, input, select, textarea { font: inherit; color: inherit; }
84
+ button { background: none; border: 0; cursor: pointer; padding: 0; }
85
+ code, .mono { font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; }
54
86
  .hidden { display: none !important; }
87
+ .muted { color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); }
88
+
89
+ :focus-visible {
90
+ outline: 2px solid hsl(var(--ring));
91
+ outline-offset: 1px;
92
+ border-radius: 2px;
93
+ }
94
+
95
+ ::selection { background: hsl(var(--accent)); color: hsl(var(--accent-foreground)); }
96
+
97
+ /* Thin scrollbars */
98
+ ::-webkit-scrollbar { width: 10px; height: 10px; }
99
+ ::-webkit-scrollbar-thumb { background: hsl(var(--muted-foreground) / .35); border-radius: 8px; border: 3px solid transparent; background-clip: content-box; }
100
+ ::-webkit-scrollbar-thumb:hover { background-color: hsl(var(--muted-foreground) / .55); }
101
+ ::-webkit-scrollbar-track { background: transparent; }
102
+
103
+ /* ── Brand ────────────────────────────────────────────────────────── */
104
+ .brand-mark {
105
+ width: 28px; height: 28px;
106
+ display: grid; place-items: center;
107
+ background: hsl(var(--primary)); color: hsl(var(--primary-foreground));
108
+ border-radius: var(--radius);
109
+ font-weight: 700; font-size: var(--fs-sm); letter-spacing: -.02em;
110
+ flex-shrink: 0;
111
+ }
112
+
113
+ /* ── Auth screens ─────────────────────────────────────────────────── */
114
+ .auth-screen {
115
+ min-height: 100vh;
116
+ display: grid; place-items: center;
117
+ padding: var(--sp-6);
118
+ background: hsl(var(--muted) / .4);
119
+ }
120
+ .auth-card {
121
+ width: min(400px, 100%);
122
+ padding: var(--sp-6);
123
+ background: hsl(var(--card));
124
+ border: 1px solid hsl(var(--border));
125
+ border-radius: calc(var(--radius) + 2px);
126
+ box-shadow: 0 1px 2px rgb(0 0 0 / .05), 0 8px 24px -8px rgb(0 0 0 / .1);
127
+ }
128
+ .auth-card header { display: flex; align-items: center; gap: var(--sp-3); margin-bottom: var(--sp-5); }
129
+ .auth-card h1 { font-size: var(--fs-lg); font-weight: 600; letter-spacing: -.01em; }
130
+ .auth-card > p { color: hsl(var(--muted-foreground)); font-size: var(--fs-sm); margin-bottom: var(--sp-5); }
131
+ .auth-submit { width: 100%; height: 36px; }
132
+ .avatar {
133
+ width: 26px; height: 26px; flex-shrink: 0;
134
+ display: grid; place-items: center;
135
+ background: hsl(var(--secondary)); color: hsl(var(--secondary-foreground));
136
+ border-radius: 50%;
137
+ font-size: var(--fs-2xs); font-weight: 700;
138
+ }
139
+
140
+ /* ── Forms ────────────────────────────────────────────────────────── */
141
+ .field { display: grid; gap: var(--sp-2); margin-bottom: var(--sp-4); font-size: var(--fs-sm); font-weight: 500; }
142
+ .field > small, .field-help { color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); font-weight: 400; line-height: 1.5; }
143
+ .field-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-4); align-items: start; }
144
+
145
+ input, select, textarea {
146
+ width: 100%; height: 32px;
147
+ padding: 0 var(--sp-3);
148
+ background: transparent;
149
+ border: 1px solid hsl(var(--input));
150
+ border-radius: var(--radius);
151
+ font-size: var(--fs-sm);
152
+ transition: border-color .12s ease, box-shadow .12s ease;
153
+ }
154
+ textarea { height: auto; min-height: 72px; padding: var(--sp-2) var(--sp-3); resize: vertical; line-height: 1.5; }
155
+ input:hover, select:hover, textarea:hover { border-color: hsl(var(--muted-foreground) / .6); }
156
+ input:focus, select:focus, textarea:focus { outline: none; border-color: hsl(var(--ring)); box-shadow: 0 0 0 2px hsl(var(--ring) / .2); }
157
+ input:disabled, select:disabled, textarea:disabled { opacity: .5; cursor: not-allowed; }
158
+ input[type="checkbox"] { width: 14px; height: 14px; padding: 0; accent-color: hsl(var(--primary)); }
159
+
160
+ .checkbox { display: flex; align-items: center; gap: var(--sp-2); height: 32px; font-weight: 500; cursor: pointer; }
161
+ .checkbox input { flex-shrink: 0; }
162
+
163
+ .form-error { min-height: 18px; margin-top: var(--sp-2); color: hsl(var(--destructive)); font-size: var(--fs-xs); font-weight: 500; }
164
+ .confirm-text { color: hsl(var(--muted-foreground)); font-size: var(--fs-sm); line-height: 1.6; }
165
+
166
+ /* ── Buttons ──────────────────────────────────────────────────────── */
167
+ .button {
168
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2);
169
+ height: 32px; padding: 0 var(--sp-3);
170
+ border: 1px solid hsl(var(--input));
171
+ border-radius: var(--radius);
172
+ background: hsl(var(--card));
173
+ font-size: var(--fs-sm); font-weight: 500; white-space: nowrap;
174
+ box-shadow: 0 1px 2px rgb(0 0 0 / .04);
175
+ transition: background-color .12s ease, border-color .12s ease;
176
+ }
177
+ .button:hover:not(:disabled) { background: hsl(var(--accent)); color: hsl(var(--accent-foreground)); }
178
+ .button:disabled { opacity: .5; cursor: not-allowed; }
179
+ .button.primary { background: hsl(var(--primary)); border-color: hsl(var(--primary)); color: hsl(var(--primary-foreground)); }
180
+ .button.primary:hover:not(:disabled) { background: hsl(var(--primary) / .88); color: hsl(var(--primary-foreground)); }
181
+ .button.danger { border-color: hsl(var(--destructive) / .5); color: hsl(var(--destructive)); }
182
+ .button.danger:hover:not(:disabled) { background: hsl(var(--destructive) / .08); }
183
+ .button.solid-danger { background: hsl(var(--destructive)); border-color: hsl(var(--destructive)); color: hsl(var(--destructive-foreground)); }
184
+ .button.solid-danger:hover:not(:disabled) { background: hsl(var(--destructive) / .9); color: hsl(var(--destructive-foreground)); }
185
+ .button.small { height: 26px; padding: 0 var(--sp-2); font-size: var(--fs-xs); }
186
+ .button svg, .menu-button svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; flex-shrink: 0; }
187
+
188
+ .icon-button {
189
+ display: inline-flex; align-items: center; justify-content: center;
190
+ width: 32px; height: 32px; flex-shrink: 0;
191
+ border-radius: var(--radius);
192
+ color: hsl(var(--muted-foreground));
193
+ transition: background-color .12s ease, color .12s ease;
194
+ }
195
+ .icon-button:hover { background: hsl(var(--accent)); color: hsl(var(--accent-foreground)); }
196
+ .icon-button svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
197
+
198
+ /* ── App shell ────────────────────────────────────────────────────── */
199
+ .app-shell { min-height: 100vh; display: flex; }
200
+
201
+ .sidebar {
202
+ position: fixed; inset: 0 auto 0 0;
203
+ width: var(--sidebar-width);
204
+ padding: var(--sp-3) var(--sp-2);
205
+ display: flex; flex-direction: column; gap: var(--sp-2);
206
+ background: hsl(var(--card));
207
+ border-right: 1px solid hsl(var(--border));
208
+ z-index: 10;
209
+ }
210
+ .brand {
211
+ display: flex; align-items: center; gap: var(--sp-2);
212
+ height: 40px; padding: 0 var(--sp-2);
213
+ font-weight: 600; font-size: var(--fs-sm); letter-spacing: -.01em;
214
+ }
215
+ nav { display: flex; flex-direction: column; gap: 2px; }
216
+ .nav-item {
217
+ width: 100%; height: 32px;
218
+ display: flex; align-items: center; gap: var(--sp-2);
219
+ padding: 0 var(--sp-2);
220
+ border-radius: var(--radius);
221
+ color: hsl(var(--muted-foreground));
222
+ font-size: var(--fs-sm); font-weight: 500; text-align: left;
223
+ transition: background-color .12s ease, color .12s ease;
224
+ }
225
+ .nav-item:hover { background: hsl(var(--accent)); color: hsl(var(--accent-foreground)); }
226
+ .nav-item.active { background: hsl(var(--secondary)); color: hsl(var(--secondary-foreground)); font-weight: 600; }
227
+ .nav-item svg { width: 15px; height: 15px; flex-shrink: 0; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
55
228
 
56
- .auth-screen { min-height: 100vh; display: grid; place-items: center; padding: 24px; }
57
- .auth-card { width: min(400px, 100%); padding: 28px; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; }
58
- .auth-card h1 { margin: 18px 0 6px; font-size: 22px; letter-spacing: -.02em; }
59
- .auth-card p { color: var(--text-muted); margin: 0 0 22px; }
60
- .brand-mark { width: 38px; height: 38px; border-radius: 9px; display: grid; place-items: center; background: var(--text); color: var(--surface); font-weight: 750; font-size: 18px; }
61
- .brand-mark.small { width: 28px; height: 28px; border-radius: 7px; font-size: 14px; }
62
-
63
- label { display: grid; gap: 7px; margin-bottom: 16px; color: var(--text-muted); font-size: 13px; font-weight: 600; }
64
- input, select, textarea { width: 100%; min-height: 38px; padding: 8px 10px; color: var(--text); background: var(--surface); border: 1px solid var(--border-strong); border-radius: var(--radius-small); outline: none; }
65
- textarea { min-height: 90px; resize: vertical; }
66
- input:focus, select:focus, textarea:focus, button:focus-visible { border-color: var(--focus); outline: 2px solid var(--accent-soft); outline-offset: 1px; }
67
- .form-error { min-height: 20px; margin: 12px 0 0 !important; color: var(--danger) !important; }
68
-
69
- .app-shell { min-height: 100vh; }
70
- .sidebar { position: fixed; inset: 0 auto 0 0; width: var(--sidebar-width); padding: 16px 12px; background: var(--surface); border-right: 1px solid var(--border); display: flex; flex-direction: column; z-index: 10; }
71
- .brand { display: flex; align-items: center; gap: 10px; height: 44px; padding: 0 8px; font-weight: 700; letter-spacing: -.01em; }
72
- nav { display: grid; gap: 3px; margin-top: 18px; }
73
- .nav-item, .admin-button, .menu-button { border: 0; background: transparent; cursor: pointer; }
74
- .nav-item { width: 100%; min-height: 38px; display: flex; align-items: center; gap: 10px; padding: 0 10px; border-radius: var(--radius-small); color: var(--text-muted); text-align: left; }
75
- .nav-item:hover { background: var(--surface-subtle); color: var(--text); }
76
- .nav-item.active { background: var(--accent-soft); color: var(--accent); font-weight: 650; }
77
- .nav-item svg, .admin-button svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; flex: none; }
78
229
  .admin-menu-wrap { position: relative; margin-top: auto; }
79
- .admin-button { width: 100%; display: flex; gap: 10px; align-items: center; padding: 10px; border-radius: var(--radius); text-align: left; }
80
- .admin-button:hover { background: var(--surface-subtle); }
81
- .admin-button span { display: grid; min-width: 0; }
82
- .admin-button strong { font-size: 13px; }
83
- .admin-button small { color: var(--text-muted); }
84
- .admin-popover { position: absolute; inset: auto 0 calc(100% + 8px); padding: 10px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); }
85
- .admin-popover label { margin: 0 0 8px; }
86
- .menu-button { width: 100%; padding: 9px 8px; border-radius: var(--radius-small); text-align: left; }
87
- .menu-button:hover { background: var(--surface-subtle); }
88
- .danger-text { color: var(--danger); }
89
-
90
- .main { margin-left: var(--sidebar-width); min-height: 100vh; padding: 32px clamp(24px, 5vw, 68px) 64px; }
91
- .page-header { min-height: 66px; display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; margin-bottom: 26px; }
92
- .page-header h1 { margin: 0; font-size: 24px; letter-spacing: -.025em; }
93
- .page-header p { margin: 5px 0 0; color: var(--text-muted); }
94
- .page-actions { display: flex; gap: 8px; align-items: center; }
95
- .page-content { max-width: 1180px; }
96
- .button, .icon-button { min-height: 36px; border: 1px solid var(--border-strong); border-radius: var(--radius-small); background: var(--surface); cursor: pointer; font-weight: 600; }
97
- .button { padding: 0 13px; }
98
- .button:hover, .icon-button:hover { background: var(--surface-hover); }
99
- .button.primary { background: var(--accent); border-color: var(--accent); color: var(--accent-text); }
100
- .button.primary:hover { background: var(--accent); }
101
- .button.danger { border-color: var(--danger); color: var(--danger); }
102
- .button.ghost { border-color: transparent; background: transparent; }
103
- .button.small { min-height: 30px; padding: 0 9px; font-size: 12px; }
104
- .icon-button { width: 36px; padding: 0; font-size: 22px; }
105
-
106
- .stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 22px; }
107
- .stat, .panel { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); }
108
- .stat { padding: 16px; }
109
- .stat span { display: block; color: var(--text-muted); font-size: 12px; font-weight: 650; }
110
- .stat strong { display: block; margin-top: 7px; font-size: 25px; letter-spacing: -.03em; }
111
- .panel-header { min-height: 52px; padding: 0 16px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--border); }
112
- .panel-header h2 { margin: 0; font-size: 14px; }
113
- .panel-body { padding: 16px; }
114
- .empty { padding: 36px 18px; color: var(--text-muted); text-align: center; }
115
-
116
- .toolbar { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
117
- .toolbar input { max-width: 300px; }
118
- .toolbar select { width: 150px; }
119
- .table-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); }
120
- table { width: 100%; border-collapse: collapse; min-width: 760px; }
121
- th, td { padding: 12px 14px; border-bottom: 1px solid var(--border); text-align: left; vertical-align: middle; }
122
- th { color: var(--text-muted); background: var(--surface-subtle); font-size: 11px; letter-spacing: .04em; text-transform: uppercase; }
123
- tr:last-child td { border-bottom: 0; }
124
- .agent-name { display: grid; gap: 2px; }
125
- .agent-name strong { font-size: 13px; }
126
- .agent-name small, .muted { color: var(--text-muted); }
127
- .status { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 650; }
128
- .status::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--text-faint); }
129
- .status.ready { color: var(--success); }
130
- .status.ready::before { background: var(--success); }
131
- .status.checking { color: var(--text-muted); }
132
- .status.checking::before { background: var(--text-faint); }
133
- .status.failed { color: var(--danger); }
134
- .status.failed::before { background: var(--danger); }
135
- .status.running { color: #1d68b3; }
136
- .status.running::before { background: #2b7ecb; box-shadow: 0 0 0 3px rgba(43, 126, 203, .13); }
137
- .status.waiting { color: #9a6500; }
138
- .status.waiting::before { background: #d49313; }
139
- .status.completed { color: var(--success); }
140
- .status.completed::before { background: var(--success); }
141
- .status.canceled { color: var(--text-muted); }
142
- .badge { display: inline-flex; padding: 3px 7px; border-radius: 999px; background: var(--surface-subtle); color: var(--text-muted); font-size: 11px; font-weight: 700; text-transform: uppercase; }
143
- .row-actions { display: flex; justify-content: flex-end; gap: 5px; }
144
- .error-detail { max-width: 280px; color: var(--danger); font-size: 12px; overflow-wrap: anywhere; }
145
-
146
- .run-summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; margin-bottom: 16px; overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius); background: var(--border); }
147
- .run-summary-item { min-height: 74px; padding: 13px 15px; background: var(--surface); }
148
- .run-summary-item span { display: block; color: var(--text-muted); font-size: 11px; font-weight: 700; letter-spacing: .04em; }
149
- .run-summary-item strong { display: block; margin-top: 5px; font: 700 22px/1 ui-monospace, SFMono-Regular, Consolas, monospace; }
150
- .run-section { margin-top: 18px; }
151
- .run-section-title { display: flex; align-items: baseline; justify-content: space-between; margin: 0 0 9px; }
152
- .run-section-title h2 { margin: 0; font-size: 14px; }
153
- .run-section-title span { color: var(--text-muted); font-size: 12px; }
154
- .run-live-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
155
- .run-card { position: relative; min-height: 148px; padding: 14px 15px; border: 1px solid var(--border); border-left: 3px solid #2b7ecb; border-radius: var(--radius); background: var(--surface); cursor: pointer; }
156
- .run-card:hover { border-color: var(--border-strong); border-left-color: var(--accent); }
157
- .run-card.waiting { border-left-color: #d49313; }
158
- .run-card-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
159
- .run-card-agent { display: flex; align-items: center; gap: 8px; min-width: 0; }
160
- .run-card-agent strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
161
- .run-task { margin: 13px 0 15px; display: -webkit-box; overflow: hidden; color: var(--text); font-size: 13px; line-height: 1.55; -webkit-line-clamp: 2; -webkit-box-orient: vertical; white-space: pre-wrap; }
162
- .run-progress { display: grid; gap: 3px; }
163
- .run-progress strong { font-size: 12px; }
164
- .run-progress small { color: var(--text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
165
- .run-meta { margin-top: 12px; display: flex; align-items: center; justify-content: space-between; color: var(--text-muted); font: 11px/1.4 ui-monospace, SFMono-Regular, Consolas, monospace; }
166
- .run-table { min-width: 940px; }
167
- .run-table tbody tr { cursor: pointer; }
168
- .run-table tbody tr:hover td { background: var(--surface-hover); }
230
+ .admin-button {
231
+ width: 100%; display: flex; align-items: center; gap: var(--sp-2);
232
+ padding: var(--sp-2);
233
+ border-radius: var(--radius);
234
+ text-align: left;
235
+ transition: background-color .12s ease;
236
+ }
237
+ .admin-button:hover { background: hsl(var(--accent)); }
238
+ .admin-button > svg { width: 15px; height: 15px; flex-shrink: 0; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
239
+ .admin-meta { display: grid; min-width: 0; }
240
+ .admin-button strong { font-size: var(--fs-sm); font-weight: 600; }
241
+ .admin-popover {
242
+ position: absolute; inset: auto 0 calc(100% + var(--sp-2));
243
+ padding: var(--sp-2);
244
+ background: hsl(var(--popover));
245
+ border: 1px solid hsl(var(--border));
246
+ border-radius: calc(var(--radius) + 2px);
247
+ box-shadow: 0 8px 24px -4px rgb(0 0 0 / .12), 0 2px 8px -2px rgb(0 0 0 / .08);
248
+ z-index: 20;
249
+ }
250
+ .admin-popover .field { margin-bottom: var(--sp-2); font-size: var(--fs-xs); }
251
+ .menu-button {
252
+ width: 100%; height: 30px;
253
+ display: flex; align-items: center;
254
+ padding: 0 var(--sp-2);
255
+ border-radius: var(--radius);
256
+ font-size: var(--fs-sm); font-weight: 500; text-align: left;
257
+ transition: background-color .12s ease;
258
+ }
259
+ .menu-button:hover { background: hsl(var(--accent)); }
260
+ .danger-text { color: hsl(var(--destructive)); }
261
+
262
+ /* ── Main / page chrome ───────────────────────────────────────────── */
263
+ .main {
264
+ flex: 1; min-width: 0;
265
+ margin-left: var(--sidebar-width);
266
+ min-height: 100vh;
267
+ display: flex; flex-direction: column;
268
+ }
269
+ .topbar {
270
+ position: sticky; top: 0; z-index: 5;
271
+ height: 56px;
272
+ display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4);
273
+ padding: 0 var(--gutter);
274
+ background: hsl(var(--background));
275
+ border-bottom: 1px solid hsl(var(--border));
276
+ }
277
+ .topbar h1 { font-size: var(--fs-lg); font-weight: 600; letter-spacing: -.01em; }
278
+ .page-actions { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
279
+
280
+ .page-content {
281
+ flex: 1; width: 100%;
282
+ padding: var(--sp-5) var(--gutter) var(--sp-6);
283
+ display: flex; flex-direction: column; gap: var(--sp-4);
284
+ }
285
+
286
+ /* ── Cards / panels ───────────────────────────────────────────────── */
287
+ .panel {
288
+ background: hsl(var(--card));
289
+ border: 1px solid hsl(var(--border));
290
+ border-radius: calc(var(--radius) + 2px);
291
+ }
292
+ .panel-header {
293
+ min-height: 44px;
294
+ padding: 0 var(--sp-4);
295
+ display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4);
296
+ border-bottom: 1px solid hsl(var(--border));
297
+ }
298
+ .panel-header h2 { font-size: var(--fs-md); font-weight: 600; }
299
+ .panel-body { padding: var(--sp-4); }
300
+ .empty { padding: var(--sp-8) var(--sp-4); color: hsl(var(--muted-foreground)); text-align: center; font-size: var(--fs-sm); }
301
+ .empty-state { display: grid; justify-items: center; gap: var(--sp-1); padding: var(--sp-8) var(--sp-4); text-align: center; }
302
+ .empty-state > svg { width: 28px; height: 28px; margin-bottom: var(--sp-2); color: hsl(var(--muted-foreground)); fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
303
+ .empty-state strong { font-size: var(--fs-md); font-weight: 600; color: hsl(var(--foreground)); }
304
+ .empty-state span { font-size: var(--fs-xs); color: hsl(var(--muted-foreground)); }
305
+ .empty-state .button { margin-top: var(--sp-3); }
306
+
307
+ /* Stats */
308
+ .stats { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-4); }
309
+ .stat {
310
+ padding: var(--sp-4) var(--sp-5);
311
+ background: hsl(var(--card));
312
+ border: 1px solid hsl(var(--border));
313
+ border-radius: calc(var(--radius) + 2px);
314
+ display: grid; gap: var(--sp-1);
315
+ }
316
+ .stat span { color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); font-weight: 500; }
317
+ .stat strong { font-size: var(--fs-stat); font-weight: 600; letter-spacing: -.02em; line-height: 1.2; font-variant-numeric: tabular-nums; }
318
+
319
+ /* ── Toolbar ──────────────────────────────────────────────────────── */
320
+ .toolbar { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
321
+ .toolbar select { width: auto; min-width: 128px; }
322
+ .search-box { position: relative; flex: 1; min-width: 160px; max-width: 280px; }
323
+ .search-box svg { position: absolute; left: 10px; top: 50%; transform: translateY(-50%); width: 14px; height: 14px; color: hsl(var(--muted-foreground)); fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; pointer-events: none; }
324
+ .search-box input { width: 100%; padding-left: 30px; }
325
+
326
+ /* ── Tables ───────────────────────────────────────────────────────── */
327
+ .table-wrap {
328
+ overflow-x: auto;
329
+ background: hsl(var(--card));
330
+ border: 1px solid hsl(var(--border));
331
+ border-radius: calc(var(--radius) + 2px);
332
+ }
333
+ table { width: 100%; border-collapse: collapse; min-width: 720px; }
334
+ th, td { padding: 0 var(--sp-4); height: 40px; border-bottom: 1px solid hsl(var(--border)); text-align: left; vertical-align: middle; }
335
+ th { height: 36px; color: hsl(var(--muted-foreground)); font-size: var(--fs-2xs); font-weight: 600; letter-spacing: .05em; text-transform: uppercase; white-space: nowrap; }
336
+ tbody tr:last-child td { border-bottom: 0; }
337
+ tbody tr:hover { background: hsl(var(--muted) / .5); }
338
+ tr[data-run-detail] { cursor: pointer; }
339
+
340
+ .agent-name { display: grid; gap: 2px; min-width: 0; }
341
+ .agent-name strong { font-size: var(--fs-sm); font-weight: 600; overflow: hidden; text-overflow: ellipsis; }
342
+ .agent-name small { color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
343
+ .error-detail { color: hsl(var(--destructive)); font-size: var(--fs-sm); overflow-wrap: anywhere; line-height: 1.4; }
344
+ .row-actions { display: flex; justify-content: flex-end; gap: var(--sp-2); }
345
+
346
+ /* ── Badges & status ──────────────────────────────────────────────── */
347
+ .badge {
348
+ display: inline-flex; align-items: center;
349
+ height: 20px; padding: 0 var(--sp-2);
350
+ border: 1px solid hsl(var(--border));
351
+ border-radius: 4px;
352
+ background: hsl(var(--secondary));
353
+ color: hsl(var(--secondary-foreground));
354
+ font-size: var(--fs-2xs); font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
355
+ }
356
+ .status {
357
+ display: inline-flex; align-items: center; gap: var(--sp-2);
358
+ height: 22px; padding: 0 var(--sp-2);
359
+ border-radius: 9999px;
360
+ background: hsl(var(--secondary));
361
+ color: hsl(var(--muted-foreground));
362
+ font-size: var(--fs-xs); font-weight: 500; white-space: nowrap;
363
+ }
364
+ .status::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: hsl(var(--muted-foreground) / .5); flex-shrink: 0; }
365
+ .status.ready, .status.completed { color: hsl(var(--success)); background: hsl(var(--success) / .1); }
366
+ .status.ready::before, .status.completed::before { background: hsl(var(--success)); }
367
+ .status.failed { color: hsl(var(--destructive)); background: hsl(var(--destructive) / .1); }
368
+ .status.failed::before { background: hsl(var(--destructive)); }
369
+ .status.running { color: hsl(var(--info)); background: hsl(var(--info) / .1); }
370
+ .status.running::before { background: hsl(var(--info)); animation: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; }
371
+ .status.waiting { color: hsl(var(--warning)); background: hsl(var(--warning) / .12); }
372
+ .status.waiting::before { background: hsl(var(--warning)); animation: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; }
373
+ .status.checking::before { animation: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; }
374
+ @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: .4; } }
375
+
376
+ /* ── Runs page ────────────────────────────────────────────────────── */
377
+ .run-summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--sp-4); }
378
+ .run-section { display: flex; flex-direction: column; gap: var(--sp-3); }
379
+ .run-section-title { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-4); }
380
+ .run-section-title h2 { font-size: var(--fs-md); font-weight: 600; }
381
+ .run-section-title span { color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); }
382
+
383
+ .run-live-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: var(--sp-3); }
384
+ .run-card {
385
+ position: relative;
386
+ display: flex; flex-direction: column; gap: var(--sp-2);
387
+ padding: var(--sp-3) var(--sp-4);
388
+ background: hsl(var(--card));
389
+ border: 1px solid hsl(var(--border));
390
+ border-left: 3px solid hsl(var(--info));
391
+ border-radius: calc(var(--radius) + 2px);
392
+ cursor: pointer;
393
+ transition: border-color .12s ease, box-shadow .12s ease;
394
+ }
395
+ .run-card:hover { border-color: hsl(var(--muted-foreground) / .4); box-shadow: 0 2px 8px -2px rgb(0 0 0 / .08); }
396
+ .run-card.waiting { border-left-color: hsl(var(--warning)); }
397
+ .run-card-head { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); }
398
+ .run-card-agent { display: flex; align-items: center; gap: var(--sp-2); min-width: 0; }
399
+ .run-card-agent strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); font-weight: 600; }
400
+ .run-task {
401
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
402
+ overflow: hidden;
403
+ color: hsl(var(--foreground));
404
+ font-size: var(--fs-sm); line-height: 1.5;
405
+ white-space: pre-wrap;
406
+ }
407
+ .run-progress { display: grid; gap: 2px; }
408
+ .run-progress strong { font-size: var(--fs-xs); font-weight: 600; }
409
+ .run-progress small { color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
410
+ .run-meta {
411
+ display: flex; align-items: center; justify-content: space-between;
412
+ color: hsl(var(--muted-foreground));
413
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
414
+ font-size: var(--fs-2xs); line-height: 1.4;
415
+ font-variant-numeric: tabular-nums;
416
+ }
417
+ .run-table { min-width: 880px; }
169
418
  .run-table .run-task-cell { max-width: 360px; }
170
- .run-table .run-task-cell strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
171
- .run-table .run-task-cell small { display: block; margin-top: 3px; color: var(--text-muted); }
172
- .run-detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0; margin-bottom: 18px; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
173
- .run-detail-item { padding: 11px 12px; border-bottom: 1px solid var(--border); background: var(--surface-subtle); }
174
- .run-detail-item:nth-child(odd) { border-right: 1px solid var(--border); }
175
- .run-detail-item span { display: block; color: var(--text-muted); font-size: 11px; }
176
- .run-detail-item strong { display: block; margin-top: 4px; font-size: 13px; overflow-wrap: anywhere; }
177
- .run-detail-block { margin: 0 0 16px; }
178
- .run-detail-block h3 { margin: 0 0 7px; color: var(--text-muted); font-size: 11px; letter-spacing: .05em; }
179
- .run-detail-code { margin: 0; padding: 12px; max-height: 320px; overflow: auto; border: 1px solid var(--border); border-radius: var(--radius-small); background: var(--surface-subtle); color: var(--text); font: 12px/1.6 ui-monospace, SFMono-Regular, Consolas, monospace; overflow-wrap: anywhere; white-space: pre-wrap; }
180
- .run-id { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; }
181
-
182
- .key-table { min-width: 900px; }
419
+ .run-table th.num, .run-table td.num { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }
420
+ .run-task-cell strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; font-size: var(--fs-sm); }
421
+ .run-task-cell small { display: block; margin-top: 2px; color: hsl(var(--muted-foreground)); font-size: var(--fs-2xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
422
+
423
+ /* Run detail (drawer) */
424
+ .run-detail-grid {
425
+ display: grid; grid-template-columns: 1fr 1fr; gap: 1px;
426
+ margin-bottom: var(--sp-4);
427
+ border: 1px solid hsl(var(--border));
428
+ border-radius: calc(var(--radius) + 2px);
429
+ overflow: hidden;
430
+ background: hsl(var(--border));
431
+ }
432
+ .run-detail-item { padding: var(--sp-3); background: hsl(var(--card)); display: grid; gap: var(--sp-1); align-content: start; }
433
+ .run-detail-item span { color: hsl(var(--muted-foreground)); font-size: var(--fs-2xs); font-weight: 600; letter-spacing: .05em; text-transform: uppercase; }
434
+ .run-detail-item strong { font-size: var(--fs-sm); font-weight: 500; overflow-wrap: anywhere; }
435
+ .run-detail-block { margin-bottom: var(--sp-4); }
436
+ .run-detail-block h3 { margin: 0 0 var(--sp-2); color: hsl(var(--muted-foreground)); font-size: var(--fs-2xs); font-weight: 600; letter-spacing: .05em; text-transform: uppercase; }
437
+ .run-detail-code {
438
+ margin: 0; padding: var(--sp-3);
439
+ max-height: 320px; overflow: auto;
440
+ border: 1px solid hsl(var(--border));
441
+ border-radius: var(--radius);
442
+ background: hsl(var(--muted) / .4);
443
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
444
+ font-size: var(--fs-xs); line-height: 1.6;
445
+ overflow-wrap: anywhere; white-space: pre-wrap;
446
+ }
447
+ .run-id { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
448
+
449
+ /* ── Lists (workspaces, overview, artifacts) ──────────────────────── */
450
+ .workspace-list, .overview-list { display: grid; gap: var(--sp-2); }
451
+ .list-row {
452
+ min-height: 48px;
453
+ display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4);
454
+ padding: var(--sp-3) var(--sp-4);
455
+ background: hsl(var(--card));
456
+ border: 1px solid hsl(var(--border));
457
+ border-radius: calc(var(--radius) + 2px);
458
+ transition: border-color .12s ease;
459
+ }
460
+ .list-row:hover { border-color: hsl(var(--muted-foreground) / .4); }
461
+ .list-row-main { display: grid; gap: 2px; min-width: 0; }
462
+ .list-row-main strong, .path { font-size: var(--fs-sm); font-weight: 600; overflow-wrap: anywhere; }
463
+ .list-row-main small { color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); }
464
+ .panel-body > .workspace-list, .panel-body > .overview-list { gap: var(--sp-2); }
465
+ .panel-body .list-row { border-radius: var(--radius); }
466
+
467
+ /* ── API keys ─────────────────────────────────────────────────────── */
468
+ .key-table { min-width: 0; width: 100%; table-layout: fixed; }
183
469
  .key-table th:nth-child(1) { width: 21%; }
184
- .key-table th:nth-child(2) { width: 12%; }
185
- .key-table th:nth-child(3) { width: 18%; }
186
- .key-table th:nth-child(4) { width: 17%; }
187
- .key-table th:nth-child(5) { width: 19%; }
188
- .key-table td { height: 66px; }
189
- .key-actions-heading { text-align: right; }
190
- .key-secret-cell { display: flex; align-items: center; gap: 7px; white-space: nowrap; }
191
- .key-secret-cell code { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; color: var(--text-muted); letter-spacing: .02em; }
192
- .key-copy-button, .key-icon-button { display: inline-grid; place-items: center; width: 32px; height: 32px; padding: 0; border: 0; border-radius: var(--radius-small); background: transparent; color: var(--text-muted); cursor: pointer; }
193
- .key-copy-button { width: 28px; height: 28px; }
194
- .key-copy-button:hover, .key-icon-button:hover, .key-icon-button[aria-expanded="true"] { color: var(--text); background: var(--surface-hover); }
195
- .key-copy-button svg, .key-icon-button svg, .key-action-menu svg { width: 17px; height: 17px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
196
- .key-icon-button.danger-action { color: var(--danger); }
197
- .key-icon-button.danger-action:hover { background: var(--danger-soft); }
198
- .key-scope, .key-last-used { color: var(--text-muted); font-size: 13px; }
199
- .key-actions-cell { text-align: right; }
200
- .key-actions { display: inline-flex; align-items: center; justify-content: flex-end; gap: 3px; }
201
- .key-action-menu { position: fixed; z-index: 45; width: 190px; padding: 6px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); }
202
- .key-action-menu button { width: 100%; min-height: 38px; display: flex; align-items: center; gap: 10px; padding: 0 10px; border: 0; border-radius: var(--radius-small); background: transparent; color: var(--text); cursor: pointer; text-align: left; font-size: 13px; }
203
- .key-action-menu button:hover { background: var(--surface-hover); }
204
- .key-action-menu button.danger-text { color: var(--danger); border-top: 1px solid var(--border); border-radius: 0 0 var(--radius-small) var(--radius-small); margin-top: 4px; padding-top: 4px; min-height: 42px; }
205
- .key-action-menu button.danger-text:hover { background: var(--danger-soft); }
206
-
207
- .workspace-list, .key-list, .overview-list { display: grid; gap: 8px; }
208
- .list-row { min-height: 58px; padding: 10px 12px; display: flex; align-items: center; justify-content: space-between; gap: 16px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); }
209
- .list-row-main { min-width: 0; display: grid; gap: 3px; }
210
- .list-row-main strong, .path { overflow-wrap: anywhere; }
211
- .list-row-main small { color: var(--text-muted); }
212
- .tip { margin-top: 14px; padding: 12px; background: var(--surface-subtle); border-radius: var(--radius-small); color: var(--text-muted); font-size: 12px; }
213
-
214
- .drawer-backdrop { position: fixed; inset: 0; background: var(--overlay); z-index: 30; }
215
- .drawer { position: fixed; inset: 0 0 0 auto; width: min(460px, 100vw); background: var(--surface); border-left: 1px solid var(--border); z-index: 31; display: flex; flex-direction: column; }
216
- .drawer-header { min-height: 64px; padding: 0 18px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--border); }
217
- .drawer-header h2 { margin: 0; font-size: 17px; }
218
- .drawer-body { padding: 20px; overflow-y: auto; }
219
- .drawer-footer { display: flex; justify-content: flex-end; gap: 8px; padding-top: 12px; }
220
- .field-help { margin-top: -2px; color: var(--text-muted); font-size: 12px; font-weight: 400; line-height: 1.5; }
221
- .field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
222
- .settings-layout { display: grid; grid-template-columns: minmax(0, 760px); }
223
- .settings-form { overflow: hidden; }
224
- .settings-form .panel-header { align-items: flex-start; padding-top: 16px; padding-bottom: 14px; }
225
- .settings-form .panel-header h2 { font-size: 16px; }
226
- .settings-subtitle { margin: 5px 0 0; color: var(--text-muted); font-size: 12px; }
227
- .settings-fields { display: grid; gap: 18px; padding: 20px 16px 4px; }
228
- .settings-fields label { gap: 7px; }
229
- .settings-fields input { max-width: 260px; }
230
- .settings-divider { height: 1px; margin: 18px 16px 0; background: var(--border); }
231
- .settings-note { display: grid; gap: 4px; margin: 16px; padding: 12px; border-radius: var(--radius-small); background: var(--surface-subtle); color: var(--text-muted); font-size: 12px; line-height: 1.5; }
232
- .settings-note strong { color: var(--text); font-size: 13px; }
233
- .settings-actions { display: flex; justify-content: flex-end; padding: 0 16px 16px; }
234
- .checkbox { display: flex; align-items: center; gap: 8px; min-height: 34px; }
235
- .checkbox input { width: 16px; min-height: 16px; }
236
- .agent-scope { max-height: 170px; overflow: auto; padding: 10px; border: 1px solid var(--border); border-radius: var(--radius-small); }
237
- .secret-box { margin: 12px 0; padding: 12px; background: var(--surface-subtle); border: 1px solid var(--border); border-radius: var(--radius); }
238
- .secret-value { display: block; margin: 8px 0 10px; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; }
239
-
240
- .toast-region { position: fixed; right: 18px; bottom: 18px; z-index: 50; display: grid; gap: 8px; }
241
- .toast { max-width: 380px; padding: 11px 13px; background: var(--text); color: var(--surface); border-radius: var(--radius-small); }
242
- .toast.error { background: var(--danger); color: var(--accent-text); }
243
-
244
- @media (max-width: 760px) {
245
- :root { --sidebar-width: 72px; }
246
- .brand span:last-child, .nav-item span, .admin-button span { display: none; }
247
- .brand { justify-content: center; }
248
- .nav-item, .admin-button { justify-content: center; }
249
- .main { padding: 24px 16px 48px; }
470
+ .key-table th:nth-child(2) { width: 15%; }
471
+ .key-table th:nth-child(3) { width: 20%; }
472
+ .key-table th:nth-child(4) { width: 15%; }
473
+ .key-table th:nth-child(5) { width: 15%; }
474
+ .key-table th:nth-child(6) { width: 14%; }
475
+ .key-table th, .key-table td { padding-left: 10px; padding-right: 10px; }
476
+ .key-table-wrap { overflow-x: hidden; }
477
+ .key-table th:last-child, .key-table td:last-child { text-align: right; }
478
+ .key-secret-cell { display: flex; align-items: center; gap: var(--sp-2); white-space: nowrap; }
479
+ .key-secret-cell code { color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); letter-spacing: .02em; }
480
+ .key-copy-button, .key-icon-button {
481
+ display: inline-flex; align-items: center; justify-content: center;
482
+ width: 28px; height: 28px;
483
+ border-radius: var(--radius);
484
+ color: hsl(var(--muted-foreground));
485
+ cursor: pointer;
486
+ transition: background-color .12s ease, color .12s ease, box-shadow .12s ease;
487
+ }
488
+ .key-copy-button:hover, .key-icon-button:hover { background: hsl(var(--accent)); color: hsl(var(--accent-foreground)); }
489
+ .key-icon-button[aria-expanded="true"] {
490
+ background: hsl(var(--accent)); color: hsl(var(--accent-foreground));
491
+ box-shadow: 0 0 0 2px hsl(var(--ring) / .35);
492
+ }
493
+ .key-copy-button svg, .key-icon-button svg, .key-action-menu svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
494
+ .key-icon-button.danger-action { color: hsl(var(--destructive)); }
495
+ .key-icon-button.danger-action:hover { background: hsl(var(--destructive) / .08); }
496
+ .key-scope, .key-last-used { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: hsl(var(--muted-foreground)); font-size: var(--fs-xs); }
497
+ .key-actions { display: inline-flex; align-items: center; justify-content: flex-end; gap: 2px; }
498
+
499
+ .key-action-menu {
500
+ position: fixed; z-index: 50;
501
+ width: 188px; padding: var(--sp-1);
502
+ background: hsl(var(--popover));
503
+ border: 1px solid hsl(var(--border));
504
+ border-radius: calc(var(--radius) + 2px);
505
+ box-shadow: 0 8px 24px -4px rgb(0 0 0 / .12), 0 2px 8px -2px rgb(0 0 0 / .08);
506
+ }
507
+ .key-action-menu button {
508
+ width: 100%; height: 30px;
509
+ display: flex; align-items: center; gap: var(--sp-2);
510
+ padding: 0 var(--sp-2);
511
+ border-radius: var(--radius);
512
+ font-size: var(--fs-sm); font-weight: 500; text-align: left;
513
+ transition: background-color .12s ease;
514
+ }
515
+ .key-action-menu button:hover { background: hsl(var(--accent)); }
516
+ .key-action-menu button.danger-text { margin-top: var(--sp-1); border-top: 1px solid hsl(var(--border)); border-radius: 0 0 var(--radius) var(--radius); height: 34px; }
517
+ .key-action-menu button.danger-text:hover { background: hsl(var(--destructive) / .08); }
518
+
519
+ .agent-scope {
520
+ max-height: 168px; overflow: auto;
521
+ display: grid; gap: 2px;
522
+ padding: var(--sp-2);
523
+ margin-bottom: var(--sp-4);
524
+ border: 1px solid hsl(var(--border));
525
+ border-radius: var(--radius);
526
+ background: hsl(var(--muted) / .4);
527
+ }
528
+ .agent-scope .checkbox { height: 28px; padding: 0 var(--sp-2); border-radius: var(--radius); }
529
+ .agent-scope .checkbox:hover { background: hsl(var(--accent)); }
530
+ .secret-box { display: grid; gap: var(--sp-3); }
531
+ .secret-value {
532
+ display: block; padding: var(--sp-3);
533
+ background: hsl(var(--muted) / .5);
534
+ border: 1px solid hsl(var(--border));
535
+ border-radius: var(--radius);
536
+ overflow-wrap: anywhere;
537
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
538
+ font-size: var(--fs-xs);
539
+ }
540
+
541
+ /* ── Drawer ───────────────────────────────────────────────────────── */
542
+ .drawer-backdrop { position: fixed; inset: 0; background: rgb(0 0 0 / .4); z-index: 40; animation: fadeIn .18s ease-out; }
543
+ .drawer {
544
+ position: fixed; inset: 0 0 0 auto;
545
+ width: min(480px, 100vw);
546
+ display: flex; flex-direction: column;
547
+ background: hsl(var(--card));
548
+ border-left: 1px solid hsl(var(--border));
549
+ box-shadow: -8px 0 32px -8px rgb(0 0 0 / .15);
550
+ z-index: 41;
551
+ animation: slideInRight .22s cubic-bezier(.32, .72, 0, 1);
552
+ overflow: hidden;
553
+ }
554
+ .drawer-header {
555
+ height: 52px; flex-shrink: 0;
556
+ display: flex; align-items: center; justify-content: space-between;
557
+ padding: 0 var(--sp-4);
558
+ border-bottom: 1px solid hsl(var(--border));
559
+ }
560
+ .drawer-header h2 { font-size: var(--fs-md); font-weight: 600; }
561
+ .drawer-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: var(--sp-4); }
562
+ .drawer-footer {
563
+ flex: 0 0 auto;
564
+ display: flex; justify-content: flex-end; gap: var(--sp-2);
565
+ padding: var(--sp-3) var(--sp-4) var(--sp-4);
566
+ border-top: 1px solid hsl(var(--border));
567
+ background: hsl(var(--card));
568
+ }
569
+ @keyframes fadeIn { from { opacity: 0; } }
570
+ @keyframes slideInRight { from { transform: translateX(16px); opacity: 0; } }
571
+
572
+ /* ── Settings ─────────────────────────────────────────────────────── */
573
+ .settings-layout { width: 100%; max-width: 680px; }
574
+ .settings-form .panel-header { min-height: 0; padding: var(--sp-4); }
575
+ .settings-fields { display: grid; padding: var(--sp-4); }
576
+ .settings-fields .field:last-child { margin-bottom: 0; }
577
+ .settings-fields .field input { max-width: 240px; }
578
+ .settings-actions { display: flex; justify-content: flex-end; padding: var(--sp-4); }
579
+
580
+ /* ── Toast ────────────────────────────────────────────────────────── */
581
+ .toast-region {
582
+ position: fixed; right: var(--sp-6); bottom: var(--sp-6);
583
+ z-index: 60;
584
+ display: grid; gap: var(--sp-2);
585
+ max-width: 360px;
586
+ }
587
+ .toast {
588
+ padding: var(--sp-3) var(--sp-4);
589
+ background: hsl(var(--primary)); color: hsl(var(--primary-foreground));
590
+ border-radius: var(--radius);
591
+ box-shadow: 0 8px 24px -4px rgb(0 0 0 / .18);
592
+ font-size: var(--fs-sm); font-weight: 500; line-height: 1.5;
593
+ animation: slideInUp .2s ease;
594
+ }
595
+ .toast.error { background: hsl(var(--destructive)); color: hsl(var(--destructive-foreground)); }
596
+ @keyframes slideInUp { from { opacity: 0; transform: translateY(8px); } }
597
+
598
+ /* ── Responsive ───────────────────────────────────────────────────── */
599
+ @media (max-width: 860px) {
600
+ :root { --sidebar-width: 56px; --gutter: var(--sp-4); }
601
+ .brand span:last-child, .nav-item span, .admin-meta { display: none; }
602
+ .brand, .nav-item, .admin-button { justify-content: center; }
603
+ .admin-popover { left: 0; right: auto; width: 200px; }
604
+ }
605
+ @media (max-width: 640px) {
606
+ .page-content { padding: var(--sp-4) var(--gutter) var(--sp-4); }
607
+ .search-box { max-width: none; }
250
608
  .stats { grid-template-columns: 1fr; }
251
- .run-summary, .run-live-grid { grid-template-columns: 1fr; }
252
- .page-header { align-items: flex-start; }
253
- .toolbar { align-items: stretch; flex-direction: column; }
254
- .toolbar input, .toolbar select { max-width: none; width: 100%; }
255
- .admin-popover { left: 0; right: auto; width: 190px; }
609
+ .run-summary { grid-template-columns: repeat(2, 1fr); }
610
+ .run-live-grid { grid-template-columns: 1fr; }
611
+ .toolbar input[type="search"], .toolbar select { max-width: none; width: 100%; }
612
+ .field-row { grid-template-columns: 1fr; }
613
+ .drawer { width: 100vw; }
614
+ .run-detail-grid { grid-template-columns: 1fr; }
615
+ .toast-region { right: var(--sp-4); bottom: var(--sp-4); left: var(--sp-4); max-width: none; }
256
616
  }
257
617
  `;