dsh-recency-guard 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -12
- package/dist/client.js +677 -8
- package/dist/index.js +435 -137
- package/dsh-plugin.json +2 -2
- package/locale/en.json +23 -1
- package/locale/zh.json +23 -1
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -124,6 +124,15 @@ var zh_default = {
|
|
|
124
124
|
moreTransitions: "\u8FD8\u6709 {count} \u6B21\u66F4\u65E9\u7684\u8FC1\u79FB\u672A\u663E\u793A",
|
|
125
125
|
fewerTransitions: "\u6536\u8D77\u8F83\u65E9\u7684\u8FC1\u79FB"
|
|
126
126
|
},
|
|
127
|
+
steps: {
|
|
128
|
+
title: "\u6267\u884C\u64CD\u4F5C\u8BB0\u5F55",
|
|
129
|
+
hint: "\u63D2\u4EF6\u6BCF\u6B21\u6267\u884C\u52A8\u4F5C\u7684\u7559\u75D5\uFF08\u5F00\u59CB/\u7ED3\u675F/\u8017\u65F6/\u6210\u8D25\uFF09\u2014\u2014\u4E0E\u9636\u6BB5\u8FC1\u79FB\u4E92\u8865\uFF1A\u8FC1\u79FB\u662F\u72B6\u6001\u8F68\u8FF9\uFF0C\u8FD9\u91CC\u662F\u6267\u884C\u8F68\u8FF9",
|
|
130
|
+
noSteps: "\u5C1A\u65E0\u6267\u884C\u6B65\u9AA4\u8BB0\u5F55\uFF08\u63D2\u4EF6\u5C1A\u672A\u6267\u884C\u52A8\u4F5C\uFF09",
|
|
131
|
+
noSummary: "\u65E0\u6458\u8981",
|
|
132
|
+
ok: "\u6210\u529F",
|
|
133
|
+
failed: "\u5931\u8D25",
|
|
134
|
+
running: "\u6267\u884C\u4E2D"
|
|
135
|
+
},
|
|
127
136
|
metrics: {
|
|
128
137
|
title: "\u91CF\u5316\u6307\u6807",
|
|
129
138
|
crashRate: "\u5D29\u6E83\u7387",
|
|
@@ -188,7 +197,13 @@ var zh_default = {
|
|
|
188
197
|
repository: "\u4EE3\u7801\u4ED3\u5E93",
|
|
189
198
|
issues: "\u95EE\u9898\u53CD\u9988",
|
|
190
199
|
issuesHint: "\u5D29\u6E83\u8BEF\u5173/\u6062\u590D\u5F02\u5E38\uFF1F\u5E26\u4E0A\u300C\u5206\u533A\u952E + \u65F6\u523B + \u63D2\u4EF6\u540D\u300D\u53BB\u63D0 Issue",
|
|
191
|
-
unknown: "\u672A\u77E5"
|
|
200
|
+
unknown: "\u672A\u77E5",
|
|
201
|
+
buildFreshness: "\u4EA7\u7269\u65B0\u9C9C\u5EA6",
|
|
202
|
+
buildStale: "\u4EA7\u7269\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u91CD\u65B0\u6784\u5EFA",
|
|
203
|
+
buildStaleMinutes: "\u4EA7\u7269\u5DF2\u8FC7\u671F\uFF08\u6E90\u7801\u6BD4\u4EA7\u7269\u65B0 {n} \u5206\u949F\uFF09\uFF0C\u8BF7\u91CD\u65B0\u6784\u5EFA",
|
|
204
|
+
buildFresh: "\u4EA7\u7269\u4E0E\u6E90\u7801\u4E00\u81F4",
|
|
205
|
+
buildUnknown: "\u65E0\u6CD5\u5224\u5B9A\u4EA7\u7269\u65B0\u9C9C\u5EA6",
|
|
206
|
+
buildRevision: "\u6784\u5EFA\u6307\u7EB9"
|
|
192
207
|
},
|
|
193
208
|
trend: {
|
|
194
209
|
worsening: "\u6076\u5316\u4E2D",
|
|
@@ -500,6 +515,13 @@ var zh_default = {
|
|
|
500
515
|
score: "\u8D1D\u53F6\u65AF\u5206",
|
|
501
516
|
insufficient: "\u6837\u672C\u7A00\u758F\uFF0C\u4E0D\u53EF\u5224\u5B9A",
|
|
502
517
|
unavailable: "\u8BE5\u89C6\u56FE\u4E0D\u542B\u8D1D\u53F6\u65AF\u8BFB\u6570\uFF08\u4E0D\u53EF\u5F97 \u2260 \u6CA1\u6709\u5ACC\u7591\uFF09"
|
|
518
|
+
},
|
|
519
|
+
toolview: {
|
|
520
|
+
ok: "\u5B8C\u6210",
|
|
521
|
+
preparing: "\u51C6\u5907\u4E2D\u2026",
|
|
522
|
+
omitted: "\u6298\u53E0 {n} \u6761",
|
|
523
|
+
sectionOmitted: "\u5176\u4F59 {n} \u6761\u672A\u5C55\u5F00\uFF08\u5B8C\u6574\u4E8B\u5B9E\u89C1\u5DE5\u5177\u8F93\u51FA\uFF09",
|
|
524
|
+
noMeta: "\u672A\u63D0\u4F9B\u8017\u65F6/\u9000\u51FA\u7801"
|
|
503
525
|
}
|
|
504
526
|
};
|
|
505
527
|
|
|
@@ -588,6 +610,15 @@ var en_default = {
|
|
|
588
610
|
moreTransitions: "{count} earlier transitions hidden",
|
|
589
611
|
fewerTransitions: "Show fewer transitions"
|
|
590
612
|
},
|
|
613
|
+
steps: {
|
|
614
|
+
title: "Execution log",
|
|
615
|
+
hint: "Operation records of each plugin action (start/end/duration/result) \u2014 complements stage transitions: transitions are the state trajectory, these are the execution trajectory",
|
|
616
|
+
noSteps: "No step records yet (the plugin has not executed any action)",
|
|
617
|
+
noSummary: "no summary",
|
|
618
|
+
ok: "ok",
|
|
619
|
+
failed: "failed",
|
|
620
|
+
running: "running"
|
|
621
|
+
},
|
|
591
622
|
metrics: {
|
|
592
623
|
title: "Metrics",
|
|
593
624
|
crashRate: "Crash rate",
|
|
@@ -652,7 +683,13 @@ var en_default = {
|
|
|
652
683
|
repository: "Repository",
|
|
653
684
|
issues: "Report an issue",
|
|
654
685
|
issuesHint: "Wrong plugin disabled / recovery misbehaving? Open an issue with the partition key + time + plugin name",
|
|
655
|
-
unknown: "unknown"
|
|
686
|
+
unknown: "unknown",
|
|
687
|
+
buildFreshness: "Build freshness",
|
|
688
|
+
buildStale: "Artifact is stale \u2014 rebuild",
|
|
689
|
+
buildStaleMinutes: "Artifact is stale (source is {n} min newer) \u2014 rebuild",
|
|
690
|
+
buildFresh: "Artifact matches source",
|
|
691
|
+
buildUnknown: "Build freshness undetermined",
|
|
692
|
+
buildRevision: "Build revision"
|
|
656
693
|
},
|
|
657
694
|
trend: {
|
|
658
695
|
worsening: "worsening",
|
|
@@ -964,6 +1001,13 @@ var en_default = {
|
|
|
964
1001
|
score: "Bayes score",
|
|
965
1002
|
insufficient: "Sparse samples - undefined",
|
|
966
1003
|
unavailable: "This view has no Bayesian reading (unavailable \u2260 no suspect)"
|
|
1004
|
+
},
|
|
1005
|
+
toolview: {
|
|
1006
|
+
ok: "done",
|
|
1007
|
+
preparing: "preparing\u2026",
|
|
1008
|
+
omitted: "{n} collapsed",
|
|
1009
|
+
sectionOmitted: "{n} more not shown (full facts in tool output)",
|
|
1010
|
+
noMeta: "no duration/exit code provided"
|
|
967
1011
|
}
|
|
968
1012
|
};
|
|
969
1013
|
|
|
@@ -3636,6 +3680,40 @@ function diagnosticsRows(snapshot) {
|
|
|
3636
3680
|
if (d.repositoryUrl !== null) {
|
|
3637
3681
|
rows.push({ key: "repository", label: t("diagnostics.repository"), value: shortRepoUrl(d.repositoryUrl), href: d.repositoryUrl });
|
|
3638
3682
|
}
|
|
3683
|
+
const freshness = d.buildFreshness;
|
|
3684
|
+
if (freshness !== void 0) {
|
|
3685
|
+
if (freshness.stale === true) {
|
|
3686
|
+
const driftMin = typeof freshness.driftMs === "number" && Number.isFinite(freshness.driftMs) ? Math.round(freshness.driftMs / 6e4) : null;
|
|
3687
|
+
rows.push({
|
|
3688
|
+
key: "buildFreshness",
|
|
3689
|
+
label: t("diagnostics.buildFreshness"),
|
|
3690
|
+
value: driftMin === null ? t("diagnostics.buildStale") : t("diagnostics.buildStaleMinutes", { n: driftMin }),
|
|
3691
|
+
href: null
|
|
3692
|
+
});
|
|
3693
|
+
} else if (freshness.stale === false) {
|
|
3694
|
+
rows.push({
|
|
3695
|
+
key: "buildFreshness",
|
|
3696
|
+
label: t("diagnostics.buildFreshness"),
|
|
3697
|
+
value: t("diagnostics.buildFresh"),
|
|
3698
|
+
href: null
|
|
3699
|
+
});
|
|
3700
|
+
} else {
|
|
3701
|
+
rows.push({
|
|
3702
|
+
key: "buildFreshness",
|
|
3703
|
+
label: t("diagnostics.buildFreshness"),
|
|
3704
|
+
value: freshness.reason !== null ? freshness.reason : t("diagnostics.buildUnknown"),
|
|
3705
|
+
href: null
|
|
3706
|
+
});
|
|
3707
|
+
}
|
|
3708
|
+
if (freshness.revision !== null) {
|
|
3709
|
+
rows.push({
|
|
3710
|
+
key: "buildRevision",
|
|
3711
|
+
label: t("diagnostics.buildRevision"),
|
|
3712
|
+
value: freshness.revision,
|
|
3713
|
+
href: null
|
|
3714
|
+
});
|
|
3715
|
+
}
|
|
3716
|
+
}
|
|
3639
3717
|
return rows;
|
|
3640
3718
|
}
|
|
3641
3719
|
function shortRepoUrl(url) {
|
|
@@ -3713,6 +3791,23 @@ function agoLabel(iso, now = Date.now()) {
|
|
|
3713
3791
|
if (hours < 24) return t("time.hoursAgo", { count: hours });
|
|
3714
3792
|
return t("time.daysAgo", { count: Math.round(hours / 24) });
|
|
3715
3793
|
}
|
|
3794
|
+
function stepRows(snapshot) {
|
|
3795
|
+
const steps = snapshot.steps;
|
|
3796
|
+
if (steps === null || steps === void 0) return [];
|
|
3797
|
+
return steps.map((step) => {
|
|
3798
|
+
const finished = step.endedAt !== void 0;
|
|
3799
|
+
const durationText = finished && step.durationMs !== void 0 ? `${step.durationMs}ms` : null;
|
|
3800
|
+
const statusText = !finished ? "running" : step.ok === true ? "ok" : "failed";
|
|
3801
|
+
return {
|
|
3802
|
+
name: step.name,
|
|
3803
|
+
startedAt: step.startedAt,
|
|
3804
|
+
endedAt: finished ? step.endedAt ?? null : null,
|
|
3805
|
+
durationText,
|
|
3806
|
+
statusText,
|
|
3807
|
+
summary: step.reason ?? t("steps.noSummary")
|
|
3808
|
+
};
|
|
3809
|
+
});
|
|
3810
|
+
}
|
|
3716
3811
|
|
|
3717
3812
|
// src/client/panel/PanelCards.tsx
|
|
3718
3813
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
@@ -3913,6 +4008,16 @@ function LifecycleBody({ snapshot }) {
|
|
|
3913
4008
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("dt", { children: t("state.restored") }),
|
|
3914
4009
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("dd", { children: snapshot.restored.length })
|
|
3915
4010
|
] }),
|
|
4011
|
+
(snapshot.steps?.length ?? 0) > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "rg-steps", "aria-label": t("steps.title"), children: [
|
|
4012
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "rg-steps-title", title: t("steps.hint"), children: t("steps.title") }),
|
|
4013
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ol", { className: "rg-steps-list", children: stepRows(snapshot).map((row) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("li", { className: `rg-step-row rg-step-${row.statusText ?? "running"}`, children: [
|
|
4014
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "rg-step-name", children: row.name }),
|
|
4015
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: `rg-badge rg-badge-${row.statusText === "failed" ? "error" : row.statusText === "ok" ? "success" : "warn"}`, children: row.statusText === "ok" ? t("steps.ok") : row.statusText === "failed" ? t("steps.failed") : t("steps.running") }),
|
|
4016
|
+
row.durationText !== null && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "rg-step-duration", children: row.durationText }),
|
|
4017
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "rg-step-summary", title: row.summary, children: row.summary }),
|
|
4018
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("time", { className: "rg-step-time", children: formatClock(row.startedAt) })
|
|
4019
|
+
] }, `${row.startedAt}-${row.name}`)) })
|
|
4020
|
+
] }),
|
|
3916
4021
|
snapshot.transitions.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "rg-empty", children: t("state.noTransitions") }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
|
|
3917
4022
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ol", { className: "rg-transitions", children: visibleTransitions.map(({ transition, index }) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("li", { className: "rg-transition", children: [
|
|
3918
4023
|
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: `rg-badge rg-badge-${transition.to}`, children: stageLabelOf(transition.to) }),
|
|
@@ -4689,6 +4794,45 @@ function graphFingerprint(graph) {
|
|
|
4689
4794
|
function pollContentFingerprint(snapshot, graph) {
|
|
4690
4795
|
return `${snapshotFingerprint(snapshot)}|${graphFingerprint(graph)}`;
|
|
4691
4796
|
}
|
|
4797
|
+
var FAILURE_BACKOFF_STEPS = [5e3, 1e4, 2e4, 4e4, 6e4];
|
|
4798
|
+
function nextFailureDelay(consecutiveFailures) {
|
|
4799
|
+
const last = FAILURE_BACKOFF_STEPS.length - 1;
|
|
4800
|
+
if (typeof consecutiveFailures !== "number" || Number.isNaN(consecutiveFailures)) {
|
|
4801
|
+
return FAILURE_BACKOFF_STEPS[0];
|
|
4802
|
+
}
|
|
4803
|
+
if (consecutiveFailures === Number.POSITIVE_INFINITY) {
|
|
4804
|
+
return FAILURE_BACKOFF_STEPS[last];
|
|
4805
|
+
}
|
|
4806
|
+
if (consecutiveFailures <= 0) return FAILURE_BACKOFF_STEPS[0];
|
|
4807
|
+
const index = Math.min(last, Math.floor(consecutiveFailures) - 1);
|
|
4808
|
+
return FAILURE_BACKOFF_STEPS[index < 0 ? 0 : index];
|
|
4809
|
+
}
|
|
4810
|
+
function pageVisible() {
|
|
4811
|
+
const doc = globalThis.document;
|
|
4812
|
+
if (!doc) return true;
|
|
4813
|
+
if (typeof doc.visibilityState !== "string") return true;
|
|
4814
|
+
return doc.visibilityState !== "hidden";
|
|
4815
|
+
}
|
|
4816
|
+
|
|
4817
|
+
// src/client/panel/epoch-guard.ts
|
|
4818
|
+
function createEpochGuard(initial = 0) {
|
|
4819
|
+
let epoch = initial;
|
|
4820
|
+
return {
|
|
4821
|
+
get current() {
|
|
4822
|
+
return epoch;
|
|
4823
|
+
},
|
|
4824
|
+
begin() {
|
|
4825
|
+
return epoch;
|
|
4826
|
+
},
|
|
4827
|
+
isCurrent(candidate) {
|
|
4828
|
+
return candidate === epoch;
|
|
4829
|
+
},
|
|
4830
|
+
advance() {
|
|
4831
|
+
epoch += 1;
|
|
4832
|
+
return epoch;
|
|
4833
|
+
}
|
|
4834
|
+
};
|
|
4835
|
+
}
|
|
4692
4836
|
|
|
4693
4837
|
// src/client/panel/GuardPanel.tsx
|
|
4694
4838
|
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
@@ -4730,8 +4874,11 @@ function GuardPanel(props) {
|
|
|
4730
4874
|
const mounted = (0, import_react6.useRef)(true);
|
|
4731
4875
|
const fingerprintRef = (0, import_react6.useRef)(null);
|
|
4732
4876
|
const sameRoundsRef = (0, import_react6.useRef)(0);
|
|
4877
|
+
const failureCountRef = (0, import_react6.useRef)(0);
|
|
4878
|
+
const epochGuardRef = (0, import_react6.useRef)(createEpochGuard());
|
|
4733
4879
|
const load = (0, import_react6.useCallback)(
|
|
4734
4880
|
async (partitionKey) => {
|
|
4881
|
+
const epoch = epochGuardRef.current.begin();
|
|
4735
4882
|
const [snapshotResult, graphResult, archivesResult] = await Promise.all([
|
|
4736
4883
|
props.fetchSnapshot(partitionKey ?? void 0),
|
|
4737
4884
|
props.fetchGraph(partitionKey ?? void 0),
|
|
@@ -4740,6 +4887,9 @@ function GuardPanel(props) {
|
|
|
4740
4887
|
props.fetchArchives ? props.fetchArchives(partitionKey ?? void 0) : Promise.resolve({ ok: false, reason: "archives-absent" })
|
|
4741
4888
|
]);
|
|
4742
4889
|
if (!mounted.current) return { changed: true, sameRounds: 0 };
|
|
4890
|
+
if (!epochGuardRef.current.isCurrent(epoch)) {
|
|
4891
|
+
return { changed: true, sameRounds: 0 };
|
|
4892
|
+
}
|
|
4743
4893
|
if (snapshotResult.ok) {
|
|
4744
4894
|
setSnapshot(snapshotResult.data);
|
|
4745
4895
|
setFailure(null);
|
|
@@ -4760,8 +4910,10 @@ function GuardPanel(props) {
|
|
|
4760
4910
|
);
|
|
4761
4911
|
if (!snapshotResult.ok) {
|
|
4762
4912
|
sameRoundsRef.current = 0;
|
|
4763
|
-
|
|
4913
|
+
failureCountRef.current += 1;
|
|
4914
|
+
return { changed: true, sameRounds: 0, failed: true };
|
|
4764
4915
|
}
|
|
4916
|
+
failureCountRef.current = 0;
|
|
4765
4917
|
const fingerprint = pollContentFingerprint(
|
|
4766
4918
|
snapshotResult.data,
|
|
4767
4919
|
graphResult.ok ? graphResult.data : null
|
|
@@ -4781,7 +4933,7 @@ function GuardPanel(props) {
|
|
|
4781
4933
|
let timer = null;
|
|
4782
4934
|
const afterLoad = (outcome) => {
|
|
4783
4935
|
if (cancelled) return;
|
|
4784
|
-
const delay = nextPollDelay({
|
|
4936
|
+
const delay = outcome.failed === true ? nextFailureDelay(failureCountRef.current) : nextPollDelay({
|
|
4785
4937
|
sameRounds: outcome.sameRounds,
|
|
4786
4938
|
changed: outcome.changed,
|
|
4787
4939
|
baseMs: POLL_BASE
|
|
@@ -4798,9 +4950,21 @@ function GuardPanel(props) {
|
|
|
4798
4950
|
afterLoad(outcome);
|
|
4799
4951
|
};
|
|
4800
4952
|
void run();
|
|
4953
|
+
const onVisibilityChange = () => {
|
|
4954
|
+
if (cancelled) return;
|
|
4955
|
+
if (!pageVisible()) return;
|
|
4956
|
+
if (timer !== null) {
|
|
4957
|
+
clearTimeout(timer);
|
|
4958
|
+
timer = null;
|
|
4959
|
+
}
|
|
4960
|
+
void run();
|
|
4961
|
+
};
|
|
4962
|
+
const doc = globalThis.document;
|
|
4963
|
+
doc?.addEventListener?.("visibilitychange", onVisibilityChange);
|
|
4801
4964
|
return () => {
|
|
4802
4965
|
cancelled = true;
|
|
4803
4966
|
if (timer !== null) clearTimeout(timer);
|
|
4967
|
+
doc?.removeEventListener?.("visibilitychange", onVisibilityChange);
|
|
4804
4968
|
mounted.current = false;
|
|
4805
4969
|
};
|
|
4806
4970
|
}, [load, polling, requestedKey]);
|
|
@@ -4837,6 +5001,10 @@ function GuardPanel(props) {
|
|
|
4837
5001
|
},
|
|
4838
5002
|
[props.postAction, load, requestedKey, snapshot?.revision]
|
|
4839
5003
|
);
|
|
5004
|
+
const selectPartition = (0, import_react6.useCallback)((key) => {
|
|
5005
|
+
epochGuardRef.current.advance();
|
|
5006
|
+
setRequestedKey(key);
|
|
5007
|
+
}, []);
|
|
4840
5008
|
const toggleCollapse = (0, import_react6.useCallback)((card) => {
|
|
4841
5009
|
setCollapsed((current) => {
|
|
4842
5010
|
const next = new Set(current);
|
|
@@ -4937,12 +5105,12 @@ function GuardPanel(props) {
|
|
|
4937
5105
|
actual: partitionMismatch.actual.slice(0, 8)
|
|
4938
5106
|
}),
|
|
4939
5107
|
" ",
|
|
4940
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "rg-link", onClick: () =>
|
|
5108
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "rg-link", onClick: () => selectPartition(null), children: t("partitions.backToCurrent") })
|
|
4941
5109
|
] }),
|
|
4942
5110
|
partitionState !== null && partitionState.inspectingOther && partitionMismatch === null && /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("p", { className: "rg-notice", role: "status", children: [
|
|
4943
5111
|
t("partitions.inspectingNotice", { label: partitionState.selected?.label ?? "" }),
|
|
4944
5112
|
" ",
|
|
4945
|
-
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "rg-link", onClick: () =>
|
|
5113
|
+
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("button", { type: "button", className: "rg-link", onClick: () => selectPartition(null), children: t("partitions.backToCurrent") })
|
|
4946
5114
|
] }),
|
|
4947
5115
|
unavailable ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "rg-state-block", role: "status", children: [
|
|
4948
5116
|
/* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "rg-state-title", children: t("panel.unavailable") }),
|
|
@@ -5101,7 +5269,7 @@ function GuardPanel(props) {
|
|
|
5101
5269
|
{
|
|
5102
5270
|
snapshot,
|
|
5103
5271
|
selectedKey: requestedKey ?? snapshot.projectKey,
|
|
5104
|
-
onSelect: (key) =>
|
|
5272
|
+
onSelect: (key) => selectPartition(key === snapshot.projectKey ? null : key)
|
|
5105
5273
|
}
|
|
5106
5274
|
)
|
|
5107
5275
|
}
|
|
@@ -5449,8 +5617,508 @@ function openPanel(ctx) {
|
|
|
5449
5617
|
}
|
|
5450
5618
|
}
|
|
5451
5619
|
|
|
5620
|
+
// src/client/toolview/ToolViewIntegration.ts
|
|
5621
|
+
var import_react11 = require("react");
|
|
5622
|
+
|
|
5623
|
+
// src/client/toolview/GuardToolCard.tsx
|
|
5624
|
+
var import_react10 = require("react");
|
|
5625
|
+
|
|
5626
|
+
// src/client/toolview/toolview-model.ts
|
|
5627
|
+
function str(value) {
|
|
5628
|
+
return typeof value === "string" ? value : "";
|
|
5629
|
+
}
|
|
5630
|
+
function num(value) {
|
|
5631
|
+
return typeof value === "number" && Number.isFinite(value) ? value : void 0;
|
|
5632
|
+
}
|
|
5633
|
+
function summarizeArgs(args) {
|
|
5634
|
+
if (typeof args !== "object" || args === null) return "";
|
|
5635
|
+
const source = args;
|
|
5636
|
+
const parts = [];
|
|
5637
|
+
for (const key of Object.keys(source)) {
|
|
5638
|
+
const value = source[key];
|
|
5639
|
+
if (typeof value === "string") {
|
|
5640
|
+
parts.push(`${key}=${value}`);
|
|
5641
|
+
} else if (typeof value === "number" && Number.isFinite(value)) {
|
|
5642
|
+
parts.push(`${key}=${value}`);
|
|
5643
|
+
} else if (typeof value === "boolean") {
|
|
5644
|
+
parts.push(`${key}=${value ? "true" : "false"}`);
|
|
5645
|
+
}
|
|
5646
|
+
}
|
|
5647
|
+
return parts.join(" \xB7 ");
|
|
5648
|
+
}
|
|
5649
|
+
function extractMetaFacts(meta) {
|
|
5650
|
+
const empty = { facts: [], sections: [], omitted: 0, title: "", summary: "", ok: true };
|
|
5651
|
+
if (typeof meta !== "object" || meta === null) return empty;
|
|
5652
|
+
const source = meta;
|
|
5653
|
+
const facts = [];
|
|
5654
|
+
if (Array.isArray(source.facts)) {
|
|
5655
|
+
for (const item of source.facts) {
|
|
5656
|
+
if (typeof item !== "object" || item === null) continue;
|
|
5657
|
+
const pair = item;
|
|
5658
|
+
const label = str(pair.label);
|
|
5659
|
+
const value = str(pair.value);
|
|
5660
|
+
if (label === "" && value === "") continue;
|
|
5661
|
+
facts.push({ label: label === "" ? "\u2014" : label, value });
|
|
5662
|
+
}
|
|
5663
|
+
}
|
|
5664
|
+
const sections = [];
|
|
5665
|
+
if (Array.isArray(source.sections)) {
|
|
5666
|
+
for (const item of source.sections) {
|
|
5667
|
+
if (typeof item !== "object" || item === null) continue;
|
|
5668
|
+
const sec = item;
|
|
5669
|
+
const lines = Array.isArray(sec.lines) ? sec.lines.filter((line) => typeof line === "string") : [];
|
|
5670
|
+
const title = str(sec.title);
|
|
5671
|
+
if (title === "" && lines.length === 0) continue;
|
|
5672
|
+
sections.push({
|
|
5673
|
+
title: title === "" ? "\u660E\u7EC6" : title,
|
|
5674
|
+
lines,
|
|
5675
|
+
collapsed: sec.collapsed === true,
|
|
5676
|
+
omitted: num(sec.omitted) ?? 0
|
|
5677
|
+
});
|
|
5678
|
+
}
|
|
5679
|
+
}
|
|
5680
|
+
return {
|
|
5681
|
+
facts,
|
|
5682
|
+
sections,
|
|
5683
|
+
omitted: num(source.omitted) ?? 0,
|
|
5684
|
+
title: str(source.title),
|
|
5685
|
+
summary: str(source.summary),
|
|
5686
|
+
ok: source.ok !== false
|
|
5687
|
+
};
|
|
5688
|
+
}
|
|
5689
|
+
function extractOutputText(block) {
|
|
5690
|
+
if (typeof block !== "object" || block === null) return "";
|
|
5691
|
+
const content = block.content;
|
|
5692
|
+
if (typeof content === "string") return content;
|
|
5693
|
+
if (!Array.isArray(content)) return "";
|
|
5694
|
+
const parts = [];
|
|
5695
|
+
for (const item of content) {
|
|
5696
|
+
if (typeof item === "string") {
|
|
5697
|
+
parts.push(item);
|
|
5698
|
+
continue;
|
|
5699
|
+
}
|
|
5700
|
+
if (typeof item !== "object" || item === null) continue;
|
|
5701
|
+
const cell = item;
|
|
5702
|
+
if (cell.type === "text") {
|
|
5703
|
+
const text = str(cell.text);
|
|
5704
|
+
if (text !== "") parts.push(text);
|
|
5705
|
+
}
|
|
5706
|
+
}
|
|
5707
|
+
return parts.join("\n");
|
|
5708
|
+
}
|
|
5709
|
+
function buildToolViewModel(props) {
|
|
5710
|
+
const source = typeof props === "object" && props !== null ? props : {};
|
|
5711
|
+
const toolName = str(source.toolName);
|
|
5712
|
+
const cwd = str(source.cwd) || void 0;
|
|
5713
|
+
const phaseRaw = str(source.phase);
|
|
5714
|
+
const phase = phaseRaw === "preparing" || phaseRaw === "start" || phaseRaw === "result" ? phaseRaw : "result";
|
|
5715
|
+
const block = typeof source.block === "object" && source.block !== null ? source.block : {};
|
|
5716
|
+
if (phase === "preparing") {
|
|
5717
|
+
return {
|
|
5718
|
+
phase,
|
|
5719
|
+
toolName,
|
|
5720
|
+
title: toolName,
|
|
5721
|
+
ok: true,
|
|
5722
|
+
summary: "",
|
|
5723
|
+
facts: [],
|
|
5724
|
+
sections: [],
|
|
5725
|
+
output: "",
|
|
5726
|
+
omitted: 0,
|
|
5727
|
+
isError: false,
|
|
5728
|
+
exitCode: void 0,
|
|
5729
|
+
durationMs: void 0,
|
|
5730
|
+
cwd,
|
|
5731
|
+
argsSummary: "",
|
|
5732
|
+
pending: true
|
|
5733
|
+
};
|
|
5734
|
+
}
|
|
5735
|
+
const meta = typeof block.meta === "object" && block.meta !== null ? block.meta : {};
|
|
5736
|
+
const metaFacts = extractMetaFacts(meta);
|
|
5737
|
+
if (phase === "start") {
|
|
5738
|
+
const args = block.arguments ?? block.args;
|
|
5739
|
+
return {
|
|
5740
|
+
phase,
|
|
5741
|
+
toolName,
|
|
5742
|
+
title: toolName,
|
|
5743
|
+
ok: true,
|
|
5744
|
+
summary: "",
|
|
5745
|
+
facts: [],
|
|
5746
|
+
sections: [],
|
|
5747
|
+
output: "",
|
|
5748
|
+
omitted: 0,
|
|
5749
|
+
isError: false,
|
|
5750
|
+
exitCode: void 0,
|
|
5751
|
+
durationMs: void 0,
|
|
5752
|
+
cwd,
|
|
5753
|
+
argsSummary: summarizeArgs(args),
|
|
5754
|
+
pending: false
|
|
5755
|
+
};
|
|
5756
|
+
}
|
|
5757
|
+
const output = extractOutputText(block);
|
|
5758
|
+
const exitCode = num(meta.exitCode) ?? num(block.exitCode);
|
|
5759
|
+
const durationMs = num(meta.durationMs) ?? num(block.durationMs);
|
|
5760
|
+
return {
|
|
5761
|
+
phase,
|
|
5762
|
+
toolName,
|
|
5763
|
+
// 标题优先取 host 给的(它知道 action 语义),其次工具名。
|
|
5764
|
+
title: metaFacts.title !== "" ? metaFacts.title : toolName,
|
|
5765
|
+
ok: metaFacts.ok,
|
|
5766
|
+
summary: metaFacts.summary,
|
|
5767
|
+
facts: metaFacts.facts,
|
|
5768
|
+
sections: metaFacts.sections,
|
|
5769
|
+
output,
|
|
5770
|
+
omitted: metaFacts.omitted,
|
|
5771
|
+
isError: block.isError === true,
|
|
5772
|
+
exitCode,
|
|
5773
|
+
durationMs,
|
|
5774
|
+
cwd,
|
|
5775
|
+
argsSummary: "",
|
|
5776
|
+
pending: false
|
|
5777
|
+
};
|
|
5778
|
+
}
|
|
5779
|
+
|
|
5780
|
+
// src/client/toolview/GuardToolCard.tsx
|
|
5781
|
+
var TOOLVIEW_CSS = `
|
|
5782
|
+
.rg-toolview-card {
|
|
5783
|
+
display: flex;
|
|
5784
|
+
flex-direction: column;
|
|
5785
|
+
gap: 6px;
|
|
5786
|
+
padding: 10px 12px;
|
|
5787
|
+
border: 1px solid var(--dsw-alias-border-l2, rgba(128, 128, 128, 0.28));
|
|
5788
|
+
border-radius: var(--dsw-radius-sm, 8px);
|
|
5789
|
+
background: var(--dsw-alias-bg-layer-1, transparent);
|
|
5790
|
+
color: var(--dsw-alias-label-primary, inherit);
|
|
5791
|
+
font-family: var(--dsw-font-family, inherit);
|
|
5792
|
+
font-size: var(--dsw-font-xs-13, 13px);
|
|
5793
|
+
line-height: var(--dsw-font-s-14-line-height, 20px);
|
|
5794
|
+
min-width: 0;
|
|
5795
|
+
}
|
|
5796
|
+
.rg-toolview-head {
|
|
5797
|
+
display: flex;
|
|
5798
|
+
align-items: baseline;
|
|
5799
|
+
gap: 8px;
|
|
5800
|
+
flex-wrap: wrap;
|
|
5801
|
+
min-width: 0;
|
|
5802
|
+
}
|
|
5803
|
+
.rg-toolview-title {
|
|
5804
|
+
font-weight: 600;
|
|
5805
|
+
color: var(--dsw-alias-label-primary, inherit);
|
|
5806
|
+
/* \u957F action \u540D\u4E0D\u8BB8\u628A\u53F3\u4FA7\u7684\u72B6\u6001\u5FBD\u6807\u6324\u51FA\u53EF\u89C6\u533A\u3002 */
|
|
5807
|
+
min-width: 0;
|
|
5808
|
+
overflow: hidden;
|
|
5809
|
+
text-overflow: ellipsis;
|
|
5810
|
+
white-space: nowrap;
|
|
5811
|
+
word-break: keep-all;
|
|
5812
|
+
}
|
|
5813
|
+
.rg-toolview-badge {
|
|
5814
|
+
flex: 0 0 auto;
|
|
5815
|
+
padding: 1px 8px;
|
|
5816
|
+
border-radius: var(--dsw-radius-full, 999px);
|
|
5817
|
+
border: 1px solid var(--dsw-alias-border-l1, rgba(128, 128, 128, 0.22));
|
|
5818
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5819
|
+
font-variant-numeric: tabular-nums;
|
|
5820
|
+
color: var(--dsw-alias-label-secondary, inherit);
|
|
5821
|
+
}
|
|
5822
|
+
.rg-toolview-badge[data-tone='ok'] {
|
|
5823
|
+
color: var(--dsw-alias-state-success-primary, var(--dsw-alias-label-primary, inherit));
|
|
5824
|
+
border-color: var(--dsw-alias-state-success-primary, transparent);
|
|
5825
|
+
}
|
|
5826
|
+
.rg-toolview-badge[data-tone='bad'] {
|
|
5827
|
+
color: var(--dsw-alias-state-error-primary, var(--dsw-alias-label-primary, inherit));
|
|
5828
|
+
border-color: var(--dsw-alias-state-error-primary, transparent);
|
|
5829
|
+
}
|
|
5830
|
+
.rg-toolview-summary {
|
|
5831
|
+
color: var(--dsw-alias-label-secondary, inherit);
|
|
5832
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5833
|
+
word-break: break-word;
|
|
5834
|
+
}
|
|
5835
|
+
.rg-toolview-facts {
|
|
5836
|
+
display: grid;
|
|
5837
|
+
grid-template-columns: auto 1fr;
|
|
5838
|
+
gap: 2px 10px;
|
|
5839
|
+
margin: 0;
|
|
5840
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5841
|
+
}
|
|
5842
|
+
.rg-toolview-facts dt {
|
|
5843
|
+
color: var(--dsw-alias-label-tertiary, inherit);
|
|
5844
|
+
white-space: nowrap;
|
|
5845
|
+
}
|
|
5846
|
+
.rg-toolview-facts dd {
|
|
5847
|
+
margin: 0;
|
|
5848
|
+
color: var(--dsw-alias-label-primary, inherit);
|
|
5849
|
+
font-variant-numeric: tabular-nums;
|
|
5850
|
+
word-break: break-word;
|
|
5851
|
+
}
|
|
5852
|
+
.rg-toolview-output {
|
|
5853
|
+
margin: 0;
|
|
5854
|
+
padding: 8px 10px;
|
|
5855
|
+
border-radius: var(--dsw-radius-xs, 4px);
|
|
5856
|
+
background: var(--dsw-alias-bg-layer-2, rgba(128, 128, 128, 0.08));
|
|
5857
|
+
color: var(--dsw-alias-label-primary, inherit);
|
|
5858
|
+
font-family: var(--dsw-font-mono, ui-monospace, monospace);
|
|
5859
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5860
|
+
white-space: pre-wrap;
|
|
5861
|
+
word-break: break-word;
|
|
5862
|
+
/* \u6709\u754C\u4F46\u53EF\u89C1\uFF1A\u8D85\u51FA\u7684\u90E8\u5206\u6EDA\u52A8\uFF0C\u800C\u4E0D\u662F\u9759\u9ED8\u88C1\u6389\u3002 */
|
|
5863
|
+
max-height: 320px;
|
|
5864
|
+
overflow: auto;
|
|
5865
|
+
}
|
|
5866
|
+
.rg-toolview-output[data-tone='bad'] {
|
|
5867
|
+
color: var(--dsw-alias-state-error-primary, inherit);
|
|
5868
|
+
}
|
|
5869
|
+
.rg-toolview-sections {
|
|
5870
|
+
display: flex;
|
|
5871
|
+
flex-direction: column;
|
|
5872
|
+
gap: 4px;
|
|
5873
|
+
}
|
|
5874
|
+
.rg-toolview-section {
|
|
5875
|
+
border: 1px solid var(--dsw-alias-border-l1, rgba(128, 128, 128, 0.18));
|
|
5876
|
+
border-radius: var(--dsw-radius-xs, 4px);
|
|
5877
|
+
padding: 4px 8px;
|
|
5878
|
+
}
|
|
5879
|
+
.rg-toolview-section > summary {
|
|
5880
|
+
cursor: pointer;
|
|
5881
|
+
color: var(--dsw-alias-label-secondary, inherit);
|
|
5882
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5883
|
+
}
|
|
5884
|
+
.rg-toolview-lines {
|
|
5885
|
+
margin: 4px 0 0;
|
|
5886
|
+
padding: 0;
|
|
5887
|
+
list-style: none;
|
|
5888
|
+
font-family: var(--dsw-font-mono, ui-monospace, monospace);
|
|
5889
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5890
|
+
white-space: pre-wrap;
|
|
5891
|
+
word-break: break-word;
|
|
5892
|
+
max-height: 240px;
|
|
5893
|
+
overflow: auto;
|
|
5894
|
+
}
|
|
5895
|
+
.rg-toolview-lines li {
|
|
5896
|
+
padding: 1px 0;
|
|
5897
|
+
}
|
|
5898
|
+
.rg-toolview-omitted {
|
|
5899
|
+
margin-top: 2px;
|
|
5900
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5901
|
+
color: var(--dsw-alias-label-tertiary, inherit);
|
|
5902
|
+
}
|
|
5903
|
+
.rg-toolview-pending {
|
|
5904
|
+
color: var(--dsw-alias-label-tertiary, inherit);
|
|
5905
|
+
font-style: italic;
|
|
5906
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5907
|
+
}
|
|
5908
|
+
.rg-toolview-meta {
|
|
5909
|
+
display: flex;
|
|
5910
|
+
gap: 8px;
|
|
5911
|
+
align-items: center;
|
|
5912
|
+
flex-wrap: wrap;
|
|
5913
|
+
font-size: var(--dsw-font-xxxs-11, 11px);
|
|
5914
|
+
color: var(--dsw-alias-label-tertiary, inherit);
|
|
5915
|
+
}
|
|
5916
|
+
`;
|
|
5917
|
+
function renderCard(model) {
|
|
5918
|
+
const children = [];
|
|
5919
|
+
const badges = [];
|
|
5920
|
+
if (model.phase === "result") {
|
|
5921
|
+
if (model.exitCode !== void 0) {
|
|
5922
|
+
badges.push(
|
|
5923
|
+
(0, import_react10.createElement)(
|
|
5924
|
+
"span",
|
|
5925
|
+
{ key: "exit", className: "rg-toolview-badge", "data-tone": model.exitCode === 0 ? "ok" : "bad" },
|
|
5926
|
+
`exit ${model.exitCode}`
|
|
5927
|
+
)
|
|
5928
|
+
);
|
|
5929
|
+
} else if (model.ok) {
|
|
5930
|
+
badges.push((0, import_react10.createElement)("span", { key: "ok", className: "rg-toolview-badge", "data-tone": "ok" }, t("toolview.ok")));
|
|
5931
|
+
}
|
|
5932
|
+
if (model.omitted > 0) {
|
|
5933
|
+
badges.push(
|
|
5934
|
+
(0, import_react10.createElement)("span", { key: "omitted", className: "rg-toolview-badge" }, t("toolview.omitted", { n: model.omitted }))
|
|
5935
|
+
);
|
|
5936
|
+
}
|
|
5937
|
+
}
|
|
5938
|
+
children.push(
|
|
5939
|
+
(0, import_react10.createElement)(
|
|
5940
|
+
"div",
|
|
5941
|
+
{ key: "head", className: "rg-toolview-head" },
|
|
5942
|
+
(0, import_react10.createElement)("span", { key: "title", className: "rg-toolview-title", title: model.title }, model.title),
|
|
5943
|
+
...badges
|
|
5944
|
+
)
|
|
5945
|
+
);
|
|
5946
|
+
if (model.pending) {
|
|
5947
|
+
children.push(
|
|
5948
|
+
(0, import_react10.createElement)("div", { key: "pending", className: "rg-toolview-pending" }, t("toolview.preparing"))
|
|
5949
|
+
);
|
|
5950
|
+
return (0, import_react10.createElement)("div", { className: "rg-toolview-card", "data-rg-toolview": model.toolName }, ...children);
|
|
5951
|
+
}
|
|
5952
|
+
if (model.argsSummary !== "") {
|
|
5953
|
+
children.push(
|
|
5954
|
+
(0, import_react10.createElement)(
|
|
5955
|
+
"div",
|
|
5956
|
+
{ key: "args", className: "rg-toolview-summary" },
|
|
5957
|
+
`${model.argsSummary}${model.cwd ? ` \xB7 ${model.cwd}` : ""}`
|
|
5958
|
+
)
|
|
5959
|
+
);
|
|
5960
|
+
}
|
|
5961
|
+
if (model.summary !== "") {
|
|
5962
|
+
children.push((0, import_react10.createElement)("div", { key: "summary", className: "rg-toolview-summary" }, model.summary));
|
|
5963
|
+
}
|
|
5964
|
+
if (model.facts.length > 0) {
|
|
5965
|
+
const items = [];
|
|
5966
|
+
for (const fact of model.facts) {
|
|
5967
|
+
items.push((0, import_react10.createElement)("dt", { key: `k-${fact.label}` }, fact.label));
|
|
5968
|
+
items.push((0, import_react10.createElement)("dd", { key: `v-${fact.label}` }, fact.value));
|
|
5969
|
+
}
|
|
5970
|
+
children.push((0, import_react10.createElement)("dl", { key: "facts", className: "rg-toolview-facts" }, ...items));
|
|
5971
|
+
}
|
|
5972
|
+
if (model.sections.length > 0) {
|
|
5973
|
+
const sections = [];
|
|
5974
|
+
for (const [index, section] of model.sections.entries()) {
|
|
5975
|
+
const lines = section.lines.map(
|
|
5976
|
+
(line, lineIndex) => (0, import_react10.createElement)("li", { key: `l-${index}-${lineIndex}` }, line)
|
|
5977
|
+
);
|
|
5978
|
+
const inner = [(0, import_react10.createElement)("ul", { key: "lines", className: "rg-toolview-lines" }, ...lines)];
|
|
5979
|
+
if (section.omitted > 0) {
|
|
5980
|
+
inner.push(
|
|
5981
|
+
(0, import_react10.createElement)(
|
|
5982
|
+
"div",
|
|
5983
|
+
{ key: "om", className: "rg-toolview-omitted" },
|
|
5984
|
+
t("toolview.sectionOmitted", { n: section.omitted })
|
|
5985
|
+
)
|
|
5986
|
+
);
|
|
5987
|
+
}
|
|
5988
|
+
sections.push(
|
|
5989
|
+
(0, import_react10.createElement)(
|
|
5990
|
+
"details",
|
|
5991
|
+
{
|
|
5992
|
+
key: `s-${index}`,
|
|
5993
|
+
className: "rg-toolview-section",
|
|
5994
|
+
// 默认展开与否 = host 侧的说法。
|
|
5995
|
+
open: section.collapsed !== true
|
|
5996
|
+
},
|
|
5997
|
+
(0, import_react10.createElement)("summary", { key: "sum" }, section.title),
|
|
5998
|
+
...inner
|
|
5999
|
+
)
|
|
6000
|
+
);
|
|
6001
|
+
}
|
|
6002
|
+
children.push((0, import_react10.createElement)("div", { key: "sections", className: "rg-toolview-sections" }, ...sections));
|
|
6003
|
+
}
|
|
6004
|
+
if (model.output !== "") {
|
|
6005
|
+
children.push(
|
|
6006
|
+
(0, import_react10.createElement)(
|
|
6007
|
+
"pre",
|
|
6008
|
+
{ key: "output", className: "rg-toolview-output", "data-tone": model.isError ? "bad" : "normal" },
|
|
6009
|
+
model.output
|
|
6010
|
+
)
|
|
6011
|
+
);
|
|
6012
|
+
}
|
|
6013
|
+
const meta = [];
|
|
6014
|
+
if (model.durationMs !== void 0) {
|
|
6015
|
+
meta.push((0, import_react10.createElement)("span", { key: "dur" }, `${Math.round(model.durationMs)}ms`));
|
|
6016
|
+
}
|
|
6017
|
+
if (model.cwd !== void 0) {
|
|
6018
|
+
meta.push((0, import_react10.createElement)("span", { key: "cwd" }, model.cwd));
|
|
6019
|
+
}
|
|
6020
|
+
if (model.phase === "result" && model.exitCode === void 0 && model.durationMs === void 0) {
|
|
6021
|
+
meta.push((0, import_react10.createElement)("span", { key: "na" }, t("toolview.noMeta")));
|
|
6022
|
+
}
|
|
6023
|
+
if (meta.length > 0) {
|
|
6024
|
+
children.push((0, import_react10.createElement)("div", { key: "meta", className: "rg-toolview-meta" }, ...meta));
|
|
6025
|
+
}
|
|
6026
|
+
return (0, import_react10.createElement)("div", { className: "rg-toolview-card", "data-rg-toolview": model.toolName }, ...children);
|
|
6027
|
+
}
|
|
6028
|
+
function GuardToolCard(props) {
|
|
6029
|
+
let model;
|
|
6030
|
+
try {
|
|
6031
|
+
model = buildToolViewModel(props);
|
|
6032
|
+
} catch {
|
|
6033
|
+
model = buildToolViewModel({ toolName: "recency_guard", phase: "preparing" });
|
|
6034
|
+
}
|
|
6035
|
+
return renderCard(model);
|
|
6036
|
+
}
|
|
6037
|
+
|
|
6038
|
+
// src/client/toolview/ToolViewIntegration.ts
|
|
6039
|
+
var CSS_ID = "rg-toolview-css";
|
|
6040
|
+
var TOOLVIEW_TOOL_NAME = "recency_guard";
|
|
6041
|
+
function injectCssOnce() {
|
|
6042
|
+
if (typeof document === "undefined") return;
|
|
6043
|
+
if (document.getElementById(CSS_ID)) return;
|
|
6044
|
+
const style = document.createElement("style");
|
|
6045
|
+
style.id = CSS_ID;
|
|
6046
|
+
style.textContent = TOOLVIEW_CSS;
|
|
6047
|
+
document.head.appendChild(style);
|
|
6048
|
+
}
|
|
6049
|
+
function integrateToolView(ctx) {
|
|
6050
|
+
let api = null;
|
|
6051
|
+
try {
|
|
6052
|
+
const slots = ctx.slots;
|
|
6053
|
+
if (slots && typeof slots.inject === "function" && typeof slots.register === "function") {
|
|
6054
|
+
api = slots;
|
|
6055
|
+
}
|
|
6056
|
+
} catch {
|
|
6057
|
+
api = null;
|
|
6058
|
+
}
|
|
6059
|
+
const telemetry = {
|
|
6060
|
+
get count() {
|
|
6061
|
+
return registered;
|
|
6062
|
+
},
|
|
6063
|
+
skipped: null,
|
|
6064
|
+
error: null,
|
|
6065
|
+
registered: false
|
|
6066
|
+
};
|
|
6067
|
+
let registered = 0;
|
|
6068
|
+
try {
|
|
6069
|
+
if (typeof globalThis !== "undefined") {
|
|
6070
|
+
;
|
|
6071
|
+
globalThis.__RECENCY_GUARD_TOOLVIEW__ = telemetry;
|
|
6072
|
+
}
|
|
6073
|
+
} catch {
|
|
6074
|
+
}
|
|
6075
|
+
if (api === null) {
|
|
6076
|
+
telemetry.skipped = "slots-unavailable";
|
|
6077
|
+
return null;
|
|
6078
|
+
}
|
|
6079
|
+
injectCssOnce();
|
|
6080
|
+
const disposers = [];
|
|
6081
|
+
const slotsApi = api;
|
|
6082
|
+
const doRegister = () => {
|
|
6083
|
+
let taken = /* @__PURE__ */ new Set();
|
|
6084
|
+
try {
|
|
6085
|
+
const existing = slotsApi.entries?.("tool.call.toolview") ?? [];
|
|
6086
|
+
taken = new Set(existing.map((entry) => entry.key).filter((key) => typeof key === "string"));
|
|
6087
|
+
} catch {
|
|
6088
|
+
taken = /* @__PURE__ */ new Set();
|
|
6089
|
+
}
|
|
6090
|
+
if (taken.has(TOOLVIEW_TOOL_NAME)) {
|
|
6091
|
+
telemetry.registered = true;
|
|
6092
|
+
return;
|
|
6093
|
+
}
|
|
6094
|
+
try {
|
|
6095
|
+
const reg = slotsApi.register(
|
|
6096
|
+
{ name: "tool.call.toolview", key: TOOLVIEW_TOOL_NAME },
|
|
6097
|
+
(props) => (0, import_react11.createElement)(GuardToolCard, props ?? {})
|
|
6098
|
+
);
|
|
6099
|
+
if (typeof reg === "function") disposers.push(reg);
|
|
6100
|
+
registered += 1;
|
|
6101
|
+
telemetry.registered = true;
|
|
6102
|
+
telemetry.error = null;
|
|
6103
|
+
} catch (error) {
|
|
6104
|
+
telemetry.error = error instanceof Error ? error.message : String(error);
|
|
6105
|
+
}
|
|
6106
|
+
};
|
|
6107
|
+
try {
|
|
6108
|
+
const injectDisposer = slotsApi.inject("tool.call.toolview", () => {
|
|
6109
|
+
doRegister();
|
|
6110
|
+
});
|
|
6111
|
+
if (typeof injectDisposer === "function") disposers.push(injectDisposer);
|
|
6112
|
+
} catch (error) {
|
|
6113
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
6114
|
+
telemetry.skipped = message.includes("not declared") ? "slot-not-declared" : message;
|
|
6115
|
+
}
|
|
6116
|
+
const cleanups = disposers.filter((d) => typeof d === "function");
|
|
6117
|
+
return cleanups.length > 0 ? cleanups : null;
|
|
6118
|
+
}
|
|
6119
|
+
|
|
5452
6120
|
// src/client/styles.css
|
|
5453
|
-
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.18 \u6062\u590D\u6B8B\u4F59\uFF08unresolved\uFF09+ \u5931\u914D\u68C0\u6D4B\u8B66\u793A ---------- */\n\n/* \u6B8B\u4F59\u51B2\u7A81\u5757\uFF1Aalert \u8BED\u4E49\uFF08role=\"alert\"\uFF09\u4F46\u89C6\u89C9\u514B\u5236 \u2014\u2014 \u662F\u300C\u9700\u8981\u77E5\u9053\u300D\n \u4E0D\u662F\u300C\u707E\u96BE\u300D\uFF1B\u5217\u8868\u884C\u7528\u5FBD\u6807 + \u63D2\u4EF6\u5BF9 + \u4EBA\u8BFB\u4E8B\u5B9E\u4E09\u6BB5\u3002 */\n.rg-unresolved {\n margin: 0 0 8px;\n padding: 8px 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-2);\n}\n.rg-unresolved-title {\n margin: 0 0 6px;\n font-size: var(--dsw-font-xs-13, 13px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n}\n.rg-unresolved ul {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.rg-unresolved li {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n.rg-unresolved-bundle {\n font-family: var(--dsw-font-mono, monospace);\n font-size: 12px;\n}\n.rg-unresolved-detail {\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\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\n/* ---------- \u51B3\u7B56\u56E0\u5B50\u5361\uFF08v0.13 \u65B9\u5411\u2462\uFF09 ---------- */\n/* \u4E09\u56E0\u5B50\u52A0\u6743\u8D21\u732E\u7684\u53EF\u89C6\u5316\u5206\u89E3\uFF1A\u6761\u5F62\u957F\u5EA6 = \u8BE5\u56E0\u5B50\u8D21\u732E\uFF080~1\uFF09\uFF0C\n \u8BA9\u300C\u4E3A\u4EC0\u4E48\u662F\u5B83\u300D\u4ECE\u603B\u5206\u53D8\u6210\u4E00\u4E2A\u53EF\u8BFB\u7684\u6210\u56E0\u7ED3\u6784\u3002 */\n.rg-evidence-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.rg-evidence {\n padding: 8px 10px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-m, 8px);\n background: var(--dsw-alias-bg-layer-1, transparent);\n}\n/* \u5934\u53F7\u5ACC\u7591\u52A0\u5DE6\u4FA7\u5F3A\u8C03\u8FB9\uFF1A\u5B83\u662F\u300C\u8FD9\u4E00\u8F6E\u771F\u6B63\u4F1A\u88AB\u5173\u6389\u7684\u90A3\u4E2A\u300D\u3002 */\n.rg-evidence-head {\n border-left: 3px solid var(--dsw-alias-state-error-primary);\n}\n.rg-evidence-head-row {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.rg-evidence-bundle {\n font-weight: 600;\n word-break: break-all;\n}\n.rg-evidence-risk {\n margin-left: auto;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n}\n.rg-evidence-bars {\n display: flex;\n flex-direction: column;\n gap: 3px;\n margin-top: 6px;\n}\n.rg-evidence-bar-row {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n}\n.rg-evidence-bar-label {\n flex: none;\n width: 4.5em;\n color: var(--dsw-alias-label-tertiary);\n}\n.rg-evidence-bar-track {\n flex: 1 1 auto;\n height: 5px;\n border-radius: 3px;\n background: var(--dsw-alias-hairline);\n overflow: hidden;\n}\n.rg-evidence-bar {\n display: block;\n height: 100%;\n border-radius: 3px;\n transition: width 200ms ease;\n}\n.rg-evidence-bar-value {\n flex: none;\n width: 3.2em;\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n}\n.rg-evidence-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n margin-top: 6px;\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary);\n}\n/* \u4E09\u56E0\u5B50\u5404\u81EA\u7684\u8BED\u4E49\u8272\uFF1A\u65B0\u8FD1\u6027=\u4FE1\u606F\u3001\u5B9E\u9A8C\u6027=\u8B66\u544A\u3001\u5386\u53F2=\u9519\u8BEF\u3002 */\n.rg-tone-info {\n background: var(--dsw-alias-brand-primary);\n}\n.rg-tone-warn {\n background: var(--dsw-alias-state-warning-primary, var(--dsw-alias-brand-primary));\n}\n.rg-tone-error {\n background: var(--dsw-alias-state-error-primary);\n}\n@media (prefers-reduced-motion: reduce) {\n .rg-evidence-bar {\n transition: none;\n }\n}\n\n/* ---------- \u56FE\u8C31\u7ED3\u6784\u6D1E\u5BDF\u6761\uFF08v0.13\uFF09 ---------- */\n/* \u628A\u300C\u80FD\u753B\u300D\u5347\u7EA7\u4E3A\u300C\u80FD\u8BFB\u7ED3\u6784\u300D\uFF1A\u4E00\u6761\u6A2A\u5411\u4E8B\u5B9E\u6761\uFF0C\u6BCF\u4E2A chip \u53EF\u70B9\u5373\u5B9A\u4F4D\u3002\n \u8272\u5757\u4E4B\u5916\u8FD8\u6709\u4E00\u6BB5\u53EF\u8BFB\u53E5\u5B50\uFF08rg-struct-detail\uFF09\uFF0C\u4FDD\u8BC1\u7070\u5EA6/\u8272\u76F2\u4E0B\u4FE1\u606F\u4E0D\u4E22\u3002 */\n.rg-graph-structure {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n margin-bottom: 8px;\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-m, 8px);\n background: var(--dsw-alias-bg-layer-1, transparent);\n font-size: 11px;\n}\n.rg-struct-heading {\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n.rg-struct-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l1);\n background: var(--dsw-alias-bg-base);\n}\n.rg-struct-label {\n color: var(--dsw-alias-label-secondary);\n}\n.rg-struct-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n.rg-struct-node {\n max-width: 12em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.rg-struct-more,\n.rg-struct-summary,\n.rg-struct-detail {\n color: var(--dsw-alias-label-tertiary);\n}\n.rg-struct-detail {\n flex-basis: 100%;\n font-size: 10px;\n line-height: 1.5;\n}\n/* chip \u7684\u8BED\u4E49\u5E95\u8272\uFF08\u7528\u6781\u4F4E\u4E0D\u900F\u660E\u5EA6\uFF0C\u907F\u514D\u62A2\u8D70\u8282\u70B9\u4E3B\u8272\uFF09\u3002 */\n.rg-tone-bg-info {\n border-color: var(--dsw-alias-brand-primary);\n}\n.rg-tone-bg-warn {\n border-color: var(--dsw-alias-state-warning-primary, var(--dsw-alias-brand-primary));\n}\n.rg-tone-bg-error {\n border-color: var(--dsw-alias-state-error-primary);\n}\n.rg-tone-bg-neutral {\n opacity: 0.75;\n}\n\n/* ---------- \u5171\u73B0\u9A8C\u8BC1\u5361\uFF08v0.13 \u65B9\u5411\u2463\uFF09 ---------- */\n/* \u53EA\u62A5\u300C\u80FD\u5426\u52A0\u6743\u300D\uFF0C\u4E0D\u62A5\u52A0\u6743\u503C\uFF1A\u52A0\u6743\u9700\u8981\u989D\u5916\u7684\u4E25\u683C\u5316\u8BBA\u8BC1\u3002\n \u4E0D\u53EF\u5224\u5B9A\u663E\u793A\u6587\u5B57\u800C\u4E0D\u662F 0%\uFF0C\u907F\u514D\u88AB\u8BFB\u6210\u300C\u8FD9\u7C7B\u5D29\u6E83\u4ECE\u4E0D\u5173\u63D2\u4EF6\u300D\u3002 */\n.rg-note {\n margin: 6px 0 0;\n font-size: 11px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n}\n.rg-note-ok {\n color: var(--dsw-alias-brand-primary);\n}\n.rg-note-muted {\n color: var(--dsw-alias-label-tertiary);\n}\n";
|
|
6121
|
+
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.18 \u6062\u590D\u6B8B\u4F59\uFF08unresolved\uFF09+ \u5931\u914D\u68C0\u6D4B\u8B66\u793A ---------- */\n\n/* \u6B8B\u4F59\u51B2\u7A81\u5757\uFF1Aalert \u8BED\u4E49\uFF08role=\"alert\"\uFF09\u4F46\u89C6\u89C9\u514B\u5236 \u2014\u2014 \u662F\u300C\u9700\u8981\u77E5\u9053\u300D\n \u4E0D\u662F\u300C\u707E\u96BE\u300D\uFF1B\u5217\u8868\u884C\u7528\u5FBD\u6807 + \u63D2\u4EF6\u5BF9 + \u4EBA\u8BFB\u4E8B\u5B9E\u4E09\u6BB5\u3002 */\n.rg-unresolved {\n margin: 0 0 8px;\n padding: 8px 12px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm, 8px);\n background: var(--dsw-alias-bg-layer-2);\n}\n.rg-unresolved-title {\n margin: 0 0 6px;\n font-size: var(--dsw-font-xs-13, 13px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n}\n.rg-unresolved ul {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.rg-unresolved li {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n.rg-unresolved-bundle {\n font-family: var(--dsw-font-mono, monospace);\n font-size: 12px;\n}\n.rg-unresolved-detail {\n color: var(--dsw-alias-label-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ---------- v0.18 T16-14\uFF1A\u6267\u884C\u64CD\u4F5C\u8BB0\u5F55\uFF08\u6B65\u9AA4\u5217\u8868\uFF09 ---------- */\n\n/* \u4E0E\u8FC1\u79FB\u5217\u8868\u540C\u65CF\u7684\u89C6\u89C9\uFF1A\u65F6\u95F4\u987A\u5E8F\u3001\u5FBD\u6807\u72B6\u6001\u3001\u8017\u65F6\u3001\u6458\u8981\u3002\n \u5FBD\u6807\u7528\u65E2\u6709 tone \u4F53\u7CFB\uFF08success/error/warn\uFF09\uFF0C\u4E0D\u5F15\u5165\u65B0\u8272\u677F \u2014\u2014\n \u8272\u677F\u81A8\u80C0\u4F1A\u8BA9\u300C\u72B6\u6001\u300D\u5931\u53BB\u533A\u5206\u5EA6\u3002 */\n.rg-steps {\n margin: 0 0 8px;\n padding: 8px 12px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm, 8px);\n background: transparent;\n}\n.rg-steps-title {\n margin: 0 0 6px;\n font-size: var(--dsw-font-xs-13, 13px);\n font-weight: var(--dsw-font-s-strong-14, 600);\n color: var(--dsw-alias-label-tertiary);\n}\n.rg-steps-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n.rg-step-row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n font-size: var(--dsw-font-xs-13, 13px);\n}\n.rg-step-name {\n font-family: var(--dsw-font-mono, monospace);\n font-size: 12px;\n min-width: 88px;\n}\n.rg-step-duration {\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n.rg-step-summary {\n color: var(--dsw-alias-label-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1 1 auto;\n}\n.rg-step-time {\n color: var(--dsw-alias-label-tertiary);\n font-size: 11px;\n}\n.rg-step-running .rg-step-name {\n /* \u6267\u884C\u4E2D\uFF1A\u6B65\u9AA4\u540D\u7528\u5F3A\u8C03\u8272\uFF0C\u8BA9\u7528\u6237\u4E00\u773C\u770B\u5230\u300C\u8FD8\u5728\u8DD1\u300D */\n font-weight: var(--dsw-font-s-strong-14, 600);\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\n/* ---------- \u51B3\u7B56\u56E0\u5B50\u5361\uFF08v0.13 \u65B9\u5411\u2462\uFF09 ---------- */\n/* \u4E09\u56E0\u5B50\u52A0\u6743\u8D21\u732E\u7684\u53EF\u89C6\u5316\u5206\u89E3\uFF1A\u6761\u5F62\u957F\u5EA6 = \u8BE5\u56E0\u5B50\u8D21\u732E\uFF080~1\uFF09\uFF0C\n \u8BA9\u300C\u4E3A\u4EC0\u4E48\u662F\u5B83\u300D\u4ECE\u603B\u5206\u53D8\u6210\u4E00\u4E2A\u53EF\u8BFB\u7684\u6210\u56E0\u7ED3\u6784\u3002 */\n.rg-evidence-list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.rg-evidence {\n padding: 8px 10px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-m, 8px);\n background: var(--dsw-alias-bg-layer-1, transparent);\n}\n/* \u5934\u53F7\u5ACC\u7591\u52A0\u5DE6\u4FA7\u5F3A\u8C03\u8FB9\uFF1A\u5B83\u662F\u300C\u8FD9\u4E00\u8F6E\u771F\u6B63\u4F1A\u88AB\u5173\u6389\u7684\u90A3\u4E2A\u300D\u3002 */\n.rg-evidence-head {\n border-left: 3px solid var(--dsw-alias-state-error-primary);\n}\n.rg-evidence-head-row {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.rg-evidence-bundle {\n font-weight: 600;\n word-break: break-all;\n}\n.rg-evidence-risk {\n margin-left: auto;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n}\n.rg-evidence-bars {\n display: flex;\n flex-direction: column;\n gap: 3px;\n margin-top: 6px;\n}\n.rg-evidence-bar-row {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n}\n.rg-evidence-bar-label {\n flex: none;\n width: 4.5em;\n color: var(--dsw-alias-label-tertiary);\n}\n.rg-evidence-bar-track {\n flex: 1 1 auto;\n height: 5px;\n border-radius: 3px;\n background: var(--dsw-alias-hairline);\n overflow: hidden;\n}\n.rg-evidence-bar {\n display: block;\n height: 100%;\n border-radius: 3px;\n transition: width 200ms ease;\n}\n.rg-evidence-bar-value {\n flex: none;\n width: 3.2em;\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-secondary);\n}\n.rg-evidence-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n margin-top: 6px;\n font-size: 11px;\n color: var(--dsw-alias-label-tertiary);\n}\n/* \u4E09\u56E0\u5B50\u5404\u81EA\u7684\u8BED\u4E49\u8272\uFF1A\u65B0\u8FD1\u6027=\u4FE1\u606F\u3001\u5B9E\u9A8C\u6027=\u8B66\u544A\u3001\u5386\u53F2=\u9519\u8BEF\u3002 */\n.rg-tone-info {\n background: var(--dsw-alias-brand-primary);\n}\n.rg-tone-warn {\n background: var(--dsw-alias-state-warning-primary, var(--dsw-alias-brand-primary));\n}\n.rg-tone-error {\n background: var(--dsw-alias-state-error-primary);\n}\n@media (prefers-reduced-motion: reduce) {\n .rg-evidence-bar {\n transition: none;\n }\n}\n\n/* ---------- \u56FE\u8C31\u7ED3\u6784\u6D1E\u5BDF\u6761\uFF08v0.13\uFF09 ---------- */\n/* \u628A\u300C\u80FD\u753B\u300D\u5347\u7EA7\u4E3A\u300C\u80FD\u8BFB\u7ED3\u6784\u300D\uFF1A\u4E00\u6761\u6A2A\u5411\u4E8B\u5B9E\u6761\uFF0C\u6BCF\u4E2A chip \u53EF\u70B9\u5373\u5B9A\u4F4D\u3002\n \u8272\u5757\u4E4B\u5916\u8FD8\u6709\u4E00\u6BB5\u53EF\u8BFB\u53E5\u5B50\uFF08rg-struct-detail\uFF09\uFF0C\u4FDD\u8BC1\u7070\u5EA6/\u8272\u76F2\u4E0B\u4FE1\u606F\u4E0D\u4E22\u3002 */\n.rg-graph-structure {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n margin-bottom: 8px;\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-m, 8px);\n background: var(--dsw-alias-bg-layer-1, transparent);\n font-size: 11px;\n}\n.rg-struct-heading {\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n.rg-struct-chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid var(--dsw-alias-border-l1);\n background: var(--dsw-alias-bg-base);\n}\n.rg-struct-label {\n color: var(--dsw-alias-label-secondary);\n}\n.rg-struct-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n.rg-struct-node {\n max-width: 12em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.rg-struct-more,\n.rg-struct-summary,\n.rg-struct-detail {\n color: var(--dsw-alias-label-tertiary);\n}\n.rg-struct-detail {\n flex-basis: 100%;\n font-size: 10px;\n line-height: 1.5;\n}\n/* chip \u7684\u8BED\u4E49\u5E95\u8272\uFF08\u7528\u6781\u4F4E\u4E0D\u900F\u660E\u5EA6\uFF0C\u907F\u514D\u62A2\u8D70\u8282\u70B9\u4E3B\u8272\uFF09\u3002 */\n.rg-tone-bg-info {\n border-color: var(--dsw-alias-brand-primary);\n}\n.rg-tone-bg-warn {\n border-color: var(--dsw-alias-state-warning-primary, var(--dsw-alias-brand-primary));\n}\n.rg-tone-bg-error {\n border-color: var(--dsw-alias-state-error-primary);\n}\n.rg-tone-bg-neutral {\n opacity: 0.75;\n}\n\n/* ---------- \u5171\u73B0\u9A8C\u8BC1\u5361\uFF08v0.13 \u65B9\u5411\u2463\uFF09 ---------- */\n/* \u53EA\u62A5\u300C\u80FD\u5426\u52A0\u6743\u300D\uFF0C\u4E0D\u62A5\u52A0\u6743\u503C\uFF1A\u52A0\u6743\u9700\u8981\u989D\u5916\u7684\u4E25\u683C\u5316\u8BBA\u8BC1\u3002\n \u4E0D\u53EF\u5224\u5B9A\u663E\u793A\u6587\u5B57\u800C\u4E0D\u662F 0%\uFF0C\u907F\u514D\u88AB\u8BFB\u6210\u300C\u8FD9\u7C7B\u5D29\u6E83\u4ECE\u4E0D\u5173\u63D2\u4EF6\u300D\u3002 */\n.rg-note {\n margin: 6px 0 0;\n font-size: 11px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n}\n.rg-note-ok {\n color: var(--dsw-alias-brand-primary);\n}\n.rg-note-muted {\n color: var(--dsw-alias-label-tertiary);\n}\n";
|
|
5454
6122
|
|
|
5455
6123
|
// src/client/styles.ts
|
|
5456
6124
|
var STYLE_ELEMENT_ID = "dsh-recency-guard-styles";
|
|
@@ -5785,6 +6453,7 @@ var inject = ["slots", "locale"];
|
|
|
5785
6453
|
function apply(ctx) {
|
|
5786
6454
|
installStyles(ctx);
|
|
5787
6455
|
integratePanel(ctx);
|
|
6456
|
+
integrateToolView(ctx);
|
|
5788
6457
|
try {
|
|
5789
6458
|
;
|
|
5790
6459
|
ctx.effect?.(() => {
|