@bakapiano/ccsm 0.14.0 → 0.15.1

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 (53) hide show
  1. package/CLAUDE.md +474 -475
  2. package/README.md +189 -190
  3. package/bin/ccsm.js +194 -194
  4. package/lib/cliActivity.js +118 -0
  5. package/lib/codexSeed.js +147 -0
  6. package/lib/config.js +205 -188
  7. package/lib/folders.js +105 -105
  8. package/lib/localCliSessions.js +489 -489
  9. package/lib/persistedSessions.js +144 -142
  10. package/lib/webTerminal.js +224 -224
  11. package/lib/workspace.js +230 -230
  12. package/package.json +57 -57
  13. package/public/css/base.css +99 -99
  14. package/public/css/cards.css +183 -183
  15. package/public/css/feedback.css +303 -303
  16. package/public/css/forms.css +405 -405
  17. package/public/css/layout.css +160 -160
  18. package/public/css/modal.css +190 -190
  19. package/public/css/responsive.css +10 -10
  20. package/public/css/sidebar.css +613 -608
  21. package/public/css/terminals.css +294 -294
  22. package/public/css/tokens.css +81 -81
  23. package/public/css/wco.css +98 -98
  24. package/public/css/widgets.css +1628 -1628
  25. package/public/index.html +111 -105
  26. package/public/js/api.js +296 -280
  27. package/public/js/components/AdoptModal.js +343 -343
  28. package/public/js/components/App.js +35 -35
  29. package/public/js/components/DirectoryPicker.js +203 -203
  30. package/public/js/components/EntityFormModal.js +141 -141
  31. package/public/js/components/Modal.js +51 -51
  32. package/public/js/components/OfflineBanner.js +93 -93
  33. package/public/js/components/PageTitleBar.js +13 -13
  34. package/public/js/components/Picker.js +179 -179
  35. package/public/js/components/Popover.js +55 -55
  36. package/public/js/components/Sidebar.js +299 -299
  37. package/public/js/components/TerminalView.js +314 -314
  38. package/public/js/components/useDragSort.js +67 -67
  39. package/public/js/dialog.js +67 -67
  40. package/public/js/icons.js +177 -177
  41. package/public/js/main.js +132 -132
  42. package/public/js/pages/AboutPage.js +173 -165
  43. package/public/js/pages/ConfigurePage.js +513 -475
  44. package/public/js/pages/LaunchPage.js +369 -369
  45. package/public/js/pages/SessionsPage.js +101 -97
  46. package/public/js/state.js +231 -231
  47. package/scripts/dev.js +44 -11
  48. package/scripts/install.js +158 -158
  49. package/scripts/restart-helper.js +96 -0
  50. package/scripts/upgrade-helper.js +6 -1
  51. package/server.js +1282 -1254
  52. package/lib/cliSessionWatcher.js +0 -275
  53. package/public/manifest.webmanifest +0 -15
