@bakapiano/ccsm 0.20.1 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -125,49 +125,37 @@
125
125
  min-height: 0;
126
126
  width: 100%;
127
127
  /* IME composition (Chinese/Japanese pinyin) lives in absolutely-positioned
128
- .xterm-helper-textarea + .composition-view that grow with the composed
129
- string. Near the right edge they overflow the viewport and trigger a
130
- horizontal scrollbar that visually "pushes" the layout. Clip here so
131
- the overflow is silently absorbed instead of expanding the page.
132
- Do NOT touch the textarea/composition-view's own text properties —
133
- xterm relies on their single-line behaviour to keep IME events firing
134
- correctly (forcing pre-wrap / break-all eats compositionupdate events
128
+ .xterm-helper-textarea + .composition-view at the cursor. xterm 5.5 caps
129
+ the view's width to the remaining columns, but as a belt-and-braces guard
130
+ we still clip here so any residual right-edge overflow is absorbed rather
131
+ than expanding the page (it used to trigger a horizontal scrollbar that
132
+ "pushed" the layout). Do NOT touch the textarea/composition-view's own
133
+ text properties — xterm relies on their single-line behaviour to keep IME
134
+ events firing (forcing pre-wrap / break-all eats compositionupdate events
135
135
  in Chromium and Chinese input stops working entirely). */
136
136
  overflow: hidden;
137
137
  contain: layout;
138
138
  }
139
- /* While the user is composing (IME), pin the helper textarea to the right
140
- edge of the terminal so it grows leftward instead of pushing the layout
141
- rightward. Only touches positioning NOT width / wrap / max-width, which
142
- would break Chromium's compositionupdate event flow and stop Chinese
143
- input from working. The class is toggled by TerminalView.js. */
144
- .terminal-host.is-composing .xterm-helper-textarea {
145
- left: auto !important;
146
- right: 0 !important;
147
- text-align: right;
148
- /* xterm un-hides the textarea during composition so the user can see the
149
- composed string inline. We've moved it to the right edge to stop it
150
- pushing layout — but that means the composed pinyin would now visibly
151
- appear on the right. Hide its glyphs (caret + text) so the user only
152
- sees the OS-native IME candidate popup, which floats independently
153
- and is unaffected. */
154
- color: transparent !important;
155
- caret-color: transparent !important;
156
- background: transparent !important;
157
- text-shadow: none !important;
158
- }
159
- /* xterm also overlays a .composition-view (a small box at the cursor with
160
- the in-progress string + a gold caret using THEME.cursor). We can't
161
- display:none it — Chromium needs it in the layout tree to keep the IME
162
- compositionupdate events flowing — but we can make it visually invisible
163
- while leaving it laid out. */
139
+ /* IME composition box. While you're typing pinyin before committing the
140
+ Chinese characters xterm writes the in-progress string into
141
+ .composition-view at the cursor. VSCode's terminal shows this box in the
142
+ terminal's own colours; we do the same. An earlier version hid it outright
143
+ (opacity:0) to dodge a layout push, which is why the typed letters were
144
+ invisible — but the host's overflow:hidden + contain:layout above already
145
+ absorb any overflow, and xterm caps the box width, so hiding it was both
146
+ unnecessary and the bug. The helper textarea is left exactly where xterm
147
+ puts it (at the cursor, opacity:0) so the OS IME candidate popup anchors
148
+ correctly we no longer move or restyle it. */
164
149
  .terminal-host .composition-view {
165
- opacity: 0 !important;
166
- color: transparent !important;
167
- background: transparent !important;
168
- border-color: transparent !important;
169
- box-shadow: none !important;
170
- pointer-events: none;
150
+ /* !important to beat xterm.css's own `.xterm .composition-view`
151
+ (#000/#FFF, same specificity, loaded after us). var() still re-resolves
152
+ per theme, so this tracks light/dark automatically. */
153
+ background: var(--term-surface) !important;
154
+ color: var(--term-on) !important;
155
+ border: 1px solid var(--accent);
156
+ border-radius: 3px;
157
+ padding: 0 3px;
158
+ z-index: 5;
171
159
  }
