@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.
@@ -1079,7 +1079,10 @@
1079
1079
  /* === Popover + Picker ============================================== */
1080
1080
  .popover-panel {
1081
1081
  position: fixed;
1082
- z-index: 80;
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
- .adopt { display: flex; flex-direction: column; gap: 12px; }
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: 4px;
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: 6px;
1310
- padding: 6px 10px;
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
- color: var(--ink-mid);
1332
+ font-size: 13px;
1333
+ font-weight: 500;
1334
+ color: var(--ink-muted);
1316
1335
  cursor: pointer;
1317
- font-size: 12.5px;
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); background: var(--bg); }
1338
+ .adopt-tab:hover { color: var(--ink); }
1321
1339
  .adopt-tab.is-active {
1322
- background: var(--ink);
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: 18px;
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-icon-btn {
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-mid);
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-icon-btn:hover { color: var(--ink); border-color: var(--ink-faint); transform: rotate(90deg); }
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
- .adopt-body {
1450
- min-height: 240px;
1451
- max-height: 56vh;
1452
- overflow: auto;
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-list {
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: 12px;
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 that a cli process currently has open. Subtle green tint +
1518
- left bar to pull the eye, plus a "● live" pill before the title. */
1519
- .adopt-row.is-active {
1520
- border-color: rgba(74, 138, 74, 0.45);
1521
- background: linear-gradient(180deg, rgba(74, 138, 74, 0.05), var(--bg-elev));
1522
- box-shadow: inset 3px 0 0 0 var(--green);
1523
- }
1524
- .adopt-row.is-active:hover { border-color: rgba(74, 138, 74, 0.7); }
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
- display: inline-flex;
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.02em;
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
- .adopt-loadmore {
1576
- display: flex;
1577
- justify-content: center;
1578
- padding: 12px 0 4px;
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
- font-family: var(--mono);
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;