cardbuddy 0.7.0 → 0.8.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.
@@ -64,6 +64,9 @@
64
64
  --scrim: rgba(0, 0, 0, 0.55);
65
65
  --scrim-soft: rgba(0, 0, 0, 0.45);
66
66
  --scrim-faint: rgba(0, 0, 0, 0.4);
67
+ /* 模态模糊遮罩(深浅主题统一,不随主题翻转):确认框 / 网格预览 / 添加组件 / 远端预览 / 登录框共用 */
68
+ --scrim-modal: rgba(8, 10, 16, 0.55);
69
+ --scrim-modal-blur: 2px;
67
70
  /* 顶栏渐变、分隔条、分隔条抓手微光、白色叠加微光 */
68
71
  --bar-grad: linear-gradient(180deg, #171a20, #131519);
69
72
  --splitter: #5b6cff;
@@ -878,14 +881,24 @@ body {
878
881
  min-height: 0;
879
882
  }
880
883
  .workside__bar {
884
+ flex: 0 0 auto;
885
+ order: 2;
886
+ }
887
+ /* 底部弹出面板容器(运行态 / 事件 / 绑定错误):Teleport 目标,宽度贯穿中右两栏;
888
+ 空容器(面板均 v-show 隐藏时)高度为 0,不占位 */
889
+ .workside__panels {
881
890
  flex: 0 0 auto;
882
891
  order: 1;
892
+ display: flex;
893
+ flex-direction: column;
883
894
  }
884
895
  .workside__cols {
885
896
  flex: 1 1 auto;
886
897
  display: flex;
887
898
  min-width: 0;
888
899
  min-height: 0;
900
+ /* 绝对定位 splitter 的定位上下文:分隔条只贯穿两栏区高度,不穿过底部面板 / 状态栏 */
901
+ position: relative;
889
902
  }
890
903
 
891
904
  .phone {
@@ -920,12 +933,13 @@ body {
920
933
  flex-direction: column;
921
934
  }
922
935
 
923
- /* 拖拽分隔条:覆盖在预览列与调试面板的接缝上,绝对定位不占布局宽度 */
936
+ /* 拖拽分隔条:覆盖在接缝上,绝对定位不占布局宽度(命中宽 6px → 两侧各压 3px)。
937
+ 左条定位上下文为 .app__stage:预览列 | 工作区 的缝贯穿底面板 / 状态栏左缘,通到底部全程可拖;
938
+ 右条(.splitter--api)定位上下文为 .workside__cols:该缝在底面板区域不存在,只贯穿列区高度。 */
924
939
  .splitter {
925
940
  position: absolute;
926
941
  top: 0;
927
942
  bottom: 0;
928
- /* 以预览列右缘为接缝居中覆盖(宽 6px → 两侧各压 3px),不挤占实际宽度 */
929
943
  left: calc(var(--preview-width) - 3px);
930
944
  width: 6px;
931
945
  cursor: col-resize;
@@ -937,9 +951,22 @@ body {
937
951
  left: auto;
938
952
  right: calc(var(--api-panel-width, 360px) - 3px);
939
953
  }
940
- .splitter:hover,
941
- .splitter.is-dragging {
954
+ /* 拖拽高亮统一规格:左 / 右竖向分隔条与底部面板头部横向拖拽条,hover / 拖拽中一律
955
+ 显示 2px 的 --splitter 高亮线(同色同粗细);竖条命中区仍为 6px,高亮只画居中 2px */
956
+ .splitter::after {
957
+ content: '';
958
+ position: absolute;
959
+ top: 0;
960
+ bottom: 0;
961
+ left: 1.5px;
962
+ width: 3px;
942
963
  background: var(--splitter);
964
+ opacity: 0;
965
+ transition: opacity 0.15s ease;
966
+ }
967
+ .splitter:hover::after,
968
+ .splitter.is-dragging::after {
969
+ opacity: 1;
943
970
  }
944
971
  /* 拖拽中:禁用文本选择,全局保持 col-resize 光标 */
945
972
  .phone--dragging,
@@ -1200,6 +1227,40 @@ body {
1200
1227
  overflow: auto;
1201
1228
  padding: 8px 12px;
1202
1229
  }
1230
+ /* 通用空状态占位(API 调用面板 / 卡片来源 tab 复用):徽章 + 图标 + 文案 + 弱提示,垂直居中 */
1231
+ .empty-state {
1232
+ display: flex;
1233
+ flex-direction: column;
1234
+ align-items: center;
1235
+ justify-content: center;
1236
+ gap: 12px;
1237
+ padding: 56px 16px;
1238
+ color: var(--text-faint);
1239
+ }
1240
+ /* 虚线圆形徽章:复用全局弱态配色(bg-hover 底 + 虚线描边),内嵌 20px 线性图标(插头/云等,随场景) */
1241
+ .empty-state__badge {
1242
+ display: inline-flex;
1243
+ align-items: center;
1244
+ justify-content: center;
1245
+ width: 48px;
1246
+ height: 48px;
1247
+ border-radius: 50%;
1248
+ background: var(--bg-hover);
1249
+ border: 1px dashed var(--border-strong);
1250
+ color: var(--text-faint);
1251
+ }
1252
+ .empty-state__badge svg {
1253
+ width: 20px;
1254
+ height: 20px;
1255
+ }
1256
+ .empty-state__hint {
1257
+ margin: 0;
1258
+ max-width: 240px;
1259
+ color: var(--text-faint);
1260
+ font-size: 11px;
1261
+ line-height: 1.6;
1262
+ text-align: center;
1263
+ }
1203
1264
  .debug__tabs {
1204
1265
  display: flex;
1205
1266
  border-bottom: 1px solid var(--border);
@@ -1252,7 +1313,10 @@ body {
1252
1313
  }
1253
1314
  .debug__meta {
1254
1315
  margin: 0;
1255
- padding: 8px 12px;
1316
+ padding: 8px 12px 0; /* 底部留白交给 hint 页脚,保证贴底无缝 */
1317
+ display: flex;
1318
+ flex-direction: column;
1319
+ min-height: 100%; /* 内容不足一屏时也能把 hint 推到面板底部 */
1256
1320
  }
1257
1321
  .debug__empty {
1258
1322
  color: var(--text-faint);
@@ -1298,8 +1362,12 @@ body {
1298
1362
  font-size: 12px;
1299
1363
  }
1300
1364
  .debug__meta-hint {
1301
- margin-top: 12px;
1302
- padding-top: 10px;
1365
+ /* 固定在面板底部:内容短时由 margin-top:auto 推底;内容超长滚动时 sticky 吸底不随列表滚走 */
1366
+ position: sticky;
1367
+ bottom: 0;
1368
+ margin: auto -12px 0;
1369
+ padding: 10px 12px;
1370
+ background: var(--bg-panel);
1303
1371
  border-top: 1px solid var(--border);
1304
1372
  color: var(--text-faint);
1305
1373
  font-size: 12px;
@@ -1312,14 +1380,14 @@ body {
1312
1380
  flex: 0 0 auto;
1313
1381
  display: flex;
1314
1382
  flex-direction: column;
1383
+ /* 顶缘拖拽条 .panelhead__edge 的定位上下文 */
1384
+ position: relative;
1315
1385
  /* 初始高度 240px;运行时由头部拖拽调整,并通过 JS 持久化回写 height */
1316
1386
  height: 240px;
1317
1387
  min-height: 120px;
1318
1388
  max-height: 60vh;
1319
1389
  /* hidden 避免面板自身出现滚动条(滚动交给 .statepanel__tree) */
1320
1390
  overflow: hidden;
1321
- /* 通过 flex order 把面板固定到状态栏之上,确保状态栏始终贴底(不被面板顶上来) */
1322
- order: 1;
1323
1391
  background: var(--bg-panel);
1324
1392
  border-top: 1px solid var(--border-strong);
1325
1393
  }
@@ -1330,13 +1398,37 @@ body {
1330
1398
  gap: 8px;
1331
1399
  height: var(--ctrl-lg);
1332
1400
  padding: 0 12px;
1333
- background: var(--bg-bar);
1334
1401
  border-bottom: 1px solid var(--border);
1335
1402
  font-size: 13px;
1336
1403
  color: var(--text);
1337
- /* 头部即拖拽手柄(无专门节点):整条可抓取,向上拖放大面板 */
1404
+ }
1405
+ /* 底面板顶缘拖拽条:与竖向分隔条同一规格——命中 6px、高亮 3px --splitter;
1406
+ 仅鼠标进入分割边缘才触发高亮 / 拖拽,头部本体不再响应(面板 overflow:hidden,
1407
+ 高亮线贴缝内侧 0~3px 绘制)。拖拽中经 is-dragging 保持高亮。 */
1408
+ .panelhead__edge {
1409
+ position: absolute;
1410
+ top: 0;
1411
+ left: 0;
1412
+ right: 0;
1413
+ height: 6px;
1338
1414
  cursor: row-resize;
1339
1415
  user-select: none;
1416
+ z-index: var(--z-sticky);
1417
+ }
1418
+ .panelhead__edge::after {
1419
+ content: '';
1420
+ position: absolute;
1421
+ left: 0;
1422
+ right: 0;
1423
+ top: 0;
1424
+ height: 3px;
1425
+ background: var(--splitter);
1426
+ opacity: 0;
1427
+ transition: opacity 0.15s ease;
1428
+ }
1429
+ .panelhead__edge:hover::after,
1430
+ .panelhead__edge.is-dragging::after {
1431
+ opacity: 1;
1340
1432
  }
1341
1433
  .statepanel__title {
1342
1434
  font-weight: 600;
@@ -1345,27 +1437,34 @@ body {
1345
1437
  .statepanel__title code {
1346
1438
  font-family: var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);
1347
1439
  font-size: 12px;
1348
- color: var(--accent);
1440
+ /* 与 .debug__meta-row code 同一芯片语言:浅底 + 弱文字色,不用 accent 抢焦 */
1441
+ color: var(--text-dim);
1442
+ background: var(--bg-hover);
1443
+ padding: 1px 5px;
1444
+ border-radius: 4px;
1349
1445
  }
1350
1446
  .statepanel__close {
1351
1447
  margin-left: auto;
1352
1448
  display: inline-flex;
1353
1449
  align-items: center;
1354
1450
  justify-content: center;
1355
- width: 18px;
1356
- height: 18px;
1451
+ width: 24px;
1452
+ height: 24px;
1357
1453
  padding: 0;
1358
1454
  background: none;
1359
1455
  border: none;
1360
- color: var(--text-faint);
1361
- font-size: 15px;
1362
- line-height: 1;
1456
+ color: var(--text-dim);
1363
1457
  cursor: pointer;
1364
- transition: color 0.15s;
1458
+ border-radius: var(--radius-xs);
1459
+ transition: background 0.15s, color 0.15s;
1365
1460
  }
1366
1461
  .statepanel__close:hover {
1462
+ background: var(--bg-hover);
1367
1463
  color: var(--text);
1368
1464
  }
1465
+ .statepanel__close svg {
1466
+ display: block;
1467
+ }
1369
1468
  .statepanel__tree {
1370
1469
  flex: 1 1 auto;
1371
1470
  overflow: auto;
@@ -1402,21 +1501,66 @@ body {
1402
1501
  padding: 0;
1403
1502
  }
1404
1503
  .debug__item {
1405
- padding: 4px 8px;
1504
+ padding: 9px 11px;
1406
1505
  margin-bottom: 6px;
1407
1506
  border-radius: 8px;
1408
1507
  font-size: 12px;
1409
1508
  line-height: 1.6;
1410
- word-break: break-all;
1509
+ /* break-all 会把键名/标识符拦腰拆行(msg → ms/g);anywhere 仅在单词真放不下时才断 */
1510
+ word-break: normal;
1511
+ overflow-wrap: anywhere;
1411
1512
  }
1412
1513
  .debug__item--err {
1413
- background: var(--danger-soft);
1514
+ display: grid;
1515
+ grid-template-columns: 52px 84px minmax(0, 1fr);
1516
+ align-items: baseline;
1517
+ gap: 8px;
1518
+ margin-bottom: 0;
1519
+ padding: 3px 12px 3px 10px;
1520
+ border-radius: 0;
1521
+ /* 左侧红条标示错误归属;行底透明避免整片红块,hover 才整行染 danger 色 */
1522
+ border-left: 2px solid var(--danger);
1523
+ border-bottom: 1px solid var(--border);
1524
+ background: transparent;
1414
1525
  color: var(--err-item-fg);
1526
+ font-size: 11px;
1527
+ line-height: 1.45;
1528
+ word-break: normal;
1529
+ }
1530
+ .debug__item--err:last-child {
1531
+ border-bottom: none;
1532
+ }
1533
+ .debug__item--err:hover {
1534
+ background: var(--danger-soft);
1535
+ }
1536
+ /* 错误类型列:等宽小标签,超长省略 */
1537
+ .debug__item--err .debug__kind {
1538
+ overflow: hidden;
1539
+ font-family: 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
1540
+ font-size: 10px;
1541
+ color: var(--danger);
1542
+ text-overflow: ellipsis;
1543
+ white-space: nowrap;
1544
+ opacity: 1;
1545
+ }
1546
+ .err__msg {
1547
+ min-width: 0;
1548
+ word-break: break-word;
1415
1549
  }
1416
1550
  .debug__item--api {
1417
1551
  border: 1px solid var(--api-item-border);
1418
1552
  color: var(--api-item-fg);
1419
1553
  background: var(--api-item-bg);
1554
+ margin-bottom: 8px;
1555
+ }
1556
+ .debug__item--api:last-child {
1557
+ margin-bottom: 0;
1558
+ }
1559
+ /* 方法名与下方代码树同语言:等宽 + 显式行高(规范手册 6.2) */
1560
+ .debug__item--api .debug__kind {
1561
+ font-family: 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
1562
+ font-size: 12px;
1563
+ line-height: 1.6;
1420
1564
  }
1421
1565
  .debug__kind {
1422
1566
  font-weight: 600;
@@ -1481,12 +1625,27 @@ body {
1481
1625
  .apt__branch,
1482
1626
  .apt__leaf {
1483
1627
  display: flex;
1484
- align-items: center;
1628
+ /* 值折行时键名/冒号保持首行对齐,center 会让它们悬在多行值的垂直中部 */
1629
+ align-items: baseline;
1485
1630
  gap: 4px;
1486
1631
  padding: 1px 4px;
1487
1632
  border-radius: 4px;
1488
1633
  cursor: pointer;
1489
1634
  }
1635
+ /* 冒号贴键(DevTools 风格):抵消与键之间的 flex gap,值仍保留 4px 间隔 */
1636
+ .apt .jt__colon {
1637
+ margin-left: -4px;
1638
+ }
1639
+ /* 键名不参与 flex 收缩:否则长值会把小 basis 的键列按比例挤到拦腰换行(msg → ms/g);
1640
+ 折行只应发生在值上(值已 min-width:0 + overflow-wrap:anywhere) */
1641
+ .apt .jt__key {
1642
+ flex-shrink: 0;
1643
+ }
1644
+ /* 值/摘要允许在剩余宽度内折行:解除 flex 项 min-content 下限 */
1645
+ .apt .jt__val,
1646
+ .apt .jt__preview {
1647
+ min-width: 0;
1648
+ }
1490
1649
  .apt__branch:hover,
1491
1650
  .apt__leaf:hover {
1492
1651
  background: var(--bg-hover);
@@ -1545,36 +1704,68 @@ body {
1545
1704
  overflow: auto;
1546
1705
  }
1547
1706
  .debug__scope-foot {
1548
- flex: 0 0 auto;
1549
1707
  position: absolute;
1550
- bottom: 0;
1551
- right: 0;
1708
+ bottom: 10px;
1709
+ right: 10px;
1552
1710
  display: flex;
1553
1711
  justify-content: flex-end;
1554
1712
  align-items: center;
1555
1713
  gap: 8px;
1556
- padding: 8px 12px;
1714
+ /* 悬浮操作条:卡片容器 + 投影,与滚动内容分层,不再“贴”在树内容上 */
1715
+ padding: 6px;
1716
+ background: var(--bg-bar);
1717
+ border: 1px solid var(--border);
1718
+ border-radius: 10px;
1719
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.28);
1557
1720
  }
1558
1721
  .debug__copied {
1722
+ margin: 0 4px 0 8px;
1559
1723
  font-size: 12px;
1560
1724
  color: var(--accent);
1561
1725
  }
1726
+ /* 次级按钮:中性描边 + 弱文本色,hover 提亮 */
1562
1727
  .debug__copy {
1563
1728
  display: inline-flex;
1564
1729
  align-items: center;
1565
- height: var(--ctrl-sm);
1566
- padding: 0 14px;
1730
+ gap: 5px;
1731
+ height: 26px;
1732
+ padding: 0 10px;
1567
1733
  background: var(--bg-input);
1568
- color: var(--text);
1569
- border: 1px solid var(--accent-border);
1570
- border-radius: var(--radius-sm);
1571
- font-size: 13px;
1734
+ color: var(--text-dim);
1735
+ border: 1px solid var(--border-strong);
1736
+ border-radius: 7px;
1737
+ font-size: 12px;
1572
1738
  cursor: pointer;
1573
- transition: background 0.15s, border-color 0.15s;
1739
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
1574
1740
  }
1575
1741
  .debug__copy:hover {
1576
1742
  background: var(--bg-hover);
1577
- border-color: var(--accent);
1743
+ border-color: var(--accent-border);
1744
+ color: var(--text);
1745
+ }
1746
+ .debug__copy-icn {
1747
+ flex: 0 0 auto;
1748
+ width: 13px;
1749
+ height: 13px;
1750
+ }
1751
+ /* 主按钮(应用):常态与其他边线按钮一致,hover 转绿色系(ok)提示“提交/生效”语义 */
1752
+ .debug__copy--primary:hover {
1753
+ background: var(--ok-soft);
1754
+ border-color: var(--ok-border);
1755
+ color: var(--ok);
1756
+ }
1757
+ /* 丢弃类次级按钮:hover 转 warn 色提示破坏性(重置丢弃内存编辑) */
1758
+ .debug__copy--warn:hover {
1759
+ background: var(--warn-soft);
1760
+ border-color: var(--warn-border);
1761
+ color: var(--warn);
1762
+ }
1763
+ /* 按钮分组间的竖向分隔线 */
1764
+ .debug__sep {
1765
+ width: 1px;
1766
+ height: 16px;
1767
+ margin: 0 2px;
1768
+ background: var(--border-strong);
1578
1769
  }
1579
1770
 
1580
1771
  /* 数据绑定 Raw 模式:直接复用 .debug__scope-wrap 的绝对定位盒(inset 已占满 body 内容区),
@@ -1717,12 +1908,12 @@ body {
1717
1908
  flex: 0 0 auto;
1718
1909
  display: flex;
1719
1910
  flex-direction: column;
1911
+ /* 顶缘拖拽条 .panelhead__edge 的定位上下文 */
1912
+ position: relative;
1720
1913
  height: 240px;
1721
1914
  min-height: 120px;
1722
1915
  max-height: 60vh;
1723
1916
  overflow: hidden;
1724
- /* 与运行态面板同属「状态栏之上的底部面板」,固定 order 确保状态栏始终贴底 */
1725
- order: 2;
1726
1917
  background: var(--bg-panel);
1727
1918
  border-top: 1px solid var(--border-strong);
1728
1919
  }
@@ -1733,10 +1924,6 @@ body {
1733
1924
  gap: 8px;
1734
1925
  height: var(--ctrl-lg);
1735
1926
  padding: 0 12px;
1736
- background: var(--bg-bar);
1737
- /* 头部即拖拽手柄(无专门节点):整条可抓取,向上拖放大面板 */
1738
- cursor: row-resize;
1739
- user-select: none;
1740
1927
  border-bottom: 1px solid var(--border);
1741
1928
  font-size: 13px;
1742
1929
  color: var(--text);
@@ -1757,18 +1944,23 @@ body {
1757
1944
  display: inline-flex;
1758
1945
  align-items: center;
1759
1946
  justify-content: center;
1760
- width: 20px;
1761
- height: 20px;
1947
+ width: 24px;
1948
+ height: 24px;
1762
1949
  padding: 0;
1763
1950
  background: none;
1764
1951
  border: none;
1765
- color: var(--text-faint);
1952
+ color: var(--text-dim);
1766
1953
  cursor: pointer;
1767
- transition: color 0.15s;
1954
+ border-radius: var(--radius-xs);
1955
+ transition: background 0.15s, color 0.15s;
1768
1956
  }
1769
1957
  .errpanel__iconbtn:hover:not(:disabled) {
1958
+ background: var(--bg-hover);
1770
1959
  color: var(--text);
1771
1960
  }
1961
+ .errpanel__iconbtn svg {
1962
+ display: block;
1963
+ }
1772
1964
  .errpanel__iconbtn:disabled {
1773
1965
  opacity: 0.35;
1774
1966
  cursor: not-allowed;
@@ -1777,33 +1969,100 @@ body {
1777
1969
  .errpanel__clear:hover:not(:disabled) {
1778
1970
  color: var(--danger);
1779
1971
  }
1972
+ /* 事件面板 tab 条:日志 / 错误 二选一,并入头部单行(标题之后、操作按钮之前)。
1973
+ 沿用 .debug__tabs 视觉语言(选中项 accent 短下划线,落到头部底发丝线上),
1974
+ 与头部同高,不再单独占一行面板高度。 */
1975
+ .errpanel__tabs {
1976
+ flex: 0 0 auto;
1977
+ align-self: stretch;
1978
+ display: flex;
1979
+ align-items: stretch;
1980
+ gap: 2px;
1981
+ margin-left: 4px;
1982
+ }
1983
+ .errpanel__tab {
1984
+ position: relative;
1985
+ display: inline-flex;
1986
+ align-items: center;
1987
+ gap: 5px;
1988
+ height: 100%;
1989
+ padding: 0 10px;
1990
+ background: none;
1991
+ border: none;
1992
+ color: var(--text-dim);
1993
+ font-size: 12px;
1994
+ cursor: pointer;
1995
+ transition: color 0.15s;
1996
+ }
1997
+ .errpanel__tab:hover {
1998
+ color: var(--text);
1999
+ }
2000
+ .errpanel__tab--active {
2001
+ color: var(--accent);
2002
+ }
2003
+ .errpanel__tab--active::after {
2004
+ content: '';
2005
+ position: absolute;
2006
+ left: 20%;
2007
+ right: 20%;
2008
+ bottom: -1px;
2009
+ height: 2px;
2010
+ background: var(--accent);
2011
+ }
2012
+ /* tab 计数小药丸:错误侧计数非 0 时转红,不切 tab 也能看出那边有货 */
2013
+ .errpanel__tab-count {
2014
+ min-width: 16px;
2015
+ padding: 0 5px;
2016
+ border-radius: 999px;
2017
+ background: var(--bg-hover);
2018
+ color: var(--text-faint);
2019
+ font-size: 11px;
2020
+ line-height: 15px;
2021
+ text-align: center;
2022
+ }
2023
+ .errpanel__tab--active .errpanel__tab-count {
2024
+ background: var(--accent-soft);
2025
+ color: var(--accent);
2026
+ }
2027
+ .errpanel__tab-count.is-hit,
2028
+ .errpanel__tab--active .errpanel__tab-count.is-hit {
2029
+ background: var(--danger-soft);
2030
+ color: var(--danger);
2031
+ }
1780
2032
  .errpanel__body {
1781
2033
  flex: 1 1 auto;
1782
2034
  overflow: auto;
1783
- padding: 12px 16px;
2035
+ /* 行贴边排布(行自带左右内边距),把竖向空间全部留给内容 */
2036
+ padding: 4px 0 6px;
1784
2037
  }
1785
- /* 事件面板内「日志 / 错误」分区标题 */
1786
- .ep__sec-title {
1787
- margin: 8px 0 6px;
1788
- padding-bottom: 4px;
1789
- font-size: 12px;
1790
- font-weight: 600;
1791
- color: var(--text-dim);
1792
- border-bottom: 1px dashed var(--border);
2038
+ /* 空态占位(复用 API 调用面板 .empty-state 语言):底部面板高度有限,
2039
+ 压缩留白与徽章尺寸,避免空态自身撑出滚动条 */
2040
+ .errpanel__body .empty-state {
2041
+ padding: 20px 16px;
2042
+ gap: 8px;
1793
2043
  }
1794
- .ep__sec-title:first-child {
1795
- margin-top: 0;
2044
+ .errpanel__body .empty-state__badge {
2045
+ width: 40px;
2046
+ height: 40px;
2047
+ }
2048
+ .errpanel__body .empty-state__badge svg {
2049
+ width: 18px;
2050
+ height: 18px;
2051
+ }
2052
+ .errpanel__body .empty-state__hint {
2053
+ max-width: 460px;
1796
2054
  }
1797
- /* 事件面板日志:每行 = 等级标签 + 内容(语法高亮 / JSON 折叠) */
2055
+ /* 事件面板日志:控制台风格高密度行 = 时间 | 等级 | 内容,发丝线分隔 */
1798
2056
  .debug__list--log {
1799
2057
  display: flex;
1800
2058
  flex-direction: column;
1801
2059
  }
1802
2060
  .log__item {
1803
- display: flex;
1804
- align-items: flex-start;
1805
- gap: 10px;
1806
- padding: 6px 8px;
2061
+ display: grid;
2062
+ grid-template-columns: 52px 44px minmax(0, 1fr);
2063
+ align-items: baseline;
2064
+ gap: 8px;
2065
+ padding: 2px 12px;
1807
2066
  border-bottom: 1px solid var(--border);
1808
2067
  }
1809
2068
  .log__item:last-child {
@@ -1812,31 +2071,40 @@ body {
1812
2071
  .log__item:hover {
1813
2072
  background: var(--bg-input);
1814
2073
  }
1815
- /* 等级标签:小药丸,按级别着色 */
2074
+ /* 行首时间戳:tabular-nums 保证整列对齐 */
2075
+ .log__time,
2076
+ .err__time {
2077
+ font-family: 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
2078
+ font-size: 10px;
2079
+ font-variant-numeric: tabular-nums;
2080
+ color: var(--text-faint);
2081
+ }
2082
+ /* 等级标签:无边框小药丸,定宽成列对齐 */
1816
2083
  .log__tag {
1817
- flex: 0 0 auto;
1818
- margin-top: 1px;
1819
- padding: 1px 6px;
1820
- border-radius: 4px;
2084
+ justify-self: start;
2085
+ padding: 0 5px;
2086
+ border: none;
2087
+ border-radius: 3px;
1821
2088
  font-family: 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
1822
- font-size: 11px;
2089
+ font-size: 10px;
1823
2090
  font-weight: 600;
1824
- line-height: 1.5;
2091
+ line-height: 14px;
1825
2092
  text-transform: uppercase;
1826
- letter-spacing: 0.4px;
2093
+ letter-spacing: 0.3px;
1827
2094
  color: var(--text-dim);
1828
- background: var(--bg-input);
1829
- border: 1px solid var(--border);
2095
+ background: var(--bg-hover);
2096
+ }
2097
+ .log__tag--info {
2098
+ color: var(--accent);
2099
+ background: var(--accent-soft);
1830
2100
  }
1831
2101
  .log__tag--warn {
1832
2102
  color: var(--log-warn-fg);
1833
2103
  background: var(--log-warn-bg);
1834
- border-color: var(--log-warn-border);
1835
2104
  }
1836
2105
  .log__tag--error {
1837
2106
  color: var(--danger);
1838
2107
  background: var(--danger-soft);
1839
- border-color: var(--danger-soft);
1840
2108
  }
1841
2109
  /* 内容区:基础类型内联、复合类型独占整行 */
1842
2110
  .log__content {
@@ -1845,10 +2113,10 @@ body {
1845
2113
  display: flex;
1846
2114
  flex-wrap: wrap;
1847
2115
  align-items: flex-start;
1848
- gap: 4px 10px;
2116
+ gap: 3px 8px;
1849
2117
  font-family: 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
1850
- font-size: 12px;
1851
- line-height: 1.5;
2118
+ font-size: 11px;
2119
+ line-height: 1.45;
1852
2120
  color: var(--text);
1853
2121
  }
1854
2122
  .log__val {
@@ -1857,7 +2125,23 @@ body {
1857
2125
  }
1858
2126
  .log__json {
1859
2127
  flex: 1 1 100%;
1860
- padding: 2px 0;
2128
+ padding: 0;
2129
+ }
2130
+ /* 日志内嵌 JSON 树比接口面板再紧一档,去掉多余上下留白 */
2131
+ .log__json .apt {
2132
+ margin-top: 0;
2133
+ font-size: 11px;
2134
+ line-height: 1.4;
2135
+ }
2136
+ /* 根摘要行可点:hover 给底色提示;展开后明细列表缩进一级 */
2137
+ .log__json .apt__branch--root {
2138
+ cursor: pointer;
2139
+ border-radius: 4px;
2140
+ }
2141
+ .log__json .apt__list--nested {
2142
+ margin-left: 4px;
2143
+ padding-left: 14px;
2144
+ border-left: 1px solid var(--border);
1861
2145
  }
1862
2146
  .log__empty {
1863
2147
  color: var(--text-faint);
@@ -2274,8 +2558,8 @@ body {
2274
2558
  display: flex;
2275
2559
  align-items: center;
2276
2560
  justify-content: center;
2277
- background: rgba(8, 10, 16, 0.55);
2278
- backdrop-filter: blur(2px);
2561
+ background: var(--scrim-modal);
2562
+ backdrop-filter: blur(var(--scrim-modal-blur));
2279
2563
  }
2280
2564
  .rp-card {
2281
2565
  width: 300px;
@@ -2456,8 +2740,8 @@ body {
2456
2740
  display: flex;
2457
2741
  align-items: center;
2458
2742
  justify-content: center;
2459
- background: rgba(8, 10, 16, 0.55);
2460
- backdrop-filter: blur(2px);
2743
+ background: var(--scrim-modal);
2744
+ backdrop-filter: blur(var(--scrim-modal-blur));
2461
2745
  }
2462
2746
  .login-modal {
2463
2747
  width: 320px;
@@ -2556,8 +2840,8 @@ body {
2556
2840
  display: flex;
2557
2841
  align-items: center;
2558
2842
  justify-content: center;
2559
- background: rgba(8, 10, 16, 0.55);
2560
- backdrop-filter: blur(2px);
2843
+ background: var(--scrim-modal);
2844
+ backdrop-filter: blur(var(--scrim-modal-blur));
2561
2845
  }
2562
2846
  .confirm-modal {
2563
2847
  width: 360px;