172
160
  /* Don't override xterm's background — its renderer (canvas/WebGL) assumes
173
161
  an opaque surface and ghosts on scroll if we force transparent. The
@@ -415,15 +415,6 @@
415
415
  }
416
416
  .workdir-detail .filex-body { height: 320px; }
417
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
418
 
428
419
  .icon-radio-sub {
429
420
  font-size: 11px;
@@ -981,13 +972,9 @@
981
972
  gap: 8px;
982
973
  padding: 4px 0;
983
974
  }
984
- .entity-form-actions {
985
- display: flex;
986
- justify-content: flex-end;
987
- gap: 6px;
988
- margin-top: 4px;
989
- }
990
- .entity-test-button { margin-right: auto; }
975
+ /* EntityFormModal's actions live in the modal footer (.modal-foot) now;
976
+ this keeps the Test button pushed to the left of Cancel/Save there. */
977
+ .modal-foot .entity-test-button { margin-right: auto; }
991
978
 
992
979
  .entity-test-result {
993
980
  margin-top: 4px;
@@ -1092,7 +1079,10 @@
1092
1079
  /* === Popover + Picker ============================================== */
1093
1080
  .popover-panel {
1094
1081
  position: fixed;
1095
- 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;
1096
1086
  background: var(--bg-elev);
1097
1087
  border: 1px solid var(--border);
1098
1088
  border-radius: 10px;
@@ -1307,59 +1297,66 @@
1307
1297
  }
1308
1298
 
1309
1299
  /* --- Adopt (import existing CLI session) modal --------------------- */
1310
- .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; }
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
+ }
1311
1315
 
1316
+ /* Underline tab bar (was solid pills) — calmer, matches the app. */
1312
1317
  .adopt-tabs {
1313
1318
  display: flex;
1314
1319
  align-items: center;
1315
- gap: 4px;
1316
- padding-bottom: 10px;
1317
- border-bottom: 1px solid var(--border);
1320
+ gap: 2px;
1318
1321
  }
1319
1322
  .adopt-tab {
1323
+ appearance: none;
1320
1324
  display: inline-flex;
1321
1325
  align-items: center;
1322
- gap: 6px;
1323
- padding: 6px 10px;
1324
- border-radius: 999px;
1325
- border: 1px solid transparent;
1326
+ gap: 7px;
1327
+ padding: 6px 11px 8px;
1326
1328
  background: transparent;
1329
+ border: 0;
1330
+ border-bottom: 2px solid transparent;
1327
1331
  font: inherit;
1328
- color: var(--ink-mid);
1332
+ font-size: 13px;
1333
+ font-weight: 500;
1334
+ color: var(--ink-muted);
1329
1335
  cursor: pointer;
1330
- font-size: 12.5px;
1331
- transition: background .12s ease, color .12s ease, border-color .12s ease;
1336
+ transition: color .12s ease, border-color .12s ease;
1332
1337
  }
1333
- .adopt-tab:hover { color: var(--ink); background: var(--bg); }
1338
+ .adopt-tab:hover { color: var(--ink); }
1334
1339
  .adopt-tab.is-active {
1335
- background: var(--ink);
1336
- border-color: var(--ink);
1337
- /* var(--bg-elev), not #fff — the slab is var(--ink), which is LIGHT in
1338
- dark mode, so white text would be invisible. --bg-elev tracks it. */
1339
- color: var(--bg-elev);
1340
- font-weight: 500;
1341
- }
1342
- .adopt-tab.is-active .adopt-tab-count {
1343
- background: color-mix(in srgb, var(--bg-elev) 22%, transparent);
1344
- color: var(--bg-elev);
1340
+ color: var(--ink);
1341
+ border-bottom-color: var(--ink);
1345
1342
  }