@@ -1,1628 +1,1628 @@
1
- /* Workspace cards · clone-progress list · pagination · snapshot preview */
2
-
3
- .workspace-grid {
4
- display: grid;
5
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
6
- gap: var(--s-3);
7
- }
8
- .workspace-card {
9
- padding: var(--s-4);
10
- border: 1px solid var(--border-soft);
11
- background: var(--bg-elev);
12
- border-radius: 6px;
13
- transition: border-color .18s, box-shadow .18s, transform .18s;
14
- }
15
- .workspace-card:hover {
16
- border-color: var(--ink-faint);
17
- box-shadow: var(--shadow-md);
18
- transform: translateY(-1px);
19
- }
20
- .workspace-card.in-use {
21
- background: var(--bg);
22
- border-color: var(--ink-faint);
23
- box-shadow: inset 3px 0 0 var(--accent);
24
- }
25
- .workspace-card .ws-head {
26
- display: flex;
27
- align-items: baseline;
28
- justify-content: space-between;
29
- gap: var(--s-2);
30
- margin-bottom: 6px;
31
- }
32
- .workspace-card .ws-name {
33
- font-size: 14.5px;
34
- font-weight: 600;
35
- letter-spacing: -0.01em;
36
- color: var(--ink);
37
- line-height: 1.2;
38
- }
39
- .workspace-card .ws-tag {
40
- font-family: var(--mono);
41
- font-size: 10px;
42
- text-transform: uppercase;
43
- letter-spacing: 0.08em;
44
- padding: 2px 7px;
45
- border-radius: 4px;
46
- background: var(--bg);
47
- color: var(--ink-muted);
48
- border: 1px solid var(--border-soft);
49
- }
50
- .workspace-card.in-use .ws-tag {
51
- background: var(--bg-elev);
52
- color: var(--ink-mid);
53
- border-color: var(--ink-faint);
54
- }
55
- .workspace-card .ws-path {
56
- font-family: var(--mono);
57
- font-size: 11px;
58
- color: var(--ink-muted);
59
- word-break: break-all;
60
- margin-bottom: var(--s-3);
61
- }
62
- .workspace-card .ws-repos {
63
- display: flex;
64
- flex-wrap: wrap;
65
- gap: 4px;
66
- }
67
- .workspace-card .ws-repo {
68
- font-family: var(--mono);
69
- font-size: 10.5px;
70
- padding: 2px 7px;
71
- border-radius: 4px;
72
- background: var(--bg);
73
- color: var(--ink-muted);
74
- border: 1px solid var(--border-soft);
75
- }
76
- .workspace-card .ws-repo.cloned {
77
- color: var(--green);
78
- background: rgba(74, 138, 74, 0.06);
79
- border-color: rgba(74, 138, 74, 0.25);
80
- }
81
-
82
- /* Clone progress — one row per repo, NDJSON-driven by /api/sessions/new */
83
- .progress-list {
84
- display: flex;
85
- flex-direction: column;
86
- gap: var(--s-2);
87
- margin-top: var(--s-3);
88
- }
89
- .progress-list:empty { display: none; }
90
-
91
- .progress-item {
92
- border: 1px solid var(--border);
93
- background: var(--bg);
94
- border-radius: var(--r-sm);
95
- padding: var(--s-3) var(--s-4);
96
- }
97
- .progress-item .head {
98
- display: grid;
99
- grid-template-columns: 1fr auto auto;
100
- align-items: baseline;
101
- gap: var(--s-3);
102
- margin-bottom: var(--s-2);
103
- }
104
- .progress-item .name {
105
- font-family: var(--body);
106
- font-size: 12.5px;
107
- font-weight: 600;
108
- color: var(--ink);
109
- }
110
- .progress-item .phase {
111
- font-family: var(--mono);
112
- font-size: 10.5px;
113
- color: var(--ink-muted);
114
- letter-spacing: 0.04em;
115
- }
116
- .progress-item .pct {
117
- font-family: var(--mono);
118
- font-size: 11.5px;
119
- color: var(--ink-mid);
120
- font-variant-numeric: tabular-nums;
121
- }
122
- .progress-bar {
123
- height: 3px;
124
- background: var(--border);
125
- position: relative;
126
- overflow: hidden;
127
- border-radius: 2px;
128
- }
129
- .progress-bar .fill {
130
- height: 100%;
131
- width: 0;
132
- background: var(--ink);
133
- transition: width .2s ease;
134
- border-radius: 2px;
135
- }
136
- .progress-bar .fill.indeterminate {
137
- width: 35% !important;
138
- animation: indeterm 1.4s ease-in-out infinite;
139
- }
140
- @keyframes indeterm {
141
- from { transform: translateX(-110%); }
142
- to { transform: translateX(330%); }
143
- }
144
- .progress-item.ok .fill { background: var(--green); }
145
- .progress-item.error .fill { background: var(--red); }
146
- .progress-item .detail {
147
- margin-top: 4px;
148
- font-family: var(--mono);
149
- font-size: 10.5px;
150
- color: var(--ink-muted);
151
- min-height: 12px;
152
- }
153
-
154
- /* Pagination row — sits below table inside .card-body-flush card */
155
- .pagination {
156
- display: flex;
157
- align-items: center;
158
- gap: var(--s-3);
159
- padding: var(--s-3) var(--s-6);
160
- border-top: 1px solid var(--border-soft);
161
- background: var(--bg);
162
- font-size: 12.5px;
163
- color: var(--ink-mid);
164
- flex-wrap: wrap;
165
- }
166
- .pagination-info {
167
- flex: 1;
168
- text-align: center;
169
- font-family: var(--mono);
170
- font-size: 11.5px;
171
- color: var(--ink-muted);
172
- }
173
- .pagination-info strong {
174
- color: var(--ink);
175
- font-weight: 600;
176
- }
177
- .pagination select {
178
- font-size: 11.5px;
179
- padding: 4px 24px 4px 8px;
180
- }
181
-
182
- /* Snapshot raw-text preview (collapsible <details>) */
183
- .snapshot-detail { margin-top: var(--s-4); }
184
- .snapshot-detail summary {
185
- cursor: pointer;
186
- font-size: 12.5px;
187
- color: var(--ink-mid);
188
- padding: var(--s-2) 0;
189
- user-select: none;
190
- font-weight: 500;
191
- }
192
- .snapshot-detail summary::marker { color: var(--ink-mid); }
193
- .snapshot-detail summary:hover { color: var(--ink); }
194
- .preview {
195
- font-family: var(--mono);
196
- font-size: 11.5px;
197
- color: var(--ink-mid);
198
- background: var(--bg);
199
- border: 1px solid var(--border);
200
- border-radius: var(--r-sm);
201
- padding: var(--s-3);
202
- margin-top: var(--s-2);
203
- max-height: 280px;
204
- overflow: auto;
205
- white-space: pre;
206
- line-height: 1.55;
207
- }
208
-
209
- /* === Launch page hero · ChatGPT-style centered composer ============= */
210
-
211
- .launch-hero {
212
- max-width: 640px;
213
- width: 100%;
214
- margin: 0 auto;
215
- padding: var(--s-4);
216
- display: flex;
217
- flex-direction: column;
218
- align-items: center;
219
- justify-content: center;
220
- gap: var(--s-5);
221
- flex: 1;
222
- min-height: 0;
223
- }
224
-
225
- .launch-brand {
226
- display: inline-flex;
227
- align-items: center;
228
- justify-content: center;
229
- color: var(--accent);
230
- }
231
- .launch-brand-mark svg {
232
- width: 88px;
233
- height: 88px;
234
- display: block;
235
- }
236
-
237
- .launch-tagline {
238
- font-size: 26px;
239
- font-weight: 500;
240
- letter-spacing: -0.02em;
241
- color: var(--ink);
242
- text-align: center;
243
- margin: 0;
244
- line-height: 1.25;
245
- max-width: 32ch;
246
- }
247
- .launch-tagline em {
248
- font-style: normal;
249
- color: var(--accent);
250
- font-weight: 500;
251
- }
252
-
253
-
254
-
255
- .launch-status {
256
- font-family: var(--mono);
257
- font-size: 11.5px;
258
- color: var(--ink-muted);
259
- align-self: stretch;
260
- text-align: center;
261
- }
262
-
263
- .launch-import-link {
264
- display: inline-flex;
265
- align-items: center;
266
- background: transparent;
267
- border: none;
268
- font: inherit;
269
- font-size: 12px;
270
- color: var(--ink-faint);
271
- cursor: pointer;
272
- padding: 4px 8px;
273
- border-radius: 6px;
274
- transition: color 120ms ease;
275
- }
276
- .launch-import-link:hover { color: var(--ink-mid); }
277
- .launch-import-arrow {
278
- display: inline-flex;
279
- align-items: center;
280
- margin-left: 6px;
281
- transition: transform 180ms cubic-bezier(.4, 0, .2, 1);
282
- }
283
- .launch-import-link:hover .launch-import-arrow { transform: translateX(3px); }
284
-
285
- /* === Launch toolbar · A · Pill toolbar =========================== */
286
-
287
- .launch-toolbar {
288
- width: 100%;
289
- display: flex;
290
- align-items: center;
291
- justify-content: center;
292
- flex-wrap: wrap;
293
- gap: var(--s-2);
294
- }
295
-
296
- .pill {
297
- appearance: none;
298
- background: var(--bg);
299
- border: 1px solid var(--border-soft);
300
- border-radius: 999px;
301
- padding: 8px 14px 8px 12px;
302
- display: inline-flex;
303
- align-items: center;
304
- justify-content: center;
305
- gap: 8px;
306
- cursor: pointer;
307
- color: var(--ink);
308
- font: inherit;
309
- font-size: 13px;
310
- font-weight: 500;
311
- line-height: 1;
312
- white-space: nowrap;
313
- transition: background .12s ease, border-color .12s ease, color .12s ease;
314
- flex: 0 0 160px;
315
- width: 160px;
316
- min-width: 0;
317
- }
318
- .pill:hover {
319
- background: var(--sidebar-hover);
320
- border-color: var(--border);
321
- }
322
- .pill.is-open {
323
- background: var(--sidebar-active);
324
- border-color: var(--ink-faint);
325
- }
326
- .pill.is-set {
327
- border-color: var(--ink-faint);
328
- background: var(--sidebar-active);
329
- }
330
- .pill.is-disabled,
331
- .pill:disabled {
332
- opacity: 0.45;
333
- cursor: not-allowed;
334
- }
335
- .pill.is-disabled:hover,
336
- .pill:disabled:hover { background: var(--bg-elev); border-color: var(--border); }
337
-
338
- /* --- Workdir picker (Launch page) ----------------------------------- */
339
- .workdir-modal {
340
- display: flex;
341
- flex-direction: column;
342
- gap: 14px;
343
- padding: 18px 20px;
344
- }
345
- .workdir-mode-grid {
346
- display: grid;
347
- grid-template-columns: 1fr 1fr;
348
- gap: 10px;
349
- }
350
- .workdir-mode-opt {
351
- appearance: none;
352
- background: var(--bg-elev);
353
- border: 1px solid var(--border);
354
- border-radius: 10px;
355
- padding: 14px 14px 12px;
356
- cursor: pointer;
357
- display: grid;
358
- grid-template-columns: 32px 1fr;
359
- grid-template-rows: auto auto;
360
- column-gap: 10px;
361
- row-gap: 2px;
362
- text-align: left;
363
- align-items: center;
364
- font: inherit;
365
- color: var(--ink);
366
- transition: border-color .12s ease, background .12s ease, box-shadow .12s ease;
367
- }
368
- .workdir-mode-opt:hover {
369
- border-color: var(--ink-faint);
370
- }
371
- .workdir-mode-opt.is-active {
372
- border-color: var(--ink);
373
- background: var(--bg-elev);
374
- box-shadow: 0 0 0 1px var(--ink) inset;
375
- }
376
- .workdir-mode-icon {
377
- grid-row: 1 / span 2;
378
- width: 32px;
379
- height: 32px;
380
- display: inline-flex;
381
- align-items: center;
382
- justify-content: center;
383
- border-radius: 8px;
384
- background: var(--bg);
385
- color: var(--ink-mid);
386
- }
387
- .workdir-mode-opt.is-active .workdir-mode-icon {
388
- background: var(--ink);
389
- color: var(--bg-elev);
390
- }
391
- .workdir-mode-icon svg,
392
- .workdir-mode-icon img { width: 18px; height: 18px; display: block; }
393
- .workdir-mode-name {
394
- font-size: 13px;
395
- font-weight: 600;
396
- letter-spacing: -0.005em;
397
- }
398
- .workdir-mode-sub {
399
- font-size: 11.5px;
400
- color: var(--ink-muted);
401
- line-height: 1.35;
402
- }
403
- .workdir-mode-opt.is-active .workdir-mode-sub { color: var(--ink-mid); }
404
-
405
- .workdir-detail {
406
- border: 1px solid var(--border);
407
- border-radius: 10px;
408
- background: var(--bg);
409
- overflow: hidden;
410
- }
411
- .workdir-detail .picker { max-height: min(56vh, 420px); }
412
- .workdir-detail .filex {
413
- padding: 10px;
414
- gap: 10px;
415
- }
416
- .workdir-detail .filex-body { height: 320px; }
417
-
418
- .workdir-foot {
419
- display: flex;
420
- justify-content: flex-end;
421
- gap: 8px;
422
- margin: 4px -20px -18px;
423
- padding: 12px 20px;
424
- border-top: 1px solid var(--border-soft);
425
- background: var(--bg);
426
- }
427
-
428
- .icon-radio-sub {
429
- font-size: 11px;
430
- font-weight: 400;
431
- color: var(--ink-muted);
432
- margin-top: 1px;
433
- }
434
- .icon-radio-opt.is-active .icon-radio-sub { color: var(--accent-deep); opacity: 0.85; }
435
-
436
- /* --- File-Explorer-style directory picker --------------------------- */
437
- .filex {
438
- display: flex;
439
- flex-direction: column;
440
- gap: 8px;
441
- font-size: 12.5px;
442
- }
443
- .filex-loading, .filex-empty {
444
- padding: 24px;
445
- text-align: center;
446
- font-size: 12px;
447
- color: var(--ink-muted);
448
- font-style: italic;
449
- }
450
-
451
- /* toolbar: back/fwd/up + breadcrumb */
452
- .filex-toolbar {
453
- display: flex;
454
- align-items: center;
455
- gap: 6px;
456
- padding: 4px;
457
- border: 1px solid var(--border);
458
- border-radius: 8px;
459
- background: var(--bg-elev);
460
- }
461
- .filex-navbtns {
462
- display: flex;
463
- gap: 2px;
464
- flex-shrink: 0;
465
- }
466
- .filex-navbtn {
467
- appearance: none;
468
- background: transparent;
469
- border: 0;
470
- width: 28px;
471
- height: 28px;
472
- border-radius: 6px;
473
- display: inline-flex;
474
- align-items: center;
475
- justify-content: center;
476
- color: var(--ink-mid);
477
- cursor: pointer;
478
- transition: background .12s ease, color .12s ease;
479
- }
480
- .filex-navbtn:hover:not(:disabled) {
481
- background: var(--sidebar-hover);
482
- color: var(--ink);
483
- }
484
- .filex-navbtn:disabled {
485
- opacity: 0.35;
486
- cursor: not-allowed;
487
- }
488
- .filex-navbtn svg { width: 14px; height: 14px; }
489
-
490
- .filex-breadcrumb {
491
- flex: 1;
492
- min-width: 0;
493
- display: flex;
494
- align-items: center;
495
- gap: 1px;
496
- flex-wrap: nowrap;
497
- overflow: hidden;
498
- padding: 0 6px;
499
- cursor: text;
500
- min-height: 28px;
501
- }
502
- .filex-crumb {
503
- appearance: none;
504
- background: transparent;
505
- border: 0;
506
- font: inherit;
507
- font-size: 12.5px;
508
- color: var(--ink);
509
- padding: 4px 8px;
510
- border-radius: 4px;
511
- cursor: pointer;
512
- white-space: nowrap;
513
- transition: background .1s ease;
514
- }
515
- .filex-crumb:hover { background: var(--bg); }
516
- .filex-crumb-sep {
517
- color: var(--ink-faint);
518
- font-size: 13px;
519
- user-select: none;
520
- flex-shrink: 0;
521
- }
522
- .filex-address-edit-btn {
523
- appearance: none;
524
- background: transparent;
525
- border: 0;
526
- width: 26px;
527
- height: 26px;
528
- border-radius: 4px;
529
- display: inline-flex;
530
- align-items: center;
531
- justify-content: center;
532
- color: var(--ink-faint);
533
- cursor: pointer;
534
- margin-left: auto;
535
- flex-shrink: 0;
536
- opacity: 0;
537
- transition: opacity .12s ease, background .12s ease, color .12s ease;
538
- }
539
- .filex-toolbar:hover .filex-address-edit-btn { opacity: 0.7; }
540
- .filex-address-edit-btn:hover {
541
- background: var(--sidebar-hover);
542
- color: var(--ink);
543
- opacity: 1;
544
- }
545
- .filex-address-edit-btn svg { width: 12px; height: 12px; }
546
- .filex-address-edit {
547
- flex: 1;
548
- display: flex;
549
- padding: 0 4px;
550
- }
551
- .filex-address-input {
552
- width: 100%;
553
- appearance: none;
554
- background: var(--bg);
555
- border: 1px solid var(--accent);
556
- border-radius: 5px;
557
- padding: 5px 8px;
558
- font-size: 12.5px;
559
- color: var(--ink);
560
- outline: none;
561
- }
562
-
563
- /* body: sidebar (quick access) + main file list */
564
- .filex-body {
565
- display: grid;
566
- grid-template-columns: 150px 1fr;
567
- gap: 8px;
568
- height: 360px;
569
- border: 1px solid var(--border);
570
- border-radius: 8px;
571
- background: var(--bg-elev);
572
- overflow: hidden;
573
- }
574
- .filex-side {
575
- border-right: 1px solid var(--border);
576
- background: var(--bg);
577
- overflow-y: auto;
578
- padding: 6px 4px;
579
- display: flex;
580
- flex-direction: column;
581
- gap: 1px;
582
- }
583
- .filex-side-label {
584
- font-size: 10px;
585
- font-weight: 600;
586
- text-transform: uppercase;
587
- letter-spacing: 0.08em;
588
- color: var(--ink-faint);
589
- padding: 4px 8px;
590
- }
591
- .filex-side-item {
592
- appearance: none;
593
- background: transparent;
594
- border: 0;
595
- text-align: left;
596
- font: inherit;
597
- font-size: 12px;
598
- color: var(--ink-mid);
599
- cursor: pointer;
600
- padding: 5px 8px;
601
- border-radius: 4px;
602
- display: flex;
603
- align-items: center;
604
- gap: 6px;
605
- width: 100%;
606
- overflow: hidden;
607
- text-overflow: ellipsis;
608
- white-space: nowrap;
609
- }
610
- .filex-side-item:hover { background: var(--sidebar-hover); color: var(--ink); }
611
- .filex-side-item.is-active {
612
- background: var(--sidebar-active);
613
- color: var(--ink);
614
- font-weight: 500;
615
- }
616
- .filex-side-icon {
617
- display: inline-flex;
618
- width: 14px;
619
- height: 14px;
620
- align-items: center;
621
- justify-content: center;
622
- color: var(--ink-faint);
623
- }
624
- .filex-side-icon svg { width: 13px; height: 13px; }
625
- .filex-side-name {
626
- flex: 1;
627
- min-width: 0;
628
- overflow: hidden;
629
- text-overflow: ellipsis;
630
- }
631
-
632
- .filex-main { overflow-y: auto; }
633
- .filex-list { padding: 4px; }
634
- .filex-row {
635
- appearance: none;
636
- display: flex;
637
- align-items: center;
638
- gap: 10px;
639
- width: 100%;
640
- padding: 8px 10px;
641
- background: transparent;
642
- border: 0;
643
- border-radius: 5px;
644
- text-align: left;
645
- font: inherit;
646
- font-size: 12.5px;
647
- color: var(--ink);
648
- cursor: pointer;
649
- transition: background .08s ease;
650
- }
651
- .filex-row:hover { background: var(--bg); }
652
- .filex-row[data-active="true"] {
653
- background: var(--accent-soft);
654
- color: var(--accent-deep);
655
- }
656
- .filex-row[data-active="true"] .filex-row-icon { color: var(--accent); }
657
- .filex-row-icon {
658
- display: inline-flex;
659
- width: 18px;
660
- height: 18px;
661
- align-items: center;
662
- justify-content: center;
663
- color: var(--ink-muted);
664
- flex-shrink: 0;
665
- }
666
- .filex-row-icon svg { width: 16px; height: 16px; }
667
- .filex-row-name {
668
- flex: 1;
669
- min-width: 0;
670
- overflow: hidden;
671
- text-overflow: ellipsis;
672
- white-space: nowrap;
673
- }
674
-
675
- .filex-foot {
676
- display: flex;
677
- align-items: center;
678
- gap: 8px;
679
- padding-top: 6px;
680
- border-top: 1px solid var(--border);
681
- }
682
- .filex-foot-current {
683
- flex: 1;
684
- min-width: 0;
685
- font-size: 11px;
686
- color: var(--ink-muted);
687
- overflow: hidden;
688
- text-overflow: ellipsis;
689
- white-space: nowrap;
690
- }
691
- .filex-foot-actions {
692
- display: flex;
693
- gap: 6px;
694
- flex-shrink: 0;
695
- }
696
- .pill-icon {
697
- display: inline-flex;
698
- align-items: center;
699
- color: var(--ink-muted);
700
- flex: 0 0 auto;
701
- }
702
- .pill-icon svg { width: 14px; height: 14px; }
703
- .pill-label {
704
- flex: 0 1 auto;
705
- min-width: 0;
706
- overflow: hidden;
707
- text-overflow: ellipsis;
708
- }
709
- .pill-chev {
710
- display: inline-flex;
711
- color: var(--ink-faint);
712
- margin-left: 2px;
713
- flex: 0 0 auto;
714
- transition: transform .15s ease;
715
- }
716
- .pill-chev svg { width: 12px; height: 12px; }
717
- .pill.is-open .pill-chev { transform: rotate(180deg); }
718
-
719
- .action.launch-cta {
720
- align-self: center;
721
- border-radius: 6px;
722
- padding: 7px 22px;
723
- font-size: 13px;
724
- font-weight: 500;
725
- letter-spacing: -0.005em;
726
- display: inline-flex;
727
- align-items: center;
728
- justify-content: center;
729
- gap: 6px;
730
- min-width: 0;
731
- margin-top: var(--s-1);
732
- background: var(--accent);
733
- border-color: var(--accent);
734
- color: #fff;
735
- }
736
- .action.launch-cta:hover:not(:disabled) {
737
- background: var(--accent-deep);
738
- border-color: var(--accent-deep);
739
- box-shadow: 0 4px 12px -4px var(--accent-soft);
740
- }
741
-
742
- /* === Settings page scroll container ================================
743
- .tab-panel is flex:1 inside .content which clips overflow. Without a
744
- scroll layer Settings cards beyond the viewport bottom get cut off. */
745
- .settings-scroll {
746
- flex: 1;
747
- min-height: 0;
748
- overflow-y: auto;
749
- display: flex;
750
- flex-direction: column;
751
- gap: var(--s-4);
752
- padding: 4px var(--s-2) var(--s-4) 4px;
753
- margin: -4px calc(-1 * var(--s-2)) 0 -4px;
754
- }
755
- /* In a flex column container, items default to flex-shrink:1 which
756
- causes the cards to compress instead of pushing the scroll container
757
- to actually scroll. flex:0 0 auto pins them to their natural height. */
758
- .settings-scroll > .card { flex: 0 0 auto; }
759
- .settings-scroll > .settings-section { flex: 0 0 auto; }
760
-
761
- /* === Settings section · A · flat, no card ========================== */
762
- .settings-section {
763
- display: flex;
764
- flex-direction: column;
765
- gap: var(--s-3);
766
- padding-bottom: var(--s-5);
767
- border-bottom: 1px solid var(--border-soft);
768
- }
769
- .settings-section:last-child { border-bottom: 0; }
770
- .settings-section-head {
771
- display: flex;
772
- flex-direction: column;
773
- gap: 2px;
774
- }
775
- .settings-section-title {
776
- font-size: 15px;
777
- font-weight: 600;
778
- letter-spacing: -0.012em;
779
- color: var(--ink);
780
- line-height: 1.2;
781
- margin: 0;
782
- }
783
- .settings-section-meta {
784
- font-size: 12.5px;
785
- color: var(--ink-muted);
786
- margin: 0;
787
- }
788
- .settings-section-body { display: flex; flex-direction: column; gap: var(--s-2); }
789
-
790
- /* === Settings entity list (CLIs / Repos / Folders) ================== */
791
- .entity-list {
792
- display: flex;
793
- flex-direction: column;
794
- gap: 2px;
795
- }
796
- .entity-row {
797
- display: flex;
798
- align-items: center;
799
- gap: var(--s-3);
800
- padding: 8px 8px 8px 4px;
801
- border-radius: 6px;
802
- transition: background .1s ease;
803
- }
804
- .entity-row.is-draggable { cursor: grab; }
805
- .entity-row.is-draggable:active { cursor: grabbing; }
806
- .entity-row[data-dnd-over="true"] {
807
- box-shadow: 0 -2px 0 var(--accent) inset;
808
- }
809
- .entity-row-grip {
810
- display: inline-flex;
811
- align-items: center;
812
- justify-content: center;
813
- width: 14px;
814
- color: var(--ink-faint);
815
- font-size: 12px;
816
- letter-spacing: -1px;
817
- user-select: none;
818
- pointer-events: none;
819
- flex: 0 0 14px;
820
- }
821
- .entity-row:hover { background: var(--bg); }
822
- .entity-row-icon {
823
- display: inline-flex;
824
- align-items: center;
825
- justify-content: center;
826
- width: 20px;
827
- height: 20px;
828
- color: var(--ink-muted);
829
- flex: 0 0 20px;
830
- }
831
- .entity-row-icon svg { width: 16px; height: 16px; }
832
- .entity-row-main {
833
- flex: 0 1 auto;
834
- min-width: 0;
835
- display: flex;
836
- flex-direction: column;
837
- gap: 1px;
838
- }
839
- .entity-row-primary {
840
- font-size: 13px;
841
- font-weight: 500;
842
- color: var(--ink);
843
- display: inline-flex;
844
- align-items: center;
845
- gap: 6px;
846
- }
847
- .entity-row-badge {
848
- font-family: var(--mono);
849
- font-size: 10px;
850
- letter-spacing: 0.06em;
851
- text-transform: uppercase;
852
- padding: 1px 6px;
853
- border-radius: 4px;
854
- font-weight: 500;
855
- }
856
- .entity-row-badge.tone-accent {
857
- background: var(--accent-soft);
858
- color: var(--accent-deep);
859
- }
860
- .entity-row-badge.tone-ok {
861
- background: rgba(74, 138, 74, 0.12);
862
- color: var(--green);
863
- }
864
- .entity-row-badge.tone-warn {
865
- background: rgba(196, 137, 43, 0.14);
866
- color: var(--yellow);
867
- }
868
- .entity-row-secondary {
869
- font-size: 11.5px;
870
- color: var(--ink-muted);
871
- overflow: hidden;
872
- text-overflow: ellipsis;
873
- white-space: nowrap;
874
- }
875
- .entity-row-actions {
876
- display: flex;
877
- align-items: center;
878
- gap: 2px;
879
- flex-shrink: 0;
880
- opacity: 0;
881
- transition: opacity .12s ease;
882
- margin-right: auto; /* pin actions next to the name, let trailing space stay empty */
883
- }
884
- .entity-row:hover .entity-row-actions,
885
- .entity-row:focus-within .entity-row-actions {
886
- opacity: 1;
887
- }
888
- .entity-row-action {
889
- appearance: none;
890
- background: transparent;
891
- border: 0;
892
- display: inline-flex;
893
- align-items: center;
894
- justify-content: center;
895
- width: 30px;
896
- height: 30px;
897
- border-radius: 6px;
898
- cursor: pointer;
899
- color: var(--ink-mid);
900
- font: inherit;
901
- font-size: 16px;
902
- transition: background .12s ease, color .12s ease;
903
- }
904
- .entity-row-action:hover { background: var(--sidebar-hover); color: var(--ink); }
905
- .entity-row-action.danger:hover { color: var(--red); }
906
- .entity-row-action svg { width: 16px; height: 16px; }
907
-
908
- .entity-empty {
909
- padding: 14px 10px;
910
- font-size: 12.5px;
911
- color: var(--ink-muted);
912
- font-style: italic;
913
- }
914
-
915
- .entity-add {
916
- appearance: none;
917
- background: var(--accent);
918
- border: 0;
919
- display: inline-flex;
920
- align-self: flex-start;
921
- align-items: center;
922
- gap: 6px;
923
- padding: 6px 12px;
924
- margin-top: 4px;
925
- border-radius: 6px;
926
- cursor: pointer;
927
- color: #fff;
928
- font: inherit;
929
- font-size: 12.5px;
930
- font-weight: 500;
931
- transition: background .12s ease, box-shadow .12s ease;
932
- }
933
- .entity-add:hover {
934
- background: var(--accent-deep);
935
- box-shadow: 0 2px 6px -2px var(--accent-soft);
936
- }
937
- .entity-add svg { width: 13px; height: 13px; }
938
-
939
- /* === EntityFormModal · shared form layout ========================== */
940
- .entity-form {
941
- padding: var(--s-4);
942
- display: flex;
943
- flex-direction: column;
944
- gap: var(--s-3);
945
- }
946
- .entity-field {
947
- display: flex;
948
- flex-direction: column;
949
- gap: 4px;
950
- }
951
- .entity-field-label {
952
- font-size: 11.5px;
953
- color: var(--ink-muted);
954
- font-weight: 500;
955
- }
956
- .entity-field .input {
957
- padding: 8px 10px;
958
- font-size: 13px;
959
- max-width: none;
960
- }
961
- .entity-field .input[readonly],
962
- .entity-field .input:disabled {
963
- background: var(--bg);
964
- color: var(--ink-muted);
965
- cursor: not-allowed;
966
- }
967
- .entity-field-hint {
968
- font-size: 11px;
969
- color: var(--ink-muted);
970
- }
971
- .entity-checkbox-row {
972
- display: inline-flex;
973
- align-items: center;
974
- gap: 8px;
975
- padding: 4px 0;
976
- }
977
- .entity-form-actions {
978
- display: flex;
979
- justify-content: flex-end;
980
- gap: 6px;
981
- margin-top: 4px;
982
- }
983
- .entity-test-button { margin-right: auto; }
984
-
985
- .entity-test-result {
986
- margin-top: 4px;
987
- padding: 8px 10px;
988
- border-radius: 6px;
989
- border: 1px solid var(--border);
990
- background: var(--bg);
991
- display: flex;
992
- flex-direction: column;
993
- gap: 6px;
994
- font-size: 12.5px;
995
- }
996
- .entity-test-result.is-ok { border-color: rgba(74, 138, 74, 0.4); background: rgba(74, 138, 74, 0.06); }
997
- .entity-test-result.is-fail { border-color: rgba(183, 63, 63, 0.4); background: rgba(183, 63, 63, 0.06); }
998
- .entity-test-summary {
999
- font-family: var(--body);
1000
- font-weight: 500;
1001
- color: var(--ink);
1002
- }
1003
- .entity-test-result.is-fail .entity-test-summary { color: var(--red); }
1004
- .entity-test-out {
1005
- margin: 0;
1006
- font-family: var(--mono);
1007
- font-size: 11.5px;
1008
- color: var(--ink-mid);
1009
- white-space: pre-wrap;
1010
- word-break: break-word;
1011
- max-height: 120px;
1012
- overflow-y: auto;
1013
- }
1014
- .entity-test-out.is-stderr { color: var(--ink-muted); border-top: 1px dashed var(--border); padding-top: 4px; }
1015
-
1016
- .icon-radio {
1017
- display: grid;
1018
- grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
1019
- gap: 6px;
1020
- }
1021
- .icon-radio.is-disabled { opacity: 0.6; pointer-events: none; }
1022
- .icon-radio-opt {
1023
- appearance: none;
1024
- background: var(--bg-elev);
1025
- border: 1px solid var(--border);
1026
- border-radius: 6px;
1027
- padding: 10px 8px 8px;
1028
- cursor: pointer;
1029
- display: flex;
1030
- flex-direction: column;
1031
- align-items: center;
1032
- gap: 6px;
1033
- color: var(--ink-mid);
1034
- font: inherit;
1035
- font-size: 12px;
1036
- font-weight: 500;
1037
- transition: border-color .12s ease, background .12s ease, color .12s ease;
1038
- }
1039
- .icon-radio-opt:hover { border-color: var(--ink-faint); color: var(--ink); }
1040
- .icon-radio-opt.is-active {
1041
- background: var(--accent-soft);
1042
- border-color: var(--accent);
1043
- color: var(--accent-deep);
1044
- }
1045
- .icon-radio-opt:disabled { cursor: not-allowed; }
1046
- .icon-radio-icon {
1047
- display: inline-flex;
1048
- align-items: center;
1049
- justify-content: center;
1050
- width: 24px;
1051
- height: 24px;
1052
- }
1053
- .icon-radio-icon svg,
1054
- .icon-radio-icon img { width: 24px; height: 24px; display: block; }
1055
- .launch-cta-plane {
1056
- display: inline-flex;
1057
- align-items: center;
1058
- justify-content: center;
1059
- width: 16px;
1060
- height: 16px;
1061
- /* Resting state: tilted slightly clockwise, like a paper plane caught
1062
- mid-glide. */
1063
- transform: translate(0, 0) rotate(8deg);
1064
- transform-origin: 60% 50%;
1065
- transition: transform .35s cubic-bezier(.4, 0, .2, 1),
1066
- opacity .25s ease;
1067
- will-change: transform, opacity;
1068
- }
1069
- .launch-cta-plane svg { width: 100%; height: 100%; }
1070
- .launch-cta:hover:not(:disabled) .launch-cta-plane {
1071
- /* Small lift + glide forward — no big arc, no fade-out. */
1072
- transform: translate(4px, -3px) rotate(14deg);
1073
- }
1074
-
1075
- /* Narrow viewport — toolbar wraps. Push the Launch button onto its own
1076
- row so the pills stay readable. */
1077
- @media (max-width: 720px) {
1078
- .launch-toolbar {
1079
- flex-direction: column;
1080
- align-items: center;
1081
- }
1082
- .pill { justify-content: center; flex: 0 0 auto; }
1083
- }
1084
-
1085
- /* === Popover + Picker ============================================== */
1086
- .popover-panel {
1087
- position: fixed;
1088
- z-index: 80;
1089
- background: var(--bg-elev);
1090
- border: 1px solid var(--border);
1091
- border-radius: 10px;
1092
- box-shadow: var(--shadow-lg);
1093
- overflow: hidden;
1094
- animation: popover-in .14s ease-out;
1095
- }
1096
- @keyframes popover-in {
1097
- from { opacity: 0; transform: translateY(-4px); }
1098
- to { opacity: 1; transform: translateY(0); }
1099
- }
1100
-
1101
- .picker {
1102
- display: flex;
1103
- flex-direction: column;
1104
- max-height: min(60vh, 460px);
1105
- }
1106
- .picker-title {
1107
- padding: 10px 14px 6px;
1108
- font-size: 11px;
1109
- color: var(--ink-muted);
1110
- font-weight: 500;
1111
- letter-spacing: 0;
1112
- border-bottom: 1px solid var(--border-soft);
1113
- }
1114
- .picker-search {
1115
- display: flex;
1116
- align-items: center;
1117
- gap: 8px;
1118
- padding: 8px 12px;
1119
- border-bottom: 1px solid var(--border-soft);
1120
- }
1121
- .picker-search-icon {
1122
- display: inline-flex;
1123
- align-items: center;
1124
- color: var(--ink-faint);
1125
- }
1126
- .picker-search-icon svg { width: 14px; height: 14px; }
1127
- .picker-search-input {
1128
- flex: 1;
1129
- appearance: none;
1130
- background: transparent;
1131
- border: 0;
1132
- outline: none;
1133
- padding: 4px 0;
1134
- font: inherit;
1135
- font-size: 13px;
1136
- color: var(--ink);
1137
- }
1138
- .picker-search-input::placeholder { color: var(--ink-faint); }
1139
- .picker-search-clear {
1140
- appearance: none;
1141
- background: transparent;
1142
- border: 0;
1143
- padding: 2px;
1144
- cursor: pointer;
1145
- color: var(--ink-muted);
1146
- display: inline-flex;
1147
- align-items: center;
1148
- border-radius: 4px;
1149
- }
1150
- .picker-search-clear:hover { background: var(--sidebar-hover); color: var(--ink); }
1151
- .picker-search-clear svg { width: 12px; height: 12px; }
1152
-
1153
- .picker-list {
1154
- overflow-y: auto;
1155
- padding: 4px;
1156
- flex: 1 1 auto;
1157
- min-height: 0;
1158
- }
1159
- .picker-empty {
1160
- padding: 18px 14px;
1161
- font-size: 12.5px;
1162
- color: var(--ink-muted);
1163
- text-align: center;
1164
- line-height: 1.5;
1165
- }
1166
- .picker-item {
1167
- appearance: none;
1168
- background: transparent;
1169
- border: 0;
1170
- width: 100%;
1171
- text-align: left;
1172
- display: flex;
1173
- align-items: center;
1174
- gap: 10px;
1175
- padding: 7px 10px;
1176
- border-radius: 6px;
1177
- cursor: pointer;
1178
- color: var(--ink);
1179
- font: inherit;
1180
- font-size: 13px;
1181
- transition: background .1s ease;
1182
- }
1183
- .picker-item-wrap {
1184
- position: relative;
1185
- display: flex;
1186
- align-items: center;
1187
- }
1188
- .picker-item-wrap.is-draggable { cursor: grab; }
1189
- .picker-item-wrap.is-draggable:active { cursor: grabbing; }
1190
- .picker-item-wrap[data-dnd-over="true"] {
1191
- box-shadow: 0 -2px 0 var(--accent) inset;
1192
- }
1193
- .picker-item-grip {
1194
- display: inline-flex;
1195
- align-items: center;
1196
- justify-content: center;
1197
- width: 14px;
1198
- margin-left: 2px;
1199
- color: var(--ink-faint);
1200
- font-size: 11px;
1201
- letter-spacing: -1px;
1202
- user-select: none;
1203
- pointer-events: none;
1204
- flex: 0 0 14px;
1205
- }
1206
- .picker-item:hover { background: var(--sidebar-hover); }
1207
- .picker-item.is-selected {
1208
- background: var(--sidebar-active);
1209
- font-weight: 500;
1210
- }
1211
- .picker-item:disabled {
1212
- opacity: 0.45;
1213
- cursor: not-allowed;
1214
- }
1215
- .picker-item-icon {
1216
- display: inline-flex;
1217
- align-items: center;
1218
- justify-content: center;
1219
- width: 18px;
1220
- height: 18px;
1221
- flex: 0 0 18px;
1222
- color: var(--ink-muted);
1223
- }
1224
- .picker-item-icon svg,
1225
- .picker-item-icon img { width: 18px; height: 18px; display: block; }
1226
- .picker-item-label {
1227
- flex: 0 0 auto;
1228
- white-space: nowrap;
1229
- }
1230
- .picker-item-meta {
1231
- flex: 1 1 auto;
1232
- min-width: 0;
1233
- font-family: var(--mono);
1234
- font-size: 11px;
1235
- color: var(--ink-muted);
1236
- overflow: hidden;
1237
- text-overflow: ellipsis;
1238
- white-space: nowrap;
1239
- }
1240
- .picker-item-check {
1241
- margin-left: auto;
1242
- font-size: 12px;
1243
- color: var(--accent);
1244
- flex: 0 0 auto;
1245
- }
1246
-
1247
- .picker-create {
1248
- border-top: 1px solid var(--border-soft);
1249
- padding: 6px;
1250
- }
1251
- .picker-create-toggle {
1252
- appearance: none;
1253
- background: transparent;
1254
- border: 0;
1255
- width: 100%;
1256
- display: flex;
1257
- align-items: center;
1258
- gap: 8px;
1259
- padding: 8px 10px;
1260
- border-radius: 6px;
1261
- cursor: pointer;
1262
- color: var(--ink-mid);
1263
- font: inherit;
1264
- font-size: 12.5px;
1265
- font-weight: 500;
1266
- transition: background .1s ease, color .1s ease;
1267
- }
1268
- .picker-create-toggle:hover {
1269
- background: var(--sidebar-hover);
1270
- color: var(--ink);
1271
- }
1272
- .picker-create-toggle svg { width: 14px; height: 14px; }
1273
-
1274
- .picker-create-form {
1275
- padding: 10px;
1276
- display: flex;
1277
- flex-direction: column;
1278
- gap: 8px;
1279
- }
1280
- .picker-field {
1281
- display: flex;
1282
- flex-direction: column;
1283
- gap: 4px;
1284
- }
1285
- .picker-field-label {
1286
- font-size: 11px;
1287
- color: var(--ink-muted);
1288
- font-weight: 500;
1289
- }
1290
- .picker-field .input {
1291
- padding: 6px 10px;
1292
- font-size: 12.5px;
1293
- max-width: none;
1294
- }
1295
- .picker-create-actions {
1296
- display: flex;
1297
- justify-content: flex-end;
1298
- gap: 6px;
1299
- margin-top: 4px;
1300
- }
1301
-
1302
- /* --- Adopt (import existing CLI session) modal --------------------- */
1303
- .adopt { display: flex; flex-direction: column; gap: 12px; }
1304
-
1305
- .adopt-tabs {
1306
- display: flex;
1307
- align-items: center;
1308
- gap: 4px;
1309
- padding-bottom: 10px;
1310
- border-bottom: 1px solid var(--border);
1311
- }
1312
- .adopt-tab {
1313
- display: inline-flex;
1314
- align-items: center;
1315
- gap: 6px;
1316
- padding: 6px 10px;
1317
- border-radius: 999px;
1318
- border: 1px solid transparent;
1319
- background: transparent;
1320
- font: inherit;
1321
- color: var(--ink-mid);
1322
- cursor: pointer;
1323
- font-size: 12.5px;
1324
- transition: background .12s ease, color .12s ease, border-color .12s ease;
1325
- }
1326
- .adopt-tab:hover { color: var(--ink); background: var(--bg); }
1327
- .adopt-tab.is-active {
1328
- background: var(--ink);
1329
- border-color: var(--ink);
1330
- color: #fff;
1331
- font-weight: 500;
1332
- }
1333
- .adopt-tab.is-active .adopt-tab-count {
1334
- background: rgba(255, 255, 255, 0.22);
1335
- color: #fff;
1336
- }
1337
- .adopt-tab-icon { display: inline-flex; width: 16px; height: 16px; }
1338
- .adopt-tab-icon svg { width: 100%; height: 100%; }
1339
- .adopt-tab-count {
1340
- display: inline-flex;
1341
- align-items: center;
1342
- justify-content: center;
1343
- min-width: 18px;
1344
- height: 16px;
1345
- padding: 0 5px;
1346
- border-radius: 999px;
1347
- background: var(--bg);
1348
- color: var(--ink-mid);
1349
- font-size: 10.5px;
1350
- font-weight: 600;
1351
- font-variant-numeric: tabular-nums;
1352
- }
1353
- .adopt-icon-btn {
1354
- appearance: none;
1355
- margin-left: auto;
1356
- display: inline-flex;
1357
- align-items: center;
1358
- justify-content: center;
1359
- width: 28px;
1360
- height: 28px;
1361
- padding: 0;
1362
- border: 1px solid var(--border);
1363
- background: var(--bg-elev);
1364
- color: var(--ink-mid);
1365
- border-radius: 8px;
1366
- cursor: pointer;
1367
- transition: color .12s ease, border-color .12s ease, transform .3s ease;
1368
- }
1369
- .adopt-icon-btn:hover { color: var(--ink); border-color: var(--ink-faint); transform: rotate(90deg); }
1370
-
1371
- /* Tools row: CLI picker pill + search input */
1372
- .adopt-tools {
1373
- display: flex;
1374
- align-items: center;
1375
- gap: 10px;
1376
- flex-wrap: wrap;
1377
- }
1378
- .adopt-cli-pill {
1379
- appearance: none;
1380
- display: inline-flex;
1381
- align-items: center;
1382
- gap: 6px;
1383
- padding: 5px 8px 5px 10px;
1384
- height: 30px;
1385
- border: 1px solid var(--border);
1386
- border-radius: 8px;
1387
- background: var(--bg-elev);
1388
- color: var(--ink);
1389
- font: inherit;
1390
- font-size: 12px;
1391
- cursor: pointer;
1392
- transition: border-color .12s ease, background .12s ease;
1393
- }
1394
- .adopt-cli-pill:hover { border-color: var(--ink-faint); background: var(--bg); }
1395
- .adopt-cli-pill.is-open { border-color: var(--ink); }
1396
- .adopt-cli-pill-prefix { color: var(--ink-muted); font-size: 11.5px; }
1397
- .adopt-cli-pill-icon {
1398
- display: inline-flex; align-items: center; justify-content: center;
1399
- width: 14px; height: 14px;
1400
- }
1401
- .adopt-cli-pill-icon svg { width: 100%; height: 100%; }
1402
- .adopt-cli-pill-name { font-weight: 500; }
1403
- .adopt-cli-pill > svg { color: var(--ink-faint); width: 12px; height: 12px; }
1404
-
1405
- .adopt-search {
1406
- position: relative;
1407
- flex: 1 1 200px;
1408
- min-width: 200px;
1409
- }
1410
- .adopt-search-icon {
1411
- position: absolute;
1412
- left: 9px;
1413
- top: 50%;
1414
- transform: translateY(-50%);
1415
- display: inline-flex;
1416
- color: var(--ink-faint);
1417
- pointer-events: none;
1418
- }
1419
- .adopt-search-icon svg { width: 13px; height: 13px; }
1420
- .adopt-search-input {
1421
- appearance: none;
1422
- width: 100%;
1423
- height: 30px;
1424
- padding: 0 28px 0 28px;
1425
- border: 1px solid var(--border);
1426
- border-radius: 8px;
1427
- background: var(--bg-elev);
1428
- color: var(--ink);
1429
- font: inherit;
1430
- font-size: 12px;
1431
- outline: none;
1432
- transition: border-color .12s ease;
1433
- }
1434
- .adopt-search-input:focus { border-color: var(--ink-faint); }
1435
- .adopt-search-input:disabled { color: var(--ink-faint); }
1436
- .adopt-search-clear {
1437
- appearance: none;
1438
- position: absolute;
1439
- right: 6px;
1440
- top: 50%;
1441
- transform: translateY(-50%);
1442
- border: 0;
1443
- background: transparent;
1444
- color: var(--ink-faint);
1445
- padding: 4px;
1446
- border-radius: 6px;
1447
- cursor: pointer;
1448
- display: inline-flex;
1449
- }
1450
- .adopt-search-clear:hover { color: var(--ink); background: var(--bg); }
1451
- .adopt-search-clear svg { width: 11px; height: 11px; }
1452
-
1453
- .adopt-body {
1454
- min-height: 240px;
1455
- max-height: 56vh;
1456
- overflow: auto;
1457
- margin: 0 -2px;
1458
- padding: 0 2px;
1459
- }
1460
- .adopt-empty {
1461
- padding: 48px 12px;
1462
- text-align: center;
1463
- color: var(--ink-muted);
1464
- font-size: 12.5px;
1465
- display: flex;
1466
- flex-direction: column;
1467
- align-items: center;
1468
- gap: 10px;
1469
- }
1470
- .adopt-error { color: var(--danger); }
1471
- .adopt-empty-mark {
1472
- font-size: 24px;
1473
- color: var(--ink-faint);
1474
- width: 44px;
1475
- height: 44px;
1476
- border-radius: 50%;
1477
- background: var(--bg);
1478
- display: inline-flex;
1479
- align-items: center;
1480
- justify-content: center;
1481
- border: 1px dashed var(--border);
1482
- }
1483
- .adopt-empty-spinner {
1484
- width: 14px; height: 14px; border-radius: 50%;
1485
- border: 1.6px solid var(--border);
1486
- border-top-color: var(--ink-faint);
1487
- animation: adopt-spin 0.8s linear infinite;
1488
- display: inline-block;
1489
- vertical-align: -2px;
1490
- margin-right: 6px;
1491
- }
1492
- @keyframes adopt-spin { to { transform: rotate(360deg); } }
1493
-
1494
- .adopt-list {
1495
- list-style: none;
1496
- margin: 0;
1497
- padding: 0;
1498
- display: flex;
1499
- flex-direction: column;
1500
- gap: 6px;
1501
- }
1502
- .adopt-row {
1503
- display: flex;
1504
- align-items: center;
1505
- gap: 12px;
1506
- padding: 10px 12px;
1507
- border: 1px solid var(--border);
1508
- background: var(--bg-elev);
1509
- border-radius: 10px;
1510
- transition: border-color .12s ease, background .12s ease, transform .12s ease;
1511
- }
1512
- .adopt-row:hover {
1513
- border-color: var(--ink-faint);
1514
- transform: translateY(-1px);
1515
- }
1516
- .adopt-row.is-adopted {
1517
- opacity: 0.6;
1518
- background: var(--bg);
1519
- }
1520
- .adopt-row.is-adopted:hover { transform: none; border-color: var(--border); }
1521
- /* A session that a cli process currently has open. Subtle green tint +
1522
- left bar to pull the eye, plus a "● live" pill before the title. */
1523
- .adopt-row.is-active {
1524
- border-color: rgba(74, 138, 74, 0.45);
1525
- background: linear-gradient(180deg, rgba(74, 138, 74, 0.05), var(--bg-elev));
1526
- box-shadow: inset 3px 0 0 0 var(--green);
1527
- }
1528
- .adopt-row.is-active:hover { border-color: rgba(74, 138, 74, 0.7); }
1529
- .adopt-row-main { flex: 1 1 auto; min-width: 0; }
1530
- .adopt-row-title {
1531
- font-size: 13px;
1532
- color: var(--ink);
1533
- font-weight: 500;
1534
- overflow: hidden;
1535
- text-overflow: ellipsis;
1536
- white-space: nowrap;
1537
- line-height: 1.35;
1538
- display: flex;
1539
- align-items: center;
1540
- gap: 8px;
1541
- }
1542
- .adopt-row-untitled { color: var(--ink-faint); font-weight: 400; font-style: italic; }
1543
- .adopt-row-live {
1544
- flex: 0 0 auto;
1545
- display: inline-flex;
1546
- align-items: center;
1547
- gap: 4px;
1548
- padding: 1px 7px;
1549
- border-radius: 999px;
1550
- font-size: 10.5px;
1551
- font-weight: 600;
1552
- letter-spacing: 0.02em;
1553
- text-transform: uppercase;
1554
- color: var(--green);
1555
- background: rgba(74, 138, 74, 0.12);
1556
- border: 1px solid rgba(74, 138, 74, 0.35);
1557
- cursor: default;
1558
- position: relative;
1559
- /* Pulse is implemented via opacity on a pseudo-element instead of
1560
- animating box-shadow — opacity is GPU-composited, box-shadow forces
1561
- a paint every frame. With 12+ live rows the old version pegged the
1562
- paint thread and made the whole modal feel stuck. */
1563
- }
1564
- .adopt-row-live::before {
1565
- content: "";
1566
- position: absolute;
1567
- inset: -3px;
1568
- border-radius: 999px;
1569
- border: 1px solid rgba(74, 138, 74, 0.5);
1570
- opacity: 0;
1571
- animation: adopt-live-pulse 1.8s ease-in-out infinite;
1572
- pointer-events: none;
1573
- }
1574
- @keyframes adopt-live-pulse {
1575
- 0%, 100% { opacity: 0.6; transform: scale(0.95); }
1576
- 50% { opacity: 0; transform: scale(1.15); }
1577
- }
1578
-
1579
- .adopt-loadmore {
1580
- display: flex;
1581
- justify-content: center;
1582
- padding: 12px 0 4px;
1583
- }
1584
- .adopt-loadmore-done,
1585
- .adopt-loadmore-hint {
1586
- font-size: 11.5px;
1587
- color: var(--ink-muted);
1588
- font-style: italic;
1589
- text-align: center;
1590
- }
1591
- .adopt-loadmore .action {
1592
- font-size: 12px;
1593
- font-family: var(--mono);
1594
- font-variant-numeric: tabular-nums;
1595
- }
1596
- .adopt-row-meta {
1597
- display: flex;
1598
- align-items: center;
1599
- font-size: 11px;
1600
- color: var(--ink-muted);
1601
- margin-top: 4px;
1602
- white-space: nowrap;
1603
- overflow: hidden;
1604
- }
1605
- .adopt-row-path {
1606
- min-width: 0;
1607
- overflow: hidden;
1608
- text-overflow: ellipsis;
1609
- white-space: nowrap;
1610
- flex: 0 1 auto;
1611
- }
1612
- .adopt-row-dot { margin: 0 8px; color: var(--ink-faint); }
1613
- .adopt-row-id { color: var(--ink-faint); }
1614
- .adopt-row-actions {
1615
- display: flex;
1616
- align-items: center;
1617
- gap: 6px;
1618
- flex: 0 0 auto;
1619
- }
1620
- .adopt-row-btn { padding: 6px 14px; font-size: 12px; }
1621
- .adopt-row-badge {
1622
- font-size: 11px;
1623
- color: var(--ink-muted);
1624
- padding: 5px 12px;
1625
- border-radius: 999px;
1626
- background: var(--bg);
1627
- border: 1px solid var(--border);
1628
- }
1
+ /* Workspace cards · clone-progress list · pagination · snapshot preview */
2
+
3
+ .workspace-grid {
4
+ display: grid;
5
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
6
+ gap: var(--s-3);
7
+ }
8
+ .workspace-card {
9
+ padding: var(--s-4);
10
+ border: 1px solid var(--border-soft);
11
+ background: var(--bg-elev);
12
+ border-radius: 6px;
13
+ transition: border-color .18s, box-shadow .18s, transform .18s;
14
+ }
15
+ .workspace-card:hover {
16
+ border-color: var(--ink-faint);
17
+ box-shadow: var(--shadow-md);
18
+ transform: translateY(-1px);
19
+ }
20
+ .workspace-card.in-use {
21
+ background: var(--bg);
22
+ border-color: var(--ink-faint);
23
+ box-shadow: inset 3px 0 0 var(--accent);
24
+ }
25
+ .workspace-card .ws-head {
26
+ display: flex;
27
+ align-items: baseline;
28
+ justify-content: space-between;
29
+ gap: var(--s-2);
30
+ margin-bottom: 6px;
31
+ }
32
+ .workspace-card .ws-name {
33
+ font-size: 14.5px;
34
+ font-weight: 600;
35
+ letter-spacing: -0.01em;
36
+ color: var(--ink);
37
+ line-height: 1.2;
38
+ }
39
+ .workspace-card .ws-tag {
40
+ font-family: var(--mono);
41
+ font-size: 10px;
42
+ text-transform: uppercase;
43
+ letter-spacing: 0.08em;
44
+ padding: 2px 7px;
45
+ border-radius: 4px;
46
+ background: var(--bg);
47
+ color: var(--ink-muted);
48
+ border: 1px solid var(--border-soft);
49
+ }
50
+ .workspace-card.in-use .ws-tag {
51
+ background: var(--bg-elev);
52
+ color: var(--ink-mid);
53
+ border-color: var(--ink-faint);
54
+ }
55
+ .workspace-card .ws-path {
56
+ font-family: var(--mono);
57
+ font-size: 11px;
58
+ color: var(--ink-muted);
59
+ word-break: break-all;
60
+ margin-bottom: var(--s-3);
61
+ }
62
+ .workspace-card .ws-repos {
63
+ display: flex;
64
+ flex-wrap: wrap;
65
+ gap: 4px;
66
+ }
67
+ .workspace-card .ws-repo {
68
+ font-family: var(--mono);
69
+ font-size: 10.5px;
70
+ padding: 2px 7px;
71
+ border-radius: 4px;
72
+ background: var(--bg);
73
+ color: var(--ink-muted);
74
+ border: 1px solid var(--border-soft);
75
+ }
76
+ .workspace-card .ws-repo.cloned {
77
+ color: var(--green);
78
+ background: rgba(74, 138, 74, 0.06);
79
+ border-color: rgba(74, 138, 74, 0.25);
80
+ }
81
+
82
+ /* Clone progress — one row per repo, NDJSON-driven by /api/sessions/new */
83
+ .progress-list {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: var(--s-2);
87
+ margin-top: var(--s-3);
88
+ }
89
+ .progress-list:empty { display: none; }
90
+
91
+ .progress-item {
92
+ border: 1px solid var(--border);
93
+ background: var(--bg);
94
+ border-radius: var(--r-sm);
95
+ padding: var(--s-3) var(--s-4);
96
+ }
97
+ .progress-item .head {
98
+ display: grid;
99
+ grid-template-columns: 1fr auto auto;
100
+ align-items: baseline;
101
+ gap: var(--s-3);
102
+ margin-bottom: var(--s-2);
103
+ }
104
+ .progress-item .name {
105
+ font-family: var(--body);
106
+ font-size: 12.5px;
107
+ font-weight: 600;
108
+ color: var(--ink);
109
+ }
110
+ .progress-item .phase {
111
+ font-family: var(--mono);
112
+ font-size: 10.5px;
113
+ color: var(--ink-muted);
114
+ letter-spacing: 0.04em;
115
+ }
116
+ .progress-item .pct {
117
+ font-family: var(--mono);
118
+ font-size: 11.5px;
119
+ color: var(--ink-mid);
120
+ font-variant-numeric: tabular-nums;
121
+ }
122
+ .progress-bar {
123
+ height: 3px;
124
+ background: var(--border);
125
+ position: relative;
126
+ overflow: hidden;
127
+ border-radius: 2px;
128
+ }
129
+ .progress-bar .fill {
130
+ height: 100%;
131
+ width: 0;
132
+ background: var(--ink);
133
+ transition: width .2s ease;
134
+ border-radius: 2px;
135
+ }
136
+ .progress-bar .fill.indeterminate {
137
+ width: 35% !important;
138
+ animation: indeterm 1.4s ease-in-out infinite;
139
+ }
140
+ @keyframes indeterm {
141
+ from { transform: translateX(-110%); }
142
+ to { transform: translateX(330%); }
143
+ }
144
+ .progress-item.ok .fill { background: var(--green); }
145
+ .progress-item.error .fill { background: var(--red); }
146
+ .progress-item .detail {
147
+ margin-top: 4px;
148
+ font-family: var(--mono);
149
+ font-size: 10.5px;
150
+ color: var(--ink-muted);
151
+ min-height: 12px;
152
+ }
153
+
154
+ /* Pagination row — sits below table inside .card-body-flush card */
155
+ .pagination {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: var(--s-3);
159
+ padding: var(--s-3) var(--s-6);
160
+ border-top: 1px solid var(--border-soft);
161
+ background: var(--bg);
162
+ font-size: 12.5px;
163
+ color: var(--ink-mid);
164
+ flex-wrap: wrap;
165
+ }
166
+ .pagination-info {
167
+ flex: 1;
168
+ text-align: center;
169
+ font-family: var(--mono);
170
+ font-size: 11.5px;
171
+ color: var(--ink-muted);
172
+ }
173
+ .pagination-info strong {
174
+ color: var(--ink);
175
+ font-weight: 600;
176
+ }
177
+ .pagination select {
178
+ font-size: 11.5px;
179
+ padding: 4px 24px 4px 8px;
180
+ }
181
+
182
+ /* Snapshot raw-text preview (collapsible <details>) */
183
+ .snapshot-detail { margin-top: var(--s-4); }
184
+ .snapshot-detail summary {
185
+ cursor: pointer;
186
+ font-size: 12.5px;
187
+ color: var(--ink-mid);
188
+ padding: var(--s-2) 0;
189
+ user-select: none;
190
+ font-weight: 500;
191
+ }
192
+ .snapshot-detail summary::marker { color: var(--ink-mid); }
193
+ .snapshot-detail summary:hover { color: var(--ink); }
194
+ .preview {
195
+ font-family: var(--mono);
196
+ font-size: 11.5px;
197
+ color: var(--ink-mid);
198
+ background: var(--bg);
199
+ border: 1px solid var(--border);
200
+ border-radius: var(--r-sm);
201
+ padding: var(--s-3);
202
+ margin-top: var(--s-2);
203
+ max-height: 280px;
204
+ overflow: auto;
205
+ white-space: pre;
206
+ line-height: 1.55;
207
+ }
208
+
209
+ /* === Launch page hero · ChatGPT-style centered composer ============= */
210
+
211
+ .launch-hero {
212
+ max-width: 640px;
213
+ width: 100%;
214
+ margin: 0 auto;
215
+ padding: var(--s-4);
216
+ display: flex;
217
+ flex-direction: column;
218
+ align-items: center;
219
+ justify-content: center;
220
+ gap: var(--s-5);
221
+ flex: 1;
222
+ min-height: 0;
223
+ }
224
+
225
+ .launch-brand {
226
+ display: inline-flex;
227
+ align-items: center;
228
+ justify-content: center;
229
+ color: var(--accent);
230
+ }
231
+ .launch-brand-mark svg {
232
+ width: 88px;
233
+ height: 88px;
234
+ display: block;
235
+ }
236
+
237
+ .launch-tagline {
238
+ font-size: 26px;
239
+ font-weight: 500;
240
+ letter-spacing: -0.02em;
241
+ color: var(--ink);
242
+ text-align: center;
243
+ margin: 0;
244
+ line-height: 1.25;
245
+ max-width: 32ch;
246
+ }
247
+ .launch-tagline em {
248
+ font-style: normal;
249
+ color: var(--accent);
250
+ font-weight: 500;
251
+ }
252
+
253
+
254
+
255
+ .launch-status {
256
+ font-family: var(--mono);
257
+ font-size: 11.5px;
258
+ color: var(--ink-muted);
259
+ align-self: stretch;
260
+ text-align: center;
261
+ }
262
+
263
+ .launch-import-link {
264
+ display: inline-flex;
265
+ align-items: center;
266
+ background: transparent;
267
+ border: none;
268
+ font: inherit;
269
+ font-size: 12px;
270
+ color: var(--ink-faint);
271
+ cursor: pointer;
272
+ padding: 4px 8px;
273
+ border-radius: 6px;
274
+ transition: color 120ms ease;
275
+ }
276
+ .launch-import-link:hover { color: var(--ink-mid); }
277
+ .launch-import-arrow {
278
+ display: inline-flex;
279
+ align-items: center;
280
+ margin-left: 6px;
281
+ transition: transform 180ms cubic-bezier(.4, 0, .2, 1);
282
+ }
283
+ .launch-import-link:hover .launch-import-arrow { transform: translateX(3px); }
284
+
285
+ /* === Launch toolbar · A · Pill toolbar =========================== */
286
+
287
+ .launch-toolbar {
288
+ width: 100%;
289
+ display: flex;
290
+ align-items: center;
291
+ justify-content: center;
292
+ flex-wrap: wrap;
293
+ gap: var(--s-2);
294
+ }
295
+
296
+ .pill {
297
+ appearance: none;
298
+ background: var(--bg);
299
+ border: 1px solid var(--border-soft);
300
+ border-radius: 999px;
301
+ padding: 8px 14px 8px 12px;
302
+ display: inline-flex;
303
+ align-items: center;
304
+ justify-content: center;
305
+ gap: 8px;
306
+ cursor: pointer;
307
+ color: var(--ink);
308
+ font: inherit;
309
+ font-size: 13px;
310
+ font-weight: 500;
311
+ line-height: 1;
312
+ white-space: nowrap;
313
+ transition: background .12s ease, border-color .12s ease, color .12s ease;
314
+ flex: 0 0 160px;
315
+ width: 160px;
316
+ min-width: 0;
317
+ }
318
+ .pill:hover {
319
+ background: var(--sidebar-hover);
320
+ border-color: var(--border);
321
+ }
322
+ .pill.is-open {
323
+ background: var(--sidebar-active);
324
+ border-color: var(--ink-faint);
325
+ }
326
+ .pill.is-set {
327
+ border-color: var(--ink-faint);
328
+ background: var(--sidebar-active);
329
+ }
330
+ .pill.is-disabled,
331
+ .pill:disabled {
332
+ opacity: 0.45;
333
+ cursor: not-allowed;
334
+ }
335
+ .pill.is-disabled:hover,
336
+ .pill:disabled:hover { background: var(--bg-elev); border-color: var(--border); }
337
+
338
+ /* --- Workdir picker (Launch page) ----------------------------------- */
339
+ .workdir-modal {
340
+ display: flex;
341
+ flex-direction: column;
342
+ gap: 14px;
343
+ padding: 18px 20px;
344
+ }
345
+ .workdir-mode-grid {
346
+ display: grid;
347
+ grid-template-columns: 1fr 1fr;
348
+ gap: 10px;
349
+ }
350
+ .workdir-mode-opt {
351
+ appearance: none;
352
+ background: var(--bg-elev);
353
+ border: 1px solid var(--border);
354
+ border-radius: 10px;
355
+ padding: 14px 14px 12px;
356
+ cursor: pointer;
357
+ display: grid;
358
+ grid-template-columns: 32px 1fr;
359
+ grid-template-rows: auto auto;
360
+ column-gap: 10px;
361
+ row-gap: 2px;
362
+ text-align: left;
363
+ align-items: center;
364
+ font: inherit;
365
+ color: var(--ink);
366
+ transition: border-color .12s ease, background .12s ease, box-shadow .12s ease;
367
+ }
368
+ .workdir-mode-opt:hover {
369
+ border-color: var(--ink-faint);
370
+ }
371
+ .workdir-mode-opt.is-active {
372
+ border-color: var(--ink);
373
+ background: var(--bg-elev);
374
+ box-shadow: 0 0 0 1px var(--ink) inset;
375
+ }
376
+ .workdir-mode-icon {
377
+ grid-row: 1 / span 2;
378
+ width: 32px;
379
+ height: 32px;
380
+ display: inline-flex;
381
+ align-items: center;
382
+ justify-content: center;
383
+ border-radius: 8px;
384
+ background: var(--bg);
385
+ color: var(--ink-mid);
386
+ }
387
+ .workdir-mode-opt.is-active .workdir-mode-icon {
388
+ background: var(--ink);
389
+ color: var(--bg-elev);
390
+ }
391
+ .workdir-mode-icon svg,
392
+ .workdir-mode-icon img { width: 18px; height: 18px; display: block; }
393
+ .workdir-mode-name {
394
+ font-size: 13px;
395
+ font-weight: 600;
396
+ letter-spacing: -0.005em;
397
+ }
398
+ .workdir-mode-sub {
399
+ font-size: 11.5px;
400
+ color: var(--ink-muted);
401
+ line-height: 1.35;
402
+ }
403
+ .workdir-mode-opt.is-active .workdir-mode-sub { color: var(--ink-mid); }
404
+
405
+ .workdir-detail {
406
+ border: 1px solid var(--border);
407
+ border-radius: 10px;
408
+ background: var(--bg);
409
+ overflow: hidden;
410
+ }
411
+ .workdir-detail .picker { max-height: min(56vh, 420px); }
412
+ .workdir-detail .filex {
413
+ padding: 10px;
414
+ gap: 10px;
415
+ }
416
+ .workdir-detail .filex-body { height: 320px; }
417
+
418
+ .workdir-foot {
419
+ display: flex;
420
+ justify-content: flex-end;
421
+ gap: 8px;
422
+ margin: 4px -20px -18px;
423
+ padding: 12px 20px;
424
+ border-top: 1px solid var(--border-soft);
425
+ background: var(--bg);
426
+ }
427
+
428
+ .icon-radio-sub {
429
+ font-size: 11px;
430
+ font-weight: 400;
431
+ color: var(--ink-muted);
432
+ margin-top: 1px;
433
+ }
434
+ .icon-radio-opt.is-active .icon-radio-sub { color: var(--accent-deep); opacity: 0.85; }
435
+
436
+ /* --- File-Explorer-style directory picker --------------------------- */
437
+ .filex {
438
+ display: flex;
439
+ flex-direction: column;
440
+ gap: 8px;
441
+ font-size: 12.5px;
442
+ }
443
+ .filex-loading, .filex-empty {
444
+ padding: 24px;
445
+ text-align: center;
446
+ font-size: 12px;
447
+ color: var(--ink-muted);
448
+ font-style: italic;
449
+ }
450
+
451
+ /* toolbar: back/fwd/up + breadcrumb */
452
+ .filex-toolbar {
453
+ display: flex;
454
+ align-items: center;
455
+ gap: 6px;
456
+ padding: 4px;
457
+ border: 1px solid var(--border);
458
+ border-radius: 8px;
459
+ background: var(--bg-elev);
460
+ }
461
+ .filex-navbtns {
462
+ display: flex;
463
+ gap: 2px;
464
+ flex-shrink: 0;
465
+ }
466
+ .filex-navbtn {
467
+ appearance: none;
468
+ background: transparent;
469
+ border: 0;
470
+ width: 28px;
471
+ height: 28px;
472
+ border-radius: 6px;
473
+ display: inline-flex;
474
+ align-items: center;
475
+ justify-content: center;
476
+ color: var(--ink-mid);
477
+ cursor: pointer;
478
+ transition: background .12s ease, color .12s ease;
479
+ }
480
+ .filex-navbtn:hover:not(:disabled) {
481
+ background: var(--sidebar-hover);
482
+ color: var(--ink);
483
+ }
484
+ .filex-navbtn:disabled {
485
+ opacity: 0.35;
486
+ cursor: not-allowed;
487
+ }
488
+ .filex-navbtn svg { width: 14px; height: 14px; }
489
+
490
+ .filex-breadcrumb {
491
+ flex: 1;
492
+ min-width: 0;
493
+ display: flex;
494
+ align-items: center;
495
+ gap: 1px;
496
+ flex-wrap: nowrap;
497
+ overflow: hidden;
498
+ padding: 0 6px;
499
+ cursor: text;
500
+ min-height: 28px;
501
+ }
502
+ .filex-crumb {
503
+ appearance: none;
504
+ background: transparent;
505
+ border: 0;
506
+ font: inherit;
507
+ font-size: 12.5px;
508
+ color: var(--ink);
509
+ padding: 4px 8px;
510
+ border-radius: 4px;
511
+ cursor: pointer;
512
+ white-space: nowrap;
513
+ transition: background .1s ease;
514
+ }
515
+ .filex-crumb:hover { background: var(--bg); }
516
+ .filex-crumb-sep {
517
+ color: var(--ink-faint);
518
+ font-size: 13px;
519
+ user-select: none;
520
+ flex-shrink: 0;
521
+ }
522
+ .filex-address-edit-btn {
523
+ appearance: none;
524
+ background: transparent;
525
+ border: 0;
526
+ width: 26px;
527
+ height: 26px;
528
+ border-radius: 4px;
529
+ display: inline-flex;
530
+ align-items: center;
531
+ justify-content: center;
532
+ color: var(--ink-faint);
533
+ cursor: pointer;
534
+ margin-left: auto;
535
+ flex-shrink: 0;
536
+ opacity: 0;
537
+ transition: opacity .12s ease, background .12s ease, color .12s ease;
538
+ }
539
+ .filex-toolbar:hover .filex-address-edit-btn { opacity: 0.7; }
540
+ .filex-address-edit-btn:hover {
541
+ background: var(--sidebar-hover);
542
+ color: var(--ink);
543
+ opacity: 1;
544
+ }
545
+ .filex-address-edit-btn svg { width: 12px; height: 12px; }
546
+ .filex-address-edit {
547
+ flex: 1;
548
+ display: flex;
549
+ padding: 0 4px;
550
+ }
551
+ .filex-address-input {
552
+ width: 100%;
553
+ appearance: none;
554
+ background: var(--bg);
555
+ border: 1px solid var(--accent);
556
+ border-radius: 5px;
557
+ padding: 5px 8px;
558
+ font-size: 12.5px;
559
+ color: var(--ink);
560
+ outline: none;
561
+ }
562
+
563
+ /* body: sidebar (quick access) + main file list */
564
+ .filex-body {
565
+ display: grid;
566
+ grid-template-columns: 150px 1fr;
567
+ gap: 8px;
568
+ height: 360px;
569
+ border: 1px solid var(--border);
570
+ border-radius: 8px;
571
+ background: var(--bg-elev);
572
+ overflow: hidden;
573
+ }
574
+ .filex-side {
575
+ border-right: 1px solid var(--border);
576
+ background: var(--bg);
577
+ overflow-y: auto;
578
+ padding: 6px 4px;
579
+ display: flex;
580
+ flex-direction: column;
581
+ gap: 1px;
582
+ }
583
+ .filex-side-label {
584
+ font-size: 10px;
585
+ font-weight: 600;
586
+ text-transform: uppercase;
587
+ letter-spacing: 0.08em;
588
+ color: var(--ink-faint);
589
+ padding: 4px 8px;
590
+ }
591
+ .filex-side-item {
592
+ appearance: none;
593
+ background: transparent;
594
+ border: 0;
595
+ text-align: left;
596
+ font: inherit;
597
+ font-size: 12px;
598
+ color: var(--ink-mid);
599
+ cursor: pointer;
600
+ padding: 5px 8px;
601
+ border-radius: 4px;
602
+ display: flex;
603
+ align-items: center;
604
+ gap: 6px;
605
+ width: 100%;
606
+ overflow: hidden;
607
+ text-overflow: ellipsis;
608
+ white-space: nowrap;
609
+ }
610
+ .filex-side-item:hover { background: var(--sidebar-hover); color: var(--ink); }
611
+ .filex-side-item.is-active {
612
+ background: var(--sidebar-active);
613
+ color: var(--ink);
614
+ font-weight: 500;
615
+ }
616
+ .filex-side-icon {
617
+ display: inline-flex;
618
+ width: 14px;
619
+ height: 14px;
620
+ align-items: center;
621
+ justify-content: center;
622
+ color: var(--ink-faint);
623
+ }
624
+ .filex-side-icon svg { width: 13px; height: 13px; }
625
+ .filex-side-name {
626
+ flex: 1;
627
+ min-width: 0;
628
+ overflow: hidden;
629
+ text-overflow: ellipsis;
630
+ }
631
+
632
+ .filex-main { overflow-y: auto; }
633
+ .filex-list { padding: 4px; }
634
+ .filex-row {
635
+ appearance: none;
636
+ display: flex;
637
+ align-items: center;
638
+ gap: 10px;
639
+ width: 100%;
640
+ padding: 8px 10px;
641
+ background: transparent;
642
+ border: 0;
643
+ border-radius: 5px;
644
+ text-align: left;
645
+ font: inherit;
646
+ font-size: 12.5px;
647
+ color: var(--ink);
648
+ cursor: pointer;
649
+ transition: background .08s ease;
650
+ }
651
+ .filex-row:hover { background: var(--bg); }
652
+ .filex-row[data-active="true"] {
653
+ background: var(--accent-soft);
654
+ color: var(--accent-deep);
655
+ }
656
+ .filex-row[data-active="true"] .filex-row-icon { color: var(--accent); }
657
+ .filex-row-icon {
658
+ display: inline-flex;
659
+ width: 18px;
660
+ height: 18px;
661
+ align-items: center;
662
+ justify-content: center;
663
+ color: var(--ink-muted);
664
+ flex-shrink: 0;
665
+ }
666
+ .filex-row-icon svg { width: 16px; height: 16px; }
667
+ .filex-row-name {
668
+ flex: 1;
669
+ min-width: 0;
670
+ overflow: hidden;
671
+ text-overflow: ellipsis;
672
+ white-space: nowrap;
673
+ }
674
+
675
+ .filex-foot {
676
+ display: flex;
677
+ align-items: center;
678
+ gap: 8px;
679
+ padding-top: 6px;
680
+ border-top: 1px solid var(--border);
681
+ }
682
+ .filex-foot-current {
683
+ flex: 1;
684
+ min-width: 0;
685
+ font-size: 11px;
686
+ color: var(--ink-muted);
687
+ overflow: hidden;
688
+ text-overflow: ellipsis;
689
+ white-space: nowrap;
690
+ }
691
+ .filex-foot-actions {
692
+ display: flex;
693
+ gap: 6px;
694
+ flex-shrink: 0;
695
+ }
696
+ .pill-icon {
697
+ display: inline-flex;
698
+ align-items: center;
699
+ color: var(--ink-muted);
700
+ flex: 0 0 auto;
701
+ }
702
+ .pill-icon svg { width: 14px; height: 14px; }
703
+ .pill-label {
704
+ flex: 0 1 auto;
705
+ min-width: 0;
706
+ overflow: hidden;
707
+ text-overflow: ellipsis;
708
+ }
709
+ .pill-chev {
710
+ display: inline-flex;
711
+ color: var(--ink-faint);
712
+ margin-left: 2px;
713
+ flex: 0 0 auto;
714
+ transition: transform .15s ease;
715
+ }
716
+ .pill-chev svg { width: 12px; height: 12px; }
717
+ .pill.is-open .pill-chev { transform: rotate(180deg); }
718
+
719
+ .action.launch-cta {
720
+ align-self: center;
721
+ border-radius: 6px;
722
+ padding: 7px 22px;
723
+ font-size: 13px;
724
+ font-weight: 500;
725
+ letter-spacing: -0.005em;
726
+ display: inline-flex;
727
+ align-items: center;
728
+ justify-content: center;
729
+ gap: 6px;
730
+ min-width: 0;
731
+ margin-top: var(--s-1);
732
+ background: var(--accent);
733
+ border-color: var(--accent);
734
+ color: #fff;
735
+ }
736
+ .action.launch-cta:hover:not(:disabled) {
737
+ background: var(--accent-deep);
738
+ border-color: var(--accent-deep);
739
+ box-shadow: 0 4px 12px -4px var(--accent-soft);
740
+ }
741
+
742
+ /* === Settings page scroll container ================================
743
+ .tab-panel is flex:1 inside .content which clips overflow. Without a
744
+ scroll layer Settings cards beyond the viewport bottom get cut off. */
745
+ .settings-scroll {
746
+ flex: 1;
747
+ min-height: 0;
748
+ overflow-y: auto;
749
+ display: flex;
750
+ flex-direction: column;
751
+ gap: var(--s-4);
752
+ padding: 4px var(--s-2) var(--s-4) 4px;
753
+ margin: -4px calc(-1 * var(--s-2)) 0 -4px;
754
+ }
755
+ /* In a flex column container, items default to flex-shrink:1 which
756
+ causes the cards to compress instead of pushing the scroll container
757
+ to actually scroll. flex:0 0 auto pins them to their natural height. */
758
+ .settings-scroll > .card { flex: 0 0 auto; }
759
+ .settings-scroll > .settings-section { flex: 0 0 auto; }
760
+
761
+ /* === Settings section · A · flat, no card ========================== */
762
+ .settings-section {
763
+ display: flex;
764
+ flex-direction: column;
765
+ gap: var(--s-3);
766
+ padding-bottom: var(--s-5);
767
+ border-bottom: 1px solid var(--border-soft);
768
+ }
769
+ .settings-section:last-child { border-bottom: 0; }
770
+ .settings-section-head {
771
+ display: flex;
772
+ flex-direction: column;
773
+ gap: 2px;
774
+ }
775
+ .settings-section-title {
776
+ font-size: 15px;
777
+ font-weight: 600;
778
+ letter-spacing: -0.012em;
779
+ color: var(--ink);
780
+ line-height: 1.2;
781
+ margin: 0;
782
+ }
783
+ .settings-section-meta {
784
+ font-size: 12.5px;
785
+ color: var(--ink-muted);
786
+ margin: 0;
787
+ }
788
+ .settings-section-body { display: flex; flex-direction: column; gap: var(--s-2); }
789
+
790
+ /* === Settings entity list (CLIs / Repos / Folders) ================== */
791
+ .entity-list {
792
+ display: flex;
793
+ flex-direction: column;
794
+ gap: 2px;
795
+ }
796
+ .entity-row {
797
+ display: flex;
798
+ align-items: center;
799
+ gap: var(--s-3);
800
+ padding: 8px 8px 8px 4px;
801
+ border-radius: 6px;
802
+ transition: background .1s ease;
803
+ }
804
+ .entity-row.is-draggable { cursor: grab; }
805
+ .entity-row.is-draggable:active { cursor: grabbing; }
806
+ .entity-row[data-dnd-over="true"] {
807
+ box-shadow: 0 -2px 0 var(--accent) inset;
808
+ }
809
+ .entity-row-grip {
810
+ display: inline-flex;
811
+ align-items: center;
812
+ justify-content: center;
813
+ width: 14px;
814
+ color: var(--ink-faint);
815
+ font-size: 12px;
816
+ letter-spacing: -1px;
817
+ user-select: none;
818
+ pointer-events: none;
819
+ flex: 0 0 14px;
820
+ }
821
+ .entity-row:hover { background: var(--bg); }
822
+ .entity-row-icon {
823
+ display: inline-flex;
824
+ align-items: center;
825
+ justify-content: center;
826
+ width: 20px;
827
+ height: 20px;
828
+ color: var(--ink-muted);
829
+ flex: 0 0 20px;
830
+ }
831
+ .entity-row-icon svg { width: 16px; height: 16px; }
832
+ .entity-row-main {
833
+ flex: 0 1 auto;
834
+ min-width: 0;
835
+ display: flex;
836
+ flex-direction: column;
837
+ gap: 1px;
838
+ }
839
+ .entity-row-primary {
840
+ font-size: 13px;
841
+ font-weight: 500;
842
+ color: var(--ink);
843
+ display: inline-flex;
844
+ align-items: center;
845
+ gap: 6px;
846
+ }
847
+ .entity-row-badge {
848
+ font-family: var(--mono);
849
+ font-size: 10px;
850
+ letter-spacing: 0.06em;
851
+ text-transform: uppercase;
852
+ padding: 1px 6px;
853
+ border-radius: 4px;
854
+ font-weight: 500;
855
+ }
856
+ .entity-row-badge.tone-accent {
857
+ background: var(--accent-soft);
858
+ color: var(--accent-deep);
859
+ }
860
+ .entity-row-badge.tone-ok {
861
+ background: rgba(74, 138, 74, 0.12);
862
+ color: var(--green);
863
+ }
864
+ .entity-row-badge.tone-warn {
865
+ background: rgba(196, 137, 43, 0.14);
866
+ color: var(--yellow);
867
+ }
868
+ .entity-row-secondary {
869
+ font-size: 11.5px;
870
+ color: var(--ink-muted);
871
+ overflow: hidden;
872
+ text-overflow: ellipsis;
873
+ white-space: nowrap;
874
+ }
875
+ .entity-row-actions {
876
+ display: flex;
877
+ align-items: center;
878
+ gap: 2px;
879
+ flex-shrink: 0;
880
+ opacity: 0;
881
+ transition: opacity .12s ease;
882
+ margin-right: auto; /* pin actions next to the name, let trailing space stay empty */
883
+ }
884
+ .entity-row:hover .entity-row-actions,
885
+ .entity-row:focus-within .entity-row-actions {
886
+ opacity: 1;
887
+ }
888
+ .entity-row-action {
889
+ appearance: none;
890
+ background: transparent;
891
+ border: 0;
892
+ display: inline-flex;
893
+ align-items: center;
894
+ justify-content: center;
895
+ width: 30px;
896
+ height: 30px;
897
+ border-radius: 6px;
898
+ cursor: pointer;
899
+ color: var(--ink-mid);
900
+ font: inherit;
901
+ font-size: 16px;
902
+ transition: background .12s ease, color .12s ease;
903
+ }
904
+ .entity-row-action:hover { background: var(--sidebar-hover); color: var(--ink); }
905
+ .entity-row-action.danger:hover { color: var(--red); }
906
+ .entity-row-action svg { width: 16px; height: 16px; }
907
+
908
+ .entity-empty {
909
+ padding: 14px 10px;
910
+ font-size: 12.5px;
911
+ color: var(--ink-muted);
912
+ font-style: italic;
913
+ }
914
+
915
+ .entity-add {
916
+ appearance: none;
917
+ background: var(--accent);
918
+ border: 0;
919
+ display: inline-flex;
920
+ align-self: flex-start;
921
+ align-items: center;
922
+ gap: 6px;
923
+ padding: 6px 12px;
924
+ margin-top: 4px;
925
+ border-radius: 6px;
926
+ cursor: pointer;
927
+ color: #fff;
928
+ font: inherit;
929
+ font-size: 12.5px;
930
+ font-weight: 500;
931
+ transition: background .12s ease, box-shadow .12s ease;
932
+ }
933
+ .entity-add:hover {
934
+ background: var(--accent-deep);
935
+ box-shadow: 0 2px 6px -2px var(--accent-soft);
936
+ }
937
+ .entity-add svg { width: 13px; height: 13px; }
938
+
939
+ /* === EntityFormModal · shared form layout ========================== */
940
+ .entity-form {
941
+ padding: var(--s-4);
942
+ display: flex;
943
+ flex-direction: column;
944
+ gap: var(--s-3);
945
+ }
946
+ .entity-field {
947
+ display: flex;
948
+ flex-direction: column;
949
+ gap: 4px;
950
+ }
951
+ .entity-field-label {
952
+ font-size: 11.5px;
953
+ color: var(--ink-muted);
954
+ font-weight: 500;
955
+ }
956
+ .entity-field .input {
957
+ padding: 8px 10px;
958
+ font-size: 13px;
959
+ max-width: none;
960
+ }
961
+ .entity-field .input[readonly],
962
+ .entity-field .input:disabled {
963
+ background: var(--bg);
964
+ color: var(--ink-muted);
965
+ cursor: not-allowed;
966
+ }
967
+ .entity-field-hint {
968
+ font-size: 11px;
969
+ color: var(--ink-muted);
970
+ }
971
+ .entity-checkbox-row {
972
+ display: inline-flex;
973
+ align-items: center;
974
+ gap: 8px;
975
+ padding: 4px 0;
976
+ }
977
+ .entity-form-actions {
978
+ display: flex;
979
+ justify-content: flex-end;
980
+ gap: 6px;
981
+ margin-top: 4px;
982
+ }
983
+ .entity-test-button { margin-right: auto; }
984
+
985
+ .entity-test-result {
986
+ margin-top: 4px;
987
+ padding: 8px 10px;
988
+ border-radius: 6px;
989
+ border: 1px solid var(--border);
990
+ background: var(--bg);
991
+ display: flex;
992
+ flex-direction: column;
993
+ gap: 6px;
994
+ font-size: 12.5px;
995
+ }
996
+ .entity-test-result.is-ok { border-color: rgba(74, 138, 74, 0.4); background: rgba(74, 138, 74, 0.06); }
997
+ .entity-test-result.is-fail { border-color: rgba(183, 63, 63, 0.4); background: rgba(183, 63, 63, 0.06); }
998
+ .entity-test-summary {
999
+ font-family: var(--body);
1000
+ font-weight: 500;
1001
+ color: var(--ink);
1002
+ }
1003
+ .entity-test-result.is-fail .entity-test-summary { color: var(--red); }
1004
+ .entity-test-out {
1005
+ margin: 0;
1006
+ font-family: var(--mono);
1007
+ font-size: 11.5px;
1008
+ color: var(--ink-mid);
1009
+ white-space: pre-wrap;
1010
+ word-break: break-word;
1011
+ max-height: 120px;
1012
+ overflow-y: auto;
1013
+ }
1014
+ .entity-test-out.is-stderr { color: var(--ink-muted); border-top: 1px dashed var(--border); padding-top: 4px; }
1015
+
1016
+ .icon-radio {
1017
+ display: grid;
1018
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
1019
+ gap: 6px;
1020
+ }
1021
+ .icon-radio.is-disabled { opacity: 0.6; pointer-events: none; }
1022
+ .icon-radio-opt {
1023
+ appearance: none;
1024
+ background: var(--bg-elev);
1025
+ border: 1px solid var(--border);
1026
+ border-radius: 6px;
1027
+ padding: 10px 8px 8px;
1028
+ cursor: pointer;
1029
+ display: flex;
1030
+ flex-direction: column;
1031
+ align-items: center;
1032
+ gap: 6px;
1033
+ color: var(--ink-mid);
1034
+ font: inherit;
1035
+ font-size: 12px;
1036
+ font-weight: 500;
1037
+ transition: border-color .12s ease, background .12s ease, color .12s ease;
1038
+ }
1039
+ .icon-radio-opt:hover { border-color: var(--ink-faint); color: var(--ink); }
1040
+ .icon-radio-opt.is-active {
1041
+ background: var(--accent-soft);
1042
+ border-color: var(--accent);
1043
+ color: var(--accent-deep);
1044
+ }
1045
+ .icon-radio-opt:disabled { cursor: not-allowed; }
1046
+ .icon-radio-icon {
1047
+ display: inline-flex;
1048
+ align-items: center;
1049
+ justify-content: center;
1050
+ width: 24px;
1051
+ height: 24px;
1052
+ }
1053
+ .icon-radio-icon svg,
1054
+ .icon-radio-icon img { width: 24px; height: 24px; display: block; }
1055
+ .launch-cta-plane {
1056
+ display: inline-flex;
1057
+ align-items: center;
1058
+ justify-content: center;
1059
+ width: 16px;
1060
+ height: 16px;
1061
+ /* Resting state: tilted slightly clockwise, like a paper plane caught
1062
+ mid-glide. */
1063
+ transform: translate(0, 0) rotate(8deg);
1064
+ transform-origin: 60% 50%;
1065
+ transition: transform .35s cubic-bezier(.4, 0, .2, 1),
1066
+ opacity .25s ease;
1067
+ will-change: transform, opacity;
1068
+ }
1069
+ .launch-cta-plane svg { width: 100%; height: 100%; }
1070
+ .launch-cta:hover:not(:disabled) .launch-cta-plane {
1071
+ /* Small lift + glide forward — no big arc, no fade-out. */
1072
+ transform: translate(4px, -3px) rotate(14deg);
1073
+ }
1074
+
1075
+ /* Narrow viewport — toolbar wraps. Push the Launch button onto its own
1076
+ row so the pills stay readable. */
1077
+ @media (max-width: 720px) {
1078
+ .launch-toolbar {
1079
+ flex-direction: column;
1080
+ align-items: center;
1081
+ }
1082
+ .pill { justify-content: center; flex: 0 0 auto; }
1083
+ }
1084
+
1085
+ /* === Popover + Picker ============================================== */
1086
+ .popover-panel {
1087
+ position: fixed;
1088
+ z-index: 80;
1089
+ background: var(--bg-elev);
1090
+ border: 1px solid var(--border);
1091
+ border-radius: 10px;
1092
+ box-shadow: var(--shadow-lg);
1093
+ overflow: hidden;
1094
+ animation: popover-in .14s ease-out;
1095
+ }
1096
+ @keyframes popover-in {
1097
+ from { opacity: 0; transform: translateY(-4px); }
1098
+ to { opacity: 1; transform: translateY(0); }
1099
+ }
1100
+
1101
+ .picker {
1102
+ display: flex;
1103
+ flex-direction: column;
1104
+ max-height: min(60vh, 460px);
1105
+ }
1106
+ .picker-title {
1107
+ padding: 10px 14px 6px;
1108
+ font-size: 11px;
1109
+ color: var(--ink-muted);
1110
+ font-weight: 500;
1111
+ letter-spacing: 0;
1112
+ border-bottom: 1px solid var(--border-soft);
1113
+ }
1114
+ .picker-search {
1115
+ display: flex;
1116
+ align-items: center;
1117
+ gap: 8px;
1118
+ padding: 8px 12px;
1119
+ border-bottom: 1px solid var(--border-soft);
1120
+ }
1121
+ .picker-search-icon {
1122
+ display: inline-flex;
1123
+ align-items: center;
1124
+ color: var(--ink-faint);
1125
+ }
1126
+ .picker-search-icon svg { width: 14px; height: 14px; }
1127
+ .picker-search-input {
1128
+ flex: 1;
1129
+ appearance: none;
1130
+ background: transparent;
1131
+ border: 0;
1132
+ outline: none;
1133
+ padding: 4px 0;
1134
+ font: inherit;
1135
+ font-size: 13px;
1136
+ color: var(--ink);
1137
+ }
1138
+ .picker-search-input::placeholder { color: var(--ink-faint); }
1139
+ .picker-search-clear {
1140
+ appearance: none;
1141
+ background: transparent;
1142
+ border: 0;
1143
+ padding: 2px;
1144
+ cursor: pointer;
1145
+ color: var(--ink-muted);
1146
+ display: inline-flex;
1147
+ align-items: center;
1148
+ border-radius: 4px;
1149
+ }
1150
+ .picker-search-clear:hover { background: var(--sidebar-hover); color: var(--ink); }
1151
+ .picker-search-clear svg { width: 12px; height: 12px; }
1152
+
1153
+ .picker-list {
1154
+ overflow-y: auto;
1155
+ padding: 4px;
1156
+ flex: 1 1 auto;
1157
+ min-height: 0;
1158
+ }
1159
+ .picker-empty {
1160
+ padding: 18px 14px;
1161
+ font-size: 12.5px;
1162
+ color: var(--ink-muted);
1163
+ text-align: center;
1164
+ line-height: 1.5;
1165
+ }
1166
+ .picker-item {
1167
+ appearance: none;
1168
+ background: transparent;
1169
+ border: 0;
1170
+ width: 100%;
1171
+ text-align: left;
1172
+ display: flex;
1173
+ align-items: center;
1174
+ gap: 10px;
1175
+ padding: 7px 10px;
1176
+ border-radius: 6px;
1177
+ cursor: pointer;
1178
+ color: var(--ink);
1179
+ font: inherit;
1180
+ font-size: 13px;
1181
+ transition: background .1s ease;
1182
+ }
1183
+ .picker-item-wrap {
1184
+ position: relative;
1185
+ display: flex;
1186
+ align-items: center;
1187
+ }
1188
+ .picker-item-wrap.is-draggable { cursor: grab; }
1189
+ .picker-item-wrap.is-draggable:active { cursor: grabbing; }
1190
+ .picker-item-wrap[data-dnd-over="true"] {
1191
+ box-shadow: 0 -2px 0 var(--accent) inset;
1192
+ }
1193
+ .picker-item-grip {
1194
+ display: inline-flex;
1195
+ align-items: center;
1196
+ justify-content: center;
1197
+ width: 14px;
1198
+ margin-left: 2px;
1199
+ color: var(--ink-faint);
1200
+ font-size: 11px;
1201
+ letter-spacing: -1px;
1202
+ user-select: none;
1203
+ pointer-events: none;
1204
+ flex: 0 0 14px;
1205
+ }
1206
+ .picker-item:hover { background: var(--sidebar-hover); }
1207
+ .picker-item.is-selected {
1208
+ background: var(--sidebar-active);
1209
+ font-weight: 500;
1210
+ }
1211
+ .picker-item:disabled {
1212
+ opacity: 0.45;
1213
+ cursor: not-allowed;
1214
+ }
1215
+ .picker-item-icon {
1216
+ display: inline-flex;
1217
+ align-items: center;
1218
+ justify-content: center;
1219
+ width: 18px;
1220
+ height: 18px;
1221
+ flex: 0 0 18px;
1222
+ color: var(--ink-muted);
1223
+ }
1224
+ .picker-item-icon svg,
1225
+ .picker-item-icon img { width: 18px; height: 18px; display: block; }
1226
+ .picker-item-label {
1227
+ flex: 0 0 auto;
1228
+ white-space: nowrap;
1229
+ }
1230
+ .picker-item-meta {
1231
+ flex: 1 1 auto;
1232
+ min-width: 0;
1233
+ font-family: var(--mono);
1234
+ font-size: 11px;
1235
+ color: var(--ink-muted);
1236
+ overflow: hidden;
1237
+ text-overflow: ellipsis;
1238
+ white-space: nowrap;
1239
+ }
1240
+ .picker-item-check {
1241
+ margin-left: auto;
1242
+ font-size: 12px;
1243
+ color: var(--accent);
1244
+ flex: 0 0 auto;
1245
+ }
1246
+
1247
+ .picker-create {
1248
+ border-top: 1px solid var(--border-soft);
1249
+ padding: 6px;
1250
+ }
1251
+ .picker-create-toggle {
1252
+ appearance: none;
1253
+ background: transparent;
1254
+ border: 0;
1255
+ width: 100%;
1256
+ display: flex;
1257
+ align-items: center;
1258
+ gap: 8px;
1259
+ padding: 8px 10px;
1260
+ border-radius: 6px;
1261
+ cursor: pointer;
1262
+ color: var(--ink-mid);
1263
+ font: inherit;
1264
+ font-size: 12.5px;
1265
+ font-weight: 500;
1266
+ transition: background .1s ease, color .1s ease;
1267
+ }
1268
+ .picker-create-toggle:hover {
1269
+ background: var(--sidebar-hover);
1270
+ color: var(--ink);
1271
+ }
1272
+ .picker-create-toggle svg { width: 14px; height: 14px; }
1273
+
1274
+ .picker-create-form {
1275
+ padding: 10px;
1276
+ display: flex;
1277
+ flex-direction: column;
1278
+ gap: 8px;
1279
+ }
1280
+ .picker-field {
1281
+ display: flex;
1282
+ flex-direction: column;
1283
+ gap: 4px;
1284
+ }
1285
+ .picker-field-label {
1286
+ font-size: 11px;
1287
+ color: var(--ink-muted);
1288
+ font-weight: 500;
1289
+ }
1290
+ .picker-field .input {
1291
+ padding: 6px 10px;
1292
+ font-size: 12.5px;
1293
+ max-width: none;
1294
+ }
1295
+ .picker-create-actions {
1296
+ display: flex;
1297
+ justify-content: flex-end;
1298
+ gap: 6px;
1299
+ margin-top: 4px;
1300
+ }
1301
+
1302
+ /* --- Adopt (import existing CLI session) modal --------------------- */
1303
+ .adopt { display: flex; flex-direction: column; gap: 12px; }
1304
+
1305
+ .adopt-tabs {
1306
+ display: flex;
1307
+ align-items: center;
1308
+ gap: 4px;
1309
+ padding-bottom: 10px;
1310
+ border-bottom: 1px solid var(--border);
1311
+ }
1312
+ .adopt-tab {
1313
+ display: inline-flex;
1314
+ align-items: center;
1315
+ gap: 6px;
1316
+ padding: 6px 10px;
1317
+ border-radius: 999px;
1318
+ border: 1px solid transparent;
1319
+ background: transparent;
1320
+ font: inherit;
1321
+ color: var(--ink-mid);
1322
+ cursor: pointer;
1323
+ font-size: 12.5px;
1324
+ transition: background .12s ease, color .12s ease, border-color .12s ease;
1325
+ }
1326
+ .adopt-tab:hover { color: var(--ink); background: var(--bg); }
1327
+ .adopt-tab.is-active {
1328
+ background: var(--ink);
1329
+ border-color: var(--ink);
1330
+ color: #fff;
1331
+ font-weight: 500;
1332
+ }
1333
+ .adopt-tab.is-active .adopt-tab-count {
1334
+ background: rgba(255, 255, 255, 0.22);
1335
+ color: #fff;
1336
+ }
1337
+ .adopt-tab-icon { display: inline-flex; width: 16px; height: 16px; }
1338
+ .adopt-tab-icon svg { width: 100%; height: 100%; }
1339
+ .adopt-tab-count {
1340
+ display: inline-flex;
1341
+ align-items: center;
1342
+ justify-content: center;
1343
+ min-width: 18px;
1344
+ height: 16px;
1345
+ padding: 0 5px;
1346
+ border-radius: 999px;
1347
+ background: var(--bg);
1348
+ color: var(--ink-mid);
1349
+ font-size: 10.5px;
1350
+ font-weight: 600;
1351
+ font-variant-numeric: tabular-nums;
1352
+ }
1353
+ .adopt-icon-btn {
1354
+ appearance: none;
1355
+ margin-left: auto;
1356
+ display: inline-flex;
1357
+ align-items: center;
1358
+ justify-content: center;
1359
+ width: 28px;
1360
+ height: 28px;
1361
+ padding: 0;
1362
+ border: 1px solid var(--border);
1363
+ background: var(--bg-elev);
1364
+ color: var(--ink-mid);
1365
+ border-radius: 8px;
1366
+ cursor: pointer;
1367
+ transition: color .12s ease, border-color .12s ease, transform .3s ease;
1368
+ }
1369
+ .adopt-icon-btn:hover { color: var(--ink); border-color: var(--ink-faint); transform: rotate(90deg); }
1370
+
1371
+ /* Tools row: CLI picker pill + search input */
1372
+ .adopt-tools {
1373
+ display: flex;
1374
+ align-items: center;
1375
+ gap: 10px;
1376
+ flex-wrap: wrap;
1377
+ }
1378
+ .adopt-cli-pill {
1379
+ appearance: none;
1380
+ display: inline-flex;
1381
+ align-items: center;
1382
+ gap: 6px;
1383
+ padding: 5px 8px 5px 10px;
1384
+ height: 30px;
1385
+ border: 1px solid var(--border);
1386
+ border-radius: 8px;
1387
+ background: var(--bg-elev);
1388
+ color: var(--ink);
1389
+ font: inherit;
1390
+ font-size: 12px;
1391
+ cursor: pointer;
1392
+ transition: border-color .12s ease, background .12s ease;
1393
+ }
1394
+ .adopt-cli-pill:hover { border-color: var(--ink-faint); background: var(--bg); }
1395
+ .adopt-cli-pill.is-open { border-color: var(--ink); }
1396
+ .adopt-cli-pill-prefix { color: var(--ink-muted); font-size: 11.5px; }
1397
+ .adopt-cli-pill-icon {
1398
+ display: inline-flex; align-items: center; justify-content: center;
1399
+ width: 14px; height: 14px;
1400
+ }
1401
+ .adopt-cli-pill-icon svg { width: 100%; height: 100%; }
1402
+ .adopt-cli-pill-name { font-weight: 500; }
1403
+ .adopt-cli-pill > svg { color: var(--ink-faint); width: 12px; height: 12px; }
1404
+
1405
+ .adopt-search {
1406
+ position: relative;
1407
+ flex: 1 1 200px;
1408
+ min-width: 200px;
1409
+ }
1410
+ .adopt-search-icon {
1411
+ position: absolute;
1412
+ left: 9px;
1413
+ top: 50%;
1414
+ transform: translateY(-50%);
1415
+ display: inline-flex;
1416
+ color: var(--ink-faint);
1417
+ pointer-events: none;
1418
+ }
1419
+ .adopt-search-icon svg { width: 13px; height: 13px; }
1420
+ .adopt-search-input {
1421
+ appearance: none;
1422
+ width: 100%;
1423
+ height: 30px;
1424
+ padding: 0 28px 0 28px;
1425
+ border: 1px solid var(--border);
1426
+ border-radius: 8px;
1427
+ background: var(--bg-elev);
1428
+ color: var(--ink);
1429
+ font: inherit;
1430
+ font-size: 12px;
1431
+ outline: none;
1432
+ transition: border-color .12s ease;
1433
+ }
1434
+ .adopt-search-input:focus { border-color: var(--ink-faint); }
1435
+ .adopt-search-input:disabled { color: var(--ink-faint); }
1436
+ .adopt-search-clear {
1437
+ appearance: none;
1438
+ position: absolute;
1439
+ right: 6px;
1440
+ top: 50%;
1441
+ transform: translateY(-50%);
1442
+ border: 0;
1443
+ background: transparent;
1444
+ color: var(--ink-faint);
1445
+ padding: 4px;
1446
+ border-radius: 6px;
1447
+ cursor: pointer;
1448
+ display: inline-flex;
1449
+ }
1450
+ .adopt-search-clear:hover { color: var(--ink); background: var(--bg); }
1451
+ .adopt-search-clear svg { width: 11px; height: 11px; }
1452
+
1453
+ .adopt-body {
1454
+ min-height: 240px;
1455
+ max-height: 56vh;
1456
+ overflow: auto;
1457
+ margin: 0 -2px;
1458
+ padding: 0 2px;
1459
+ }
1460
+ .adopt-empty {
1461
+ padding: 48px 12px;
1462
+ text-align: center;
1463
+ color: var(--ink-muted);
1464
+ font-size: 12.5px;
1465
+ display: flex;
1466
+ flex-direction: column;
1467
+ align-items: center;
1468
+ gap: 10px;
1469
+ }
1470
+ .adopt-error { color: var(--danger); }
1471
+ .adopt-empty-mark {
1472
+ font-size: 24px;
1473
+ color: var(--ink-faint);
1474
+ width: 44px;
1475
+ height: 44px;
1476
+ border-radius: 50%;
1477
+ background: var(--bg);
1478
+ display: inline-flex;
1479
+ align-items: center;
1480
+ justify-content: center;
1481
+ border: 1px dashed var(--border);
1482
+ }
1483
+ .adopt-empty-spinner {
1484
+ width: 14px; height: 14px; border-radius: 50%;
1485
+ border: 1.6px solid var(--border);
1486
+ border-top-color: var(--ink-faint);
1487
+ animation: adopt-spin 0.8s linear infinite;
1488
+ display: inline-block;
1489
+ vertical-align: -2px;
1490
+ margin-right: 6px;
1491
+ }
1492
+ @keyframes adopt-spin { to { transform: rotate(360deg); } }
1493
+
1494
+ .adopt-list {
1495
+ list-style: none;
1496
+ margin: 0;
1497
+ padding: 0;
1498
+ display: flex;
1499
+ flex-direction: column;
1500
+ gap: 6px;
1501
+ }
1502
+ .adopt-row {
1503
+ display: flex;
1504
+ align-items: center;
1505
+ gap: 12px;
1506
+ padding: 10px 12px;
1507
+ border: 1px solid var(--border);
1508
+ background: var(--bg-elev);
1509
+ border-radius: 10px;
1510
+ transition: border-color .12s ease, background .12s ease, transform .12s ease;
1511
+ }
1512
+ .adopt-row:hover {
1513
+ border-color: var(--ink-faint);
1514
+ transform: translateY(-1px);
1515
+ }
1516
+ .adopt-row.is-adopted {
1517
+ opacity: 0.6;
1518
+ background: var(--bg);
1519
+ }
1520
+ .adopt-row.is-adopted:hover { transform: none; border-color: var(--border); }
1521
+ /* A session that a cli process currently has open. Subtle green tint +
1522
+ left bar to pull the eye, plus a "● live" pill before the title. */
1523
+ .adopt-row.is-active {
1524
+ border-color: rgba(74, 138, 74, 0.45);
1525
+ background: linear-gradient(180deg, rgba(74, 138, 74, 0.05), var(--bg-elev));
1526
+ box-shadow: inset 3px 0 0 0 var(--green);
1527
+ }
1528
+ .adopt-row.is-active:hover { border-color: rgba(74, 138, 74, 0.7); }
1529
+ .adopt-row-main { flex: 1 1 auto; min-width: 0; }
1530
+ .adopt-row-title {
1531
+ font-size: 13px;
1532
+ color: var(--ink);
1533
+ font-weight: 500;
1534
+ overflow: hidden;
1535
+ text-overflow: ellipsis;
1536
+ white-space: nowrap;
1537
+ line-height: 1.35;
1538
+ display: flex;
1539
+ align-items: center;
1540
+ gap: 8px;
1541
+ }
1542
+ .adopt-row-untitled { color: var(--ink-faint); font-weight: 400; font-style: italic; }
1543
+ .adopt-row-live {
1544
+ flex: 0 0 auto;
1545
+ display: inline-flex;
1546
+ align-items: center;
1547
+ gap: 4px;
1548
+ padding: 1px 7px;
1549
+ border-radius: 999px;
1550
+ font-size: 10.5px;
1551
+ font-weight: 600;
1552
+ letter-spacing: 0.02em;
1553
+ text-transform: uppercase;
1554
+ color: var(--green);
1555
+ background: rgba(74, 138, 74, 0.12);
1556
+ border: 1px solid rgba(74, 138, 74, 0.35);
1557
+ cursor: default;
1558
+ position: relative;
1559
+ /* Pulse is implemented via opacity on a pseudo-element instead of
1560
+ animating box-shadow — opacity is GPU-composited, box-shadow forces
1561
+ a paint every frame. With 12+ live rows the old version pegged the
1562
+ paint thread and made the whole modal feel stuck. */
1563
+ }
1564
+ .adopt-row-live::before {
1565
+ content: "";
1566
+ position: absolute;
1567
+ inset: -3px;
1568
+ border-radius: 999px;
1569
+ border: 1px solid rgba(74, 138, 74, 0.5);
1570
+ opacity: 0;
1571
+ animation: adopt-live-pulse 1.8s ease-in-out infinite;
1572
+ pointer-events: none;
1573
+ }
1574
+ @keyframes adopt-live-pulse {
1575
+ 0%, 100% { opacity: 0.6; transform: scale(0.95); }
1576
+ 50% { opacity: 0; transform: scale(1.15); }
1577
+ }
1578
+
1579
+ .adopt-loadmore {
1580
+ display: flex;
1581
+ justify-content: center;
1582
+ padding: 12px 0 4px;
1583
+ }
1584
+ .adopt-loadmore-done,
1585
+ .adopt-loadmore-hint {
1586
+ font-size: 11.5px;
1587
+ color: var(--ink-muted);
1588
+ font-style: italic;
1589
+ text-align: center;
1590
+ }
1591
+ .adopt-loadmore .action {
1592
+ font-size: 12px;
1593
+ font-family: var(--mono);
1594
+ font-variant-numeric: tabular-nums;
1595
+ }
1596
+ .adopt-row-meta {
1597
+ display: flex;
1598
+ align-items: center;
1599
+ font-size: 11px;
1600
+ color: var(--ink-muted);
1601
+ margin-top: 4px;
1602
+ white-space: nowrap;
1603
+ overflow: hidden;
1604
+ }
1605
+ .adopt-row-path {
1606
+ min-width: 0;
1607
+ overflow: hidden;
1608
+ text-overflow: ellipsis;
1609
+ white-space: nowrap;
1610
+ flex: 0 1 auto;
1611
+ }
1612
+ .adopt-row-dot { margin: 0 8px; color: var(--ink-faint); }
1613
+ .adopt-row-id { color: var(--ink-faint); }
1614
+ .adopt-row-actions {
1615
+ display: flex;
1616
+ align-items: center;
1617
+ gap: 6px;
1618
+ flex: 0 0 auto;
1619
+ }
1620
+ .adopt-row-btn { padding: 6px 14px; font-size: 12px; }
1621
+ .adopt-row-badge {
1622
+ font-size: 11px;
1623
+ color: var(--ink-muted);
1624
+ padding: 5px 12px;
1625
+ border-radius: 999px;
1626
+ background: var(--bg);
1627
+ border: 1px solid var(--border);
1628
+ }