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.
- package/README.md +21 -0
- package/dist/preview-editor/assets/index-BQKzMPBq.js +79 -0
- package/dist/preview-editor/assets/index-D3zp47Dg.css +1 -0
- package/dist/preview-editor/index.html +2 -2
- package/dist/server-core/codeBridge.js +359 -0
- package/dist/server-core/index.js +8 -2
- package/dist/standalone.js +18 -3
- package/dist/vendored/App.vue +17 -13
- package/dist/vendored/api.js +102 -32
- package/dist/vendored/components/ApiCallPanel.vue +13 -1
- package/dist/vendored/components/ApiPayloadTree.vue +34 -1
- package/dist/vendored/components/ComponentPalette.vue +45 -38
- package/dist/vendored/components/DebugPanel.vue +146 -39
- package/dist/vendored/components/EventEditor.vue +27 -3
- package/dist/vendored/components/LogValue.vue +2 -1
- package/dist/vendored/components/PropControl.vue +6 -2
- package/dist/vendored/components/setters/SetCode.vue +111 -3
- package/dist/vendored/styles/app.css +366 -82
- package/dist/vendored/styles/card-gallery.css +3 -2
- package/dist/vendored/styles/dropdown.css +3 -0
- package/dist/vendored/styles/node-inspector.css +176 -119
- package/dist/vendored/styles/setters.css +91 -2
- package/dist/vendored/styles/structure-tree.css +25 -12
- package/package.json +1 -1
- package/dist/preview-editor/assets/index-BlscexDE.js +0 -79
- package/dist/preview-editor/assets/index-dlbSPb5W.css +0 -1
|
@@ -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
|
-
|
|
941
|
-
|
|
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:
|
|
1302
|
-
|
|
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
|
-
|
|
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:
|
|
1356
|
-
height:
|
|
1451
|
+
width: 24px;
|
|
1452
|
+
height: 24px;
|
|
1357
1453
|
padding: 0;
|
|
1358
1454
|
background: none;
|
|
1359
1455
|
border: none;
|
|
1360
|
-
color: var(--text-
|
|
1361
|
-
font-size: 15px;
|
|
1362
|
-
line-height: 1;
|
|
1456
|
+
color: var(--text-dim);
|
|
1363
1457
|
cursor: pointer;
|
|
1364
|
-
|
|
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:
|
|
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
|
-
|
|
1509
|
+
/* break-all 会把键名/标识符拦腰拆行(msg → ms/g);anywhere 仅在单词真放不下时才断 */
|
|
1510
|
+
word-break: normal;
|
|
1511
|
+
overflow-wrap: anywhere;
|
|
1411
1512
|
}
|
|
1412
1513
|
.debug__item--err {
|
|
1413
|
-
|
|
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
|
-
|
|
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:
|
|
1551
|
-
right:
|
|
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
|
-
|
|
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
|
-
|
|
1566
|
-
|
|
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(--
|
|
1570
|
-
border-radius:
|
|
1571
|
-
font-size:
|
|
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:
|
|
1761
|
-
height:
|
|
1947
|
+
width: 24px;
|
|
1948
|
+
height: 24px;
|
|
1762
1949
|
padding: 0;
|
|
1763
1950
|
background: none;
|
|
1764
1951
|
border: none;
|
|
1765
|
-
color: var(--text-
|
|
1952
|
+
color: var(--text-dim);
|
|
1766
1953
|
cursor: pointer;
|
|
1767
|
-
|
|
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
|
-
|
|
2035
|
+
/* 行贴边排布(行自带左右内边距),把竖向空间全部留给内容 */
|
|
2036
|
+
padding: 4px 0 6px;
|
|
1784
2037
|
}
|
|
1785
|
-
/*
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
padding
|
|
1789
|
-
|
|
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
|
-
.
|
|
1795
|
-
|
|
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
|
-
/*
|
|
2055
|
+
/* 事件面板日志:控制台风格高密度行 = 时间 | 等级 | 内容,发丝线分隔 */
|
|
1798
2056
|
.debug__list--log {
|
|
1799
2057
|
display: flex;
|
|
1800
2058
|
flex-direction: column;
|
|
1801
2059
|
}
|
|
1802
2060
|
.log__item {
|
|
1803
|
-
display:
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
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
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
border-radius:
|
|
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:
|
|
2089
|
+
font-size: 10px;
|
|
1823
2090
|
font-weight: 600;
|
|
1824
|
-
line-height:
|
|
2091
|
+
line-height: 14px;
|
|
1825
2092
|
text-transform: uppercase;
|
|
1826
|
-
letter-spacing: 0.
|
|
2093
|
+
letter-spacing: 0.3px;
|
|
1827
2094
|
color: var(--text-dim);
|
|
1828
|
-
background: var(--bg-
|
|
1829
|
-
|
|
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:
|
|
2116
|
+
gap: 3px 8px;
|
|
1849
2117
|
font-family: 'SF Mono', 'JetBrains Mono', Menlo, Consolas, monospace;
|
|
1850
|
-
font-size:
|
|
1851
|
-
line-height: 1.
|
|
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:
|
|
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:
|
|
2278
|
-
backdrop-filter: blur(
|
|
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:
|
|
2460
|
-
backdrop-filter: blur(
|
|
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:
|
|
2560
|
-
backdrop-filter: blur(
|
|
2843
|
+
background: var(--scrim-modal);
|
|
2844
|
+
backdrop-filter: blur(var(--scrim-modal-blur));
|
|
2561
2845
|
}
|
|
2562
2846
|
.confirm-modal {
|
|
2563
2847
|
width: 360px;
|