@auxiora/dashboard 1.0.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 (97) hide show
  1. package/LICENSE +191 -0
  2. package/dist/auth.d.ts +13 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +69 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/cloud-types.d.ts +71 -0
  7. package/dist/cloud-types.d.ts.map +1 -0
  8. package/dist/cloud-types.js +2 -0
  9. package/dist/cloud-types.js.map +1 -0
  10. package/dist/index.d.ts +6 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +4 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/router.d.ts +13 -0
  15. package/dist/router.d.ts.map +1 -0
  16. package/dist/router.js +2250 -0
  17. package/dist/router.js.map +1 -0
  18. package/dist/types.d.ts +314 -0
  19. package/dist/types.d.ts.map +1 -0
  20. package/dist/types.js +7 -0
  21. package/dist/types.js.map +1 -0
  22. package/dist-ui/assets/index-BfY0i5jw.css +1 -0
  23. package/dist-ui/assets/index-CXpk9mvw.js +60 -0
  24. package/dist-ui/icon.svg +59 -0
  25. package/dist-ui/index.html +20 -0
  26. package/package.json +32 -0
  27. package/src/auth.ts +83 -0
  28. package/src/cloud-types.ts +63 -0
  29. package/src/index.ts +5 -0
  30. package/src/router.ts +2494 -0
  31. package/src/types.ts +269 -0
  32. package/tests/auth.test.ts +51 -0
  33. package/tests/cloud-router.test.ts +249 -0
  34. package/tests/desktop-router.test.ts +151 -0
  35. package/tests/router.test.ts +388 -0
  36. package/tests/trust-router.test.ts +170 -0
  37. package/tsconfig.json +12 -0
  38. package/tsconfig.tsbuildinfo +1 -0
  39. package/ui/index.html +19 -0
  40. package/ui/node_modules/.bin/browserslist +17 -0
  41. package/ui/node_modules/.bin/tsc +17 -0
  42. package/ui/node_modules/.bin/tsserver +17 -0
  43. package/ui/node_modules/.bin/vite +17 -0
  44. package/ui/package.json +23 -0
  45. package/ui/public/icon.svg +59 -0
  46. package/ui/src/App.tsx +63 -0
  47. package/ui/src/api.ts +238 -0
  48. package/ui/src/components/ActivityFeed.tsx +123 -0
  49. package/ui/src/components/BehaviorHealth.tsx +105 -0
  50. package/ui/src/components/DataTable.tsx +39 -0
  51. package/ui/src/components/Layout.tsx +160 -0
  52. package/ui/src/components/PasswordStrength.tsx +31 -0
  53. package/ui/src/components/SetupProgress.tsx +26 -0
  54. package/ui/src/components/StatusBadge.tsx +12 -0
  55. package/ui/src/components/ThemeSelector.tsx +39 -0
  56. package/ui/src/contexts/ThemeContext.tsx +58 -0
  57. package/ui/src/hooks/useApi.ts +19 -0
  58. package/ui/src/hooks/usePolling.ts +8 -0
  59. package/ui/src/main.tsx +16 -0
  60. package/ui/src/pages/AuditLog.tsx +36 -0
  61. package/ui/src/pages/Behaviors.tsx +426 -0
  62. package/ui/src/pages/Chat.tsx +688 -0
  63. package/ui/src/pages/Login.tsx +64 -0
  64. package/ui/src/pages/Overview.tsx +56 -0
  65. package/ui/src/pages/Sessions.tsx +26 -0
  66. package/ui/src/pages/SettingsAmbient.tsx +185 -0
  67. package/ui/src/pages/SettingsConnections.tsx +201 -0
  68. package/ui/src/pages/SettingsNotifications.tsx +241 -0
  69. package/ui/src/pages/SetupAppearance.tsx +45 -0
  70. package/ui/src/pages/SetupChannels.tsx +143 -0
  71. package/ui/src/pages/SetupComplete.tsx +31 -0
  72. package/ui/src/pages/SetupConnections.tsx +80 -0
  73. package/ui/src/pages/SetupDashboardPassword.tsx +50 -0
  74. package/ui/src/pages/SetupIdentity.tsx +68 -0
  75. package/ui/src/pages/SetupPersonality.tsx +78 -0
  76. package/ui/src/pages/SetupProvider.tsx +65 -0
  77. package/ui/src/pages/SetupVault.tsx +50 -0
  78. package/ui/src/pages/SetupWelcome.tsx +19 -0
  79. package/ui/src/pages/UnlockVault.tsx +56 -0
  80. package/ui/src/pages/Webhooks.tsx +158 -0
  81. package/ui/src/pages/settings/Appearance.tsx +63 -0
  82. package/ui/src/pages/settings/Channels.tsx +138 -0
  83. package/ui/src/pages/settings/Identity.tsx +61 -0
  84. package/ui/src/pages/settings/Personality.tsx +54 -0
  85. package/ui/src/pages/settings/PersonalityEditor.tsx +577 -0
  86. package/ui/src/pages/settings/Provider.tsx +537 -0
  87. package/ui/src/pages/settings/Security.tsx +111 -0
  88. package/ui/src/styles/global.css +2308 -0
  89. package/ui/src/styles/themes/index.css +7 -0
  90. package/ui/src/styles/themes/monolith.css +125 -0
  91. package/ui/src/styles/themes/nebula.css +90 -0
  92. package/ui/src/styles/themes/neon.css +149 -0
  93. package/ui/src/styles/themes/polar.css +151 -0
  94. package/ui/src/styles/themes/signal.css +163 -0
  95. package/ui/src/styles/themes/terra.css +146 -0
  96. package/ui/tsconfig.json +14 -0
  97. package/ui/vite.config.ts +20 -0
