@bakapiano/ccsm 0.20.2 → 0.21.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.
- package/lib/codexSeed.js +23 -8
- package/lib/config.js +3 -3
- package/lib/localCliSessions.js +102 -72
- package/lib/webTerminal.js +7 -1
- package/lib/winPath.js +67 -0
- package/package.json +1 -1
- package/public/css/responsive.css +16 -0
- package/public/css/terminals.css +26 -38
- package/public/css/widgets.css +114 -86
- package/public/js/components/AdoptModal.js +168 -250
- package/public/js/components/TerminalView.js +42 -16
- package/public/js/pages/ConfigurePage.js +1 -1
- package/public/js/pages/LaunchPage.js +1 -1
- package/server.js +20 -3
package/public/css/widgets.css
CHANGED
|
@@ -1079,7 +1079,10 @@
|
|
|
1079
1079
|
/* === Popover + Picker ============================================== */
|
|
1080
1080
|
.popover-panel {
|
|
1081
1081
|
position: fixed;
|
|
1082
|
-
|
|
1082
|
+
/* Above the modal backdrop (200) so pickers opened from inside a modal
|
|
1083
|
+
— e.g. "Import as" in the adopt modal — float on top, not behind it.
|
|
1084
|
+
Still below toasts (1200). */
|
|
1085
|
+
z-index: 250;
|
|
1083
1086
|
background: var(--bg-elev);
|
|
1084
1087
|
border: 1px solid var(--border);
|
|
1085
1088
|
border-radius: 10px;
|
|
@@ -1294,59 +1297,66 @@
|
|
|
1294
1297
|
}
|
|
1295
1298
|
|
|
1296
1299
|
/* --- Adopt (import existing CLI session) modal --------------------- */
|
|
1297
|
-
|
|
1300
|
+
/* Fills the (flush, scrolling) modal body: a pinned head (tabs + tools)
|
|
1301
|
+
and a scrolling list below it; pagination lives in the modal footer. */
|
|
1302
|
+
.adopt { display: flex; flex-direction: column; min-height: 360px; }
|
|
1298
1303
|
|
|
1304
|
+
.adopt-head {
|
|
1305
|
+
position: sticky;
|
|
1306
|
+
top: 0;
|
|
1307
|
+
z-index: 2;
|
|
1308
|
+
display: flex;
|
|
1309
|
+
flex-direction: column;
|
|
1310
|
+
gap: 12px;
|
|
1311
|
+
padding: 14px 18px 12px;
|
|
1312
|
+
background: var(--bg-elev);
|
|
1313
|
+
border-bottom: 1px solid var(--border-soft);
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
/* Underline tab bar (was solid pills) — calmer, matches the app. */
|
|
1299
1317
|
.adopt-tabs {
|
|
1300
1318
|
display: flex;
|
|
1301
1319
|
align-items: center;
|
|
1302
|
-
gap:
|
|
1303
|
-
padding-bottom: 10px;
|
|
1304
|
-
border-bottom: 1px solid var(--border);
|
|
1320
|
+
gap: 2px;
|
|
1305
1321
|
}
|
|
1306
1322
|
.adopt-tab {
|
|
1323
|
+
appearance: none;
|
|
1307
1324
|
display: inline-flex;
|
|
1308
1325
|
align-items: center;
|
|
1309
|
-
gap:
|
|
1310
|
-
padding: 6px
|
|
1311
|
-
border-radius: 999px;
|
|
1312
|
-
border: 1px solid transparent;
|
|
1326
|
+
gap: 7px;
|
|
1327
|
+
padding: 6px 11px 8px;
|
|
1313
1328
|
background: transparent;
|
|
1329
|
+
border: 0;
|
|
1330
|
+
border-bottom: 2px solid transparent;
|
|
1314
1331
|
font: inherit;
|
|
1315
|
-
|
|
1332
|
+
font-size: 13px;
|
|
1333
|
+
font-weight: 500;
|
|
1334
|
+
color: var(--ink-muted);
|
|
1316
1335
|
cursor: pointer;
|
|
1317
|
-
|
|
1318
|
-
transition: background .12s ease, color .12s ease, border-color .12s ease;
|
|
1336
|
+
transition: color .12s ease, border-color .12s ease;
|
|
1319
1337
|
}
|
|
1320
|
-
.adopt-tab:hover { color: var(--ink);
|
|
1338
|
+
.adopt-tab:hover { color: var(--ink); }
|
|
1321
1339
|
.adopt-tab.is-active {
|
|
1322
|
-
|
|
1323
|
-
border-color: var(--ink);
|
|
1324
|
-
/* var(--bg-elev), not #fff — the slab is var(--ink), which is LIGHT in
|
|
1325
|
-
dark mode, so white text would be invisible. --bg-elev tracks it. */
|
|
1326
|
-
color: var(--bg-elev);
|
|
1327
|
-
font-weight: 500;
|
|
1328
|
-
}
|
|
1329
|
-
.adopt-tab.is-active .adopt-tab-count {
|
|
1330
|
-
background: color-mix(in srgb, var(--bg-elev) 22%, transparent);
|
|
1331
|
-
color: var(--bg-elev);
|
|
1340
|
+
color: var(--ink);
|
|
1341
|
+
border-bottom-color: var(--ink);
|
|
1332
1342
|
}
|
|
1333
1343
|
.adopt-tab-icon { display: inline-flex; width: 16px; height: 16px; }
|
|
1334
|
-
.adopt-tab-icon svg { width: 100%; height: 100%; }
|
|
1344
|
+
.adopt-tab-icon svg, .adopt-tab-icon img { width: 100%; height: 100%; }
|
|
1335
1345
|
.adopt-tab-count {
|
|
1336
1346
|
display: inline-flex;
|
|
1337
1347
|
align-items: center;
|
|
1338
1348
|
justify-content: center;
|
|
1339
|
-
min-width:
|
|
1349
|
+
min-width: 17px;
|
|
1340
1350
|
height: 16px;
|
|
1341
1351
|
padding: 0 5px;
|
|
1342
1352
|
border-radius: 999px;
|
|
1343
|
-
background: var(--bg);
|
|
1353
|
+
background: var(--ui-bg);
|
|
1344
1354
|
color: var(--ink-mid);
|
|
1345
1355
|
font-size: 10.5px;
|
|
1346
1356
|
font-weight: 600;
|
|
1347
1357
|
font-variant-numeric: tabular-nums;
|
|
1348
1358
|
}
|
|
1349
|
-
.adopt-
|
|
1359
|
+
.adopt-rescan {
|
|
1350
1360
|
appearance: none;
|
|
1351
1361
|
margin-left: auto;
|
|
1352
1362
|
display: inline-flex;
|
|
@@ -1357,12 +1367,13 @@
|
|
|
1357
1367
|
padding: 0;
|
|
1358
1368
|
border: 1px solid var(--border);
|
|
1359
1369
|
background: var(--bg-elev);
|
|
1360
|
-
color: var(--ink-
|
|
1370
|
+
color: var(--ink-muted);
|
|
1361
1371
|
border-radius: 8px;
|
|
1362
1372
|
cursor: pointer;
|
|
1363
1373
|
transition: color .12s ease, border-color .12s ease, transform .3s ease;
|
|
1364
1374
|
}
|
|
1365
|
-
.adopt-
|
|
1375
|
+
.adopt-rescan:hover { color: var(--ink); border-color: var(--ink-faint); transform: rotate(90deg); }
|
|
1376
|
+
.adopt-rescan svg { width: 14px; height: 14px; }
|
|
1366
1377
|
|
|
1367
1378
|
/* Tools row: CLI picker pill + search input */
|
|
1368
1379
|
.adopt-tools {
|
|
@@ -1446,12 +1457,10 @@
|
|
|
1446
1457
|
.adopt-search-clear:hover { color: var(--ink); background: var(--bg); }
|
|
1447
1458
|
.adopt-search-clear svg { width: 11px; height: 11px; }
|
|
1448
1459
|
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
margin: 0 -2px;
|
|
1454
|
-
padding: 0 2px;
|
|
1460
|
+
/* The list scrolls inside the modal body now (not its own overflow box);
|
|
1461
|
+
this is just the padded wrapper. */
|
|
1462
|
+
.adopt-list {
|
|
1463
|
+
padding: 12px 18px 16px;
|
|
1455
1464
|
}
|
|
1456
1465
|
.adopt-empty {
|
|
1457
1466
|
padding: 48px 12px;
|
|
@@ -1487,7 +1496,7 @@
|
|
|
1487
1496
|
}
|
|
1488
1497
|
@keyframes adopt-spin { to { transform: rotate(360deg); } }
|
|
1489
1498
|
|
|
1490
|
-
.adopt-
|
|
1499
|
+
.adopt-rows {
|
|
1491
1500
|
list-style: none;
|
|
1492
1501
|
margin: 0;
|
|
1493
1502
|
padding: 0;
|
|
@@ -1498,13 +1507,26 @@
|
|
|
1498
1507
|
.adopt-row {
|
|
1499
1508
|
display: flex;
|
|
1500
1509
|
align-items: center;
|
|
1501
|
-
gap:
|
|
1510
|
+
gap: 11px;
|
|
1502
1511
|
padding: 10px 12px;
|
|
1503
1512
|
border: 1px solid var(--border);
|
|
1504
1513
|
background: var(--bg-elev);
|
|
1505
1514
|
border-radius: 10px;
|
|
1506
1515
|
transition: border-color .12s ease, background .12s ease, transform .12s ease;
|
|
1507
1516
|
}
|
|
1517
|
+
.adopt-row-icon {
|
|
1518
|
+
position: relative;
|
|
1519
|
+
flex: 0 0 auto;
|
|
1520
|
+
display: inline-flex;
|
|
1521
|
+
align-items: center;
|
|
1522
|
+
justify-content: center;
|
|
1523
|
+
width: 30px;
|
|
1524
|
+
height: 30px;
|
|
1525
|
+
border-radius: 8px;
|
|
1526
|
+
background: var(--bg);
|
|
1527
|
+
border: 1px solid var(--border-soft);
|
|
1528
|
+
}
|
|
1529
|
+
.adopt-row-icon svg, .adopt-row-icon img { width: 17px; height: 17px; }
|
|
1508
1530
|
.adopt-row:hover {
|
|
1509
1531
|
border-color: var(--ink-faint);
|
|
1510
1532
|
transform: translateY(-1px);
|
|
@@ -1514,14 +1536,50 @@
|
|
|
1514
1536
|
background: var(--bg);
|
|
1515
1537
|
}
|
|
1516
1538
|
.adopt-row.is-adopted:hover { transform: none; border-color: var(--border); }
|
|
1517
|
-
/* A session
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1539
|
+
/* A session a cli process currently has open. Quiet treatment: the row
|
|
1540
|
+
itself stays neutral (many rows can be live at once — a wall of green
|
|
1541
|
+
slabs is noise) and the "alive" signal rides on the icon as a small
|
|
1542
|
+
green presence dot, the way a chat avatar shows online. The icon tile
|
|
1543
|
+
picks up a faint green tint + green glyph so the eye still lands. */
|
|
1544
|
+
.adopt-row.is-active .adopt-row-icon {
|
|
1545
|
+
border-color: rgba(74, 138, 74, 0.4);
|
|
1546
|
+
background: rgba(74, 138, 74, 0.1);
|
|
1547
|
+
color: var(--green);
|
|
1548
|
+
}
|
|
1549
|
+
/* Static dot — punched out of the card with a bg-elev ring so it reads as
|
|
1550
|
+
a badge sitting on the icon corner. */
|
|
1551
|
+
.adopt-row.is-active .adopt-row-icon::after {
|
|
1552
|
+
content: "";
|
|
1553
|
+
position: absolute;
|
|
1554
|
+
right: -3px;
|
|
1555
|
+
bottom: -3px;
|
|
1556
|
+
width: 10px;
|
|
1557
|
+
height: 10px;
|
|
1558
|
+
border-radius: 50%;
|
|
1559
|
+
background: var(--green);
|
|
1560
|
+
border: 2px solid var(--bg-elev);
|
|
1561
|
+
}
|
|
1562
|
+
/* Soft presence pulse — a ring expanding off the dot. Opacity-animated on
|
|
1563
|
+
its own layer so it stays GPU-cheap even with a dozen live rows (the old
|
|
1564
|
+
box-shadow pulse pegged the paint thread). */
|
|
1565
|
+
.adopt-row.is-active .adopt-row-icon::before {
|
|
1566
|
+
content: "";
|
|
1567
|
+
position: absolute;
|
|
1568
|
+
right: -1px;
|
|
1569
|
+
bottom: -1px;
|
|
1570
|
+
width: 6px;
|
|
1571
|
+
height: 6px;
|
|
1572
|
+
border-radius: 50%;
|
|
1573
|
+
border: 1px solid var(--green);
|
|
1574
|
+
opacity: 0;
|
|
1575
|
+
animation: adopt-live-pulse 1.9s ease-in-out infinite;
|
|
1576
|
+
pointer-events: none;
|
|
1577
|
+
z-index: 1;
|
|
1578
|
+
}
|
|
1579
|
+
@keyframes adopt-live-pulse {
|
|
1580
|
+
0% { opacity: 0.55; transform: scale(0.8); }
|
|
1581
|
+
70%, 100% { opacity: 0; transform: scale(2.6); }
|
|
1582
|
+
}
|
|
1525
1583
|
.adopt-row-main { flex: 1 1 auto; min-width: 0; }
|
|
1526
1584
|
.adopt-row-title {
|
|
1527
1585
|
font-size: 13px;
|
|
@@ -1536,59 +1594,29 @@
|
|
|
1536
1594
|
gap: 8px;
|
|
1537
1595
|
}
|
|
1538
1596
|
.adopt-row-untitled { color: var(--ink-faint); font-weight: 400; font-style: italic; }
|
|
1597
|
+
/* Minimal caption next to the title — the dot carries the signal, this
|
|
1598
|
+
just names it. No pill, no border, no ring. */
|
|
1539
1599
|
.adopt-row-live {
|
|
1540
1600
|
flex: 0 0 auto;
|
|
1541
|
-
|
|
1542
|
-
align-items: center;
|
|
1543
|
-
gap: 4px;
|
|
1544
|
-
padding: 1px 7px;
|
|
1545
|
-
border-radius: 999px;
|
|
1546
|
-
font-size: 10.5px;
|
|
1601
|
+
font-size: 10px;
|
|
1547
1602
|
font-weight: 600;
|
|
1548
|
-
letter-spacing: 0.
|
|
1603
|
+
letter-spacing: 0.05em;
|
|
1549
1604
|
text-transform: uppercase;
|
|
1550
1605
|
color: var(--green);
|
|
1551
|
-
background: rgba(74, 138, 74, 0.12);
|
|
1552
|
-
border: 1px solid rgba(74, 138, 74, 0.35);
|
|
1553
1606
|
cursor: default;
|
|
1554
|
-
position: relative;
|
|
1555
|
-
/* Pulse is implemented via opacity on a pseudo-element instead of
|
|
1556
|
-
animating box-shadow — opacity is GPU-composited, box-shadow forces
|
|
1557
|
-
a paint every frame. With 12+ live rows the old version pegged the
|
|
1558
|
-
paint thread and made the whole modal feel stuck. */
|
|
1559
|
-
}
|
|
1560
|
-
.adopt-row-live::before {
|
|
1561
|
-
content: "";
|
|
1562
|
-
position: absolute;
|
|
1563
|
-
inset: -3px;
|
|
1564
|
-
border-radius: 999px;
|
|
1565
|
-
border: 1px solid rgba(74, 138, 74, 0.5);
|
|
1566
|
-
opacity: 0;
|
|
1567
|
-
animation: adopt-live-pulse 1.8s ease-in-out infinite;
|
|
1568
|
-
pointer-events: none;
|
|
1569
|
-
}
|
|
1570
|
-
@keyframes adopt-live-pulse {
|
|
1571
|
-
0%, 100% { opacity: 0.6; transform: scale(0.95); }
|
|
1572
|
-
50% { opacity: 0; transform: scale(1.15); }
|
|
1573
1607
|
}
|
|
1574
1608
|
|
|
1575
|
-
.
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
}
|
|
1580
|
-
.adopt-loadmore-done,
|
|
1581
|
-
.adopt-loadmore-hint {
|
|
1582
|
-
font-size: 11.5px;
|
|
1583
|
-
color: var(--ink-muted);
|
|
1584
|
-
font-style: italic;
|
|
1609
|
+
/* Footer pagination (rendered into .modal-foot): ‹ Prev · X–Y of Z · Next ›.
|
|
1610
|
+
The flex:1 info pushes the two buttons to the edges and centres the count. */
|
|
1611
|
+
.adopt-pager-info {
|
|
1612
|
+
flex: 1;
|
|
1585
1613
|
text-align: center;
|
|
1586
|
-
}
|
|
1587
|
-
.adopt-loadmore .action {
|
|
1588
1614
|
font-size: 12px;
|
|
1589
|
-
|
|
1615
|
+
color: var(--ink-muted);
|
|
1590
1616
|
font-variant-numeric: tabular-nums;
|
|
1591
1617
|
}
|
|
1618
|
+
.adopt-pager-btn { min-width: 78px; gap: 4px; }
|
|
1619
|
+
.adopt-pager-btn svg { width: 13px; height: 13px; }
|
|
1592
1620
|
.adopt-row-meta {
|
|
1593
1621
|
display: flex;
|
|
1594
1622
|
align-items: center;
|