@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.
- package/lib/codexSeed.js +14 -6
- package/lib/config.js +3 -3
- package/lib/localCliSessions.js +102 -72
- package/lib/winPath.js +67 -0
- package/package.json +1 -1
- package/public/assets/copilot-color.svg +1 -1
- package/public/css/dark.css +52 -11
- package/public/css/forms.css +12 -2
- package/public/css/responsive.css +32 -4
- package/public/css/terminals.css +26 -38
- package/public/css/widgets.css +123 -106
- package/public/js/components/AdoptModal.js +168 -250
- package/public/js/components/EntityFormModal.js +14 -14
- package/public/js/components/Modal.js +9 -3
- package/public/js/components/TerminalView.js +83 -55
- package/public/js/main.js +20 -0
- package/public/js/pages/ConfigurePage.js +1 -1
- package/public/js/pages/LaunchPage.js +12 -22
- package/server.js +1 -1
package/public/css/terminals.css
CHANGED
|
@@ -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
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
the
|
|
132
|
-
Do NOT touch the textarea/composition-view's own
|
|
133
|
-
xterm relies on their single-line behaviour to keep IME
|
|
134
|
-
|
|
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
|
-
/*
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
package/public/css/widgets.css
CHANGED
|
@@ -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
|
-
.
|
|
985
|
-
|
|
986
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
1323
|
-
padding: 6px
|
|
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
|
-
|
|
1332
|
+
font-size: 13px;
|
|
1333
|
+
font-weight: 500;
|
|
1334
|
+
color: var(--ink-muted);
|
|
1329
1335
|
cursor: pointer;
|
|
1330
|
-
|
|
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);
|
|
1338
|
+
.adopt-tab:hover { color: var(--ink); }
|
|
1334
1339
|
.adopt-tab.is-active {
|
|
1335
|
-
|
|
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:
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
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-
|
|
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:
|
|
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
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
.
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
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; }
|