1346
1343
  .adopt-tab-icon { display: inline-flex; width: 16px; height: 16px; }
1347
- .adopt-tab-icon svg { width: 100%; height: 100%; }
1344
+ .adopt-tab-icon svg, .adopt-tab-icon img { width: 100%; height: 100%; }
1348
1345
  .adopt-tab-count {
1349
1346
  display: inline-flex;
1350
1347
  align-items: center;
1351
1348
  justify-content: center;
1352
- min-width: 18px;
1349
+ min-width: 17px;
1353
1350
  height: 16px;
1354
1351
  padding: 0 5px;
1355
1352
  border-radius: 999px;
1356
- background: var(--bg);
1353
+ background: var(--ui-bg);
1357
1354
  color: var(--ink-mid);
1358
1355
  font-size: 10.5px;
1359
1356
  font-weight: 600;
1360
1357
  font-variant-numeric: tabular-nums;
1361
1358
  }
1362
- .adopt-icon-btn {
1359
+ .adopt-rescan {
1363
1360
  appearance: none;
1364
1361
  margin-left: auto;
1365
1362
  display: inline-flex;
@@ -1370,12 +1367,13 @@
1370
1367
  padding: 0;
1371
1368
  border: 1px solid var(--border);
1372
1369
  background: var(--bg-elev);
1373
- color: var(--ink-mid);
1370
+ color: var(--ink-muted);
1374
1371
  border-radius: 8px;
1375
1372
  cursor: pointer;
1376
1373
  transition: color .12s ease, border-color .12s ease, transform .3s ease;
1377
1374
  }
1378
- .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; }
1379
1377
 
1380
1378
  /* Tools row: CLI picker pill + search input */
