dsh-recency-guard 0.11.2 → 0.11.4
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 +20 -0
- package/dist/client.js +138 -11
- package/locale/en.json +7 -1
- package/locale/zh.json +7 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,6 +65,26 @@
|
|
|
65
65
|
|
|
66
66
|
当某个插件把 DSH 拖垮时,本插件会在崩溃的那一刻记录下"谁最可疑",并在**下一次启动时、在崩溃插件的代码被加载之前**把它挡在门外。反复崩溃时,关闭的插件会逐个增加(第 1 次关最近更新的 1 个,仍崩溃则关最近更新的 2 个)。稳定之后,除首要嫌疑外,其余被关闭的配置会自动恢复。
|
|
67
67
|
|
|
68
|
+
## v0.11.4 触屏双指缩放(图谱交互补齐)
|
|
69
|
+
|
|
70
|
+
- **双指捏合缩放**:两指同时按下即进入捏合 —— 中点下的世界点在缩放中保持
|
|
71
|
+
不动(与单指缩放同一不变式),同时中点位移会带动画布平移;捏合期间取消
|
|
72
|
+
画布平移拖拽,抬指后清空取样。退化输入(两指重合/非有限)返回原视口,
|
|
73
|
+
绝不产生 Infinity。
|
|
74
|
+
- 回归:viewport 新增 4 条捏合断言(翻倍缩放/锚点不动/跟随平移/退化与上界)。
|
|
75
|
+
|
|
76
|
+
## v0.11.3 图谱交互补齐(边可交互 + 布局过渡)
|
|
77
|
+
|
|
78
|
+
- **边可交互(审计 P0 收尾)**:此前边完全不可点击、`edge.label` 是死数据。
|
|
79
|
+
现在每条边叠加透明宽描边热区:悬停高亮 + 指针变化、点击显示**边详情侧栏**
|
|
80
|
+
(生产方 → 消费方 · 语义 · 边自带 label);选中边的语义标签与数据标签
|
|
81
|
+
分别绘制。选中态与节点详情**互斥**(单一真相),Esc / 空白处点击 /
|
|
82
|
+
「重置」都会清空。
|
|
83
|
+
- **布局切换过渡**:节点坐标改用 CSS transform,布局切换与拖拽回弹有
|
|
84
|
+
过渡动画;拖动中的节点禁用过渡(否则「追不上指针」);
|
|
85
|
+
`prefers-reduced-motion` 由全局规则降级。
|
|
86
|
+
- 回归:`edgeDetailOf` 纯函数新增 3 条断言(端点解析/字段带出/幽灵端点 null)。
|
|
87
|
+
|
|
68
88
|
## v0.11.2 紧急修复(恢复诚实性 + 启动恢复时序)
|
|
69
89
|
|
|
70
90
|
- **恢复结果白盒化(P0 假绿修复)**:`reenable` 此前**无条件**返回
|
package/dist/client.js
CHANGED
|
@@ -270,7 +270,13 @@ var zh_default = {
|
|
|
270
270
|
bundle: "\u63D2\u4EF6",
|
|
271
271
|
gap: "\u7F3A\u53E3"
|
|
272
272
|
},
|
|
273
|
-
matchIndex: "\u7B2C {index}/{total} \u4E2A"
|
|
273
|
+
matchIndex: "\u7B2C {index}/{total} \u4E2A",
|
|
274
|
+
edgeDetails: "\u8FB9\u8BE6\u60C5",
|
|
275
|
+
edgeFrom: "\u751F\u4EA7\u65B9\uFF08\u8D77\u70B9\uFF09",
|
|
276
|
+
edgeTo: "\u6D88\u8D39\u65B9\uFF08\u7EC8\u70B9\uFF09",
|
|
277
|
+
edgeKind: "\u8BED\u4E49",
|
|
278
|
+
edgeTransitions: "\u72B6\u6001\u8FC1\u79FB",
|
|
279
|
+
edgeRanks: "\u6392\u5E8F\u5F15\u7528"
|
|
274
280
|
},
|
|
275
281
|
events: {
|
|
276
282
|
title: "\u4E8B\u4EF6\u6D41",
|
|
@@ -546,7 +552,13 @@ var en_default = {
|
|
|
546
552
|
bundle: "Bundle",
|
|
547
553
|
gap: "Gap"
|
|
548
554
|
},
|
|
549
|
-
matchIndex: "Match {index}/{total}"
|
|
555
|
+
matchIndex: "Match {index}/{total}",
|
|
556
|
+
edgeDetails: "Edge details",
|
|
557
|
+
edgeFrom: "Produces (from)",
|
|
558
|
+
edgeTo: "Consumes (to)",
|
|
559
|
+
edgeKind: "Semantics",
|
|
560
|
+
edgeTransitions: "transition",
|
|
561
|
+
edgeRanks: "ranking"
|
|
550
562
|
},
|
|
551
563
|
events: {
|
|
552
564
|
title: "Event stream",
|
|
@@ -662,6 +674,22 @@ function zoomAt(viewport, anchor, nextScale) {
|
|
|
662
674
|
function zoomBy(viewport, anchor, factor) {
|
|
663
675
|
return zoomAt(viewport, anchor, clampScale(viewport.scale) * finite(factor, 1));
|
|
664
676
|
}
|
|
677
|
+
function pinchViewport(viewport, prev, next) {
|
|
678
|
+
const prevDx = finite(prev.b.x, 0) - finite(prev.a.x, 0);
|
|
679
|
+
const prevDy = finite(prev.b.y, 0) - finite(prev.a.y, 0);
|
|
680
|
+
const nextDx = finite(next.b.x, 0) - finite(next.a.x, 0);
|
|
681
|
+
const nextDy = finite(next.b.y, 0) - finite(next.a.y, 0);
|
|
682
|
+
const prevDist = Math.hypot(prevDx, prevDy);
|
|
683
|
+
const nextDist = Math.hypot(nextDx, nextDy);
|
|
684
|
+
if (!(prevDist > 0.01) || !Number.isFinite(nextDist)) return viewport;
|
|
685
|
+
const s0 = clampScale(viewport.scale);
|
|
686
|
+
const s1 = clampScale(s0 * nextDist / prevDist);
|
|
687
|
+
const prevMid = { x: (finite(prev.a.x, 0) + finite(prev.b.x, 0)) / 2, y: (finite(prev.a.y, 0) + finite(prev.b.y, 0)) / 2 };
|
|
688
|
+
const nextMid = { x: (finite(next.a.x, 0) + finite(next.b.x, 0)) / 2, y: (finite(next.a.y, 0) + finite(next.b.y, 0)) / 2 };
|
|
689
|
+
const worldX = (prevMid.x - viewport.tx) / s0;
|
|
690
|
+
const worldY = (prevMid.y - viewport.ty) / s0;
|
|
691
|
+
return { scale: s1, tx: nextMid.x - worldX * s1, ty: nextMid.y - worldY * s1 };
|
|
692
|
+
}
|
|
665
693
|
function centerOf(size) {
|
|
666
694
|
return { x: finite(size.width, 0) / 2, y: finite(size.height, 0) / 2 };
|
|
667
695
|
}
|
|
@@ -957,6 +985,17 @@ function degreeOf(id, edges) {
|
|
|
957
985
|
}
|
|
958
986
|
return { in: incoming, out: outgoing };
|
|
959
987
|
}
|
|
988
|
+
function edgeDetailOf(edge, index) {
|
|
989
|
+
const from = index.get(edge.from);
|
|
990
|
+
const to = index.get(edge.to);
|
|
991
|
+
if (!from || !to) return null;
|
|
992
|
+
return {
|
|
993
|
+
fromLabel: from.label,
|
|
994
|
+
toLabel: to.label,
|
|
995
|
+
kind: edge.kind,
|
|
996
|
+
...edge.label === void 0 ? {} : { label: edge.label }
|
|
997
|
+
};
|
|
998
|
+
}
|
|
960
999
|
function neighborsOf(id, edges, index) {
|
|
961
1000
|
const upstream = [];
|
|
962
1001
|
const downstream = [];
|
|
@@ -1250,6 +1289,37 @@ function GraphDetails(props) {
|
|
|
1250
1289
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "rg-graph-aside-actions", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "rg-button rg-button-small", onClick: () => props.onLocate(node.id), children: t("graph.locate") }) })
|
|
1251
1290
|
] });
|
|
1252
1291
|
}
|
|
1292
|
+
function EdgeDetails({ detail, onClose }) {
|
|
1293
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("aside", { className: "rg-graph-aside", "aria-label": t("graph.edgeDetails"), children: [
|
|
1294
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", { className: "rg-graph-aside-header", children: [
|
|
1295
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "rg-dot rg-dot-info", "aria-hidden": true }),
|
|
1296
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { className: "rg-graph-aside-title", children: t("graph.edgeDetails") }),
|
|
1297
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", className: "rg-button rg-button-icon", onClick: onClose, "aria-label": t("graph.closeDetails"), children: "\u2715" })
|
|
1298
|
+
] }),
|
|
1299
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dl", { className: "rg-dl rg-dl-compact", children: [
|
|
1300
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: t("graph.edgeFrom") }),
|
|
1301
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "rg-ellipsis", title: detail.fromLabel, children: detail.fromLabel }),
|
|
1302
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: t("graph.edgeTo") }),
|
|
1303
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { className: "rg-ellipsis", title: detail.toLabel, children: detail.toLabel }),
|
|
1304
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: t("graph.edgeKind") }),
|
|
1305
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", { children: t(edgeKindKey(detail.kind)) })
|
|
1306
|
+
] }),
|
|
1307
|
+
detail.label !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "rg-graph-aside-detail", children: detail.label })
|
|
1308
|
+
] });
|
|
1309
|
+
}
|
|
1310
|
+
function edgeKindKey(kind) {
|
|
1311
|
+
switch (kind) {
|
|
1312
|
+
case "produces":
|
|
1313
|
+
return "graph.edgeProduces";
|
|
1314
|
+
case "consumes":
|
|
1315
|
+
return "graph.edgeConsumes";
|
|
1316
|
+
case "transitions":
|
|
1317
|
+
return "graph.edgeTransitions";
|
|
1318
|
+
case "ranks":
|
|
1319
|
+
default:
|
|
1320
|
+
return "graph.edgeRanks";
|
|
1321
|
+
}
|
|
1322
|
+
}
|
|
1253
1323
|
function GraphTooltip({ node, degree, x, y, containerWidth }) {
|
|
1254
1324
|
const halfWidth = 130;
|
|
1255
1325
|
const left = Math.min(Math.max(x, halfWidth), Math.max(halfWidth, containerWidth - halfWidth));
|
|
@@ -1272,6 +1342,8 @@ var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
|
1272
1342
|
function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChange, locateRequest = null }) {
|
|
1273
1343
|
const [viewport, setViewport] = (0, import_react.useState)(IDENTITY);
|
|
1274
1344
|
const [hoverId, setHoverId] = (0, import_react.useState)(null);
|
|
1345
|
+
const [hoverEdgeId, setHoverEdgeId] = (0, import_react.useState)(null);
|
|
1346
|
+
const [selectedEdgeId, setSelectedEdgeId] = (0, import_react.useState)(null);
|
|
1275
1347
|
const [hidden, setHidden] = (0, import_react.useState)(/* @__PURE__ */ new Set());
|
|
1276
1348
|
const [size, setSize] = (0, import_react.useState)({ width: 0, height });
|
|
1277
1349
|
const [query, setQuery] = (0, import_react.useState)("");
|
|
@@ -1280,6 +1352,8 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1280
1352
|
const [colorMode, setColorMode] = (0, import_react.useState)("tone");
|
|
1281
1353
|
const [onlyConnected, setOnlyConnected] = (0, import_react.useState)(false);
|
|
1282
1354
|
const [layoutEpoch, setLayoutEpoch] = (0, import_react.useState)(0);
|
|
1355
|
+
const pointersRef = (0, import_react.useRef)(/* @__PURE__ */ new Map());
|
|
1356
|
+
const pinchPrevRef = (0, import_react.useRef)(null);
|
|
1283
1357
|
const [offsets, setOffsets] = (0, import_react.useState)({});
|
|
1284
1358
|
const wrapRef = (0, import_react.useRef)(null);
|
|
1285
1359
|
const dragRef = (0, import_react.useRef)({
|
|
@@ -1377,11 +1451,29 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1377
1451
|
return () => host.removeEventListener("wheel", listener);
|
|
1378
1452
|
}, []);
|
|
1379
1453
|
const onPointerDown = (0, import_react.useCallback)((event) => {
|
|
1454
|
+
const id = event.pointerId ?? 0;
|
|
1455
|
+
pointersRef.current.set(id, { x: event.clientX, y: event.clientY });
|
|
1456
|
+
if (pointersRef.current.size >= 2) {
|
|
1457
|
+
const [a, b] = [...pointersRef.current.values()];
|
|
1458
|
+
pinchPrevRef.current = { a: a ?? { x: 0, y: 0 }, b: b ?? { x: 0, y: 0 } };
|
|
1459
|
+
dragRef.current = { active: false, moved: false, x: 0, y: 0 };
|
|
1460
|
+
return;
|
|
1461
|
+
}
|
|
1380
1462
|
suppressClickRef.current = false;
|
|
1381
1463
|
dragRef.current = { active: true, moved: false, x: event.clientX, y: event.clientY };
|
|
1382
1464
|
}, []);
|
|
1383
1465
|
const onPointerMove = (0, import_react.useCallback)(
|
|
1384
1466
|
(event) => {
|
|
1467
|
+
const id = event.pointerId ?? 0;
|
|
1468
|
+
if (pointersRef.current.has(id)) pointersRef.current.set(id, { x: event.clientX, y: event.clientY });
|
|
1469
|
+
if (pointersRef.current.size >= 2 && pinchPrevRef.current !== null) {
|
|
1470
|
+
const [a, b] = [...pointersRef.current.values()];
|
|
1471
|
+
const next = { a: a ?? { x: 0, y: 0 }, b: b ?? { x: 0, y: 0 } };
|
|
1472
|
+
const prev = pinchPrevRef.current;
|
|
1473
|
+
setViewport((current) => clampPan(pinchViewport(current, prev, next), size, bounds));
|
|
1474
|
+
pinchPrevRef.current = next;
|
|
1475
|
+
return;
|
|
1476
|
+
}
|
|
1385
1477
|
const nodeDrag = nodeDragRef.current;
|
|
1386
1478
|
if (nodeDrag !== null) {
|
|
1387
1479
|
const dx2 = event.clientX - nodeDrag.x;
|
|
@@ -1409,7 +1501,9 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1409
1501
|
},
|
|
1410
1502
|
[viewport.scale, size, bounds]
|
|
1411
1503
|
);
|
|
1412
|
-
const onPointerUp = (0, import_react.useCallback)(() => {
|
|
1504
|
+
const onPointerUp = (0, import_react.useCallback)((event) => {
|
|
1505
|
+
pointersRef.current.delete(event?.pointerId ?? 0);
|
|
1506
|
+
if (pointersRef.current.size < 2) pinchPrevRef.current = null;
|
|
1413
1507
|
if (nodeDragRef.current !== null && nodeDragRef.current.moved) suppressClickRef.current = true;
|
|
1414
1508
|
nodeDragRef.current = null;
|
|
1415
1509
|
dragRef.current = { active: false, moved: false, x: 0, y: 0 };
|
|
@@ -1432,6 +1526,7 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1432
1526
|
});
|
|
1433
1527
|
const hit = grid.hit(world);
|
|
1434
1528
|
onFocusChange(hit === null ? null : hit.id);
|
|
1529
|
+
if (hit === null) setSelectedEdgeId(null);
|
|
1435
1530
|
},
|
|
1436
1531
|
[grid, viewport, onFocusChange]
|
|
1437
1532
|
);
|
|
@@ -1475,6 +1570,8 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1475
1570
|
onFocusChange(null);
|
|
1476
1571
|
setQuery("");
|
|
1477
1572
|
setHoverId(null);
|
|
1573
|
+
setSelectedEdgeId(null);
|
|
1574
|
+
setHoverEdgeId(null);
|
|
1478
1575
|
return;
|
|
1479
1576
|
}
|
|
1480
1577
|
if (event.key === "+" || event.key === "=") {
|
|
@@ -1522,6 +1619,12 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1522
1619
|
},
|
|
1523
1620
|
[nodeById]
|
|
1524
1621
|
);
|
|
1622
|
+
const selectedEdgeDetail = (0, import_react.useMemo)(() => {
|
|
1623
|
+
if (selectedEdgeId === null) return null;
|
|
1624
|
+
const edge = visibleEdges.find((e) => e.id === selectedEdgeId);
|
|
1625
|
+
if (!edge) return null;
|
|
1626
|
+
return edgeDetailOf(edge, nodeById);
|
|
1627
|
+
}, [selectedEdgeId, visibleEdges, nodeById]);
|
|
1525
1628
|
const hoverNode = hoverId === null ? void 0 : nodeById.get(hoverId);
|
|
1526
1629
|
const tooltip = hoverNode ? {
|
|
1527
1630
|
x: hoverNode.x * viewport.scale + viewport.tx + NODE_WIDTH * viewport.scale / 2,
|
|
@@ -1550,6 +1653,8 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1550
1653
|
onFocusChange(null);
|
|
1551
1654
|
setQuery("");
|
|
1552
1655
|
setHoverId(null);
|
|
1656
|
+
setHoverEdgeId(null);
|
|
1657
|
+
setSelectedEdgeId(null);
|
|
1553
1658
|
setOffsets({});
|
|
1554
1659
|
},
|
|
1555
1660
|
canReset: focusId !== null || query !== "" || Object.keys(offsets).length > 0,
|
|
@@ -1608,20 +1713,37 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1608
1713
|
const to = nodeById.get(edge.to);
|
|
1609
1714
|
if (!from || !to) return null;
|
|
1610
1715
|
const active = focusId !== null && highlighted.has(edge.from) && highlighted.has(edge.to);
|
|
1716
|
+
const hoveredEdge = hoverEdgeId === edge.id;
|
|
1717
|
+
const selectedEdge = selectedEdgeId === edge.id;
|
|
1611
1718
|
const geometry = edgeGeometry(from, to, curvatures[index] ?? 0);
|
|
1612
1719
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("g", { children: [
|
|
1720
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1721
|
+
"path",
|
|
1722
|
+
{
|
|
1723
|
+
d: geometry.path,
|
|
1724
|
+
className: "rg-edge-hit",
|
|
1725
|
+
onPointerEnter: () => setHoverEdgeId(edge.id),
|
|
1726
|
+
onPointerLeave: () => setHoverEdgeId((current) => current === edge.id ? null : current),
|
|
1727
|
+
onClick: (event) => {
|
|
1728
|
+
event.stopPropagation();
|
|
1729
|
+
setSelectedEdgeId(edge.id);
|
|
1730
|
+
onFocusChange(null);
|
|
1731
|
+
}
|
|
1732
|
+
}
|
|
1733
|
+
),
|
|
1613
1734
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1614
1735
|
"path",
|
|
1615
1736
|
{
|
|
1616
1737
|
d: geometry.path,
|
|
1617
1738
|
fill: "none",
|
|
1618
|
-
stroke: active ? "var(--dsw-alias-brand-primary)" : edgeColor(edge),
|
|
1619
|
-
strokeWidth: active ? 2 : 1.2,
|
|
1620
|
-
strokeOpacity: focusId === null ? 0.9 : active ? 1 : 0.22,
|
|
1621
|
-
markerEnd: active ? "url(#rg-arrow-active)" : "url(#rg-arrow)"
|
|
1739
|
+
stroke: selectedEdge || hoveredEdge || active ? "var(--dsw-alias-brand-primary)" : edgeColor(edge),
|
|
1740
|
+
strokeWidth: selectedEdge ? 2.6 : hoveredEdge ? 2.2 : active ? 2 : 1.2,
|
|
1741
|
+
strokeOpacity: focusId === null && selectedEdgeId === null ? 0.9 : selectedEdge || hoveredEdge || active ? 1 : 0.22,
|
|
1742
|
+
markerEnd: selectedEdge || hoveredEdge || active ? "url(#rg-arrow-active)" : "url(#rg-arrow)"
|
|
1622
1743
|
}
|
|
1623
1744
|
),
|
|
1624
|
-
active && geometry.labelAnchor !== null && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("text", { x: geometry.labelAnchor.x, y: geometry.labelAnchor.y - 4, textAnchor: "middle", className: "rg-graph-edge-label", children:
|
|
1745
|
+
(active || hoveredEdge || selectedEdge) && geometry.labelAnchor !== null && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("text", { x: geometry.labelAnchor.x, y: geometry.labelAnchor.y - 4, textAnchor: "middle", className: "rg-graph-edge-label", children: t(edgeKindKey(edge.kind)) }),
|
|
1746
|
+
selectedEdge && geometry.labelAnchor !== null && edge.label !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("text", { x: geometry.labelAnchor.x, y: geometry.labelAnchor.y + 12, textAnchor: "middle", className: "rg-graph-edge-label", children: edge.label })
|
|
1625
1747
|
] }, edge.id);
|
|
1626
1748
|
}),
|
|
1627
1749
|
visibleNodes.map((node) => {
|
|
@@ -1633,7 +1755,10 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1633
1755
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1634
1756
|
"g",
|
|
1635
1757
|
{
|
|
1636
|
-
|
|
1758
|
+
style: {
|
|
1759
|
+
transform: `translate(${node.x}px, ${node.y}px)`,
|
|
1760
|
+
transition: dragged ? "none" : void 0
|
|
1761
|
+
},
|
|
1637
1762
|
opacity: dimmed ? 0.3 : 1,
|
|
1638
1763
|
className: "rg-graph-node",
|
|
1639
1764
|
role: "button",
|
|
@@ -1644,6 +1769,7 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1644
1769
|
event.stopPropagation();
|
|
1645
1770
|
if (suppressClickRef.current) return;
|
|
1646
1771
|
onFocusChange(node.id);
|
|
1772
|
+
setSelectedEdgeId(null);
|
|
1647
1773
|
},
|
|
1648
1774
|
onDoubleClick: () => onNodeDoubleClick(node),
|
|
1649
1775
|
onPointerDown: (event) => onNodePointerDown(event, node.id),
|
|
@@ -1719,7 +1845,8 @@ function GuardGraph({ graph, height = VIEWPORT_HEIGHT_WIDE, focusId, onFocusChan
|
|
|
1719
1845
|
onLocate: locateNode,
|
|
1720
1846
|
onClose: () => onFocusChange(null)
|
|
1721
1847
|
}
|
|
1722
|
-
)
|
|
1848
|
+
),
|
|
1849
|
+
!focusNode && selectedEdgeDetail !== null && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(EdgeDetails, { detail: selectedEdgeDetail, onClose: () => setSelectedEdgeId(null) })
|
|
1723
1850
|
] }),
|
|
1724
1851
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "rg-graph-status", role: "status", children: [
|
|
1725
1852
|
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "rg-graph-zoom-label", children: [
|
|
@@ -3139,7 +3266,7 @@ function openPanel(ctx) {
|
|
|
3139
3266
|
}
|
|
3140
3267
|
|
|
3141
3268
|
// src/client/styles.css
|
|
3142
|
-
var styles_default = "/**\n * \u7BA1\u7406\u9762\u677F\u7684\u6837\u5F0F\u3002\n *\n * ## \u7EAA\u5F8B\n *\n * 1. **\u53EA\u7528\u4E3B\u9898\u53D8\u91CF**\uFF1A\u989C\u8272\u3001\u5706\u89D2\u3001\u5B57\u4F53\u5168\u90E8\u5F15\u7528 `--dsw-alias-*` / `--dsw-radius-*`\n * / `--dsw-shadow-*` \u5BB6\u65CF\u3002\u5BBF\u4E3B\u91CD\u547D\u540D\u4E00\u4E2A\u53D8\u91CF\u65F6\u9762\u677F\u53EA\u662F\u53D8\u4E11\uFF0C\u4E0D\u4F1A\u5D29 \u2014\u2014\n * \u56E0\u6B64\u6BCF\u4E2A var() \u90FD\u5E26\u4E00\u4E2A\u4FDD\u5B88\u7684\u515C\u5E95\u503C\u3002\n * 2. **\u4E24\u79CD\u5F62\u6001\u6309\u5BB9\u5668\u5BBD\u5EA6**\uFF1A`.rg-panel[data-form=\"narrow\"]` \u7531 JS \u6D4B\u51FA\u7684\n * \u9762\u677F\u5BBD\u5EA6\u9A71\u52A8\uFF08\u9762\u677F\u53EF\u80FD\u6302\u5728\u88AB\u62D6\u7A84\u7684\u4FA7\u680F\u91CC\uFF0C\u5A92\u4F53\u67E5\u8BE2\u91CF\u7684\u662F\u7A97\u53E3\uFF0C\u4F1A\u7B54\u9519\uFF09\u3002\n * 3. **\u5C40\u90E8\u52A8\u6548\u4EE4\u724C**\uFF1A\u8FC7\u6E21\u65F6\u957F\u4E0E\u7F13\u52A8\u5B9A\u4E49\u5728 `.rg-panel` \u4E0A\u7684 `--rg-*`\uFF0C\n * \u4E0D\u4F9D\u8D56\u672A\u7ECF\u9A8C\u8BC1\u7684\u5168\u5C40 `--ds-*`\uFF08\u751F\u6001\u63D2\u4EF6\u540C\u6837\u81EA\u6301\u8FD9\u5957\u4EE4\u724C\uFF09\u3002\n * 4. **\u4E0D\u5199\u6B7B\u5BB9\u5668\u5BBD\u5EA6**\uFF1A\u9762\u677F\u5360\u6EE1\u5BBF\u4E3B\u7ED9\u7684\u4E2D\u592E\u9762\u677F\u533A\u57DF\u3002\n * 5. **\u5BF9\u6BD4\u5EA6**\uFF1A\u6B63\u6587 `--dsw-alias-label-primary`\uFF0C\u6B21\u8981 `--dsw-alias-label-secondary`\uFF0C\n * \u63D0\u793A `--dsw-alias-label-tertiary`\uFF08\u4EAE/\u6697\u4E3B\u9898\u90FD\u7531\u5BBF\u4E3B\u4FDD\u8BC1\u53EF\u8BFB\uFF09\u3002\n */\n\n.rg-panel {\n /* \u5C40\u90E8\u4EE4\u724C\uFF1A\u63A7\u4EF6\u9AD8\u5EA6\u3001\u52A8\u6548\u3001\u95F4\u8DDD\u3002\u6539\u4E00\u5904\uFF0C\u6574\u5757\u9762\u677F\u8DDF\u7740\u4E00\u81F4\u3002 */\n --rg-control-h: 28px;\n --rg-motion-fast: 120ms;\n --rg-motion-medium: 200ms;\n --rg-ease: cubic-bezier(0.2, 0, 0, 1);\n --rg-gap: 16px;\n\n display: flex;\n flex-direction: column;\n gap: var(--rg-gap);\n padding: 20px 24px 32px;\n min-width: 0;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-base);\n font-family: var(--dsw-font-family);\n font-size: var(--dsw-font-s-14, 14px);\n line-height: var(--dsw-font-s-14-line-height, 22px);\n\n /**\n * \u9762\u677F\u5FC5\u987B**\u81EA\u5DF1**\u662F\u6EDA\u52A8\u5BB9\u5668\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u80FD\u6307\u671B\u5BBF\u4E3B\uFF1A\u5B9E\u6D4B\uFF08\u6C99\u7BB1 sb-rg-c5\uFF09\u5BBF\u4E3B\u69FD\u4F4D\u662F\u8FD9\u6837\u4E00\u4E32\n * .centerCol { overflow-y: hidden } \u2190 \u7956\u5148\u628A\u6EA2\u51FA\u88C1\u6389\n * .mainPanel { height: 714px; overflow: visible }\n * .rg-panel { height: 3965px } \u2190 \u5185\u5BB9\u81EA\u7136\u9AD8\u5EA6\uFF0C\u8D85\u51FA\u540E\u76F4\u63A5\u88AB\u88C1\n * \u6587\u6863\u672C\u8EAB\u4E0D\u6EDA\uFF08docScrollH == clientH == 714\uFF09\uFF0C\u56E0\u6B64**\u4E0B\u65B9\u6570\u636E\u9875\u6C38\u8FDC\u770B\u4E0D\u5230**\u3002\n *\n * \u4E09\u4E2A\u5C5E\u6027\u7F3A\u4E00\u4E0D\u53EF\uFF1A\n * - `height: 100%` + `min-height: 0`\uFF1A\u6491\u6EE1\u5BBF\u4E3B\u7ED9\u7684\u786E\u5B9A\u9AD8\u5EA6\uFF0C\u4E14\u5141\u8BB8\u6536\u7F29\u5230\u53EF\u6EDA\u52A8\uFF1B\n * \u53EA\u5199 overflow \u800C\u4E0D\u9650\u5236\u9AD8\u5EA6\uFF0Cflex \u5B50\u9879\u4ECD\u4F1A\u6309\u5185\u5BB9\u6491\u5F00\uFF0C\u6EDA\u4E0D\u8D77\u6765\u3002\n * - `overflow-y: auto`\uFF1A\u9762\u677F\u81EA\u5DF1\u6EDA\u3002\n * - `overscroll-behavior: contain`\uFF1A\u6EDA\u5230\u5C3D\u5934\u4E0D\u628A\u6EDA\u52A8\u4F20\u7ED9\u5BBF\u4E3B\uFF0C\u5426\u5219\u4F1A\u628A\u6574\u9875/\u4FA7\u680F\n * \u5E26\u7740\u4E00\u8D77\u6EDA\uFF0C\u89C6\u89C9\u4E0A\u50CF\"\u9762\u677F\u5728\u4E71\u8DF3\"\u3002\n */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n overscroll-behavior: contain;\n}\n\n/* \u7A84\u5F62\u6001\uFF08\u4FA7\u680F / \u5206\u5C4F\uFF09\uFF1A\u6536\u7D27\u8FB9\u8DDD\u4E0E\u95F4\u8DDD\uFF0C\u628A\u7EB5\u5411\u7A7A\u95F4\u8BA9\u7ED9\u5185\u5BB9\u3002 */\n.rg-panel[data-form='narrow'] {\n --rg-gap: 12px;\n padding: 14px 14px 24px;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n/* ---------- \u5934\u90E8 ---------- */\n\n.rg-header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n}\n\n.rg-header-main {\n min-width: 0;\n flex: 1 1 260px;\n}\n\n.rg-title {\n margin: 0;\n font-size: var(--dsw-font-l-20, 20px);\n font-weight: var(--dsw-font-l-20-font-weight, 600);\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-panel[data-form='narrow'] .rg-title {\n font-size: var(--dsw-font-m-18, 18px);\n}\n\n.rg-subtitle {\n margin: 4px 0 0;\n font-size: var(--dsw-font-xs-13, 13px);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n.rg-project-name {\n font-weight: var(--dsw-font-xs-strong-13, 600);\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-partition-workspace-full {\n font-size: var(--dsw-font-xxs-12, 12px);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n direction: ltr;\n}\n\n.rg-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* ---------- \u63A7\u4EF6 ---------- */\n\n.rg-button {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-height: var(--rg-control-h);\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-radius: var(--dsw-radius-sm, 8px);\n padding: 4px 12px;\n font: inherit;\n font-size: var(--dsw-font-xs-13, 13px);\n cursor: pointer;\n transition:\n background var(--rg-motion-fast) var(--rg-ease),\n border-color var(--rg-motion-fast) var(--rg-ease);\n}\n\n.rg-button:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-button:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n.rg-button:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.rg-button-small {\n min-height: 24px;\n padding: 2px 9px;\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-button-icon {\n min-width: 28px;\n padding: 2px 6px;\n justify-content: center;\n font-size: var(--dsw-font-s-14, 14px);\n line-height: 1;\n}\n\n.rg-button-danger {\n border-color: var(--dsw-alias-state-error-primary);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.rg-button-active {\n border-color: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-brand-primary);\n}\n\n/* \u8F6E\u8BE2\u6682\u505C\u6001\u6309\u94AE\uFF08\u6682\u505C = \u9700\u8981\u88AB\u770B\u89C1\u7684\u72B6\u6001\uFF0C\u4E0D\u80FD\u53EA\u9760 aria-pressed\uFF09\u3002 */\n.rg-button-paused {\n border-color: var(--dsw-alias-state-warn-primary);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.rg-link {\n appearance: none;\n border: none;\n background: none;\n padding: 0 2px;\n font: inherit;\n font-size: inherit;\n color: var(--dsw-alias-brand-primary);\n cursor: pointer;\n text-decoration: underline;\n}\n\n/* \u5206\u6BB5\u63A7\u4EF6\uFF08\u5E03\u5C40 / \u7740\u8272\u53E3\u5F84\uFF09\u3002 */\n.rg-segmented {\n display: inline-flex;\n align-items: stretch;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n overflow: hidden;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.rg-segment {\n appearance: none;\n border: none;\n border-right: 1px solid var(--dsw-alias-border-l1);\n background: none;\n color: var(--dsw-alias-label-secondary);\n padding: 3px 9px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n cursor: pointer;\n transition: background var(--rg-motion-fast) var(--rg-ease);\n}\n\n.rg-segment:last-child {\n border-right: none;\n}\n\n.rg-segment:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-segment[aria-pressed='true'] {\n background: var(--dsw-alias-interactive-bg-active, var(--dsw-alias-bg-layer-2));\n color: var(--dsw-alias-label-primary);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n}\n\n.rg-segment:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n.rg-field {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n}\n\n.rg-field-grow {\n flex: 1 1 160px;\n}\n\n.rg-field-label {\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-input,\n.rg-select {\n min-height: var(--rg-control-h);\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n padding: 2px 8px;\n font: inherit;\n font-size: var(--dsw-font-xs-13, 13px);\n max-width: 100%;\n}\n\n.rg-input:focus-visible,\n.rg-select:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* ---------- \u63D0\u793A\u6761 ---------- */\n\n.rg-notice {\n margin: 0;\n padding: 8px 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-error {\n margin: 0;\n padding: 10px 12px;\n border-radius: var(--dsw-radius-sm, 8px);\n border: 1px solid var(--dsw-alias-state-error-primary);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n.rg-empty {\n margin: 0;\n padding: 8px 0;\n font-size: var(--dsw-font-xs-13, 13px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-muted {\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-strong {\n font-weight: var(--dsw-font-xs-strong-13, 600);\n}\n\n.rg-block {\n display: block;\n}\n\n.rg-ellipsis {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rg-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n margin-left: 6px;\n padding: 0 4px;\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxxs-11, 11px);\n}\n\n/* \u52A0\u8F7D / \u4E0D\u53EF\u7528\u72B6\u6001\u5757\uFF1A\u5360\u4F4D\u9AD8\u5EA6\u7A33\u5B9A\uFF0C\u907F\u514D\u8F6E\u8BE2\u65F6\u9875\u9762\u8DF3\u52A8\u3002 */\n.rg-state-block {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 24px 0;\n}\n\n.rg-state-title {\n margin: 0;\n font-size: var(--dsw-font-m-18, 18px);\n font-weight: var(--dsw-font-m-18-font-weight, 600);\n}\n\n/* ---------- \u5361\u7247\u7F51\u683C ---------- */\n\n.rg-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: 12px;\n}\n\n.rg-panel[data-form='narrow'] .rg-grid {\n grid-template-columns: 1fr;\n}\n\n.rg-card {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 14px 16px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-layer-1);\n min-width: 0;\n min-height: 0;\n}\n\n/**\n * \u5361\u7247\u5185\u5BB9\u533A\u56FA\u5B9A\u9AD8\u5EA6 + \u5185\u90E8\u6EDA\u52A8\uFF08v0.9.1 \u7528\u6237\u9700\u6C42\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u9650\u9AD8\u800C\u4E0D\u662F\u8BA9\u5185\u5BB9\u81EA\u7136\u4F38\u5C55\uFF1A\u5C55\u5F00\u7684\u5361\u7247\u591A\u4E86\u4E4B\u540E\uFF0C\u9762\u677F\u88AB\u5355\u4E2A\n * \u5361\u7247\u6491\u5230\u51E0\u5343\u50CF\u7D20\uFF0C\u4E0B\u9762\u7684\u5361\u7247\u8981\u6EDA\u5F88\u4E45\u624D\u770B\u5F97\u5230 \u2014\u2014 \u5747\u5300\u7684\u89C6\u53E3\u5BC6\u5EA6\n * \u6BD4\u5355\u5361\u7684\u5B8C\u6574\u6027\u66F4\u91CD\u8981\uFF08\u8FD9\u6B63\u662F\u7528\u6237\u539F\u59CB\u8BC9\u6C42\uFF09\u3002\n *\n * - \u9ED8\u8BA4 `--rg-card-body-h: 240px`\uFF1A\u8DB3\u591F\u770B\u7EA6 10 \u884C\u5185\u5BB9\uFF0C\u8D85\u51FA\u5185\u90E8\u6EDA\u52A8\uFF1B\n * - `overscroll-behavior: contain`\uFF1A\u6EDA\u5230\u5C3D\u5934\u4E0D\u628A\u5916\u5C42\u9762\u677F\u5E26\u7740\u6EDA\uFF1B\n * - `.rg-card-enlarged` \u89E3\u9664\u9650\u9AD8\uFF08\u2922 \u6309\u94AE\uFF09\uFF0C\u644A\u5F00\u9605\u8BFB\u957F\u6E05\u5355\uFF1B\n * - \u7A84\u5F62\u6001\u628A\u9650\u9AD8\u964D\u5230 180px\uFF08\u4FA7\u680F\u7A7A\u95F4\u5C11\uFF0C\u5BC6\u5EA6\u4F18\u5148\uFF09\u3002\n */\n.rg-card-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n height: var(--rg-card-body-h, 240px);\n overflow-y: auto;\n overscroll-behavior: contain;\n min-height: 0;\n}\n\n/* \u6269\u5927\u6001\uFF1A\u89E3\u9664\u9650\u9AD8\uFF0C\u5361\u7247\u6309\u5185\u5BB9\u81EA\u7136\u4F38\u5C55\uFF08\u9762\u677F\u81EA\u8EAB\u4ECD\u662F\u6EDA\u52A8\u5BB9\u5668\uFF09\u3002 */\n.rg-card-enlarged .rg-card-body {\n height: auto;\n max-height: none;\n overflow-y: visible;\n}\n\n/* \u6269\u5927\u6309\u94AE\uFF1A\u5934\u90E8\u5185\u7684\u7B2C\u4E8C\u4E2A\u52A8\u4F5C\uFF0C\u5C0F\u5C3A\u5BF8\u3001\u4F4E\u5BF9\u6BD4\uFF0C\u4E0D\u4E0E\u6298\u53E0\u7BAD\u5934\u7ADE\u4E89\u3002 */\n.rg-card-expand {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n margin-left: auto;\n border-radius: var(--dsw-radius-sm, 8px);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n user-select: none;\n transition: background var(--rg-motion-fast, 120ms) var(--rg-ease, ease);\n}\n.rg-card-expand:hover,\n.rg-card-expand:focus-visible {\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n.rg-card-enlarged .rg-card-expand {\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-card-title {\n margin: 0;\n font-size: var(--dsw-font-s-14, 14px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n}\n\n/* \u7A84\u5F62\u6001\uFF1A\u4FA7\u680F\u7A7A\u95F4\u5C11\uFF0C\u5BC6\u5EA6\u4F18\u5148 \u2014\u2014 \u5185\u5BB9\u533A\u9650\u9AD8\u964D\u4E3A 180px\u3002 */\n.rg-panel[data-form='narrow'] .rg-card-body {\n --rg-card-body-h: 180px;\n}\n\n.rg-card-title {\n margin: 0;\n font-size: var(--dsw-font-s-14, 14px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n}\n\n.rg-card-subtitle {\n margin: 4px 0 0;\n font-size: var(--dsw-font-xxs-12, 12px);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-card-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n/* \u53EF\u6298\u53E0\u5361\u7247\uFF1A\u6807\u9898\u884C\u662F\u6309\u94AE\uFF0C\u6574\u4E2A\u5934\u90E8\u53EF\u70B9\u3002 */\n.rg-card-head {\n appearance: none;\n border: none;\n background: none;\n padding: 0;\n margin: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n cursor: pointer;\n font: inherit;\n color: inherit;\n text-align: left;\n}\n\n.rg-card-head:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.rg-card-head-hint {\n margin-left: auto;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rg-card-chevron {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-card-collapsed {\n padding-bottom: 10px;\n}\n\n.rg-card-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n/* ---------- \u5FBD\u6807 / \u5706\u70B9 / \u8BA1\u6570\u7247 ---------- */\n\n.rg-badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--dsw-radius-sm, 8px);\n border: 1px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxs-12, 12px);\n white-space: nowrap;\n}\n\n.rg-badge-idle,\n.rg-badge-monitoring {\n border-color: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-brand-primary);\n}\n\n.rg-badge-crashed,\n.rg-badge-error {\n border-color: var(--dsw-alias-state-error-primary);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.rg-badge-deciding,\n.rg-badge-worsening,\n.rg-badge-warn {\n border-color: var(--dsw-alias-state-warn-primary);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.rg-badge-stabilizing,\n.rg-badge-recovered,\n.rg-badge-improving,\n.rg-badge-success {\n border-color: var(--dsw-alias-state-success-primary);\n color: var(--dsw-alias-state-success-primary);\n}\n\n.rg-badge-stable,\n.rg-badge-neutral {\n border-color: var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-chip {\n display: inline-flex;\n align-items: center;\n padding: 0 6px;\n border-radius: var(--dsw-radius-xs, 4px);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxxs-11, 11px);\n white-space: nowrap;\n}\n\n.rg-chip-warn {\n border: 1px solid var(--dsw-alias-state-warn-primary);\n color: var(--dsw-alias-state-warn-primary);\n background: none;\n}\n\n.rg-chip-more {\n font-variant-numeric: tabular-nums;\n}\n\n.rg-names {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 3px;\n min-width: 0;\n}\n\n.rg-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dsw-alias-label-secondary);\n flex: none;\n}\n\n.rg-dot-info {\n background: var(--dsw-alias-brand-primary);\n}\n\n.rg-dot-success {\n background: var(--dsw-alias-state-success-primary);\n}\n\n.rg-dot-warn {\n background: var(--dsw-alias-state-warn-primary);\n}\n\n.rg-dot-error {\n background: var(--dsw-alias-state-error-primary);\n}\n\n/* ---------- \u8FDB\u5EA6\u6761 ---------- */\n\n.rg-bar {\n display: inline-block;\n width: 72px;\n height: 4px;\n border-radius: 2px;\n background: var(--dsw-alias-bg-layer-2);\n overflow: hidden;\n flex: none;\n}\n\n.rg-bar-wide {\n width: 100%;\n}\n\n.rg-bar-fill {\n display: block;\n height: 100%;\n background: var(--dsw-alias-brand-primary);\n transition: width var(--rg-motion-medium) var(--rg-ease);\n}\n\n/* ---------- KPI \u6458\u8981\u6761 ---------- */\n\n.rg-kpis {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 10px;\n}\n\n.rg-kpi {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n padding: 12px 14px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-layer-1);\n min-width: 0;\n}\n\n.rg-kpi-label {\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-kpi-value {\n font-size: var(--dsw-font-s-14, 14px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n font-variant-numeric: tabular-nums;\n}\n\n.rg-kpi-big {\n font-size: var(--dsw-font-m-18, 18px);\n font-weight: var(--dsw-font-m-18-font-weight, 600);\n}\n\n.rg-kpi-detail {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n}\n\n.rg-kpi-meta {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.rg-ring {\n flex: none;\n}\n\n.rg-ring-text {\n fill: var(--dsw-alias-label-primary);\n font-size: 11px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n\n/* ---------- \u63CF\u8FF0\u5217\u8868 / \u9636\u6BB5\u8F68\u9053 ---------- */\n\n.rg-dl {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 4px 12px;\n margin: 0;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n.rg-dl dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-dl dd {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex-wrap: wrap;\n}\n\n.rg-dl-compact {\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-mono {\n font-family: var(--dsw-font-mono, var(--dsw-font-family-mono, ui-monospace, monospace));\n font-size: var(--dsw-font-xxs-12, 12px);\n overflow-wrap: anywhere;\n}\n\n/* \u9636\u6BB5\u8F68\u9053\uFF1A\u72B6\u6001\u673A\u4E0D\u662F\u8FDB\u5EA6\u6761\uFF0Cvisited \u4E0E current \u7528\u4E0D\u540C\u901A\u9053\u8868\u8FBE\u3002 */\n.rg-stage-rail {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-wrap: wrap;\n gap: 4px 10px;\n}\n\n.rg-stage-cell {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-stage-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n border: 1px solid var(--dsw-alias-border-l2);\n background: none;\n flex: none;\n}\n\n.rg-stage-visited {\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-stage-visited .rg-stage-dot {\n background: var(--dsw-alias-border-l3, var(--dsw-alias-border-l2));\n border-color: var(--dsw-alias-border-l3, var(--dsw-alias-border-l2));\n}\n\n.rg-stage-current {\n color: var(--dsw-alias-label-primary);\n font-weight: var(--dsw-font-xxxs-strong-11, 600);\n}\n\n.rg-stage-current .rg-stage-dot {\n background: var(--dsw-alias-brand-primary);\n border-color: var(--dsw-alias-brand-primary);\n box-shadow: 0 0 0 2px var(--dsw-alias-bg-layer-2);\n}\n\n/* ---------- \u6307\u6807 ---------- */\n\n.rg-metrics {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.rg-metric {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.rg-metric-label {\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-metric-value {\n font-size: var(--dsw-font-xs-13, 13px);\n font-variant-numeric: tabular-nums;\n}\n\n.rg-metric-undefined {\n color: var(--dsw-alias-label-secondary);\n font-style: italic;\n}\n\n.rg-metric-reason {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-metric-detail {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-trend {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n/* ---------- \u8FC1\u79FB / \u51B3\u7B56 / \u4E8B\u4EF6\u65F6\u95F4\u7EBF ---------- */\n\n.rg-transitions,\n.rg-decisions,\n.rg-events {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.rg-transition,\n.rg-decision,\n.rg-event {\n display: flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-transition-reason,\n.rg-decision-detail,\n.rg-event-detail {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-decision-bundle {\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-transition-time,\n.rg-decision-time,\n.rg-event-time {\n flex: none;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n font-size: var(--dsw-font-xxxs-11, 11px);\n}\n\n.rg-event-ago {\n flex: none;\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n font-size: var(--dsw-font-xxxs-11, 11px);\n}\n\n/* ---------- \u5ACC\u7591\u6392\u540D ---------- */\n\n.rg-risks {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n/* \u300C\u5C55\u5F00\u5176\u4F59 N \u4E2A\u300D\u6309\u94AE\uFF1A\u5DE6\u5BF9\u9F50\u7684\u94FE\u63A5\u5F62\u6001\uFF0C\u4E0E\u5361\u7247\u5185\u7684\u5176\u5B83\u64CD\u4F5C\u533A\u5206\u3002 */\n.rg-risks-expand {\n align-self: flex-start;\n margin-top: 2px;\n}\n\n.rg-risk {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n}\n\n.rg-risk:last-child {\n border-bottom: none;\n padding-bottom: 0;\n}\n\n.rg-risk-main {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.rg-risk-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n.rg-risk-score {\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n.rg-risk-detail {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-risk-actions {\n display: flex;\n gap: 6px;\n}\n\n/* ---------- \u80FD\u529B\u6E05\u5355\u8868 ---------- */\n\n.rg-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--dsw-font-xxs-12, 12px);\n table-layout: fixed;\n}\n\n.rg-table th,\n.rg-table td {\n text-align: left;\n vertical-align: top;\n padding: 5px 6px;\n border-bottom: 1px solid var(--dsw-alias-hairline, var(--dsw-alias-border-l1));\n overflow-wrap: anywhere;\n}\n\n.rg-table thead th {\n color: var(--dsw-alias-label-secondary);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n white-space: nowrap;\n border-bottom-color: var(--dsw-alias-border-l2);\n}\n\n.rg-table tbody tr {\n cursor: pointer;\n}\n\n.rg-table tbody tr:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n/* \u9009\u4E2D\u884C\uFF1A\u5DE6\u4FA7 2px \u7AD6\u6761 + \u5E95\u8272\uFF08\u53EA\u9760\u5E95\u8272\u5728\u6697\u8272\u4E3B\u9898\u4E0B\u4E0D\u591F\u663E\u773C\uFF09\u3002 */\n.rg-row-selected {\n background: var(--dsw-alias-interactive-bg-active, var(--dsw-alias-bg-layer-2));\n box-shadow: inset 2px 0 0 0 var(--dsw-alias-brand-primary);\n}\n\n/* \u7A84\u5F62\u6001\u4E0B\u8868\u683C\u4F1A\u6324\u6210\u4E00\u56E2 \u2014\u2014 \u5217\u5BBD\u6309\u300C\u80FD\u529B\u540D / \u5173\u7CFB\u300D\u4E24\u680F\u91CD\u6392\u3002 */\n.rg-panel[data-form='narrow'] .rg-table {\n table-layout: auto;\n}\n\n.rg-panel[data-form='narrow'] .rg-table th:nth-child(2),\n.rg-panel[data-form='narrow'] .rg-table td:nth-child(2),\n.rg-panel[data-form='narrow'] .rg-table th:nth-child(3),\n.rg-panel[data-form='narrow'] .rg-table td:nth-child(3) {\n display: none;\n}\n\n.rg-gaps {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rg-gap {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-gap-detail {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* ---------- \u9879\u76EE\u5206\u533A ---------- */\n\n.rg-partitions {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rg-partition {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n font-size: var(--dsw-font-xxs-12, 12px);\n padding: 3px 4px;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.rg-partition-selected {\n background: var(--dsw-alias-interactive-bg-active, var(--dsw-alias-bg-layer-2));\n box-shadow: inset 2px 0 0 0 var(--dsw-alias-brand-primary);\n}\n\n.rg-partition-label {\n font-weight: var(--dsw-font-xs-strong-13, 600);\n max-width: 40%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rg-partition-workspace {\n flex: 1 1 140px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-partition-time {\n flex: none;\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n/* ---------- \u5F52\u6863 ---------- */\n\n.rg-archive-run {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.rg-archives {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rg-archive {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm, 8px);\n}\n\n.rg-archive-dir {\n font-family: var(--dsw-font-mono, var(--dsw-font-family-mono, ui-monospace, monospace));\n font-size: var(--dsw-font-xxs-12, 12px);\n overflow-wrap: anywhere;\n}\n\n.rg-archive-meta,\n.rg-archive-summary {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n/* ---------- \u533A\u5757 / \u9875\u811A ---------- */\n\n.rg-section {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.rg-section-head {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.rg-section-title {\n margin: 0;\n font-size: var(--dsw-font-m-18, 18px);\n font-weight: var(--dsw-font-m-18-font-weight, 600);\n}\n\n.rg-selection-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n padding: 2px 8px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n}\n\n.rg-foot {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 16px;\n border-top: 1px solid var(--dsw-alias-hairline, var(--dsw-alias-border-l1));\n padding-top: 8px;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n/* ---------- \u56FE\u8C31 ---------- */\n\n.rg-graph {\n display: flex;\n flex-direction: column;\n gap: 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-layer-1);\n padding: 10px;\n min-width: 0;\n}\n\n.rg-graph-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.rg-graph-zoom {\n display: inline-flex;\n gap: 4px;\n}\n\n.rg-graph-hint {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-graph-viewport {\n position: relative;\n overflow: hidden;\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-2);\n cursor: grab;\n touch-action: none;\n}\n\n.rg-graph-viewport:active {\n cursor: grabbing;\n}\n\n.rg-graph-viewport:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n.rg-graph-node:focus-visible {\n outline: none;\n}\n\n/* \u952E\u76D8\u805A\u7126\u7684\u8282\u70B9\u5FC5\u987B\u80FD\u770B\u89C1\u7126\u70B9\uFF08\u5426\u5219 Tab \u8D70\u4E00\u5708\u4E0D\u77E5\u9053\u505C\u5728\u54EA\uFF09\u3002 */\n.rg-graph-node:focus-visible .rg-graph-node-bg {\n stroke: var(--dsw-alias-brand-primary);\n stroke-width: 3px;\n}\n\n.rg-graph-node-label {\n fill: var(--dsw-alias-label-primary);\n font-size: 13px;\n font-weight: 600;\n}\n\n.rg-graph-node-detail {\n fill: var(--dsw-alias-label-secondary);\n font-size: 11px;\n}\n\n.rg-graph-column-title {\n fill: var(--dsw-alias-label-secondary);\n font-size: 12px;\n font-weight: 600;\n}\n\n/* \u66F2\u7EBF\u8FB9\u7684\u8BED\u4E49\u6807\u7B7E\uFF08\u4EC5\u9AD8\u4EAE\u8FB9\u663E\u793A\uFF0C\u907F\u514D\u566A\u58F0\uFF09\u3002 */\n.rg-graph-edge-label {\n fill: var(--dsw-alias-brand-primary);\n font-size: 10px;\n font-weight: 600;\n}\n\n/* \u56FE\u4F8B\uFF08\u7C7B\u578B\u8FC7\u6EE4 chips\uFF0C\u5E26\u8BA1\u6570\uFF09\u3002 */\n.rg-graph-legend {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-left: 4px;\n}\n\n.rg-legend-chip {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-radius: 999px;\n padding: 2px 10px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n cursor: pointer;\n transition: background var(--rg-motion-fast) var(--rg-ease);\n}\n\n.rg-legend-chip:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-legend-chip-off {\n opacity: 0.45;\n text-decoration: line-through;\n}\n\n.rg-legend-chip:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.rg-legend-count {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n/* \u5F62\u72B6\u56FE\u4F8B\uFF08v0.11\uFF09\uFF1A\u56FE\u4F8B\u91CC\u76F4\u63A5\u753B\u8282\u70B9\u5F62\u72B6 \u2014\u2014 \u5F62\u72B6\u662F\u989C\u8272\u4E4B\u5916\u7684\u7B2C\u4E8C\u7F16\u7801\u901A\u9053\uFF0C\n \u56FE\u4F8B\u4E0D\u5C55\u793A\u5B83\uFF0C\u8272\u76F2/\u7070\u5EA6\u6253\u5370\u7528\u6237\u5C31\u6C38\u8FDC\u4E0D\u77E5\u9053\u65B9\u6846=\u5448\u73B0\u3001\u4E09\u89D2=\u7F3A\u53E3\u3002 */\n.rg-legend-shape {\n width: 14px;\n height: 14px;\n flex: none;\n}\n\n/* \u641C\u7D22\u904D\u5386\u6307\u793A\uFF08v0.11\uFF09\uFF1A\u7B2C n/m \u4E2A\u5339\u914D\uFF0C\u56DE\u8F66\u5FAA\u73AF\u8DF3\u8F6C\u65F6\u544A\u8BC9\u7528\u6237\u4F4D\u7F6E\u3002 */\n.rg-search-index {\n font-size: var(--dsw-font-xxs-12, 12px);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n white-space: nowrap;\n}\n\n/* \u9A6C\u5C14\u53EF\u592B\u8DE8\u9636\u6BB5\u53BB\u5411\u5FBD\u6807\uFF08v0.11\uFF09\uFF1A`\u2192 \u5D29\u6E83 40%` \u9AD8\u5371\u8FC1\u79FB\u5FC5\u987B\u4E00\u773C\u53EF\u89C1\u3002 */\n.rg-markov-exits {\n display: inline-flex;\n gap: 4px;\n margin-left: 6px;\n flex-wrap: wrap;\n}\n\n.rg-chip-exit {\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n border: 1px dashed var(--dsw-alias-border-l2);\n background: transparent;\n white-space: nowrap;\n}\n\n/* \u56FE\u8C31\u4E3B\u4F53\uFF1A\u89C6\u53E3 + \u8BE6\u60C5\u4FA7\u680F\u4E24\u680F\uFF08\u7A84\u5BB9\u5668\u7EB5\u5411\u5806\u53E0\uFF09\u3002 */\n.rg-graph-body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 10px;\n}\n\n@media (min-width: 960px) {\n .rg-graph-body:has(.rg-graph-aside) {\n grid-template-columns: minmax(0, 1fr) 260px;\n }\n}\n\n.rg-graph-status {\n display: flex;\n align-items: center;\n gap: 6px 14px;\n flex-wrap: wrap;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-graph-zoom-label {\n font-variant-numeric: tabular-nums;\n}\n\n.rg-graph-status-selected {\n color: var(--dsw-alias-label-primary);\n}\n\n/* \u60AC\u505C\u6D6E\u5C42\uFF1A\u6D6E\u52A8\u5361\u7247\uFF08\u552F\u4E00\u5E26\u9634\u5F71\u7684\u8868\u9762\uFF09\u3002 */\n.rg-graph-tooltip {\n position: absolute;\n z-index: 5;\n transform: translate(-50%, -100%);\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-width: 260px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--dsw-shadow-lv3, var(--dsw-shadow-lv1, none));\n pointer-events: none;\n}\n\n.rg-tooltip-title {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: var(--dsw-font-xxs-12, 12px);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-tooltip-meta,\n.rg-tooltip-detail {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n overflow-wrap: anywhere;\n}\n\n/* \u56FE\u8C31\u641C\u7D22\u6846\u4E0E\u7ED3\u679C\u4E0B\u62C9\u3002 */\n.rg-graph-search {\n position: relative;\n display: inline-flex;\n}\n\n.rg-search-input {\n min-height: var(--rg-control-h);\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-radius: var(--dsw-radius-sm, 8px);\n padding: 2px 9px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n min-width: 150px;\n}\n\n.rg-search-input:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.rg-search-input::placeholder {\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-search-results {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 10;\n margin: 0;\n padding: 4px;\n list-style: none;\n min-width: 200px;\n max-height: 220px;\n overflow: auto;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--dsw-shadow-lv3, var(--dsw-shadow-lv1, none));\n}\n\n.rg-search-results button {\n appearance: none;\n border: none;\n background: none;\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 5px 8px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n text-align: left;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.rg-search-results button:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-search-noresult {\n padding: 5px 8px;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n/* \u8BE6\u60C5\u4FA7\u680F\u3002 */\n.rg-graph-aside {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px 14px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-layer-1);\n min-width: 0;\n align-self: start;\n}\n\n.rg-graph-aside-header {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.rg-graph-aside-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-14, 14px);\n}\n\n.rg-graph-aside-detail {\n margin: 0;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-graph-aside-actions {\n display: flex;\n gap: 6px;\n}\n\n/* \u90BB\u5C45\u5BFC\u822A\uFF08\u8BE6\u60C5\u4FA7\u680F\uFF09\uFF1A\u4E0A\u6E38/\u4E0B\u6E38\u5206\u7EC4\u5217\u8868\uFF0C\u70B9\u51FB\u5373\u8DF3\u8F6C\u5B9A\u4F4D\u3002 */\n.rg-graph-neighbors {\n display: flex;\n flex-direction: column;\n gap: 6px;\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.rg-graph-neighbor-title {\n margin: 0;\n display: flex;\n align-items: center;\n font-size: var(--dsw-font-xxs-12, 12px);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-graph-neighbor-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.rg-graph-neighbor-link {\n appearance: none;\n border: none;\n background: none;\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 3px 6px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n text-align: left;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.rg-graph-neighbor-link:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-graph-neighbor-link:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* \u52A8\u6548\u4E0E\u504F\u597D\uFF1A\u5C0A\u91CD\u300C\u51CF\u5C11\u52A8\u6001\u6548\u679C\u300D\uFF08\u524D\u5EAD\u5931\u8C03\u7528\u6237\u4F1A\u56E0\u8FC7\u6E21\u4E0D\u9002\uFF09\u3002 */\n@media (prefers-reduced-motion: reduce) {\n .rg-panel *,\n .rg-panel *::before,\n .rg-panel *::after {\n transition-duration: 0.01ms !important;\n animation-duration: 0.01ms !important;\n }\n}\n\n/* ---------- \u6062\u590D\u5224\u5B9A\u6761\uFF08v0.9.1\uFF09 ---------- */\n\n.rg-verdict {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n margin: 0;\n padding: 8px 12px;\n border-radius: var(--dsw-radius-sm, 8px);\n font-size: var(--dsw-font-xs-13, 13px);\n}\n/* act\uFF08\u5173\u95ED\u4E86\u63D2\u4EF6\uFF09\u4E0E watch\uFF08\u89C2\u5BDF\u8F6E\uFF09\u7528**\u8FB9\u6846+\u6807\u7B7E**\u533A\u5206\u800C\u4E0D\u662F\u53EA\u9760\u989C\u8272\uFF1A\n \u7070\u5EA6\u6253\u5370/\u8272\u5F31\u7528\u6237\u4E5F\u80FD\u5206\u8FA8\u3002 */\n.rg-verdict-act {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n.rg-verdict-watch {\n border: 1px dashed var(--dsw-alias-border-l1);\n background: transparent;\n}\n.rg-verdict-tag {\n padding: 1px 8px;\n border-radius: var(--dsw-radius-sm, 8px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n background: var(--dsw-alias-bg-layer-2);\n}\n.rg-verdict-meta {\n margin-left: auto;\n color: var(--dsw-alias-label-tertiary);\n}\n\n/* ---------- v0.10 \u6D1E\u5BDF\u5361\uFF1A\u9A6C\u5C14\u53EF\u592B / \u6570\u636E\u6D41 / \u7CFB\u7EDF\u8BCA\u65AD ---------- */\n\n/* \u5361\u7247\u9876\u90E8\u7684\u4E00\u884C\u6458\u8981\uFF08\u6837\u672C\u6570\u3001\u6536\u655B\u6027\u7B49\u767D\u76D2\u5143\u4FE1\u606F\uFF09\u3002 */\n.rg-card-note {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* \u9A6C\u5C14\u53EF\u592B\u884C\uFF1A\u9636\u6BB5\u540D | \u81EA\u73AF\u6982\u7387\u6761 | \u767E\u5206\u6BD4\u3002 */\n.rg-markov {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 6px;\n}\n.rg-markov-row {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n.rg-markov-stage {\n width: 84px;\n flex: none;\n color: var(--dsw-alias-label-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.rg-markov-row .rg-bar {\n flex: 1 1 auto;\n width: auto;\n}\n.rg-markov-value {\n width: 44px;\n flex: none;\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-primary);\n}\n.rg-markov-nodata {\n flex: 1 1 auto;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n}\n.rg-markov-stationary {\n margin-top: 10px;\n}\n.rg-subhead {\n margin: 0 0 6px;\n font-size: 12px;\n font-weight: var(--dsw-font-s-strong-14, 600);\n color: var(--dsw-alias-label-secondary);\n}\n.rg-chip-row {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* \u6570\u636E\u6D41\u94FE\u8DEF\uFF1A\u5E8F\u53F7 | \u540D\u79F0+\u8BF4\u660E | \u8BA1\u6570\u3002 */\n.rg-dataflow {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 8px;\n counter-reset: rg-flow;\n}\n.rg-dataflow-step {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n min-width: 0;\n}\n.rg-dataflow-index {\n flex: none;\n width: 20px;\n height: 20px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--dsw-radius-full, 999px);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n font-weight: var(--dsw-font-s-strong-14, 600);\n}\n\n/* \u6D41\u52A8\u8109\u51B2\uFF08v0.11\u300C\u53EF\u89C6\u5316\u6D41\u52A8\u300D\uFF09\uFF1A\u56DB\u73AF\u94FE\u8DEF\u7684\u5E8F\u53F7\u70B9\u6309\u94FE\u8DEF\u987A\u5E8F\u547C\u5438 \u2014\u2014\n \u6570\u636E\u4ECE journal \u6D41\u5411\u753B\u9762\u7684\u65B9\u5411\u611F\u7528\u5EF6\u8FDF\u9519\u76F8\u8868\u8FBE\uFF08\u6BCF\u73AF\u5EF6\u8FDF 0.3s\uFF09\u3002\n \u52A8\u753B\u53EA\u52A8 opacity\uFF08\u5408\u6210\u5C42\u5C5E\u6027\uFF0C\u4E0D\u89E6\u53D1\u91CD\u6392\uFF09\uFF1B\u7CFB\u7EDF\u300C\u51CF\u5C11\u52A8\u6001\u300D\u65F6\u505C\u7528\uFF0C\n \u9759\u6001\u5E8F\u53F7\u4ECD\u7136\u5B8C\u6574\u627F\u8F7D\u4FE1\u606F\uFF08\u52A8\u753B\u662F\u589E\u5F3A\uFF0C\u4E0D\u662F\u4FE1\u606F\u8F7D\u4F53\uFF09\u3002 */\n.rg-dataflow-step .rg-dataflow-index {\n animation: rg-flow-pulse 1.8s var(--rg-ease, ease) infinite;\n}\n.rg-dataflow-step:nth-child(2) .rg-dataflow-index {\n animation-delay: 0.3s;\n}\n.rg-dataflow-step:nth-child(3) .rg-dataflow-index {\n animation-delay: 0.6s;\n}\n.rg-dataflow-step:nth-child(4) .rg-dataflow-index {\n animation-delay: 0.9s;\n}\n@keyframes rg-flow-pulse {\n 0%,\n 100% {\n opacity: 1;\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--dsw-alias-brand-primary) 0%, transparent);\n }\n 50% {\n opacity: 0.55;\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-brand-primary) 18%, transparent);\n }\n}\n.rg-dataflow-main {\n min-width: 0;\n display: grid;\n gap: 2px;\n}\n.rg-dataflow-label {\n color: var(--dsw-alias-label-primary);\n font-weight: var(--dsw-font-s-strong-14, 600);\n font-size: 13px;\n}\n.rg-dataflow-detail {\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.rg-dataflow-count {\n flex: none;\n margin-left: auto;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* \u7CFB\u7EDF\u8BCA\u65AD\u5361\uFF1A\u7D27\u51D1\u952E\u503C\u5BF9 + \u53CD\u9988\u6309\u94AE\u3002 */\n.rg-issues-button {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-top: 10px;\n text-decoration: none;\n color: var(--dsw-alias-brand-primary);\n border: 1px solid var(--dsw-alias-border-l1);\n}\n.rg-issues-button:hover {\n border-color: var(--dsw-alias-brand-primary);\n}\n";
|
|
3269
|
+
var styles_default = "/**\n * \u7BA1\u7406\u9762\u677F\u7684\u6837\u5F0F\u3002\n *\n * ## \u7EAA\u5F8B\n *\n * 1. **\u53EA\u7528\u4E3B\u9898\u53D8\u91CF**\uFF1A\u989C\u8272\u3001\u5706\u89D2\u3001\u5B57\u4F53\u5168\u90E8\u5F15\u7528 `--dsw-alias-*` / `--dsw-radius-*`\n * / `--dsw-shadow-*` \u5BB6\u65CF\u3002\u5BBF\u4E3B\u91CD\u547D\u540D\u4E00\u4E2A\u53D8\u91CF\u65F6\u9762\u677F\u53EA\u662F\u53D8\u4E11\uFF0C\u4E0D\u4F1A\u5D29 \u2014\u2014\n * \u56E0\u6B64\u6BCF\u4E2A var() \u90FD\u5E26\u4E00\u4E2A\u4FDD\u5B88\u7684\u515C\u5E95\u503C\u3002\n * 2. **\u4E24\u79CD\u5F62\u6001\u6309\u5BB9\u5668\u5BBD\u5EA6**\uFF1A`.rg-panel[data-form=\"narrow\"]` \u7531 JS \u6D4B\u51FA\u7684\n * \u9762\u677F\u5BBD\u5EA6\u9A71\u52A8\uFF08\u9762\u677F\u53EF\u80FD\u6302\u5728\u88AB\u62D6\u7A84\u7684\u4FA7\u680F\u91CC\uFF0C\u5A92\u4F53\u67E5\u8BE2\u91CF\u7684\u662F\u7A97\u53E3\uFF0C\u4F1A\u7B54\u9519\uFF09\u3002\n * 3. **\u5C40\u90E8\u52A8\u6548\u4EE4\u724C**\uFF1A\u8FC7\u6E21\u65F6\u957F\u4E0E\u7F13\u52A8\u5B9A\u4E49\u5728 `.rg-panel` \u4E0A\u7684 `--rg-*`\uFF0C\n * \u4E0D\u4F9D\u8D56\u672A\u7ECF\u9A8C\u8BC1\u7684\u5168\u5C40 `--ds-*`\uFF08\u751F\u6001\u63D2\u4EF6\u540C\u6837\u81EA\u6301\u8FD9\u5957\u4EE4\u724C\uFF09\u3002\n * 4. **\u4E0D\u5199\u6B7B\u5BB9\u5668\u5BBD\u5EA6**\uFF1A\u9762\u677F\u5360\u6EE1\u5BBF\u4E3B\u7ED9\u7684\u4E2D\u592E\u9762\u677F\u533A\u57DF\u3002\n * 5. **\u5BF9\u6BD4\u5EA6**\uFF1A\u6B63\u6587 `--dsw-alias-label-primary`\uFF0C\u6B21\u8981 `--dsw-alias-label-secondary`\uFF0C\n * \u63D0\u793A `--dsw-alias-label-tertiary`\uFF08\u4EAE/\u6697\u4E3B\u9898\u90FD\u7531\u5BBF\u4E3B\u4FDD\u8BC1\u53EF\u8BFB\uFF09\u3002\n */\n\n.rg-panel {\n /* \u5C40\u90E8\u4EE4\u724C\uFF1A\u63A7\u4EF6\u9AD8\u5EA6\u3001\u52A8\u6548\u3001\u95F4\u8DDD\u3002\u6539\u4E00\u5904\uFF0C\u6574\u5757\u9762\u677F\u8DDF\u7740\u4E00\u81F4\u3002 */\n --rg-control-h: 28px;\n --rg-motion-fast: 120ms;\n --rg-motion-medium: 200ms;\n --rg-ease: cubic-bezier(0.2, 0, 0, 1);\n --rg-gap: 16px;\n\n display: flex;\n flex-direction: column;\n gap: var(--rg-gap);\n padding: 20px 24px 32px;\n min-width: 0;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-base);\n font-family: var(--dsw-font-family);\n font-size: var(--dsw-font-s-14, 14px);\n line-height: var(--dsw-font-s-14-line-height, 22px);\n\n /**\n * \u9762\u677F\u5FC5\u987B**\u81EA\u5DF1**\u662F\u6EDA\u52A8\u5BB9\u5668\u3002\n *\n * \u4E3A\u4EC0\u4E48\u4E0D\u80FD\u6307\u671B\u5BBF\u4E3B\uFF1A\u5B9E\u6D4B\uFF08\u6C99\u7BB1 sb-rg-c5\uFF09\u5BBF\u4E3B\u69FD\u4F4D\u662F\u8FD9\u6837\u4E00\u4E32\n * .centerCol { overflow-y: hidden } \u2190 \u7956\u5148\u628A\u6EA2\u51FA\u88C1\u6389\n * .mainPanel { height: 714px; overflow: visible }\n * .rg-panel { height: 3965px } \u2190 \u5185\u5BB9\u81EA\u7136\u9AD8\u5EA6\uFF0C\u8D85\u51FA\u540E\u76F4\u63A5\u88AB\u88C1\n * \u6587\u6863\u672C\u8EAB\u4E0D\u6EDA\uFF08docScrollH == clientH == 714\uFF09\uFF0C\u56E0\u6B64**\u4E0B\u65B9\u6570\u636E\u9875\u6C38\u8FDC\u770B\u4E0D\u5230**\u3002\n *\n * \u4E09\u4E2A\u5C5E\u6027\u7F3A\u4E00\u4E0D\u53EF\uFF1A\n * - `height: 100%` + `min-height: 0`\uFF1A\u6491\u6EE1\u5BBF\u4E3B\u7ED9\u7684\u786E\u5B9A\u9AD8\u5EA6\uFF0C\u4E14\u5141\u8BB8\u6536\u7F29\u5230\u53EF\u6EDA\u52A8\uFF1B\n * \u53EA\u5199 overflow \u800C\u4E0D\u9650\u5236\u9AD8\u5EA6\uFF0Cflex \u5B50\u9879\u4ECD\u4F1A\u6309\u5185\u5BB9\u6491\u5F00\uFF0C\u6EDA\u4E0D\u8D77\u6765\u3002\n * - `overflow-y: auto`\uFF1A\u9762\u677F\u81EA\u5DF1\u6EDA\u3002\n * - `overscroll-behavior: contain`\uFF1A\u6EDA\u5230\u5C3D\u5934\u4E0D\u628A\u6EDA\u52A8\u4F20\u7ED9\u5BBF\u4E3B\uFF0C\u5426\u5219\u4F1A\u628A\u6574\u9875/\u4FA7\u680F\n * \u5E26\u7740\u4E00\u8D77\u6EDA\uFF0C\u89C6\u89C9\u4E0A\u50CF\"\u9762\u677F\u5728\u4E71\u8DF3\"\u3002\n */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n overscroll-behavior: contain;\n}\n\n/* \u7A84\u5F62\u6001\uFF08\u4FA7\u680F / \u5206\u5C4F\uFF09\uFF1A\u6536\u7D27\u8FB9\u8DDD\u4E0E\u95F4\u8DDD\uFF0C\u628A\u7EB5\u5411\u7A7A\u95F4\u8BA9\u7ED9\u5185\u5BB9\u3002 */\n.rg-panel[data-form='narrow'] {\n --rg-gap: 12px;\n padding: 14px 14px 24px;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n/* ---------- \u5934\u90E8 ---------- */\n\n.rg-header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: 12px;\n}\n\n.rg-header-main {\n min-width: 0;\n flex: 1 1 260px;\n}\n\n.rg-title {\n margin: 0;\n font-size: var(--dsw-font-l-20, 20px);\n font-weight: var(--dsw-font-l-20-font-weight, 600);\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-panel[data-form='narrow'] .rg-title {\n font-size: var(--dsw-font-m-18, 18px);\n}\n\n.rg-subtitle {\n margin: 4px 0 0;\n font-size: var(--dsw-font-xs-13, 13px);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n.rg-project-name {\n font-weight: var(--dsw-font-xs-strong-13, 600);\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-partition-workspace-full {\n font-size: var(--dsw-font-xxs-12, 12px);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n direction: ltr;\n}\n\n.rg-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* ---------- \u63A7\u4EF6 ---------- */\n\n.rg-button {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n min-height: var(--rg-control-h);\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-radius: var(--dsw-radius-sm, 8px);\n padding: 4px 12px;\n font: inherit;\n font-size: var(--dsw-font-xs-13, 13px);\n cursor: pointer;\n transition:\n background var(--rg-motion-fast) var(--rg-ease),\n border-color var(--rg-motion-fast) var(--rg-ease);\n}\n\n.rg-button:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-button:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n.rg-button:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n\n.rg-button-small {\n min-height: 24px;\n padding: 2px 9px;\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-button-icon {\n min-width: 28px;\n padding: 2px 6px;\n justify-content: center;\n font-size: var(--dsw-font-s-14, 14px);\n line-height: 1;\n}\n\n.rg-button-danger {\n border-color: var(--dsw-alias-state-error-primary);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.rg-button-active {\n border-color: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-brand-primary);\n}\n\n/* \u8F6E\u8BE2\u6682\u505C\u6001\u6309\u94AE\uFF08\u6682\u505C = \u9700\u8981\u88AB\u770B\u89C1\u7684\u72B6\u6001\uFF0C\u4E0D\u80FD\u53EA\u9760 aria-pressed\uFF09\u3002 */\n.rg-button-paused {\n border-color: var(--dsw-alias-state-warn-primary);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.rg-link {\n appearance: none;\n border: none;\n background: none;\n padding: 0 2px;\n font: inherit;\n font-size: inherit;\n color: var(--dsw-alias-brand-primary);\n cursor: pointer;\n text-decoration: underline;\n}\n\n/* \u5206\u6BB5\u63A7\u4EF6\uFF08\u5E03\u5C40 / \u7740\u8272\u53E3\u5F84\uFF09\u3002 */\n.rg-segmented {\n display: inline-flex;\n align-items: stretch;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n overflow: hidden;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.rg-segment {\n appearance: none;\n border: none;\n border-right: 1px solid var(--dsw-alias-border-l1);\n background: none;\n color: var(--dsw-alias-label-secondary);\n padding: 3px 9px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n cursor: pointer;\n transition: background var(--rg-motion-fast) var(--rg-ease);\n}\n\n.rg-segment:last-child {\n border-right: none;\n}\n\n.rg-segment:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-segment[aria-pressed='true'] {\n background: var(--dsw-alias-interactive-bg-active, var(--dsw-alias-bg-layer-2));\n color: var(--dsw-alias-label-primary);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n}\n\n.rg-segment:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n.rg-field {\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n}\n\n.rg-field-grow {\n flex: 1 1 160px;\n}\n\n.rg-field-label {\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-input,\n.rg-select {\n min-height: var(--rg-control-h);\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n padding: 2px 8px;\n font: inherit;\n font-size: var(--dsw-font-xs-13, 13px);\n max-width: 100%;\n}\n\n.rg-input:focus-visible,\n.rg-select:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* ---------- \u63D0\u793A\u6761 ---------- */\n\n.rg-notice {\n margin: 0;\n padding: 8px 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-error {\n margin: 0;\n padding: 10px 12px;\n border-radius: var(--dsw-radius-sm, 8px);\n border: 1px solid var(--dsw-alias-state-error-primary);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n.rg-empty {\n margin: 0;\n padding: 8px 0;\n font-size: var(--dsw-font-xs-13, 13px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-muted {\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-strong {\n font-weight: var(--dsw-font-xs-strong-13, 600);\n}\n\n.rg-block {\n display: block;\n}\n\n.rg-ellipsis {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rg-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 16px;\n margin-left: 6px;\n padding: 0 4px;\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxxs-11, 11px);\n}\n\n/* \u52A0\u8F7D / \u4E0D\u53EF\u7528\u72B6\u6001\u5757\uFF1A\u5360\u4F4D\u9AD8\u5EA6\u7A33\u5B9A\uFF0C\u907F\u514D\u8F6E\u8BE2\u65F6\u9875\u9762\u8DF3\u52A8\u3002 */\n.rg-state-block {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 24px 0;\n}\n\n.rg-state-title {\n margin: 0;\n font-size: var(--dsw-font-m-18, 18px);\n font-weight: var(--dsw-font-m-18-font-weight, 600);\n}\n\n/* ---------- \u5361\u7247\u7F51\u683C ---------- */\n\n.rg-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));\n gap: 12px;\n}\n\n.rg-panel[data-form='narrow'] .rg-grid {\n grid-template-columns: 1fr;\n}\n\n.rg-card {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 14px 16px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-layer-1);\n min-width: 0;\n min-height: 0;\n}\n\n/**\n * \u5361\u7247\u5185\u5BB9\u533A\u56FA\u5B9A\u9AD8\u5EA6 + \u5185\u90E8\u6EDA\u52A8\uFF08v0.9.1 \u7528\u6237\u9700\u6C42\uFF09\u3002\n *\n * \u4E3A\u4EC0\u4E48\u9650\u9AD8\u800C\u4E0D\u662F\u8BA9\u5185\u5BB9\u81EA\u7136\u4F38\u5C55\uFF1A\u5C55\u5F00\u7684\u5361\u7247\u591A\u4E86\u4E4B\u540E\uFF0C\u9762\u677F\u88AB\u5355\u4E2A\n * \u5361\u7247\u6491\u5230\u51E0\u5343\u50CF\u7D20\uFF0C\u4E0B\u9762\u7684\u5361\u7247\u8981\u6EDA\u5F88\u4E45\u624D\u770B\u5F97\u5230 \u2014\u2014 \u5747\u5300\u7684\u89C6\u53E3\u5BC6\u5EA6\n * \u6BD4\u5355\u5361\u7684\u5B8C\u6574\u6027\u66F4\u91CD\u8981\uFF08\u8FD9\u6B63\u662F\u7528\u6237\u539F\u59CB\u8BC9\u6C42\uFF09\u3002\n *\n * - \u9ED8\u8BA4 `--rg-card-body-h: 240px`\uFF1A\u8DB3\u591F\u770B\u7EA6 10 \u884C\u5185\u5BB9\uFF0C\u8D85\u51FA\u5185\u90E8\u6EDA\u52A8\uFF1B\n * - `overscroll-behavior: contain`\uFF1A\u6EDA\u5230\u5C3D\u5934\u4E0D\u628A\u5916\u5C42\u9762\u677F\u5E26\u7740\u6EDA\uFF1B\n * - `.rg-card-enlarged` \u89E3\u9664\u9650\u9AD8\uFF08\u2922 \u6309\u94AE\uFF09\uFF0C\u644A\u5F00\u9605\u8BFB\u957F\u6E05\u5355\uFF1B\n * - \u7A84\u5F62\u6001\u628A\u9650\u9AD8\u964D\u5230 180px\uFF08\u4FA7\u680F\u7A7A\u95F4\u5C11\uFF0C\u5BC6\u5EA6\u4F18\u5148\uFF09\u3002\n */\n.rg-card-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n height: var(--rg-card-body-h, 240px);\n overflow-y: auto;\n overscroll-behavior: contain;\n min-height: 0;\n}\n\n/* \u6269\u5927\u6001\uFF1A\u89E3\u9664\u9650\u9AD8\uFF0C\u5361\u7247\u6309\u5185\u5BB9\u81EA\u7136\u4F38\u5C55\uFF08\u9762\u677F\u81EA\u8EAB\u4ECD\u662F\u6EDA\u52A8\u5BB9\u5668\uFF09\u3002 */\n.rg-card-enlarged .rg-card-body {\n height: auto;\n max-height: none;\n overflow-y: visible;\n}\n\n/* \u6269\u5927\u6309\u94AE\uFF1A\u5934\u90E8\u5185\u7684\u7B2C\u4E8C\u4E2A\u52A8\u4F5C\uFF0C\u5C0F\u5C3A\u5BF8\u3001\u4F4E\u5BF9\u6BD4\uFF0C\u4E0D\u4E0E\u6298\u53E0\u7BAD\u5934\u7ADE\u4E89\u3002 */\n.rg-card-expand {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n margin-left: auto;\n border-radius: var(--dsw-radius-sm, 8px);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n user-select: none;\n transition: background var(--rg-motion-fast, 120ms) var(--rg-ease, ease);\n}\n.rg-card-expand:hover,\n.rg-card-expand:focus-visible {\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n.rg-card-enlarged .rg-card-expand {\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-card-title {\n margin: 0;\n font-size: var(--dsw-font-s-14, 14px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n}\n\n/* \u7A84\u5F62\u6001\uFF1A\u4FA7\u680F\u7A7A\u95F4\u5C11\uFF0C\u5BC6\u5EA6\u4F18\u5148 \u2014\u2014 \u5185\u5BB9\u533A\u9650\u9AD8\u964D\u4E3A 180px\u3002 */\n.rg-panel[data-form='narrow'] .rg-card-body {\n --rg-card-body-h: 180px;\n}\n\n.rg-card-title {\n margin: 0;\n font-size: var(--dsw-font-s-14, 14px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n}\n\n.rg-card-subtitle {\n margin: 4px 0 0;\n font-size: var(--dsw-font-xxs-12, 12px);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-card-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n/* \u53EF\u6298\u53E0\u5361\u7247\uFF1A\u6807\u9898\u884C\u662F\u6309\u94AE\uFF0C\u6574\u4E2A\u5934\u90E8\u53EF\u70B9\u3002 */\n.rg-card-head {\n appearance: none;\n border: none;\n background: none;\n padding: 0;\n margin: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n cursor: pointer;\n font: inherit;\n color: inherit;\n text-align: left;\n}\n\n.rg-card-head:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.rg-card-head-hint {\n margin-left: auto;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rg-card-chevron {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-card-collapsed {\n padding-bottom: 10px;\n}\n\n.rg-card-body {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n/* ---------- \u5FBD\u6807 / \u5706\u70B9 / \u8BA1\u6570\u7247 ---------- */\n\n.rg-badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--dsw-radius-sm, 8px);\n border: 1px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxs-12, 12px);\n white-space: nowrap;\n}\n\n.rg-badge-idle,\n.rg-badge-monitoring {\n border-color: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-brand-primary);\n}\n\n.rg-badge-crashed,\n.rg-badge-error {\n border-color: var(--dsw-alias-state-error-primary);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.rg-badge-deciding,\n.rg-badge-worsening,\n.rg-badge-warn {\n border-color: var(--dsw-alias-state-warn-primary);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.rg-badge-stabilizing,\n.rg-badge-recovered,\n.rg-badge-improving,\n.rg-badge-success {\n border-color: var(--dsw-alias-state-success-primary);\n color: var(--dsw-alias-state-success-primary);\n}\n\n.rg-badge-stable,\n.rg-badge-neutral {\n border-color: var(--dsw-alias-border-l2);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-chip {\n display: inline-flex;\n align-items: center;\n padding: 0 6px;\n border-radius: var(--dsw-radius-xs, 4px);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxxs-11, 11px);\n white-space: nowrap;\n}\n\n.rg-chip-warn {\n border: 1px solid var(--dsw-alias-state-warn-primary);\n color: var(--dsw-alias-state-warn-primary);\n background: none;\n}\n\n.rg-chip-more {\n font-variant-numeric: tabular-nums;\n}\n\n.rg-names {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 3px;\n min-width: 0;\n}\n\n.rg-dot {\n display: inline-block;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dsw-alias-label-secondary);\n flex: none;\n}\n\n.rg-dot-info {\n background: var(--dsw-alias-brand-primary);\n}\n\n.rg-dot-success {\n background: var(--dsw-alias-state-success-primary);\n}\n\n.rg-dot-warn {\n background: var(--dsw-alias-state-warn-primary);\n}\n\n.rg-dot-error {\n background: var(--dsw-alias-state-error-primary);\n}\n\n/* ---------- \u8FDB\u5EA6\u6761 ---------- */\n\n.rg-bar {\n display: inline-block;\n width: 72px;\n height: 4px;\n border-radius: 2px;\n background: var(--dsw-alias-bg-layer-2);\n overflow: hidden;\n flex: none;\n}\n\n.rg-bar-wide {\n width: 100%;\n}\n\n.rg-bar-fill {\n display: block;\n height: 100%;\n background: var(--dsw-alias-brand-primary);\n transition: width var(--rg-motion-medium) var(--rg-ease);\n}\n\n/* ---------- KPI \u6458\u8981\u6761 ---------- */\n\n.rg-kpis {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n gap: 10px;\n}\n\n.rg-kpi {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 4px;\n padding: 12px 14px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-layer-1);\n min-width: 0;\n}\n\n.rg-kpi-label {\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-kpi-value {\n font-size: var(--dsw-font-s-14, 14px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n font-variant-numeric: tabular-nums;\n}\n\n.rg-kpi-big {\n font-size: var(--dsw-font-m-18, 18px);\n font-weight: var(--dsw-font-m-18-font-weight, 600);\n}\n\n.rg-kpi-detail {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 100%;\n}\n\n.rg-kpi-meta {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.rg-ring {\n flex: none;\n}\n\n.rg-ring-text {\n fill: var(--dsw-alias-label-primary);\n font-size: 11px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n}\n\n/* ---------- \u63CF\u8FF0\u5217\u8868 / \u9636\u6BB5\u8F68\u9053 ---------- */\n\n.rg-dl {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 4px 12px;\n margin: 0;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n.rg-dl dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-dl dd {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n flex-wrap: wrap;\n}\n\n.rg-dl-compact {\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-mono {\n font-family: var(--dsw-font-mono, var(--dsw-font-family-mono, ui-monospace, monospace));\n font-size: var(--dsw-font-xxs-12, 12px);\n overflow-wrap: anywhere;\n}\n\n/* \u9636\u6BB5\u8F68\u9053\uFF1A\u72B6\u6001\u673A\u4E0D\u662F\u8FDB\u5EA6\u6761\uFF0Cvisited \u4E0E current \u7528\u4E0D\u540C\u901A\u9053\u8868\u8FBE\u3002 */\n.rg-stage-rail {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-wrap: wrap;\n gap: 4px 10px;\n}\n\n.rg-stage-cell {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-stage-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n border: 1px solid var(--dsw-alias-border-l2);\n background: none;\n flex: none;\n}\n\n.rg-stage-visited {\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-stage-visited .rg-stage-dot {\n background: var(--dsw-alias-border-l3, var(--dsw-alias-border-l2));\n border-color: var(--dsw-alias-border-l3, var(--dsw-alias-border-l2));\n}\n\n.rg-stage-current {\n color: var(--dsw-alias-label-primary);\n font-weight: var(--dsw-font-xxxs-strong-11, 600);\n}\n\n.rg-stage-current .rg-stage-dot {\n background: var(--dsw-alias-brand-primary);\n border-color: var(--dsw-alias-brand-primary);\n box-shadow: 0 0 0 2px var(--dsw-alias-bg-layer-2);\n}\n\n/* ---------- \u6307\u6807 ---------- */\n\n.rg-metrics {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.rg-metric {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.rg-metric-label {\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-metric-value {\n font-size: var(--dsw-font-xs-13, 13px);\n font-variant-numeric: tabular-nums;\n}\n\n.rg-metric-undefined {\n color: var(--dsw-alias-label-secondary);\n font-style: italic;\n}\n\n.rg-metric-reason {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-metric-detail {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-trend {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n/* ---------- \u8FC1\u79FB / \u51B3\u7B56 / \u4E8B\u4EF6\u65F6\u95F4\u7EBF ---------- */\n\n.rg-transitions,\n.rg-decisions,\n.rg-events {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 5px;\n}\n\n.rg-transition,\n.rg-decision,\n.rg-event {\n display: flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-transition-reason,\n.rg-decision-detail,\n.rg-event-detail {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-decision-bundle {\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-transition-time,\n.rg-decision-time,\n.rg-event-time {\n flex: none;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n font-size: var(--dsw-font-xxxs-11, 11px);\n}\n\n.rg-event-ago {\n flex: none;\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n font-size: var(--dsw-font-xxxs-11, 11px);\n}\n\n/* ---------- \u5ACC\u7591\u6392\u540D ---------- */\n\n.rg-risks {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n/* \u300C\u5C55\u5F00\u5176\u4F59 N \u4E2A\u300D\u6309\u94AE\uFF1A\u5DE6\u5BF9\u9F50\u7684\u94FE\u63A5\u5F62\u6001\uFF0C\u4E0E\u5361\u7247\u5185\u7684\u5176\u5B83\u64CD\u4F5C\u533A\u5206\u3002 */\n.rg-risks-expand {\n align-self: flex-start;\n margin-top: 2px;\n}\n\n.rg-risk {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--dsw-alias-border-l1);\n}\n\n.rg-risk:last-child {\n border-bottom: none;\n padding-bottom: 0;\n}\n\n.rg-risk-main {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.rg-risk-name {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n.rg-risk-score {\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n\n.rg-risk-detail {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-risk-actions {\n display: flex;\n gap: 6px;\n}\n\n/* ---------- \u80FD\u529B\u6E05\u5355\u8868 ---------- */\n\n.rg-table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--dsw-font-xxs-12, 12px);\n table-layout: fixed;\n}\n\n.rg-table th,\n.rg-table td {\n text-align: left;\n vertical-align: top;\n padding: 5px 6px;\n border-bottom: 1px solid var(--dsw-alias-hairline, var(--dsw-alias-border-l1));\n overflow-wrap: anywhere;\n}\n\n.rg-table thead th {\n color: var(--dsw-alias-label-secondary);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n white-space: nowrap;\n border-bottom-color: var(--dsw-alias-border-l2);\n}\n\n.rg-table tbody tr {\n cursor: pointer;\n}\n\n.rg-table tbody tr:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n/* \u9009\u4E2D\u884C\uFF1A\u5DE6\u4FA7 2px \u7AD6\u6761 + \u5E95\u8272\uFF08\u53EA\u9760\u5E95\u8272\u5728\u6697\u8272\u4E3B\u9898\u4E0B\u4E0D\u591F\u663E\u773C\uFF09\u3002 */\n.rg-row-selected {\n background: var(--dsw-alias-interactive-bg-active, var(--dsw-alias-bg-layer-2));\n box-shadow: inset 2px 0 0 0 var(--dsw-alias-brand-primary);\n}\n\n/* \u7A84\u5F62\u6001\u4E0B\u8868\u683C\u4F1A\u6324\u6210\u4E00\u56E2 \u2014\u2014 \u5217\u5BBD\u6309\u300C\u80FD\u529B\u540D / \u5173\u7CFB\u300D\u4E24\u680F\u91CD\u6392\u3002 */\n.rg-panel[data-form='narrow'] .rg-table {\n table-layout: auto;\n}\n\n.rg-panel[data-form='narrow'] .rg-table th:nth-child(2),\n.rg-panel[data-form='narrow'] .rg-table td:nth-child(2),\n.rg-panel[data-form='narrow'] .rg-table th:nth-child(3),\n.rg-panel[data-form='narrow'] .rg-table td:nth-child(3) {\n display: none;\n}\n\n.rg-gaps {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rg-gap {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: var(--dsw-font-xxs-12, 12px);\n}\n\n.rg-gap-detail {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* ---------- \u9879\u76EE\u5206\u533A ---------- */\n\n.rg-partitions {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rg-partition {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n font-size: var(--dsw-font-xxs-12, 12px);\n padding: 3px 4px;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.rg-partition-selected {\n background: var(--dsw-alias-interactive-bg-active, var(--dsw-alias-bg-layer-2));\n box-shadow: inset 2px 0 0 0 var(--dsw-alias-brand-primary);\n}\n\n.rg-partition-label {\n font-weight: var(--dsw-font-xs-strong-13, 600);\n max-width: 40%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rg-partition-workspace {\n flex: 1 1 140px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-partition-time {\n flex: none;\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n/* ---------- \u5F52\u6863 ---------- */\n\n.rg-archive-run {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.rg-archives {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rg-archive {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm, 8px);\n}\n\n.rg-archive-dir {\n font-family: var(--dsw-font-mono, var(--dsw-font-family-mono, ui-monospace, monospace));\n font-size: var(--dsw-font-xxs-12, 12px);\n overflow-wrap: anywhere;\n}\n\n.rg-archive-meta,\n.rg-archive-summary {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n/* ---------- \u533A\u5757 / \u9875\u811A ---------- */\n\n.rg-section {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n\n.rg-section-head {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.rg-section-title {\n margin: 0;\n font-size: var(--dsw-font-m-18, 18px);\n font-weight: var(--dsw-font-m-18-font-weight, 600);\n}\n\n.rg-selection-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n padding: 2px 8px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n}\n\n.rg-foot {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 16px;\n border-top: 1px solid var(--dsw-alias-hairline, var(--dsw-alias-border-l1));\n padding-top: 8px;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n/* ---------- \u56FE\u8C31 ---------- */\n\n.rg-graph {\n display: flex;\n flex-direction: column;\n gap: 8px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-layer-1);\n padding: 10px;\n min-width: 0;\n}\n\n.rg-graph-toolbar {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.rg-graph-zoom {\n display: inline-flex;\n gap: 4px;\n}\n\n.rg-graph-hint {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-graph-viewport {\n position: relative;\n overflow: hidden;\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-2);\n cursor: grab;\n touch-action: none;\n}\n\n.rg-graph-viewport:active {\n cursor: grabbing;\n}\n\n.rg-graph-viewport:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n}\n\n.rg-graph-node:focus-visible {\n outline: none;\n}\n\n/* \u952E\u76D8\u805A\u7126\u7684\u8282\u70B9\u5FC5\u987B\u80FD\u770B\u89C1\u7126\u70B9\uFF08\u5426\u5219 Tab \u8D70\u4E00\u5708\u4E0D\u77E5\u9053\u505C\u5728\u54EA\uFF09\u3002 */\n.rg-graph-node:focus-visible .rg-graph-node-bg {\n stroke: var(--dsw-alias-brand-primary);\n stroke-width: 3px;\n}\n\n.rg-graph-node-label {\n fill: var(--dsw-alias-label-primary);\n font-size: 13px;\n font-weight: 600;\n}\n\n.rg-graph-node-detail {\n fill: var(--dsw-alias-label-secondary);\n font-size: 11px;\n}\n\n.rg-graph-column-title {\n fill: var(--dsw-alias-label-secondary);\n font-size: 12px;\n font-weight: 600;\n}\n\n/* \u66F2\u7EBF\u8FB9\u7684\u8BED\u4E49\u6807\u7B7E\uFF08\u4EC5\u9AD8\u4EAE\u8FB9\u663E\u793A\uFF0C\u907F\u514D\u566A\u58F0\uFF09\u3002 */\n.rg-graph-edge-label {\n fill: var(--dsw-alias-brand-primary);\n font-size: 10px;\n font-weight: 600;\n pointer-events: none;\n}\n\n/* \u8282\u70B9\u5E03\u5C40\u8FC7\u6E21\uFF08v0.11.3\uFF09\uFF1A\u5207\u6362\u5E03\u5C40/\u62D6\u62FD\u56DE\u5F39\u65F6\u4E0D\u518D\u786C\u8DF3\u53D8\u3002\n transform \u7531 style \u63D0\u4F9B\uFF1B\u62D6\u52A8\u4E2D\u7684\u8282\u70B9\u5728\u7EC4\u4EF6\u91CC\u628A transition \u7F6E none\u3002 */\n.rg-graph-node {\n transition: transform var(--rg-motion-medium) var(--rg-ease, ease);\n}\n\n/* \u8FB9\u7684\u547D\u4E2D\u70ED\u533A\uFF1A\u900F\u660E\u5BBD\u63CF\u8FB9\u53EA\u505A\u70B9\u51FB\u76EE\u6807\uFF0C\u89C6\u89C9\u4E0D\u53C2\u4E0E\u3002 */\n.rg-edge-hit {\n fill: none;\n stroke: transparent;\n stroke-width: 14;\n pointer-events: stroke;\n cursor: pointer;\n}\n\n/* \u56FE\u4F8B\uFF08\u7C7B\u578B\u8FC7\u6EE4 chips\uFF0C\u5E26\u8BA1\u6570\uFF09\u3002 */\n.rg-graph-legend {\n display: inline-flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-left: 4px;\n}\n\n.rg-legend-chip {\n appearance: none;\n display: inline-flex;\n align-items: center;\n gap: 5px;\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-radius: 999px;\n padding: 2px 10px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n cursor: pointer;\n transition: background var(--rg-motion-fast) var(--rg-ease);\n}\n\n.rg-legend-chip:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-legend-chip-off {\n opacity: 0.45;\n text-decoration: line-through;\n}\n\n.rg-legend-chip:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.rg-legend-count {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n/* \u5F62\u72B6\u56FE\u4F8B\uFF08v0.11\uFF09\uFF1A\u56FE\u4F8B\u91CC\u76F4\u63A5\u753B\u8282\u70B9\u5F62\u72B6 \u2014\u2014 \u5F62\u72B6\u662F\u989C\u8272\u4E4B\u5916\u7684\u7B2C\u4E8C\u7F16\u7801\u901A\u9053\uFF0C\n \u56FE\u4F8B\u4E0D\u5C55\u793A\u5B83\uFF0C\u8272\u76F2/\u7070\u5EA6\u6253\u5370\u7528\u6237\u5C31\u6C38\u8FDC\u4E0D\u77E5\u9053\u65B9\u6846=\u5448\u73B0\u3001\u4E09\u89D2=\u7F3A\u53E3\u3002 */\n.rg-legend-shape {\n width: 14px;\n height: 14px;\n flex: none;\n}\n\n/* \u641C\u7D22\u904D\u5386\u6307\u793A\uFF08v0.11\uFF09\uFF1A\u7B2C n/m \u4E2A\u5339\u914D\uFF0C\u56DE\u8F66\u5FAA\u73AF\u8DF3\u8F6C\u65F6\u544A\u8BC9\u7528\u6237\u4F4D\u7F6E\u3002 */\n.rg-search-index {\n font-size: var(--dsw-font-xxs-12, 12px);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n white-space: nowrap;\n}\n\n/* \u9A6C\u5C14\u53EF\u592B\u8DE8\u9636\u6BB5\u53BB\u5411\u5FBD\u6807\uFF08v0.11\uFF09\uFF1A`\u2192 \u5D29\u6E83 40%` \u9AD8\u5371\u8FC1\u79FB\u5FC5\u987B\u4E00\u773C\u53EF\u89C1\u3002 */\n.rg-markov-exits {\n display: inline-flex;\n gap: 4px;\n margin-left: 6px;\n flex-wrap: wrap;\n}\n\n.rg-chip-exit {\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n border: 1px dashed var(--dsw-alias-border-l2);\n background: transparent;\n white-space: nowrap;\n}\n\n/* \u56FE\u8C31\u4E3B\u4F53\uFF1A\u89C6\u53E3 + \u8BE6\u60C5\u4FA7\u680F\u4E24\u680F\uFF08\u7A84\u5BB9\u5668\u7EB5\u5411\u5806\u53E0\uFF09\u3002 */\n.rg-graph-body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 10px;\n}\n\n@media (min-width: 960px) {\n .rg-graph-body:has(.rg-graph-aside) {\n grid-template-columns: minmax(0, 1fr) 260px;\n }\n}\n\n.rg-graph-status {\n display: flex;\n align-items: center;\n gap: 6px 14px;\n flex-wrap: wrap;\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-graph-zoom-label {\n font-variant-numeric: tabular-nums;\n}\n\n.rg-graph-status-selected {\n color: var(--dsw-alias-label-primary);\n}\n\n/* \u60AC\u505C\u6D6E\u5C42\uFF1A\u6D6E\u52A8\u5361\u7247\uFF08\u552F\u4E00\u5E26\u9634\u5F71\u7684\u8868\u9762\uFF09\u3002 */\n.rg-graph-tooltip {\n position: absolute;\n z-index: 5;\n transform: translate(-50%, -100%);\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-width: 260px;\n padding: 6px 8px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--dsw-shadow-lv3, var(--dsw-shadow-lv1, none));\n pointer-events: none;\n}\n\n.rg-tooltip-title {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: var(--dsw-font-xxs-12, 12px);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n color: var(--dsw-alias-label-primary);\n}\n\n.rg-tooltip-meta,\n.rg-tooltip-detail {\n font-size: var(--dsw-font-xxxs-11, 11px);\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n overflow-wrap: anywhere;\n}\n\n/* \u56FE\u8C31\u641C\u7D22\u6846\u4E0E\u7ED3\u679C\u4E0B\u62C9\u3002 */\n.rg-graph-search {\n position: relative;\n display: inline-flex;\n}\n\n.rg-search-input {\n min-height: var(--rg-control-h);\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n border-radius: var(--dsw-radius-sm, 8px);\n padding: 2px 9px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n min-width: 150px;\n}\n\n.rg-search-input:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.rg-search-input::placeholder {\n color: var(--dsw-alias-label-tertiary, var(--dsw-alias-label-secondary));\n}\n\n.rg-search-results {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 10;\n margin: 0;\n padding: 4px;\n list-style: none;\n min-width: 200px;\n max-height: 220px;\n overflow: auto;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--dsw-shadow-lv3, var(--dsw-shadow-lv1, none));\n}\n\n.rg-search-results button {\n appearance: none;\n border: none;\n background: none;\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 5px 8px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n text-align: left;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.rg-search-results button:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-search-noresult {\n padding: 5px 8px;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n/* \u8BE6\u60C5\u4FA7\u680F\u3002 */\n.rg-graph-aside {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px 14px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-md, 12px);\n background: var(--dsw-alias-bg-layer-1);\n min-width: 0;\n align-self: start;\n}\n\n.rg-graph-aside-header {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.rg-graph-aside-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-14, 14px);\n}\n\n.rg-graph-aside-detail {\n margin: 0;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-graph-aside-actions {\n display: flex;\n gap: 6px;\n}\n\n/* \u90BB\u5C45\u5BFC\u822A\uFF08\u8BE6\u60C5\u4FA7\u680F\uFF09\uFF1A\u4E0A\u6E38/\u4E0B\u6E38\u5206\u7EC4\u5217\u8868\uFF0C\u70B9\u51FB\u5373\u8DF3\u8F6C\u5B9A\u4F4D\u3002 */\n.rg-graph-neighbors {\n display: flex;\n flex-direction: column;\n gap: 6px;\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.rg-graph-neighbor-title {\n margin: 0;\n display: flex;\n align-items: center;\n font-size: var(--dsw-font-xxs-12, 12px);\n font-weight: var(--dsw-font-xxs-strong-12, 600);\n color: var(--dsw-alias-label-secondary);\n}\n\n.rg-graph-neighbor-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.rg-graph-neighbor-link {\n appearance: none;\n border: none;\n background: none;\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 3px 6px;\n font: inherit;\n font-size: var(--dsw-font-xxs-12, 12px);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n text-align: left;\n border-radius: var(--dsw-radius-xs, 4px);\n}\n\n.rg-graph-neighbor-link:hover {\n background: var(--dsw-alias-interactive-bg-hover, var(--dsw-alias-bg-layer-2));\n}\n\n.rg-graph-neighbor-link:focus-visible {\n outline: var(--dsw-focus-ring-width, 2px) solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* \u52A8\u6548\u4E0E\u504F\u597D\uFF1A\u5C0A\u91CD\u300C\u51CF\u5C11\u52A8\u6001\u6548\u679C\u300D\uFF08\u524D\u5EAD\u5931\u8C03\u7528\u6237\u4F1A\u56E0\u8FC7\u6E21\u4E0D\u9002\uFF09\u3002 */\n@media (prefers-reduced-motion: reduce) {\n .rg-panel *,\n .rg-panel *::before,\n .rg-panel *::after {\n transition-duration: 0.01ms !important;\n animation-duration: 0.01ms !important;\n }\n}\n\n/* ---------- \u6062\u590D\u5224\u5B9A\u6761\uFF08v0.9.1\uFF09 ---------- */\n\n.rg-verdict {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n margin: 0;\n padding: 8px 12px;\n border-radius: var(--dsw-radius-sm, 8px);\n font-size: var(--dsw-font-xs-13, 13px);\n}\n/* act\uFF08\u5173\u95ED\u4E86\u63D2\u4EF6\uFF09\u4E0E watch\uFF08\u89C2\u5BDF\u8F6E\uFF09\u7528**\u8FB9\u6846+\u6807\u7B7E**\u533A\u5206\u800C\u4E0D\u662F\u53EA\u9760\u989C\u8272\uFF1A\n \u7070\u5EA6\u6253\u5370/\u8272\u5F31\u7528\u6237\u4E5F\u80FD\u5206\u8FA8\u3002 */\n.rg-verdict-act {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n.rg-verdict-watch {\n border: 1px dashed var(--dsw-alias-border-l1);\n background: transparent;\n}\n.rg-verdict-tag {\n padding: 1px 8px;\n border-radius: var(--dsw-radius-sm, 8px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n background: var(--dsw-alias-bg-layer-2);\n}\n.rg-verdict-meta {\n margin-left: auto;\n color: var(--dsw-alias-label-tertiary);\n}\n\n/* ---------- v0.10 \u6D1E\u5BDF\u5361\uFF1A\u9A6C\u5C14\u53EF\u592B / \u6570\u636E\u6D41 / \u7CFB\u7EDF\u8BCA\u65AD ---------- */\n\n/* \u5361\u7247\u9876\u90E8\u7684\u4E00\u884C\u6458\u8981\uFF08\u6837\u672C\u6570\u3001\u6536\u655B\u6027\u7B49\u767D\u76D2\u5143\u4FE1\u606F\uFF09\u3002 */\n.rg-card-note {\n margin: 0 0 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* \u9A6C\u5C14\u53EF\u592B\u884C\uFF1A\u9636\u6BB5\u540D | \u81EA\u73AF\u6982\u7387\u6761 | \u767E\u5206\u6BD4\u3002 */\n.rg-markov {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 6px;\n}\n.rg-markov-row {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n.rg-markov-stage {\n width: 84px;\n flex: none;\n color: var(--dsw-alias-label-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.rg-markov-row .rg-bar {\n flex: 1 1 auto;\n width: auto;\n}\n.rg-markov-value {\n width: 44px;\n flex: none;\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-primary);\n}\n.rg-markov-nodata {\n flex: 1 1 auto;\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n}\n.rg-markov-stationary {\n margin-top: 10px;\n}\n.rg-subhead {\n margin: 0 0 6px;\n font-size: 12px;\n font-weight: var(--dsw-font-s-strong-14, 600);\n color: var(--dsw-alias-label-secondary);\n}\n.rg-chip-row {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* \u6570\u636E\u6D41\u94FE\u8DEF\uFF1A\u5E8F\u53F7 | \u540D\u79F0+\u8BF4\u660E | \u8BA1\u6570\u3002 */\n.rg-dataflow {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 8px;\n counter-reset: rg-flow;\n}\n.rg-dataflow-step {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n min-width: 0;\n}\n.rg-dataflow-index {\n flex: none;\n width: 20px;\n height: 20px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--dsw-radius-full, 999px);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n font-weight: var(--dsw-font-s-strong-14, 600);\n}\n\n/* \u6D41\u52A8\u8109\u51B2\uFF08v0.11\u300C\u53EF\u89C6\u5316\u6D41\u52A8\u300D\uFF09\uFF1A\u56DB\u73AF\u94FE\u8DEF\u7684\u5E8F\u53F7\u70B9\u6309\u94FE\u8DEF\u987A\u5E8F\u547C\u5438 \u2014\u2014\n \u6570\u636E\u4ECE journal \u6D41\u5411\u753B\u9762\u7684\u65B9\u5411\u611F\u7528\u5EF6\u8FDF\u9519\u76F8\u8868\u8FBE\uFF08\u6BCF\u73AF\u5EF6\u8FDF 0.3s\uFF09\u3002\n \u52A8\u753B\u53EA\u52A8 opacity\uFF08\u5408\u6210\u5C42\u5C5E\u6027\uFF0C\u4E0D\u89E6\u53D1\u91CD\u6392\uFF09\uFF1B\u7CFB\u7EDF\u300C\u51CF\u5C11\u52A8\u6001\u300D\u65F6\u505C\u7528\uFF0C\n \u9759\u6001\u5E8F\u53F7\u4ECD\u7136\u5B8C\u6574\u627F\u8F7D\u4FE1\u606F\uFF08\u52A8\u753B\u662F\u589E\u5F3A\uFF0C\u4E0D\u662F\u4FE1\u606F\u8F7D\u4F53\uFF09\u3002 */\n.rg-dataflow-step .rg-dataflow-index {\n animation: rg-flow-pulse 1.8s var(--rg-ease, ease) infinite;\n}\n.rg-dataflow-step:nth-child(2) .rg-dataflow-index {\n animation-delay: 0.3s;\n}\n.rg-dataflow-step:nth-child(3) .rg-dataflow-index {\n animation-delay: 0.6s;\n}\n.rg-dataflow-step:nth-child(4) .rg-dataflow-index {\n animation-delay: 0.9s;\n}\n@keyframes rg-flow-pulse {\n 0%,\n 100% {\n opacity: 1;\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--dsw-alias-brand-primary) 0%, transparent);\n }\n 50% {\n opacity: 0.55;\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--dsw-alias-brand-primary) 18%, transparent);\n }\n}\n.rg-dataflow-main {\n min-width: 0;\n display: grid;\n gap: 2px;\n}\n.rg-dataflow-label {\n color: var(--dsw-alias-label-primary);\n font-weight: var(--dsw-font-s-strong-14, 600);\n font-size: 13px;\n}\n.rg-dataflow-detail {\n color: var(--dsw-alias-label-tertiary);\n font-size: 12px;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.rg-dataflow-count {\n flex: none;\n margin-left: auto;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* \u7CFB\u7EDF\u8BCA\u65AD\u5361\uFF1A\u7D27\u51D1\u952E\u503C\u5BF9 + \u53CD\u9988\u6309\u94AE\u3002 */\n.rg-issues-button {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n margin-top: 10px;\n text-decoration: none;\n color: var(--dsw-alias-brand-primary);\n border: 1px solid var(--dsw-alias-border-l1);\n}\n.rg-issues-button:hover {\n border-color: var(--dsw-alias-brand-primary);\n}\n";
|
|
3143
3270
|
|
|
3144
3271
|
// src/client/styles.ts
|
|
3145
3272
|
var STYLE_ELEMENT_ID = "dsh-recency-guard-styles";
|
package/locale/en.json
CHANGED
|
@@ -231,7 +231,13 @@
|
|
|
231
231
|
"bundle": "Bundle",
|
|
232
232
|
"gap": "Gap"
|
|
233
233
|
},
|
|
234
|
-
"matchIndex": "Match {index}/{total}"
|
|
234
|
+
"matchIndex": "Match {index}/{total}",
|
|
235
|
+
"edgeDetails": "Edge details",
|
|
236
|
+
"edgeFrom": "Produces (from)",
|
|
237
|
+
"edgeTo": "Consumes (to)",
|
|
238
|
+
"edgeKind": "Semantics",
|
|
239
|
+
"edgeTransitions": "transition",
|
|
240
|
+
"edgeRanks": "ranking"
|
|
235
241
|
},
|
|
236
242
|
"events": {
|
|
237
243
|
"title": "Event stream",
|
package/locale/zh.json
CHANGED
|
@@ -231,7 +231,13 @@
|
|
|
231
231
|
"bundle": "插件",
|
|
232
232
|
"gap": "缺口"
|
|
233
233
|
},
|
|
234
|
-
"matchIndex": "第 {index}/{total} 个"
|
|
234
|
+
"matchIndex": "第 {index}/{total} 个",
|
|
235
|
+
"edgeDetails": "边详情",
|
|
236
|
+
"edgeFrom": "生产方(起点)",
|
|
237
|
+
"edgeTo": "消费方(终点)",
|
|
238
|
+
"edgeKind": "语义",
|
|
239
|
+
"edgeTransitions": "状态迁移",
|
|
240
|
+
"edgeRanks": "排序引用"
|
|
235
241
|
},
|
|
236
242
|
"events": {
|
|
237
243
|
"title": "事件流",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-recency-guard",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.4",
|
|
4
4
|
"description": "Crash-recovery guard for DeepSeek Harness: records third-party/experimental plugin install & update recency, backs up their config, and after a crash auto-disables the most-recently-updated plugin(s) so the profile boots again, then restores stable config.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|