@@ -0,0 +1,2308 @@
1
+ /* ═══════════════════════════════════════════════════════
2
+ AUXIORA — Electric Minimal
3
+ Swiss poster meets command center.
4
+ One accent. Maximum contrast. Zero noise.
5
+ ═══════════════════════════════════════════════════════ */
6
+
7
+ @import url('https://fonts.googleapis.com/css2?family=Syne:wght@600;700;800&family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;1,9..40,400&family=JetBrains+Mono:wght@400;500&display=swap');
8
+ @import './themes/index.css';
9
+
10
+ :root {
11
+ --bg-primary: #0a0a0a;
12
+ --bg-secondary: #0f0f0f;
13
+ --bg-card: #141414;
14
+ --bg-hover: #1a1a1a;
15
+ --text-primary: #f5f5f5;
16
+ --text-secondary: #6b6b6b;
17
+ --accent: #7c3aed;
18
+ --accent-hover: #6d28d9;
19
+ --accent-glow: rgba(124, 58, 237, 0.12);
20
+ --accent-subtle: rgba(124, 58, 237, 0.08);
21
+ --danger: #ef4444;
22
+ --danger-hover: #dc2626;
23
+ --success: #22c55e;
24
+ --warning: #eab308;
25
+ --border: rgba(255, 255, 255, 0.06);
26
+ --border-strong: rgba(255, 255, 255, 0.1);
27
+ --radius: 8px;
28
+ --radius-lg: 12px;
29
+ --font-display: 'Syne', sans-serif;
30
+ --font-body: 'DM Sans', sans-serif;
31
+ --font-mono: 'JetBrains Mono', monospace;
32
+ --transition-fast: 120ms ease;
33
+ --transition-base: 180ms ease;
34
+ }
35
+
36
+ /* ── Reset ─────────────────────────────────────── */
37
+
38
+ * { margin: 0; padding: 0; box-sizing: border-box; }
39
+
40
+ ::selection {
41
+ background: var(--accent);
42
+ color: white;
43
+ }
44
+
45
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
46
+ ::-webkit-scrollbar-track { background: transparent; }
47
+ ::-webkit-scrollbar-thumb {
48
+ background: rgba(255, 255, 255, 0.08);
49
+ border-radius: 3px;
50
+ }
51
+ ::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.14); }
52
+
53
+ body {
54
+ font-family: var(--font-body);
55
+ background: var(--bg-primary);
56
+ color: var(--text-primary);
57
+ line-height: 1.55;
58
+ font-size: 14px;
59
+ -webkit-font-smoothing: antialiased;
60
+ -moz-osx-font-smoothing: grayscale;
61
+ }
62
+
63
+ /* ── Layout Shell ──────────────────────────────── */
64
+
65
+ .layout {
66
+ display: flex;
67
+ min-height: 100vh;
68
+ }
69
+
70
+ /* ── Sidebar ───────────────────────────────────── */
71
+
72
+ .sidebar {
73
+ width: 220px;
74
+ background: var(--bg-secondary);
75
+ padding: 2rem 0.75rem 1.25rem;
76
+ display: flex;
77
+ flex-direction: column;
78
+ border-right: 1px solid var(--border);
79
+ flex-shrink: 0;
80
+ }
81
+
82
+ .sidebar-header h1 {
83
+ font-family: var(--font-display);
84
+ font-size: 1.1rem;
85
+ font-weight: 800;
86
+ color: var(--text-primary);
87
+ margin-bottom: 2rem;
88
+ padding: 0 0.75rem;
89
+ letter-spacing: -0.02em;
90
+ }
91
+
92
+ .sidebar-header h1::before {
93
+ content: '';
94
+ display: inline-block;
95
+ width: 8px;
96
+ height: 8px;
97
+ background: var(--accent);
98
+ border-radius: 2px;
99
+ margin-right: 0.5rem;
100
+ vertical-align: middle;
101
+ position: relative;
102
+ top: -1px;
103
+ }
104
+
105
+ .nav-list {
106
+ list-style: none;
107
+ flex: 1;
108
+ overflow-y: auto;
109
+ }
110
+
111
+ .nav-group { margin-bottom: 1.5rem; }
112
+
113
+ .nav-group-label {
114
+ font-family: var(--font-mono);
115
+ font-size: 0.6rem;
116
+ font-weight: 500;
117
+ text-transform: uppercase;
118
+ letter-spacing: 0.12em;
119
+ color: var(--text-secondary);
120
+ padding: 0 0.75rem;
121
+ margin-bottom: 0.35rem;
122
+ }
123
+
124
+ .nav-link {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 0.5rem;
128
+ padding: 0.45rem 0.75rem;
129
+ color: var(--text-secondary);
130
+ text-decoration: none;
131
+ border-radius: 6px;
132
+ margin-bottom: 1px;
133
+ font-size: 0.875rem;
134
+ font-weight: 400;
135
+ transition: color var(--transition-fast), background var(--transition-fast);
136
+ }
137
+
138
+ .nav-link:hover {
139
+ color: var(--text-primary);
140
+ background: var(--bg-hover);
141
+ }
142
+
143
+ .nav-link.active {
144
+ color: var(--text-primary);
145
+ background: var(--accent-subtle);
146
+ font-weight: 500;
147
+ }
148
+
149
+ .nav-link.active::before {
150
+ content: '';
151
+ width: 3px;
152
+ height: 16px;
153
+ background: var(--accent);
154
+ border-radius: 2px;
155
+ margin-right: 0.25rem;
156
+ flex-shrink: 0;
157
+ }
158
+
159
+ /* Channel status dots */
160
+ .channel-dot {
161
+ width: 6px;
162
+ height: 6px;
163
+ border-radius: 50%;
164
+ flex-shrink: 0;
165
+ margin-left: auto;
166
+ transition: background var(--transition-base);
167
+ }
168
+
169
+ .channel-dot.connected { background: var(--success); }
170
+ .channel-dot.disconnected { background: rgba(255, 255, 255, 0.1); }
171
+
172
+ /* Status bar (sidebar) */
173
+ .status-bar {
174
+ padding: 0.75rem;
175
+ background: var(--bg-card);
176
+ border-radius: var(--radius);
177
+ margin-bottom: 1rem;
178
+ font-size: 0.75rem;
179
+ border: 1px solid var(--border);
180
+ }
181
+
182
+ .status-item { margin-bottom: 0.2rem; color: var(--text-secondary); }
183
+
184
+ /* Logout */
185
+ .logout-btn {
186
+ padding: 0.5rem 0.75rem;
187
+ background: transparent;
188
+ border: 1px solid var(--border);
189
+ color: var(--text-secondary);
190
+ border-radius: 6px;
191
+ cursor: pointer;
192
+ font-family: var(--font-body);
193
+ font-size: 0.8rem;
194
+ transition: all var(--transition-fast);
195
+ }
196
+
197
+ .logout-btn:hover {
198
+ color: var(--danger);
199
+ border-color: rgba(239, 68, 68, 0.3);
200
+ background: rgba(239, 68, 68, 0.06);
201
+ }
202
+
203
+ /* ── Main Content ──────────────────────────────── */
204
+
205
+ .content {
206
+ flex: 1;
207
+ padding: 2.5rem 3rem;
208
+ overflow-y: auto;
209
+ max-height: 100vh;
210
+ }
211
+
212
+ .page h2 {
213
+ font-family: var(--font-display);
214
+ font-size: 1.75rem;
215
+ font-weight: 700;
216
+ letter-spacing: -0.03em;
217
+ margin-bottom: 1.75rem;
218
+ color: var(--text-primary);
219
+ }
220
+
221
+ /* ── Status Grid (Overview) ────────────────────── */
222
+
223
+ .status-grid {
224
+ display: grid;
225
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
226
+ gap: 1px;
227
+ margin-bottom: 2rem;
228
+ background: var(--border);
229
+ border-radius: var(--radius-lg);
230
+ overflow: hidden;
231
+ border: 1px solid var(--border);
232
+ }
233
+
234
+ .status-card {
235
+ background: var(--bg-card);
236
+ padding: 1.25rem 1.5rem;
237
+ }
238
+
239
+ .status-card h3 {
240
+ font-family: var(--font-mono);
241
+ font-size: 0.65rem;
242
+ font-weight: 500;
243
+ text-transform: uppercase;
244
+ letter-spacing: 0.1em;
245
+ color: var(--text-secondary);
246
+ margin-bottom: 0.6rem;
247
+ }
248
+
249
+ .status-card .value {
250
+ font-family: var(--font-display);
251
+ font-size: 1.5rem;
252
+ font-weight: 700;
253
+ color: var(--text-primary);
254
+ letter-spacing: -0.02em;
255
+ }
256
+
257
+ .status-card .sub {
258
+ font-size: 0.75rem;
259
+ color: var(--text-secondary);
260
+ margin-top: 0.15rem;
261
+ }
262
+
263
+ /* ── Mission Control ──────────────────────────────── */
264
+
265
+ .mc-columns {
266
+ display: grid;
267
+ grid-template-columns: 2fr 3fr;
268
+ gap: 1.5rem;
269
+ min-height: 0;
270
+ }
271
+
272
+ .mc-section-title {
273
+ font-family: var(--font-mono);
274
+ font-size: 0.65rem;
275
+ font-weight: 500;
276
+ text-transform: uppercase;
277
+ letter-spacing: 0.1em;
278
+ color: var(--text-secondary);
279
+ margin-bottom: 1rem;
280
+ }
281
+
282
+ /* Activity Feed */
283
+ .activity-feed-list {
284
+ max-height: 60vh;
285
+ overflow-y: auto;
286
+ display: flex;
287
+ flex-direction: column;
288
+ gap: 2px;
289
+ }
290
+
291
+ .activity-item {
292
+ display: flex;
293
+ align-items: center;
294
+ gap: 0.6rem;
295
+ padding: 0.5rem 0.75rem;
296
+ border-radius: var(--radius);
297
+ background: var(--bg-card);
298
+ font-size: 0.82rem;
299
+ animation: mc-fade-in var(--transition-base);
300
+ }
301
+
302
+ .activity-dot {
303
+ width: 6px;
304
+ height: 6px;
305
+ border-radius: 50%;
306
+ flex-shrink: 0;
307
+ }
308
+
309
+ .activity-label {
310
+ flex: 1;
311
+ color: var(--text-primary);
312
+ white-space: nowrap;
313
+ overflow: hidden;
314
+ text-overflow: ellipsis;
315
+ }
316
+
317
+ .activity-time {
318
+ font-family: var(--font-mono);
319
+ font-size: 0.7rem;
320
+ color: var(--text-secondary);
321
+ flex-shrink: 0;
322
+ }
323
+
324
+ .activity-empty {
325
+ color: var(--text-secondary);
326
+ font-size: 0.82rem;
327
+ padding: 1rem 0.75rem;
328
+ }
329
+
330
+ /* Behavior Health */
331
+ .bh-list {
332
+ display: flex;
333
+ flex-direction: column;
334
+ gap: 2px;
335
+ }
336
+
337
+ .bh-card {
338
+ background: var(--bg-card);
339
+ padding: 0.75rem;
340
+ border-radius: var(--radius);
341
+ }
342
+
343
+ .bh-card-header {
344
+ display: flex;
345
+ align-items: center;
346
+ gap: 0.5rem;
347
+ }
348
+
349
+ .bh-dot {
350
+ width: 8px;
351
+ height: 8px;
352
+ border-radius: 50%;
353
+ flex-shrink: 0;
354
+ }
355
+
356
+ .bh-action {
357
+ flex: 1;
358
+ font-size: 0.82rem;
359
+ color: var(--text-primary);
360
+ white-space: nowrap;
361
+ overflow: hidden;
362
+ text-overflow: ellipsis;
363
+ }
364
+
365
+ .bh-type-badge {
366
+ font-family: var(--font-mono);
367
+ font-size: 0.6rem;
368
+ text-transform: uppercase;
369
+ letter-spacing: 0.08em;
370
+ color: var(--text-secondary);
371
+ background: var(--bg-hover);
372
+ padding: 0.15rem 0.4rem;
373
+ border-radius: 3px;
374
+ flex-shrink: 0;
375
+ }
376
+
377
+ .bh-card-meta {
378
+ display: flex;
379
+ gap: 0.75rem;
380
+ margin-top: 0.35rem;
381
+ font-size: 0.72rem;
382
+ }
383
+
384
+ .bh-health-label {
385
+ font-weight: 500;
386
+ }
387
+
388
+ .bh-stat {
389
+ color: var(--text-secondary);
390
+ }
391
+
392
+ .bh-result {
393
+ margin-top: 0.35rem;
394
+ font-size: 0.72rem;
395
+ color: var(--text-secondary);
396
+ line-height: 1.4;
397
+ }
398
+
399
+ .bh-empty {
400
+ color: var(--text-secondary);
401
+ font-size: 0.82rem;
402
+ padding: 1rem 0;
403
+ }
404
+
405
+ @keyframes mc-fade-in {
406
+ from { opacity: 0; transform: translateY(-4px); }
407
+ to { opacity: 1; transform: translateY(0); }
408
+ }
409
+
410
+ /* ── Data Tables ───────────────────────────────── */
411
+
412
+ .data-table {
413
+ width: 100%;
414
+ border-collapse: collapse;
415
+ border-radius: var(--radius-lg);
416
+ overflow: hidden;
417
+ border: 1px solid var(--border);
418
+ }
419
+
420
+ .data-table th {
421
+ text-align: left;
422
+ padding: 0.75rem 1.25rem;
423
+ background: var(--bg-secondary);
424
+ color: var(--text-secondary);
425
+ font-family: var(--font-mono);
426
+ font-weight: 500;
427
+ font-size: 0.65rem;
428
+ text-transform: uppercase;
429
+ letter-spacing: 0.1em;
430
+ border-bottom: 1px solid var(--border);
431
+ }
432
+
433
+ .data-table td {
434
+ padding: 0.7rem 1.25rem;
435
+ border-top: 1px solid var(--border);
436
+ font-size: 0.875rem;
437
+ background: var(--bg-card);
438
+ }
439
+
440
+ .data-table tbody tr {
441
+ transition: background var(--transition-fast);
442
+ }
443
+
444
+ .data-table tbody tr:hover td {
445
+ background: var(--bg-hover);
446
+ }
447
+
448
+ .empty-row {
449
+ text-align: center;
450
+ color: var(--text-secondary);
451
+ padding: 3rem !important;
452
+ font-size: 0.85rem;
453
+ }
454
+
455
+ .actions-cell { white-space: nowrap; }
456
+
457
+ /* ── Badges ────────────────────────────────────── */
458
+
459
+ .badge {
460
+ display: inline-block;
461
+ padding: 0.15rem 0.5rem;
462
+ border-radius: 4px;
463
+ font-family: var(--font-mono);
464
+ font-size: 0.65rem;
465
+ font-weight: 500;
466
+ letter-spacing: 0.03em;
467
+ text-transform: uppercase;
468
+ }
469
+
470
+ .badge-green { background: rgba(34, 197, 94, 0.1); color: var(--success); }
471
+ .badge-yellow { background: rgba(234, 179, 8, 0.1); color: var(--warning); }
472
+ .badge-red { background: rgba(239, 68, 68, 0.1); color: var(--danger); }
473
+ .badge-gray { background: rgba(255, 255, 255, 0.04); color: var(--text-secondary); }
474
+
475
+ .badge-primary { background: var(--accent-glow); color: var(--accent); }
476
+ .badge-fallback { background: rgba(234, 179, 8, 0.1); color: var(--warning); }
477
+
478
+ .badge-pill {
479
+ display: inline-block;
480
+ padding: 0.1rem 0.4rem;
481
+ border-radius: 4px;
482
+ font-family: var(--font-mono);
483
+ font-size: 0.6rem;
484
+ font-weight: 500;
485
+ text-transform: uppercase;
486
+ letter-spacing: 0.03em;
487
+ }
488
+
489
+ /* ── Buttons ───────────────────────────────────── */
490
+
491
+ .btn-sm {
492
+ padding: 0.3rem 0.7rem;
493
+ border: 1px solid var(--border-strong);
494
+ background: transparent;
495
+ color: var(--text-primary);
496
+ border-radius: 6px;
497
+ cursor: pointer;
498
+ font-family: var(--font-body);
499
+ font-size: 0.8rem;
500
+ margin-right: 0.25rem;
501
+ transition: all var(--transition-fast);
502
+ }
503
+
504
+ .btn-sm:hover {
505
+ border-color: var(--accent);
506
+ color: var(--accent);
507
+ background: var(--accent-subtle);
508
+ }
509
+
510
+ .btn-danger { color: var(--danger); border-color: rgba(239, 68, 68, 0.3); }
511
+ .btn-danger:hover { background: rgba(239, 68, 68, 0.08); border-color: var(--danger); }
512
+
513
+ /* ── Filters ───────────────────────────────────── */
514
+
515
+ .filters { margin-bottom: 1rem; }
516
+
517
+ .filters select {
518
+ padding: 0.4rem 0.75rem;
519
+ background: var(--bg-card);
520
+ border: 1px solid var(--border-strong);
521
+ color: var(--text-primary);
522
+ border-radius: 6px;
523
+ font-family: var(--font-body);
524
+ font-size: 0.85rem;
525
+ cursor: pointer;
526
+ transition: border-color var(--transition-fast);
527
+ }
528
+
529
+ .filters select:hover { border-color: var(--accent); }
530
+ .filters select:focus { outline: none; border-color: var(--accent); }
531
+
532
+ /* ── Login ─────────────────────────────────────── */
533
+
534
+ .login-page {
535
+ display: flex;
536
+ justify-content: center;
537
+ align-items: center;
538
+ min-height: 100vh;
539
+ background: var(--bg-primary);
540
+ }
541
+
542
+ .login-card {
543
+ background: var(--bg-card);
544
+ padding: 3rem;
545
+ border-radius: var(--radius-lg);
546
+ width: 380px;
547
+ border: 1px solid var(--border);
548
+ animation: cardEnter 0.4s ease both;
549
+ }
550
+
551
+ .login-card h1 {
552
+ font-family: var(--font-display);
553
+ font-size: 1.4rem;
554
+ font-weight: 800;
555
+ margin-bottom: 2rem;
556
+ color: var(--text-primary);
557
+ letter-spacing: -0.02em;
558
+ }
559
+
560
+ .login-card h1::before {
561
+ content: '';
562
+ display: block;
563
+ width: 24px;
564
+ height: 4px;
565
+ background: var(--accent);
566
+ border-radius: 2px;
567
+ margin-bottom: 1rem;
568
+ }
569
+
570
+ .login-card input {
571
+ width: 100%;
572
+ padding: 0.7rem 0.85rem;
573
+ margin-bottom: 1rem;
574
+ background: var(--bg-primary);
575
+ border: 1px solid var(--border-strong);
576
+ color: var(--text-primary);
577
+ border-radius: 6px;
578
+ font-family: var(--font-body);
579
+ font-size: 0.875rem;
580
+ transition: border-color var(--transition-fast);
581
+ }
582
+
583
+ .login-card input:focus {
584
+ outline: none;
585
+ border-color: var(--accent);
586
+ box-shadow: 0 0 0 3px var(--accent-glow);
587
+ }
588
+
589
+ .login-card input::placeholder { color: var(--text-secondary); }
590
+
591
+ .login-card button {
592
+ width: 100%;
593
+ padding: 0.7rem;
594
+ background: var(--accent);
595
+ border: none;
596
+ color: white;
597
+ border-radius: 6px;
598
+ cursor: pointer;
599
+ font-family: var(--font-body);
600
+ font-weight: 600;
601
+ font-size: 0.875rem;
602
+ transition: background var(--transition-fast), transform var(--transition-fast);
603
+ }
604
+
605
+ .login-card button:hover { background: var(--accent-hover); }
606
+ .login-card button:active { transform: scale(0.98); }
607
+ .login-card button:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }
608
+
609
+ .error {
610
+ color: var(--danger);
611
+ font-size: 0.8rem;
612
+ margin-top: 0.5rem;
613
+ }
614
+
615
+ /* ── Setup Wizard ──────────────────────────────── */
616
+
617
+ .setup-page {
618
+ display: flex;
619
+ flex-direction: column;
620
+ align-items: center;
621
+ justify-content: center;
622
+ min-height: 100vh;
623
+ padding: 2rem;
624
+ background: var(--bg-primary);
625
+ }
626
+
627
+ .setup-card {
628
+ background: var(--bg-card);
629
+ padding: 2.5rem;
630
+ border-radius: var(--radius-lg);
631
+ width: 100%;
632
+ max-width: 560px;
633
+ border: 1px solid var(--border);
634
+ animation: cardEnter 0.35s ease both;
635
+ }
636
+
637
+ .setup-card h1 {
638
+ font-family: var(--font-display);
639
+ font-size: 1.5rem;
640
+ font-weight: 700;
641
+ color: var(--text-primary);
642
+ margin-bottom: 0.4rem;
643
+ letter-spacing: -0.02em;
644
+ }
645
+
646
+ .setup-card p.subtitle {
647
+ color: var(--text-secondary);
648
+ margin-bottom: 1.5rem;
649
+ font-size: 0.9rem;
650
+ }
651
+
652
+ .setup-card label {
653
+ display: block;
654
+ color: var(--text-secondary);
655
+ font-size: 0.8rem;
656
+ margin-bottom: 0.3rem;
657
+ font-weight: 500;
658
+ }
659
+
660
+ .setup-card input,
661
+ .setup-card select,
662
+ .setup-card textarea {
663
+ width: 100%;
664
+ padding: 0.65rem 0.85rem;
665
+ margin-bottom: 1rem;
666
+ background: var(--bg-primary);
667
+ border: 1px solid var(--border-strong);
668
+ color: var(--text-primary);
669
+ border-radius: 6px;
670
+ font-family: var(--font-body);
671
+ font-size: 0.875rem;
672
+ transition: border-color var(--transition-fast);
673
+ }
674
+
675
+ .setup-card input:focus,
676
+ .setup-card select:focus,
677
+ .setup-card textarea:focus {
678
+ outline: none;
679
+ border-color: var(--accent);
680
+ box-shadow: 0 0 0 3px var(--accent-glow);
681
+ }
682
+
683
+ .setup-card input::placeholder,
684
+ .setup-card textarea::placeholder { color: var(--text-secondary); }
685
+
686
+ .setup-card textarea {
687
+ resize: vertical;
688
+ line-height: 1.5;
689
+ }
690
+
691
+ .setup-btn-primary,
692
+ .setup-card button[type="submit"] {
693
+ width: 100%;
694
+ padding: 0.7rem;
695
+ background: var(--accent);
696
+ border: none;
697
+ color: white;
698
+ border-radius: 6px;
699
+ cursor: pointer;
700
+ font-family: var(--font-body);
701
+ font-weight: 600;
702
+ font-size: 0.9rem;
703
+ transition: background var(--transition-fast), transform var(--transition-fast);
704
+ }
705
+
706
+ .setup-btn-primary:hover { background: var(--accent-hover); }
707
+ .setup-btn-primary:active { transform: scale(0.98); }
708
+ .setup-btn-primary:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }
709
+
710
+ .setup-btn-secondary {
711
+ width: 100%;
712
+ padding: 0.7rem;
713
+ background: transparent;
714
+ border: 1px solid var(--border-strong);
715
+ color: var(--text-secondary);
716
+ border-radius: 6px;
717
+ cursor: pointer;
718
+ font-family: var(--font-body);
719
+ font-size: 0.875rem;
720
+ margin-top: 0.5rem;
721
+ transition: all var(--transition-fast);
722
+ }
723
+
724
+ .setup-btn-secondary:hover {
725
+ color: var(--text-primary);
726
+ border-color: var(--accent);
727
+ background: var(--accent-subtle);
728
+ }
729
+
730
+ /* Setup progress */
731
+ .setup-progress {
732
+ display: flex;
733
+ align-items: center;
734
+ justify-content: center;
735
+ margin-bottom: 2rem;
736
+ gap: 0;
737
+ }
738
+
739
+ .setup-progress-step {
740
+ width: 28px;
741
+ height: 28px;
742
+ border-radius: 50%;
743
+ display: flex;
744
+ align-items: center;
745
+ justify-content: center;
746
+ font-family: var(--font-mono);
747
+ font-size: 0.7rem;
748
+ font-weight: 500;
749
+ border: 1px solid var(--border-strong);
750
+ color: var(--text-secondary);
751
+ background: var(--bg-secondary);
752
+ transition: all var(--transition-base);
753
+ }
754
+
755
+ .setup-progress-step.active {
756
+ border-color: var(--accent);
757
+ color: var(--accent);
758
+ background: var(--accent-glow);
759
+ box-shadow: 0 0 0 4px var(--accent-subtle);
760
+ }
761
+
762
+ .setup-progress-step.completed {
763
+ border-color: var(--accent);
764
+ color: white;
765
+ background: var(--accent);
766
+ }
767
+
768
+ .setup-progress-line {
769
+ width: 32px;
770
+ height: 1px;
771
+ background: var(--border-strong);
772
+ transition: background var(--transition-base);
773
+ }
774
+
775
+ .setup-progress-line.completed { background: var(--accent); }
776
+
777
+ /* Password strength */
778
+ .password-strength {
779
+ height: 3px;
780
+ border-radius: 2px;
781
+ margin-bottom: 1rem;
782
+ background: rgba(255, 255, 255, 0.04);
783
+ }
784
+
785
+ .password-strength-bar {
786
+ height: 100%;
787
+ border-radius: 2px;
788
+ transition: width 0.3s ease, background 0.3s ease;
789
+ }
790
+
791
+ .password-strength-label {
792
+ font-size: 0.7rem;
793
+ font-family: var(--font-mono);
794
+ margin-top: -0.75rem;
795
+ margin-bottom: 0.75rem;
796
+ letter-spacing: 0.03em;
797
+ }
798
+
799
+ /* Template grid (personality selection) */
800
+ .template-grid {
801
+ display: grid;
802
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
803
+ gap: 0.75rem;
804
+ margin-bottom: 1.5rem;
805
+ }
806
+
807
+ .template-card {
808
+ background: var(--bg-primary);
809
+ padding: 1rem;
810
+ border-radius: var(--radius);
811
+ border: 1px solid var(--border-strong);
812
+ cursor: pointer;
813
+ transition: all var(--transition-fast);
814
+ }
815
+
816
+ .template-card:hover {
817
+ border-color: var(--accent);
818
+ background: var(--accent-subtle);
819
+ }
820
+
821
+ .template-card.selected {
822
+ border-color: var(--accent);
823
+ background: var(--accent-glow);
824
+ }
825
+
826
+ .template-card.recommended {
827
+ border-color: var(--accent);
828
+ box-shadow: 0 0 0 1px var(--accent-glow);
829
+ }
830
+
831
+ .template-card h3 {
832
+ font-family: var(--font-display);
833
+ font-size: 0.85rem;
834
+ font-weight: 600;
835
+ margin-bottom: 0.25rem;
836
+ }
837
+
838
+ .template-card p {
839
+ font-size: 0.75rem;
840
+ color: var(--text-secondary);
841
+ line-height: 1.4;
842
+ }
843
+
844
+ /* Channel cards (setup) */
845
+ .channel-grid {
846
+ display: grid;
847
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
848
+ gap: 0.75rem;
849
+ margin-bottom: 1.5rem;
850
+ }
851
+
852
+ .channel-card {
853
+ background: var(--bg-primary);
854
+ padding: 1rem;
855
+ border-radius: var(--radius);
856
+ border: 1px solid var(--border);
857
+ }
858
+
859
+ .channel-card-header {
860
+ display: flex;
861
+ justify-content: space-between;
862
+ align-items: center;
863
+ margin-bottom: 0.75rem;
864
+ }
865
+
866
+ .channel-card-header h3 {
867
+ font-size: 0.9rem;
868
+ font-weight: 500;
869
+ }
870
+
871
+ .channel-card-fields {
872
+ padding-top: 0.75rem;
873
+ border-top: 1px solid var(--border);
874
+ }
875
+
876
+ .channel-card-fields label {
877
+ display: block;
878
+ font-size: 0.75rem;
879
+ color: var(--text-secondary);
880
+ margin-bottom: 0.2rem;
881
+ }
882
+
883
+ .channel-card-fields input {
884
+ width: 100%;
885
+ padding: 0.45rem 0.6rem;
886
+ margin-bottom: 0.75rem;
887
+ background: var(--bg-card);
888
+ border: 1px solid var(--border-strong);
889
+ color: var(--text-primary);
890
+ border-radius: 6px;
891
+ font-family: var(--font-body);
892
+ font-size: 0.8rem;
893
+ }
894
+
895
+ .channel-card-fields input:focus {
896
+ outline: none;
897
+ border-color: var(--accent);
898
+ }
899
+
900
+ /* Toggle switch */
901
+ .toggle {
902
+ position: relative;
903
+ width: 36px;
904
+ height: 20px;
905
+ background: rgba(255, 255, 255, 0.08);
906
+ border-radius: 10px;
907
+ cursor: pointer;
908
+ transition: background var(--transition-fast);
909
+ }
910
+
911
+ .toggle.active { background: var(--accent); }
912
+
913
+ .toggle::after {
914
+ content: '';
915
+ position: absolute;
916
+ top: 2px;
917
+ left: 2px;
918
+ width: 16px;
919
+ height: 16px;
920
+ background: white;
921
+ border-radius: 50%;
922
+ transition: transform var(--transition-fast);
923
+ }
924
+
925
+ .toggle.active::after { transform: translateX(16px); }
926
+
927
+ /* Skip link */
928
+ .skip-link {
929
+ display: block;
930
+ text-align: center;
931
+ color: var(--text-secondary);
932
+ font-size: 0.8rem;
933
+ margin-top: 1rem;
934
+ cursor: pointer;
935
+ transition: color var(--transition-fast);
936
+ }
937
+
938
+ .skip-link:hover { color: var(--accent); }
939
+
940
+ /* Setup complete */
941
+ .setup-complete-check {
942
+ font-size: 2.5rem;
943
+ color: var(--success);
944
+ margin-bottom: 1rem;
945
+ }
946
+
947
+ .setup-complete-buttons {
948
+ display: flex;
949
+ gap: 0.75rem;
950
+ margin-top: 1.5rem;
951
+ }
952
+
953
+ .setup-complete-buttons button { flex: 1; }
954
+
955
+ /* ── Settings Forms ────────────────────────────── */
956
+
957
+ .settings-form { max-width: 560px; }
958
+
959
+ .settings-form label {
960
+ display: block;
961
+ color: var(--text-secondary);
962
+ font-size: 0.8rem;
963
+ margin-bottom: 0.3rem;
964
+ font-weight: 500;
965
+ }
966
+
967
+ .settings-form input,
968
+ .settings-form select {
969
+ width: 100%;
970
+ padding: 0.65rem 0.85rem;
971
+ margin-bottom: 1rem;
972
+ background: var(--bg-card);
973
+ border: 1px solid var(--border-strong);
974
+ color: var(--text-primary);
975
+ border-radius: 6px;
976
+ font-family: var(--font-body);
977
+ font-size: 0.875rem;
978
+ transition: border-color var(--transition-fast);
979
+ }
980
+
981
+ .settings-form input:focus,
982
+ .settings-form select:focus {
983
+ outline: none;
984
+ border-color: var(--accent);
985
+ box-shadow: 0 0 0 3px var(--accent-glow);
986
+ }
987
+
988
+ .settings-form input::placeholder { color: var(--text-secondary); }
989
+
990
+ .settings-section {
991
+ margin-bottom: 2rem;
992
+ padding-bottom: 2rem;
993
+ border-bottom: 1px solid var(--border);
994
+ }
995
+
996
+ .settings-section:last-child { border-bottom: none; }
997
+
998
+ .settings-section h3 {
999
+ font-family: var(--font-display);
1000
+ font-size: 1.1rem;
1001
+ font-weight: 600;
1002
+ margin-bottom: 1rem;
1003
+ letter-spacing: -0.01em;
1004
+ }
1005
+
1006
+ .masked-key {
1007
+ font-family: var(--font-mono);
1008
+ color: var(--text-secondary);
1009
+ font-size: 0.8rem;
1010
+ margin-bottom: 0.5rem;
1011
+ }
1012
+
1013
+ .settings-success {
1014
+ color: var(--success);
1015
+ font-size: 0.8rem;
1016
+ margin-top: 0.5rem;
1017
+ font-weight: 500;
1018
+ }
1019
+
1020
+ .settings-btn {
1021
+ padding: 0.6rem 1.5rem;
1022
+ background: var(--accent);
1023
+ border: none;
1024
+ color: white;
1025
+ border-radius: 6px;
1026
+ cursor: pointer;
1027
+ font-family: var(--font-body);
1028
+ font-weight: 600;
1029
+ font-size: 0.875rem;
1030
+ transition: background var(--transition-fast), transform var(--transition-fast);
1031
+ }
1032
+
1033
+ .settings-btn:hover { background: var(--accent-hover); }
1034
+ .settings-btn:active { transform: scale(0.98); }
1035
+ .settings-btn:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }
1036
+
1037
+ /* ── Create Forms ─────────────────────────────── */
1038
+
1039
+ .create-form-toggle {
1040
+ margin-bottom: 1rem;
1041
+ }
1042
+
1043
+ .create-form {
1044
+ background: var(--bg-card);
1045
+ border: 1px solid var(--border);
1046
+ border-radius: var(--radius-lg);
1047
+ padding: 1.5rem;
1048
+ margin-bottom: 1.5rem;
1049
+ max-width: 560px;
1050
+ animation: cardEnter 0.25s ease both;
1051
+ }
1052
+
1053
+ .create-form label {
1054
+ display: block;
1055
+ color: var(--text-secondary);
1056
+ font-size: 0.8rem;
1057
+ margin-bottom: 0.3rem;
1058
+ font-weight: 500;
1059
+ }
1060
+
1061
+ .create-form input,
1062
+ .create-form select,
1063
+ .create-form textarea {
1064
+ width: 100%;
1065
+ padding: 0.65rem 0.85rem;
1066
+ margin-bottom: 1rem;
1067
+ background: var(--bg-primary);
1068
+ border: 1px solid var(--border-strong);
1069
+ color: var(--text-primary);
1070
+ border-radius: 6px;
1071
+ font-family: var(--font-body);
1072
+ font-size: 0.875rem;
1073
+ transition: border-color var(--transition-fast);
1074
+ }
1075
+
1076
+ .create-form input:focus,
1077
+ .create-form select:focus,
1078
+ .create-form textarea:focus {
1079
+ outline: none;
1080
+ border-color: var(--accent);
1081
+ box-shadow: 0 0 0 3px var(--accent-glow);
1082
+ }
1083
+
1084
+ .create-form input::placeholder,
1085
+ .create-form textarea::placeholder { color: var(--text-secondary); }
1086
+
1087
+ .create-form textarea {
1088
+ resize: vertical;
1089
+ font-family: var(--font-body);
1090
+ line-height: 1.5;
1091
+ }
1092
+
1093
+ .create-form-group {
1094
+ padding: 1rem;
1095
+ margin-bottom: 1rem;
1096
+ background: var(--bg-hover);
1097
+ border-radius: var(--radius);
1098
+ border: 1px solid var(--border);
1099
+ }
1100
+
1101
+ .create-form-group label {
1102
+ margin-top: 0.5rem;
1103
+ }
1104
+
1105
+ .create-form-group label:first-child {
1106
+ margin-top: 0;
1107
+ }
1108
+
1109
+ .form-hint {
1110
+ margin-top: 0.75rem;
1111
+ padding: 0.5rem 0.75rem;
1112
+ font-size: 0.85rem;
1113
+ color: var(--text-muted);
1114
+ background: var(--bg-primary);
1115
+ border-radius: var(--radius);
1116
+ border: 1px dashed var(--border);
1117
+ }
1118
+
1119
+ .create-form-success {
1120
+ background: rgba(34, 197, 94, 0.06);
1121
+ border: 1px solid rgba(34, 197, 94, 0.2);
1122
+ color: var(--success);
1123
+ padding: 0.75rem 1rem;
1124
+ border-radius: var(--radius);
1125
+ margin-bottom: 1rem;
1126
+ font-size: 0.85rem;
1127
+ }
1128
+
1129
+ .create-form-success code {
1130
+ font-family: var(--font-mono);
1131
+ font-size: 0.8rem;
1132
+ background: rgba(34, 197, 94, 0.1);
1133
+ padding: 0.15rem 0.4rem;
1134
+ border-radius: 4px;
1135
+ word-break: break-all;
1136
+ }
1137
+
1138
+ /* ── Provider Grid ─────────────────────────────── */
1139
+
1140
+ .provider-grid {
1141
+ display: grid;
1142
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1143
+ gap: 0.75rem;
1144
+ margin-bottom: 2rem;
1145
+ }
1146
+
1147
+ .provider-card {
1148
+ background: var(--bg-card);
1149
+ border: 1px solid var(--border);
1150
+ border-radius: var(--radius);
1151
+ padding: 1.25rem;
1152
+ cursor: pointer;
1153
+ transition: all var(--transition-fast);
1154
+ }
1155
+
1156
+ .provider-card:hover { border-color: var(--border-strong); }
1157
+
1158
+ .provider-card.configured {
1159
+ border-color: rgba(34, 197, 94, 0.25);
1160
+ }
1161
+
1162
+ .provider-card.expanded {
1163
+ border-color: var(--accent);
1164
+ background: var(--bg-hover);
1165
+ }
1166
+
1167
+ .provider-card-header {
1168
+ display: flex;
1169
+ justify-content: space-between;
1170
+ align-items: center;
1171
+ margin-bottom: 0.5rem;
1172
+ }
1173
+
1174
+ .provider-card-header h3 {
1175
+ font-size: 0.9rem;
1176
+ font-weight: 500;
1177
+ display: flex;
1178
+ align-items: center;
1179
+ gap: 0.5rem;
1180
+ }
1181
+
1182
+ .provider-card .status-dot {
1183
+ width: 6px;
1184
+ height: 6px;
1185
+ border-radius: 50%;
1186
+ display: inline-block;
1187
+ }
1188
+
1189
+ .provider-card .status-dot.active { background: var(--success); }
1190
+ .provider-card .status-dot.inactive { background: rgba(255, 255, 255, 0.1); }
1191
+
1192
+ .provider-card .provider-badges {
1193
+ display: flex;
1194
+ gap: 0.35rem;
1195
+ }
1196
+
1197
+ .provider-card .provider-model {
1198
+ font-size: 0.75rem;
1199
+ color: var(--text-secondary);
1200
+ margin-top: 0.2rem;
1201
+ font-family: var(--font-mono);
1202
+ }
1203
+
1204
+ .provider-expand {
1205
+ margin-top: 1rem;
1206
+ padding-top: 1rem;
1207
+ border-top: 1px solid var(--border);
1208
+ }
1209
+
1210
+ .provider-expand label {
1211
+ display: block;
1212
+ font-size: 0.75rem;
1213
+ color: var(--text-secondary);
1214
+ margin-bottom: 0.2rem;
1215
+ font-weight: 500;
1216
+ }
1217
+
1218
+ .provider-expand input,
1219
+ .provider-expand select {
1220
+ width: 100%;
1221
+ padding: 0.5rem 0.65rem;
1222
+ margin-bottom: 0.75rem;
1223
+ background: var(--bg-primary);
1224
+ border: 1px solid var(--border-strong);
1225
+ color: var(--text-primary);
1226
+ border-radius: 6px;
1227
+ font-family: var(--font-body);
1228
+ font-size: 0.8rem;
1229
+ }
1230
+
1231
+ .provider-expand input:focus,
1232
+ .provider-expand select:focus {
1233
+ outline: none;
1234
+ border-color: var(--accent);
1235
+ }
1236
+
1237
+ .provider-expand .provider-actions {
1238
+ display: flex;
1239
+ gap: 0.5rem;
1240
+ }
1241
+
1242
+ .provider-expand .provider-actions button {
1243
+ padding: 0.45rem 1rem;
1244
+ border-radius: 6px;
1245
+ cursor: pointer;
1246
+ font-family: var(--font-body);
1247
+ font-size: 0.8rem;
1248
+ font-weight: 600;
1249
+ border: none;
1250
+ transition: all var(--transition-fast);
1251
+ }
1252
+
1253
+ .provider-expand .btn-save {
1254
+ background: var(--accent);
1255
+ color: white;
1256
+ }
1257
+
1258
+ .provider-expand .btn-save:hover { background: var(--accent-hover); }
1259
+ .provider-expand .btn-save:disabled { opacity: 0.4; cursor: not-allowed; }
1260
+
1261
+ .provider-expand .btn-remove {
1262
+ background: transparent;
1263
+ border: 1px solid rgba(239, 68, 68, 0.3);
1264
+ color: var(--danger);
1265
+ }
1266
+
1267
+ .provider-expand .btn-remove:hover {
1268
+ background: rgba(239, 68, 68, 0.08);
1269
+ border-color: var(--danger);
1270
+ }
1271
+
1272
+ /* Routing config */
1273
+ .routing-config {
1274
+ display: flex;
1275
+ gap: 1.25rem;
1276
+ align-items: flex-end;
1277
+ flex-wrap: wrap;
1278
+ margin-bottom: 2rem;
1279
+ padding: 1rem 1.25rem;
1280
+ background: var(--bg-card);
1281
+ border-radius: var(--radius);
1282
+ border: 1px solid var(--border);
1283
+ }
1284
+
1285
+ .routing-config .routing-field {
1286
+ flex: 1;
1287
+ min-width: 180px;
1288
+ }
1289
+
1290
+ .routing-config label {
1291
+ display: block;
1292
+ font-size: 0.75rem;
1293
+ color: var(--text-secondary);
1294
+ margin-bottom: 0.25rem;
1295
+ font-weight: 500;
1296
+ }
1297
+
1298
+ .routing-config select {
1299
+ width: 100%;
1300
+ padding: 0.5rem 0.65rem;
1301
+ background: var(--bg-primary);
1302
+ border: 1px solid var(--border-strong);
1303
+ color: var(--text-primary);
1304
+ border-radius: 6px;
1305
+ font-family: var(--font-body);
1306
+ font-size: 0.85rem;
1307
+ }
1308
+
1309
+ .routing-config button {
1310
+ padding: 0.5rem 1.25rem;
1311
+ background: var(--accent);
1312
+ border: none;
1313
+ color: white;
1314
+ border-radius: 6px;
1315
+ cursor: pointer;
1316
+ font-family: var(--font-body);
1317
+ font-weight: 600;
1318
+ font-size: 0.85rem;
1319
+ align-self: flex-end;
1320
+ transition: background var(--transition-fast);
1321
+ }
1322
+
1323
+ .routing-config button:hover { background: var(--accent-hover); }
1324
+ .routing-config button:disabled { opacity: 0.4; cursor: not-allowed; }
1325
+
1326
+ /* Cost summary */
1327
+ .cost-summary {
1328
+ display: flex;
1329
+ gap: 1px;
1330
+ margin-bottom: 2rem;
1331
+ flex-wrap: wrap;
1332
+ background: var(--border);
1333
+ border-radius: var(--radius-lg);
1334
+ overflow: hidden;
1335
+ border: 1px solid var(--border);
1336
+ }
1337
+
1338
+ .cost-summary .cost-box {
1339
+ flex: 1;
1340
+ min-width: 140px;
1341
+ background: var(--bg-card);
1342
+ padding: 1rem 1.25rem;
1343
+ }
1344
+
1345
+ .cost-summary .cost-box h4 {
1346
+ font-family: var(--font-mono);
1347
+ font-size: 0.6rem;
1348
+ font-weight: 500;
1349
+ text-transform: uppercase;
1350
+ letter-spacing: 0.1em;
1351
+ color: var(--text-secondary);
1352
+ margin-bottom: 0.25rem;
1353
+ }
1354
+
1355
+ .cost-summary .cost-box .cost-value {
1356
+ font-family: var(--font-display);
1357
+ font-size: 1.25rem;
1358
+ font-weight: 700;
1359
+ letter-spacing: -0.02em;
1360
+ }
1361
+
1362
+ .cost-summary .cost-box.over-budget {
1363
+ border-left: 2px solid var(--danger);
1364
+ }
1365
+
1366
+ .cost-summary .cost-box.over-budget .cost-value { color: var(--danger); }
1367
+
1368
+ /* ── Chat scroll fix — chat manages its own scrolling ── */
1369
+ .content:has(.chat-layout) { overflow: hidden; max-height: none; }
1370
+ .content:has(.chat-container) { overflow: hidden; max-height: none; }
1371
+
1372
+ /* ── Chat Layout ────────────────────────────── */
1373
+
1374
+ .chat-layout {
1375
+ display: flex;
1376
+ height: calc(100vh - 6rem);
1377
+ gap: 0;
1378
+ }
1379
+
1380
+ .chat-layout .chat-container {
1381
+ flex: 1;
1382
+ min-width: 0;
1383
+ }
1384
+
1385
+ /* ── Chat Sidebar ────────────────────────────── */
1386
+
1387
+ .chat-sidebar {
1388
+ width: 260px;
1389
+ flex-shrink: 0;
1390
+ display: flex;
1391
+ flex-direction: column;
1392
+ border-right: 1px solid var(--border);
1393
+ background: var(--bg-surface);
1394
+ transition: width 0.2s ease;
1395
+ }
1396
+
1397
+ .chat-sidebar.closed {
1398
+ width: 48px;
1399
+ }
1400
+
1401
+ .chat-sidebar-header {
1402
+ display: flex;
1403
+ align-items: center;
1404
+ gap: 0.5rem;
1405
+ padding: 0.5rem;
1406
+ border-bottom: 1px solid var(--border);
1407
+ }
1408
+
1409
+ .new-chat-btn {
1410
+ flex: 1;
1411
+ padding: 0.5rem 0.75rem;
1412
+ border: 1px dashed var(--border);
1413
+ border-radius: var(--radius);
1414
+ background: transparent;
1415
+ color: var(--text-primary);
1416
+ cursor: pointer;
1417
+ font-size: 0.85rem;
1418
+ transition: all 0.15s ease;
1419
+ }
1420
+
1421
+ .new-chat-btn:hover {
1422
+ border-color: var(--accent);
1423
+ color: var(--accent);
1424
+ background: color-mix(in srgb, var(--accent) 8%, transparent);
1425
+ }
1426
+
1427
+ .sidebar-toggle {
1428
+ padding: 0.5rem;
1429
+ border: none;
1430
+ background: transparent;
1431
+ color: var(--text-secondary);
1432
+ cursor: pointer;
1433
+ font-size: 1rem;
1434
+ border-radius: var(--radius);
1435
+ }
1436
+
1437
+ .sidebar-toggle:hover {
1438
+ background: var(--bg-hover);
1439
+ }
1440
+
1441
+ .sidebar-toggle-inline {
1442
+ padding: 0.3rem 0.5rem;
1443
+ border: none;
1444
+ background: transparent;
1445
+ color: var(--text-secondary);
1446
+ cursor: pointer;
1447
+ font-size: 0.9rem;
1448
+ border-radius: var(--radius);
1449
+ }
1450
+
1451
+ .sidebar-toggle-inline:hover {
1452
+ background: var(--bg-hover);
1453
+ }
1454
+
1455
+ .chat-sidebar-list {
1456
+ flex: 1;
1457
+ overflow-y: auto;
1458
+ padding: 0.25rem 0;
1459
+ }
1460
+
1461
+ .chat-sidebar-item {
1462
+ display: flex;
1463
+ align-items: center;
1464
+ justify-content: space-between;
1465
+ padding: 0.6rem 0.75rem;
1466
+ cursor: pointer;
1467
+ border-left: 3px solid transparent;
1468
+ transition: all 0.12s ease;
1469
+ }
1470
+
1471
+ .chat-sidebar-item:hover {
1472
+ background: var(--bg-hover);
1473
+ }
1474
+
1475
+ .chat-sidebar-item.active {
1476
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
1477
+ border-left-color: var(--accent);
1478
+ }
1479
+
1480
+ .chat-sidebar-title {
1481
+ flex: 1;
1482
+ font-size: 0.85rem;
1483
+ color: var(--text-primary);
1484
+ overflow: hidden;
1485
+ text-overflow: ellipsis;
1486
+ white-space: nowrap;
1487
+ }
1488
+
1489
+ .chat-sidebar-time {
1490
+ font-size: 0.7rem;
1491
+ color: var(--text-secondary);
1492
+ margin-left: 0.5rem;
1493
+ flex-shrink: 0;
1494
+ }
1495
+
1496
+ .chat-sidebar-empty {
1497
+ text-align: center;
1498
+ color: var(--text-secondary);
1499
+ padding: 2rem 1rem;
1500
+ font-size: 0.85rem;
1501
+ }
1502
+
1503
+ .chat-rename-input {
1504
+ flex: 1;
1505
+ padding: 0.25rem 0.4rem;
1506
+ font-size: 0.85rem;
1507
+ border: 1px solid var(--accent);
1508
+ border-radius: var(--radius);
1509
+ background: var(--bg-primary);
1510
+ color: var(--text-primary);
1511
+ outline: none;
1512
+ }
1513
+
1514
+ /* ── Chat Context Menu ────────────────────────── */
1515
+
1516
+ .chat-context-menu {
1517
+ background: var(--bg-surface);
1518
+ border: 1px solid var(--border);
1519
+ border-radius: var(--radius);
1520
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
1521
+ z-index: 1000;
1522
+ min-width: 120px;
1523
+ padding: 0.25rem 0;
1524
+ }
1525
+
1526
+ .chat-context-menu button {
1527
+ display: block;
1528
+ width: 100%;
1529
+ text-align: left;
1530
+ padding: 0.5rem 0.75rem;
1531
+ border: none;
1532
+ background: transparent;
1533
+ color: var(--text-primary);
1534
+ cursor: pointer;
1535
+ font-size: 0.85rem;
1536
+ }
1537
+
1538
+ .chat-context-menu button:hover {
1539
+ background: var(--bg-hover);
1540
+ }
1541
+
1542
+ .chat-context-menu button.danger {
1543
+ color: var(--status-error);
1544
+ }
1545
+
1546
+ .chat-context-menu button.danger:hover {
1547
+ background: color-mix(in srgb, var(--status-error) 12%, transparent);
1548
+ }
1549
+
1550
+ .chat-status-right {
1551
+ display: flex;
1552
+ align-items: center;
1553
+ gap: 0.5rem;
1554
+ }
1555
+
1556
+ /* ── Chat Interface ────────────────────────────── */
1557
+
1558
+ .chat-container {
1559
+ display: flex;
1560
+ flex-direction: column;
1561
+ height: calc(100vh - 4rem);
1562
+ }
1563
+
1564
+ .chat-status {
1565
+ font-size: 0.8rem;
1566
+ color: var(--text-secondary);
1567
+ display: flex;
1568
+ justify-content: space-between;
1569
+ align-items: center;
1570
+ padding: 0.5rem 0;
1571
+ margin-bottom: 0.5rem;
1572
+ border-bottom: 1px solid var(--border);
1573
+ }
1574
+
1575
+ .chat-status-left {
1576
+ display: flex;
1577
+ align-items: center;
1578
+ gap: 0.6rem;
1579
+ }
1580
+
1581
+ .chat-status-dot {
1582
+ width: 6px;
1583
+ height: 6px;
1584
+ border-radius: 50%;
1585
+ background: var(--text-secondary);
1586
+ flex-shrink: 0;
1587
+ }
1588
+
1589
+ .chat-status-dot[data-connected="true"] {
1590
+ background: var(--success);
1591
+ }
1592
+
1593
+ .chat-agent-name {
1594
+ font-family: var(--font-display);
1595
+ font-weight: 600;
1596
+ font-size: 0.85rem;
1597
+ color: var(--text-primary);
1598
+ letter-spacing: -0.01em;
1599
+ }
1600
+
1601
+ .chat-status-sep {
1602
+ width: 1px;
1603
+ height: 0.9rem;
1604
+ background: var(--border);
1605
+ flex-shrink: 0;
1606
+ }
1607
+
1608
+ .chat-status-label {
1609
+ font-family: var(--font-body);
1610
+ font-size: 0.8rem;
1611
+ color: var(--text-secondary);
1612
+ }
1613
+
1614
+ .chat-status-label strong {
1615
+ color: var(--text-primary);
1616
+ font-weight: 600;
1617
+ }
1618
+
1619
+ .model-selector {
1620
+ display: flex;
1621
+ align-items: center;
1622
+ gap: 0.5rem;
1623
+ }
1624
+
1625
+ .model-selector select {
1626
+ padding: 0.25rem 0.5rem;
1627
+ background: var(--bg-card);
1628
+ border: 1px solid var(--border-strong);
1629
+ color: var(--text-primary);
1630
+ border-radius: 6px;
1631
+ font-family: var(--font-body);
1632
+ font-size: 0.75rem;
1633
+ cursor: pointer;
1634
+ transition: border-color var(--transition-fast);
1635
+ }
1636
+
1637
+ .model-selector select:hover { border-color: var(--accent); }
1638
+ .model-selector select:focus { outline: none; border-color: var(--accent); }
1639
+
1640
+ .model-label {
1641
+ font-family: var(--font-mono);
1642
+ font-size: 0.65rem;
1643
+ color: var(--text-secondary);
1644
+ margin-top: 0.2rem;
1645
+ text-align: right;
1646
+ letter-spacing: 0.02em;
1647
+ }
1648
+
1649
+ /* Messages */
1650
+ .chat-messages {
1651
+ flex: 1;
1652
+ overflow-y: auto;
1653
+ overflow-x: hidden;
1654
+ padding: 1rem 0;
1655
+ }
1656
+
1657
+ .chat-message {
1658
+ margin-bottom: 0.75rem;
1659
+ max-width: 78%;
1660
+ font-size: 0.9rem;
1661
+ line-height: 1.55;
1662
+ animation: messageIn 0.2s ease both;
1663
+ }
1664
+
1665
+ .chat-message.user {
1666
+ margin-left: auto;
1667
+ background: var(--accent);
1668
+ color: white;
1669
+ padding: 0.65rem 1rem;
1670
+ border-radius: var(--radius) var(--radius) 2px var(--radius);
1671
+ }
1672
+
1673
+ .chat-message.assistant {
1674
+ background: var(--bg-card);
1675
+ padding: 0.65rem 1rem;
1676
+ border-radius: var(--radius) var(--radius) var(--radius) 2px;
1677
+ border: 1px solid var(--border);
1678
+ }
1679
+
1680
+ .chat-message.error {
1681
+ background: rgba(239, 68, 68, 0.06);
1682
+ color: var(--danger);
1683
+ padding: 0.6rem 1rem;
1684
+ border-radius: var(--radius);
1685
+ font-size: 0.85rem;
1686
+ border: 1px solid rgba(239, 68, 68, 0.15);
1687
+ }
1688
+
1689
+ /* Chat input */
1690
+ .chat-input-area {
1691
+ display: flex;
1692
+ gap: 0.5rem;
1693
+ padding: 1rem 0;
1694
+ border-top: 1px solid var(--border);
1695
+ }
1696
+
1697
+ .chat-input-area > .chat-input-wrapper { flex: 1; }
1698
+
1699
+ .chat-input-wrapper {
1700
+ flex: 1;
1701
+ position: relative;
1702
+ }
1703
+
1704
+ .chat-input-wrapper input {
1705
+ width: 100%;
1706
+ padding: 0.7rem 0.85rem;
1707
+ background: var(--bg-card);
1708
+ border: 1px solid var(--border-strong);
1709
+ color: var(--text-primary);
1710
+ border-radius: 6px;
1711
+ font-family: var(--font-body);
1712
+ font-size: 0.875rem;
1713
+ transition: border-color var(--transition-fast);
1714
+ }
1715
+
1716
+ .chat-input-wrapper input:focus {
1717
+ outline: none;
1718
+ border-color: var(--accent);
1719
+ box-shadow: 0 0 0 3px var(--accent-glow);
1720
+ }
1721
+
1722
+ .chat-input-wrapper input::placeholder { color: var(--text-secondary); }
1723
+ .chat-input-wrapper input:disabled { opacity: 0.4; }
1724
+
1725
+ .chat-input-area button {
1726
+ padding: 0.7rem 1.5rem;
1727
+ background: var(--accent);
1728
+ border: none;
1729
+ color: white;
1730
+ border-radius: 6px;
1731
+ cursor: pointer;
1732
+ font-family: var(--font-body);
1733
+ font-weight: 600;
1734
+ font-size: 0.875rem;
1735
+ transition: background var(--transition-fast), transform var(--transition-fast);
1736
+ }
1737
+
1738
+ .chat-input-area button:hover { background: var(--accent-hover); }
1739
+ .chat-input-area button:active { transform: scale(0.97); }
1740
+ .chat-input-area button:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }
1741
+
1742
+ /* Slash command autocomplete */
1743
+ .slash-autocomplete {
1744
+ position: absolute;
1745
+ bottom: 100%;
1746
+ left: 0;
1747
+ right: 0;
1748
+ margin-bottom: 4px;
1749
+ background: var(--bg-card);
1750
+ border: 1px solid var(--border-strong);
1751
+ border-radius: var(--radius);
1752
+ max-height: 240px;
1753
+ overflow-y: auto;
1754
+ z-index: 10;
1755
+ box-shadow: 0 -8px 32px rgba(0, 0, 0, 0.5);
1756
+ }
1757
+
1758
+ .slash-ac-item {
1759
+ display: flex;
1760
+ align-items: center;
1761
+ gap: 0.75rem;
1762
+ padding: 0.5rem 0.75rem;
1763
+ cursor: pointer;
1764
+ transition: background var(--transition-fast);
1765
+ }
1766
+
1767
+ .slash-ac-item:hover,
1768
+ .slash-ac-item.selected {
1769
+ background: var(--accent-subtle);
1770
+ }
1771
+
1772
+ .slash-ac-cmd {
1773
+ font-family: var(--font-mono);
1774
+ font-size: 0.8rem;
1775
+ color: var(--accent);
1776
+ white-space: nowrap;
1777
+ min-width: 140px;
1778
+ }
1779
+
1780
+ .slash-ac-desc {
1781
+ font-size: 0.75rem;
1782
+ color: var(--text-secondary);
1783
+ }
1784
+
1785
+ /* ── Markdown (Chat Messages) ──────────────────── */
1786
+
1787
+ .chat-markdown { line-height: 1.6; }
1788
+
1789
+ .chat-markdown h2,
1790
+ .chat-markdown h3,
1791
+ .chat-markdown h4 {
1792
+ margin: 0.75rem 0 0.35rem;
1793
+ color: var(--text-primary);
1794
+ font-family: var(--font-display);
1795
+ letter-spacing: -0.01em;
1796
+ }
1797
+
1798
+ .chat-markdown h2 { font-size: 1.1rem; font-weight: 700; }
1799
+ .chat-markdown h3 { font-size: 1rem; font-weight: 600; }
1800
+ .chat-markdown h4 { font-size: 0.9rem; font-weight: 600; }
1801
+
1802
+ .chat-markdown p { margin: 0.35rem 0; }
1803
+
1804
+ .chat-markdown .code-block {
1805
+ margin: 0.5rem 0;
1806
+ border: 1px solid var(--border);
1807
+ border-radius: var(--radius);
1808
+ overflow: hidden;
1809
+ }
1810
+
1811
+ .chat-markdown .code-header {
1812
+ display: flex;
1813
+ align-items: center;
1814
+ justify-content: space-between;
1815
+ padding: 0.35rem 0.75rem;
1816
+ background: var(--bg-secondary);
1817
+ border-bottom: 1px solid var(--border);
1818
+ font-size: 0.7rem;
1819
+ }
1820
+
1821
+ .chat-markdown .code-lang {
1822
+ font-family: var(--font-mono);
1823
+ color: var(--text-secondary);
1824
+ text-transform: uppercase;
1825
+ font-weight: 500;
1826
+ letter-spacing: 0.08em;
1827
+ font-size: 0.6rem;
1828
+ }
1829
+
1830
+ .chat-markdown .code-copy {
1831
+ background: transparent;
1832
+ border: 1px solid var(--border-strong);
1833
+ color: var(--text-secondary);
1834
+ font-family: var(--font-mono);
1835
+ font-size: 0.6rem;
1836
+ padding: 0.15rem 0.5rem;
1837
+ border-radius: 4px;
1838
+ cursor: pointer;
1839
+ transition: all var(--transition-fast);
1840
+ letter-spacing: 0.02em;
1841
+ }
1842
+
1843
+ .chat-markdown .code-copy:hover {
1844
+ color: var(--accent);
1845
+ border-color: var(--accent);
1846
+ background: var(--accent-subtle);
1847
+ }
1848
+
1849
+ .chat-markdown pre {
1850
+ background: var(--bg-primary);
1851
+ padding: 0.75rem;
1852
+ overflow-x: auto;
1853
+ margin: 0;
1854
+ font-size: 0.8rem;
1855
+ line-height: 1.55;
1856
+ }
1857
+
1858
+ .chat-markdown code {
1859
+ font-family: var(--font-mono);
1860
+ font-size: 0.85em;
1861
+ }
1862
+
1863
+ .chat-markdown :not(pre) > code {
1864
+ background: var(--accent-subtle);
1865
+ color: var(--accent);
1866
+ padding: 0.15rem 0.4rem;
1867
+ border-radius: 4px;
1868
+ font-size: 0.82em;
1869
+ }
1870
+
1871
+ .chat-markdown ul {
1872
+ margin: 0.35rem 0;
1873
+ padding-left: 1.25rem;
1874
+ }
1875
+
1876
+ .chat-markdown li { margin: 0.15rem 0; }
1877
+
1878
+ .chat-markdown strong {
1879
+ color: var(--text-primary);
1880
+ font-weight: 600;
1881
+ }
1882
+
1883
+ .chat-markdown em {
1884
+ font-style: italic;
1885
+ color: var(--text-secondary);
1886
+ }
1887
+
1888
+ .chat-markdown hr {
1889
+ border: none;
1890
+ border-top: 1px solid var(--border);
1891
+ margin: 0.75rem 0;
1892
+ }
1893
+
1894
+ /* ── Theme Selector ───────────────────────────── */
1895
+
1896
+ .theme-grid {
1897
+ display: grid;
1898
+ grid-template-columns: repeat(3, 1fr);
1899
+ gap: 1rem;
1900
+ margin-top: 1rem;
1901
+ }
1902
+
1903
+ .theme-card {
1904
+ background: var(--bg-card);
1905
+ border: 2px solid var(--border);
1906
+ border-radius: var(--radius-lg);
1907
+ padding: 1rem;
1908
+ cursor: pointer;
1909
+ transition: border-color var(--transition-base), transform var(--transition-fast);
1910
+ }
1911
+
1912
+ .theme-card:hover {
1913
+ border-color: var(--border-strong);
1914
+ transform: translateY(-1px);
1915
+ }
1916
+
1917
+ .theme-card.selected {
1918
+ border-color: var(--accent);
1919
+ box-shadow: 0 0 0 1px var(--accent);
1920
+ }
1921
+
1922
+ .theme-swatches {
1923
+ display: flex;
1924
+ gap: 6px;
1925
+ margin-bottom: 0.75rem;
1926
+ }
1927
+
1928
+ .theme-swatch {
1929
+ width: 24px;
1930
+ height: 24px;
1931
+ border-radius: 50%;
1932
+ border: 1px solid rgba(128, 128, 128, 0.2);
1933
+ }
1934
+
1935
+ .theme-info {
1936
+ display: flex;
1937
+ align-items: center;
1938
+ gap: 0.5rem;
1939
+ margin-bottom: 0.25rem;
1940
+ }
1941
+
1942
+ .theme-info h3 {
1943
+ font-family: var(--font-display);
1944
+ font-size: 0.9rem;
1945
+ font-weight: 600;
1946
+ color: var(--text-primary);
1947
+ margin: 0;
1948
+ }
1949
+
1950
+ .theme-mode-badge {
1951
+ font-family: var(--font-mono);
1952
+ font-size: 0.55rem;
1953
+ font-weight: 500;
1954
+ text-transform: uppercase;
1955
+ letter-spacing: 0.08em;
1956
+ padding: 2px 6px;
1957
+ border-radius: 4px;
1958
+ }
1959
+
1960
+ .theme-mode-badge.dark {
1961
+ background: rgba(255, 255, 255, 0.08);
1962
+ color: var(--text-secondary);
1963
+ }
1964
+
1965
+ .theme-mode-badge.light {
1966
+ background: rgba(59, 130, 246, 0.1);
1967
+ color: #3b82f6;
1968
+ }
1969
+
1970
+ .theme-description {
1971
+ font-size: 0.75rem;
1972
+ color: var(--text-secondary);
1973
+ margin: 0;
1974
+ }
1975
+
1976
+ /* ── Animations ────────────────────────────────── */
1977
+
1978
+ @keyframes cardEnter {
1979
+ from {
1980
+ opacity: 0;
1981
+ transform: translateY(12px);
1982
+ }
1983
+ to {
1984
+ opacity: 1;
1985
+ transform: translateY(0);
1986
+ }
1987
+ }
1988
+
1989
+ @keyframes messageIn {
1990
+ from {
1991
+ opacity: 0;
1992
+ transform: translateY(6px);
1993
+ }
1994
+ to {
1995
+ opacity: 1;
1996
+ transform: translateY(0);
1997
+ }
1998
+ }
1999
+
2000
+ /* ── Responsive ────────────────────────────────── */
2001
+
2002
+ @media (max-width: 900px) {
2003
+ .mc-columns {
2004
+ grid-template-columns: 1fr;
2005
+ }
2006
+ }
2007
+
2008
+ @media (max-width: 768px) {
2009
+ .sidebar { display: none; }
2010
+
2011
+ .content {
2012
+ padding: 1.5rem;
2013
+ }
2014
+
2015
+ .status-grid {
2016
+ grid-template-columns: repeat(2, 1fr);
2017
+ }
2018
+
2019
+ .chat-message { max-width: 90%; }
2020
+ .chat-sidebar { width: 200px; }
2021
+ .chat-sidebar.closed { width: 0; border-right: none; overflow: hidden; }
2022
+
2023
+ .provider-grid,
2024
+ .channel-grid {
2025
+ grid-template-columns: 1fr;
2026
+ }
2027
+
2028
+ .theme-grid { grid-template-columns: repeat(2, 1fr); }
2029
+ }
2030
+
2031
+ @media (max-width: 480px) {
2032
+ .content { padding: 1rem; }
2033
+
2034
+ .status-grid {
2035
+ grid-template-columns: 1fr;
2036
+ }
2037
+
2038
+ .page h2 {
2039
+ font-size: 1.4rem;
2040
+ }
2041
+
2042
+ .theme-grid { grid-template-columns: 1fr; }
2043
+ }
2044
+
2045
+ /* ─── Personality Editor ─── */
2046
+ .page .page-header {
2047
+ display: flex;
2048
+ justify-content: space-between;
2049
+ align-items: center;
2050
+ margin-bottom: 1.5rem;
2051
+ }
2052
+
2053
+ .editor-section {
2054
+ margin-bottom: 2rem;
2055
+ padding: 1.5rem;
2056
+ background: var(--bg-card);
2057
+ border: 1px solid var(--border);
2058
+ border-radius: 12px;
2059
+ }
2060
+
2061
+ .editor-section h3 {
2062
+ margin: 0 0 1rem;
2063
+ font-size: 1rem;
2064
+ color: var(--text-primary);
2065
+ }
2066
+
2067
+ .form-grid {
2068
+ display: grid;
2069
+ grid-template-columns: 1fr 1fr;
2070
+ gap: 1rem;
2071
+ }
2072
+
2073
+ .form-field {
2074
+ display: flex;
2075
+ flex-direction: column;
2076
+ gap: 0.35rem;
2077
+ }
2078
+
2079
+ .form-field.full-width {
2080
+ grid-column: 1 / -1;
2081
+ }
2082
+
2083
+ .form-field label {
2084
+ font-size: 0.8rem;
2085
+ color: var(--text-secondary);
2086
+ font-weight: 500;
2087
+ }
2088
+
2089
+ .field-hint {
2090
+ font-size: 0.7rem;
2091
+ color: var(--text-secondary);
2092
+ opacity: 0.7;
2093
+ margin-top: 0.15rem;
2094
+ }
2095
+
2096
+ /* Tone sliders */
2097
+ .tone-sliders {
2098
+ display: flex;
2099
+ flex-direction: column;
2100
+ gap: 1rem;
2101
+ }
2102
+
2103
+ .tone-slider-header {
2104
+ display: flex;
2105
+ justify-content: space-between;
2106
+ align-items: center;
2107
+ margin-bottom: 0.25rem;
2108
+ }
2109
+
2110
+ .tone-label {
2111
+ font-size: 0.85rem;
2112
+ color: var(--text-primary);
2113
+ font-weight: 500;
2114
+ }
2115
+
2116
+ .tone-value {
2117
+ font-size: 0.75rem;
2118
+ color: var(--text-secondary);
2119
+ font-variant-numeric: tabular-nums;
2120
+ }
2121
+
2122
+ .tone-slider-row {
2123
+ display: flex;
2124
+ align-items: center;
2125
+ gap: 0.75rem;
2126
+ }
2127
+
2128
+ .tone-extreme {
2129
+ font-size: 0.7rem;
2130
+ color: var(--text-secondary);
2131
+ min-width: 4rem;
2132
+ }
2133
+
2134
+ .tone-extreme:last-child {
2135
+ text-align: right;
2136
+ }
2137
+
2138
+ .slider {
2139
+ flex: 1;
2140
+ height: 6px;
2141
+ -webkit-appearance: none;
2142
+ appearance: none;
2143
+ background: var(--border);
2144
+ border-radius: 3px;
2145
+ outline: none;
2146
+ }
2147
+
2148
+ .slider::-webkit-slider-thumb {
2149
+ -webkit-appearance: none;
2150
+ appearance: none;
2151
+ width: 16px;
2152
+ height: 16px;
2153
+ border-radius: 50%;
2154
+ background: var(--accent);
2155
+ cursor: pointer;
2156
+ border: 2px solid var(--bg-card);
2157
+ box-shadow: 0 1px 3px rgba(0,0,0,0.3);
2158
+ }
2159
+
2160
+ /* Tag input */
2161
+ .tag-input-container {
2162
+ display: flex;
2163
+ flex-wrap: wrap;
2164
+ gap: 0.35rem;
2165
+ padding: 0.4rem;
2166
+ border: 1px solid var(--border);
2167
+ border-radius: 8px;
2168
+ background: var(--bg-primary);
2169
+ min-height: 38px;
2170
+ align-items: center;
2171
+ }
2172
+
2173
+ .tag {
2174
+ display: inline-flex;
2175
+ align-items: center;
2176
+ gap: 0.25rem;
2177
+ padding: 0.15rem 0.5rem;
2178
+ background: var(--accent);
2179
+ color: #fff;
2180
+ border-radius: 4px;
2181
+ font-size: 0.75rem;
2182
+ }
2183
+
2184
+ .tag-remove {
2185
+ background: none;
2186
+ border: none;
2187
+ color: inherit;
2188
+ cursor: pointer;
2189
+ padding: 0 0.15rem;
2190
+ font-size: 0.7rem;
2191
+ opacity: 0.7;
2192
+ }
2193
+
2194
+ .tag-remove:hover {
2195
+ opacity: 1;
2196
+ }
2197
+
2198
+ .tag-input {
2199
+ border: none;
2200
+ background: transparent;
2201
+ outline: none;
2202
+ flex: 1;
2203
+ min-width: 80px;
2204
+ font-size: 0.85rem;
2205
+ color: var(--text-primary);
2206
+ }
2207
+
2208
+ /* Catchphrase grid */
2209
+ .catchphrase-grid {
2210
+ display: flex;
2211
+ flex-direction: column;
2212
+ gap: 0.5rem;
2213
+ }
2214
+
2215
+ .catchphrase-row {
2216
+ display: flex;
2217
+ align-items: center;
2218
+ gap: 0.75rem;
2219
+ }
2220
+
2221
+ .catchphrase-label {
2222
+ min-width: 5rem;
2223
+ font-size: 0.8rem;
2224
+ color: var(--text-secondary);
2225
+ text-transform: capitalize;
2226
+ }
2227
+
2228
+ .catchphrase-row input {
2229
+ flex: 1;
2230
+ }
2231
+
2232
+ /* Custom instructions / SOUL editor */
2233
+ .custom-instructions-textarea,
2234
+ .soul-editor-textarea {
2235
+ width: 100%;
2236
+ resize: vertical;
2237
+ font-family: inherit;
2238
+ font-size: 0.85rem;
2239
+ padding: 0.75rem;
2240
+ border: 1px solid var(--border);
2241
+ border-radius: 8px;
2242
+ background: var(--bg-primary);
2243
+ color: var(--text-primary);
2244
+ transition: border-color var(--transition-fast);
2245
+ }
2246
+
2247
+ .custom-instructions-textarea:focus,
2248
+ .soul-editor-textarea:focus {
2249
+ outline: none;
2250
+ border-color: var(--accent);
2251
+ box-shadow: 0 0 0 3px var(--accent-glow);
2252
+ }
2253
+
2254
+ .soul-editor-textarea {
2255
+ font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
2256
+ font-size: 0.8rem;
2257
+ }
2258
+
2259
+ /* Section toggle */
2260
+ .section-toggle {
2261
+ background: none;
2262
+ border: none;
2263
+ color: var(--text-secondary);
2264
+ font-size: 0.9rem;
2265
+ cursor: pointer;
2266
+ padding: 0;
2267
+ font-weight: 500;
2268
+ }
2269
+
2270
+ .section-toggle:hover {
2271
+ color: var(--text-primary);
2272
+ }
2273
+
2274
+ /* Editor footer */
2275
+ .editor-footer {
2276
+ position: sticky;
2277
+ bottom: 0;
2278
+ padding: 1rem 1.5rem;
2279
+ background: var(--bg-primary);
2280
+ border-top: 1px solid var(--border);
2281
+ text-align: right;
2282
+ margin: 0 -1.5rem;
2283
+ }
2284
+
2285
+ /* Form inputs inside editor-section (for elements not covered by .settings-form) */
2286
+ .editor-section input[type="text"],
2287
+ .editor-section select {
2288
+ width: 100%;
2289
+ padding: 0.65rem 0.85rem;
2290
+ background: var(--bg-primary);
2291
+ border: 1px solid var(--border-strong);
2292
+ color: var(--text-primary);
2293
+ border-radius: 6px;
2294
+ font-family: var(--font-body);
2295
+ font-size: 0.875rem;
2296
+ transition: border-color var(--transition-fast);
2297
+ }
2298
+
2299
+ .editor-section input[type="text"]:focus,
2300
+ .editor-section select:focus {
2301
+ outline: none;
2302
+ border-color: var(--accent);
2303
+ box-shadow: 0 0 0 3px var(--accent-glow);
2304
+ }
2305
+
2306
+ .editor-section input[type="text"]::placeholder {
2307
+ color: var(--text-secondary);
2308
+ }