1381
1379
  .adopt-tools {
@@ -1459,12 +1457,10 @@
1459
1457
  .adopt-search-clear:hover { color: var(--ink); background: var(--bg); }
1460
1458
  .adopt-search-clear svg { width: 11px; height: 11px; }
1461
1459
 
1462
- .adopt-body {
1463
- min-height: 240px;
1464
- max-height: 56vh;
1465
- overflow: auto;
1466
- margin: 0 -2px;
1467
- 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;
1468
1464
  }
1469
1465
  .adopt-empty {
1470
1466
  padding: 48px 12px;
@@ -1500,7 +1496,7 @@
1500
1496
  }
1501
1497
  @keyframes adopt-spin { to { transform: rotate(360deg); } }
1502
1498
 
1503
- .adopt-list {
1499
+ .adopt-rows {
1504
1500
  list-style: none;
1505
1501
  margin: 0;
1506
1502
  padding: 0;
@@ -1511,13 +1507,26 @@
1511
1507
  .adopt-row {
1512
1508
  display: flex;
1513
1509
  align-items: center;
1514
- gap: 12px;
1510
+ gap: 11px;
1515
1511
  padding: 10px 12px;
1516
1512
  border: 1px solid var(--border);
1517
1513
  background: var(--bg-elev);
1518
1514
  border-radius: 10px;
1519
1515
  transition: border-color .12s ease, background .12s ease, transform .12s ease;
1520
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; }
1521
1530
  .adopt-row:hover {
1522
1531
  border-color: var(--ink-faint);
1523
1532
  transform: translateY(-1px);
@@ -1527,14 +1536,50 @@
1527
1536
  background: var(--bg);
1528
1537
  }
1529
1538
  .adopt-row.is-adopted:hover { transform: none; border-color: var(--border); }
1530
- /* A session that a cli process currently has open. Subtle green tint +
1531
- left bar to pull the eye, plus a "● live" pill before the title. */
1532
- .adopt-row.is-active {
1533
- border-color: rgba(74, 138, 74, 0.45);
1534
- background: linear-gradient(180deg, rgba(74, 138, 74, 0.05), var(--bg-elev));
1535
- box-shadow: inset 3px 0 0 0 var(--green);
1536
- }
1537
- .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
+ }
1538
1583
  .adopt-row-main { flex: 1 1 auto; min-width: 0; }
1539
1584
  .adopt-row-title {
1540
1585
  font-size: 13px;
@@ -1549,59 +1594,29 @@
1549
1594
  gap: 8px;
1550
1595
  }
1551
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. */
1552
1599
  .adopt-row-live {
1553
1600
  flex: 0 0 auto;
1554
- display: inline-flex;
1555
- align-items: center;
1556
- gap: 4px;
1557
- padding: 1px 7px;
1558
- border-radius: 999px;
1559
- font-size: 10.5px;
1601
+ font-size: 10px;
1560
1602
  font-weight: 600;
1561
- letter-spacing: 0.02em;
1603
+ letter-spacing: 0.05em;
1562
1604
  text-transform: uppercase;
1563
1605
  color: var(--green);
1564
- background: rgba(74, 138, 74, 0.12);
1565
- border: 1px solid rgba(74, 138, 74, 0.35);
1566
1606
  cursor: default;
1567
- position: relative;
1568
- /* Pulse is implemented via opacity on a pseudo-element instead of
1569
- animating box-shadow — opacity is GPU-composited, box-shadow forces
1570
- a paint every frame. With 12+ live rows the old version pegged the
1571
- paint thread and made the whole modal feel stuck. */
1572
- }
1573
- .adopt-row-live::before {
1574
- content: "";
1575
- position: absolute;
1576
- inset: -3px;
1577
- border-radius: 999px;
1578
- border: 1px solid rgba(74, 138, 74, 0.5);
1579
- opacity: 0;
1580
- animation: adopt-live-pulse 1.8s ease-in-out infinite;
1581
- pointer-events: none;
1582
- }
1583
- @keyframes adopt-live-pulse {
1584
- 0%, 100% { opacity: 0.6; transform: scale(0.95); }
1585
- 50% { opacity: 0; transform: scale(1.15); }
1586
1607
  }
1587
1608
 
1588
- .adopt-loadmore {
1589
- display: flex;
1590
- justify-content: center;
1591
- padding: 12px 0 4px;
1592
- }
1593
- .adopt-loadmore-done,
1594
- .adopt-loadmore-hint {
1595
- font-size: 11.5px;
1596
- color: var(--ink-muted);
1597
- 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;
1598
1613
  text-align: center;
1599
- }
1600
- .adopt-loadmore .action {
1601
1614
  font-size: 12px;
1602
- font-family: var(--mono);
1615
+ color: var(--ink-muted);
1603
1616
  font-variant-numeric: tabular-nums;
1604
1617
  }
1618
+ .adopt-pager-btn { min-width: 78px; gap: 4px; }
1619
+ .adopt-pager-btn svg { width: 13px; height: 13px; }
1605
1620
  .adopt-row-meta {
1606
1621
  display: flex;
1607
1622
  align-items: center;
@@ -2583,10 +2598,12 @@
2583
2598
  letter-spacing: 0.08em;
2584
2599
  padding: 1px 7px;
2585
2600
  border-radius: 999px;
2586
- background: var(--ink);
2587
- /* var(--bg-elev) tracks the --ink slab (light in dark mode) so the code
2588
- stays legible; #fff would be white-on-light. */
2589
- color: var(--bg-elev);
2601
+ /* Brand-accent chip, not the ink slab. var(--ink) flips to a light cream
2602
+ in dark mode, which made this a glaring white pill; the accent is a
2603
+ saturated mid-tone that's distinct (eye lands on it) and identical in
2604
+ both themes. */
2605
+ background: var(--accent);
2606
+ color: #fff;
2590
2607
  font-variant-numeric: tabular-nums;
2591
2608
  }
2592
2609
  .remote-device-name { min-width: 0; }