openpalm 0.9.4 → 0.9.6

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.
@@ -0,0 +1,952 @@
1
+ /* =========================================================================
2
+ OpenPalm Setup Wizard — Standalone CSS
3
+ ========================================================================= */
4
+
5
+ /* ── CSS Custom Properties (Design Tokens) ─────────────────────────────── */
6
+ :root {
7
+ /* Spacing scale */
8
+ --space-1: 4px;
9
+ --space-2: 8px;
10
+ --space-3: 12px;
11
+ --space-4: 16px;
12
+ --space-5: 20px;
13
+ --space-6: 24px;
14
+ --space-7: 28px;
15
+ --space-8: 32px;
16
+
17
+ /* Typography */
18
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
19
+ --font-mono: 'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace;
20
+ --text-xs: 0.75rem;
21
+ --text-sm: 0.8125rem;
22
+ --text-base: 0.875rem;
23
+ --text-lg: 1.125rem;
24
+ --text-xl: 1.25rem;
25
+ --text-2xl: 1.5rem;
26
+ --font-medium: 500;
27
+ --font-semibold: 600;
28
+ --font-bold: 700;
29
+ --leading-tight: 1.25;
30
+
31
+ /* Radii */
32
+ --radius-sm: 6px;
33
+ --radius-md: 8px;
34
+ --radius-lg: 12px;
35
+ --radius-full: 9999px;
36
+
37
+ /* Colors */
38
+ --color-bg: #ffffff;
39
+ --color-bg-secondary: #f8f9fb;
40
+ --color-text: #1a1a1a;
41
+ --color-text-secondary: #6b7280;
42
+ --color-text-tertiary: #9ca3af;
43
+ --color-border: #e5e7eb;
44
+ --color-border-hover: #adb5bd;
45
+ --color-primary: #ff9d00;
46
+ --color-primary-hover: #e68a00;
47
+ --color-primary-subtle: rgba(255, 157, 0, 0.1);
48
+ --color-success: #2f9e44;
49
+ --color-success-bg: rgba(64, 192, 87, 0.1);
50
+ --color-success-border: rgba(64, 192, 87, 0.25);
51
+ --color-danger: #dc2626;
52
+ --color-error: #dc2626;
53
+
54
+ /* Transitions */
55
+ --transition-fast: 0.15s ease;
56
+ }
57
+
58
+ /* ── Reset / Base ──────────────────────────────────────────────────────── */
59
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
60
+
61
+ body {
62
+ font-family: var(--font-sans);
63
+ font-size: var(--text-base);
64
+ color: var(--color-text);
65
+ background: var(--color-bg-secondary);
66
+ line-height: 1.5;
67
+ -webkit-font-smoothing: antialiased;
68
+ -moz-osx-font-smoothing: grayscale;
69
+ }
70
+
71
+ /* ── Page Layout ───────────────────────────────────────────────────────── */
72
+ .setup-page {
73
+ min-height: 100vh;
74
+ display: grid;
75
+ place-items: center;
76
+ padding: var(--space-6);
77
+ background:
78
+ radial-gradient(ellipse 80% 60% at 15% 10%, rgba(255, 157, 0, 0.06) 0%, transparent 60%),
79
+ radial-gradient(ellipse 60% 50% at 85% 90%, rgba(99, 102, 241, 0.05) 0%, transparent 55%),
80
+ #f8f9fb;
81
+ position: relative;
82
+ overflow: hidden;
83
+ }
84
+
85
+ /* ── Wizard Card ───────────────────────────────────────────────────────── */
86
+ .wizard-card {
87
+ width: 100%;
88
+ max-width: 560px;
89
+ background: var(--color-bg);
90
+ border: 1px solid rgba(0, 0, 0, 0.08);
91
+ border-radius: 20px;
92
+ box-shadow:
93
+ 0 0 0 1px rgba(0, 0, 0, 0.04),
94
+ 0 4px 6px -1px rgba(0, 0, 0, 0.06),
95
+ 0 16px 40px -8px rgba(0, 0, 0, 0.1);
96
+ padding: 0;
97
+ position: relative;
98
+ z-index: 1;
99
+ min-height: 520px;
100
+ display: flex;
101
+ flex-direction: column;
102
+ animation: card-enter 0.45s cubic-bezier(0.16, 1, 0.3, 1) both;
103
+ }
104
+
105
+ @keyframes card-enter {
106
+ from { opacity: 0; transform: translateY(16px) scale(0.98); }
107
+ to { opacity: 1; transform: translateY(0) scale(1); }
108
+ }
109
+
110
+ @media (prefers-reduced-motion: reduce) {
111
+ .wizard-card { animation: none; }
112
+ }
113
+
114
+ .wizard-header {
115
+ padding: var(--space-8) var(--space-8) var(--space-5);
116
+ border-bottom: 1px solid var(--color-border);
117
+ text-align: center;
118
+ }
119
+
120
+ .wizard-header h1 {
121
+ font-size: clamp(1.5rem, 4vw, 1.875rem);
122
+ font-weight: 800;
123
+ color: var(--color-text);
124
+ letter-spacing: -0.03em;
125
+ line-height: 1.1;
126
+ }
127
+
128
+ .wizard-subtitle {
129
+ margin-top: var(--space-2);
130
+ font-size: var(--text-sm);
131
+ color: var(--color-text-secondary);
132
+ }
133
+
134
+ .wizard-body {
135
+ padding: var(--space-6) var(--space-8) var(--space-8);
136
+ flex: 1;
137
+ display: flex;
138
+ flex-direction: column;
139
+ }
140
+
141
+ /* ── Step Indicators ───────────────────────────────────────────────────── */
142
+ .step-indicators {
143
+ display: flex;
144
+ align-items: center;
145
+ margin-bottom: var(--space-6);
146
+ padding: var(--space-2) 0;
147
+ gap: 0;
148
+ }
149
+
150
+ .step-dot {
151
+ width: 36px;
152
+ height: 36px;
153
+ flex-shrink: 0;
154
+ border-radius: 50%;
155
+ border: 2px solid var(--color-border-hover);
156
+ background: var(--color-bg);
157
+ color: var(--color-text-secondary);
158
+ font-size: var(--text-xs);
159
+ font-weight: var(--font-bold);
160
+ display: flex;
161
+ align-items: center;
162
+ justify-content: center;
163
+ cursor: pointer;
164
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
165
+ position: relative;
166
+ z-index: 1;
167
+ }
168
+
169
+ .step-dot:disabled {
170
+ opacity: 0.5;
171
+ cursor: not-allowed;
172
+ }
173
+
174
+ .step-dot.active {
175
+ border-color: var(--color-primary);
176
+ background: var(--color-primary);
177
+ color: #000;
178
+ transform: scale(1.1);
179
+ box-shadow: 0 0 0 4px rgba(255, 157, 0, 0.15), 0 0 0 8px rgba(255, 157, 0, 0.05);
180
+ }
181
+
182
+ .step-dot.completed {
183
+ border-color: var(--color-success);
184
+ background: var(--color-success);
185
+ color: #fff;
186
+ cursor: pointer;
187
+ }
188
+
189
+ .step-dot.completed:hover {
190
+ box-shadow: 0 0 0 4px rgba(64, 192, 87, 0.15);
191
+ }
192
+
193
+ .step-line {
194
+ flex: 1;
195
+ min-width: var(--space-4);
196
+ height: 2px;
197
+ background: var(--color-border);
198
+ transition: background 0.4s ease;
199
+ }
200
+
201
+ .step-line.active {
202
+ background: var(--color-success);
203
+ }
204
+
205
+ /* ── Step Content ──────────────────────────────────────────────────────── */
206
+ .step-content {
207
+ display: flex;
208
+ flex-direction: column;
209
+ flex: 1;
210
+ }
211
+
212
+ .step-content h2 {
213
+ font-size: var(--text-2xl);
214
+ font-weight: var(--font-bold);
215
+ color: var(--color-text);
216
+ margin-bottom: var(--space-2);
217
+ letter-spacing: -0.01em;
218
+ }
219
+
220
+ .step-description {
221
+ font-size: var(--text-sm);
222
+ color: var(--color-text-secondary);
223
+ margin-bottom: var(--space-6);
224
+ line-height: 1.5;
225
+ }
226
+
227
+ /* ── Step Actions ──────────────────────────────────────────────────────── */
228
+ .step-actions {
229
+ display: flex;
230
+ justify-content: flex-end;
231
+ gap: var(--space-3);
232
+ margin-top: auto;
233
+ padding-top: var(--space-5);
234
+ border-top: 1px solid var(--color-border);
235
+ }
236
+
237
+ /* ── Buttons ───────────────────────────────────────────────────────────── */
238
+ .btn {
239
+ display: inline-flex;
240
+ align-items: center;
241
+ gap: var(--space-2);
242
+ padding: 10px 24px;
243
+ font-family: var(--font-sans);
244
+ font-size: var(--text-sm);
245
+ font-weight: var(--font-bold);
246
+ line-height: 1.4;
247
+ border: 1.5px solid transparent;
248
+ border-radius: var(--radius-full);
249
+ cursor: pointer;
250
+ transition: all 0.2s ease;
251
+ white-space: nowrap;
252
+ justify-content: center;
253
+ text-decoration: none;
254
+ }
255
+
256
+ .btn:disabled {
257
+ opacity: 0.45;
258
+ cursor: not-allowed;
259
+ }
260
+
261
+ .btn-primary {
262
+ background: var(--color-primary);
263
+ color: #1a1a1a;
264
+ border-color: transparent;
265
+ box-shadow: 0 1px 3px rgba(255, 157, 0, 0.3), 0 4px 12px rgba(255, 157, 0, 0.2);
266
+ }
267
+
268
+ .btn-primary:hover:not(:disabled) {
269
+ background: var(--color-primary-hover);
270
+ box-shadow: 0 2px 6px rgba(255, 157, 0, 0.4), 0 8px 20px rgba(255, 157, 0, 0.25);
271
+ transform: translateY(-1px);
272
+ }
273
+
274
+ .btn-primary:active:not(:disabled) {
275
+ transform: translateY(0);
276
+ box-shadow: 0 1px 4px rgba(255, 157, 0, 0.2);
277
+ transition-duration: 0.1s;
278
+ }
279
+
280
+ .btn-secondary {
281
+ background: var(--color-bg);
282
+ color: var(--color-text);
283
+ border-color: var(--color-border-hover);
284
+ }
285
+
286
+ .btn-secondary:hover:not(:disabled) {
287
+ background: var(--color-bg-secondary);
288
+ border-color: var(--color-text-secondary);
289
+ }
290
+
291
+ .btn-outline {
292
+ background: transparent;
293
+ color: var(--color-primary);
294
+ border-color: var(--color-primary);
295
+ }
296
+
297
+ .btn-outline:hover:not(:disabled) {
298
+ background: var(--color-primary-subtle);
299
+ }
300
+
301
+ /* ── Form Fields ───────────────────────────────────────────────────────── */
302
+ .field-group {
303
+ margin-bottom: var(--space-5);
304
+ }
305
+
306
+ .field-group--compact {
307
+ margin-bottom: 0;
308
+ }
309
+
310
+ .field-group label {
311
+ display: block;
312
+ font-size: var(--text-sm);
313
+ font-weight: var(--font-semibold);
314
+ color: var(--color-text);
315
+ margin-bottom: var(--space-2);
316
+ }
317
+
318
+ .field-group input,
319
+ .field-group select {
320
+ width: 100%;
321
+ height: 44px;
322
+ border: 1.5px solid var(--color-border);
323
+ border-radius: var(--radius-lg);
324
+ padding: 0 14px;
325
+ background: var(--color-bg);
326
+ color: var(--color-text);
327
+ font-family: var(--font-sans);
328
+ font-size: var(--text-base);
329
+ transition: all 0.2s ease;
330
+ }
331
+
332
+ .field-group input::placeholder {
333
+ color: var(--color-text-tertiary);
334
+ }
335
+
336
+ .field-group input:hover,
337
+ .field-group select:hover {
338
+ border-color: var(--color-border-hover);
339
+ }
340
+
341
+ .field-group input:focus,
342
+ .field-group select:focus {
343
+ outline: none;
344
+ border-color: var(--color-primary);
345
+ box-shadow: 0 0 0 4px var(--color-primary-subtle);
346
+ }
347
+
348
+ .field-hint {
349
+ margin-top: var(--space-2);
350
+ font-size: var(--text-xs);
351
+ color: var(--color-text-secondary);
352
+ line-height: 1.5;
353
+ }
354
+
355
+ .field-hint--accent {
356
+ color: var(--color-primary-hover);
357
+ font-weight: var(--font-medium);
358
+ }
359
+
360
+ .field-error {
361
+ margin: 0 0 var(--space-3);
362
+ padding: var(--space-2) var(--space-3);
363
+ background: #fef2f2;
364
+ border: 1px solid #fecaca;
365
+ border-radius: var(--radius-md);
366
+ color: #dc2626;
367
+ font-size: var(--text-sm);
368
+ font-weight: var(--font-medium);
369
+ }
370
+
371
+ .field-warn {
372
+ margin-top: var(--space-2);
373
+ font-size: var(--text-xs);
374
+ color: #b45309;
375
+ line-height: 1.5;
376
+ }
377
+
378
+ /* ── Connection Type Cards ─────────────────────────────────────────────── */
379
+ .conn-card {
380
+ display: flex;
381
+ align-items: center;
382
+ gap: var(--space-4);
383
+ width: 100%;
384
+ padding: var(--space-5);
385
+ background: var(--color-bg);
386
+ border: 1.5px solid var(--color-border);
387
+ border-radius: var(--radius-lg);
388
+ cursor: pointer;
389
+ text-align: left;
390
+ margin-bottom: var(--space-3);
391
+ transition: border-color 180ms ease, box-shadow 180ms ease, background 180ms ease, transform 120ms ease;
392
+ will-change: transform;
393
+ }
394
+
395
+ .conn-card:last-child { margin-bottom: 0; }
396
+
397
+ .conn-card:hover {
398
+ border-color: var(--color-primary);
399
+ box-shadow: 0 0 0 3px var(--color-primary-subtle), 0 4px 12px rgba(0, 0, 0, 0.06);
400
+ transform: translateY(-1px);
401
+ }
402
+
403
+ .conn-card:active {
404
+ transform: translateY(0);
405
+ box-shadow: 0 0 0 3px var(--color-primary-subtle);
406
+ transition-duration: 60ms;
407
+ }
408
+
409
+ .conn-icon {
410
+ flex-shrink: 0;
411
+ width: 44px;
412
+ height: 44px;
413
+ display: flex;
414
+ align-items: center;
415
+ justify-content: center;
416
+ border-radius: var(--radius-md);
417
+ transition: background 180ms ease, color 180ms ease;
418
+ }
419
+
420
+ .conn-icon--cloud { background: rgba(51, 154, 240, 0.1); color: #339af0; }
421
+ .conn-icon--local { background: rgba(64, 192, 87, 0.1); color: #40c057; }
422
+ .conn-card:hover .conn-icon--cloud { background: rgba(51, 154, 240, 0.18); }
423
+ .conn-card:hover .conn-icon--local { background: rgba(64, 192, 87, 0.18); }
424
+
425
+ .conn-body { display: flex; flex-direction: column; gap: var(--space-1); flex: 1; min-width: 0; }
426
+ .conn-label { display: flex; align-items: center; gap: var(--space-2); font-size: var(--text-base); font-weight: var(--font-semibold); color: var(--color-text); line-height: var(--leading-tight); }
427
+ .conn-desc { font-size: var(--text-sm); color: var(--color-text-secondary); line-height: 1.45; }
428
+ .conn-note { font-size: var(--text-xs); color: var(--color-text-tertiary); line-height: 1.4; }
429
+ .conn-note--recommended { color: #2f9e44; font-weight: var(--font-medium); }
430
+
431
+ .conn-badge {
432
+ display: inline-flex;
433
+ align-items: center;
434
+ padding: 1px 7px;
435
+ font-size: 0.6875rem;
436
+ font-weight: var(--font-semibold);
437
+ letter-spacing: 0.03em;
438
+ border-radius: var(--radius-full);
439
+ background: rgba(51, 154, 240, 0.1);
440
+ color: #1c7ed6;
441
+ border: 1px solid rgba(51, 154, 240, 0.2);
442
+ }
443
+
444
+ .conn-badge--local { background: rgba(64, 192, 87, 0.1); color: #2f9e44; border-color: rgba(64, 192, 87, 0.2); }
445
+
446
+ .conn-arrow {
447
+ flex-shrink: 0;
448
+ color: var(--color-text-tertiary);
449
+ transition: color 180ms ease, transform 180ms ease;
450
+ display: flex;
451
+ align-items: center;
452
+ }
453
+
454
+ .conn-card:hover .conn-arrow { color: var(--color-primary); transform: translateX(2px); }
455
+
456
+ /* ── Connections Hub List ──────────────────────────────────────────────── */
457
+ .hub-list {
458
+ list-style: none;
459
+ padding: 0;
460
+ margin: 0 0 var(--space-4);
461
+ display: flex;
462
+ flex-direction: column;
463
+ gap: var(--space-2);
464
+ }
465
+
466
+ .hub-row {
467
+ display: flex;
468
+ justify-content: space-between;
469
+ align-items: center;
470
+ gap: var(--space-3);
471
+ padding: var(--space-3) var(--space-4);
472
+ background: var(--color-bg);
473
+ border: 1px solid var(--color-border);
474
+ border-radius: var(--radius-md);
475
+ }
476
+
477
+ .hub-row-info { display: flex; align-items: center; gap: var(--space-2); flex: 1; min-width: 0; flex-wrap: wrap; }
478
+ .hub-row-name { font-size: var(--text-sm); font-weight: var(--font-medium); color: var(--color-text); }
479
+
480
+ .hub-row-badge {
481
+ font-size: var(--text-xs);
482
+ padding: 2px 8px;
483
+ border-radius: var(--radius-full);
484
+ border: 1px solid var(--color-border);
485
+ background: var(--color-bg-secondary);
486
+ color: var(--color-text-secondary);
487
+ display: inline-flex;
488
+ align-items: center;
489
+ gap: 4px;
490
+ }
491
+
492
+ .hub-row-tested {
493
+ border-color: var(--color-success-border);
494
+ background: var(--color-success-bg);
495
+ color: var(--color-success);
496
+ }
497
+
498
+ .hub-row-url {
499
+ font-size: var(--text-xs);
500
+ color: var(--color-text-tertiary);
501
+ font-family: var(--font-mono);
502
+ overflow: hidden;
503
+ text-overflow: ellipsis;
504
+ white-space: nowrap;
505
+ max-width: 200px;
506
+ }
507
+
508
+ .hub-row-actions { display: flex; gap: var(--space-1); flex-shrink: 0; }
509
+
510
+ .hub-action {
511
+ background: none;
512
+ border: 1px solid var(--color-border);
513
+ border-radius: var(--radius-md);
514
+ color: var(--color-text-secondary);
515
+ font-size: var(--text-xs);
516
+ font-weight: var(--font-medium);
517
+ padding: 4px 10px;
518
+ cursor: pointer;
519
+ transition: all 0.15s ease;
520
+ }
521
+
522
+ .hub-action:hover { background: var(--color-bg-secondary); border-color: var(--color-border-hover); color: var(--color-text); }
523
+ .hub-action--danger:hover { border-color: #fca5a5; background: #fef2f2; color: #dc2626; }
524
+
525
+ .hub-empty {
526
+ padding: var(--space-6) var(--space-4);
527
+ text-align: center;
528
+ background: var(--color-bg-secondary);
529
+ border: 1px dashed var(--color-border);
530
+ border-radius: var(--radius-lg);
531
+ margin-bottom: var(--space-4);
532
+ }
533
+
534
+ .hub-empty-headline { font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text); margin: 0 0 var(--space-2); }
535
+ .hub-empty-body { font-size: var(--text-sm); color: var(--color-text-secondary); margin: 0 0 var(--space-4); line-height: 1.5; }
536
+
537
+ /* ── Connection Details ────────────────────────────────────────────────── */
538
+ .connection-mode-card {
539
+ margin-bottom: var(--space-5);
540
+ padding: var(--space-4);
541
+ border: 1px solid var(--color-border);
542
+ border-radius: var(--radius-lg);
543
+ background: linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(248,249,251,0.96) 100%);
544
+ }
545
+
546
+ .connection-mode-card--local { border-color: rgba(64, 192, 87, 0.35); }
547
+ .connection-mode-card--cloud { border-color: rgba(51, 154, 240, 0.28); }
548
+
549
+ .connection-mode-header { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-2); }
550
+ .connection-mode-header h3 { font-size: var(--text-base); margin: 0; color: var(--color-text); }
551
+
552
+ .connection-mode-badge {
553
+ display: inline-flex;
554
+ align-items: center;
555
+ padding: 4px 10px;
556
+ border-radius: var(--radius-full);
557
+ font-size: var(--text-xs);
558
+ font-weight: var(--font-semibold);
559
+ background: var(--color-primary-subtle);
560
+ color: var(--color-text);
561
+ }
562
+
563
+ .connection-mode-card p { margin: 0 0 var(--space-3); font-size: var(--text-sm); color: var(--color-text-secondary); line-height: 1.5; }
564
+ .connection-mode-list { margin: 0; padding-left: 1.1rem; color: var(--color-text); display: grid; gap: var(--space-2); }
565
+ .connection-mode-list li { font-size: var(--text-sm); line-height: 1.45; }
566
+
567
+ /* Provider quick-picks (cloud) */
568
+ .provider-quick-picks { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-4); }
569
+
570
+ .provider-chip {
571
+ padding: 6px 14px;
572
+ font-size: var(--text-xs);
573
+ font-weight: var(--font-medium);
574
+ border: 1px solid var(--color-border);
575
+ border-radius: var(--radius-full);
576
+ background: var(--color-bg);
577
+ color: var(--color-text);
578
+ cursor: pointer;
579
+ transition: all var(--transition-fast);
580
+ }
581
+
582
+ .provider-chip:hover { border-color: var(--color-primary); color: var(--color-primary); }
583
+ .provider-chip.selected { border-color: var(--color-primary); background: var(--color-primary); color: #000; }
584
+
585
+ /* Local provider detection */
586
+ .provider-option {
587
+ display: flex;
588
+ align-items: center;
589
+ gap: var(--space-3);
590
+ width: 100%;
591
+ padding: var(--space-3) var(--space-4);
592
+ background: var(--color-bg);
593
+ border: 1px solid var(--color-border);
594
+ border-radius: var(--radius-md);
595
+ cursor: pointer;
596
+ font-size: var(--text-sm);
597
+ color: var(--color-text);
598
+ margin-bottom: var(--space-2);
599
+ transition: all var(--transition-fast);
600
+ }
601
+
602
+ .provider-option:hover { border-color: var(--color-primary); background: var(--color-bg-secondary); }
603
+ .provider-option.selected { border-color: var(--color-primary); background: rgba(80, 200, 120, 0.08); }
604
+
605
+ .provider-option-status { display: flex; align-items: center; }
606
+ .status-dot--ok { width: 8px; height: 8px; border-radius: 50%; background: var(--color-success); }
607
+ .provider-option-label { flex: 1; font-weight: var(--font-medium); }
608
+ .provider-option-hint { font-size: var(--text-xs); color: var(--color-text-tertiary); }
609
+
610
+ /* Ollama enable section */
611
+ .enable-ollama-section {
612
+ padding: var(--space-4);
613
+ background: var(--color-bg-secondary);
614
+ border: 1px dashed var(--color-border);
615
+ border-radius: var(--radius-md);
616
+ margin-bottom: var(--space-4);
617
+ }
618
+
619
+ .enable-ollama-info { margin-bottom: var(--space-3); }
620
+ .enable-ollama-title { font-size: var(--text-sm); font-weight: var(--font-medium); color: var(--color-text); margin: 0 0 var(--space-1); }
621
+ .enable-ollama-desc { font-size: var(--text-xs); color: var(--color-text-secondary); margin: 0; line-height: 1.4; }
622
+ .enable-ollama-btn { width: 100%; }
623
+ .ollama-progress { display: flex; align-items: center; gap: var(--space-2); font-size: var(--text-sm); color: var(--color-text-secondary); padding: var(--space-2) 0; }
624
+
625
+ .connection-success {
626
+ display: flex;
627
+ align-items: center;
628
+ gap: var(--space-2);
629
+ padding: var(--space-2) var(--space-3);
630
+ background: var(--color-success-bg);
631
+ border: 1px solid var(--color-success-border);
632
+ border-radius: var(--radius-md);
633
+ font-size: var(--text-sm);
634
+ color: var(--color-text);
635
+ margin-bottom: var(--space-2);
636
+ }
637
+
638
+ /* ── Model Card (Required Models) ──────────────────────────────────────── */
639
+ .model-card {
640
+ background: var(--color-bg-secondary);
641
+ border: 1px solid var(--color-border);
642
+ border-radius: var(--radius-lg);
643
+ padding: var(--space-4);
644
+ margin-bottom: var(--space-4);
645
+ }
646
+
647
+ .model-card-header { margin-bottom: var(--space-4); }
648
+ .model-card-title { display: block; font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text); margin-bottom: var(--space-1); }
649
+ .model-card-help { display: block; font-size: var(--text-xs); color: var(--color-text-secondary); line-height: 1.4; }
650
+
651
+ .add-connection-link {
652
+ display: block;
653
+ margin-bottom: var(--space-2);
654
+ background: none;
655
+ border: none;
656
+ color: var(--color-primary);
657
+ font-size: var(--text-sm);
658
+ cursor: pointer;
659
+ padding: var(--space-2) 0;
660
+ text-decoration: underline;
661
+ text-underline-offset: 2px;
662
+ }
663
+
664
+ /* ── Optional Add-ons ──────────────────────────────────────────────────── */
665
+ .addon-row {
666
+ border: 1px solid var(--color-border);
667
+ border-radius: var(--radius-md);
668
+ margin-bottom: var(--space-3);
669
+ overflow: hidden;
670
+ }
671
+
672
+ .addon-row--active { border-color: var(--color-primary); }
673
+
674
+ .addon-toggle-row {
675
+ display: flex;
676
+ align-items: flex-start;
677
+ gap: var(--space-3);
678
+ padding: var(--space-3) var(--space-4);
679
+ }
680
+
681
+ .addon-toggle-label {
682
+ display: flex;
683
+ align-items: center;
684
+ gap: var(--space-2);
685
+ cursor: pointer;
686
+ flex-shrink: 0;
687
+ }
688
+
689
+ .addon-label-text { font-size: var(--text-sm); font-weight: var(--font-medium); color: var(--color-text); }
690
+ .addon-help { font-size: var(--text-xs); color: var(--color-text-secondary); line-height: 1.4; padding-top: 2px; }
691
+
692
+ .addon-fields {
693
+ padding: var(--space-3) var(--space-4) var(--space-4);
694
+ border-top: 1px solid var(--color-border);
695
+ background: var(--color-bg-secondary);
696
+ }
697
+
698
+ /* Radio */
699
+ .radio-fieldset { border: none; padding: 0; margin: 0; }
700
+ .radio-legend { display: block; font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text); margin-bottom: var(--space-2); padding: 0; }
701
+ .radio-group { display: flex; flex-direction: column; gap: var(--space-2); }
702
+ .radio-label { display: flex; align-items: center; gap: var(--space-2); font-size: var(--text-sm); color: var(--color-text); cursor: pointer; }
703
+
704
+ /* ── Review Grid ───────────────────────────────────────────────────────── */
705
+ .review-grid {
706
+ display: flex;
707
+ flex-direction: column;
708
+ background: var(--color-bg-secondary);
709
+ border: 1px solid var(--color-border);
710
+ border-radius: var(--radius-lg);
711
+ overflow: hidden;
712
+ margin-bottom: var(--space-2);
713
+ }
714
+
715
+ .review-section-header {
716
+ display: flex;
717
+ justify-content: space-between;
718
+ align-items: center;
719
+ padding: 8px var(--space-4);
720
+ background: rgba(0, 0, 0, 0.04);
721
+ font-size: var(--text-xs);
722
+ font-weight: var(--font-semibold);
723
+ color: var(--color-text-secondary);
724
+ text-transform: uppercase;
725
+ letter-spacing: 0.5px;
726
+ border-bottom: 1px solid var(--color-border);
727
+ }
728
+
729
+ .review-edit-btn {
730
+ background: none;
731
+ border: none;
732
+ color: var(--color-primary);
733
+ font-size: var(--text-xs);
734
+ font-weight: var(--font-medium);
735
+ cursor: pointer;
736
+ padding: 2px 8px;
737
+ border-radius: var(--radius-md);
738
+ transition: all 0.15s ease;
739
+ text-transform: none;
740
+ letter-spacing: normal;
741
+ }
742
+
743
+ .review-edit-btn:hover { background: var(--color-primary-subtle); color: var(--color-primary-hover); }
744
+
745
+ .review-item {
746
+ display: flex;
747
+ justify-content: space-between;
748
+ align-items: baseline;
749
+ gap: var(--space-4);
750
+ padding: 10px var(--space-4);
751
+ border-bottom: 1px solid var(--color-border);
752
+ }
753
+
754
+ .review-item:last-child { border-bottom: none; }
755
+ .review-item:nth-child(even) { background: rgba(0, 0, 0, 0.03); }
756
+
757
+ .review-label {
758
+ font-size: var(--text-sm);
759
+ color: var(--color-text-secondary);
760
+ flex-shrink: 0;
761
+ min-width: 140px;
762
+ }
763
+
764
+ .review-label--muted { color: var(--color-text-tertiary); font-style: italic; }
765
+
766
+ .review-value {
767
+ font-size: var(--text-sm);
768
+ color: var(--color-text);
769
+ text-align: right;
770
+ word-break: break-all;
771
+ font-weight: var(--font-medium);
772
+ }
773
+
774
+ .review-value.mono { font-family: var(--font-mono); font-size: 0.8rem; }
775
+
776
+ .install-error { margin-top: var(--space-3); color: var(--color-danger); font-size: var(--text-sm); }
777
+
778
+ /* ── Deploy Screen ─────────────────────────────────────────────────────── */
779
+ .deploy-header { text-align: center; margin-bottom: var(--space-6); }
780
+
781
+ .deploy-progress-summary {
782
+ margin-bottom: var(--space-5);
783
+ padding: var(--space-4);
784
+ border: 1px solid var(--color-border);
785
+ border-radius: var(--radius-lg);
786
+ background: var(--color-bg-secondary);
787
+ }
788
+
789
+ .deploy-progress-meta {
790
+ display: flex;
791
+ justify-content: space-between;
792
+ align-items: center;
793
+ gap: var(--space-3);
794
+ margin-bottom: var(--space-3);
795
+ }
796
+
797
+ .deploy-progress-label { font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text); }
798
+ .deploy-progress-value { font-size: var(--text-sm); font-weight: var(--font-bold); color: var(--color-primary-hover); }
799
+ .deploy-progress-value--error { color: var(--color-danger); }
800
+
801
+ .deploy-progress-bar {
802
+ height: 10px;
803
+ border-radius: 999px;
804
+ overflow: hidden;
805
+ background: var(--color-bg);
806
+ border: 1px solid var(--color-border);
807
+ }
808
+
809
+ .deploy-progress-bar--error { background: #fef2f2; border-color: rgba(220, 38, 38, 0.24); }
810
+
811
+ .deploy-progress-fill {
812
+ height: 100%;
813
+ border-radius: inherit;
814
+ background: linear-gradient(90deg, #ffb020 0%, #2f9e44 100%);
815
+ transition: width 0.4s ease;
816
+ }
817
+
818
+ .deploy-progress-fill--error { background: linear-gradient(90deg, #f59e0b 0%, #dc2626 100%); }
819
+
820
+ .deploy-progress-note { margin: var(--space-3) 0 0; font-size: var(--text-xs); color: var(--color-text-secondary); line-height: 1.5; }
821
+
822
+ .deploy-services { display: flex; flex-direction: column; gap: var(--space-3); margin-bottom: var(--space-6); }
823
+
824
+ .deploy-service-row {
825
+ display: grid;
826
+ grid-template-columns: 28px 1fr 120px;
827
+ align-items: center;
828
+ gap: var(--space-3);
829
+ padding: var(--space-3) var(--space-4);
830
+ background: var(--color-bg);
831
+ border: 1px solid var(--color-border);
832
+ border-radius: var(--radius-md);
833
+ }
834
+
835
+ .deploy-service-indicator { display: flex; align-items: center; justify-content: center; }
836
+ .deploy-check,
837
+ .deploy-warning,
838
+ .deploy-spinner { display: flex; align-items: center; justify-content: center; }
839
+ .deploy-service-info { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
840
+ .deploy-service-name { font-size: var(--text-sm); font-weight: var(--font-medium); color: var(--color-text); }
841
+ .deploy-service-status { font-size: var(--text-xs); color: var(--color-text-tertiary); }
842
+
843
+ .deploy-service-bar { height: 6px; background: var(--color-bg-secondary); border-radius: 3px; overflow: hidden; }
844
+ .deploy-bar-fill { height: 100%; border-radius: 3px; transition: all 0.4s ease; }
845
+ .deploy-bar-fill.indeterminate { width: 40%; background: var(--color-primary); animation: indeterminate-bar 1.5s ease-in-out infinite; }
846
+ .deploy-bar-fill.ready { width: 72%; background: #ffb020; animation: none; }
847
+ .deploy-bar-fill.stopped { width: 72%; background: #d97706; animation: none; opacity: 0.9; }
848
+ .deploy-bar-fill.complete { width: 100%; background: var(--color-success); animation: none; }
849
+
850
+ @keyframes indeterminate-bar { 0% { transform: translateX(-100%); } 50% { transform: translateX(150%); } 100% { transform: translateX(-100%); } }
851
+ @media (prefers-reduced-motion: reduce) { .deploy-bar-fill.indeterminate { animation: none; width: 100%; opacity: 0.5; } }
852
+
853
+ .deploy-done { text-align: center; margin-top: var(--space-4); }
854
+
855
+ /* Deploy failure card */
856
+ .deploy-failure-card {
857
+ margin-bottom: var(--space-5);
858
+ padding: var(--space-4);
859
+ border-radius: var(--radius-lg);
860
+ border: 1px solid rgba(220, 38, 38, 0.18);
861
+ background: linear-gradient(180deg, rgba(254, 242, 242, 0.96) 0%, rgba(255, 251, 251, 0.99) 100%);
862
+ }
863
+
864
+ .deploy-failure-header { margin-bottom: var(--space-2); }
865
+ .deploy-failure-kicker { display: inline-block; margin-bottom: var(--space-1); font-size: var(--text-xs); font-weight: var(--font-semibold); text-transform: uppercase; letter-spacing: 0.06em; color: #b91c1c; }
866
+ .deploy-failure-header h3 { margin: 0; font-size: var(--text-lg); color: var(--color-text); }
867
+ .deploy-failure-summary { margin: 0 0 var(--space-3); font-size: var(--text-sm); color: var(--color-text-secondary); line-height: 1.55; }
868
+ .deploy-failure-list { margin: 0; padding-left: 1.1rem; display: grid; gap: var(--space-2); }
869
+ .deploy-failure-list li { font-size: var(--text-sm); color: var(--color-text); line-height: 1.5; }
870
+
871
+ /* Deploy tips */
872
+ .deploy-tips {
873
+ margin-top: var(--space-5);
874
+ padding: var(--space-4);
875
+ border-radius: var(--radius-lg);
876
+ border: 1px solid rgba(255, 176, 32, 0.28);
877
+ background: linear-gradient(180deg, rgba(255, 248, 235, 0.95) 0%, rgba(255, 253, 247, 0.95) 100%);
878
+ }
879
+
880
+ .deploy-tips-header { margin-bottom: var(--space-3); }
881
+ .deploy-tips-kicker { display: inline-block; font-size: var(--text-xs); font-weight: var(--font-semibold); text-transform: uppercase; letter-spacing: 0.06em; color: #a16207; margin-bottom: var(--space-1); }
882
+ .deploy-tips h3 { margin: 0; font-size: var(--text-base); color: var(--color-text); }
883
+ .deploy-tips ul { margin: 0; padding-left: 1.1rem; display: grid; gap: var(--space-2); }
884
+ .deploy-tips li { font-size: var(--text-sm); color: var(--color-text-secondary); line-height: 1.5; }
885
+
886
+ /* Deploy error details */
887
+ .deploy-error-details {
888
+ margin-top: var(--space-3);
889
+ padding: var(--space-3);
890
+ border: 1px solid var(--color-border);
891
+ border-radius: var(--radius-md);
892
+ background: var(--color-bg-secondary);
893
+ }
894
+
895
+ .deploy-error-details summary { cursor: pointer; font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text); }
896
+ .deploy-error-details pre { margin: var(--space-3) 0 0; white-space: pre-wrap; word-break: break-word; font-size: var(--text-xs); color: var(--color-text-secondary); line-height: 1.5; }
897
+
898
+ /* ── Spinner ───────────────────────────────────────────────────────────── */
899
+ .spinner {
900
+ display: inline-block;
901
+ width: 14px;
902
+ height: 14px;
903
+ border: 2px solid currentColor;
904
+ border-right-color: transparent;
905
+ border-radius: 50%;
906
+ animation: spin 0.6s linear infinite;
907
+ }
908
+
909
+ @keyframes spin { to { transform: rotate(360deg); } }
910
+ @media (prefers-reduced-motion: reduce) { .spinner { animation: none; } }
911
+
912
+ /* ── Loading State ─────────────────────────────────────────────────────── */
913
+ .loading-state { display: flex; justify-content: center; align-items: center; padding: var(--space-8); }
914
+
915
+ /* ── Done State ────────────────────────────────────────────────────────── */
916
+ .done-state { text-align: center; padding: var(--space-4) 0; }
917
+ .done-icon { display: inline-block; margin-bottom: var(--space-4); }
918
+ .done-state h2 { font-size: var(--text-2xl); font-weight: var(--font-bold); color: var(--color-text); margin-bottom: var(--space-2); }
919
+ .done-subtitle { font-size: var(--text-sm); color: var(--color-text-secondary); margin-bottom: var(--space-5); }
920
+
921
+ .service-list {
922
+ list-style: none;
923
+ display: flex;
924
+ flex-wrap: wrap;
925
+ gap: var(--space-2);
926
+ justify-content: center;
927
+ margin-bottom: var(--space-6);
928
+ }
929
+
930
+ .service-list li {
931
+ font-size: var(--text-xs);
932
+ font-family: var(--font-mono);
933
+ background: var(--color-success-bg);
934
+ color: var(--color-success);
935
+ border: 1px solid var(--color-success-border);
936
+ padding: 2px 10px;
937
+ border-radius: var(--radius-full);
938
+ }
939
+
940
+ /* ── Hidden utility ────────────────────────────────────────────────────── */
941
+ .hidden { display: none !important; }
942
+
943
+ /* ── Responsive ────────────────────────────────────────────────────────── */
944
+ @media (max-width: 480px) {
945
+ .wizard-card { padding: 0; }
946
+ .wizard-header { padding: var(--space-5) var(--space-5) var(--space-4); }
947
+ .wizard-body { padding: var(--space-4) var(--space-5) var(--space-5); }
948
+ .review-item { flex-direction: column; align-items: flex-start; }
949
+ .review-value { text-align: left; }
950
+ .deploy-service-row { grid-template-columns: 28px 1fr; }
951
+ .deploy-service-bar { display: none; }
952
+ }