@dsh-workbench/core 0.3.10 → 0.3.11
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 +19 -7
- package/bin/dsh-workbench +2 -2
- package/client.js +1648 -973
- package/cordis.patch.yml +60 -35
- package/dist/client/client.body.js +1648 -973
- package/dist/client/index.js +1333 -658
- package/dist/host/index.js +2896 -2334
- package/dist/types/app/client.d.ts +2 -1
- package/dist/types/app/layouts/env-gate/boot-gate.d.ts +1 -1
- package/dist/types/app/layouts/market/use-module-versions.d.ts +13 -2
- package/dist/types/app/layouts/rightbar/MarketView.d.ts +6 -3
- package/dist/types/app/layouts/rightbar/market-act.d.ts +6 -3
- package/dist/types/app/layouts/rightbar/market-settle-hold.d.ts +2 -0
- package/dist/types/app/layouts/rightbar/market-settle.d.ts +20 -0
- package/dist/types/app/layouts/rightbar/market-update-verdict.d.ts +41 -0
- package/dist/types/app/layouts/rightbar/market-view-text.d.ts +4 -1
- package/dist/types/app/layouts/rightbar/store.d.ts +14 -0
- package/dist/types/app/layouts/sidebar/LongTaskDot.d.ts +12 -0
- package/dist/types/app/layouts/sidebar/LongTaskHover.d.ts +12 -0
- package/dist/types/app/layouts/sidebar/edition-boot.d.ts +24 -0
- package/dist/types/app/layouts/sidebar/edition.d.ts +22 -0
- package/dist/types/app/layouts/workbench-settings/ConfigSyncItem.d.ts +5 -0
- package/dist/types/app/layouts/workbench-settings/SettingsItem.d.ts +17 -0
- package/dist/types/app/layouts/workbench-settings/SidebarEditionItem.d.ts +11 -0
- package/dist/types/app/layouts/workbench-settings/WorkbenchSettingsSection.d.ts +11 -0
- package/dist/types/modules/panels/model/approval.d.ts +12 -4
- package/dist/types/modules/panels/model/diy-browser-tools.d.ts +1 -1
- package/dist/types/modules/panels/model/diy-context.d.ts +31 -14
- package/dist/types/modules/panels/model/diy-page.d.ts +3 -2
- package/dist/types/modules/panels/model/diy-record.d.ts +3 -3
- package/dist/types/modules/panels/model/diy-report.d.ts +6 -7
- package/dist/types/modules/panels/model/market-dependency-update.d.ts +21 -0
- package/dist/types/modules/panels/model/market-dispatch.d.ts +1 -0
- package/dist/types/modules/panels/model/market-types.d.ts +1 -0
- package/dist/types/modules/panels/model/market-update-bundle.d.ts +25 -0
- package/dist/types/modules/panels/model/market-verify.d.ts +31 -0
- package/dist/types/modules/panels/unit.d.ts +3 -4
- package/dist/types/shared/api/bundle-install.d.ts +13 -0
- package/dist/types/shared/api/host/approval-gate.d.ts +39 -0
- package/dist/types/shared/api/host/bundle-routes.d.ts +2 -1
- package/dist/types/shared/api/host/diy-artifacts.d.ts +14 -0
- package/dist/types/shared/api/host/diy-modules.d.ts +41 -0
- package/dist/types/shared/api/host/host-routes.d.ts +13 -0
- package/dist/types/shared/api/host/permission-mode.d.ts +9 -0
- package/dist/types/shared/api/host/runtime-seed.d.ts +2 -0
- package/dist/types/shared/api/host/self-update.d.ts +9 -2
- package/dist/types/shared/api/host/sidebar-edition.d.ts +46 -0
- package/dist/types/shared/api/host/workspace-root.d.ts +13 -0
- package/dist/types/shared/api/sidebar-edition.d.ts +14 -0
- package/dist/types/shared/api/unit-board.d.ts +20 -0
- package/dist/types/shared/api/write-outcome.d.ts +15 -0
- package/dist/types/shared/components/IconModules.d.ts +8 -0
- package/dist/types/shared/components/blocker-action.d.ts +16 -0
- package/dist/types/shared/hooks/sidebar-edition.d.ts +7 -0
- package/dist/types/shared/hooks/use-capabilities.d.ts +5 -0
- package/dist/types/shared/hooks/use-capability-gate.d.ts +1 -2
- package/dist/types/shared/hooks/use-host-write.d.ts +1 -1
- package/dist/types/shared/hooks/use-unit-board.d.ts +1 -1
- package/docs/HANDOFF.md +3 -3
- package/docs/OPERATIONS.md +16 -5
- package/package.json +3 -3
- package/preset/diy.patch.yml +2 -2
- package/profile/isolation.patch.yml +11 -0
- package/skills/workbench-module-diy/BUILD.md +62 -131
- package/skills/workbench-module-diy/COPY.md +89 -0
- package/skills/workbench-module-diy/DATASOURCE.md +84 -112
- package/skills/workbench-module-diy/DESIGN.md +75 -109
- package/skills/workbench-module-diy/FAMILY.md +70 -54
- package/skills/workbench-module-diy/KIT.md +77 -133
- package/skills/workbench-module-diy/LINKAGE.md +66 -105
- package/skills/workbench-module-diy/PANEL.md +79 -171
- package/skills/workbench-module-diy/REVIEW.md +67 -81
- package/skills/workbench-module-diy/SKILL.md +57 -96
- package/skills/workbench-module-diy/STEPS.md +66 -69
- package/skills/workbench-module-diy/TOOLING.md +34 -51
- package/skills/workbench-module-diy/TOOLS.md +110 -103
- package/skills/workbench-module-diy/WIRING.md +51 -83
- package/skills/workbench-module-diy/WRITES.md +89 -142
- package/dist/types/app/layouts/config-sync/ConfigSyncSection.d.ts +0 -5
- package/dist/types/shared/api/host/diy-workshop.d.ts +0 -23
- package/dist/types/shared/api/host/workshop-root.d.ts +0 -16
- /package/dist/types/shared/{api/host/diy-workshop.test.d.ts → components/blocker-action.test.d.ts} +0 -0
package/dist/client/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Button, Checkbox, CodeBlock, DiffBlock, DisclosureRow, HoverCard, IconCheckCircleFillRegular, IconCheckOutlineRegular, IconChevronDownOutlineRegular, IconCodeOutlineRegular, IconCordisPluginOutlineRegular, IconDownloadOutlineRegular, IconEditOutlineRegular, IconEllipsisOutlineRegular, IconFlatListOutlineRegular, IconFolderCloseRegular, IconFolderOpenRegular, IconInfoOutlineRegular, IconLinkOutlineRegular, IconNewChatOutlineRegular, IconPanelLeftOutlineRegular, IconPauseOutlineRegular, IconPinFillRegular, IconPlayOutlineRegular, IconPlusOutlineRegular, IconRefreshOutlineRegular, IconRightUpOutlineRegular, IconSearchOutlineRegular, IconSettingsOutlineRegular, IconStopFillRegular, IconTrashOutlineRegular, IconWarningOutlineRegular, Menu, Modal, RiskConfirmation, StateDot, Switch, Tag, TextShimmer, Tooltip, useAnchoredPosition, useDismissOnOutsidePointer, writeClipboard } from "@deepseek-ai/dsh-client-ui-primitives";
|
|
2
|
+
import { Fragment, createElement, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
2
3
|
//#region \0rolldown/runtime.js
|
|
3
4
|
var __defProp = Object.defineProperty;
|
|
4
5
|
var __exportAll = (all, no_symbols) => {
|
|
@@ -459,47 +460,6 @@ function factOfRoute(route) {
|
|
|
459
460
|
return route;
|
|
460
461
|
}
|
|
461
462
|
//#endregion
|
|
462
|
-
//#region ../shared/dist/api/host-write.js
|
|
463
|
-
/**
|
|
464
|
-
* 由通道与资源拼出写路由。
|
|
465
|
-
* @param channel 写通道。
|
|
466
|
-
* @param resource 该通道下的资源名。
|
|
467
|
-
* @returns 路由字符串;provision 只有一段,其余是 channel/resource。
|
|
468
|
-
*/
|
|
469
|
-
function writeRoute(channel, resource) {
|
|
470
|
-
if (channel === "provision") return "provision";
|
|
471
|
-
return `${channel}/${resource}`;
|
|
472
|
-
}
|
|
473
|
-
/**
|
|
474
|
-
* 把写通道的响应翻成 WriteOutcome。
|
|
475
|
-
* @param response 写口回的响应;null 表示请求本身没成(网络断了,宿主没答)。
|
|
476
|
-
* @param networkText 拿不到任何服务端文案时兜底的那句。
|
|
477
|
-
* @returns 失败时 message 优先用服务端自己的话,没有才用响应正文或 networkText。
|
|
478
|
-
*/
|
|
479
|
-
function writeOutcomeOf(response, networkText) {
|
|
480
|
-
if (response === null) return {
|
|
481
|
-
ok: false,
|
|
482
|
-
message: networkText
|
|
483
|
-
};
|
|
484
|
-
if (!response.ok) {
|
|
485
|
-
const box = response;
|
|
486
|
-
const own = typeof box.error?.message === "string" && box.error.message !== "" ? box.error.message : void 0;
|
|
487
|
-
const fallback = typeof box.text === "string" && box.text !== "" ? box.text : networkText;
|
|
488
|
-
const detail = typeof box.error?.detail === "string" ? box.error.detail : void 0;
|
|
489
|
-
const helpUrl = typeof box.error?.helpUrl === "string" && box.error.helpUrl !== "" ? box.error.helpUrl : void 0;
|
|
490
|
-
return {
|
|
491
|
-
ok: false,
|
|
492
|
-
message: own ?? fallback,
|
|
493
|
-
...detail === void 0 ? {} : { detail },
|
|
494
|
-
...helpUrl === void 0 ? {} : { helpUrl }
|
|
495
|
-
};
|
|
496
|
-
}
|
|
497
|
-
return {
|
|
498
|
-
ok: true,
|
|
499
|
-
value: response
|
|
500
|
-
};
|
|
501
|
-
}
|
|
502
|
-
//#endregion
|
|
503
463
|
//#region ../shared/dist/api/long-task.js
|
|
504
464
|
/**
|
|
505
465
|
* 单元的长任务读口路由。
|
|
@@ -587,49 +547,6 @@ function longTaskStopPress(stage) {
|
|
|
587
547
|
*/
|
|
588
548
|
var LONG_TASK_STOP_ARM_MS = 3e3;
|
|
589
549
|
//#endregion
|
|
590
|
-
//#region ../shared/dist/api/unit-board.js
|
|
591
|
-
/**
|
|
592
|
-
* 判这张卡现在能不能画。
|
|
593
|
-
* @param capability 环境读数;还没读到给 null。
|
|
594
|
-
* @param mode 闸档。
|
|
595
|
-
* @returns mode 为 none 或读数还没到都放行(先放行让它读);读到明确不通过(ok 与 unchecked 之外)才拦。
|
|
596
|
-
*/
|
|
597
|
-
function gateOf(capability, mode) {
|
|
598
|
-
if (mode === "none") return { gated: true };
|
|
599
|
-
if (capability === null) return { gated: true };
|
|
600
|
-
return { gated: capability.status === "ok" || capability.status === "unchecked" };
|
|
601
|
-
}
|
|
602
|
-
/**
|
|
603
|
-
* 把候选卡住态分档,每档只留第一个。
|
|
604
|
-
* @param candidates 候选(可能含 undefined),按优先级从高到低给。
|
|
605
|
-
* @returns 分出的 blocker 与 notice;已经有 blocker 时不带 notice(挡住就不必再提示)。
|
|
606
|
-
*/
|
|
607
|
-
function splitBlocker(candidates) {
|
|
608
|
-
let blocker;
|
|
609
|
-
let notice;
|
|
610
|
-
for (const candidate of candidates) {
|
|
611
|
-
if (candidate === void 0) continue;
|
|
612
|
-
if (candidate.severity === "block") {
|
|
613
|
-
blocker ??= candidate;
|
|
614
|
-
continue;
|
|
615
|
-
}
|
|
616
|
-
notice ??= candidate;
|
|
617
|
-
}
|
|
618
|
-
return {
|
|
619
|
-
...blocker === void 0 ? {} : { blocker },
|
|
620
|
-
...blocker !== void 0 || notice === void 0 ? {} : { notice }
|
|
621
|
-
};
|
|
622
|
-
}
|
|
623
|
-
/**
|
|
624
|
-
* 由读口错误算出「出错搭车强探」的防抖键:同一个键只自动重探一次。
|
|
625
|
-
* @param error 读口错误;undefined 表示这次没有错误。
|
|
626
|
-
* @returns 键字符串;空 code 归一到 unknown。
|
|
627
|
-
*/
|
|
628
|
-
function probeKeyOf(error) {
|
|
629
|
-
if (error === void 0) return null;
|
|
630
|
-
return error.code === "" ? "unknown" : error.code;
|
|
631
|
-
}
|
|
632
|
-
//#endregion
|
|
633
550
|
//#region ../shared/dist/api/unit.js
|
|
634
551
|
/**
|
|
635
552
|
* 判这个模块要不要往外装东西。
|
|
@@ -727,43 +644,34 @@ var react = __require("react");
|
|
|
727
644
|
*/
|
|
728
645
|
var h = react.createElement;
|
|
729
646
|
/**
|
|
730
|
-
* React 的 `Fragment` 原样再导出 ——
|
|
647
|
+
* React 的 `Fragment` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
731
648
|
*/
|
|
732
|
-
var Fragment = react.Fragment;
|
|
649
|
+
var Fragment$1 = react.Fragment;
|
|
733
650
|
/**
|
|
734
|
-
* React 的 `Component` 原样再导出 ——
|
|
651
|
+
* React 的 `Component` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
735
652
|
*/
|
|
736
653
|
var Component = react.Component;
|
|
737
654
|
react.createContext;
|
|
738
655
|
react.useContext;
|
|
739
656
|
/**
|
|
740
|
-
* React 的 `useState` 原样再导出 ——
|
|
657
|
+
* React 的 `useState` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
741
658
|
*/
|
|
742
|
-
var useState = react.useState;
|
|
659
|
+
var useState$1 = react.useState;
|
|
743
660
|
/**
|
|
744
|
-
* React 的 `useEffect` 原样再导出 ——
|
|
661
|
+
* React 的 `useEffect` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
745
662
|
*/
|
|
746
|
-
var useEffect = react.useEffect;
|
|
663
|
+
var useEffect$1 = react.useEffect;
|
|
664
|
+
react.useLayoutEffect;
|
|
747
665
|
/**
|
|
748
|
-
* React 的 `
|
|
666
|
+
* React 的 `useMemo` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
749
667
|
*/
|
|
750
|
-
var
|
|
668
|
+
var useMemo$1 = react.useMemo;
|
|
669
|
+
react.useCallback;
|
|
751
670
|
/**
|
|
752
|
-
* React 的 `
|
|
671
|
+
* React 的 `useRef` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
753
672
|
*/
|
|
754
|
-
var
|
|
755
|
-
|
|
756
|
-
* React 的 `useCallback` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
757
|
-
*/
|
|
758
|
-
var useCallback = react.useCallback;
|
|
759
|
-
/**
|
|
760
|
-
* React 的 `useRef` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
761
|
-
*/
|
|
762
|
-
var useRef = react.useRef;
|
|
763
|
-
/**
|
|
764
|
-
* React 的 `useSyncExternalStore` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
765
|
-
*/
|
|
766
|
-
var useSyncExternalStore = react.useSyncExternalStore;
|
|
673
|
+
var useRef$1 = react.useRef;
|
|
674
|
+
react.useSyncExternalStore;
|
|
767
675
|
//#endregion
|
|
768
676
|
//#region ../shared/dist/components/Activity.js
|
|
769
677
|
/**
|
|
@@ -944,7 +852,7 @@ function ApprovalDetail(props) {
|
|
|
944
852
|
}));
|
|
945
853
|
}
|
|
946
854
|
const shell = props.renderShell?.(input, t);
|
|
947
|
-
if (shell !== void 0 && shell !== null) return h(Fragment, null, shell);
|
|
855
|
+
if (shell !== void 0 && shell !== null) return h(Fragment$1, null, shell);
|
|
948
856
|
if (command === "") return null;
|
|
949
857
|
return h(CodeBlock, {
|
|
950
858
|
code: command,
|
|
@@ -1100,7 +1008,7 @@ function ChoiceMenu(input) {
|
|
|
1100
1008
|
role: "status"
|
|
1101
1009
|
}, h(Spinner, { size: 14 }), h("span", { className: "wb-choiceLoadingText" }, input.loadingText ?? "…")) : input.options.length === 0 ? input.emptyText === void 0 ? null : h("span", { className: "wb-choiceEmpty" }, input.emptyText) : input.options.map((option) => {
|
|
1102
1010
|
const row = input.rowOf(option.value);
|
|
1103
|
-
return h(Fragment, { key: option.value }, h("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h("input", {
|
|
1011
|
+
return h(Fragment$1, { key: option.value }, h("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h("input", {
|
|
1104
1012
|
className: input.multi ? "wb-checkbox" : "wb-radio",
|
|
1105
1013
|
type: input.multi ? "checkbox" : "radio",
|
|
1106
1014
|
name: input.name,
|
|
@@ -1537,13 +1445,13 @@ function revealFirstProblem(root) {
|
|
|
1537
1445
|
*/
|
|
1538
1446
|
function Form(props) {
|
|
1539
1447
|
const { fields, onSubmit, submit, cancel, extra, busy = false, disabled = false, problem } = props;
|
|
1540
|
-
const [done, setDone] = useState(false);
|
|
1541
|
-
const [reveal, setReveal] = useState(0);
|
|
1542
|
-
const rootRef = useRef(null);
|
|
1448
|
+
const [done, setDone] = useState$1(false);
|
|
1449
|
+
const [reveal, setReveal] = useState$1(0);
|
|
1450
|
+
const rootRef = useRef$1(null);
|
|
1543
1451
|
const shown = visibleFieldsOf(fields);
|
|
1544
1452
|
const problems = formProblemsOf(shown, done);
|
|
1545
1453
|
reportDuplicateKeys(shown);
|
|
1546
|
-
useEffect(() => {
|
|
1454
|
+
useEffect$1(() => {
|
|
1547
1455
|
if (reveal === 0) return;
|
|
1548
1456
|
const root = rootRef.current;
|
|
1549
1457
|
if (root !== null) revealFirstProblem(root);
|
|
@@ -1628,9 +1536,9 @@ function RowLink({ href, text }) {
|
|
|
1628
1536
|
* @returns 一行长任务。
|
|
1629
1537
|
*/
|
|
1630
1538
|
function LongTaskRow(props) {
|
|
1631
|
-
const [stepsOpen, setStepsOpen] = useState(false);
|
|
1632
|
-
const [rawOpen, setRawOpen] = useState(false);
|
|
1633
|
-
const [armed, setArmed] = useState(false);
|
|
1539
|
+
const [stepsOpen, setStepsOpen] = useState$1(false);
|
|
1540
|
+
const [rawOpen, setRawOpen] = useState$1(false);
|
|
1541
|
+
const [armed, setArmed] = useState$1(false);
|
|
1634
1542
|
const failed = props.status === "failed";
|
|
1635
1543
|
const problem = props.problem ?? "";
|
|
1636
1544
|
const raw = (props.raw ?? "").trim();
|
|
@@ -1638,7 +1546,7 @@ function LongTaskRow(props) {
|
|
|
1638
1546
|
const stop = props.stop;
|
|
1639
1547
|
const busy = stop?.busy === true;
|
|
1640
1548
|
const stopWhy = stop?.failed ?? "";
|
|
1641
|
-
useEffect(() => {
|
|
1549
|
+
useEffect$1(() => {
|
|
1642
1550
|
if (!armed) return void 0;
|
|
1643
1551
|
const timer = setTimeout(() => setArmed(false), LONG_TASK_STOP_ARM_MS);
|
|
1644
1552
|
return () => clearTimeout(timer);
|
|
@@ -1675,7 +1583,7 @@ function LongTaskRow(props) {
|
|
|
1675
1583
|
disabled: busy,
|
|
1676
1584
|
onClick: onStopPress,
|
|
1677
1585
|
onBlur: () => setArmed(false)
|
|
1678
|
-
}, h(IconStopFillRegular, { size: 12 }), armed ? h("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h(Fragment, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h(DisclosureRow, {
|
|
1586
|
+
}, h(IconStopFillRegular, { size: 12 }), armed ? h("span", { className: "wb-longTaskStopLabel" }, stop.askLabel) : null)), problem === "" ? null : h("p", { className: "wb-longTaskProblem" }, problem), stopWhy === "" ? null : h("p", { className: "wb-longTaskStopWhy" }, stopWhy), !failed ? null : h(Fragment$1, null, steps.length === 0 || props.stepsTitle === void 0 ? null : h(DisclosureRow, {
|
|
1679
1587
|
className: "wb-longTaskDump",
|
|
1680
1588
|
icon: h(IconFlatListOutlineRegular, { size: 14 }),
|
|
1681
1589
|
title: props.stepsTitle,
|
|
@@ -1812,7 +1720,7 @@ function selectTriggerNode(args) {
|
|
|
1812
1720
|
"aria-label": args.ariaLabel,
|
|
1813
1721
|
title: args.title,
|
|
1814
1722
|
onClick: args.onOpen
|
|
1815
|
-
}, args.iconOnly ? h("span", { className: "wb-selectIcon" }, args.icon) : h(Fragment, null, args.icon === void 0 ? null : h("span", { className: "wb-selectIcon" }, args.icon), h("span", { className: "wb-selectValue" }, args.value), h("span", { className: "wb-selectChevron" }, h(IconChevronDownOutlineRegular, { size: 14 }))));
|
|
1723
|
+
}, args.iconOnly ? h("span", { className: "wb-selectIcon" }, args.icon) : h(Fragment$1, null, args.icon === void 0 ? null : h("span", { className: "wb-selectIcon" }, args.icon), h("span", { className: "wb-selectValue" }, args.value), h("span", { className: "wb-selectChevron" }, h(IconChevronDownOutlineRegular, { size: 14 }))));
|
|
1816
1724
|
}
|
|
1817
1725
|
/**
|
|
1818
1726
|
* 名单还没读到时的触发器:禁用 + `aria-busy` 的按钮,`SelectField` 在 `loading` 那档画它。
|
|
@@ -1882,7 +1790,7 @@ function revealNode() {
|
|
|
1882
1790
|
return found instanceof HTMLElement ? found : null;
|
|
1883
1791
|
}
|
|
1884
1792
|
function useRevealOnOpen(open, revealId) {
|
|
1885
|
-
useEffect(() => {
|
|
1793
|
+
useEffect$1(() => {
|
|
1886
1794
|
if (!open || revealId === void 0) return;
|
|
1887
1795
|
revealNode()?.scrollIntoView({ block: "nearest" });
|
|
1888
1796
|
}, [open, revealId]);
|
|
@@ -1983,24 +1891,24 @@ function selectEntries(shown, emptyText, revealId) {
|
|
|
1983
1891
|
}
|
|
1984
1892
|
function useSelectState(props) {
|
|
1985
1893
|
const { options, filter = defaultSelectFilter, emptyText, open: openProp, onOpenChange } = props;
|
|
1986
|
-
const [openState, setOpenState] = useState(false);
|
|
1987
|
-
const [query, setQuery] = useState("");
|
|
1988
|
-
const [cursor, setCursor] = useState(null);
|
|
1989
|
-
const boxRef = useRef(null);
|
|
1990
|
-
const triggerRef = useRef(null);
|
|
1991
|
-
const wasOpenRef = useRef(false);
|
|
1992
|
-
const pickedRef = useRef(false);
|
|
1993
|
-
const closedByUsRef = useRef(false);
|
|
1894
|
+
const [openState, setOpenState] = useState$1(false);
|
|
1895
|
+
const [query, setQuery] = useState$1("");
|
|
1896
|
+
const [cursor, setCursor] = useState$1(null);
|
|
1897
|
+
const boxRef = useRef$1(null);
|
|
1898
|
+
const triggerRef = useRef$1(null);
|
|
1899
|
+
const wasOpenRef = useRef$1(false);
|
|
1900
|
+
const pickedRef = useRef$1(false);
|
|
1901
|
+
const closedByUsRef = useRef$1(false);
|
|
1994
1902
|
const open = openProp ?? openState;
|
|
1995
1903
|
const setOpen = (next) => {
|
|
1996
1904
|
if (openProp === void 0) setOpenState(next);
|
|
1997
1905
|
onOpenChange?.(next);
|
|
1998
1906
|
};
|
|
1999
|
-
useEffect(() => {
|
|
1907
|
+
useEffect$1(() => {
|
|
2000
1908
|
if (!open || props.search === false) return;
|
|
2001
1909
|
boxRef.current?.querySelector("input")?.focus();
|
|
2002
1910
|
}, [open, props.search]);
|
|
2003
|
-
useEffect(() => {
|
|
1911
|
+
useEffect$1(() => {
|
|
2004
1912
|
if (open) {
|
|
2005
1913
|
wasOpenRef.current = true;
|
|
2006
1914
|
return;
|
|
@@ -2014,7 +1922,7 @@ function useSelectState(props) {
|
|
|
2014
1922
|
if (!closedByUs || picked) return;
|
|
2015
1923
|
triggerRef.current?.focus();
|
|
2016
1924
|
}, [open]);
|
|
2017
|
-
const shown = useMemo(() => filterSelectOptions(options, query, filter), [
|
|
1925
|
+
const shown = useMemo$1(() => filterSelectOptions(options, query, filter), [
|
|
2018
1926
|
options,
|
|
2019
1927
|
query,
|
|
2020
1928
|
filter
|
|
@@ -2291,52 +2199,6 @@ function IconNpm({ size = 16 }) {
|
|
|
2291
2199
|
}));
|
|
2292
2200
|
}
|
|
2293
2201
|
/**
|
|
2294
|
-
* 四宫格:"模块"这个概念的通用单色图标(侧栏、面板那颗钮、市场节的标题);默认 16px。
|
|
2295
|
-
* @param props.size - 边长像素,同时给 `width` 与 `height`。
|
|
2296
|
-
* @returns 一枚 `aria-hidden` 的 svg。
|
|
2297
|
-
*/
|
|
2298
|
-
function IconModules({ size = 16 }) {
|
|
2299
|
-
return h("svg", {
|
|
2300
|
-
width: size,
|
|
2301
|
-
height: size,
|
|
2302
|
-
viewBox: "0 0 16 16",
|
|
2303
|
-
fill: "none",
|
|
2304
|
-
"aria-hidden": "true"
|
|
2305
|
-
}, h("rect", {
|
|
2306
|
-
x: "2.5",
|
|
2307
|
-
y: "2.5",
|
|
2308
|
-
width: "4.6",
|
|
2309
|
-
height: "4.6",
|
|
2310
|
-
rx: "1.2",
|
|
2311
|
-
stroke: "currentColor",
|
|
2312
|
-
strokeWidth: "1.2"
|
|
2313
|
-
}), h("rect", {
|
|
2314
|
-
x: "8.9",
|
|
2315
|
-
y: "2.5",
|
|
2316
|
-
width: "4.6",
|
|
2317
|
-
height: "4.6",
|
|
2318
|
-
rx: "1.2",
|
|
2319
|
-
stroke: "currentColor",
|
|
2320
|
-
strokeWidth: "1.2"
|
|
2321
|
-
}), h("rect", {
|
|
2322
|
-
x: "2.5",
|
|
2323
|
-
y: "8.9",
|
|
2324
|
-
width: "4.6",
|
|
2325
|
-
height: "4.6",
|
|
2326
|
-
rx: "1.2",
|
|
2327
|
-
stroke: "currentColor",
|
|
2328
|
-
strokeWidth: "1.2"
|
|
2329
|
-
}), h("rect", {
|
|
2330
|
-
x: "8.9",
|
|
2331
|
-
y: "8.9",
|
|
2332
|
-
width: "4.6",
|
|
2333
|
-
height: "4.6",
|
|
2334
|
-
rx: "1.2",
|
|
2335
|
-
stroke: "currentColor",
|
|
2336
|
-
strokeWidth: "1.2"
|
|
2337
|
-
}));
|
|
2338
|
-
}
|
|
2339
|
-
/**
|
|
2340
2202
|
* 模块类型标:渐变方块 + 白四宫格,用在"这是个模块"的行首;品牌物,颜色不跟主题走。默认 16px。
|
|
2341
2203
|
* @param props.size - 边长像素,同时给 `width` 与 `height`。
|
|
2342
2204
|
* @returns 一枚 `aria-hidden` 的 svg。
|
|
@@ -2433,16 +2295,6 @@ function writeText(key, value) {
|
|
|
2433
2295
|
else window.localStorage.setItem(key, value);
|
|
2434
2296
|
} catch {}
|
|
2435
2297
|
}
|
|
2436
|
-
/** 读一个布尔开关:键不存在时返回 `fallback`,只有存进去的 `'true'` 算真。 */
|
|
2437
|
-
function readFlag(key, fallback) {
|
|
2438
|
-
const raw = readText(key);
|
|
2439
|
-
if (raw === null) return fallback;
|
|
2440
|
-
return raw === "true";
|
|
2441
|
-
}
|
|
2442
|
-
/** 把一个布尔开关写进 localStorage(存 `'true'` / `'false'`);失败静默。 */
|
|
2443
|
-
function writeFlag(key, value) {
|
|
2444
|
-
writeText(key, value ? "true" : "false");
|
|
2445
|
-
}
|
|
2446
2298
|
//#endregion
|
|
2447
2299
|
//#region ../shared/dist/i18n/index.js
|
|
2448
2300
|
/** 外壳自带的两份词表(`zh` 为基准、`en` 同构):`client.tsx` 拿它当合并各套件词表的底座。 */
|
|
@@ -2535,7 +2387,7 @@ var dictionaries = {
|
|
|
2535
2387
|
"panels.buildModule": "造一个模块",
|
|
2536
2388
|
"panels.failed": "改配置失败了,再试一次。",
|
|
2537
2389
|
"panels.dragHint": "拖动调整顺序",
|
|
2538
|
-
"panels.unknownStep": "
|
|
2390
|
+
"panels.unknownStep": "这一块还没有面板",
|
|
2539
2391
|
"panels.labelWithHint": "{label}({hint})",
|
|
2540
2392
|
"panels.hintJoin": ";",
|
|
2541
2393
|
"panels.dep.failed": "⚠ 起不来",
|
|
@@ -2570,6 +2422,14 @@ var dictionaries = {
|
|
|
2570
2422
|
"panels.market.install": "安装",
|
|
2571
2423
|
"panels.market.update": "更新",
|
|
2572
2424
|
"panels.market.swapSlow": "还没换上:可能网慢或没装上。再点一次「更新」;一直这样就把 dsh 重启一遍。",
|
|
2425
|
+
"panels.market.updateNoChange": "没换成:点下去是 {from},跑完盘上还是这一版;源上最新是 {latest}。",
|
|
2426
|
+
"panels.market.updateUnknownVersion": "(问不到)",
|
|
2427
|
+
"panels.market.updateGone": "没换成:更新跑完盘上读不到这个模块。",
|
|
2428
|
+
"panels.market.updateRestored": "没换成:盘上已经读不到新版本,已把 {version} 装回去。",
|
|
2429
|
+
"panels.market.updateBehind": "装上了 {installed},但源上最新是 {latest} —— 没更到最新,可以再点一次。",
|
|
2430
|
+
"panels.market.selfUpdateFailed": "自更新没成:{reason}",
|
|
2431
|
+
"panels.market.selfUpdateUnknown": "外部进程没留下原因(看 ~/.dsh/workbench/self-update.log)",
|
|
2432
|
+
"panels.market.selfUpdateRolledBack": "没换成,已回滚到 {version}。",
|
|
2573
2433
|
"panels.market.uninstall": "卸载",
|
|
2574
2434
|
"panels.market.uninstallLabel": "卸载 {name}",
|
|
2575
2435
|
"panels.market.installing": "正在安装…",
|
|
@@ -2600,7 +2460,7 @@ var dictionaries = {
|
|
|
2600
2460
|
"panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
|
|
2601
2461
|
"panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
|
|
2602
2462
|
"panels.market.pluginKeptUnnamed": "文件先留着:看不出这是哪个插件,说不准谁在用它。",
|
|
2603
|
-
"panels.market.pluginBroken": "
|
|
2463
|
+
"panels.market.pluginBroken": "这份插件装坏了:认不出它是什么。可以先卸载,再让 agent 按包名重装一次。",
|
|
2604
2464
|
"panels.market.restartNeeded": "新版装好了,重启一次才生效。",
|
|
2605
2465
|
"panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
|
|
2606
2466
|
"panels.market.recheck": "重新检查更新",
|
|
@@ -2645,7 +2505,7 @@ var dictionaries = {
|
|
|
2645
2505
|
"panels.market.add.cancelledTitle": "已取消",
|
|
2646
2506
|
"panels.market.add.failureNetworkHost": "无法连接 {host}。Git 地址和 .tgz 直链不经过安装源,需要本机能直接访问它或配置代理;如果这个模块也发布到了 npm,请改填包名。",
|
|
2647
2507
|
"panels.market.add.problemInvalid": "无法识别这个包名或地址:{reason}",
|
|
2648
|
-
"panels.market.add.problemInstalled": "
|
|
2508
|
+
"panels.market.add.problemInstalled": "这个模块已经装过了(要换版本请带上 @版本)",
|
|
2649
2509
|
"panels.market.add.problemNotFound": "未找到相关模块",
|
|
2650
2510
|
"panels.market.add.problemNotPackage": "该路径不存在或不是有效的模块包",
|
|
2651
2511
|
"panels.market.add.problemNotBundle": "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 opencli 插件,两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。",
|
|
@@ -2666,7 +2526,7 @@ var dictionaries = {
|
|
|
2666
2526
|
"panels.market.add.failureIntegrity": "下载的安装包校验失败",
|
|
2667
2527
|
"panels.market.add.failureTimeout": "安装超时",
|
|
2668
2528
|
"panels.market.add.failurePnpmMissing": "没有找到 pnpm,无法安装",
|
|
2669
|
-
"panels.market.add.failureInstalled": "
|
|
2529
|
+
"panels.market.add.failureInstalled": "它已经装在这份工作台里了。同一个包不能就地覆盖,得先卸载再装;这次卸载也没成功。",
|
|
2670
2530
|
"panels.market.add.failureGeneric": "安装过程中出错,原因见安装详情",
|
|
2671
2531
|
"panels.market.add.approveTitle": "需要你允许安装脚本",
|
|
2672
2532
|
"panels.market.add.approveCaution": "只允许你信得过的包:安装脚本会以你的权限在这台机器上运行。",
|
|
@@ -2704,7 +2564,7 @@ var dictionaries = {
|
|
|
2704
2564
|
"panels.market.add.doneApplied": "装好了,已经生效。",
|
|
2705
2565
|
"panels.market.add.doneRestart": "装好了,重启一次才生效。",
|
|
2706
2566
|
"panels.market.add.restartWhy": "为什么这一版要重启:{reason}",
|
|
2707
|
-
"panels.market.add.restartWhy.no-hmr": "
|
|
2567
|
+
"panels.market.add.restartWhy.no-hmr": "这个配置只在启动时应用改动(没开热更新)",
|
|
2708
2568
|
"panels.market.add.restartWhy.package-moved": "某个已经装着的包换到了新的目录,或者这一下换掉了 dsh 自己提供的那份",
|
|
2709
2569
|
"panels.market.add.restartWhy.host-module": "这一下动到了 dsh 自己加载的模块",
|
|
2710
2570
|
"panels.market.add.restartWhy.unmanaged-plugin": "这一下动到了插件清单之外正在跑的插件",
|
|
@@ -2719,17 +2579,17 @@ var dictionaries = {
|
|
|
2719
2579
|
"panels.market.add.remove": "移除它",
|
|
2720
2580
|
"panels.market.add.problem.invalidSpec": "这个写法不认:不能是空的,也不能以横杠开头。",
|
|
2721
2581
|
"panels.market.add.problem.alreadyInstalled": "这个包已经在 profile 里了(要换版本请带上 @版本)。",
|
|
2722
|
-
"panels.market.add.problem.notFound": "
|
|
2723
|
-
"panels.market.add.problem.notAPackage": "
|
|
2724
|
-
"panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh
|
|
2725
|
-
"panels.market.add.problem.network": "
|
|
2726
|
-
"panels.market.add.problem.unknown": "
|
|
2582
|
+
"panels.market.add.problem.notFound": "源上没有这个包。换个包名或版本再试。",
|
|
2583
|
+
"panels.market.add.problem.notAPackage": "这个位置没有包。选一个包含 package.json 的目录。",
|
|
2584
|
+
"panels.market.add.problem.notABundle": "它是一个 npm 包,但不是 dsh 插件包(缺 dsh 的接线声明)。",
|
|
2585
|
+
"panels.market.add.problem.network": "源连不上。检查网络后重试。",
|
|
2586
|
+
"panels.market.add.problem.unknown": "预检没通过(原因未知)。展开安装详情看原始输出,或重试。",
|
|
2727
2587
|
"panels.market.add.reason.invalidSpec": "写法不认",
|
|
2728
2588
|
"panels.market.add.reason.incompatible": "它要的 dsh 版本和这台机器上的不一致",
|
|
2729
2589
|
"panels.market.add.reason.notBundle": "它不是一个 dsh 插件包",
|
|
2730
2590
|
"panels.market.add.reason.notRemovable": "它是安装自带的组合包,不能卸",
|
|
2731
2591
|
"panels.market.add.reason.bundleInUse": "还有东西在用它,卸不掉",
|
|
2732
|
-
"panels.market.add.reason.stopProfile": "
|
|
2592
|
+
"panels.market.add.reason.stopProfile": "这个配置没开热更新,得先停掉进程",
|
|
2733
2593
|
"panels.market.add.reason.staleApproval": "要允许的安装脚本已经变了,重新来一次",
|
|
2734
2594
|
"panels.market.add.reason.operationError": "pnpm 执行出错(详情见安装输出)",
|
|
2735
2595
|
"panels.market.add.reason.buildBlocked": "pnpm 拦下了安装脚本",
|
|
@@ -2784,11 +2644,11 @@ var dictionaries = {
|
|
|
2784
2644
|
"env.bridge.extensionLink": "去 Chrome 应用商店装扩展",
|
|
2785
2645
|
"env.bridge.profile": "连上了多个浏览器 profile,但没选默认的那个:先看有哪些(下面这条命令),再选一个。",
|
|
2786
2646
|
"env.bridge.stale": "默认的浏览器 profile 已经失效(它记的是上一次的扩展实例):重新选一个。",
|
|
2787
|
-
"env.bridge.unknown": "
|
|
2647
|
+
"env.bridge.unknown": "没认出是哪种问题:展开原始输出,按里面的步骤处理。",
|
|
2788
2648
|
"env.fix.title": "怎么解决",
|
|
2789
2649
|
"env.fix.why": "工作台用它自己那份 opencli(与你在终端里那套分开装,互不影响),这台机器上还没装好它。",
|
|
2790
2650
|
"env.fix.whyPath": "opencli 装上了,但当前环境还找不到它 —— 通常是 PATH 或终端会话的问题。",
|
|
2791
|
-
"env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 ——
|
|
2651
|
+
"env.fix.whyShell": "工作台拿不到执行命令的通道,所以取不了数据 —— 这一步你装不了,需要有人处理后台环境。",
|
|
2792
2652
|
"env.fix.step": "在终端里运行下面这条命令,装好之后点「重试」:",
|
|
2793
2653
|
"env.fix.stepPath": "新开一个终端窗口(或确认 npm 的全局 bin 目录在 PATH 里),然后点「重试」。",
|
|
2794
2654
|
"env.fix.stepShell": "重启一次工作台(或 dsh);如果反复出现,说明执行通道没配好。",
|
|
@@ -2800,9 +2660,9 @@ var dictionaries = {
|
|
|
2800
2660
|
"env.diy.ok": "可用",
|
|
2801
2661
|
"env.diy.short": "挂不起来",
|
|
2802
2662
|
"env.diy.hold": "DIY 模式挂不起来 —— 升级 dsh 后点「重试」,也可以先进工作台。",
|
|
2803
|
-
"env.diy.why": "
|
|
2804
|
-
"env.diy.rows": "这一代 dsh
|
|
2805
|
-
"env.diy.noRow": "体检没在 dsh
|
|
2663
|
+
"env.diy.why": "这台机器上的 dsh 比工作台验过的旧,DIY 模式挂不起来;面板和其它功能不受影响。升级 dsh 后重启再试。",
|
|
2664
|
+
"env.diy.rows": "这一代 dsh 缺这几项:{rows}",
|
|
2665
|
+
"env.diy.noRow": "体检没在 dsh 的模式名单里看到「工作台 DIY 模式」—— 多半是工作台这份安装没带上对应的模式补丁。",
|
|
2806
2666
|
"env.diy.step": "升级 dsh,然后重启一次工作台:",
|
|
2807
2667
|
"env.diy.continue": "先进入工作台",
|
|
2808
2668
|
"env.copyCommand": "复制命令",
|
|
@@ -2838,6 +2698,18 @@ var dictionaries = {
|
|
|
2838
2698
|
"board.title": "工作台面板",
|
|
2839
2699
|
"panel.conversation": "对话",
|
|
2840
2700
|
"panels.label": "全局面板",
|
|
2701
|
+
"workbenchSettings.nav": "工作台设置",
|
|
2702
|
+
"workbenchSettings.lead": "工作台自己这一侧的配置都收在这里。",
|
|
2703
|
+
"sidebarEdition.nav": "会话列表",
|
|
2704
|
+
"sidebarEdition.lead": "左栏整条用哪一套:官方 dsh 的,还是工作台自己的。",
|
|
2705
|
+
"sidebarEdition.official": "官方",
|
|
2706
|
+
"sidebarEdition.officialHint": "跟 dsh 官方一致、最稳:搜索、视图选项、显示更多、归档、添加工作区都齐,升级也不等我们适配。想省心就选它。",
|
|
2707
|
+
"sidebarEdition.custom": "自定义",
|
|
2708
|
+
"sidebarEdition.customHint": "为多项目工作流做的:项目下拉一屏一个项目,会话按最近更新排,两端淡出、跑马灯、工坊 DIY 新会话。项目多时更顺手。",
|
|
2709
|
+
"sidebarEdition.saving": "配置中…",
|
|
2710
|
+
"sidebarEdition.reloadRequired": "已写入。刷新页面后生效(不用重启工作台)。",
|
|
2711
|
+
"sidebarEdition.reload": "刷新页面",
|
|
2712
|
+
"sidebarEdition.failed": "这一档没写进去,再试一次。",
|
|
2841
2713
|
"configSync.nav": "配置同步",
|
|
2842
2714
|
"configSync.lead": "把另一个 profile 里显式配过的行搬过来 —— 来源随你选。",
|
|
2843
2715
|
"configSync.source": "来源",
|
|
@@ -2860,8 +2732,8 @@ var dictionaries = {
|
|
|
2860
2732
|
"configSync.code.expandAria": "展开差异(还有 {count} 行)",
|
|
2861
2733
|
"configSync.code.expand": "展开剩余 {count} 行",
|
|
2862
2734
|
"configSync.missing": "{pkg} 还没装:这一行搬过来也不会生效 —— 先 `dsh plugin --profile {profile} add {pkg}`,或在模块市场里装",
|
|
2863
|
-
"configSync.apply": "同步选中的 {count}
|
|
2864
|
-
"configSync.applyNone": "
|
|
2735
|
+
"configSync.apply": "同步选中的 {count} 项",
|
|
2736
|
+
"configSync.applyNone": "请选择同步内容",
|
|
2865
2737
|
"configSync.applying": "正在写入…",
|
|
2866
2738
|
"configSync.applied": "已写入工作台配置 · 已生效",
|
|
2867
2739
|
"configSync.appliedIds": "这次写进去:{ids}",
|
|
@@ -2869,7 +2741,7 @@ var dictionaries = {
|
|
|
2869
2741
|
"configSync.nothing": "没有需要同步的内容",
|
|
2870
2742
|
"configSync.unreadable": "读不到 {path}:{reason}",
|
|
2871
2743
|
"configSync.noSource": "这台机器上只有工作台这一个 profile,没有可同步的来源",
|
|
2872
|
-
"configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile
|
|
2744
|
+
"configSync.emptyProviders": "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行搬过来,或自己去「模型」里配。",
|
|
2873
2745
|
"configSync.failed": "同步没成功,再试一次。",
|
|
2874
2746
|
"debug.workspace": "这个工作区",
|
|
2875
2747
|
"debug.status": "「{title}」调试中",
|
|
@@ -2990,7 +2862,7 @@ var dictionaries = {
|
|
|
2990
2862
|
"panels.buildModule": "Build a module",
|
|
2991
2863
|
"panels.failed": "Could not save the change. Try again.",
|
|
2992
2864
|
"panels.dragHint": "Drag to reorder",
|
|
2993
|
-
"panels.unknownStep": "No
|
|
2865
|
+
"panels.unknownStep": "No panel for this view yet",
|
|
2994
2866
|
"panels.labelWithHint": "{label} ({hint})",
|
|
2995
2867
|
"panels.hintJoin": "; ",
|
|
2996
2868
|
"panels.dep.failed": "⚠ failed to start",
|
|
@@ -3025,6 +2897,14 @@ var dictionaries = {
|
|
|
3025
2897
|
"panels.market.install": "Install",
|
|
3026
2898
|
"panels.market.update": "Update",
|
|
3027
2899
|
"panels.market.swapSlow": "Not swapped yet — maybe a slow or failed download. Press Update again; if it stays like this, restart dsh.",
|
|
2900
|
+
"panels.market.updateNoChange": "Not updated: you were on {from}, and after the run the disk still has that version; the newest on the registry is {latest}.",
|
|
2901
|
+
"panels.market.updateUnknownVersion": "(unknown)",
|
|
2902
|
+
"panels.market.updateGone": "Not updated: after the run the module cannot be read from disk.",
|
|
2903
|
+
"panels.market.updateRestored": "Not updated: the new version was missing from disk, so {version} was put back.",
|
|
2904
|
+
"panels.market.updateBehind": "Installed {installed}, but the newest on the registry is {latest} — not the latest; you can update once more.",
|
|
2905
|
+
"panels.market.selfUpdateFailed": "Self-update failed: {reason}",
|
|
2906
|
+
"panels.market.selfUpdateUnknown": "the outside process left no reason (see ~/.dsh/workbench/self-update.log)",
|
|
2907
|
+
"panels.market.selfUpdateRolledBack": "Not swapped; rolled back to {version}.",
|
|
3028
2908
|
"panels.market.uninstall": "Uninstall",
|
|
3029
2909
|
"panels.market.uninstallLabel": "Uninstall {name}",
|
|
3030
2910
|
"panels.market.installing": "Installing…",
|
|
@@ -3055,7 +2935,7 @@ var dictionaries = {
|
|
|
3055
2935
|
"panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
|
|
3056
2936
|
"panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
|
|
3057
2937
|
"panels.market.pluginKeptUnnamed": "Files kept for now: this one cannot be identified as a plugin, so it is unclear who needs it.",
|
|
3058
|
-
"panels.market.pluginBroken": "This install is broken: it cannot be identified
|
|
2938
|
+
"panels.market.pluginBroken": "This plugin install is broken: it cannot be identified. Uninstall it first, then ask the agent to reinstall it by package name.",
|
|
3059
2939
|
"panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
|
|
3060
2940
|
"panels.market.foot": "After installing, enable it in the panel page of that project.",
|
|
3061
2941
|
"panels.market.recheck": "Check for updates",
|
|
@@ -3100,7 +2980,7 @@ var dictionaries = {
|
|
|
3100
2980
|
"panels.market.add.cancelledTitle": "Cancelled",
|
|
3101
2981
|
"panels.market.add.failureNetworkHost": "Cannot reach {host}. Git URLs and .tgz links bypass the registry, so this machine needs direct access or a proxy; if the module is also on npm, use its package name instead.",
|
|
3102
2982
|
"panels.market.add.problemInvalid": "Cannot read this package name or address: {reason}",
|
|
3103
|
-
"panels.market.add.problemInstalled": "This module is already installed",
|
|
2983
|
+
"panels.market.add.problemInstalled": "This module is already installed (add @version to switch versions)",
|
|
3104
2984
|
"panels.market.add.problemNotFound": "No such module found",
|
|
3105
2985
|
"panels.market.add.problemNotPackage": "That path does not exist or is not a valid module package",
|
|
3106
2986
|
"panels.market.add.problemNotBundle": "This package cannot be installed here: {reason}. This entry recognises workbench modules and opencli plugins by package name, and installs either; but a git URL or a tarball does not reveal what it is — if it is really one of those two, use its package name or a local folder instead.",
|
|
@@ -3121,7 +3001,7 @@ var dictionaries = {
|
|
|
3121
3001
|
"panels.market.add.failureIntegrity": "The downloaded package failed its integrity check",
|
|
3122
3002
|
"panels.market.add.failureTimeout": "The install timed out",
|
|
3123
3003
|
"panels.market.add.failurePnpmMissing": "pnpm was not found, cannot install",
|
|
3124
|
-
"panels.market.add.failureInstalled": "It is already in this
|
|
3004
|
+
"panels.market.add.failureInstalled": "It is already installed in this workbench. The same package cannot be installed over itself: uninstall it first, then install again. The uninstall did not succeed this time.",
|
|
3125
3005
|
"panels.market.add.failureGeneric": "Something went wrong during install — see the install details",
|
|
3126
3006
|
"panels.market.add.approveTitle": "Your approval is needed for install scripts",
|
|
3127
3007
|
"panels.market.add.approveCaution": "Only allow packages you trust: install scripts run on this machine with your permissions.",
|
|
@@ -3159,7 +3039,7 @@ var dictionaries = {
|
|
|
3159
3039
|
"panels.market.add.doneApplied": "Installed and live.",
|
|
3160
3040
|
"panels.market.add.doneRestart": "Installed — restart once to pick it up.",
|
|
3161
3041
|
"panels.market.add.restartWhy": "Why this needs a restart: {reason}",
|
|
3162
|
-
"panels.market.add.restartWhy.no-hmr": "this
|
|
3042
|
+
"panels.market.add.restartWhy.no-hmr": "this configuration only applies changes at startup (hot reload is off)",
|
|
3163
3043
|
"panels.market.add.restartWhy.package-moved": "an installed package now resolves to another directory, or the change replaced something dsh itself provides",
|
|
3164
3044
|
"panels.market.add.restartWhy.host-module": "the change reaches modules dsh itself loaded",
|
|
3165
3045
|
"panels.market.add.restartWhy.unmanaged-plugin": "the change reaches a plugin running outside the plugin list",
|
|
@@ -3174,17 +3054,17 @@ var dictionaries = {
|
|
|
3174
3054
|
"panels.market.add.remove": "Remove it",
|
|
3175
3055
|
"panels.market.add.problem.invalidSpec": "That is not a spec we accept: it cannot be empty or start with a dash.",
|
|
3176
3056
|
"panels.market.add.problem.alreadyInstalled": "That package is already in the profile (add @version to switch versions).",
|
|
3177
|
-
"panels.market.add.problem.notFound": "No such package on that source.",
|
|
3178
|
-
"panels.market.add.problem.notAPackage": "There is no package at that location.",
|
|
3179
|
-
"panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (
|
|
3180
|
-
"panels.market.add.problem.network": "The source is unreachable.",
|
|
3181
|
-
"panels.market.add.problem.unknown": "The check did not pass (reason unknown).",
|
|
3057
|
+
"panels.market.add.problem.notFound": "No such package on that source. Try another name or version.",
|
|
3058
|
+
"panels.market.add.problem.notAPackage": "There is no package at that location. Pick a folder that contains a package.json.",
|
|
3059
|
+
"panels.market.add.problem.notABundle": "It is an npm package, but not a dsh plugin (it is missing the dsh wiring declaration).",
|
|
3060
|
+
"panels.market.add.problem.network": "The source is unreachable. Check the network and retry.",
|
|
3061
|
+
"panels.market.add.problem.unknown": "The check did not pass (reason unknown). Open the install details for the raw output, or retry.",
|
|
3182
3062
|
"panels.market.add.reason.invalidSpec": "the spec is not accepted",
|
|
3183
3063
|
"panels.market.add.reason.incompatible": "it wants a different dsh version than this machine runs",
|
|
3184
3064
|
"panels.market.add.reason.notBundle": "it is not a dsh plugin package",
|
|
3185
3065
|
"panels.market.add.reason.notRemovable": "it ships with the installation and cannot be removed",
|
|
3186
3066
|
"panels.market.add.reason.bundleInUse": "something is still using it",
|
|
3187
|
-
"panels.market.add.reason.stopProfile": "this
|
|
3067
|
+
"panels.market.add.reason.stopProfile": "this configuration has no hot reload, so stop the process first",
|
|
3188
3068
|
"panels.market.add.reason.staleApproval": "the scripts to allow changed — start over",
|
|
3189
3069
|
"panels.market.add.reason.operationError": "pnpm failed (see the install output)",
|
|
3190
3070
|
"panels.market.add.reason.buildBlocked": "pnpm blocked install scripts",
|
|
@@ -3239,11 +3119,11 @@ var dictionaries = {
|
|
|
3239
3119
|
"env.bridge.extensionLink": "Get the extension in the Chrome Web Store",
|
|
3240
3120
|
"env.bridge.profile": "Several browser profiles are connected but none is the default: list them (command below), then pick one.",
|
|
3241
3121
|
"env.bridge.stale": "The default browser profile is stale (it names an extension instance that no longer exists): pick one again.",
|
|
3242
|
-
"env.bridge.unknown": "Could not tell what went wrong
|
|
3122
|
+
"env.bridge.unknown": "Could not tell what went wrong. Expand the raw output and follow the steps in it.",
|
|
3243
3123
|
"env.fix.title": "How to fix it",
|
|
3244
3124
|
"env.fix.why": "The workbench uses its own opencli (installed separately from the one in your terminal), and it is not set up on this machine yet.",
|
|
3245
3125
|
"env.fix.whyPath": "opencli is installed, but this environment cannot find it — usually a PATH or shell-session issue.",
|
|
3246
|
-
"env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data —
|
|
3126
|
+
"env.fix.whyShell": "The workbench has no shell channel, so it cannot fetch data — you cannot install this from here; someone needs to fix the background environment.",
|
|
3247
3127
|
"env.fix.step": "Run this in a terminal, then hit Retry:",
|
|
3248
3128
|
"env.fix.stepPath": "Open a new terminal window (or make sure npm’s global bin directory is on PATH), then hit Retry.",
|
|
3249
3129
|
"env.fix.stepShell": "Restart the workbench (or dsh); if it keeps happening, the shell channel is not wired up.",
|
|
@@ -3255,9 +3135,9 @@ var dictionaries = {
|
|
|
3255
3135
|
"env.diy.ok": "Available",
|
|
3256
3136
|
"env.diy.short": "Cannot load",
|
|
3257
3137
|
"env.diy.hold": "DIY mode cannot load — upgrade dsh, then hit Retry; or enter the workbench first.",
|
|
3258
|
-
"env.diy.why": "
|
|
3259
|
-
"env.diy.rows": "This dsh is missing these
|
|
3260
|
-
"env.diy.noRow": "The health check did not find “Workbench DIY” in dsh’s
|
|
3138
|
+
"env.diy.why": "The dsh on this machine is older than the one this workbench was verified against, so DIY mode cannot load. Panels and everything else are unaffected. Upgrade dsh and restart.",
|
|
3139
|
+
"env.diy.rows": "This dsh is missing these items: {rows}",
|
|
3140
|
+
"env.diy.noRow": "The health check did not find “Workbench DIY mode” in dsh’s mode roster — the workbench install most likely did not include the matching mode patch.",
|
|
3261
3141
|
"env.diy.step": "Upgrade dsh, then restart the workbench:",
|
|
3262
3142
|
"env.diy.continue": "Enter the workbench anyway",
|
|
3263
3143
|
"env.copyCommand": "Copy command",
|
|
@@ -3293,6 +3173,18 @@ var dictionaries = {
|
|
|
3293
3173
|
"board.title": "Workbench panel",
|
|
3294
3174
|
"panel.conversation": "Conversation",
|
|
3295
3175
|
"panels.label": "Global panels",
|
|
3176
|
+
"workbenchSettings.nav": "Workbench settings",
|
|
3177
|
+
"workbenchSettings.lead": "Settings the workbench itself owns live here.",
|
|
3178
|
+
"sidebarEdition.nav": "Session list",
|
|
3179
|
+
"sidebarEdition.lead": "Which whole left column to use: the official dsh one, or the workbench’s own.",
|
|
3180
|
+
"sidebarEdition.official": "Official",
|
|
3181
|
+
"sidebarEdition.officialHint": "Matches dsh exactly and stays stable: search, view options, show more, archive, add workspace — no waiting for us to catch up. Pick it to keep things simple.",
|
|
3182
|
+
"sidebarEdition.custom": "Custom",
|
|
3183
|
+
"sidebarEdition.customHint": "Built for multi-project work: one project per dropdown, recency-first sessions, edge fades, marquee, DIY new session. Easier when you juggle projects.",
|
|
3184
|
+
"sidebarEdition.saving": "Configuring…",
|
|
3185
|
+
"sidebarEdition.reloadRequired": "Saved. Reload the page to apply — no workbench restart needed.",
|
|
3186
|
+
"sidebarEdition.reload": "Reload page",
|
|
3187
|
+
"sidebarEdition.failed": "That choice did not save; try again.",
|
|
3296
3188
|
"configSync.nav": "Config sync",
|
|
3297
3189
|
"configSync.lead": "Bring over the rows another profile configures explicitly — pick any profile as the source.",
|
|
3298
3190
|
"configSync.source": "Source",
|
|
@@ -3315,8 +3207,8 @@ var dictionaries = {
|
|
|
3315
3207
|
"configSync.code.expandAria": "Expand the diff ({count} more lines)",
|
|
3316
3208
|
"configSync.code.expand": "Show {count} more lines",
|
|
3317
3209
|
"configSync.missing": "{pkg} is not installed: the row will not take effect — run `dsh plugin --profile {profile} add {pkg}`, or install it from the module market",
|
|
3318
|
-
"configSync.apply": "Sync {count} selected",
|
|
3319
|
-
"configSync.applyNone": "
|
|
3210
|
+
"configSync.apply": "Sync {count} selected items",
|
|
3211
|
+
"configSync.applyNone": "Choose what to sync",
|
|
3320
3212
|
"configSync.applying": "Writing…",
|
|
3321
3213
|
"configSync.applied": "Written to the workbench config · applied",
|
|
3322
3214
|
"configSync.appliedIds": "Written this time: {ids}",
|
|
@@ -3324,7 +3216,7 @@ var dictionaries = {
|
|
|
3324
3216
|
"configSync.nothing": "Nothing to sync",
|
|
3325
3217
|
"configSync.unreadable": "Cannot read {path}: {reason}",
|
|
3326
3218
|
"configSync.noSource": "This machine has no other profile to sync from",
|
|
3327
|
-
"configSync.emptyProviders": "The workbench has no model provider yet — sync the
|
|
3219
|
+
"configSync.emptyProviders": "The workbench has no model provider yet — sync the model-provider rows from some profile, or configure one under Models.",
|
|
3328
3220
|
"configSync.failed": "The sync did not go through; try again.",
|
|
3329
3221
|
"debug.workspace": "this workspace",
|
|
3330
3222
|
"debug.status": "Debugging “{title}”",
|
|
@@ -3416,30 +3308,6 @@ function mergeMessagesSkipping(base, contributions) {
|
|
|
3416
3308
|
};
|
|
3417
3309
|
}
|
|
3418
3310
|
//#endregion
|
|
3419
|
-
//#region ../shared/dist/lib/blocker-action.js
|
|
3420
|
-
/**
|
|
3421
|
-
* 这颗钮此刻该不该按成等待态:这一轮忙还没收,或有一支正在跑。
|
|
3422
|
-
* @param busy - 这一轮忙是不是还在。
|
|
3423
|
-
* @param running - 正在跑的那一支的 label;没有就给 `null`。
|
|
3424
|
-
* @returns 该等待给 `true`,否则 `false`。
|
|
3425
|
-
*/
|
|
3426
|
-
function blockerPending(busy, running) {
|
|
3427
|
-
return busy || running !== null;
|
|
3428
|
-
}
|
|
3429
|
-
/**
|
|
3430
|
-
* 这颗钮此刻该显示什么字:正在重试说「重试中…」,正在跑的那一支说「修复中…」,刚复制过的说「已复制」,其余原样。
|
|
3431
|
-
* @param action - 这颗钮的形状(行为 + 平时文案)。
|
|
3432
|
-
* @param state - 此刻的运行态。
|
|
3433
|
-
* @param t - i18n 取词函数。
|
|
3434
|
-
* @returns 要显示的文案;三种临时态都不成立时就是 `action.label`。
|
|
3435
|
-
*/
|
|
3436
|
-
function blockerActionLabel(action, state, t) {
|
|
3437
|
-
if (action.kind === "retry" && state.retrying) return t("blocker.retry.running");
|
|
3438
|
-
if (state.running === action.label) return t("blocker.fix.running");
|
|
3439
|
-
if (action.kind === "copy" && state.copied === action.text) return t("env.copied");
|
|
3440
|
-
return action.label;
|
|
3441
|
-
}
|
|
3442
|
-
//#endregion
|
|
3443
3311
|
//#region ../shared/dist/lib/board-fact.js
|
|
3444
3312
|
/**
|
|
3445
3313
|
* 判一个路径落不落在这个工作区里(按路径前缀比,不是字符串包含)。
|
|
@@ -3555,7 +3423,7 @@ function excerpt(text, limit = 80) {
|
|
|
3555
3423
|
* @param props.children - 单个锚点元素;`label` / `shortcutKeys` / `openOnClick` 等其余 prop 与 dsh 同形。
|
|
3556
3424
|
*/
|
|
3557
3425
|
function Tip({ side = "bottom", align = "end", gap = 6, portal = true, ...rest }) {
|
|
3558
|
-
return /* @__PURE__ */
|
|
3426
|
+
return /* @__PURE__ */ createElement(Tooltip, {
|
|
3559
3427
|
side,
|
|
3560
3428
|
align,
|
|
3561
3429
|
gap,
|
|
@@ -3564,6 +3432,55 @@ function Tip({ side = "bottom", align = "end", gap = 6, portal = true, ...rest }
|
|
|
3564
3432
|
});
|
|
3565
3433
|
}
|
|
3566
3434
|
//#endregion
|
|
3435
|
+
//#region src/shared/components/IconModules.tsx
|
|
3436
|
+
/**
|
|
3437
|
+
* 四宫格:"模块"这个概念的通用单色图标(侧栏、面板那颗钮、市场节的标题);默认 16px。
|
|
3438
|
+
* 外壳自己用(`IconBrandMark` 那几枚在 kit 上,这枚不出口)。
|
|
3439
|
+
* @param props.size - 边长像素,同时给 `width` 与 `height`。
|
|
3440
|
+
* @returns 一枚 `aria-hidden` 的 svg。
|
|
3441
|
+
*/
|
|
3442
|
+
function IconModules({ size = 16 }) {
|
|
3443
|
+
return /* @__PURE__ */ createElement("svg", {
|
|
3444
|
+
width: size,
|
|
3445
|
+
height: size,
|
|
3446
|
+
viewBox: "0 0 16 16",
|
|
3447
|
+
fill: "none",
|
|
3448
|
+
"aria-hidden": "true"
|
|
3449
|
+
}, /* @__PURE__ */ createElement("rect", {
|
|
3450
|
+
x: "2.5",
|
|
3451
|
+
y: "2.5",
|
|
3452
|
+
width: "4.6",
|
|
3453
|
+
height: "4.6",
|
|
3454
|
+
rx: "1.2",
|
|
3455
|
+
stroke: "currentColor",
|
|
3456
|
+
strokeWidth: "1.2"
|
|
3457
|
+
}), /* @__PURE__ */ createElement("rect", {
|
|
3458
|
+
x: "8.9",
|
|
3459
|
+
y: "2.5",
|
|
3460
|
+
width: "4.6",
|
|
3461
|
+
height: "4.6",
|
|
3462
|
+
rx: "1.2",
|
|
3463
|
+
stroke: "currentColor",
|
|
3464
|
+
strokeWidth: "1.2"
|
|
3465
|
+
}), /* @__PURE__ */ createElement("rect", {
|
|
3466
|
+
x: "2.5",
|
|
3467
|
+
y: "8.9",
|
|
3468
|
+
width: "4.6",
|
|
3469
|
+
height: "4.6",
|
|
3470
|
+
rx: "1.2",
|
|
3471
|
+
stroke: "currentColor",
|
|
3472
|
+
strokeWidth: "1.2"
|
|
3473
|
+
}), /* @__PURE__ */ createElement("rect", {
|
|
3474
|
+
x: "8.9",
|
|
3475
|
+
y: "8.9",
|
|
3476
|
+
width: "4.6",
|
|
3477
|
+
height: "4.6",
|
|
3478
|
+
rx: "1.2",
|
|
3479
|
+
stroke: "currentColor",
|
|
3480
|
+
strokeWidth: "1.2"
|
|
3481
|
+
}));
|
|
3482
|
+
}
|
|
3483
|
+
//#endregion
|
|
3567
3484
|
//#region src/shared/hooks/fact-transports.ts
|
|
3568
3485
|
function sseTransport(options) {
|
|
3569
3486
|
return { start({ onFrame, cursor }) {
|
|
@@ -3656,7 +3573,9 @@ var channel = createFactChannel({ transport: createAdaptiveTransport() });
|
|
|
3656
3573
|
* 卡片读数默认订的 `factOfRoute(route)` 已经接好,只有要订别的事实才显式传 `fact`。
|
|
3657
3574
|
*/
|
|
3658
3575
|
function useFactRevision(fact) {
|
|
3659
|
-
|
|
3576
|
+
const subscribe = useCallback((listener) => channel.subscribe(fact, listener), [fact]);
|
|
3577
|
+
const snapshot = useCallback(() => channel.revisionOf(fact), [fact]);
|
|
3578
|
+
return useSyncExternalStore(subscribe, snapshot);
|
|
3660
3579
|
}
|
|
3661
3580
|
/**
|
|
3662
3581
|
* 不在渲染里的地方(宿主事件、定时器里看到的旧值)要听事实变化时用它;返回值就是退订函数,用完记得退。
|
|
@@ -3716,8 +3635,16 @@ function setProbe(next) {
|
|
|
3716
3635
|
*/
|
|
3717
3636
|
var CAPABILITY_FACT = "capability";
|
|
3718
3637
|
var shared = null;
|
|
3638
|
+
var epoch$1 = 0;
|
|
3639
|
+
/**
|
|
3640
|
+
* 写完之后把读数作废:写之前发出去的在飞探测即使回来也不许发布(它探的是改之前的样子)。
|
|
3641
|
+
* 配一次 `force` 的读,界面才不会拿着旧能力表再摆一次「更新」。
|
|
3642
|
+
*/
|
|
3643
|
+
function bumpCapabilityEpoch() {
|
|
3644
|
+
epoch$1 += 1;
|
|
3645
|
+
}
|
|
3719
3646
|
var current$1 = null;
|
|
3720
|
-
var listeners$
|
|
3647
|
+
var listeners$6 = /* @__PURE__ */ new Set();
|
|
3721
3648
|
/**
|
|
3722
3649
|
* 当前整张能力表的取值口(没探过是 `null`),给 `useSyncExternalStore` 用;渲染里请用 `useCapabilities`。
|
|
3723
3650
|
*/
|
|
@@ -3728,9 +3655,9 @@ function capabilityValue() {
|
|
|
3728
3655
|
* 能力表的订阅口,返回退订函数;渲染里请用 `useCapabilities`。
|
|
3729
3656
|
*/
|
|
3730
3657
|
function subscribeCapabilities(listener) {
|
|
3731
|
-
listeners$
|
|
3658
|
+
listeners$6.add(listener);
|
|
3732
3659
|
return () => {
|
|
3733
|
-
listeners$
|
|
3660
|
+
listeners$6.delete(listener);
|
|
3734
3661
|
};
|
|
3735
3662
|
}
|
|
3736
3663
|
/**
|
|
@@ -3744,7 +3671,7 @@ function setCapabilities(next, rechecked = false) {
|
|
|
3744
3671
|
});
|
|
3745
3672
|
if (next === current$1) return;
|
|
3746
3673
|
current$1 = next;
|
|
3747
|
-
for (const listener of [...listeners$
|
|
3674
|
+
for (const listener of [...listeners$6]) listener();
|
|
3748
3675
|
}
|
|
3749
3676
|
/**
|
|
3750
3677
|
* 一次强探开始:点亮“正在探”;已经在探就跳过。
|
|
@@ -3788,12 +3715,14 @@ function publishCapability(result, rechecked = false) {
|
|
|
3788
3715
|
* 下一次强探会真的再跑一遍;`force` 不同不搭车。
|
|
3789
3716
|
*/
|
|
3790
3717
|
function shareCapabilityFetch(force, load) {
|
|
3791
|
-
|
|
3718
|
+
const at = epoch$1;
|
|
3719
|
+
if (shared !== null && shared.force === force && shared.epoch === at) return shared.promise;
|
|
3792
3720
|
const promise = load(force).finally(() => {
|
|
3793
3721
|
if (shared?.promise === promise) shared = null;
|
|
3794
3722
|
});
|
|
3795
3723
|
shared = {
|
|
3796
3724
|
force,
|
|
3725
|
+
epoch: at,
|
|
3797
3726
|
promise
|
|
3798
3727
|
};
|
|
3799
3728
|
return promise;
|
|
@@ -3806,10 +3735,12 @@ var newestForceSeq$1 = -1;
|
|
|
3806
3735
|
*/
|
|
3807
3736
|
function runCapabilityRead(options) {
|
|
3808
3737
|
const { force, silent = false, load = fetchAll } = options;
|
|
3738
|
+
const at = epoch$1;
|
|
3809
3739
|
const seq = readSeq$1 += 1;
|
|
3810
3740
|
if (force) newestForceSeq$1 = seq;
|
|
3811
3741
|
if (force && !silent) beginProbe();
|
|
3812
3742
|
return shareCapabilityFetch(force, load).then((result) => {
|
|
3743
|
+
if (at !== epoch$1) return;
|
|
3813
3744
|
if (!force && seq < newestForceSeq$1) return;
|
|
3814
3745
|
publishCapability(result, force);
|
|
3815
3746
|
}).finally(() => {
|
|
@@ -3823,6 +3754,7 @@ function runCapabilityRead(options) {
|
|
|
3823
3754
|
function useCapabilities(refreshToken, reloadToken = 0) {
|
|
3824
3755
|
const value = useSyncExternalStore(subscribeCapabilities, capabilityValue);
|
|
3825
3756
|
const previous = useRef(refreshToken);
|
|
3757
|
+
const factRev = useFactRevision(CAPABILITY_FACT);
|
|
3826
3758
|
useEffect(() => {
|
|
3827
3759
|
const force = shouldForce(refreshToken, previous.current);
|
|
3828
3760
|
previous.current = refreshToken;
|
|
@@ -3834,7 +3766,7 @@ function useCapabilities(refreshToken, reloadToken = 0) {
|
|
|
3834
3766
|
});
|
|
3835
3767
|
}, [
|
|
3836
3768
|
refreshToken,
|
|
3837
|
-
|
|
3769
|
+
factRev,
|
|
3838
3770
|
reloadToken
|
|
3839
3771
|
]);
|
|
3840
3772
|
return value;
|
|
@@ -3846,6 +3778,49 @@ function useCapabilityProbe() {
|
|
|
3846
3778
|
return useSyncExternalStore(subscribeProbe, probeValue);
|
|
3847
3779
|
}
|
|
3848
3780
|
//#endregion
|
|
3781
|
+
//#region src/shared/api/unit-board.ts
|
|
3782
|
+
/**
|
|
3783
|
+
* 判这张卡现在能不能画。
|
|
3784
|
+
* @param capability 环境读数;还没读到给 null。
|
|
3785
|
+
* @param mode 闸档。
|
|
3786
|
+
* @returns mode 为 none 或读数还没到都放行(先放行让它读);读到明确不通过(ok 与 unchecked 之外)才拦。
|
|
3787
|
+
*/
|
|
3788
|
+
function gateOf(capability, mode) {
|
|
3789
|
+
if (mode === "none") return { gated: true };
|
|
3790
|
+
if (capability === null) return { gated: true };
|
|
3791
|
+
return { gated: capability.status === "ok" || capability.status === "unchecked" };
|
|
3792
|
+
}
|
|
3793
|
+
/**
|
|
3794
|
+
* 把候选卡住态分档,每档只留第一个。
|
|
3795
|
+
* @param candidates 候选(可能含 undefined),按优先级从高到低给。
|
|
3796
|
+
* @returns 分出的 blocker 与 notice;已经有 blocker 时不带 notice(挡住就不必再提示)。
|
|
3797
|
+
*/
|
|
3798
|
+
function splitBlocker(candidates) {
|
|
3799
|
+
let blocker;
|
|
3800
|
+
let notice;
|
|
3801
|
+
for (const candidate of candidates) {
|
|
3802
|
+
if (candidate === void 0) continue;
|
|
3803
|
+
if (candidate.severity === "block") {
|
|
3804
|
+
blocker ??= candidate;
|
|
3805
|
+
continue;
|
|
3806
|
+
}
|
|
3807
|
+
notice ??= candidate;
|
|
3808
|
+
}
|
|
3809
|
+
return {
|
|
3810
|
+
...blocker === void 0 ? {} : { blocker },
|
|
3811
|
+
...blocker !== void 0 || notice === void 0 ? {} : { notice }
|
|
3812
|
+
};
|
|
3813
|
+
}
|
|
3814
|
+
/**
|
|
3815
|
+
* 由读口错误算出「出错搭车强探」的防抖键:同一个键只自动重探一次。
|
|
3816
|
+
* @param error 读口错误;undefined 表示这次没有错误。
|
|
3817
|
+
* @returns 键字符串;空 code 归一到 unknown。
|
|
3818
|
+
*/
|
|
3819
|
+
function probeKeyOf(error) {
|
|
3820
|
+
if (error === void 0) return null;
|
|
3821
|
+
return error.code === "" ? "unknown" : error.code;
|
|
3822
|
+
}
|
|
3823
|
+
//#endregion
|
|
3849
3824
|
//#region src/shared/hooks/use-capability-gate.ts
|
|
3850
3825
|
var use_capability_gate_exports = /* @__PURE__ */ __exportAll({
|
|
3851
3826
|
useCapabilityGate: () => useCapabilityGate,
|
|
@@ -3916,7 +3891,7 @@ var devSurface = {
|
|
|
3916
3891
|
//#endregion
|
|
3917
3892
|
//#region src/app/layouts/panel-hint.ts
|
|
3918
3893
|
var hints = /* @__PURE__ */ new Map();
|
|
3919
|
-
var listeners$
|
|
3894
|
+
var listeners$5 = /* @__PURE__ */ new Set();
|
|
3920
3895
|
function sameHint(left, right) {
|
|
3921
3896
|
if (left === null || right === null) return left === right;
|
|
3922
3897
|
if (left.labelKey !== right.labelKey || left.tone !== right.tone) return false;
|
|
@@ -3928,15 +3903,15 @@ function publishPanelHint(id, hint) {
|
|
|
3928
3903
|
if (sameHint(hints.get(id) ?? null, hint)) return;
|
|
3929
3904
|
if (hint === null) hints.delete(id);
|
|
3930
3905
|
else hints.set(id, hint);
|
|
3931
|
-
for (const listener of [...listeners$
|
|
3906
|
+
for (const listener of [...listeners$5]) listener();
|
|
3932
3907
|
}
|
|
3933
3908
|
function panelHintOf(id) {
|
|
3934
3909
|
return id === null ? null : hints.get(id) ?? null;
|
|
3935
3910
|
}
|
|
3936
3911
|
function subscribePanelHints(listener) {
|
|
3937
|
-
listeners$
|
|
3912
|
+
listeners$5.add(listener);
|
|
3938
3913
|
return () => {
|
|
3939
|
-
listeners$
|
|
3914
|
+
listeners$5.delete(listener);
|
|
3940
3915
|
};
|
|
3941
3916
|
}
|
|
3942
3917
|
function usePanelHint(id) {
|
|
@@ -3975,9 +3950,15 @@ function swapUntil(action, application, latest) {
|
|
|
3975
3950
|
if (action !== "update-workbench" || application !== "restart-required") return void 0;
|
|
3976
3951
|
return latest;
|
|
3977
3952
|
}
|
|
3978
|
-
var READ_BACK_ACTIONS = /* @__PURE__ */ new Set([
|
|
3953
|
+
var READ_BACK_ACTIONS = /* @__PURE__ */ new Set([
|
|
3954
|
+
"update",
|
|
3955
|
+
"update-bundle",
|
|
3956
|
+
"update-dependency",
|
|
3957
|
+
"update-plugin"
|
|
3958
|
+
]);
|
|
3979
3959
|
function awaitsReadBack(action, application, version) {
|
|
3980
|
-
|
|
3960
|
+
if (application !== "applied" || !READ_BACK_ACTIONS.has(action)) return false;
|
|
3961
|
+
return action === "update-bundle" ? version !== void 0 : true;
|
|
3981
3962
|
}
|
|
3982
3963
|
function readBackDone(input) {
|
|
3983
3964
|
if (input.action === "update") return !input.outdated;
|
|
@@ -3989,6 +3970,9 @@ function readBackDone(input) {
|
|
|
3989
3970
|
function settleLanded(input) {
|
|
3990
3971
|
if (input.until !== void 0) return swapLanded(input.until, input.installed);
|
|
3991
3972
|
if (input.readBack !== true) return true;
|
|
3973
|
+
const settled = (state) => state !== void 0 && state !== "outdated" && state !== "unsatisfied" && state !== "checking" && state !== "unchecked";
|
|
3974
|
+
if (input.action === "update-dependency") return settled(input.sharedState);
|
|
3975
|
+
if (input.action === "update-plugin") return input.pluginOutdated === false;
|
|
3992
3976
|
return readBackDone({
|
|
3993
3977
|
action: input.action,
|
|
3994
3978
|
entry: input.entry,
|
|
@@ -3996,6 +3980,33 @@ function settleLanded(input) {
|
|
|
3996
3980
|
outdated: input.outdated
|
|
3997
3981
|
});
|
|
3998
3982
|
}
|
|
3983
|
+
function tailReason(tail) {
|
|
3984
|
+
if (tail === void 0) return void 0;
|
|
3985
|
+
const last = tail.split(" / ").map((part) => part.trim()).filter((part) => part !== "").at(-1);
|
|
3986
|
+
if (last === void 0) return void 0;
|
|
3987
|
+
return last.length <= 240 ? last : `${last.slice(0, 240)}…`;
|
|
3988
|
+
}
|
|
3989
|
+
/**
|
|
3990
|
+
* 工作台自更新是不是已经由外面那个进程判死了:`failed` / `rolled-back` 都算收尾,
|
|
3991
|
+
* 不必再等盘上版本追上来(最多 3 分钟的等待里用户不该一直看「正在更新」)。
|
|
3992
|
+
* `since` 是点下去那一刻(毫秒),marker 比它早太多说明是上一次的现场,不算。
|
|
3993
|
+
* @returns `undefined` = 还在跑或没有现场;否则 `kind` 与日志尾里最后一句原因。
|
|
3994
|
+
*/
|
|
3995
|
+
function selfUpdateStop(input) {
|
|
3996
|
+
const { until, since, update } = input;
|
|
3997
|
+
if (until === void 0 || update === void 0 || update === null) return void 0;
|
|
3998
|
+
if (update.state !== "failed" && update.state !== "rolled-back") return void 0;
|
|
3999
|
+
if (update.to !== until && update.version !== until) return void 0;
|
|
4000
|
+
if (since !== void 0 && update.at !== void 0) {
|
|
4001
|
+
const at = Date.parse(update.at);
|
|
4002
|
+
if (Number.isFinite(at) && at < since - 5e3) return void 0;
|
|
4003
|
+
}
|
|
4004
|
+
return {
|
|
4005
|
+
kind: update.state,
|
|
4006
|
+
...update.version === void 0 ? {} : { version: update.version },
|
|
4007
|
+
...update.state === "failed" && tailReason(update.tail) !== void 0 ? { reason: tailReason(update.tail) } : {}
|
|
4008
|
+
};
|
|
4009
|
+
}
|
|
3999
4010
|
function holdWindowMs(until) {
|
|
4000
4011
|
return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
|
|
4001
4012
|
}
|
|
@@ -4480,7 +4491,7 @@ function marketHintOf(input) {
|
|
|
4480
4491
|
}
|
|
4481
4492
|
//#endregion
|
|
4482
4493
|
//#region src/app/layouts/rightbar/market-busy.ts
|
|
4483
|
-
var listeners$
|
|
4494
|
+
var listeners$4 = /* @__PURE__ */ new Set();
|
|
4484
4495
|
var published = /* @__PURE__ */ new Map();
|
|
4485
4496
|
var live$2 = /* @__PURE__ */ new Set();
|
|
4486
4497
|
var timer$1;
|
|
@@ -4511,9 +4522,9 @@ function publishMarketBusy(ids) {
|
|
|
4511
4522
|
* 订阅这份事实的变化(发布内容真变了、或有条目到期才通知)。返回退订函数。
|
|
4512
4523
|
*/
|
|
4513
4524
|
function subscribeMarketBusy(listener) {
|
|
4514
|
-
listeners$
|
|
4525
|
+
listeners$4.add(listener);
|
|
4515
4526
|
return () => {
|
|
4516
|
-
listeners$
|
|
4527
|
+
listeners$4.delete(listener);
|
|
4517
4528
|
};
|
|
4518
4529
|
}
|
|
4519
4530
|
/**
|
|
@@ -4549,11 +4560,52 @@ function refresh(now) {
|
|
|
4549
4560
|
const next = new Set(published.keys());
|
|
4550
4561
|
if (!sameSet(live$2, next)) {
|
|
4551
4562
|
live$2 = next;
|
|
4552
|
-
for (const listener of [...listeners$
|
|
4563
|
+
for (const listener of [...listeners$4]) listener();
|
|
4553
4564
|
}
|
|
4554
4565
|
schedule(now);
|
|
4555
4566
|
}
|
|
4556
4567
|
//#endregion
|
|
4568
|
+
//#region src/shared/api/write-outcome.ts
|
|
4569
|
+
/**
|
|
4570
|
+
* 由通道与资源拼出写路由。
|
|
4571
|
+
* @param channel 写通道。
|
|
4572
|
+
* @param resource 该通道下的资源名。
|
|
4573
|
+
* @returns 路由字符串;provision 只有一段,其余是 channel/resource。
|
|
4574
|
+
*/
|
|
4575
|
+
function writeRoute(channel, resource) {
|
|
4576
|
+
if (channel === "provision") return "provision";
|
|
4577
|
+
return `${channel}/${resource}`;
|
|
4578
|
+
}
|
|
4579
|
+
/**
|
|
4580
|
+
* 把写通道的响应翻成 WriteOutcome。
|
|
4581
|
+
* @param response 写口回的响应;null 表示请求本身没成(网络断了,宿主没答)。
|
|
4582
|
+
* @param networkText 拿不到任何服务端文案时兜底的那句。
|
|
4583
|
+
* @returns 失败时 message 优先用服务端自己的话,没有才用响应正文或 networkText。
|
|
4584
|
+
*/
|
|
4585
|
+
function writeOutcomeOf(response, networkText) {
|
|
4586
|
+
if (response === null) return {
|
|
4587
|
+
ok: false,
|
|
4588
|
+
message: networkText
|
|
4589
|
+
};
|
|
4590
|
+
if (!response.ok) {
|
|
4591
|
+
const box = response;
|
|
4592
|
+
const own = typeof box.error?.message === "string" && box.error.message !== "" ? box.error.message : void 0;
|
|
4593
|
+
const fallback = typeof box.text === "string" && box.text !== "" ? box.text : networkText;
|
|
4594
|
+
const detail = typeof box.error?.detail === "string" ? box.error.detail : void 0;
|
|
4595
|
+
const helpUrl = typeof box.error?.helpUrl === "string" && box.error.helpUrl !== "" ? box.error.helpUrl : void 0;
|
|
4596
|
+
return {
|
|
4597
|
+
ok: false,
|
|
4598
|
+
message: own ?? fallback,
|
|
4599
|
+
...detail === void 0 ? {} : { detail },
|
|
4600
|
+
...helpUrl === void 0 ? {} : { helpUrl }
|
|
4601
|
+
};
|
|
4602
|
+
}
|
|
4603
|
+
return {
|
|
4604
|
+
ok: true,
|
|
4605
|
+
value: response
|
|
4606
|
+
};
|
|
4607
|
+
}
|
|
4608
|
+
//#endregion
|
|
4557
4609
|
//#region src/shared/hooks/use-host-write.ts
|
|
4558
4610
|
var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
|
|
4559
4611
|
/**
|
|
@@ -4660,11 +4712,19 @@ function useVisibleBusy(active, floorMs) {
|
|
|
4660
4712
|
//#endregion
|
|
4661
4713
|
//#region src/app/layouts/rightbar/market-settle-hold.ts
|
|
4662
4714
|
function useSettleHold(input) {
|
|
4663
|
-
const { pending, landed, t, onChanged, setPending, setFailed } = input;
|
|
4715
|
+
const { pending, landed, t, onChanged, selfUpdate, setPending, setFailed } = input;
|
|
4664
4716
|
const until = pending?.until;
|
|
4665
4717
|
const id = pending?.id ?? "";
|
|
4666
4718
|
const watching = pending !== null && (pending.until !== void 0 || pending.readBack === true);
|
|
4667
4719
|
const sinceRef = useRef(0);
|
|
4720
|
+
const stop = selfUpdateStop({
|
|
4721
|
+
until,
|
|
4722
|
+
since: pending?.since,
|
|
4723
|
+
update: selfUpdate
|
|
4724
|
+
});
|
|
4725
|
+
const stopKind = stop?.kind;
|
|
4726
|
+
const stopReason = stop?.reason;
|
|
4727
|
+
const stopVersion = stop?.version;
|
|
4668
4728
|
useEffect(() => {
|
|
4669
4729
|
if (!watching || !landed) return;
|
|
4670
4730
|
setPending(null);
|
|
@@ -4673,6 +4733,22 @@ function useSettleHold(input) {
|
|
|
4673
4733
|
landed,
|
|
4674
4734
|
setPending
|
|
4675
4735
|
]);
|
|
4736
|
+
useEffect(() => {
|
|
4737
|
+
if (stopKind === void 0) return;
|
|
4738
|
+
setPending(null);
|
|
4739
|
+
setFailed({
|
|
4740
|
+
id,
|
|
4741
|
+
message: stopKind === "failed" ? t("panels.market.selfUpdateFailed", { reason: stopReason ?? t("panels.market.selfUpdateUnknown") }) : t("panels.market.selfUpdateRolledBack", { version: stopVersion ?? "?" })
|
|
4742
|
+
});
|
|
4743
|
+
}, [
|
|
4744
|
+
stopKind,
|
|
4745
|
+
stopReason,
|
|
4746
|
+
stopVersion,
|
|
4747
|
+
id,
|
|
4748
|
+
setPending,
|
|
4749
|
+
setFailed,
|
|
4750
|
+
t
|
|
4751
|
+
]);
|
|
4676
4752
|
useEffect(() => {
|
|
4677
4753
|
if (!watching) {
|
|
4678
4754
|
sinceRef.current = 0;
|
|
@@ -4767,20 +4843,20 @@ var MarketPage_module_default = {
|
|
|
4767
4843
|
//#endregion
|
|
4768
4844
|
//#region src/app/layouts/rightbar/MarketStates.tsx
|
|
4769
4845
|
function MarketChecking({ t }) {
|
|
4770
|
-
return /* @__PURE__ */
|
|
4846
|
+
return /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ createElement(Spinner, { size: 14 }), t("panels.market.checking")));
|
|
4771
4847
|
}
|
|
4772
4848
|
function MarketEmpty({ t }) {
|
|
4773
|
-
return /* @__PURE__ */
|
|
4849
|
+
return /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
|
|
4774
4850
|
}
|
|
4775
4851
|
//#endregion
|
|
4776
4852
|
//#region src/app/layouts/rightbar/market-section-icon.ts
|
|
4777
4853
|
var SIZE$1 = 14;
|
|
4778
4854
|
function marketSectionIcon(kind) {
|
|
4779
4855
|
switch (kind) {
|
|
4780
|
-
case "installed": return
|
|
4781
|
-
case "pending": return
|
|
4782
|
-
case "plugins": return
|
|
4783
|
-
case "shared": return
|
|
4856
|
+
case "installed": return createElement(IconModules, { size: SIZE$1 });
|
|
4857
|
+
case "pending": return createElement(IconDownloadOutlineRegular, { size: SIZE$1 });
|
|
4858
|
+
case "plugins": return createElement(IconCordisPluginOutlineRegular, { size: SIZE$1 });
|
|
4859
|
+
case "shared": return createElement(IconLinkOutlineRegular, { size: SIZE$1 });
|
|
4784
4860
|
}
|
|
4785
4861
|
}
|
|
4786
4862
|
//#endregion
|
|
@@ -4788,10 +4864,10 @@ function marketSectionIcon(kind) {
|
|
|
4788
4864
|
var SIZE = 18;
|
|
4789
4865
|
function packageIcon(kind) {
|
|
4790
4866
|
switch (kind) {
|
|
4791
|
-
case "module": return
|
|
4792
|
-
case "plugin": return
|
|
4793
|
-
case "lib": return
|
|
4794
|
-
case "workbench": return
|
|
4867
|
+
case "module": return createElement(IconModuleMark, { size: SIZE });
|
|
4868
|
+
case "plugin": return createElement(IconOpencli, { size: SIZE });
|
|
4869
|
+
case "lib": return createElement(IconNpm, { size: SIZE });
|
|
4870
|
+
case "workbench": return createElement(IconPanelScreen, { size: SIZE });
|
|
4795
4871
|
}
|
|
4796
4872
|
}
|
|
4797
4873
|
function marketRowKind(row) {
|
|
@@ -4834,8 +4910,9 @@ function holdOf(pending, application) {
|
|
|
4834
4910
|
row: pending.row
|
|
4835
4911
|
};
|
|
4836
4912
|
}
|
|
4837
|
-
function pendingLanded(pending, updates, capabilities, installed) {
|
|
4913
|
+
function pendingLanded(pending, updates, capabilities, installed, shared = [], plugins = null) {
|
|
4838
4914
|
if (pending === null) return true;
|
|
4915
|
+
if (pending.action === "update" && capabilities === null) return false;
|
|
4839
4916
|
return settleLanded({
|
|
4840
4917
|
action: pending.action,
|
|
4841
4918
|
until: pending.until,
|
|
@@ -4843,7 +4920,9 @@ function pendingLanded(pending, updates, capabilities, installed) {
|
|
|
4843
4920
|
installed,
|
|
4844
4921
|
entry: updates[pending.id],
|
|
4845
4922
|
clicked: pending.version,
|
|
4846
|
-
outdated: capabilityOutdated(capabilities, pending.id)
|
|
4923
|
+
outdated: capabilityOutdated(capabilities, pending.id),
|
|
4924
|
+
...pending.action === "update-dependency" ? { sharedState: shared.find((row) => row.id === pending.id)?.state } : {},
|
|
4925
|
+
...pending.action === "update-plugin" ? { pluginOutdated: plugins === null ? null : plugins.find((row) => row.id === pending.id)?.canUpdate ?? false } : {}
|
|
4847
4926
|
});
|
|
4848
4927
|
}
|
|
4849
4928
|
function holdExpired(held, backInRoster, elapsedMs) {
|
|
@@ -4924,32 +5003,32 @@ function SharedLine({ t, row, pending, failure, onAct }) {
|
|
|
4924
5003
|
const actions = sharedActions(row);
|
|
4925
5004
|
const stateText = t(SHARED_STATE_KEY[row.state]);
|
|
4926
5005
|
const version = row.version;
|
|
4927
|
-
const name = /* @__PURE__ */
|
|
5006
|
+
const name = /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
|
|
4928
5007
|
from: version.installed,
|
|
4929
5008
|
to: version.latest
|
|
4930
5009
|
}) : version.installed ?? version.latest ?? ""));
|
|
4931
|
-
return /* @__PURE__ */
|
|
5010
|
+
return /* @__PURE__ */ createElement("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ createElement("span", {
|
|
4932
5011
|
className: MarketPage_module_default.marketIcon,
|
|
4933
5012
|
"aria-hidden": "true"
|
|
4934
|
-
}, packageIcon(sharedRowKind(row))), /* @__PURE__ */
|
|
5013
|
+
}, packageIcon(sharedRowKind(row))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketMain }, row.detail === void 0 ? name : /* @__PURE__ */ createElement(Tip, { label: row.detail }, name), /* @__PURE__ */ createElement("span", {
|
|
4935
5014
|
className: MarketPage_module_default.marketDesc,
|
|
4936
5015
|
role: "img",
|
|
4937
5016
|
"aria-label": stateText
|
|
4938
|
-
}, row.state === "checking" ? /* @__PURE__ */
|
|
5017
|
+
}, row.state === "checking" ? /* @__PURE__ */ createElement(Spinner, { size: 14 }) : null, stateText, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ createElement(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ createElement(Button, {
|
|
4939
5018
|
key: action,
|
|
4940
5019
|
type: "button",
|
|
4941
5020
|
size: "sm",
|
|
4942
5021
|
variant: "outline",
|
|
4943
5022
|
disabled: locked,
|
|
4944
5023
|
onClick: () => onAct(action)
|
|
4945
|
-
}, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */
|
|
5024
|
+
}, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketFailure }, failure));
|
|
4946
5025
|
}
|
|
4947
5026
|
function SharedSection({ t, rows, pending, failureOf, act }) {
|
|
4948
5027
|
if (rows.length === 0) return null;
|
|
4949
|
-
return /* @__PURE__ */
|
|
5028
|
+
return /* @__PURE__ */ createElement("section", { className: `${MarketPage_module_default.marketSection} ${MarketPage_module_default.marketSectionQuiet}` }, /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ createElement("span", {
|
|
4950
5029
|
className: MarketPage_module_default.marketSectionIcon,
|
|
4951
5030
|
"aria-hidden": "true"
|
|
4952
|
-
}, marketSectionIcon("shared")), /* @__PURE__ */
|
|
5031
|
+
}, marketSectionIcon("shared")), /* @__PURE__ */ createElement("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ createElement("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ createElement(SharedLine, {
|
|
4953
5032
|
key: row.id,
|
|
4954
5033
|
t,
|
|
4955
5034
|
row,
|
|
@@ -5013,49 +5092,49 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
|
|
|
5013
5092
|
const actions = marketActions$1(row);
|
|
5014
5093
|
const switchLocked = marketSwitchLocked(row);
|
|
5015
5094
|
const stateText = t(MARKET_STATE_KEY[row.state]);
|
|
5016
|
-
return /* @__PURE__ */
|
|
5095
|
+
return /* @__PURE__ */ createElement("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ createElement("span", {
|
|
5017
5096
|
className: MarketPage_module_default.marketIcon,
|
|
5018
5097
|
"aria-hidden": "true"
|
|
5019
|
-
}, packageIcon(marketRowKind(row))), /* @__PURE__ */
|
|
5098
|
+
}, packageIcon(marketRowKind(row))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketName }, marketRowTitle(row, t), row.versionLabel === void 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketVersion }, row.versionLabel), row.version === void 0 || row.versionLabel !== void 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketVersion }, row.version.installed !== void 0 && row.version.latest !== void 0 && row.version.installed !== row.version.latest ? t("panels.market.versionArrow", {
|
|
5020
5099
|
from: row.version.installed,
|
|
5021
5100
|
to: row.version.latest
|
|
5022
|
-
}) : row.version.installed ?? row.version.latest ?? ""), row.local === true ? /* @__PURE__ */
|
|
5101
|
+
}) : row.version.installed ?? row.version.latest ?? ""), row.local === true ? /* @__PURE__ */ createElement(Tip, { label: t("panels.market.localHint") }, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketLocalTag }, t("panels.market.localMark"))) : null), quiet ? null : /* @__PURE__ */ createElement("span", {
|
|
5023
5102
|
className: MarketPage_module_default.marketDesc,
|
|
5024
5103
|
role: "img",
|
|
5025
5104
|
"aria-label": stateText
|
|
5026
|
-
}, row.state === "checking" ? /* @__PURE__ */
|
|
5105
|
+
}, row.state === "checking" ? /* @__PURE__ */ createElement(Spinner, { size: 14 }) : /* @__PURE__ */ createElement(StateDot, {
|
|
5027
5106
|
state: MARKET_DOT[row.state],
|
|
5028
5107
|
size: 9
|
|
5029
|
-
}), stateText, row.hint === void 0 ? null : /* @__PURE__ */
|
|
5108
|
+
}), stateText, row.hint === void 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint)))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ createElement(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
|
|
5030
5109
|
const danger = dangerActions.includes(action);
|
|
5031
5110
|
const update = updateActions.includes(action);
|
|
5032
|
-
return /* @__PURE__ */
|
|
5111
|
+
return /* @__PURE__ */ createElement(Button, {
|
|
5033
5112
|
key: action,
|
|
5034
5113
|
type: "button",
|
|
5035
5114
|
size: "sm",
|
|
5036
5115
|
variant: action === "install" ? "primary" : "outline",
|
|
5037
5116
|
className: danger ? "wb-dangerAction" : update ? MarketPage_module_default.marketUpdateAction : void 0,
|
|
5038
|
-
icon: danger ? /* @__PURE__ */
|
|
5117
|
+
icon: danger ? /* @__PURE__ */ createElement(IconTrashOutlineRegular, { size: 13 }) : void 0,
|
|
5039
5118
|
"aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
|
|
5040
5119
|
disabled: locked,
|
|
5041
5120
|
onClick: () => onAct(action)
|
|
5042
5121
|
}, t(ACTION_LABEL_KEY[action]));
|
|
5043
|
-
})), row.defaultShown === void 0 ? null : /* @__PURE__ */
|
|
5122
|
+
})), row.defaultShown === void 0 ? null : /* @__PURE__ */ createElement(Tip, { label: t(switchLocked ? "panels.market.defaultLocked" : "panels.market.defaultHint") }, /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketSwitchSeat }, /* @__PURE__ */ createElement(Switch, {
|
|
5044
5123
|
checked: row.defaultShown,
|
|
5045
5124
|
disabled: boardBusy === true || locked || switchLocked,
|
|
5046
5125
|
label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
|
|
5047
5126
|
onChange: (next) => onDefault?.(next)
|
|
5048
|
-
})))), row.note === void 0 ? null : /* @__PURE__ */
|
|
5127
|
+
})))), row.note === void 0 ? null : /* @__PURE__ */ createElement("div", {
|
|
5049
5128
|
className: row.note.tone === "plain" ? MarketPage_module_default.marketNotePlain : MarketPage_module_default.marketNote,
|
|
5050
5129
|
title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
|
|
5051
|
-
}, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */
|
|
5130
|
+
}, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketFailure }, failure));
|
|
5052
5131
|
}
|
|
5053
5132
|
function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy }) {
|
|
5054
5133
|
if (rows.length === 0) return null;
|
|
5055
|
-
return /* @__PURE__ */
|
|
5134
|
+
return /* @__PURE__ */ createElement("section", { className: MarketPage_module_default.marketSection }, titleKey === void 0 ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ createElement("span", {
|
|
5056
5135
|
className: MarketPage_module_default.marketSectionIcon,
|
|
5057
5136
|
"aria-hidden": "true"
|
|
5058
|
-
}, icon), /* @__PURE__ */
|
|
5137
|
+
}, icon), /* @__PURE__ */ createElement("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), rows.length === 0 ? null : /* @__PURE__ */ createElement("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), rows.length === 0 ? null : /* @__PURE__ */ createElement("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ createElement(MarketLine, {
|
|
5059
5138
|
key: row.id,
|
|
5060
5139
|
t,
|
|
5061
5140
|
row,
|
|
@@ -5289,8 +5368,63 @@ function changeFailure(change, t) {
|
|
|
5289
5368
|
return failureReason(failureCode(change), change.application, t);
|
|
5290
5369
|
}
|
|
5291
5370
|
//#endregion
|
|
5371
|
+
//#region src/app/layouts/rightbar/market-update-verdict.ts
|
|
5372
|
+
/**
|
|
5373
|
+
* 更新那一拍到底算不算成了:只认**盘上这一版**,不认 `applied` 这个字。
|
|
5374
|
+
* `no-change` = 点下去那版和盘上一样;`gone` = 跑完读不到模块(`restored` 是回滚成功的版本);
|
|
5375
|
+
* `behind` = 版本动了但没到源上最新。`ok` 之外都要给用户一句失败原因。
|
|
5376
|
+
* @param input.clicked 点下去那一刻盘上的版本;`latest` 当时源上最新那一版。
|
|
5377
|
+
*/
|
|
5378
|
+
function updateVerdictOf(input) {
|
|
5379
|
+
if (input.action !== "update-bundle") return { kind: "ok" };
|
|
5380
|
+
if (input.restored !== void 0 || input.change?.errorCode === "module-gone" || input.module !== void 0 && input.module.kind !== "module") return {
|
|
5381
|
+
kind: "gone",
|
|
5382
|
+
...input.restored === void 0 ? {} : { restored: input.restored }
|
|
5383
|
+
};
|
|
5384
|
+
const installed = input.module?.version;
|
|
5385
|
+
if (input.change?.errorCode === "no-change") return { kind: "no-change" };
|
|
5386
|
+
if (installed === void 0) return { kind: "ok" };
|
|
5387
|
+
if (input.clicked !== void 0 && installed === input.clicked) return { kind: "no-change" };
|
|
5388
|
+
if (input.latest !== void 0 && installed !== input.latest) return {
|
|
5389
|
+
kind: "behind",
|
|
5390
|
+
installed
|
|
5391
|
+
};
|
|
5392
|
+
return { kind: "ok" };
|
|
5393
|
+
}
|
|
5394
|
+
/**
|
|
5395
|
+
* 把判死的更新结果翻成那一行底下的一句人话;`ok` 给 `undefined`。
|
|
5396
|
+
* @param input.from 点下去那版(`no-change` 要说清"还是它")。
|
|
5397
|
+
*/
|
|
5398
|
+
function updateVerdictText(verdict, t, input) {
|
|
5399
|
+
if (verdict.kind === "no-change") return t("panels.market.updateNoChange", {
|
|
5400
|
+
from: input.from ?? "?",
|
|
5401
|
+
latest: input.latest ?? t("panels.market.updateUnknownVersion")
|
|
5402
|
+
});
|
|
5403
|
+
if (verdict.kind === "gone") return verdict.restored === void 0 ? t("panels.market.updateGone") : t("panels.market.updateRestored", { version: verdict.restored });
|
|
5404
|
+
if (verdict.kind === "behind") return t("panels.market.updateBehind", {
|
|
5405
|
+
installed: verdict.installed,
|
|
5406
|
+
latest: input.latest ?? t("panels.market.updateUnknownVersion")
|
|
5407
|
+
});
|
|
5408
|
+
}
|
|
5409
|
+
//#endregion
|
|
5292
5410
|
//#region src/app/layouts/rightbar/market-act.ts
|
|
5293
5411
|
var STEADY_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
|
|
5412
|
+
function recordOf(value) {
|
|
5413
|
+
return typeof value === "object" && value !== null ? value : void 0;
|
|
5414
|
+
}
|
|
5415
|
+
function moduleOf(value) {
|
|
5416
|
+
const module = recordOf(recordOf(value)?.module);
|
|
5417
|
+
if (module === void 0) return void 0;
|
|
5418
|
+
return {
|
|
5419
|
+
...typeof module.kind === "string" ? { kind: module.kind } : {},
|
|
5420
|
+
...typeof module.pkg === "string" ? { pkg: module.pkg } : {},
|
|
5421
|
+
...typeof module.version === "string" ? { version: module.version } : {}
|
|
5422
|
+
};
|
|
5423
|
+
}
|
|
5424
|
+
function restoredOf(value) {
|
|
5425
|
+
const restored = recordOf(value)?.restored;
|
|
5426
|
+
return typeof restored === "string" && restored !== "" ? restored : void 0;
|
|
5427
|
+
}
|
|
5294
5428
|
function marketActOf(options) {
|
|
5295
5429
|
const { t, mocked, rowOf, seats, send, onChanged } = options;
|
|
5296
5430
|
return async (id, action) => {
|
|
@@ -5300,10 +5434,12 @@ function marketActOf(options) {
|
|
|
5300
5434
|
const next = {
|
|
5301
5435
|
id,
|
|
5302
5436
|
action,
|
|
5437
|
+
since: Date.now(),
|
|
5303
5438
|
...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
|
|
5304
5439
|
...label === void 0 ? {} : { label },
|
|
5305
5440
|
...row?.pkg === void 0 ? {} : { pkg: row.pkg },
|
|
5306
5441
|
...row?.version?.installed === void 0 ? {} : { version: row.version.installed },
|
|
5442
|
+
...row?.version?.latest === void 0 ? {} : { latest: row.version.latest },
|
|
5307
5443
|
...row === void 0 || !STEADY_ACTIONS.has(action) ? {} : { row: label === void 0 ? row : {
|
|
5308
5444
|
...row,
|
|
5309
5445
|
label
|
|
@@ -5324,27 +5460,48 @@ function marketActOf(options) {
|
|
|
5324
5460
|
unit: id
|
|
5325
5461
|
});
|
|
5326
5462
|
if (!outcome.ok) {
|
|
5463
|
+
onChanged({ force: true });
|
|
5327
5464
|
seats.setPending(null);
|
|
5328
5465
|
seats.setHeld(void 0);
|
|
5329
|
-
onChanged();
|
|
5330
5466
|
seats.setFailed({
|
|
5331
5467
|
id,
|
|
5332
5468
|
message: t("panels.market.failed", { reason: outcome.message })
|
|
5333
5469
|
});
|
|
5334
5470
|
return;
|
|
5335
5471
|
}
|
|
5336
|
-
const
|
|
5337
|
-
const
|
|
5338
|
-
const
|
|
5472
|
+
const value = outcome.value;
|
|
5473
|
+
const change = changeOf(value);
|
|
5474
|
+
const failure = updateVerdictText(updateVerdictOf({
|
|
5475
|
+
action,
|
|
5476
|
+
change,
|
|
5477
|
+
module: moduleOf(value),
|
|
5478
|
+
restored: restoredOf(value),
|
|
5479
|
+
clicked: next.version,
|
|
5480
|
+
latest: next.latest
|
|
5481
|
+
}), t, {
|
|
5482
|
+
...next.version === void 0 ? {} : { from: next.version },
|
|
5483
|
+
...next.latest === void 0 ? {} : { latest: next.latest }
|
|
5484
|
+
});
|
|
5485
|
+
onChanged({ force: true });
|
|
5486
|
+
if (failure !== void 0) {
|
|
5487
|
+
seats.setPending(null);
|
|
5488
|
+
seats.setHeld(void 0);
|
|
5489
|
+
seats.setFailed({
|
|
5490
|
+
id,
|
|
5491
|
+
message: failure
|
|
5492
|
+
});
|
|
5493
|
+
return;
|
|
5494
|
+
}
|
|
5495
|
+
const until = swapUntil(action, change?.application, next.latest);
|
|
5496
|
+
const readBack = awaitsReadBack(action, change?.application ?? (action === "update" || action === "update-dependency" || action === "update-plugin" ? "applied" : void 0), next.version);
|
|
5339
5497
|
seats.setPending(until === void 0 && !readBack ? null : {
|
|
5340
5498
|
...next,
|
|
5341
5499
|
...until === void 0 ? {} : { until },
|
|
5342
5500
|
...readBack ? { readBack: true } : {}
|
|
5343
5501
|
});
|
|
5344
5502
|
seats.setHeld(readBack ? void 0 : holdOf(next, change?.application));
|
|
5345
|
-
if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(
|
|
5503
|
+
if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(value, t));
|
|
5346
5504
|
const reason = changeFailure(change, t);
|
|
5347
|
-
onChanged();
|
|
5348
5505
|
if (reason !== void 0) seats.setFailed({
|
|
5349
5506
|
id,
|
|
5350
5507
|
message: t("panels.market.failed", { reason })
|
|
@@ -5365,7 +5522,7 @@ var PanelFoot_module_default = {
|
|
|
5365
5522
|
* @param props.children - 右侧那一格内容(一般是按钮或状态),可省略。
|
|
5366
5523
|
*/
|
|
5367
5524
|
function PanelFoot({ text, size = "sm", children }) {
|
|
5368
|
-
return /* @__PURE__ */
|
|
5525
|
+
return /* @__PURE__ */ createElement("footer", { className: PanelFoot_module_default.foot }, text === void 0 ? null : /* @__PURE__ */ createElement("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
|
|
5369
5526
|
}
|
|
5370
5527
|
//#endregion
|
|
5371
5528
|
//#region src/app/layouts/rightbar/MarketView.tsx
|
|
@@ -5376,7 +5533,7 @@ var CONFIRM_UNINSTALL = [
|
|
|
5376
5533
|
];
|
|
5377
5534
|
function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
|
|
5378
5535
|
const [acknowledged, setAcknowledged] = useState(false);
|
|
5379
|
-
return /* @__PURE__ */
|
|
5536
|
+
return /* @__PURE__ */ createElement(RiskConfirmation, {
|
|
5380
5537
|
open: name !== null,
|
|
5381
5538
|
title: t("panels.market.confirmUninstallTitle", { name: name ?? "" }),
|
|
5382
5539
|
description: t("panels.market.confirmUninstallDetail"),
|
|
@@ -5393,7 +5550,7 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
|
|
|
5393
5550
|
function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy }) {
|
|
5394
5551
|
const failureOf = (id) => failed?.id === id ? failed.message : null;
|
|
5395
5552
|
const foot = marketFootVisible(shown, installedList);
|
|
5396
|
-
return /* @__PURE__ */
|
|
5553
|
+
return /* @__PURE__ */ createElement(Fragment, null, notice === null ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketNote }, notice), /* @__PURE__ */ createElement(MarketSection, {
|
|
5397
5554
|
t,
|
|
5398
5555
|
rows: self === void 0 ? [] : [self],
|
|
5399
5556
|
onDefault: setDefault,
|
|
@@ -5403,10 +5560,10 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
|
|
|
5403
5560
|
act,
|
|
5404
5561
|
confirmActions: CONFIRM_UNINSTALL,
|
|
5405
5562
|
onConfirming
|
|
5406
|
-
}), self === void 0 ? null : /* @__PURE__ */
|
|
5563
|
+
}), self === void 0 ? null : /* @__PURE__ */ createElement("div", {
|
|
5407
5564
|
className: MarketPage_module_default.marketSelfDivider,
|
|
5408
5565
|
"aria-hidden": "true"
|
|
5409
|
-
}), marketSections(marketOrder([...shown, ...installedList], (row) => marketRowTitle(row, t))).map((section) => /* @__PURE__ */
|
|
5566
|
+
}), marketSections(marketOrder([...shown, ...installedList], (row) => marketRowTitle(row, t))).map((section) => /* @__PURE__ */ createElement(MarketSection, {
|
|
5410
5567
|
key: section.id,
|
|
5411
5568
|
t,
|
|
5412
5569
|
titleKey: section.titleKey,
|
|
@@ -5419,7 +5576,7 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
|
|
|
5419
5576
|
act,
|
|
5420
5577
|
confirmActions: CONFIRM_UNINSTALL,
|
|
5421
5578
|
onConfirming
|
|
5422
|
-
})), /* @__PURE__ */
|
|
5579
|
+
})), /* @__PURE__ */ createElement(MarketSection, {
|
|
5423
5580
|
t,
|
|
5424
5581
|
titleKey: "panels.market.sectionPlugins",
|
|
5425
5582
|
icon: marketSectionIcon("plugins"),
|
|
@@ -5431,10 +5588,10 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
|
|
|
5431
5588
|
act,
|
|
5432
5589
|
confirmActions: CONFIRM_UNINSTALL,
|
|
5433
5590
|
onConfirming
|
|
5434
|
-
}), foot ? /* @__PURE__ */
|
|
5591
|
+
}), foot ? /* @__PURE__ */ createElement(PanelFoot, {
|
|
5435
5592
|
size: "md",
|
|
5436
5593
|
text: t("panels.market.foot")
|
|
5437
|
-
}) : null, /* @__PURE__ */
|
|
5594
|
+
}) : null, /* @__PURE__ */ createElement(SharedSection, {
|
|
5438
5595
|
t,
|
|
5439
5596
|
rows: shared,
|
|
5440
5597
|
pending,
|
|
@@ -5442,7 +5599,8 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
|
|
|
5442
5599
|
act
|
|
5443
5600
|
}));
|
|
5444
5601
|
}
|
|
5445
|
-
function
|
|
5602
|
+
function useMarketScene(input) {
|
|
5603
|
+
const { manifests, installable, capabilities, updates, installed, settling, mock, defaults, changed, pending, failed } = input;
|
|
5446
5604
|
const titles = useMarketTitles(manifests, mock !== void 0);
|
|
5447
5605
|
const catalog = mock?.manifests ?? manifests;
|
|
5448
5606
|
const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
|
|
@@ -5452,10 +5610,44 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
5452
5610
|
const updateMap = mock?.updates ?? updates ?? {};
|
|
5453
5611
|
const rows = marketRows(source, effective, updateMap, byDefault, changed);
|
|
5454
5612
|
const shared = sharedRows(source, effective);
|
|
5613
|
+
const removing = removingIdOf(pending, failed);
|
|
5614
|
+
const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
|
|
5615
|
+
const pinned = pinnedRowOf(pending, steady.held);
|
|
5616
|
+
const busyId = heldIdOf(pending, steady.held);
|
|
5617
|
+
return {
|
|
5618
|
+
titles,
|
|
5619
|
+
catalog,
|
|
5620
|
+
effective,
|
|
5621
|
+
updateMap,
|
|
5622
|
+
rows,
|
|
5623
|
+
shared,
|
|
5624
|
+
installedList: installedRows((mock?.installed ?? installed ?? []).filter((module) => module.unit !== pinned?.id && (!(settling?.has(module.unit) ?? false) || module.unit === busyId) && module.unit !== removing), catalog, new Set(rows.map((row) => row.id)), titles, byDefault, changed),
|
|
5625
|
+
byDefault,
|
|
5626
|
+
steady,
|
|
5627
|
+
pinned,
|
|
5628
|
+
removing,
|
|
5629
|
+
busyId
|
|
5630
|
+
};
|
|
5631
|
+
}
|
|
5632
|
+
function MarketView({ t, manifests, installable, capabilities, freshness, onChanged, onPending, updates, installed, installedRead, workbench, selfUpdate, plugins, settling, mock, defaults = [], changed = {} }) {
|
|
5455
5633
|
const { pending, setPending, confirming, setConfirming, failed, setFailed, notice, setNotice } = useMarketTransient({
|
|
5456
5634
|
mock,
|
|
5457
5635
|
onPending
|
|
5458
5636
|
});
|
|
5637
|
+
const { titles, effective, updateMap, rows, shared, installedList, byDefault, steady, pinned, removing, busyId } = useMarketScene({
|
|
5638
|
+
manifests,
|
|
5639
|
+
installable,
|
|
5640
|
+
capabilities,
|
|
5641
|
+
updates,
|
|
5642
|
+
installed,
|
|
5643
|
+
settling,
|
|
5644
|
+
mock,
|
|
5645
|
+
defaults,
|
|
5646
|
+
changed,
|
|
5647
|
+
pending,
|
|
5648
|
+
failed
|
|
5649
|
+
});
|
|
5650
|
+
usePublishMarketBusy(busyId);
|
|
5459
5651
|
const provision = useHostWrite({
|
|
5460
5652
|
channel: "provision",
|
|
5461
5653
|
networkText: t("panels.failed")
|
|
@@ -5483,21 +5675,16 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
5483
5675
|
setNotice(t("panels.failed"));
|
|
5484
5676
|
}
|
|
5485
5677
|
};
|
|
5486
|
-
const removing = removingIdOf(pending, failed);
|
|
5487
|
-
const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
|
|
5488
|
-
const pinned = pinnedRowOf(pending, steady.held);
|
|
5489
|
-
usePublishMarketBusy(heldIdOf(pending, steady.held));
|
|
5490
|
-
const installedList = installedRows((mock?.installed ?? installed ?? []).filter((module) => module.unit !== pinned?.id && (!(settling?.has(module.unit) ?? false) || module.unit === heldIdOf(pending, steady.held)) && module.unit !== removing), catalog, new Set(rows.map((row) => row.id)), titles, byDefault, changed);
|
|
5491
5678
|
const pendingRow = pendingRowOf({
|
|
5492
5679
|
pending,
|
|
5493
5680
|
removing,
|
|
5494
5681
|
rows,
|
|
5495
5682
|
titles
|
|
5496
5683
|
});
|
|
5497
|
-
const
|
|
5684
|
+
const self = workbenchRow(mock === void 0 ? workbench : mock.workbench);
|
|
5498
5685
|
const shown = withPinnedRow(pendingRow === void 0 ? rows : [...rows, pendingRow], pinned);
|
|
5499
|
-
const
|
|
5500
|
-
const pluginList = installedPluginRows(
|
|
5686
|
+
const pluginSource = mock?.plugins ?? plugins ?? null;
|
|
5687
|
+
const pluginList = installedPluginRows(pluginSource ?? [], byDefault, changed);
|
|
5501
5688
|
const rowById = new Map([
|
|
5502
5689
|
...shown,
|
|
5503
5690
|
...self === void 0 ? [] : [self],
|
|
@@ -5522,17 +5709,18 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
5522
5709
|
});
|
|
5523
5710
|
useSettleHold({
|
|
5524
5711
|
pending,
|
|
5525
|
-
landed: pendingLanded(pending, updateMap, effective, workbench?.installed),
|
|
5712
|
+
landed: pendingLanded(pending, updateMap, effective, workbench?.installed, shared, pluginSource === null ? null : pluginList),
|
|
5526
5713
|
t,
|
|
5527
5714
|
onChanged,
|
|
5715
|
+
selfUpdate: mock?.selfUpdate ?? selfUpdate,
|
|
5528
5716
|
setPending,
|
|
5529
5717
|
setFailed
|
|
5530
5718
|
});
|
|
5531
5719
|
const settled = marketSettled(freshness, installedRead);
|
|
5532
5720
|
const nothing = shown.length === 0 && self === void 0 && installedList.length === 0 && pluginList.length === 0;
|
|
5533
|
-
if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */
|
|
5534
|
-
if (nothing) return /* @__PURE__ */
|
|
5535
|
-
return /* @__PURE__ */
|
|
5721
|
+
if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ createElement(MarketChecking, { t });
|
|
5722
|
+
if (nothing) return /* @__PURE__ */ createElement(MarketEmpty, { t });
|
|
5723
|
+
return /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(MarketBody, {
|
|
5536
5724
|
t,
|
|
5537
5725
|
self,
|
|
5538
5726
|
shown,
|
|
@@ -5546,7 +5734,7 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
5546
5734
|
onConfirming: setConfirming,
|
|
5547
5735
|
setDefault,
|
|
5548
5736
|
boardBusy
|
|
5549
|
-
}), /* @__PURE__ */
|
|
5737
|
+
}), /* @__PURE__ */ createElement(ConfirmUninstall, {
|
|
5550
5738
|
key: confirming ?? "",
|
|
5551
5739
|
t,
|
|
5552
5740
|
name: confirmingRow === void 0 ? null : marketRowTitle(confirmingRow, t),
|
|
@@ -5850,23 +6038,61 @@ function attentionWordLabel(attention, t) {
|
|
|
5850
6038
|
}
|
|
5851
6039
|
//#endregion
|
|
5852
6040
|
//#region src/app/layouts/project-selection.ts
|
|
5853
|
-
var listeners$
|
|
6041
|
+
var listeners$3 = /* @__PURE__ */ new Set();
|
|
5854
6042
|
function selectedProjectId() {
|
|
5855
6043
|
const stored = readText(STORAGE_KEY_PROJECT);
|
|
5856
6044
|
return stored === "" ? null : stored;
|
|
5857
6045
|
}
|
|
5858
6046
|
function selectProject(workspaceId) {
|
|
5859
6047
|
writeText(STORAGE_KEY_PROJECT, workspaceId);
|
|
5860
|
-
for (const listener of [...listeners$
|
|
6048
|
+
for (const listener of [...listeners$3]) try {
|
|
5861
6049
|
listener();
|
|
5862
6050
|
} catch {}
|
|
5863
6051
|
}
|
|
5864
6052
|
function subscribeProject(listener) {
|
|
6053
|
+
listeners$3.add(listener);
|
|
6054
|
+
return () => {
|
|
6055
|
+
listeners$3.delete(listener);
|
|
6056
|
+
};
|
|
6057
|
+
}
|
|
6058
|
+
//#endregion
|
|
6059
|
+
//#region src/app/layouts/sidebar/edition.ts
|
|
6060
|
+
var runtime$1 = "official";
|
|
6061
|
+
var listeners$2 = /* @__PURE__ */ new Set();
|
|
6062
|
+
/**
|
|
6063
|
+
* 这一屏启动时按哪一档左栏渲染;组合层决定的,改它要刷新页面。
|
|
6064
|
+
* @returns 运行态档位(默认官方)。
|
|
6065
|
+
*/
|
|
6066
|
+
function runtimeSidebarEdition() {
|
|
6067
|
+
return runtime$1;
|
|
6068
|
+
}
|
|
6069
|
+
/**
|
|
6070
|
+
* 记下这一屏的左栏档位(只在启动时由客户端调用一次)。
|
|
6071
|
+
* @param next 读到的档位。
|
|
6072
|
+
*/
|
|
6073
|
+
function setRuntimeSidebarEdition(next) {
|
|
6074
|
+
if (next === runtime$1) return;
|
|
6075
|
+
runtime$1 = next;
|
|
6076
|
+
for (const listener of listeners$2) listener();
|
|
6077
|
+
}
|
|
6078
|
+
/**
|
|
6079
|
+
* 订阅运行态档位的变化(目前只在启动时变一次)。
|
|
6080
|
+
* @param listener 变化时的回调。
|
|
6081
|
+
* @returns 取消订阅。
|
|
6082
|
+
*/
|
|
6083
|
+
function subscribeSidebarEdition(listener) {
|
|
5865
6084
|
listeners$2.add(listener);
|
|
5866
6085
|
return () => {
|
|
5867
6086
|
listeners$2.delete(listener);
|
|
5868
6087
|
};
|
|
5869
6088
|
}
|
|
6089
|
+
/**
|
|
6090
|
+
* 组件里读运行态档位(启动后解析出来才变一次,变了会重渲染)。
|
|
6091
|
+
* @returns 运行态档位。
|
|
6092
|
+
*/
|
|
6093
|
+
function useRuntimeSidebarEdition() {
|
|
6094
|
+
return useSyncExternalStore(subscribeSidebarEdition, runtimeSidebarEdition, runtimeSidebarEdition);
|
|
6095
|
+
}
|
|
5870
6096
|
//#endregion
|
|
5871
6097
|
//#region src/app/layouts/rightbar/use-panels.ts
|
|
5872
6098
|
function shouldDropPanels(workspace, previous) {
|
|
@@ -5875,6 +6101,7 @@ function shouldDropPanels(workspace, previous) {
|
|
|
5875
6101
|
function useEnabledUnits(refreshToken, workspace) {
|
|
5876
6102
|
const [enabled, setEnabled] = useState(null);
|
|
5877
6103
|
const lastWorkspace = useRef(workspace);
|
|
6104
|
+
const factRev = useFactRevision("panels");
|
|
5878
6105
|
useEffect(() => {
|
|
5879
6106
|
let cancelled = false;
|
|
5880
6107
|
if (shouldDropPanels(workspace, lastWorkspace.current)) {
|
|
@@ -5898,7 +6125,7 @@ function useEnabledUnits(refreshToken, workspace) {
|
|
|
5898
6125
|
};
|
|
5899
6126
|
}, [
|
|
5900
6127
|
refreshToken,
|
|
5901
|
-
|
|
6128
|
+
factRev,
|
|
5902
6129
|
workspace
|
|
5903
6130
|
]);
|
|
5904
6131
|
return enabled;
|
|
@@ -5910,7 +6137,10 @@ function useSelectedProjectId() {
|
|
|
5910
6137
|
}
|
|
5911
6138
|
function useBoardWorkspace(workspaces, sessions) {
|
|
5912
6139
|
const projectId = useSelectedProjectId();
|
|
5913
|
-
const
|
|
6140
|
+
const edition = useRuntimeSidebarEdition();
|
|
6141
|
+
const fromProject = workspaces.items.find((item) => item.workspaceId === projectId) ?? null;
|
|
6142
|
+
const fromSession = workspaceOfSession(workspaces.items, currentSessionId(sessions, false));
|
|
6143
|
+
const workspace = edition === "official" ? fromSession ?? fromProject : fromProject ?? fromSession;
|
|
5914
6144
|
return {
|
|
5915
6145
|
workspace,
|
|
5916
6146
|
path: workspace?.path ?? null
|
|
@@ -5953,12 +6183,11 @@ function readModuleVersions(force = false) {
|
|
|
5953
6183
|
function readInstalledPlugins(force = false) {
|
|
5954
6184
|
return apiGet(INSTALLED_PLUGINS_ROUTE, force ? { force: "1" } : void 0);
|
|
5955
6185
|
}
|
|
5956
|
-
//#endregion
|
|
5957
|
-
//#region src/app/layouts/market/use-module-versions.ts
|
|
5958
6186
|
var state = {
|
|
5959
6187
|
modules: null,
|
|
5960
6188
|
plugins: null,
|
|
5961
6189
|
workbench: null,
|
|
6190
|
+
selfUpdate: null,
|
|
5962
6191
|
read: false,
|
|
5963
6192
|
checkedAt: null
|
|
5964
6193
|
};
|
|
@@ -5966,6 +6195,14 @@ var listeners$1 = /* @__PURE__ */ new Set();
|
|
|
5966
6195
|
var inFlight = null;
|
|
5967
6196
|
var readSeq = 0;
|
|
5968
6197
|
var newestForceSeq = -1;
|
|
6198
|
+
var epoch = 0;
|
|
6199
|
+
/**
|
|
6200
|
+
* 写完之后把读数作废:这之前发出去的在飞读取即使回来也不许再发布(它读的是改之前的盘)。
|
|
6201
|
+
* 每次写成功都调用一次,再配一次 `force + fresh` 的读。
|
|
6202
|
+
*/
|
|
6203
|
+
function bumpModuleVersionsEpoch() {
|
|
6204
|
+
epoch += 1;
|
|
6205
|
+
}
|
|
5969
6206
|
function moduleVersionsValue() {
|
|
5970
6207
|
return state;
|
|
5971
6208
|
}
|
|
@@ -5979,11 +6216,13 @@ function publish(next) {
|
|
|
5979
6216
|
state = next;
|
|
5980
6217
|
for (const listener of [...listeners$1]) listener();
|
|
5981
6218
|
}
|
|
5982
|
-
function runModuleVersionsRead(force = false) {
|
|
5983
|
-
|
|
6219
|
+
function runModuleVersionsRead(force = false, fresh = false) {
|
|
6220
|
+
const at = epoch;
|
|
6221
|
+
if (!fresh && inFlight !== null && inFlight.force === force && inFlight.epoch === at) return inFlight.promise;
|
|
5984
6222
|
const seq = readSeq += 1;
|
|
5985
6223
|
if (force) newestForceSeq = seq;
|
|
5986
6224
|
const promise = Promise.all([readModuleVersions(force), readInstalledPlugins(force)]).catch(() => null).then((responses) => {
|
|
6225
|
+
if (at !== epoch) return;
|
|
5987
6226
|
if (!force && seq < newestForceSeq) return;
|
|
5988
6227
|
const versions = responses?.[0];
|
|
5989
6228
|
const plugins = responses?.[1];
|
|
@@ -5991,6 +6230,7 @@ function runModuleVersionsRead(force = false) {
|
|
|
5991
6230
|
modules: versions?.ok === true ? versions.modules : state.modules,
|
|
5992
6231
|
plugins: plugins?.ok === true ? plugins.plugins : state.plugins,
|
|
5993
6232
|
workbench: versions?.ok === true ? versions.workbench ?? null : state.workbench,
|
|
6233
|
+
selfUpdate: versions?.ok === true ? versions.selfUpdate ?? null : state.selfUpdate,
|
|
5994
6234
|
read: true,
|
|
5995
6235
|
checkedAt: Date.now()
|
|
5996
6236
|
});
|
|
@@ -5999,6 +6239,7 @@ function runModuleVersionsRead(force = false) {
|
|
|
5999
6239
|
});
|
|
6000
6240
|
inFlight = {
|
|
6001
6241
|
force,
|
|
6242
|
+
epoch: at,
|
|
6002
6243
|
promise
|
|
6003
6244
|
};
|
|
6004
6245
|
return promise;
|
|
@@ -6018,12 +6259,13 @@ function useModuleVersions() {
|
|
|
6018
6259
|
runModuleVersionsRead(false);
|
|
6019
6260
|
}, [factRev]);
|
|
6020
6261
|
const reload = useCallback((options) => {
|
|
6021
|
-
runModuleVersionsRead(options?.force === true);
|
|
6262
|
+
runModuleVersionsRead(options?.force === true, options?.fresh === true);
|
|
6022
6263
|
}, []);
|
|
6023
6264
|
return {
|
|
6024
6265
|
modules: value.modules,
|
|
6025
6266
|
plugins: value.plugins,
|
|
6026
6267
|
workbench: value.workbench,
|
|
6268
|
+
selfUpdate: value.selfUpdate,
|
|
6027
6269
|
read: value.read,
|
|
6028
6270
|
checkedAt: value.checkedAt,
|
|
6029
6271
|
reload
|
|
@@ -6101,7 +6343,7 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6101
6343
|
useDismissOnOutsidePointer(registryRoot, state.registryOpen, (next) => {
|
|
6102
6344
|
if (!next) state.closeRegistry();
|
|
6103
6345
|
});
|
|
6104
|
-
return /* @__PURE__ */
|
|
6346
|
+
return /* @__PURE__ */ createElement("div", {
|
|
6105
6347
|
className: AddModule_module_default.registryWrap,
|
|
6106
6348
|
ref: registryRoot,
|
|
6107
6349
|
onKeyDown: (event) => {
|
|
@@ -6109,7 +6351,7 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6109
6351
|
event.stopPropagation();
|
|
6110
6352
|
state.closeRegistry();
|
|
6111
6353
|
}
|
|
6112
|
-
}, /* @__PURE__ */
|
|
6354
|
+
}, /* @__PURE__ */ createElement("button", {
|
|
6113
6355
|
type: "button",
|
|
6114
6356
|
ref: registryAnchor,
|
|
6115
6357
|
className: AddModule_module_default.registryToggle,
|
|
@@ -6118,7 +6360,7 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6118
6360
|
"aria-controls": REGISTRY_ID,
|
|
6119
6361
|
disabled: state.phase === "inspecting",
|
|
6120
6362
|
onClick: state.toggleRegistry
|
|
6121
|
-
}, /* @__PURE__ */
|
|
6363
|
+
}, /* @__PURE__ */ createElement("span", null, t("panels.market.add.registryToggle")), " ", /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryChosen }, chosen === void 0 ? t("panels.market.add.registryDefault") : registryName(chosen, t)), /* @__PURE__ */ createElement(IconChevronDownOutlineRegular, { size: 14 })), state.registryOpen ? /* @__PURE__ */ createElement("div", {
|
|
6122
6364
|
id: REGISTRY_ID,
|
|
6123
6365
|
className: AddModule_module_default.registry,
|
|
6124
6366
|
ref: registryPanel,
|
|
@@ -6127,17 +6369,17 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6127
6369
|
style: registryPosition ?? void 0
|
|
6128
6370
|
}, state.choices.map((option) => {
|
|
6129
6371
|
const active = option.choice.kind === state.choice.kind && option.choice.value === state.choice.value;
|
|
6130
|
-
if (!(option.choice.kind === "custom")) return /* @__PURE__ */
|
|
6372
|
+
if (!(option.choice.kind === "custom")) return /* @__PURE__ */ createElement("label", {
|
|
6131
6373
|
key: `${option.choice.kind}|${option.choice.value}`,
|
|
6132
6374
|
className: AddModule_module_default.registryOption,
|
|
6133
6375
|
"data-checked": active
|
|
6134
|
-
}, /* @__PURE__ */
|
|
6376
|
+
}, /* @__PURE__ */ createElement("input", {
|
|
6135
6377
|
type: "radio",
|
|
6136
6378
|
name: REGISTRY_ID,
|
|
6137
6379
|
checked: active,
|
|
6138
6380
|
onChange: () => state.setChoice(option.choice)
|
|
6139
|
-
}), /* @__PURE__ */
|
|
6140
|
-
return /* @__PURE__ */
|
|
6381
|
+
}), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ createElement("span", null, optionLabel(option, t))));
|
|
6382
|
+
return /* @__PURE__ */ createElement("div", {
|
|
6141
6383
|
key: `${option.choice.kind}|${option.choice.value}`,
|
|
6142
6384
|
className: AddModule_module_default.registryOption,
|
|
6143
6385
|
"data-checked": active,
|
|
@@ -6147,12 +6389,12 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6147
6389
|
onFocusCapture: () => {
|
|
6148
6390
|
if (!active) state.setChoice(option.choice);
|
|
6149
6391
|
}
|
|
6150
|
-
}, /* @__PURE__ */
|
|
6392
|
+
}, /* @__PURE__ */ createElement("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ createElement("input", {
|
|
6151
6393
|
type: "radio",
|
|
6152
6394
|
name: REGISTRY_ID,
|
|
6153
6395
|
checked: active,
|
|
6154
6396
|
onChange: () => state.setChoice(option.choice)
|
|
6155
|
-
}), /* @__PURE__ */
|
|
6397
|
+
}), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ createElement("span", null, t("panels.market.add.registryCustom")))), /* @__PURE__ */ createElement(TextField, {
|
|
6156
6398
|
type: "text",
|
|
6157
6399
|
className: AddModule_module_default.registryField,
|
|
6158
6400
|
"aria-label": t("panels.market.add.registryCustom"),
|
|
@@ -6160,16 +6402,16 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6160
6402
|
value: state.custom,
|
|
6161
6403
|
invalid: customBad,
|
|
6162
6404
|
onChange: (event) => state.setCustom(event.target.value)
|
|
6163
|
-
}), customBad ? /* @__PURE__ */
|
|
6405
|
+
}), customBad ? /* @__PURE__ */ createElement("span", {
|
|
6164
6406
|
className: AddModule_module_default.inputError,
|
|
6165
6407
|
role: "alert"
|
|
6166
|
-
}, t("panels.market.add.registryCustomInvalid")) : null, /* @__PURE__ */
|
|
6408
|
+
}, t("panels.market.add.registryCustomInvalid")) : null, /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryHint }, t("panels.market.add.registryCustomHint")));
|
|
6167
6409
|
})) : null);
|
|
6168
6410
|
}
|
|
6169
6411
|
//#endregion
|
|
6170
6412
|
//#region src/app/layouts/market/AddModuleForm.tsx
|
|
6171
6413
|
function AddModuleForm({ t, state }) {
|
|
6172
|
-
return /* @__PURE__ */
|
|
6414
|
+
return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.field }, /* @__PURE__ */ createElement(TextField, {
|
|
6173
6415
|
type: "text",
|
|
6174
6416
|
className: AddModule_module_default.input,
|
|
6175
6417
|
value: state.spec,
|
|
@@ -6182,27 +6424,27 @@ function AddModuleForm({ t, state }) {
|
|
|
6182
6424
|
onKeyDown: (event) => {
|
|
6183
6425
|
if (event.key === "Enter" && state.spec.trim() !== "") state.check();
|
|
6184
6426
|
}
|
|
6185
|
-
})), state.problem === null ? null : /* @__PURE__ */
|
|
6427
|
+
})), state.problem === null ? null : /* @__PURE__ */ createElement("p", {
|
|
6186
6428
|
className: AddModule_module_default.problem,
|
|
6187
6429
|
role: "alert"
|
|
6188
|
-
}, t(problemKey(state.problem.problem), { reason: state.problem.reason })), state.failure === null ? null : /* @__PURE__ */
|
|
6430
|
+
}, t(problemKey(state.problem.problem), { reason: state.problem.reason })), state.failure === null ? null : /* @__PURE__ */ createElement("p", {
|
|
6189
6431
|
className: AddModule_module_default.problem,
|
|
6190
6432
|
role: "alert"
|
|
6191
|
-
}, state.failure), /* @__PURE__ */
|
|
6433
|
+
}, state.failure), /* @__PURE__ */ createElement("div", { className: AddModule_module_default.options }, /* @__PURE__ */ createElement("button", {
|
|
6192
6434
|
type: "button",
|
|
6193
6435
|
className: AddModule_module_default.guideToggle,
|
|
6194
6436
|
"aria-expanded": state.guideOpen,
|
|
6195
6437
|
onClick: state.toggleGuide
|
|
6196
|
-
}, /* @__PURE__ */
|
|
6438
|
+
}, /* @__PURE__ */ createElement(IconChevronDownOutlineRegular, { size: 14 }), /* @__PURE__ */ createElement("span", null, t(state.guideOpen ? "panels.market.add.guideHide" : "panels.market.add.guideToggle"))), /* @__PURE__ */ createElement(AddModuleRegistry, {
|
|
6197
6439
|
t,
|
|
6198
6440
|
state
|
|
6199
|
-
})), state.guideOpen ? /* @__PURE__ */
|
|
6441
|
+
})), state.guideOpen ? /* @__PURE__ */ createElement("div", { className: AddModule_module_default.guide }, /* @__PURE__ */ createElement("ol", { className: AddModule_module_default.guideList }, GUIDE_ITEMS.map((item, index) => /* @__PURE__ */ createElement("li", {
|
|
6200
6442
|
className: AddModule_module_default.guideItem,
|
|
6201
6443
|
key: item.exampleKey
|
|
6202
|
-
}, /* @__PURE__ */
|
|
6444
|
+
}, /* @__PURE__ */ createElement("span", {
|
|
6203
6445
|
className: AddModule_module_default.guideIndex,
|
|
6204
6446
|
"aria-hidden": "true"
|
|
6205
|
-
}, index + 1), /* @__PURE__ */
|
|
6447
|
+
}, index + 1), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideMain }, /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideTitle }, t(item.titleKey)), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideHint }, t(item.hintKey)), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideExample }, /* @__PURE__ */ createElement("span", { className: AddModule_module_default.guideExampleLabel }, t("panels.market.add.guideExampleLabel")), /* @__PURE__ */ createElement("code", null, t(item.exampleKey)))), /* @__PURE__ */ createElement(Button, {
|
|
6206
6448
|
type: "button",
|
|
6207
6449
|
size: "sm",
|
|
6208
6450
|
variant: "outline",
|
|
@@ -6214,13 +6456,13 @@ var SafetyNote_module_default = { note: "_note_1enlz_1" };
|
|
|
6214
6456
|
//#endregion
|
|
6215
6457
|
//#region src/app/layouts/market/SafetyNote.tsx
|
|
6216
6458
|
function SafetyNote({ t }) {
|
|
6217
|
-
return /* @__PURE__ */
|
|
6459
|
+
return /* @__PURE__ */ createElement("p", {
|
|
6218
6460
|
className: SafetyNote_module_default.note,
|
|
6219
6461
|
role: "note"
|
|
6220
|
-
}, /* @__PURE__ */
|
|
6462
|
+
}, /* @__PURE__ */ createElement(IconWarningOutlineRegular, {
|
|
6221
6463
|
size: 14,
|
|
6222
6464
|
"aria-hidden": "true"
|
|
6223
|
-
}), /* @__PURE__ */
|
|
6465
|
+
}), /* @__PURE__ */ createElement("span", null, t("panels.market.add.guideSafety")));
|
|
6224
6466
|
}
|
|
6225
6467
|
//#endregion
|
|
6226
6468
|
//#region src/app/layouts/market/AddModuleStages.tsx
|
|
@@ -6233,11 +6475,11 @@ function supplyTone(state) {
|
|
|
6233
6475
|
return SUPPLY_TONES[state] ?? AddModule_module_default.note;
|
|
6234
6476
|
}
|
|
6235
6477
|
function AddModulePending({ t, kind }) {
|
|
6236
|
-
return /* @__PURE__ */
|
|
6478
|
+
return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ createElement("span", {
|
|
6237
6479
|
className: AddModule_module_default.heroIcon,
|
|
6238
6480
|
"data-state": "ongoing",
|
|
6239
6481
|
"aria-hidden": "true"
|
|
6240
|
-
}, /* @__PURE__ */
|
|
6482
|
+
}, /* @__PURE__ */ createElement(Spinner, { size: 28 })), /* @__PURE__ */ createElement("h2", {
|
|
6241
6483
|
className: AddModule_module_default.pendingTitle,
|
|
6242
6484
|
role: "status"
|
|
6243
6485
|
}, kind === "inspecting" ? t("panels.market.add.classifying") : t("panels.market.add.installingTitle"))));
|
|
@@ -6248,7 +6490,7 @@ function AddModulePreview({ t, state }) {
|
|
|
6248
6490
|
const source = preview.registry === "" ? t("panels.market.add.registryDefault") : preview.registry;
|
|
6249
6491
|
const plugin = preview.kind === "plugin";
|
|
6250
6492
|
const pluginName = plugin ? preview.pluginName : void 0;
|
|
6251
|
-
return /* @__PURE__ */
|
|
6493
|
+
return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectName }, preview.name), preview.version === "" ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: preview.version })), pluginName === void 0 || pluginName === preview.name ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.pluginAlias", { name: pluginName })), preview.description === "" ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectDesc }, preview.description), /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, source)), plugin ? /* @__PURE__ */ createElement("p", { className: AddModule_module_default.result }, t("panels.market.add.pluginPreview")) : null);
|
|
6252
6494
|
}
|
|
6253
6495
|
function AddModuleResult({ t, state }) {
|
|
6254
6496
|
const outcome = state.outcome;
|
|
@@ -6264,20 +6506,20 @@ function AddModuleResult({ t, state }) {
|
|
|
6264
6506
|
});
|
|
6265
6507
|
const name = outcome.module.kind === "module" ? outcome.module.unit : outcome.module.pkg;
|
|
6266
6508
|
const why = restartWhy(outcome.change, t);
|
|
6267
|
-
return /* @__PURE__ */
|
|
6509
|
+
return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ createElement("span", {
|
|
6268
6510
|
className: AddModule_module_default.heroIcon,
|
|
6269
6511
|
"data-state": kind === "failed" ? "error" : kind === "cancelled" ? "idle" : "done",
|
|
6270
6512
|
"aria-hidden": "true"
|
|
6271
|
-
}, kind === "failed" ? /* @__PURE__ */
|
|
6513
|
+
}, kind === "failed" ? /* @__PURE__ */ createElement(IconWarningOutlineRegular, { size: 28 }) : kind === "cancelled" ? /* @__PURE__ */ createElement(StateDot, {
|
|
6272
6514
|
state: "idle",
|
|
6273
6515
|
size: 28
|
|
6274
|
-
}) : /* @__PURE__ */
|
|
6516
|
+
}) : /* @__PURE__ */ createElement(IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ createElement("h2", {
|
|
6275
6517
|
className: AddModule_module_default.wizardTitle,
|
|
6276
6518
|
role: kind === "failed" ? "alert" : "status"
|
|
6277
|
-
}, kind === "failed" ? t("panels.market.add.failedTitle") : kind === "cancelled" ? t("panels.market.add.cancelledTitle") : t("panels.market.add.installedTitle"))), /* @__PURE__ */
|
|
6519
|
+
}, kind === "failed" ? t("panels.market.add.failedTitle") : kind === "cancelled" ? t("panels.market.add.cancelledTitle") : t("panels.market.add.installedTitle"))), /* @__PURE__ */ createElement("div", { className: AddModule_module_default.subject }, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectName }, outcome.module.pkg), name === outcome.module.pkg ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, name), outcome.module.version === void 0 ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.subjectMeta }, t("panels.market.add.installVersion", { version: outcome.module.version }))), kind === "plugin" && plugin !== void 0 ? /* @__PURE__ */ createElement("p", { className: AddModule_module_default.result }, t("panels.market.add.installedPlugin", { name: plugin.name ?? plugin.pkg })) : kind === "failed" ? /* @__PURE__ */ createElement("p", {
|
|
6278
6520
|
className: AddModule_module_default.resultWarn,
|
|
6279
6521
|
role: "alert"
|
|
6280
|
-
}, t("panels.market.add.failed", { reason })) : kind === "restart" ? /* @__PURE__ */
|
|
6522
|
+
}, t("panels.market.add.failed", { reason })) : kind === "restart" ? /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")), why === void 0 ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.resultMeta }, why)) : kind === "quiet" ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.result }, t("panels.market.add.tookEffect")), builds.length === 0 ? null : /* @__PURE__ */ createElement("div", { className: AddModule_module_default.approval }, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.approvalTitle }, t("panels.market.add.approveTitle")), /* @__PURE__ */ createElement("p", { className: AddModule_module_default.approvalText }, t("panels.market.add.approveHint", { packages: builds.join("、") })), /* @__PURE__ */ createElement("p", { className: AddModule_module_default.approvalCaution }, t("panels.market.add.approveCaution"))), supply === void 0 || outcome.supply.state !== "failed" && (kind === "failed" || kind === "cancelled") ? null : /* @__PURE__ */ createElement("p", { className: supplyTone(outcome.supply.state) }, t(supply, { reason: outcome.supply.reason ?? "" })), state.failure === null ? null : /* @__PURE__ */ createElement("p", { className: AddModule_module_default.problem }, state.failure), outcome.change.errorDetail === void 0 ? null : /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement("p", { className: AddModule_module_default.detailLabel }, t("panels.market.add.details")), /* @__PURE__ */ createElement("p", { className: AddModule_module_default.detail }, outcome.change.errorDetail)));
|
|
6281
6523
|
}
|
|
6282
6524
|
//#endregion
|
|
6283
6525
|
//#region src/app/layouts/market/use-add-module.ts
|
|
@@ -6489,7 +6731,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
|
|
|
6489
6731
|
const failed = state.outcome?.change.application === "failed";
|
|
6490
6732
|
const builds = state.builds;
|
|
6491
6733
|
const notModule = state.outcome?.supply.state === "not-a-module";
|
|
6492
|
-
const footer = /* @__PURE__ */
|
|
6734
|
+
const footer = /* @__PURE__ */ createElement(Fragment, null, state.phase === "idle" ? /* @__PURE__ */ createElement("div", { className: AddModule_module_default.footer }, /* @__PURE__ */ createElement(SafetyNote, { t }), /* @__PURE__ */ createElement(Button, {
|
|
6493
6735
|
type: "button",
|
|
6494
6736
|
variant: "primary",
|
|
6495
6737
|
size: "md",
|
|
@@ -6497,27 +6739,27 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
|
|
|
6497
6739
|
disabled: empty || checking,
|
|
6498
6740
|
"aria-busy": checking,
|
|
6499
6741
|
onClick: state.check
|
|
6500
|
-
}, checking ? /* @__PURE__ */
|
|
6742
|
+
}, checking ? /* @__PURE__ */ createElement(Spinner, { size: 12 }) : null, t(checking ? "panels.market.add.checking" : "panels.market.add.run"))) : null, state.phase === "preview" ? /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
|
|
6501
6743
|
type: "button",
|
|
6502
6744
|
variant: "outline",
|
|
6503
6745
|
size: "md",
|
|
6504
6746
|
onClick: state.edit
|
|
6505
|
-
}, t("panels.market.add.edit")), /* @__PURE__ */
|
|
6747
|
+
}, t("panels.market.add.edit")), /* @__PURE__ */ createElement(Button, {
|
|
6506
6748
|
type: "button",
|
|
6507
6749
|
variant: "primary",
|
|
6508
6750
|
size: "md",
|
|
6509
6751
|
onClick: () => state.install()
|
|
6510
|
-
}, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */
|
|
6752
|
+
}, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ createElement(Button, {
|
|
6511
6753
|
type: "button",
|
|
6512
6754
|
variant: "outline",
|
|
6513
6755
|
size: "md",
|
|
6514
6756
|
onClick: state.cancelInstall
|
|
6515
|
-
}, t("panels.market.add.cancel")) : null, state.phase === "result" ? /* @__PURE__ */
|
|
6757
|
+
}, t("panels.market.add.cancel")) : null, state.phase === "result" ? /* @__PURE__ */ createElement(Fragment, null, failed && builds.length === 0 ? /* @__PURE__ */ createElement(Button, {
|
|
6516
6758
|
type: "button",
|
|
6517
6759
|
variant: "outline",
|
|
6518
6760
|
size: "md",
|
|
6519
6761
|
onClick: state.edit
|
|
6520
|
-
}, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */
|
|
6762
|
+
}, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */ createElement(Button, {
|
|
6521
6763
|
type: "button",
|
|
6522
6764
|
variant: "outline",
|
|
6523
6765
|
size: "md",
|
|
@@ -6525,23 +6767,23 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
|
|
|
6525
6767
|
disabled: state.removing,
|
|
6526
6768
|
"aria-busy": state.removing,
|
|
6527
6769
|
onClick: state.removeIt
|
|
6528
|
-
}, state.removing ? /* @__PURE__ */
|
|
6770
|
+
}, state.removing ? /* @__PURE__ */ createElement(Spinner, { size: 12 }) : null, t(state.removing ? "panels.market.uninstalling" : "panels.market.add.remove")) : null, /* @__PURE__ */ createElement(Button, {
|
|
6529
6771
|
type: "button",
|
|
6530
6772
|
variant: "outline",
|
|
6531
6773
|
size: "md",
|
|
6532
6774
|
onClick: onClose
|
|
6533
|
-
}, t("panels.market.add.close")), builds.length === 0 ? null : /* @__PURE__ */
|
|
6775
|
+
}, t("panels.market.add.close")), builds.length === 0 ? null : /* @__PURE__ */ createElement(Button, {
|
|
6534
6776
|
type: "button",
|
|
6535
6777
|
variant: "primary",
|
|
6536
6778
|
size: "md",
|
|
6537
6779
|
onClick: () => state.install(builds)
|
|
6538
|
-
}, t("panels.market.add.approveRun")), failed && builds.length === 0 ? /* @__PURE__ */
|
|
6780
|
+
}, t("panels.market.add.approveRun")), failed && builds.length === 0 ? /* @__PURE__ */ createElement(Button, {
|
|
6539
6781
|
type: "button",
|
|
6540
6782
|
variant: "primary",
|
|
6541
6783
|
size: "md",
|
|
6542
6784
|
onClick: () => state.install()
|
|
6543
6785
|
}, t("panels.market.add.retry")) : null) : null);
|
|
6544
|
-
return /* @__PURE__ */
|
|
6786
|
+
return /* @__PURE__ */ createElement(Modal, {
|
|
6545
6787
|
open,
|
|
6546
6788
|
onClose: () => {
|
|
6547
6789
|
if (!installing) onClose();
|
|
@@ -6552,19 +6794,19 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
|
|
|
6552
6794
|
className: AddModule_module_default.dialog,
|
|
6553
6795
|
contentClassName: AddModule_module_default.content,
|
|
6554
6796
|
footer
|
|
6555
|
-
}, /* @__PURE__ */
|
|
6797
|
+
}, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ createElement(AddModuleForm, {
|
|
6556
6798
|
t,
|
|
6557
6799
|
state
|
|
6558
|
-
}) : null, state.phase === "inspecting" ? /* @__PURE__ */
|
|
6800
|
+
}) : null, state.phase === "inspecting" ? /* @__PURE__ */ createElement(AddModulePending, {
|
|
6559
6801
|
t,
|
|
6560
6802
|
kind: "inspecting"
|
|
6561
|
-
}) : null, state.phase === "preview" ? /* @__PURE__ */
|
|
6803
|
+
}) : null, state.phase === "preview" ? /* @__PURE__ */ createElement(AddModulePreview, {
|
|
6562
6804
|
t,
|
|
6563
6805
|
state
|
|
6564
|
-
}) : null, state.phase === "installing" ? /* @__PURE__ */
|
|
6806
|
+
}) : null, state.phase === "installing" ? /* @__PURE__ */ createElement(AddModulePending, {
|
|
6565
6807
|
t,
|
|
6566
6808
|
kind: "installing"
|
|
6567
|
-
}) : null, state.phase === "result" ? /* @__PURE__ */
|
|
6809
|
+
}) : null, state.phase === "result" ? /* @__PURE__ */ createElement(AddModuleResult, {
|
|
6568
6810
|
t,
|
|
6569
6811
|
state
|
|
6570
6812
|
}) : null));
|
|
@@ -6579,11 +6821,15 @@ var MOCK_FRESHNESS = {
|
|
|
6579
6821
|
};
|
|
6580
6822
|
var NO_UNITS = /* @__PURE__ */ new Set();
|
|
6581
6823
|
function useLiveManifests(units) {
|
|
6582
|
-
|
|
6824
|
+
const subscribe = useCallback((listener) => units.subscribe(listener), [units]);
|
|
6825
|
+
const revision = useCallback(() => units.version(), [units]);
|
|
6826
|
+
useSyncExternalStore(subscribe, revision);
|
|
6583
6827
|
return units.manifests();
|
|
6584
6828
|
}
|
|
6585
6829
|
function useInstallableUnits(units) {
|
|
6586
|
-
|
|
6830
|
+
const subscribe = useCallback((listener) => units.subscribe(listener), [units]);
|
|
6831
|
+
const revision = useCallback(() => units.version(), [units]);
|
|
6832
|
+
useSyncExternalStore(subscribe, revision);
|
|
6587
6833
|
return units.installable();
|
|
6588
6834
|
}
|
|
6589
6835
|
function makeMarketEntryIcon(units) {
|
|
@@ -6608,24 +6854,38 @@ function makeMarketEntryIcon(units) {
|
|
|
6608
6854
|
useEffect(() => () => {
|
|
6609
6855
|
publishPanelHint(MARKET_PANEL_ID, null);
|
|
6610
6856
|
}, []);
|
|
6611
|
-
return /* @__PURE__ */
|
|
6857
|
+
return /* @__PURE__ */ createElement(IconModules, { size });
|
|
6612
6858
|
};
|
|
6613
6859
|
}
|
|
6614
6860
|
function MarketPanel({ t, units }) {
|
|
6615
6861
|
const manifests = useLiveManifests(units);
|
|
6616
6862
|
const installable = useInstallableUnits(units);
|
|
6617
6863
|
const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
|
|
6618
|
-
const { modules, plugins, workbench, read: installedRead, reload: reloadVersions } = useModuleVersions();
|
|
6864
|
+
const { modules, plugins, workbench, selfUpdate, read: installedRead, reload: reloadVersions } = useModuleVersions();
|
|
6619
6865
|
const machineBoard = useEnabledUnits(0, null);
|
|
6620
6866
|
const [adding, setAdding] = useState(false);
|
|
6621
6867
|
const [acting, setActing] = useState(false);
|
|
6622
6868
|
const openAddModule = useCallback(() => setAdding(true), []);
|
|
6623
6869
|
const updates = useMemo(() => marketUpdatesOf(modules), [modules]);
|
|
6624
6870
|
const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
|
|
6625
|
-
const reload = useCallback(() => {
|
|
6871
|
+
const reload = useCallback((options) => {
|
|
6872
|
+
if (options?.force === true) {
|
|
6873
|
+
bumpModuleVersionsEpoch();
|
|
6874
|
+
bumpCapabilityEpoch();
|
|
6875
|
+
forceProbe();
|
|
6876
|
+
reloadVersions({
|
|
6877
|
+
force: true,
|
|
6878
|
+
fresh: true
|
|
6879
|
+
});
|
|
6880
|
+
return;
|
|
6881
|
+
}
|
|
6626
6882
|
reloadCapability();
|
|
6627
6883
|
reloadVersions();
|
|
6628
|
-
}, [
|
|
6884
|
+
}, [
|
|
6885
|
+
reloadCapability,
|
|
6886
|
+
reloadVersions,
|
|
6887
|
+
forceProbe
|
|
6888
|
+
]);
|
|
6629
6889
|
const enteredRef = useRef(false);
|
|
6630
6890
|
useEffect(() => {
|
|
6631
6891
|
if (enteredRef.current) return;
|
|
@@ -6677,26 +6937,23 @@ function MarketPanel({ t, units }) {
|
|
|
6677
6937
|
const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
|
|
6678
6938
|
const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
|
|
6679
6939
|
const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
|
|
6680
|
-
return /* @__PURE__ */
|
|
6940
|
+
return /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ createElement("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ createElement("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketPageTools }, /* @__PURE__ */ createElement(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ createElement("button", {
|
|
6681
6941
|
type: "button",
|
|
6682
6942
|
className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
|
|
6683
6943
|
"aria-label": t("panels.market.checkUpdates"),
|
|
6684
6944
|
disabled: busy,
|
|
6685
|
-
onClick: () => {
|
|
6686
|
-
|
|
6687
|
-
reloadVersions({ force: true });
|
|
6688
|
-
}
|
|
6689
|
-
}, /* @__PURE__ */ h("span", {
|
|
6945
|
+
onClick: () => reload({ force: true })
|
|
6946
|
+
}, /* @__PURE__ */ createElement("span", {
|
|
6690
6947
|
className: MarketPage_module_default.marketIconWrap,
|
|
6691
6948
|
"aria-hidden": "true"
|
|
6692
|
-
}, /* @__PURE__ */
|
|
6949
|
+
}, /* @__PURE__ */ createElement(IconRefreshOutlineRegular, null)))), /* @__PURE__ */ createElement(Button, {
|
|
6693
6950
|
variant: "primary",
|
|
6694
6951
|
size: "sm",
|
|
6695
6952
|
className: MarketPage_module_default.marketAddButton,
|
|
6696
|
-
icon: /* @__PURE__ */
|
|
6953
|
+
icon: /* @__PURE__ */ createElement(IconPlusOutlineRegular, { size: 13 }),
|
|
6697
6954
|
disabled: busy,
|
|
6698
6955
|
onClick: openAddModule
|
|
6699
|
-
}, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */
|
|
6956
|
+
}, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ createElement(MarketView, {
|
|
6700
6957
|
key: `${mock?.id ?? "real-market"}-${mockNonce}`,
|
|
6701
6958
|
t,
|
|
6702
6959
|
manifests,
|
|
@@ -6709,16 +6966,17 @@ function MarketPanel({ t, units }) {
|
|
|
6709
6966
|
installed,
|
|
6710
6967
|
installedRead: shownRead,
|
|
6711
6968
|
workbench,
|
|
6969
|
+
selfUpdate,
|
|
6712
6970
|
plugins,
|
|
6713
6971
|
settling: mock === void 0 ? settling : void 0,
|
|
6714
6972
|
mock,
|
|
6715
6973
|
defaults: machineBoard?.defaults ?? [],
|
|
6716
6974
|
changed: machineBoard?.changed ?? {}
|
|
6717
|
-
}), /* @__PURE__ */
|
|
6975
|
+
}), /* @__PURE__ */ createElement(AddModuleDialog, {
|
|
6718
6976
|
t,
|
|
6719
6977
|
open: adding,
|
|
6720
6978
|
onClose: () => setAdding(false),
|
|
6721
|
-
onInstalled: reload
|
|
6979
|
+
onInstalled: () => reload({ force: true })
|
|
6722
6980
|
}));
|
|
6723
6981
|
}
|
|
6724
6982
|
function registerMarketPanel(ctx, units) {
|
|
@@ -7093,7 +7351,7 @@ function DebugFooterAction({ wide, t, useWorkspaces, useSessions }) {
|
|
|
7093
7351
|
where: here.path ?? ""
|
|
7094
7352
|
}, workspacePath);
|
|
7095
7353
|
const view = debugFooterView(state, t, situation === "off-workspace" || situation === "other-board" ? "workspace" : situation === "panel-closed" ? "panel" : "none");
|
|
7096
|
-
const dot = /* @__PURE__ */
|
|
7354
|
+
const dot = /* @__PURE__ */ createElement(StateDot, {
|
|
7097
7355
|
state: view.trouble !== "none" ? "error" : view.stalled ? "warning" : "done",
|
|
7098
7356
|
className: view.trouble === "none" && !view.stalled ? DebugFooterAction_module_default.pulse : void 0
|
|
7099
7357
|
});
|
|
@@ -7111,37 +7369,37 @@ function DebugFooterAction({ wide, t, useWorkspaces, useSessions }) {
|
|
|
7111
7369
|
setArmed(false);
|
|
7112
7370
|
act.send({ intent: "stop" });
|
|
7113
7371
|
};
|
|
7114
|
-
const acts = /* @__PURE__ */
|
|
7372
|
+
const acts = /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.acts }, view.stalled ? /* @__PURE__ */ createElement("button", {
|
|
7115
7373
|
type: "button",
|
|
7116
7374
|
className: DebugFooterAction_module_default.act,
|
|
7117
7375
|
"aria-label": t("debug.act.resume"),
|
|
7118
7376
|
onClick: press("resume")
|
|
7119
|
-
}, /* @__PURE__ */
|
|
7377
|
+
}, /* @__PURE__ */ createElement(IconPlayOutlineRegular, { size: 12 })) : /* @__PURE__ */ createElement("button", {
|
|
7120
7378
|
type: "button",
|
|
7121
7379
|
className: DebugFooterAction_module_default.act,
|
|
7122
7380
|
"aria-label": t("debug.act.pause"),
|
|
7123
7381
|
onClick: press("pause")
|
|
7124
|
-
}, /* @__PURE__ */
|
|
7382
|
+
}, /* @__PURE__ */ createElement(IconPauseOutlineRegular, { size: 12 })), /* @__PURE__ */ createElement("button", {
|
|
7125
7383
|
type: "button",
|
|
7126
7384
|
className: cx(DebugFooterAction_module_default.act, DebugFooterAction_module_default.actStop, armed ? DebugFooterAction_module_default.actArmed : void 0),
|
|
7127
7385
|
"data-act-state": armed ? "armed" : "idle",
|
|
7128
7386
|
"aria-label": armed ? t("debug.act.stop.ask") : t("debug.act.stop"),
|
|
7129
7387
|
onClick: onStop,
|
|
7130
7388
|
onBlur: () => setArmed(false)
|
|
7131
|
-
}, /* @__PURE__ */
|
|
7132
|
-
const status = /* @__PURE__ */
|
|
7133
|
-
const row = /* @__PURE__ */
|
|
7389
|
+
}, /* @__PURE__ */ createElement(IconStopFillRegular, { size: 12 }), armed ? /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.actLabel }, t("debug.act.stop.ask")) : null));
|
|
7390
|
+
const status = /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.entryInner }, dot, wide === true ? /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.entryLine }, view.label) : null);
|
|
7391
|
+
const row = /* @__PURE__ */ createElement("div", { className: cx(DebugFooterAction_module_default.action, wide === true ? void 0 : DebugFooterAction_module_default.actionRail, tone) }, /* @__PURE__ */ createElement("span", {
|
|
7134
7392
|
className: DebugFooterAction_module_default.entry,
|
|
7135
7393
|
role: "status",
|
|
7136
7394
|
"aria-label": `${view.label},${view.note}`
|
|
7137
|
-
}, wide === true ? /* @__PURE__ */
|
|
7395
|
+
}, wide === true ? /* @__PURE__ */ createElement(Tip, {
|
|
7138
7396
|
label: view.note,
|
|
7139
7397
|
side: "top"
|
|
7140
7398
|
}, status) : status), wide === true ? acts : null);
|
|
7141
|
-
if (wide === true) return /* @__PURE__ */
|
|
7142
|
-
return /* @__PURE__ */
|
|
7399
|
+
if (wide === true) return /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.slot }, row);
|
|
7400
|
+
return /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.slot }, /* @__PURE__ */ createElement(HoverCard, {
|
|
7143
7401
|
anchor: row,
|
|
7144
|
-
content: /* @__PURE__ */
|
|
7402
|
+
content: /* @__PURE__ */ createElement("div", { className: DebugFooterAction_module_default.card }, /* @__PURE__ */ createElement("div", { className: DebugFooterAction_module_default.cardTitle }, view.title), /* @__PURE__ */ createElement("div", { className: DebugFooterAction_module_default.cardNote }, view.note), acts),
|
|
7145
7403
|
openDelayMs: 200
|
|
7146
7404
|
}));
|
|
7147
7405
|
}
|
|
@@ -7238,12 +7496,12 @@ function RecordFooterAction({ wide, t }) {
|
|
|
7238
7496
|
const act = useDiyRecordAct();
|
|
7239
7497
|
if (state === null) return null;
|
|
7240
7498
|
const view = recordFooterView(state, t);
|
|
7241
|
-
const dot = /* @__PURE__ */
|
|
7499
|
+
const dot = /* @__PURE__ */ createElement(StateDot, {
|
|
7242
7500
|
state: state.phase === "finished" ? "done" : "warning",
|
|
7243
7501
|
className: state.phase === "armed" ? RecordFooterAction_module_default.pulse : void 0
|
|
7244
7502
|
});
|
|
7245
7503
|
const tone = state.phase === "finished" ? RecordFooterAction_module_default.done : RecordFooterAction_module_default.live;
|
|
7246
|
-
const acts = /* @__PURE__ */
|
|
7504
|
+
const acts = /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.acts }, view.acts.map((one) => /* @__PURE__ */ createElement("button", {
|
|
7247
7505
|
key: one.intent,
|
|
7248
7506
|
type: "button",
|
|
7249
7507
|
className: RecordFooterAction_module_default.act,
|
|
@@ -7253,19 +7511,19 @@ function RecordFooterAction({ wide, t }) {
|
|
|
7253
7511
|
act.send({ intent: one.intent });
|
|
7254
7512
|
}
|
|
7255
7513
|
}, one.label)));
|
|
7256
|
-
const status = /* @__PURE__ */
|
|
7257
|
-
const row = /* @__PURE__ */
|
|
7514
|
+
const status = /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.entryInner }, dot, wide === true ? /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.entryLine }, view.label) : null);
|
|
7515
|
+
const row = /* @__PURE__ */ createElement("div", { className: cx(RecordFooterAction_module_default.action, wide === true ? void 0 : RecordFooterAction_module_default.actionRail, tone) }, /* @__PURE__ */ createElement("span", {
|
|
7258
7516
|
className: RecordFooterAction_module_default.entry,
|
|
7259
7517
|
role: "status",
|
|
7260
7518
|
"aria-label": `${view.label},${view.note}`
|
|
7261
|
-
}, wide === true ? /* @__PURE__ */
|
|
7519
|
+
}, wide === true ? /* @__PURE__ */ createElement(Tip, {
|
|
7262
7520
|
label: view.note,
|
|
7263
7521
|
side: "top"
|
|
7264
7522
|
}, status) : status), wide === true ? acts : null);
|
|
7265
|
-
if (wide === true) return /* @__PURE__ */
|
|
7266
|
-
return /* @__PURE__ */
|
|
7523
|
+
if (wide === true) return /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.slot }, row);
|
|
7524
|
+
return /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.slot }, /* @__PURE__ */ createElement(HoverCard, {
|
|
7267
7525
|
anchor: row,
|
|
7268
|
-
content: /* @__PURE__ */
|
|
7526
|
+
content: /* @__PURE__ */ createElement("div", { className: RecordFooterAction_module_default.card }, /* @__PURE__ */ createElement("div", { className: RecordFooterAction_module_default.cardTitle }, view.label), /* @__PURE__ */ createElement("div", { className: RecordFooterAction_module_default.cardNote }, view.note), acts),
|
|
7269
7527
|
openDelayMs: 200
|
|
7270
7528
|
}));
|
|
7271
7529
|
}
|
|
@@ -7284,30 +7542,52 @@ function registerRecordFooter(ctx) {
|
|
|
7284
7542
|
//#region src/shared/api/config-sync.ts
|
|
7285
7543
|
var CONFIG_SYNC_ROUTE = "config-sync";
|
|
7286
7544
|
var CONFIG_SYNC_RESOURCE = "configSync";
|
|
7287
|
-
var
|
|
7288
|
-
|
|
7289
|
-
|
|
7290
|
-
|
|
7291
|
-
|
|
7292
|
-
|
|
7293
|
-
|
|
7294
|
-
|
|
7295
|
-
|
|
7296
|
-
|
|
7297
|
-
|
|
7298
|
-
|
|
7299
|
-
|
|
7300
|
-
|
|
7301
|
-
|
|
7302
|
-
|
|
7303
|
-
|
|
7304
|
-
|
|
7305
|
-
|
|
7306
|
-
|
|
7307
|
-
|
|
7545
|
+
var SettingsItem_module_default = {
|
|
7546
|
+
item: "_item_lyox9_1",
|
|
7547
|
+
head: "_head_lyox9_12",
|
|
7548
|
+
title: "_title_lyox9_19",
|
|
7549
|
+
description: "_description_lyox9_31"
|
|
7550
|
+
};
|
|
7551
|
+
//#endregion
|
|
7552
|
+
//#region src/app/layouts/workbench-settings/SettingsItem.tsx
|
|
7553
|
+
/**
|
|
7554
|
+
* 设置一节里的一个配置项:自己的标题、一句说明、右上动作与内容。
|
|
7555
|
+
* 多个配置项叠在同一节里,项与项之间由样式画分隔线。
|
|
7556
|
+
* @param props.title - 这一项的名字(同时给读屏,`aria-label`)。
|
|
7557
|
+
* @param props.description - 项下面那句说明;不给不占位。
|
|
7558
|
+
* @param props.action - 标题右侧的动作(如"重新读一遍");不给不占位。
|
|
7559
|
+
* @param props.children - 这一项的内容。
|
|
7560
|
+
* @returns 一个 `aria-label` 为标题的 `section`。
|
|
7561
|
+
*/
|
|
7562
|
+
function SettingsItem({ title, description, action, children }) {
|
|
7563
|
+
return /* @__PURE__ */ createElement("section", {
|
|
7564
|
+
className: SettingsItem_module_default.item,
|
|
7565
|
+
"aria-label": title
|
|
7566
|
+
}, /* @__PURE__ */ createElement("header", { className: SettingsItem_module_default.head }, /* @__PURE__ */ createElement("span", { className: SettingsItem_module_default.title }, title), action), description === void 0 ? null : /* @__PURE__ */ createElement("p", { className: SettingsItem_module_default.description }, description), children);
|
|
7567
|
+
}
|
|
7568
|
+
var ConfigSyncItem_module_default = {
|
|
7569
|
+
body: "_body_1rhdh_1",
|
|
7570
|
+
sources: "_sources_1rhdh_7",
|
|
7571
|
+
sourcesLabel: "_sourcesLabel_1rhdh_14",
|
|
7572
|
+
sourceOn: "_sourceOn_1rhdh_19",
|
|
7573
|
+
sourceCount: "_sourceCount_1rhdh_22",
|
|
7574
|
+
reading: "_reading_1rhdh_29",
|
|
7575
|
+
status: "_status_1rhdh_35",
|
|
7576
|
+
failure: "_failure_1rhdh_45",
|
|
7577
|
+
failureTitle: "_failureTitle_1rhdh_55",
|
|
7578
|
+
failureHint: "_failureHint_1rhdh_62",
|
|
7579
|
+
failureAction: "_failureAction_1rhdh_67",
|
|
7580
|
+
rows: "_rows_1rhdh_73",
|
|
7581
|
+
row: "_row_1rhdh_73",
|
|
7582
|
+
head: "_head_1rhdh_92",
|
|
7583
|
+
pick: "_pick_1rhdh_99",
|
|
7584
|
+
code: "_code_1rhdh_111",
|
|
7585
|
+
missing: "_missing_1rhdh_116",
|
|
7586
|
+
conflict: "_conflict_1rhdh_117",
|
|
7587
|
+
foot: "_foot_1rhdh_123"
|
|
7308
7588
|
};
|
|
7309
7589
|
//#endregion
|
|
7310
|
-
//#region src/app/layouts/
|
|
7590
|
+
//#region src/app/layouts/workbench-settings/ConfigSyncItem.tsx
|
|
7311
7591
|
var AUTO_RETRY_MS = 1200;
|
|
7312
7592
|
var DIFF_MAX_LINES = 9;
|
|
7313
7593
|
var TAG_KEYS = {
|
|
@@ -7334,41 +7614,41 @@ function diffLabels(t) {
|
|
|
7334
7614
|
}
|
|
7335
7615
|
function SourcePicker({ t, profiles, source, onPick }) {
|
|
7336
7616
|
if (profiles.length === 0) return null;
|
|
7337
|
-
return /* @__PURE__ */
|
|
7338
|
-
className:
|
|
7617
|
+
return /* @__PURE__ */ createElement("div", {
|
|
7618
|
+
className: ConfigSyncItem_module_default.sources,
|
|
7339
7619
|
role: "group",
|
|
7340
7620
|
"aria-label": t("configSync.source")
|
|
7341
|
-
}, /* @__PURE__ */
|
|
7621
|
+
}, /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.sourcesLabel }, t("configSync.source")), profiles.map((profile) => /* @__PURE__ */ createElement(Button, {
|
|
7342
7622
|
key: profile.name,
|
|
7343
7623
|
variant: profile.name === source ? "outline" : "ghost",
|
|
7344
7624
|
size: "sm",
|
|
7345
|
-
className: profile.name === source ?
|
|
7625
|
+
className: profile.name === source ? ConfigSyncItem_module_default.sourceOn : void 0,
|
|
7346
7626
|
"aria-pressed": profile.name === source,
|
|
7347
7627
|
title: profile.readable ? t("configSync.sourceRows", {
|
|
7348
7628
|
name: profile.name,
|
|
7349
7629
|
count: profile.candidates
|
|
7350
7630
|
}) : t("configSync.sourceBroken"),
|
|
7351
7631
|
onClick: () => onPick(profile.name)
|
|
7352
|
-
}, profile.name, /* @__PURE__ */
|
|
7632
|
+
}, profile.name, /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.sourceCount }, profile.readable ? profile.candidates : t("configSync.sourceDead")))));
|
|
7353
7633
|
}
|
|
7354
7634
|
function SourceRows({ t, rows, picked, profile, onToggle }) {
|
|
7355
|
-
return /* @__PURE__ */
|
|
7635
|
+
return /* @__PURE__ */ createElement("ul", { className: ConfigSyncItem_module_default.rows }, rows.map((row) => /* @__PURE__ */ createElement("li", {
|
|
7356
7636
|
key: row.key,
|
|
7357
|
-
className:
|
|
7358
|
-
}, /* @__PURE__ */
|
|
7637
|
+
className: ConfigSyncItem_module_default.row
|
|
7638
|
+
}, /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.head }, /* @__PURE__ */ createElement(Checkbox, {
|
|
7359
7639
|
checked: picked.includes(row.key),
|
|
7360
7640
|
label: row.id,
|
|
7361
7641
|
title: row.state === "differs" ? t("configSync.conflictNote") : void 0,
|
|
7362
|
-
className:
|
|
7642
|
+
className: ConfigSyncItem_module_default.pick,
|
|
7363
7643
|
onChange: (next) => onToggle(row.key, next)
|
|
7364
|
-
}), /* @__PURE__ */
|
|
7644
|
+
}), /* @__PURE__ */ createElement(Tag, { tone: row.state === "differs" ? "warning" : "success" }, t(TAG_KEYS[row.state] ?? "configSync.tag.new"))), row.ownBody === null ? /* @__PURE__ */ createElement(CodeBlock, {
|
|
7365
7645
|
code: row.body,
|
|
7366
7646
|
lang: "yaml",
|
|
7367
|
-
className:
|
|
7647
|
+
className: ConfigSyncItem_module_default.code,
|
|
7368
7648
|
copyLabel: t("configSync.code.copy"),
|
|
7369
7649
|
copiedLabel: t("configSync.code.copied"),
|
|
7370
7650
|
toolbarLabels: codeToolbarLabels(t)
|
|
7371
|
-
}) : /* @__PURE__ */
|
|
7651
|
+
}) : /* @__PURE__ */ createElement(DiffBlock, {
|
|
7372
7652
|
diffs: [{
|
|
7373
7653
|
path: row.id,
|
|
7374
7654
|
oldText: row.ownBody,
|
|
@@ -7376,37 +7656,37 @@ function SourceRows({ t, rows, picked, profile, onToggle }) {
|
|
|
7376
7656
|
}],
|
|
7377
7657
|
labels: diffLabels(t),
|
|
7378
7658
|
maxLines: DIFF_MAX_LINES,
|
|
7379
|
-
className:
|
|
7380
|
-
}), row.missing.map((pkg) => /* @__PURE__ */
|
|
7659
|
+
className: ConfigSyncItem_module_default.code
|
|
7660
|
+
}), row.missing.map((pkg) => /* @__PURE__ */ createElement("span", {
|
|
7381
7661
|
key: pkg,
|
|
7382
|
-
className:
|
|
7662
|
+
className: ConfigSyncItem_module_default.missing
|
|
7383
7663
|
}, t("configSync.missing", {
|
|
7384
7664
|
pkg,
|
|
7385
7665
|
profile
|
|
7386
|
-
}))), row.state === "differs" && picked.includes(row.key) ? /* @__PURE__ */
|
|
7666
|
+
}))), row.state === "differs" && picked.includes(row.key) ? /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.conflict }, t("configSync.conflictNote")) : null)));
|
|
7387
7667
|
}
|
|
7388
7668
|
function AppliedRows({ t, applied }) {
|
|
7389
|
-
return /* @__PURE__ */
|
|
7669
|
+
return /* @__PURE__ */ createElement(Note, null, t("configSync.applied"), applied.written.length === 0 ? "" : ` · ${t("configSync.appliedIds", { ids: applied.written.join("、") })}`, applied.skipped.length === 0 ? "" : ` · ${t("configSync.skippedIds", { ids: applied.skipped.join("、") })}`);
|
|
7390
7670
|
}
|
|
7391
7671
|
function ReadingRow({ t }) {
|
|
7392
|
-
return /* @__PURE__ */
|
|
7393
|
-
className:
|
|
7672
|
+
return /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.reading }, /* @__PURE__ */ createElement("p", {
|
|
7673
|
+
className: ConfigSyncItem_module_default.status,
|
|
7394
7674
|
role: "status"
|
|
7395
|
-
}, /* @__PURE__ */
|
|
7675
|
+
}, /* @__PURE__ */ createElement(Spinner, null), t("configSync.loading")), /* @__PURE__ */ createElement(SkeletonRows, { rows: 3 }));
|
|
7396
7676
|
}
|
|
7397
7677
|
function FailureRow({ t, blocker, onRetry }) {
|
|
7398
|
-
return /* @__PURE__ */
|
|
7399
|
-
className:
|
|
7678
|
+
return /* @__PURE__ */ createElement("div", {
|
|
7679
|
+
className: ConfigSyncItem_module_default.failure,
|
|
7400
7680
|
role: "alert",
|
|
7401
7681
|
"data-config-sync-failure": ""
|
|
7402
|
-
}, /* @__PURE__ */
|
|
7682
|
+
}, /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.failureTitle }, /* @__PURE__ */ createElement(StateDot, { state: "error" }), blocker.title), blocker.hint === void 0 ? null : /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.failureHint }, blocker.hint), /* @__PURE__ */ createElement(Button, {
|
|
7403
7683
|
size: "sm",
|
|
7404
7684
|
variant: "ghost",
|
|
7405
|
-
className:
|
|
7685
|
+
className: ConfigSyncItem_module_default.failureAction,
|
|
7406
7686
|
onClick: onRetry
|
|
7407
7687
|
}, t("blocker.retry")));
|
|
7408
7688
|
}
|
|
7409
|
-
function
|
|
7689
|
+
function ConfigSyncItem({ t }) {
|
|
7410
7690
|
const [source, setSource] = useState("");
|
|
7411
7691
|
const [revision, setRevision] = useState(0);
|
|
7412
7692
|
const [guard, setGuard] = useState(0);
|
|
@@ -7482,13 +7762,13 @@ function ConfigSyncSection({ t }) {
|
|
|
7482
7762
|
setRevision((current) => current + 1);
|
|
7483
7763
|
});
|
|
7484
7764
|
};
|
|
7485
|
-
return /* @__PURE__ */
|
|
7486
|
-
label: t("configSync.nav"),
|
|
7765
|
+
return /* @__PURE__ */ createElement(SettingsItem, {
|
|
7487
7766
|
title: t("configSync.nav"),
|
|
7488
|
-
|
|
7767
|
+
description: t("configSync.lead"),
|
|
7768
|
+
action: failure === null ? /* @__PURE__ */ createElement(Button, {
|
|
7489
7769
|
variant: "ghost",
|
|
7490
7770
|
size: "sm",
|
|
7491
|
-
icon: /* @__PURE__ */
|
|
7771
|
+
icon: /* @__PURE__ */ createElement(IconRefreshOutlineRegular, {
|
|
7492
7772
|
size: 16,
|
|
7493
7773
|
"aria-hidden": "true"
|
|
7494
7774
|
}),
|
|
@@ -7496,42 +7776,319 @@ function ConfigSyncSection({ t }) {
|
|
|
7496
7776
|
disabled: reading.busy,
|
|
7497
7777
|
title: t("configSync.refresh")
|
|
7498
7778
|
}, t("configSync.refresh")) : void 0
|
|
7499
|
-
}, /* @__PURE__ */
|
|
7779
|
+
}, /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.body }, value === void 0 ? null : /* @__PURE__ */ createElement(SourcePicker, {
|
|
7500
7780
|
t,
|
|
7501
7781
|
profiles: value.profiles,
|
|
7502
7782
|
source: value.source,
|
|
7503
7783
|
onPick: pickSource
|
|
7504
|
-
}), reading.busy ? /* @__PURE__ */
|
|
7784
|
+
}), reading.busy ? /* @__PURE__ */ createElement(ReadingRow, { t }) : null, failure !== null && !reading.busy ? /* @__PURE__ */ createElement(FailureRow, {
|
|
7505
7785
|
t,
|
|
7506
7786
|
blocker: failure,
|
|
7507
7787
|
onRetry: reread
|
|
7508
|
-
}) : null, write.failed !== null ? /* @__PURE__ */
|
|
7788
|
+
}) : null, write.failed !== null ? /* @__PURE__ */ createElement(Note, {
|
|
7509
7789
|
tone: "problem",
|
|
7510
7790
|
role: "alert"
|
|
7511
|
-
}, write.failed) : null, applied !== null ? /* @__PURE__ */
|
|
7791
|
+
}, write.failed) : null, applied !== null ? /* @__PURE__ */ createElement(AppliedRows, {
|
|
7512
7792
|
t,
|
|
7513
7793
|
applied
|
|
7514
|
-
}) : null, value !== void 0 && !reading.busy ? /* @__PURE__ */
|
|
7794
|
+
}) : null, value !== void 0 && !reading.busy ? /* @__PURE__ */ createElement(Fragment, null, value.profiles.length === 0 ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("configSync.noSource")) : null, broken !== null ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("configSync.unreadable", {
|
|
7515
7795
|
path: broken.path,
|
|
7516
7796
|
reason: broken.reason
|
|
7517
|
-
})) : null, value.emptyProviders ? /* @__PURE__ */
|
|
7797
|
+
})) : null, value.emptyProviders ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("configSync.emptyProviders")) : null, rows.length === 0 ? /* @__PURE__ */ createElement(Note, null, t("configSync.nothing")) : null, rows.length > 0 ? /* @__PURE__ */ createElement(SourceRows, {
|
|
7518
7798
|
t,
|
|
7519
7799
|
rows,
|
|
7520
7800
|
picked,
|
|
7521
7801
|
profile: value.self,
|
|
7522
7802
|
onToggle: toggle
|
|
7523
|
-
}) : null, rows.length > 0 ? /* @__PURE__ */
|
|
7803
|
+
}) : null, rows.length > 0 ? /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.foot }, /* @__PURE__ */ createElement(Button, {
|
|
7524
7804
|
variant: "primary",
|
|
7525
7805
|
size: "md",
|
|
7526
|
-
icon: /* @__PURE__ */ h(IconRefreshOutlineRegular, {
|
|
7527
|
-
size: 16,
|
|
7528
|
-
"aria-hidden": "true"
|
|
7529
|
-
}),
|
|
7530
7806
|
disabled: chosen.length === 0 || busy.busy,
|
|
7531
7807
|
onClick: apply
|
|
7532
7808
|
}, chosen.length === 0 ? t("configSync.applyNone") : busy.busy ? t("configSync.applying") : t("configSync.apply", { count: chosen.length }))) : null) : null));
|
|
7533
7809
|
}
|
|
7534
7810
|
//#endregion
|
|
7811
|
+
//#region src/shared/api/sidebar-edition.ts
|
|
7812
|
+
var SIDEBAR_EDITION_ROUTE = "sidebar-edition";
|
|
7813
|
+
var SIDEBAR_EDITION_RESOURCE = "sidebarEdition";
|
|
7814
|
+
//#endregion
|
|
7815
|
+
//#region src/shared/hooks/sidebar-edition.ts
|
|
7816
|
+
/**
|
|
7817
|
+
* 启动时读一次「左栏用哪一档」:这是静态组合决定的值(改了要刷新页面),不是事实流,
|
|
7818
|
+
* 所以不走 `useApiResource` 的订阅那一路;调用点只在客户端 apply 里一次。
|
|
7819
|
+
* @returns 宿主写的档位;读不到时 `undefined`(按官方 + 官方没落地再兜底)。
|
|
7820
|
+
*/
|
|
7821
|
+
async function readSidebarEdition() {
|
|
7822
|
+
try {
|
|
7823
|
+
const answer = await apiGet(SIDEBAR_EDITION_ROUTE);
|
|
7824
|
+
return answer.ok ? answer : void 0;
|
|
7825
|
+
} catch {
|
|
7826
|
+
return;
|
|
7827
|
+
}
|
|
7828
|
+
}
|
|
7829
|
+
//#endregion
|
|
7830
|
+
//#region src/app/layouts/sidebar/edition-boot.ts
|
|
7831
|
+
var RETRY_KEY = "dsh-workbench.sidebar-edition-retry";
|
|
7832
|
+
var PENDING_KEY = "dsh-workbench.sidebar-edition-pending";
|
|
7833
|
+
function retryCount() {
|
|
7834
|
+
try {
|
|
7835
|
+
return Number(globalThis.sessionStorage?.getItem(RETRY_KEY) ?? "0") || 0;
|
|
7836
|
+
} catch {
|
|
7837
|
+
return 0;
|
|
7838
|
+
}
|
|
7839
|
+
}
|
|
7840
|
+
function setRetryCount(value) {
|
|
7841
|
+
try {
|
|
7842
|
+
globalThis.sessionStorage?.setItem(RETRY_KEY, String(value));
|
|
7843
|
+
} catch {
|
|
7844
|
+
return;
|
|
7845
|
+
}
|
|
7846
|
+
}
|
|
7847
|
+
function pendingEdition() {
|
|
7848
|
+
try {
|
|
7849
|
+
const value = globalThis.sessionStorage?.getItem(PENDING_KEY);
|
|
7850
|
+
return value === "official" || value === "custom" ? value : null;
|
|
7851
|
+
} catch {
|
|
7852
|
+
return null;
|
|
7853
|
+
}
|
|
7854
|
+
}
|
|
7855
|
+
function clearPending() {
|
|
7856
|
+
try {
|
|
7857
|
+
globalThis.sessionStorage?.removeItem(PENDING_KEY);
|
|
7858
|
+
} catch {
|
|
7859
|
+
return;
|
|
7860
|
+
}
|
|
7861
|
+
}
|
|
7862
|
+
/**
|
|
7863
|
+
* 设置项点下去之后记一笔“想切到哪一档”,刷新后据此等组合跟上;
|
|
7864
|
+
* 不用它区分“刚切换”和“旧组合兜底”,否则官方档会被当成切坏了。
|
|
7865
|
+
* @param edition 用户选的目标档位。
|
|
7866
|
+
*/
|
|
7867
|
+
function markSidebarEditionPending(edition) {
|
|
7868
|
+
try {
|
|
7869
|
+
globalThis.sessionStorage?.setItem(PENDING_KEY, edition);
|
|
7870
|
+
} catch {
|
|
7871
|
+
return;
|
|
7872
|
+
}
|
|
7873
|
+
}
|
|
7874
|
+
var sideOwner = null;
|
|
7875
|
+
var takeoverArmed = false;
|
|
7876
|
+
var takeoverStop = null;
|
|
7877
|
+
var takeoverPoll = null;
|
|
7878
|
+
function settleCustomTakeover() {
|
|
7879
|
+
if (sideOwner === null) return false;
|
|
7880
|
+
if ((sideOwner.ctx.slots.entriesOfSlot?.("sidebar") ?? []).length > 0) return false;
|
|
7881
|
+
const owner = sideOwner;
|
|
7882
|
+
takeoverArmed = false;
|
|
7883
|
+
takeoverStop?.();
|
|
7884
|
+
takeoverStop = null;
|
|
7885
|
+
if (takeoverPoll !== null) {
|
|
7886
|
+
clearInterval(takeoverPoll);
|
|
7887
|
+
takeoverPoll = null;
|
|
7888
|
+
}
|
|
7889
|
+
clearPending();
|
|
7890
|
+
setRetryCount(0);
|
|
7891
|
+
setRuntimeSidebarEdition("custom");
|
|
7892
|
+
owner.register();
|
|
7893
|
+
return true;
|
|
7894
|
+
}
|
|
7895
|
+
/**
|
|
7896
|
+
* 切自定义时先把“官方被摘掉就接管”挂上,再发写口——这样组合一生效就原地换成
|
|
7897
|
+
* 我们的左栏,不必刷新,也不会出现左栏空一拍。
|
|
7898
|
+
*/
|
|
7899
|
+
function armCustomSidebarTakeover() {
|
|
7900
|
+
if (sideOwner === null || takeoverArmed) return;
|
|
7901
|
+
takeoverArmed = true;
|
|
7902
|
+
if (settleCustomTakeover()) return;
|
|
7903
|
+
takeoverStop = sideOwner.ctx.slots.subscribe("sidebar", () => {
|
|
7904
|
+
if (takeoverArmed) settleCustomTakeover();
|
|
7905
|
+
});
|
|
7906
|
+
takeoverPoll = setInterval(() => {
|
|
7907
|
+
if (takeoverArmed) settleCustomTakeover();
|
|
7908
|
+
}, 100);
|
|
7909
|
+
setTimeout(() => {
|
|
7910
|
+
if (!takeoverArmed) return;
|
|
7911
|
+
takeoverArmed = false;
|
|
7912
|
+
takeoverStop?.();
|
|
7913
|
+
takeoverStop = null;
|
|
7914
|
+
if (takeoverPoll !== null) {
|
|
7915
|
+
clearInterval(takeoverPoll);
|
|
7916
|
+
takeoverPoll = null;
|
|
7917
|
+
}
|
|
7918
|
+
if (!settleCustomTakeover() && (sideOwner?.ctx.slots.entriesOfSlot?.("sidebar") ?? []).length > 0) globalThis.location?.reload();
|
|
7919
|
+
}, 3e3);
|
|
7920
|
+
}
|
|
7921
|
+
/**
|
|
7922
|
+
* 写口没成时把待接管撤掉,别在 3 秒后误刷新。
|
|
7923
|
+
*/
|
|
7924
|
+
function disarmCustomSidebarTakeover() {
|
|
7925
|
+
takeoverArmed = false;
|
|
7926
|
+
takeoverStop?.();
|
|
7927
|
+
takeoverStop = null;
|
|
7928
|
+
if (takeoverPoll !== null) {
|
|
7929
|
+
clearInterval(takeoverPoll);
|
|
7930
|
+
takeoverPoll = null;
|
|
7931
|
+
}
|
|
7932
|
+
}
|
|
7933
|
+
/**
|
|
7934
|
+
* 启动时按组合决定左栏:先把官方座位让出来;官方没落地才注册我们自己的。
|
|
7935
|
+
* 官方 → 自定义刚写完时组合可能还没跟上,官方座位还在;这时最多自刷 2 次等它。
|
|
7936
|
+
* @param ctx 客户端上下文(只读 slots)。
|
|
7937
|
+
* @param registerOwn 注册工作台自己那套左栏(调用方保证幂等)。
|
|
7938
|
+
*/
|
|
7939
|
+
function bootSidebarEdition(ctx, registerOwn) {
|
|
7940
|
+
sideOwner = {
|
|
7941
|
+
ctx,
|
|
7942
|
+
register: registerOwn
|
|
7943
|
+
};
|
|
7944
|
+
const settle = () => {
|
|
7945
|
+
const official = (ctx.slots.entriesOfSlot?.("sidebar") ?? []).length > 0;
|
|
7946
|
+
const edition = runtimeSidebarEdition();
|
|
7947
|
+
const pending = pendingEdition();
|
|
7948
|
+
if (pending !== null && pending !== edition) clearPending();
|
|
7949
|
+
const wanted = pending === edition ? pending : null;
|
|
7950
|
+
if (wanted !== null) {
|
|
7951
|
+
if (wanted === "official" ? official : !official) {
|
|
7952
|
+
clearPending();
|
|
7953
|
+
setRetryCount(0);
|
|
7954
|
+
if (!official) registerOwn();
|
|
7955
|
+
return;
|
|
7956
|
+
}
|
|
7957
|
+
if (wanted === "custom") {
|
|
7958
|
+
let done = false;
|
|
7959
|
+
const takeOver = () => {
|
|
7960
|
+
if (done) return;
|
|
7961
|
+
done = true;
|
|
7962
|
+
clearPending();
|
|
7963
|
+
setRetryCount(0);
|
|
7964
|
+
registerOwn();
|
|
7965
|
+
};
|
|
7966
|
+
ctx.slots.subscribe("sidebar", () => {
|
|
7967
|
+
if (done) return;
|
|
7968
|
+
if ((ctx.slots.entriesOfSlot?.("sidebar") ?? []).length === 0) takeOver();
|
|
7969
|
+
});
|
|
7970
|
+
setTimeout(() => {
|
|
7971
|
+
if (done) return;
|
|
7972
|
+
if ((ctx.slots.entriesOfSlot?.("sidebar") ?? []).length === 0) {
|
|
7973
|
+
takeOver();
|
|
7974
|
+
return;
|
|
7975
|
+
}
|
|
7976
|
+
if (retryCount() < 2) {
|
|
7977
|
+
setRetryCount(retryCount() + 1);
|
|
7978
|
+
globalThis.location?.reload();
|
|
7979
|
+
}
|
|
7980
|
+
}, 2500);
|
|
7981
|
+
return;
|
|
7982
|
+
}
|
|
7983
|
+
if (retryCount() < 3) {
|
|
7984
|
+
setRetryCount(retryCount() + 1);
|
|
7985
|
+
setTimeout(() => globalThis.location?.reload(), 300);
|
|
7986
|
+
return;
|
|
7987
|
+
}
|
|
7988
|
+
clearPending();
|
|
7989
|
+
}
|
|
7990
|
+
if (edition === "custom" && official) {
|
|
7991
|
+
if (retryCount() >= 2) return;
|
|
7992
|
+
setRetryCount(retryCount() + 1);
|
|
7993
|
+
setTimeout(() => globalThis.location?.reload(), 200);
|
|
7994
|
+
return;
|
|
7995
|
+
}
|
|
7996
|
+
setRetryCount(0);
|
|
7997
|
+
if (official) return;
|
|
7998
|
+
registerOwn();
|
|
7999
|
+
};
|
|
8000
|
+
setTimeout(settle, 1200);
|
|
8001
|
+
readSidebarEdition().then((snapshot) => {
|
|
8002
|
+
if (snapshot !== void 0) setRuntimeSidebarEdition(snapshot.edition);
|
|
8003
|
+
});
|
|
8004
|
+
}
|
|
8005
|
+
//#endregion
|
|
8006
|
+
//#region src/app/layouts/workbench-settings/SidebarEditionItem.tsx
|
|
8007
|
+
/**
|
|
8008
|
+
* 「工作台设置」里的「会话列表」项:选官方还是自定义左栏。
|
|
8009
|
+
* 写入的是 profile patch 那一行;与当前这一屏的档位不同就提示刷新页面。
|
|
8010
|
+
* @param props.t - 这一项的词表。
|
|
8011
|
+
* @returns 一个配置项。
|
|
8012
|
+
*/
|
|
8013
|
+
function SidebarEditionItem({ t }) {
|
|
8014
|
+
const [runtime, setRuntime] = useState(runtimeSidebarEdition);
|
|
8015
|
+
const [switching, setSwitching] = useState(false);
|
|
8016
|
+
const snapshot = useApiResource(SIDEBAR_EDITION_ROUTE, {}, 0);
|
|
8017
|
+
const write = useHostWrite({
|
|
8018
|
+
channel: "actions",
|
|
8019
|
+
resource: SIDEBAR_EDITION_RESOURCE,
|
|
8020
|
+
networkText: t("sidebarEdition.failed")
|
|
8021
|
+
});
|
|
8022
|
+
const busy = useVisibleBusy(write.busy, 500);
|
|
8023
|
+
const stored = snapshot.phase === "ready" && snapshot.value !== void 0 ? snapshot.value.edition : void 0;
|
|
8024
|
+
useEffect(() => subscribeSidebarEdition(() => setRuntime(runtimeSidebarEdition())), []);
|
|
8025
|
+
const choose = (next) => {
|
|
8026
|
+
if (next !== "official" && next !== "custom") return;
|
|
8027
|
+
if (next === "custom") armCustomSidebarTakeover();
|
|
8028
|
+
write.send({ edition: next }).then((outcome) => {
|
|
8029
|
+
if (!outcome.ok) {
|
|
8030
|
+
if (next === "custom") disarmCustomSidebarTakeover();
|
|
8031
|
+
return;
|
|
8032
|
+
}
|
|
8033
|
+
setSwitching(true);
|
|
8034
|
+
if (next === "official") {
|
|
8035
|
+
markSidebarEditionPending("official");
|
|
8036
|
+
setTimeout(() => globalThis.location?.reload(), 50);
|
|
8037
|
+
return;
|
|
8038
|
+
}
|
|
8039
|
+
setTimeout(() => setSwitching(false), 4e3);
|
|
8040
|
+
});
|
|
8041
|
+
};
|
|
8042
|
+
return /* @__PURE__ */ createElement(SettingsItem, {
|
|
8043
|
+
title: t("sidebarEdition.nav"),
|
|
8044
|
+
description: t("sidebarEdition.lead")
|
|
8045
|
+
}, /* @__PURE__ */ createElement(ChoiceGroup, {
|
|
8046
|
+
label: t("sidebarEdition.nav"),
|
|
8047
|
+
name: "sidebar-edition",
|
|
8048
|
+
value: stored ?? runtime,
|
|
8049
|
+
variant: "boxed",
|
|
8050
|
+
disabled: stored === void 0 || switching,
|
|
8051
|
+
loading: busy.busy || switching,
|
|
8052
|
+
loadingText: t("sidebarEdition.saving"),
|
|
8053
|
+
options: [{
|
|
8054
|
+
value: "official",
|
|
8055
|
+
label: t("sidebarEdition.official"),
|
|
8056
|
+
description: t("sidebarEdition.officialHint")
|
|
8057
|
+
}, {
|
|
8058
|
+
value: "custom",
|
|
8059
|
+
label: t("sidebarEdition.custom"),
|
|
8060
|
+
description: t("sidebarEdition.customHint")
|
|
8061
|
+
}],
|
|
8062
|
+
onChange: choose
|
|
8063
|
+
}), write.failed === null ? null : /* @__PURE__ */ createElement(Note, {
|
|
8064
|
+
tone: "problem",
|
|
8065
|
+
role: "alert"
|
|
8066
|
+
}, write.failed), stored === void 0 || stored === runtime ? null : /* @__PURE__ */ createElement(Note, null, t("sidebarEdition.reloadRequired"), " ", /* @__PURE__ */ createElement(Button, {
|
|
8067
|
+
variant: "ghost",
|
|
8068
|
+
size: "sm",
|
|
8069
|
+
onClick: () => globalThis.location?.reload()
|
|
8070
|
+
}, t("sidebarEdition.reload"))));
|
|
8071
|
+
}
|
|
8072
|
+
var WorkbenchSettingsSection_module_default = {
|
|
8073
|
+
body: "_body_zi2j5_1",
|
|
8074
|
+
lead: "_lead_zi2j5_7",
|
|
8075
|
+
title: "_title_zi2j5_14"
|
|
8076
|
+
};
|
|
8077
|
+
//#endregion
|
|
8078
|
+
//#region src/app/layouts/workbench-settings/WorkbenchSettingsSection.tsx
|
|
8079
|
+
/**
|
|
8080
|
+
* 设置页里「工作台设置」这一节:工作台自己这一侧的配置都收在这里,一项一张。
|
|
8081
|
+
* 现在是「会话列表」与「配置同步」两项;再加配置项时按 `SettingsItem` 的形状往下排。
|
|
8082
|
+
* @param props.t - 这一节的词表。
|
|
8083
|
+
* @returns 设置页的一节。
|
|
8084
|
+
*/
|
|
8085
|
+
function WorkbenchSettingsSection({ t }) {
|
|
8086
|
+
return /* @__PURE__ */ createElement(SettingsSection, {
|
|
8087
|
+
label: t("workbenchSettings.nav"),
|
|
8088
|
+
title: /* @__PURE__ */ createElement("span", { className: WorkbenchSettingsSection_module_default.title }, t("workbenchSettings.nav"))
|
|
8089
|
+
}, /* @__PURE__ */ createElement("div", { className: WorkbenchSettingsSection_module_default.body }, /* @__PURE__ */ createElement("p", { className: WorkbenchSettingsSection_module_default.lead }, t("workbenchSettings.lead")), /* @__PURE__ */ createElement(SidebarEditionItem, { t }), /* @__PURE__ */ createElement(ConfigSyncItem, { t })));
|
|
8090
|
+
}
|
|
8091
|
+
//#endregion
|
|
7535
8092
|
//#region src/shared/api/diy.ts
|
|
7536
8093
|
var DIY_PRESET_ID = "workbench-diy";
|
|
7537
8094
|
var WORKSHOP_RELATIVE = "workbench/diy";
|
|
@@ -7938,7 +8495,7 @@ function createForcePlan() {
|
|
|
7938
8495
|
* 拿到这一拍之后门该怎么办:`close` 撤掉放行、`hold` 停在原地等用户动手、`wait` 接着轮询。
|
|
7939
8496
|
* 桥接坏了(`bridgeIssues` 非空)与 DIY 模式挂不起来(`diyGap` 非空)都是**不拦路**的,
|
|
7940
8497
|
* 但那块「怎么解决」得先真的画出来 —— 停在原地 + 一颗「先进入工作台」才叫不拦路,
|
|
7941
|
-
* 就绪即撤等于把那块提示连同修法一起丢掉,用户进去只会发现「工作台 DIY
|
|
8498
|
+
* 就绪即撤等于把那块提示连同修法一起丢掉,用户进去只会发现「工作台 DIY 模式」整个不在。
|
|
7942
8499
|
*/
|
|
7943
8500
|
function gateActionOf(snapshot) {
|
|
7944
8501
|
if (snapshot.phase === "failed") return "hold";
|
|
@@ -8239,7 +8796,6 @@ var MODULES_UPDATE_DEPENDENCY_TOOL = "workbench_modules_update_dependency";
|
|
|
8239
8796
|
var MODULES_UPDATE_PLUGIN_TOOL = "workbench_modules_update_plugin";
|
|
8240
8797
|
var MODULES_UNINSTALL_PLUGIN_TOOL = "workbench_modules_uninstall_plugin";
|
|
8241
8798
|
var MODULES_UPDATE_WORKBENCH_TOOL = "workbench_modules_update_workbench";
|
|
8242
|
-
var DIY_LIST_TOOL = "workbench_diy_list";
|
|
8243
8799
|
var DIY_STATUS_TOOL = "workbench_diy_status";
|
|
8244
8800
|
var DIY_PANEL_TOOL = "workbench_diy_panel";
|
|
8245
8801
|
var DIY_COMPONENTS_TOOL = "workbench_diy_components";
|
|
@@ -8290,7 +8846,6 @@ var ALL_TOOLS = [
|
|
|
8290
8846
|
MODULES_UPDATE_PLUGIN_TOOL,
|
|
8291
8847
|
MODULES_UNINSTALL_PLUGIN_TOOL,
|
|
8292
8848
|
MODULES_UPDATE_WORKBENCH_TOOL,
|
|
8293
|
-
DIY_LIST_TOOL,
|
|
8294
8849
|
DIY_STATUS_TOOL,
|
|
8295
8850
|
DIY_PANEL_TOOL,
|
|
8296
8851
|
DIY_COMPONENTS_TOOL,
|
|
@@ -8329,7 +8884,6 @@ var ALL_TOOLS = [
|
|
|
8329
8884
|
var READ_TOOLS = [
|
|
8330
8885
|
PANELS_LIST_TOOL,
|
|
8331
8886
|
MODULES_LIST_TOOL,
|
|
8332
|
-
DIY_LIST_TOOL,
|
|
8333
8887
|
DIY_STATUS_TOOL,
|
|
8334
8888
|
DIY_PANEL_TOOL,
|
|
8335
8889
|
DIY_COMPONENTS_TOOL,
|
|
@@ -8437,14 +8991,34 @@ function shellApprovalPlan(input, t) {
|
|
|
8437
8991
|
function shellApprovalDetail(input, t) {
|
|
8438
8992
|
const plan = shellApprovalPlan(input, t);
|
|
8439
8993
|
if (plan === void 0) return void 0;
|
|
8440
|
-
if (plan.rows.length === 0) return
|
|
8441
|
-
return /* @__PURE__ */
|
|
8994
|
+
if (plan.rows.length === 0) return createElement(Fragment, null);
|
|
8995
|
+
return /* @__PURE__ */ createElement(ApprovalPlan, {
|
|
8442
8996
|
rows: plan.rows,
|
|
8443
8997
|
warn: plan.warn
|
|
8444
8998
|
});
|
|
8445
8999
|
}
|
|
8446
9000
|
//#endregion
|
|
8447
9001
|
//#region src/app/layouts/rightbar/store.ts
|
|
9002
|
+
/**
|
|
9003
|
+
* 读一个布尔开关:键不存在时返回 `fallback`,只有存进去的 `'true'` 算真。
|
|
9004
|
+
* 外壳自己那几个开合态用它(kit 上的 `readText` / `writeText` 是给模块的文本档)。
|
|
9005
|
+
* @param key - localStorage 键。
|
|
9006
|
+
* @param fallback - 没有这个键时的值。
|
|
9007
|
+
* @returns 开关状态。
|
|
9008
|
+
*/
|
|
9009
|
+
function readFlag(key, fallback) {
|
|
9010
|
+
const raw = readText(key);
|
|
9011
|
+
if (raw === null) return fallback;
|
|
9012
|
+
return raw === "true";
|
|
9013
|
+
}
|
|
9014
|
+
/**
|
|
9015
|
+
* 把一个布尔开关写进 localStorage(存 `'true'` / `'false'`);写不进去静默作罢。
|
|
9016
|
+
* @param key - localStorage 键。
|
|
9017
|
+
* @param value - 开关状态。
|
|
9018
|
+
*/
|
|
9019
|
+
function writeFlag(key, value) {
|
|
9020
|
+
writeText(key, value ? "true" : "false");
|
|
9021
|
+
}
|
|
8448
9022
|
var browserPersistence = {
|
|
8449
9023
|
readFlag,
|
|
8450
9024
|
writeFlag,
|
|
@@ -8538,27 +9112,27 @@ var ColumnSwitch_module_default = {
|
|
|
8538
9112
|
function ColumnSwitch({ useRightbar, selectColumn, dshColumn, t }) {
|
|
8539
9113
|
const pressed = pressedColumns(useRightbar((snapshot) => snapshot), useSyncExternalStore(dshColumn.subscribe, dshColumn.getSnapshot));
|
|
8540
9114
|
const workbenchLabel = pressed.workbench ? t("rightbar.collapse") : t("rightbar.column.workbench");
|
|
8541
|
-
return /* @__PURE__ */
|
|
9115
|
+
return /* @__PURE__ */ createElement("span", {
|
|
8542
9116
|
className: ColumnSwitch_module_default.group,
|
|
8543
9117
|
role: "group",
|
|
8544
9118
|
"aria-label": t("rightbar.column.label")
|
|
8545
|
-
}, /* @__PURE__ */
|
|
9119
|
+
}, /* @__PURE__ */ createElement(Tip, { label: workbenchLabel }, /* @__PURE__ */ createElement(Button, {
|
|
8546
9120
|
type: "button",
|
|
8547
9121
|
size: "sm",
|
|
8548
9122
|
variant: "ghost",
|
|
8549
9123
|
className: pressed.workbench ? `${ColumnSwitch_module_default.button} ${ColumnSwitch_module_default.active}` : ColumnSwitch_module_default.button,
|
|
8550
9124
|
"aria-pressed": pressed.workbench,
|
|
8551
9125
|
"aria-label": workbenchLabel,
|
|
8552
|
-
icon: /* @__PURE__ */
|
|
9126
|
+
icon: /* @__PURE__ */ createElement("span", { className: ColumnSwitch_module_default.icon }, /* @__PURE__ */ createElement(IconPanelScreen, { size: 15 })),
|
|
8553
9127
|
onClick: () => selectColumn("workbench")
|
|
8554
|
-
})), /* @__PURE__ */
|
|
9128
|
+
})), /* @__PURE__ */ createElement(Tip, { label: t("rightbar.column.dsh") }, /* @__PURE__ */ createElement(Button, {
|
|
8555
9129
|
type: "button",
|
|
8556
9130
|
size: "sm",
|
|
8557
9131
|
variant: "ghost",
|
|
8558
9132
|
className: pressed.dsh ? `${ColumnSwitch_module_default.button} ${ColumnSwitch_module_default.active}` : ColumnSwitch_module_default.button,
|
|
8559
9133
|
"aria-pressed": pressed.dsh,
|
|
8560
9134
|
"aria-label": t("rightbar.column.dsh"),
|
|
8561
|
-
icon: /* @__PURE__ */
|
|
9135
|
+
icon: /* @__PURE__ */ createElement("span", { className: `${ColumnSwitch_module_default.icon} ${ColumnSwitch_module_default.mirror}` }, /* @__PURE__ */ createElement(IconPanelLeftOutlineRegular, { size: 15 })),
|
|
8562
9136
|
onClick: () => selectColumn("dsh")
|
|
8563
9137
|
})));
|
|
8564
9138
|
}
|
|
@@ -8730,42 +9304,42 @@ function stepLabel(step, titleKeyOf, t) {
|
|
|
8730
9304
|
return titleKey === void 0 ? t("panels.unknownStep") : t(titleKey);
|
|
8731
9305
|
}
|
|
8732
9306
|
function Breadcrumbs({ trail, onGoTo, titleKeyOf, t }) {
|
|
8733
|
-
return /* @__PURE__ */
|
|
9307
|
+
return /* @__PURE__ */ createElement("div", {
|
|
8734
9308
|
className: Breadcrumbs_module_default.stripTabs,
|
|
8735
9309
|
role: "presentation"
|
|
8736
9310
|
}, trail.map((step, index) => {
|
|
8737
9311
|
const current = index === trail.length - 1;
|
|
8738
|
-
return /* @__PURE__ */
|
|
9312
|
+
return /* @__PURE__ */ createElement(Fragment, { key: `${step.kind}-${index}` }, index > 0 ? /* @__PURE__ */ createElement("span", {
|
|
8739
9313
|
className: Breadcrumbs_module_default.sep,
|
|
8740
9314
|
"aria-hidden": "true"
|
|
8741
|
-
}, "›") : null, current ? /* @__PURE__ */
|
|
9315
|
+
}, "›") : null, current ? /* @__PURE__ */ createElement("div", {
|
|
8742
9316
|
className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabActive}`,
|
|
8743
9317
|
"aria-current": "page"
|
|
8744
|
-
}, /* @__PURE__ */
|
|
9318
|
+
}, /* @__PURE__ */ createElement("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))) : /* @__PURE__ */ createElement("button", {
|
|
8745
9319
|
type: "button",
|
|
8746
9320
|
className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabQuiet}`,
|
|
8747
9321
|
onClick: () => onGoTo(index)
|
|
8748
|
-
}, /* @__PURE__ */
|
|
9322
|
+
}, /* @__PURE__ */ createElement("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))));
|
|
8749
9323
|
}));
|
|
8750
9324
|
}
|
|
8751
9325
|
//#endregion
|
|
8752
9326
|
//#region src/app/layouts/rightbar/BoardEmpty.tsx
|
|
8753
9327
|
function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
|
|
8754
|
-
return /* @__PURE__ */
|
|
8755
|
-
icon: /* @__PURE__ */
|
|
9328
|
+
return /* @__PURE__ */ createElement(CenteredState, {
|
|
9329
|
+
icon: /* @__PURE__ */ createElement(IconBrandMark, { size: 32 }),
|
|
8756
9330
|
title: t("panels.empty"),
|
|
8757
9331
|
hint: t("panels.emptyHint"),
|
|
8758
|
-
action: /* @__PURE__ */
|
|
9332
|
+
action: /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
|
|
8759
9333
|
type: "button",
|
|
8760
9334
|
size: "sm",
|
|
8761
9335
|
variant: "primary",
|
|
8762
9336
|
onClick: onBuildModule
|
|
8763
|
-
}, t("panels.buildModule")), /* @__PURE__ */
|
|
9337
|
+
}, t("panels.buildModule")), /* @__PURE__ */ createElement(Button, {
|
|
8764
9338
|
type: "button",
|
|
8765
9339
|
size: "sm",
|
|
8766
9340
|
variant: "toolbar",
|
|
8767
9341
|
onClick: onOpenModules
|
|
8768
|
-
}, t("panels.choose")), /* @__PURE__ */
|
|
9342
|
+
}, t("panels.choose")), /* @__PURE__ */ createElement(Button, {
|
|
8769
9343
|
type: "button",
|
|
8770
9344
|
size: "sm",
|
|
8771
9345
|
variant: "toolbar",
|
|
@@ -8871,7 +9445,7 @@ function aggregateSummaries(summaries) {
|
|
|
8871
9445
|
//#endregion
|
|
8872
9446
|
//#region src/app/layouts/rightbar/PanelRowControls.tsx
|
|
8873
9447
|
function PanelRowControls({ t, unit, label, busy, onWrite }) {
|
|
8874
|
-
return /* @__PURE__ */
|
|
9448
|
+
return /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ createElement(Switch, {
|
|
8875
9449
|
checked: unit.shown,
|
|
8876
9450
|
label: `${label} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
|
|
8877
9451
|
disabled: busy,
|
|
@@ -8885,12 +9459,12 @@ function PanelRowControls({ t, unit, label, busy, onWrite }) {
|
|
|
8885
9459
|
//#region src/app/layouts/rightbar/PanelGroupRows.tsx
|
|
8886
9460
|
function PanelGroupRows({ t, rows, titleKey, busy, onWrite }) {
|
|
8887
9461
|
if (rows.length === 0) return null;
|
|
8888
|
-
return /* @__PURE__ */
|
|
9462
|
+
return /* @__PURE__ */ createElement("div", { className: ModulesPage_module_default.group }, /* @__PURE__ */ createElement("h3", { className: ModulesPage_module_default.groupTitle }, t(titleKey)), /* @__PURE__ */ createElement("ul", { className: ModulesPage_module_default.list }, rows.map((row) => {
|
|
8889
9463
|
const title = row.title ?? t(row.titleKey ?? row.id);
|
|
8890
|
-
return /* @__PURE__ */
|
|
9464
|
+
return /* @__PURE__ */ createElement("li", {
|
|
8891
9465
|
key: row.id,
|
|
8892
9466
|
className: `${ModulesPage_module_default.row} ${row.shown ? "" : ModulesPage_module_default.rowOff}`
|
|
8893
|
-
}, /* @__PURE__ */
|
|
9467
|
+
}, /* @__PURE__ */ createElement("span", { "aria-hidden": "true" }), /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.name }, title), row.badgeKey === void 0 ? null : /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey))), /* @__PURE__ */ createElement(PanelRowControls, {
|
|
8894
9468
|
t,
|
|
8895
9469
|
unit: row,
|
|
8896
9470
|
label: title,
|
|
@@ -8940,14 +9514,14 @@ function gripClass(drag) {
|
|
|
8940
9514
|
return `${ModulesPage_module_default.grip} ${drag.over === null ? ModulesPage_module_default.gripBlocked : ModulesPage_module_default.gripDragging}`;
|
|
8941
9515
|
}
|
|
8942
9516
|
function RowLabel({ t, row }) {
|
|
8943
|
-
return /* @__PURE__ */
|
|
9517
|
+
return /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.label }, /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.name }, t(row.titleKey ?? row.id)), row.badgeKey === void 0 ? null : /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.dep }, t(row.badgeKey)));
|
|
8944
9518
|
}
|
|
8945
9519
|
function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }) {
|
|
8946
|
-
return /* @__PURE__ */
|
|
9520
|
+
return /* @__PURE__ */ createElement("li", { className: rowClass(row, index, drag) }, row.shown && row.hasCard !== false ? /* @__PURE__ */ createElement(Tip, {
|
|
8947
9521
|
key: tipEpoch,
|
|
8948
9522
|
label: t("panels.dragHint"),
|
|
8949
9523
|
disabled: drag !== null
|
|
8950
|
-
}, /* @__PURE__ */
|
|
9524
|
+
}, /* @__PURE__ */ createElement("span", {
|
|
8951
9525
|
className: gripClass(drag),
|
|
8952
9526
|
"aria-hidden": "true",
|
|
8953
9527
|
onPointerDown: (event) => {
|
|
@@ -8956,10 +9530,10 @@ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }
|
|
|
8956
9530
|
event.currentTarget.setPointerCapture(event.pointerId);
|
|
8957
9531
|
handlers.begin(index, event.clientX, event.clientY);
|
|
8958
9532
|
}
|
|
8959
|
-
}, "⠿")) : /* @__PURE__ */
|
|
9533
|
+
}, "⠿")) : /* @__PURE__ */ createElement("span", { "aria-hidden": "true" }), /* @__PURE__ */ createElement(RowLabel, {
|
|
8960
9534
|
t,
|
|
8961
9535
|
row
|
|
8962
|
-
}), /* @__PURE__ */
|
|
9536
|
+
}), /* @__PURE__ */ createElement(PanelRowControls, {
|
|
8963
9537
|
t,
|
|
8964
9538
|
unit: row,
|
|
8965
9539
|
label: t(row.titleKey ?? row.id),
|
|
@@ -8968,12 +9542,12 @@ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }
|
|
|
8968
9542
|
}));
|
|
8969
9543
|
}
|
|
8970
9544
|
function PanelEmpty({ t, onOpenMarket }) {
|
|
8971
|
-
return /* @__PURE__ */
|
|
9545
|
+
return /* @__PURE__ */ createElement(CenteredState, {
|
|
8972
9546
|
compact: true,
|
|
8973
9547
|
icon: null,
|
|
8974
9548
|
title: t("panels.noneInstalled"),
|
|
8975
9549
|
hint: t("panels.noneInstalledHint"),
|
|
8976
|
-
action: /* @__PURE__ */
|
|
9550
|
+
action: /* @__PURE__ */ createElement(Button, {
|
|
8977
9551
|
type: "button",
|
|
8978
9552
|
size: "sm",
|
|
8979
9553
|
variant: "outline",
|
|
@@ -8982,7 +9556,7 @@ function PanelEmpty({ t, onOpenMarket }) {
|
|
|
8982
9556
|
});
|
|
8983
9557
|
}
|
|
8984
9558
|
function DragGhost({ label, at }) {
|
|
8985
|
-
return /* @__PURE__ */
|
|
9559
|
+
return /* @__PURE__ */ createElement("div", {
|
|
8986
9560
|
className: ModulesPage_module_default.ghost,
|
|
8987
9561
|
style: {
|
|
8988
9562
|
left: `${at.x + 12}px`,
|
|
@@ -8996,7 +9570,7 @@ function ResetConfirmation({ t, open, busy, onCancel, onConfirm }) {
|
|
|
8996
9570
|
setAcknowledged(false);
|
|
8997
9571
|
next();
|
|
8998
9572
|
};
|
|
8999
|
-
return /* @__PURE__ */
|
|
9573
|
+
return /* @__PURE__ */ createElement(RiskConfirmation, {
|
|
9000
9574
|
open,
|
|
9001
9575
|
title: t("panels.followAllConfirmTitle"),
|
|
9002
9576
|
description: t("panels.followAllConfirmDetail"),
|
|
@@ -9096,16 +9670,17 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
|
|
|
9096
9670
|
};
|
|
9097
9671
|
useDragListeners(drag !== null, handlers);
|
|
9098
9672
|
const dragged = drag === null ? void 0 : carded[drag.from];
|
|
9099
|
-
|
|
9673
|
+
const ghost = drag?.at === void 0 || dragged === void 0 ? null : /* @__PURE__ */ createElement(DragGhost, {
|
|
9100
9674
|
label: t(dragged.titleKey ?? dragged.id),
|
|
9101
9675
|
at: drag.at
|
|
9102
|
-
})
|
|
9676
|
+
});
|
|
9677
|
+
return /* @__PURE__ */ createElement(Fragment, null, ghost, empty ? /* @__PURE__ */ createElement(PanelEmpty, {
|
|
9103
9678
|
t,
|
|
9104
9679
|
onOpenMarket
|
|
9105
|
-
}) : null, carded.length === 0 ? null : /* @__PURE__ */
|
|
9680
|
+
}) : null, carded.length === 0 ? null : /* @__PURE__ */ createElement("ul", {
|
|
9106
9681
|
ref: listRef,
|
|
9107
9682
|
className: `${ModulesPage_module_default.list}${drag === null ? "" : ` ${ModulesPage_module_default.listDragging}`}`
|
|
9108
|
-
}, carded.map((row, index) => /* @__PURE__ */
|
|
9683
|
+
}, carded.map((row, index) => /* @__PURE__ */ createElement(PanelRowItem, {
|
|
9109
9684
|
key: row.id,
|
|
9110
9685
|
t,
|
|
9111
9686
|
row,
|
|
@@ -9115,24 +9690,24 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
|
|
|
9115
9690
|
tipEpoch,
|
|
9116
9691
|
busy,
|
|
9117
9692
|
onWrite: writeRow
|
|
9118
|
-
}))), /* @__PURE__ */
|
|
9693
|
+
}))), /* @__PURE__ */ createElement(PanelGroupRows, {
|
|
9119
9694
|
t,
|
|
9120
9695
|
rows: boardless,
|
|
9121
9696
|
titleKey: "panels.groupBoardless",
|
|
9122
9697
|
busy,
|
|
9123
9698
|
onWrite: writeRow
|
|
9124
|
-
}), /* @__PURE__ */
|
|
9699
|
+
}), /* @__PURE__ */ createElement(PanelGroupRows, {
|
|
9125
9700
|
t,
|
|
9126
9701
|
rows: pluginRows,
|
|
9127
9702
|
titleKey: "panels.groupPlugins",
|
|
9128
9703
|
busy,
|
|
9129
9704
|
onWrite: writeRow
|
|
9130
|
-
}), own ? /* @__PURE__ */
|
|
9705
|
+
}), own ? /* @__PURE__ */ createElement(PanelFoot, null, /* @__PURE__ */ createElement("button", {
|
|
9131
9706
|
type: "button",
|
|
9132
9707
|
className: ModulesPage_module_default.reset,
|
|
9133
9708
|
disabled: busy,
|
|
9134
9709
|
onClick: () => setConfirmingReset(true)
|
|
9135
|
-
}, t("panels.followAll"))) : null, /* @__PURE__ */
|
|
9710
|
+
}, t("panels.followAll"))) : null, /* @__PURE__ */ createElement(ResetConfirmation, {
|
|
9136
9711
|
t,
|
|
9137
9712
|
open: confirmingReset,
|
|
9138
9713
|
busy,
|
|
@@ -9141,7 +9716,7 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
|
|
|
9141
9716
|
setConfirmingReset(false);
|
|
9142
9717
|
write({ action: "reset" });
|
|
9143
9718
|
}
|
|
9144
|
-
}), failed ? /* @__PURE__ */
|
|
9719
|
+
}), failed ? /* @__PURE__ */ createElement("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
|
|
9145
9720
|
}
|
|
9146
9721
|
//#endregion
|
|
9147
9722
|
//#region src/app/layouts/rightbar/panel-dismiss.ts
|
|
@@ -9179,23 +9754,23 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
|
|
|
9179
9754
|
const mockNonce = devPanel.pick.nonce;
|
|
9180
9755
|
useDismissOnOutsidePointer(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
|
|
9181
9756
|
const units = enabledUnits?.units ?? [];
|
|
9182
|
-
return /* @__PURE__ */
|
|
9757
|
+
return /* @__PURE__ */ createElement("div", {
|
|
9183
9758
|
className: ModulesPage_module_default.trigger,
|
|
9184
9759
|
ref: root
|
|
9185
|
-
}, /* @__PURE__ */
|
|
9760
|
+
}, /* @__PURE__ */ createElement(Tip, { label: t("panels.title") }, /* @__PURE__ */ createElement(Button, {
|
|
9186
9761
|
type: "button",
|
|
9187
9762
|
size: "sm",
|
|
9188
9763
|
variant: "ghost",
|
|
9189
9764
|
className: `wb-stripButton${open ? " wb-stripButtonActive" : ""}`,
|
|
9190
9765
|
"aria-label": t("panels.title"),
|
|
9191
9766
|
"aria-expanded": open,
|
|
9192
|
-
icon: /* @__PURE__ */
|
|
9767
|
+
icon: /* @__PURE__ */ createElement(IconModules, { size: 16 }),
|
|
9193
9768
|
onClick: () => onOpenChange(!open)
|
|
9194
|
-
})), open ? /* @__PURE__ */
|
|
9769
|
+
})), open ? /* @__PURE__ */ createElement("div", {
|
|
9195
9770
|
className: ModulesPage_module_default.pop,
|
|
9196
9771
|
role: "dialog",
|
|
9197
9772
|
"aria-label": t("panels.title")
|
|
9198
|
-
}, /* @__PURE__ */
|
|
9773
|
+
}, /* @__PURE__ */ createElement("header", { className: ModulesPage_module_default.head }, /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.title }, t("panels.tab.modules"))), devPanel.strip, /* @__PURE__ */ createElement(ModulesPage, {
|
|
9199
9774
|
key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
|
|
9200
9775
|
t,
|
|
9201
9776
|
units: panelMock?.units ?? units,
|
|
@@ -9491,7 +10066,8 @@ function workspacePathOf(world) {
|
|
|
9491
10066
|
}
|
|
9492
10067
|
function ModuleHost({ module, step, panelToken, onPanelRefresh, onSummary, ...rest }) {
|
|
9493
10068
|
const [ownToken, setOwnToken] = useState(0);
|
|
9494
|
-
|
|
10069
|
+
const View = step === void 0 ? module.View : module.steps?.[step]?.View ?? module.View;
|
|
10070
|
+
return /* @__PURE__ */ createElement(View, {
|
|
9495
10071
|
...rest,
|
|
9496
10072
|
refreshToken: panelToken + ownToken,
|
|
9497
10073
|
onRefresh: () => setOwnToken((value) => value + 1),
|
|
@@ -9508,13 +10084,13 @@ function BoardGrid({ entries, panelWidth, world, panelToken, onPanelRefresh, onN
|
|
|
9508
10084
|
trailing: false
|
|
9509
10085
|
}));
|
|
9510
10086
|
const order = slots !== null && slots.length === entries.length ? slots : plain;
|
|
9511
|
-
return /* @__PURE__ */
|
|
10087
|
+
return /* @__PURE__ */ createElement("div", {
|
|
9512
10088
|
className: Rightbar_module_default.columns,
|
|
9513
10089
|
ref: root,
|
|
9514
10090
|
style: { columnCount }
|
|
9515
10091
|
}, order.map((slot) => {
|
|
9516
10092
|
const entry = entries[slot.index];
|
|
9517
|
-
return /* @__PURE__ */
|
|
10093
|
+
return /* @__PURE__ */ createElement("div", {
|
|
9518
10094
|
className: Rightbar_module_default.cell,
|
|
9519
10095
|
key: entry.key,
|
|
9520
10096
|
"data-wb-cell": entry.key,
|
|
@@ -9522,12 +10098,12 @@ function BoardGrid({ entries, panelWidth, world, panelToken, onPanelRefresh, onN
|
|
|
9522
10098
|
breakBefore: slot.breakBefore ? "column" : void 0,
|
|
9523
10099
|
marginBottom: slot.trailing ? 0 : void 0
|
|
9524
10100
|
}
|
|
9525
|
-
}, /* @__PURE__ */
|
|
10101
|
+
}, /* @__PURE__ */ createElement(CardAnchor, { unit: entry.module.id }, /* @__PURE__ */ createElement(CardBoundary, {
|
|
9526
10102
|
unit: entry.module.id,
|
|
9527
10103
|
resetKey: `${entry.key}:${panelToken}:${workspacePathOf(world)}`,
|
|
9528
10104
|
t,
|
|
9529
10105
|
onFailure: (reason) => onCardFailure(entry.module.id, reason)
|
|
9530
|
-
}, /* @__PURE__ */
|
|
10106
|
+
}, /* @__PURE__ */ createElement(ModuleHost, {
|
|
9531
10107
|
module: entry.module,
|
|
9532
10108
|
world,
|
|
9533
10109
|
panelToken,
|
|
@@ -9567,21 +10143,21 @@ function createSuiteWorld(input) {
|
|
|
9567
10143
|
//#endregion
|
|
9568
10144
|
//#region src/app/layouts/rightbar/Rightbar.tsx
|
|
9569
10145
|
function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnabled, onRefresh, modulesOpen, onModulesOpenChange, enabledUnits, manifests, workspace, refreshToken, onOpenMarket, onCollapse }) {
|
|
9570
|
-
return /* @__PURE__ */
|
|
10146
|
+
return /* @__PURE__ */ createElement("header", { className: "wb-panelHeader" }, /* @__PURE__ */ createElement("div", { className: "wb-tabStrip" }, /* @__PURE__ */ createElement(Breadcrumbs, {
|
|
9571
10147
|
trail,
|
|
9572
10148
|
onGoTo,
|
|
9573
10149
|
titleKeyOf,
|
|
9574
10150
|
t
|
|
9575
|
-
}), /* @__PURE__ */
|
|
10151
|
+
}), /* @__PURE__ */ createElement("span", { className: "wb-stripFill" }), /* @__PURE__ */ createElement("div", { className: "wb-stripChrome" }, /* @__PURE__ */ createElement(Tip, { label: refreshing ? t("rightbar.refreshing") : at === null ? t("rightbar.refresh") : `${t("rightbar.refresh")} · ${t("rightbar.updatedAt", { time: new Date(at).toLocaleTimeString().slice(0, 5) })}` }, /* @__PURE__ */ createElement(Button, {
|
|
9576
10152
|
type: "button",
|
|
9577
10153
|
size: "sm",
|
|
9578
10154
|
variant: "ghost",
|
|
9579
10155
|
className: `wb-stripButton${refreshing ? " wb-spinning" : ""}`,
|
|
9580
10156
|
"aria-label": refreshing ? t("rightbar.refreshing") : t("rightbar.refresh"),
|
|
9581
10157
|
disabled: refreshing || !refreshEnabled,
|
|
9582
|
-
icon: /* @__PURE__ */
|
|
10158
|
+
icon: /* @__PURE__ */ createElement(IconRefreshOutlineRegular, { size: 16 }),
|
|
9583
10159
|
onClick: onRefresh
|
|
9584
|
-
})), /* @__PURE__ */
|
|
10160
|
+
})), /* @__PURE__ */ createElement(PanelModules, {
|
|
9585
10161
|
t,
|
|
9586
10162
|
open: modulesOpen,
|
|
9587
10163
|
onOpenChange: onModulesOpenChange,
|
|
@@ -9590,33 +10166,33 @@ function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnab
|
|
|
9590
10166
|
refreshToken,
|
|
9591
10167
|
manifests,
|
|
9592
10168
|
onOpenMarket
|
|
9593
|
-
}), /* @__PURE__ */
|
|
10169
|
+
}), /* @__PURE__ */ createElement(Tip, { label: t("rightbar.collapse") }, /* @__PURE__ */ createElement(Button, {
|
|
9594
10170
|
type: "button",
|
|
9595
10171
|
size: "sm",
|
|
9596
10172
|
variant: "ghost",
|
|
9597
10173
|
className: "wb-stripButton",
|
|
9598
10174
|
"aria-label": t("rightbar.collapse"),
|
|
9599
|
-
icon: /* @__PURE__ */
|
|
10175
|
+
icon: /* @__PURE__ */ createElement("span", { className: "wb-stripIconFlip" }, /* @__PURE__ */ createElement(IconPanelLeftOutlineRegular, { size: 16 })),
|
|
9600
10176
|
onClick: onCollapse
|
|
9601
10177
|
})))));
|
|
9602
10178
|
}
|
|
9603
10179
|
function BoardContent({ top, plan, world, board, panelWidth, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, onCardFailure, buildModule, t }) {
|
|
9604
10180
|
if (top.kind !== "board") {
|
|
9605
10181
|
const owner = board.stepOwner(top.kind);
|
|
9606
|
-
if (owner === void 0) return /* @__PURE__ */
|
|
9607
|
-
icon: /* @__PURE__ */
|
|
10182
|
+
if (owner === void 0) return /* @__PURE__ */ createElement(CenteredState, {
|
|
10183
|
+
icon: /* @__PURE__ */ createElement(IconBrandMark, { size: 32 }),
|
|
9608
10184
|
title: t("panels.unknownStep")
|
|
9609
10185
|
});
|
|
9610
10186
|
const key = `${owner.id}:${top.kind}`;
|
|
9611
|
-
return /* @__PURE__ */
|
|
10187
|
+
return /* @__PURE__ */ createElement(CardAnchor, {
|
|
9612
10188
|
key,
|
|
9613
10189
|
unit: owner.id
|
|
9614
|
-
}, /* @__PURE__ */
|
|
10190
|
+
}, /* @__PURE__ */ createElement(CardBoundary, {
|
|
9615
10191
|
unit: owner.id,
|
|
9616
10192
|
resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
|
|
9617
10193
|
t,
|
|
9618
10194
|
onFailure: (reason) => onCardFailure(owner.id, reason)
|
|
9619
|
-
}, /* @__PURE__ */
|
|
10195
|
+
}, /* @__PURE__ */ createElement(ModuleHost, {
|
|
9620
10196
|
module: owner,
|
|
9621
10197
|
step: top.kind,
|
|
9622
10198
|
world,
|
|
@@ -9628,15 +10204,15 @@ function BoardContent({ top, plan, world, board, panelWidth, panelToken, onPanel
|
|
|
9628
10204
|
t
|
|
9629
10205
|
})));
|
|
9630
10206
|
}
|
|
9631
|
-
return /* @__PURE__ */
|
|
10207
|
+
return /* @__PURE__ */ createElement(Fragment, null, plan.reading ? /* @__PURE__ */ createElement(CenteredState, {
|
|
9632
10208
|
icon: null,
|
|
9633
|
-
title: /* @__PURE__ */
|
|
9634
|
-
}) : null, plan.empty ? /* @__PURE__ */
|
|
10209
|
+
title: /* @__PURE__ */ createElement(TextShimmer, { active: true }, t("panels.reading"))
|
|
10210
|
+
}) : null, plan.empty ? /* @__PURE__ */ createElement(BoardEmpty, {
|
|
9635
10211
|
t,
|
|
9636
10212
|
onBuildModule: buildModule,
|
|
9637
10213
|
onOpenModules,
|
|
9638
10214
|
onOpenMarket
|
|
9639
|
-
}) : null, /* @__PURE__ */
|
|
10215
|
+
}) : null, /* @__PURE__ */ createElement(BoardGrid, {
|
|
9640
10216
|
entries: plan.modules,
|
|
9641
10217
|
panelWidth,
|
|
9642
10218
|
world,
|
|
@@ -9748,7 +10324,7 @@ function Rightbar(props) {
|
|
|
9748
10324
|
const top = state.trail[state.trail.length - 1] ?? { kind: "board" };
|
|
9749
10325
|
const navigate = (step) => props.openPanel(step);
|
|
9750
10326
|
const openMarket = () => props.openMarket();
|
|
9751
|
-
return /* @__PURE__ */
|
|
10327
|
+
return /* @__PURE__ */ createElement("aside", {
|
|
9752
10328
|
ref: asideRef,
|
|
9753
10329
|
className: `wb-rightbar ${Rightbar_module_default.panel}`,
|
|
9754
10330
|
style: { width: panelWidth },
|
|
@@ -9757,7 +10333,7 @@ function Rightbar(props) {
|
|
|
9757
10333
|
"data-wb-board": fixtureMode ? void 0 : boardWorkspace ?? void 0,
|
|
9758
10334
|
"data-wb-open": fixtureMode || !shown ? void 0 : "",
|
|
9759
10335
|
"aria-label": props.t("rightbar.label")
|
|
9760
|
-
}, /* @__PURE__ */
|
|
10336
|
+
}, /* @__PURE__ */ createElement(PanelHeader, {
|
|
9761
10337
|
t: props.t,
|
|
9762
10338
|
trail: state.trail,
|
|
9763
10339
|
onGoTo: props.goToPanel,
|
|
@@ -9774,7 +10350,7 @@ function Rightbar(props) {
|
|
|
9774
10350
|
refreshToken: panelToken,
|
|
9775
10351
|
onOpenMarket: openMarket,
|
|
9776
10352
|
onCollapse: props.toggleRightbar
|
|
9777
|
-
}), devBoard.strip(top.kind === "board"), /* @__PURE__ */
|
|
10353
|
+
}), devBoard.strip(top.kind === "board"), /* @__PURE__ */ createElement("div", { className: `wb-panelBody${plan.repeated ? " wb-panelMany" : ""}` }, /* @__PURE__ */ createElement(BoardContent, {
|
|
9778
10354
|
top,
|
|
9779
10355
|
plan,
|
|
9780
10356
|
world,
|
|
@@ -10049,29 +10625,29 @@ function openNewSession(input) {
|
|
|
10049
10625
|
//#region src/app/layouts/sidebar/SidebarHeader.tsx
|
|
10050
10626
|
function SidebarHeader(props) {
|
|
10051
10627
|
const { collapsed, wide, attention, t, renderSlot } = props;
|
|
10052
|
-
return /* @__PURE__ */
|
|
10628
|
+
return /* @__PURE__ */ createElement("div", { className: "wb-logoRow" }, wide ? /* @__PURE__ */ createElement(Tip, { label: t("panel.conversation") }, /* @__PURE__ */ createElement("button", {
|
|
10053
10629
|
type: "button",
|
|
10054
10630
|
className: "wb-brand",
|
|
10055
10631
|
onClick: () => props.onSelectPanel(null)
|
|
10056
|
-
}, /* @__PURE__ */
|
|
10632
|
+
}, /* @__PURE__ */ createElement("span", { className: "wb-brandIdentity" }, /* @__PURE__ */ createElement("span", { className: "wb-brandMark" }, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ createElement(IconBrandMark, { size: 24 }) })), /* @__PURE__ */ createElement("span", { className: "wb-brandName" }, renderSlot("sidebar.brand.name", {}, { fallback: t("brand.name") }))))) : null, /* @__PURE__ */ createElement("button", {
|
|
10057
10633
|
type: "button",
|
|
10058
10634
|
className: "wb-iconButton wb-toggle",
|
|
10059
10635
|
"aria-label": t(collapsed ? "toggle.open" : "toggle.collapse"),
|
|
10060
10636
|
onClick: props.onToggle
|
|
10061
|
-
}, !wide ? /* @__PURE__ */
|
|
10637
|
+
}, !wide ? /* @__PURE__ */ createElement("span", {
|
|
10062
10638
|
className: "wb-railMark",
|
|
10063
10639
|
"aria-hidden": "true"
|
|
10064
|
-
}, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */
|
|
10640
|
+
}, renderSlot("sidebar.brand.mark", { size: 24 }, { fallback: /* @__PURE__ */ createElement(IconBrandMark, { size: 24 }) })) : null, /* @__PURE__ */ createElement("span", { className: "wb-panelIcon" }, /* @__PURE__ */ createElement(IconPanelLeftOutlineRegular, { size: wide ? 16 : 18 })), !wide ? renderSlot("sidebar.toggle.badge", { attention }) : null));
|
|
10065
10641
|
}
|
|
10066
10642
|
//#endregion
|
|
10067
10643
|
//#region src/app/layouts/sidebar/WorkspaceSection.tsx
|
|
10068
10644
|
function WorkspaceSection({ t, wide, onNewSession }) {
|
|
10069
|
-
return /* @__PURE__ */
|
|
10645
|
+
return /* @__PURE__ */ createElement("div", { className: "wb-wsSection" }, /* @__PURE__ */ createElement("div", { className: "wb-sectionHeader" }, wide ? /* @__PURE__ */ createElement("span", { className: "wb-sectionLabel" }, t("workspace.section")) : null, /* @__PURE__ */ createElement(Tip, { label: t("session.new.label") }, /* @__PURE__ */ createElement("button", {
|
|
10070
10646
|
type: "button",
|
|
10071
10647
|
className: "wb-iconButton wb-wsNew",
|
|
10072
10648
|
"aria-label": t("session.new"),
|
|
10073
10649
|
onClick: onNewSession
|
|
10074
|
-
}, /* @__PURE__ */
|
|
10650
|
+
}, /* @__PURE__ */ createElement(IconNewChatOutlineRegular, { size: 16 })))));
|
|
10075
10651
|
}
|
|
10076
10652
|
//#endregion
|
|
10077
10653
|
//#region src/shared/hooks/use-shell-long-tasks.ts
|
|
@@ -10143,22 +10719,22 @@ function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntr
|
|
|
10143
10719
|
const glyph = fallbackGlyph ?? (id !== null && renderEntry !== void 0 ? renderEntry(id, active, wide) : null);
|
|
10144
10720
|
const hint = usePanelHint(id);
|
|
10145
10721
|
const name = panelRowName(label, hint, t);
|
|
10146
|
-
return /* @__PURE__ */
|
|
10722
|
+
return /* @__PURE__ */ createElement(Tip, {
|
|
10147
10723
|
label: name,
|
|
10148
10724
|
disabled: !(hint !== null || !wide)
|
|
10149
|
-
}, /* @__PURE__ */
|
|
10725
|
+
}, /* @__PURE__ */ createElement("button", {
|
|
10150
10726
|
type: "button",
|
|
10151
10727
|
className: cx("wb-panelRow", active && "wb-panelActive"),
|
|
10152
10728
|
"aria-current": active ? "page" : void 0,
|
|
10153
10729
|
"aria-label": name,
|
|
10154
10730
|
onClick: () => onSelect(id)
|
|
10155
|
-
}, /* @__PURE__ */
|
|
10731
|
+
}, /* @__PURE__ */ createElement("span", {
|
|
10156
10732
|
className: "wb-panelGlyph",
|
|
10157
10733
|
"aria-hidden": "true"
|
|
10158
|
-
}, glyph, hint !== null && !wide ? /* @__PURE__ */
|
|
10734
|
+
}, glyph, hint !== null && !wide ? /* @__PURE__ */ createElement("span", { className: "wb-panelDot" }, /* @__PURE__ */ createElement(StateDot, {
|
|
10159
10735
|
state: hint.tone === "danger" ? "error" : "warning",
|
|
10160
10736
|
size: 9
|
|
10161
|
-
})) : null), wide ? /* @__PURE__ */
|
|
10737
|
+
})) : null), wide ? /* @__PURE__ */ createElement("span", { className: "wb-panelTitle" }, label) : null, hint === null || !wide ? null : /* @__PURE__ */ createElement(Tag, {
|
|
10162
10738
|
tone: hint.tone,
|
|
10163
10739
|
className: "wb-panelTag"
|
|
10164
10740
|
}, t(hint.labelKey))));
|
|
@@ -10186,22 +10762,22 @@ var WorkspaceAttentionDot_module_default = {
|
|
|
10186
10762
|
function WorkspaceAttentionDot({ attention, t, variant = "inline", tip = false }) {
|
|
10187
10763
|
if (attention === null) return null;
|
|
10188
10764
|
const label = attentionLabel(attention, t);
|
|
10189
|
-
const dot = /* @__PURE__ */
|
|
10765
|
+
const dot = /* @__PURE__ */ createElement("span", {
|
|
10190
10766
|
className: variant === "overlay" ? cx(WorkspaceAttentionDot_module_default.dot, WorkspaceAttentionDot_module_default.overlay) : WorkspaceAttentionDot_module_default.dot,
|
|
10191
10767
|
role: "img",
|
|
10192
10768
|
"aria-label": label
|
|
10193
|
-
}, /* @__PURE__ */
|
|
10769
|
+
}, /* @__PURE__ */ createElement(StateDot, {
|
|
10194
10770
|
state: attention.severity,
|
|
10195
10771
|
size: variant === "overlay" ? 9 : void 0
|
|
10196
10772
|
}));
|
|
10197
|
-
return tip ? /* @__PURE__ */
|
|
10773
|
+
return tip ? /* @__PURE__ */ createElement(Tip, { label }, dot) : dot;
|
|
10198
10774
|
}
|
|
10199
10775
|
var WorkspaceAttentionTag_module_default = { tag: "_tag_g9dg8_1" };
|
|
10200
10776
|
//#endregion
|
|
10201
10777
|
//#region src/app/layouts/sidebar/WorkspaceAttentionTag.tsx
|
|
10202
10778
|
function WorkspaceAttentionTag({ attention, t }) {
|
|
10203
10779
|
if (attention === null) return null;
|
|
10204
|
-
return /* @__PURE__ */
|
|
10780
|
+
return /* @__PURE__ */ createElement(Tip, { label: attentionLabel(attention, t) }, /* @__PURE__ */ createElement(Tag, {
|
|
10205
10781
|
tone: attention.severity === "warning" ? "warning" : "success",
|
|
10206
10782
|
className: WorkspaceAttentionTag_module_default.tag
|
|
10207
10783
|
}, attentionWordLabel(attention, t)));
|
|
@@ -10259,7 +10835,7 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
|
|
|
10259
10835
|
else setFailed(true);
|
|
10260
10836
|
});
|
|
10261
10837
|
};
|
|
10262
|
-
return /* @__PURE__ */
|
|
10838
|
+
return /* @__PURE__ */ createElement(Modal, {
|
|
10263
10839
|
open: true,
|
|
10264
10840
|
onClose: () => {
|
|
10265
10841
|
if (!busy) onClose();
|
|
@@ -10268,13 +10844,13 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
|
|
|
10268
10844
|
description: t("project.rename.description"),
|
|
10269
10845
|
closeLabel: t("project.rename.cancel"),
|
|
10270
10846
|
className: WorkspaceRenameDialog_module_default.dialog,
|
|
10271
|
-
footer: /* @__PURE__ */
|
|
10847
|
+
footer: /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
|
|
10272
10848
|
type: "button",
|
|
10273
10849
|
variant: "outline",
|
|
10274
10850
|
size: "md",
|
|
10275
10851
|
disabled: busy,
|
|
10276
10852
|
onClick: onClose
|
|
10277
|
-
}, t("project.rename.cancel")), /* @__PURE__ */
|
|
10853
|
+
}, t("project.rename.cancel")), /* @__PURE__ */ createElement(Button, {
|
|
10278
10854
|
type: "button",
|
|
10279
10855
|
variant: "primary",
|
|
10280
10856
|
size: "md",
|
|
@@ -10282,7 +10858,7 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
|
|
|
10282
10858
|
"aria-busy": busy,
|
|
10283
10859
|
onClick: save
|
|
10284
10860
|
}, t(busy ? "project.rename.saving" : "project.rename.save")))
|
|
10285
|
-
}, /* @__PURE__ */
|
|
10861
|
+
}, /* @__PURE__ */ createElement("div", { className: WorkspaceRenameDialog_module_default.stack }, /* @__PURE__ */ createElement(TextField, {
|
|
10286
10862
|
className: WorkspaceRenameDialog_module_default.input,
|
|
10287
10863
|
"data-modal-autofocus": "",
|
|
10288
10864
|
id: "wb-workspace-name",
|
|
@@ -10298,10 +10874,10 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
|
|
|
10298
10874
|
event.preventDefault();
|
|
10299
10875
|
save();
|
|
10300
10876
|
}
|
|
10301
|
-
}), /* @__PURE__ */
|
|
10877
|
+
}), /* @__PURE__ */ createElement("div", { className: WorkspaceRenameDialog_module_default.meta }, /* @__PURE__ */ createElement(Note, { as: "span" }, t("project.rename.hint")), /* @__PURE__ */ createElement(Note, {
|
|
10302
10878
|
as: "span",
|
|
10303
10879
|
tone: tooLong ? "problem" : "muted"
|
|
10304
|
-
}, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */
|
|
10880
|
+
}, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("project.rename.failed")) : null));
|
|
10305
10881
|
}
|
|
10306
10882
|
//#endregion
|
|
10307
10883
|
//#region src/app/layouts/sidebar/workspace-groups.ts
|
|
@@ -10334,12 +10910,12 @@ function workspaceSections(items, headings) {
|
|
|
10334
10910
|
//#endregion
|
|
10335
10911
|
//#region src/app/layouts/sidebar/WorkspaceRowAction.tsx
|
|
10336
10912
|
function WorkspaceRowAction({ workspace, t, onEdit }) {
|
|
10337
|
-
return /* @__PURE__ */
|
|
10913
|
+
return /* @__PURE__ */ createElement(Button, {
|
|
10338
10914
|
type: "button",
|
|
10339
10915
|
variant: "ghost",
|
|
10340
10916
|
size: "sm",
|
|
10341
10917
|
className: ProjectSwitcher_module_default.rowAction,
|
|
10342
|
-
icon: /* @__PURE__ */
|
|
10918
|
+
icon: /* @__PURE__ */ createElement(IconEditOutlineRegular, { size: 14 }),
|
|
10343
10919
|
"aria-label": t("project.rename.row", { name: displayNameOf(workspace).dir }),
|
|
10344
10920
|
onClick: (event) => {
|
|
10345
10921
|
event.stopPropagation();
|
|
@@ -10368,13 +10944,13 @@ function WorkspaceRowLabel({ workspace, current, action, onHover }) {
|
|
|
10368
10944
|
row.removeEventListener("mouseleave", leave);
|
|
10369
10945
|
};
|
|
10370
10946
|
}, []);
|
|
10371
|
-
return /* @__PURE__ */
|
|
10947
|
+
return /* @__PURE__ */ createElement("span", {
|
|
10372
10948
|
ref: hostRef,
|
|
10373
10949
|
className: ProjectSwitcher_module_default.row
|
|
10374
|
-
}, /* @__PURE__ */
|
|
10950
|
+
}, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ createElement("span", {
|
|
10375
10951
|
className: ProjectSwitcher_module_default.name,
|
|
10376
10952
|
title: name
|
|
10377
|
-
}, name), /* @__PURE__ */
|
|
10953
|
+
}, name), /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.trailing }, action ?? (current ? /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.current }, /* @__PURE__ */ createElement(IconCheckOutlineRegular, { size: 12 })) : null)));
|
|
10378
10954
|
}
|
|
10379
10955
|
//#endregion
|
|
10380
10956
|
//#region src/app/layouts/sidebar/workspace-items.tsx
|
|
@@ -10385,15 +10961,15 @@ function workspaceOptions(options) {
|
|
|
10385
10961
|
return {
|
|
10386
10962
|
value: workspace.workspaceId,
|
|
10387
10963
|
group,
|
|
10388
|
-
icon: own === null ? /* @__PURE__ */
|
|
10964
|
+
icon: own === null ? /* @__PURE__ */ createElement(IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ createElement(WorkspaceAttentionDot, {
|
|
10389
10965
|
attention: own,
|
|
10390
10966
|
t
|
|
10391
10967
|
}),
|
|
10392
|
-
label: /* @__PURE__ */
|
|
10968
|
+
label: /* @__PURE__ */ createElement(WorkspaceRowLabel, {
|
|
10393
10969
|
workspace,
|
|
10394
10970
|
current: workspace.workspaceId === currentId,
|
|
10395
10971
|
onHover: (hovering) => onHover(hovering ? workspace.workspaceId : null),
|
|
10396
|
-
action: hoverId === workspace.workspaceId ? /* @__PURE__ */
|
|
10972
|
+
action: hoverId === workspace.workspaceId ? /* @__PURE__ */ createElement(WorkspaceRowAction, {
|
|
10397
10973
|
workspace,
|
|
10398
10974
|
t,
|
|
10399
10975
|
onEdit: () => onEdit(workspace)
|
|
@@ -10439,26 +11015,26 @@ function ProjectSwitcher({ items, current, attention, compact = false, onPick, o
|
|
|
10439
11015
|
const out = /* @__PURE__ */ new Map();
|
|
10440
11016
|
for (const workspace of items) {
|
|
10441
11017
|
const { dir, name } = displayNameOf(workspace);
|
|
10442
|
-
out.set(workspace.workspaceId, /* @__PURE__ */
|
|
11018
|
+
out.set(workspace.workspaceId, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.triggerName }, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.name }, name)));
|
|
10443
11019
|
}
|
|
10444
11020
|
return out;
|
|
10445
11021
|
}, [items]);
|
|
10446
|
-
return /* @__PURE__ */
|
|
11022
|
+
return /* @__PURE__ */ createElement("div", { className: cx(ProjectSwitcher_module_default.root, compact && ProjectSwitcher_module_default.rail) }, /* @__PURE__ */ createElement(SelectField, {
|
|
10447
11023
|
value: currentId,
|
|
10448
11024
|
options,
|
|
10449
11025
|
onChange: onPick,
|
|
10450
11026
|
open,
|
|
10451
11027
|
onOpenChange: setOpen,
|
|
10452
|
-
icon: /* @__PURE__ */
|
|
11028
|
+
icon: /* @__PURE__ */ createElement(Tip, {
|
|
10453
11029
|
label: current?.path ?? "",
|
|
10454
11030
|
disabled: current === null
|
|
10455
|
-
}, /* @__PURE__ */
|
|
11031
|
+
}, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.glyphBox }, /* @__PURE__ */ createElement("span", { className: cx(ProjectSwitcher_module_default.glyph, ProjectSwitcher_module_default.glyphActive) }, /* @__PURE__ */ createElement(IconFolderCloseRegular, { size: 16 }), compact ? /* @__PURE__ */ createElement(WorkspaceAttentionDot, {
|
|
10456
11032
|
attention: attention.overall,
|
|
10457
11033
|
t,
|
|
10458
11034
|
variant: "overlay",
|
|
10459
11035
|
tip: true
|
|
10460
11036
|
}) : null))),
|
|
10461
|
-
renderValue: compact ? void 0 : (option) => /* @__PURE__ */
|
|
11037
|
+
renderValue: compact ? void 0 : (option) => /* @__PURE__ */ createElement(Fragment, null, option === void 0 ? t("project.none") : valueNodes.get(option.value) ?? option.label, /* @__PURE__ */ createElement(WorkspaceAttentionTag, {
|
|
10462
11038
|
attention: attention.elsewhere,
|
|
10463
11039
|
t
|
|
10464
11040
|
})),
|
|
@@ -10477,10 +11053,10 @@ function ProjectSwitcher({ items, current, attention, compact = false, onPick, o
|
|
|
10477
11053
|
},
|
|
10478
11054
|
footer: {
|
|
10479
11055
|
label: t("project.add"),
|
|
10480
|
-
icon: /* @__PURE__ */
|
|
11056
|
+
icon: /* @__PURE__ */ createElement(IconPlusOutlineRegular, { size: 14 })
|
|
10481
11057
|
},
|
|
10482
11058
|
onFooter: onAdd
|
|
10483
|
-
}), naming === null ? null : /* @__PURE__ */
|
|
11059
|
+
}), naming === null ? null : /* @__PURE__ */ createElement(WorkspaceRenameDialog, {
|
|
10484
11060
|
key: naming.workspaceId,
|
|
10485
11061
|
workspace: naming,
|
|
10486
11062
|
t,
|
|
@@ -10551,17 +11127,17 @@ function useTitleMarquee(title) {
|
|
|
10551
11127
|
function SessionLeading({ node, statuses, renderSlot }) {
|
|
10552
11128
|
if (node.blank) return null;
|
|
10553
11129
|
const primary = statuses[0];
|
|
10554
|
-
if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */
|
|
10555
|
-
return /* @__PURE__ */
|
|
11130
|
+
if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */ createElement(Fragment, null, renderSlot("sidebar.session.row.leading", { sessionId: node.id }));
|
|
11131
|
+
return /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(StateDot, { state: primary.state }), statuses.map((status) => /* @__PURE__ */ createElement("span", {
|
|
10556
11132
|
className: "wb-visuallyHidden",
|
|
10557
11133
|
key: status.label
|
|
10558
11134
|
}, status.label)));
|
|
10559
11135
|
}
|
|
10560
11136
|
function SessionHoverContent({ node, statuses, renderSlot, t }) {
|
|
10561
|
-
return /* @__PURE__ */
|
|
11137
|
+
return /* @__PURE__ */ createElement("div", { className: "wb-sessionHover" }, /* @__PURE__ */ createElement("div", { className: "wb-sessionHoverTitle" }, node.blank ? t("session.new") : node.title), node.blank ? null : /* @__PURE__ */ createElement("div", { className: "wb-sessionHoverTime" }, relativeTimeAgo(node.updatedAt, t)), renderSlot("sidebar.session.row.hover", { sessionId: node.id }), statuses.map((status) => /* @__PURE__ */ createElement("div", {
|
|
10562
11138
|
className: "wb-sessionHoverStatus",
|
|
10563
11139
|
key: status.label
|
|
10564
|
-
}, /* @__PURE__ */
|
|
11140
|
+
}, /* @__PURE__ */ createElement(StateDot, { state: status.state }), /* @__PURE__ */ createElement("span", null, status.label))));
|
|
10565
11141
|
}
|
|
10566
11142
|
function SessionRow({ node, active, onOpen, renderSlot, t }) {
|
|
10567
11143
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
@@ -10575,36 +11151,36 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
|
|
|
10575
11151
|
sessionId: node.id,
|
|
10576
11152
|
displayTitle: node.title
|
|
10577
11153
|
};
|
|
10578
|
-
return /* @__PURE__ */
|
|
10579
|
-
anchor: /* @__PURE__ */
|
|
11154
|
+
return /* @__PURE__ */ createElement(HoverCard, {
|
|
11155
|
+
anchor: /* @__PURE__ */ createElement("div", {
|
|
10580
11156
|
className: cx("wb-sessionRow", active && "wb-selected", menuOpen && "wb-menuOpen"),
|
|
10581
11157
|
role: "treeitem",
|
|
10582
11158
|
"aria-selected": active,
|
|
10583
11159
|
onClick: () => onOpen(node.id),
|
|
10584
11160
|
onPointerEnter: marquee.enter,
|
|
10585
11161
|
onPointerLeave: marquee.leave
|
|
10586
|
-
}, /* @__PURE__ */
|
|
11162
|
+
}, /* @__PURE__ */ createElement("span", { className: "wb-sessionLeading" }, /* @__PURE__ */ createElement(SessionLeading, {
|
|
10587
11163
|
node,
|
|
10588
11164
|
statuses,
|
|
10589
11165
|
renderSlot
|
|
10590
|
-
})), /* @__PURE__ */
|
|
11166
|
+
})), /* @__PURE__ */ createElement("span", {
|
|
10591
11167
|
className: "wb-sessionTitle",
|
|
10592
11168
|
ref: titleRef
|
|
10593
|
-
}, label), node.blank ? null : /* @__PURE__ */
|
|
11169
|
+
}, label), node.blank ? null : /* @__PURE__ */ createElement("span", {
|
|
10594
11170
|
className: "wb-sessionTime",
|
|
10595
11171
|
"aria-hidden": trailing === void 0 ? void 0 : true
|
|
10596
|
-
}, trailing ?? relativeTimeCompact(node.updatedAt, t)), node.pinned ? /* @__PURE__ */
|
|
11172
|
+
}, trailing ?? relativeTimeCompact(node.updatedAt, t)), node.pinned ? /* @__PURE__ */ createElement(Tip, { label: t("session.pinned") }, /* @__PURE__ */ createElement("span", {
|
|
10597
11173
|
className: "wb-sessionPin",
|
|
10598
11174
|
role: "img",
|
|
10599
11175
|
"aria-label": t("session.pinned")
|
|
10600
|
-
}, /* @__PURE__ */
|
|
11176
|
+
}, /* @__PURE__ */ createElement(IconPinFillRegular, { size: 14 }))) : null, node.blank ? null : /* @__PURE__ */ createElement("span", {
|
|
10601
11177
|
className: "wb-rowActions",
|
|
10602
11178
|
onClick: (event) => event.stopPropagation()
|
|
10603
|
-
}, /* @__PURE__ */
|
|
11179
|
+
}, /* @__PURE__ */ createElement(Menu, {
|
|
10604
11180
|
open: menuOpen,
|
|
10605
11181
|
portal: true,
|
|
10606
11182
|
closeOnPointerLeave: true,
|
|
10607
|
-
anchor: /* @__PURE__ */
|
|
11183
|
+
anchor: /* @__PURE__ */ createElement("button", {
|
|
10608
11184
|
type: "button",
|
|
10609
11185
|
className: "wb-iconButton",
|
|
10610
11186
|
"aria-haspopup": "menu",
|
|
@@ -10614,10 +11190,10 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
|
|
|
10614
11190
|
event.stopPropagation();
|
|
10615
11191
|
setMenuOpen((value) => !value);
|
|
10616
11192
|
}
|
|
10617
|
-
}, /* @__PURE__ */
|
|
11193
|
+
}, /* @__PURE__ */ createElement(IconEllipsisOutlineRegular, { size: 16 })),
|
|
10618
11194
|
onClose: () => setMenuOpen(false)
|
|
10619
11195
|
}, renderSlot("sidebar.workspaces.session.menu.item", owner, { hookContext: menuState })), renderSlot("sidebar.workspaces.session.row.action", owner))),
|
|
10620
|
-
content: /* @__PURE__ */
|
|
11196
|
+
content: /* @__PURE__ */ createElement(SessionHoverContent, {
|
|
10621
11197
|
node,
|
|
10622
11198
|
statuses,
|
|
10623
11199
|
renderSlot,
|
|
@@ -10668,14 +11244,14 @@ function SessionList({ workspace, pinnedIds, archived, panelActive, longTasks, u
|
|
|
10668
11244
|
]);
|
|
10669
11245
|
const listRef = useRef(null);
|
|
10670
11246
|
const edges = useScrollEdges(listRef, rows);
|
|
10671
|
-
if (workspace === null) return /* @__PURE__ */
|
|
10672
|
-
if (rows.length === 0) return /* @__PURE__ */
|
|
10673
|
-
return /* @__PURE__ */
|
|
11247
|
+
if (workspace === null) return /* @__PURE__ */ createElement("div", { className: "wb-empty" }, t("session.noProject"));
|
|
11248
|
+
if (rows.length === 0) return /* @__PURE__ */ createElement("div", { className: "wb-empty" }, t("session.empty"));
|
|
11249
|
+
return /* @__PURE__ */ createElement("div", {
|
|
10674
11250
|
ref: listRef,
|
|
10675
11251
|
className: cx("wb-sessions", edges.canScrollUp && "wb-fadeTop", edges.canScrollDown && "wb-fadeBottom"),
|
|
10676
11252
|
role: "tree",
|
|
10677
11253
|
"aria-label": t("session.list.label")
|
|
10678
|
-
}, rows.map((row) => /* @__PURE__ */
|
|
11254
|
+
}, rows.map((row) => /* @__PURE__ */ createElement(SessionRow, {
|
|
10679
11255
|
key: row.id,
|
|
10680
11256
|
node: sessionNode(row, statusById, list, pinned, archivedSet, longTasks.bySession),
|
|
10681
11257
|
active: row.id === currentId,
|
|
@@ -10758,10 +11334,10 @@ function Sidebar(props) {
|
|
|
10758
11334
|
});
|
|
10759
11335
|
};
|
|
10760
11336
|
const wide = !collapsed;
|
|
10761
|
-
return /* @__PURE__ */
|
|
11337
|
+
return /* @__PURE__ */ createElement("div", {
|
|
10762
11338
|
className: cx("wb-root", collapsed && "wb-collapsed"),
|
|
10763
11339
|
"data-wb-where": board.path ?? void 0
|
|
10764
|
-
}, /* @__PURE__ */
|
|
11340
|
+
}, /* @__PURE__ */ createElement(SidebarHeader, {
|
|
10765
11341
|
collapsed,
|
|
10766
11342
|
wide,
|
|
10767
11343
|
attention: attention.overall,
|
|
@@ -10769,10 +11345,10 @@ function Sidebar(props) {
|
|
|
10769
11345
|
renderSlot,
|
|
10770
11346
|
onToggle: props.toggleSidebar,
|
|
10771
11347
|
onSelectPanel: props.selectPanel
|
|
10772
|
-
}), /* @__PURE__ */
|
|
11348
|
+
}), /* @__PURE__ */ createElement("nav", {
|
|
10773
11349
|
className: "wb-panelList",
|
|
10774
11350
|
"aria-label": t("panels.label")
|
|
10775
|
-
}, panelEntries.map((entry) => /* @__PURE__ */
|
|
11351
|
+
}, panelEntries.map((entry) => /* @__PURE__ */ createElement(PanelRow, {
|
|
10776
11352
|
key: entry.id,
|
|
10777
11353
|
id: entry.id,
|
|
10778
11354
|
label: panelLabel(entry),
|
|
@@ -10784,7 +11360,7 @@ function Sidebar(props) {
|
|
|
10784
11360
|
size: isWide ? 16 : 18,
|
|
10785
11361
|
active
|
|
10786
11362
|
}, { only: id })
|
|
10787
|
-
}))), wide ? /* @__PURE__ */
|
|
11363
|
+
}))), wide ? /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(ProjectSwitcher, {
|
|
10788
11364
|
items,
|
|
10789
11365
|
current,
|
|
10790
11366
|
attention,
|
|
@@ -10792,10 +11368,10 @@ function Sidebar(props) {
|
|
|
10792
11368
|
onAdd: addProject,
|
|
10793
11369
|
onRename: props.renameWorkspace,
|
|
10794
11370
|
t
|
|
10795
|
-
}), creating ? /* @__PURE__ */
|
|
11371
|
+
}), creating ? /* @__PURE__ */ createElement("p", {
|
|
10796
11372
|
className: "wb-workspaceBusy",
|
|
10797
11373
|
role: "status"
|
|
10798
|
-
}, /* @__PURE__ */
|
|
11374
|
+
}, /* @__PURE__ */ createElement(Spinner, { size: 12 }), t("project.add.busy")) : null, createFailed ? /* @__PURE__ */ createElement("p", { className: "wb-workspaceError" }, t("project.add.failed")) : null) : /* @__PURE__ */ createElement(ProjectSwitcher, {
|
|
10799
11375
|
items,
|
|
10800
11376
|
current,
|
|
10801
11377
|
attention,
|
|
@@ -10804,7 +11380,7 @@ function Sidebar(props) {
|
|
|
10804
11380
|
onAdd: addProject,
|
|
10805
11381
|
onRename: props.renameWorkspace,
|
|
10806
11382
|
t
|
|
10807
|
-
}), /* @__PURE__ */
|
|
11383
|
+
}), /* @__PURE__ */ createElement(WorkspaceSection, {
|
|
10808
11384
|
t,
|
|
10809
11385
|
wide,
|
|
10810
11386
|
onNewSession: () => {
|
|
@@ -10817,7 +11393,7 @@ function Sidebar(props) {
|
|
|
10817
11393
|
startSession
|
|
10818
11394
|
});
|
|
10819
11395
|
}
|
|
10820
|
-
}), /* @__PURE__ */
|
|
11396
|
+
}), /* @__PURE__ */ createElement("div", { className: "wb-regionArea" }, wide ? /* @__PURE__ */ createElement(SessionList, {
|
|
10821
11397
|
workspace: current,
|
|
10822
11398
|
pinnedIds,
|
|
10823
11399
|
archived,
|
|
@@ -10828,7 +11404,41 @@ function Sidebar(props) {
|
|
|
10828
11404
|
onOpen: props.openSession,
|
|
10829
11405
|
renderSlot,
|
|
10830
11406
|
t
|
|
10831
|
-
}) : null), /* @__PURE__ */
|
|
11407
|
+
}) : null), /* @__PURE__ */ createElement("div", { className: "wb-footArea" }, /* @__PURE__ */ createElement("div", { className: "wb-footerActions" }, renderSlot("sidebar.footer.action", { wide })), /* @__PURE__ */ createElement("div", { className: "wb-settingsArea" }, renderSlot("sidebar.settings", { wide }))));
|
|
11408
|
+
}
|
|
11409
|
+
var LongTaskDot_module_default = {
|
|
11410
|
+
dot: "_dot_14w1n_1",
|
|
11411
|
+
hover: "_hover_14w1n_6"
|
|
11412
|
+
};
|
|
11413
|
+
//#endregion
|
|
11414
|
+
//#region src/app/layouts/sidebar/LongTaskDot.tsx
|
|
11415
|
+
/**
|
|
11416
|
+
* 会话行前面那颗「长任务还在跑」的点;两种左栏共用同一个 `sidebar.session.row.leading` 座位。
|
|
11417
|
+
* @param props.sessionId - 这一行的会话。
|
|
11418
|
+
* @param props.t - 词表(只在提示里用)。
|
|
11419
|
+
* @returns 有长任务时一个状态点,否则 `null`。
|
|
11420
|
+
*/
|
|
11421
|
+
function LongTaskDot({ sessionId, t }) {
|
|
11422
|
+
if (!useLongTaskPresence().bySession.has(sessionId)) return null;
|
|
11423
|
+
return /* @__PURE__ */ createElement(Tip, { label: t("status.longTask") }, /* @__PURE__ */ createElement("span", {
|
|
11424
|
+
className: LongTaskDot_module_default.dot,
|
|
11425
|
+
role: "img",
|
|
11426
|
+
"aria-label": t("status.longTask")
|
|
11427
|
+
}, /* @__PURE__ */ createElement(StateDot, { state: "ongoing" })));
|
|
11428
|
+
}
|
|
11429
|
+
//#endregion
|
|
11430
|
+
//#region src/app/layouts/sidebar/LongTaskHover.tsx
|
|
11431
|
+
/**
|
|
11432
|
+
* 悬停卡里那行「长任务在跑」;两种左栏共用一个 `sidebar.session.row.hover` 座位。
|
|
11433
|
+
* @param props.sessionId - 这一行的会话。
|
|
11434
|
+
* @param props.t - 词表。
|
|
11435
|
+
* @returns 有长任务时一行灰字,否则 `null`。
|
|
11436
|
+
*/
|
|
11437
|
+
function LongTaskHover({ sessionId, t }) {
|
|
11438
|
+
const edition = useRuntimeSidebarEdition();
|
|
11439
|
+
const presence = useLongTaskPresence();
|
|
11440
|
+
if (edition !== "official" || !presence.bySession.has(sessionId)) return null;
|
|
11441
|
+
return /* @__PURE__ */ createElement("div", { className: LongTaskDot_module_default.hover }, /* @__PURE__ */ createElement(StateDot, { state: "ongoing" }), /* @__PURE__ */ createElement("span", null, t("status.longTask")));
|
|
10832
11442
|
}
|
|
10833
11443
|
//#endregion
|
|
10834
11444
|
//#region src/shared/styles/rightbar.css?raw
|
|
@@ -11030,6 +11640,30 @@ function useBlockerActions(onRetry, onOpenMarket) {
|
|
|
11030
11640
|
failure
|
|
11031
11641
|
};
|
|
11032
11642
|
}
|
|
11643
|
+
//#endregion
|
|
11644
|
+
//#region src/shared/components/blocker-action.ts
|
|
11645
|
+
/**
|
|
11646
|
+
* 这颗钮此刻该不该按成等待态:这一轮忙还没收,或有一支正在跑。
|
|
11647
|
+
* @param busy - 这一轮忙是不是还在。
|
|
11648
|
+
* @param running - 正在跑的那一支的 label;没有就给 `null`。
|
|
11649
|
+
* @returns 该等待给 `true`,否则 `false`。
|
|
11650
|
+
*/
|
|
11651
|
+
function blockerPending(busy, running) {
|
|
11652
|
+
return busy || running !== null;
|
|
11653
|
+
}
|
|
11654
|
+
/**
|
|
11655
|
+
* 这颗钮此刻该显示什么字:正在重试说「重试中…」,正在跑的那一支说「修复中…」,刚复制过的说「已复制」,其余原样。
|
|
11656
|
+
* @param action - 这颗钮的形状(行为 + 平时文案)。
|
|
11657
|
+
* @param state - 此刻的运行态。
|
|
11658
|
+
* @param t - i18n 取词函数。
|
|
11659
|
+
* @returns 要显示的文案;三种临时态都不成立时就是 `action.label`。
|
|
11660
|
+
*/
|
|
11661
|
+
function blockerActionLabel(action, state, t) {
|
|
11662
|
+
if (action.kind === "retry" && state.retrying) return t("blocker.retry.running");
|
|
11663
|
+
if (state.running === action.label) return t("blocker.fix.running");
|
|
11664
|
+
if (action.kind === "copy" && state.copied === action.text) return t("env.copied");
|
|
11665
|
+
return action.label;
|
|
11666
|
+
}
|
|
11033
11667
|
var BlockerState_module_default = {
|
|
11034
11668
|
blocker: "_blocker_1oaj0_1",
|
|
11035
11669
|
icon: "_icon_1oaj0_10",
|
|
@@ -11067,7 +11701,7 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
|
|
|
11067
11701
|
const pending = blockerPending(busy, running);
|
|
11068
11702
|
const inlineActions = blocker.actions.filter((action) => action.kind === "open-url" && action.inline === true);
|
|
11069
11703
|
const buttonActions = blocker.actions.filter((action) => !(action.kind === "open-url" && action.inline === true) || blocker.hint === void 0);
|
|
11070
|
-
const buttons = buttonActions.map((action, index) => /* @__PURE__ */
|
|
11704
|
+
const buttons = buttonActions.map((action, index) => /* @__PURE__ */ createElement(Button, {
|
|
11071
11705
|
key: `${action.kind}:${action.label}`,
|
|
11072
11706
|
type: "button",
|
|
11073
11707
|
size: "sm",
|
|
@@ -11079,35 +11713,35 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
|
|
|
11079
11713
|
running,
|
|
11080
11714
|
copied
|
|
11081
11715
|
}, t)));
|
|
11082
|
-
const failureBlock = failure === null ? null : /* @__PURE__ */
|
|
11083
|
-
if (blocker.severity === "notice") return /* @__PURE__ */
|
|
11716
|
+
const failureBlock = failure === null ? null : /* @__PURE__ */ createElement("p", { className: BlockerState_module_default.failure }, t("blocker.fix.failed"), failure.message, failure.detail === void 0 ? null : /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.failureDetail }, failure.detail));
|
|
11717
|
+
if (blocker.severity === "notice") return /* @__PURE__ */ createElement("div", {
|
|
11084
11718
|
className: `${BlockerState_module_default.notice}${flush ? ` ${BlockerState_module_default.noticeFlat}` : ""}`,
|
|
11085
11719
|
role: "status",
|
|
11086
11720
|
"aria-busy": pending
|
|
11087
|
-
}, /* @__PURE__ */
|
|
11088
|
-
return /* @__PURE__ */
|
|
11721
|
+
}, /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.noticeText }, /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.noticeTitle }, blocker.title), blocker.hint === void 0 ? null : /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.noticeHint }, blocker.hint)), /* @__PURE__ */ createElement("span", { className: BlockerState_module_default.noticeActions }, buttons), failureBlock);
|
|
11722
|
+
return /* @__PURE__ */ createElement("div", {
|
|
11089
11723
|
className: `${BlockerState_module_default.blocker}${flush ? ` ${BlockerState_module_default.blockerInline}` : ""}`,
|
|
11090
11724
|
role: "status",
|
|
11091
11725
|
"aria-busy": pending
|
|
11092
|
-
}, flush ? null : /* @__PURE__ */
|
|
11726
|
+
}, flush ? null : /* @__PURE__ */ createElement("span", {
|
|
11093
11727
|
className: BlockerState_module_default.icon,
|
|
11094
11728
|
"aria-hidden": "true"
|
|
11095
|
-
}, /* @__PURE__ */
|
|
11729
|
+
}, /* @__PURE__ */ createElement(IconBrandMark, { size: 32 })), /* @__PURE__ */ createElement("p", { className: BlockerState_module_default.title }, blocker.title), blocker.hint === void 0 && inlineActions.length === 0 ? null : /* @__PURE__ */ createElement("p", { className: BlockerState_module_default.hint }, blocker.hint, inlineActions.map((action) => /* @__PURE__ */ createElement("button", {
|
|
11096
11730
|
key: `inline:${action.kind}:${action.label}`,
|
|
11097
11731
|
type: "button",
|
|
11098
11732
|
className: `wb-link ${BlockerState_module_default.inlineAction}`,
|
|
11099
11733
|
disabled: pending,
|
|
11100
11734
|
onClick: () => run(action)
|
|
11101
|
-
}, action.label, /* @__PURE__ */
|
|
11735
|
+
}, action.label, /* @__PURE__ */ createElement(IconRightUpOutlineRegular, { size: 12 })))), buttonActions.length === 0 ? null : /* @__PURE__ */ createElement("div", { className: BlockerState_module_default.actions }, buttons), failureBlock, blocker.detail === void 0 ? null : /* @__PURE__ */ createElement(DisclosureRow, {
|
|
11102
11736
|
className: BlockerState_module_default.raw,
|
|
11103
|
-
icon: /* @__PURE__ */
|
|
11737
|
+
icon: /* @__PURE__ */ createElement(IconInfoOutlineRegular, { size: 14 }),
|
|
11104
11738
|
title: t("env.fix.details"),
|
|
11105
11739
|
open: rawOpen,
|
|
11106
11740
|
expandable: true,
|
|
11107
11741
|
expandOnRowClick: true,
|
|
11108
11742
|
previewChevron: true,
|
|
11109
11743
|
onToggle: () => setRawOpen(!rawOpen)
|
|
11110
|
-
}, /* @__PURE__ */
|
|
11744
|
+
}, /* @__PURE__ */ createElement(CodeBlock, {
|
|
11111
11745
|
code: blocker.detail,
|
|
11112
11746
|
className: BlockerState_module_default.rawText,
|
|
11113
11747
|
copyLabel: t("blocker.copy"),
|
|
@@ -11171,6 +11805,7 @@ var kit = {
|
|
|
11171
11805
|
api: {
|
|
11172
11806
|
apiGet,
|
|
11173
11807
|
apiPost,
|
|
11808
|
+
factOfRoute,
|
|
11174
11809
|
...context_chips_exports
|
|
11175
11810
|
},
|
|
11176
11811
|
lib: {
|
|
@@ -11211,7 +11846,7 @@ function messagesOf(units) {
|
|
|
11211
11846
|
...face.messages === void 0 ? {} : { messages: face.messages }
|
|
11212
11847
|
}));
|
|
11213
11848
|
}
|
|
11214
|
-
var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-formActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n\n.wb-formActionDanger {\n color: var(--dsw-alias-state-error-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.wb-rows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n}\n.wb-rows > :not(.wb-row) {\n grid-column: 1 / -1;\n}\n.wb-row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows > .wb-row {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-rows > .wb-row {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-confirmBar {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n width: 100%;\n box-sizing: border-box;\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-confirmBarTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 600;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-confirmBarHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formRows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-12);\n}\n\n.wb-formRows > :not(.wb-formRow) {\n grid-column: 1 / -1;\n}\n\n.wb-formRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: center;\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formRows > .wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: nowrap;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formLabel {\n white-space: normal;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formHint,\n.wb-formRow[data-layout='stacked'] .wb-formProblem {\n grid-column: 1 / -1;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formControl\n > :where(\n .wb-selectAnchor,\n .wb-choiceMenu,\n input:not(\n [type='checkbox'],\n [type='radio'],\n [type='button'],\n [type='submit'],\n [type='reset'],\n [type='image'],\n [type='color'],\n [type='range']\n ),\n select,\n textarea\n ) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n\n.wb-formRows > .wb-formRow {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-formRows > .wb-formRow {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-form {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n width: 100%;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n\n.wb-longTaskStop {\n display: inline-flex;\n flex: none;\n align-items: center;\n align-self: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n padding: 0;\n margin-left: auto;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-longTaskStop:hover:not(:disabled),\n.wb-longTaskStop:focus-visible {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStop:disabled {\n cursor: default;\n}\n\n.wb-longTaskStopArmed,\n.wb-longTaskStopArmed:hover:not(:disabled),\n.wb-longTaskStopArmed:focus-visible {\n gap: var(--wb-len-4);\n width: auto;\n padding: 0 var(--wb-len-7);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStopLabel {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n.wb-longTaskStopWhy {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectIconOnly {\n width: var(--wb-len-36);\n height: var(--wb-len-36);\n min-height: 0;\n gap: 0;\n padding: 0;\n justify-content: center;\n}\n\n.wb-selectReveal {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.wb-selectIconOnly .wb-selectIcon {\n width: 100%;\n height: 100%;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_1rftb_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_1rftb_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_1rftb_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_1rftb_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_1rftb_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_1rftb_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_1rftb_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_1rftb_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_1rftb_39 ._marketVersion_1rftb_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_1rftb_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_1rftb_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_1rftb_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_1rftb_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1rftb_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1rftb_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_1rftb_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_1rftb_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_1rftb_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_1rftb_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_1rftb_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_1rftb_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_1rftb_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_1rftb_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketSectionTitle_1rftb_163 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketName_1rftb_39 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketDesc_1rftb_48 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketIcon_1rftb_20 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._marketProgress_1rftb_192 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_1rftb_202 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_1rftb_209 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_1rftb_217 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_1rftb_224 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_1rftb_229 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_1rftb_229 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_1rftb_247 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_1rftb_255 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_1rftb_260 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_1rftb_266 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_1rftb_275 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_1rftb_275:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_1rftb_275:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_1rftb_300 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_1rftb_304 svg {\n animation: _wb-spin_1rftb_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_1rftb_308 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_1rftb_224 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_1rftb_325 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_1rftb_333 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_1rftb_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._slot_1t7dx_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1t7dx_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1t7dx_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1t7dx_31 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._paused_1t7dx_35 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._trouble_1t7dx_39 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._pulse_1t7dx_43 {\n animation: _wb-debug-breathe_1t7dx_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-debug-breathe_1t7dx_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1t7dx_43 {\n animation: none;\n }\n}\n\n._entry_1t7dx_64 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1t7dx_71 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1t7dx_78 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1t7dx_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: 0;\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n}\n\n._act_1t7dx_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1t7dx_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._actStop_1t7dx_110:hover,\n._actStop_1t7dx_110:focus-visible {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._actArmed_1t7dx_115,\n._actArmed_1t7dx_115:hover,\n._actArmed_1t7dx_115:focus-visible {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n width: auto;\n color: var(--dsw-alias-state-error-primary);\n gap: var(--wb-len-4);\n padding: 0 var(--wb-len-7);\n}\n\n._actLabel_1t7dx_125 {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._entryLine_1t7dx_131 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1t7dx_138 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1t7dx_150 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1t7dx_156 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1t7dx_162 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._slot_1gkj9_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1gkj9_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1gkj9_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1gkj9_31 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._done_1gkj9_35 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._pulse_1gkj9_39 {\n animation: _wb-record-breathe_1gkj9_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-record-breathe_1gkj9_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1gkj9_39 {\n animation: none;\n }\n}\n\n._entry_1gkj9_60 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1gkj9_67 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1gkj9_74 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1gkj9_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-22);\n padding: 0 var(--wb-len-7);\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._act_1gkj9_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1gkj9_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._entryLine_1gkj9_108 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1gkj9_115 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1gkj9_127 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1gkj9_133 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1gkj9_139 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_1whum_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_1whum_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1whum_1[data-open] {\n visibility: visible;\n}\n\n._columns_1whum_18 {\n display: block;\n column-gap: var(--wb-len-12);\n}\n\n._cell_1whum_23 {\n display: flow-root;\n min-width: 0;\n break-inside: avoid;\n margin-bottom: var(--wb-len-12);\n}\n._root_1cmz0_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._rail_1cmz0_7 {\n margin: 0 0 var(--wb-len-4);\n}\n\n._glyphBox_1cmz0_11 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n._glyph_1cmz0_11 {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1cmz0_30 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1cmz0_34 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1cmz0_45 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1cmz0_53 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1cmz0_34 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1cmz0_66 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1cmz0_74 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1cmz0_74 ._rowAction_1cmz0_84 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1cmz0_66 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1cmz0_97 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dot_sosf1_1 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n._overlay_sosf1_8 {\n position: absolute;\n inset-block-start: var(--wb-len-neg-3);\n inset-inline-end: var(--wb-len-neg-3);\n}\n._tag_g9dg8_1 {\n flex: none;\n margin-inline-start: auto;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
|
|
11849
|
+
var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-formActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n\n.wb-formActionDanger {\n color: var(--dsw-alias-state-error-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.wb-rows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n}\n.wb-rows > :not(.wb-row) {\n grid-column: 1 / -1;\n}\n.wb-row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: baseline;\n gap: var(--wb-len-8);\n padding: var(--wb-len-4) 0;\n}\n.wb-row + .wb-row {\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n.wb-rowKey {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-rowValue {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-rows > .wb-row {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-rows > .wb-row {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-confirmBar {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n width: 100%;\n box-sizing: border-box;\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-confirmBarTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 600;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-confirmBarHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formRows {\n display: grid;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-12);\n}\n\n.wb-formRows > :not(.wb-formRow) {\n grid-column: 1 / -1;\n}\n\n.wb-formRow {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n align-items: center;\n column-gap: var(--wb-len-8);\n row-gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formRows > .wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: nowrap;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formLabel {\n white-space: normal;\n}\n\n.wb-formRow[data-layout='stacked'] .wb-formHint,\n.wb-formRow[data-layout='stacked'] .wb-formProblem {\n grid-column: 1 / -1;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formControl\n > :where(\n .wb-selectAnchor,\n .wb-choiceMenu,\n input:not(\n [type='checkbox'],\n [type='radio'],\n [type='button'],\n [type='submit'],\n [type='reset'],\n [type='image'],\n [type='color'],\n [type='range']\n ),\n select,\n textarea\n ) {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n\n.wb-formRows > .wb-formRow {\n grid-template-columns: subgrid;\n}\n\n@supports not (grid-template-columns: subgrid) {\n .wb-formRows > .wb-formRow {\n grid-template-columns: minmax(72px, max-content) minmax(0, 1fr);\n }\n}\n.wb-form {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n width: 100%;\n}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n\n.wb-longTaskStop {\n display: inline-flex;\n flex: none;\n align-items: center;\n align-self: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n padding: 0;\n margin-left: auto;\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-specific-menu);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-longTaskStop:hover:not(:disabled),\n.wb-longTaskStop:focus-visible {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStop:disabled {\n cursor: default;\n}\n\n.wb-longTaskStopArmed,\n.wb-longTaskStopArmed:hover:not(:disabled),\n.wb-longTaskStopArmed:focus-visible {\n gap: var(--wb-len-4);\n width: auto;\n padding: 0 var(--wb-len-7);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, transparent);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-longTaskStopLabel {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n.wb-longTaskStopWhy {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n.wb-centered.wb-centeredCompact {\n flex: none;\n min-height: 0;\n gap: var(--wb-len-8);\n padding: var(--wb-len-20) var(--wb-len-16);\n}\n\n.wb-centered.wb-centeredCompact .wb-centeredHero {\n margin-bottom: var(--wb-len-4);\n}\n\n.wb-skeleton {\n display: flex;\n flex-direction: column;\n}\n\n.wb-skeletonRow {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-skeletonRow + .wb-skeletonRow::before {\n content: '';\n align-self: stretch;\n height: var(--wb-len-0-5);\n margin: 0 var(--wb-len-8) var(--wb-len-neg-0-5);\n background: var(--dsw-alias-border-l2);\n}\n\n.wb-skeletonBar {\n display: block;\n height: var(--wb-len-13);\n border-radius: var(--dsw-radius-xs);\n background: var(--dsw-alias-bg-skeleton);\n animation: wb-skeleton-pulse var(--wb-dur-1-4) var(--ds-ease-in-out) infinite;\n}\n\n.wb-skeletonBarTitle {\n width: 62%;\n}\n\n.wb-skeletonBarMeta {\n width: 32%;\n height: var(--wb-len-10);\n}\n\n.wb-skeletonRow:nth-child(2n) .wb-skeletonBarTitle {\n width: 74%;\n}\n\n.wb-skeletonRow:nth-child(3n) .wb-skeletonBarTitle {\n width: 52%;\n}\n\n@keyframes wb-skeleton-pulse {\n 50% {\n opacity: 0.45;\n }\n}\n\n.wb-centered {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: var(--wb-len-14);\n flex: 1;\n min-height: var(--wb-len-240);\n padding: 0 var(--wb-len-24) var(--wb-len-24);\n text-align: center;\n}\n\n.wb-centeredHero {\n display: flex;\n margin-bottom: var(--wb-len-16);\n color: var(--dsw-alias-label-dimmed);\n}\n\n.wb-centeredTitle {\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-centeredHint {\n max-width: var(--wb-len-300);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-centeredDetail {\n max-width: var(--wb-len-320);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-dimmed);\n word-break: break-all;\n}\n\n.wb-centeredAction {\n display: flex;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n@media (prefers-reduced-motion: reduce) {\n .wb-skeletonBar {\n animation: none;\n }}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectIconOnly {\n width: var(--wb-len-36);\n height: var(--wb-len-36);\n min-height: 0;\n gap: 0;\n padding: 0;\n justify-content: center;\n}\n\n.wb-selectReveal {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.wb-selectIconOnly .wb-selectIcon {\n width: 100%;\n height: 100%;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_1rftb_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_1rftb_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_1rftb_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_1rftb_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_1rftb_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_1rftb_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_1rftb_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_1rftb_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_1rftb_39 ._marketVersion_1rftb_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_1rftb_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_1rftb_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_1rftb_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_1rftb_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1rftb_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_1rftb_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_1rftb_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_1rftb_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_1rftb_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_1rftb_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_1rftb_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_1rftb_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_1rftb_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_1rftb_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketSectionTitle_1rftb_163 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketName_1rftb_39 {\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketDesc_1rftb_48 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._marketSectionQuiet_1rftb_175 ._marketIcon_1rftb_20 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n\n._marketProgress_1rftb_192 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_1rftb_202 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_1rftb_209 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_1rftb_217 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_1rftb_224 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_1rftb_229 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_1rftb_229 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_1rftb_247 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_1rftb_255 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_1rftb_260 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_1rftb_266 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_1rftb_275 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_1rftb_275:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_1rftb_275:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_1rftb_300 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_1rftb_304 svg {\n animation: _wb-spin_1rftb_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_1rftb_308 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_1rftb_224 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_1rftb_325 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_1rftb_333 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_1rftb_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._slot_1t7dx_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1t7dx_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1t7dx_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1t7dx_31 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._paused_1t7dx_35 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._trouble_1t7dx_39 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._pulse_1t7dx_43 {\n animation: _wb-debug-breathe_1t7dx_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-debug-breathe_1t7dx_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1t7dx_43 {\n animation: none;\n }\n}\n\n._entry_1t7dx_64 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1t7dx_71 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1t7dx_78 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1t7dx_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: 0;\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n}\n\n._act_1t7dx_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1t7dx_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._actStop_1t7dx_110:hover,\n._actStop_1t7dx_110:focus-visible {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._actArmed_1t7dx_115,\n._actArmed_1t7dx_115:hover,\n._actArmed_1t7dx_115:focus-visible {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent);\n width: auto;\n color: var(--dsw-alias-state-error-primary);\n gap: var(--wb-len-4);\n padding: 0 var(--wb-len-7);\n}\n\n._actLabel_1t7dx_125 {\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._entryLine_1t7dx_131 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1t7dx_138 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1t7dx_150 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1t7dx_156 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1t7dx_162 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._slot_1gkj9_1 {\n display: flex;\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._slot_1gkj9_1 > * {\n flex: 0 0 100%;\n min-width: 0;\n}\n\n._action_1gkj9_12 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n flex: 1 1 0;\n width: 100%;\n min-width: 0;\n min-height: var(--wb-len-36);\n margin: 0 var(--wb-len-2);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: default;\n overflow: hidden;\n gap: var(--wb-len-4);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n}\n\n._live_1gkj9_31 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._done_1gkj9_35 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._pulse_1gkj9_39 {\n animation: _wb-record-breathe_1gkj9_1 var(--wb-dur-1-5) var(--ds-ease-in-out, ease-in-out) infinite;\n}\n\n@keyframes _wb-record-breathe_1gkj9_1 {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.35;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._pulse_1gkj9_39 {\n animation: none;\n }\n}\n\n._entry_1gkj9_60 {\n display: flex;\n align-items: center;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n._entryInner_1gkj9_67 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._acts_1gkj9_74 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-2);\n flex: none;\n}\n\n._act_1gkj9_12 {\n appearance: none;\n border: 0;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-22);\n padding: 0 var(--wb-len-7);\n border-radius: var(--dsw-radius-sm, var(--wb-len-6));\n flex: none;\n cursor: pointer;\n white-space: nowrap;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-18);\n}\n\n._act_1gkj9_12:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._act_1gkj9_12:focus-visible {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n._entryLine_1gkj9_108 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._actionRail_1gkj9_115 {\n justify-content: center;\n flex: none;\n width: var(--wb-len-36);\n min-width: var(--wb-len-36);\n height: var(--wb-len-36);\n margin: 0;\n padding: 0;\n corner-shape: round;\n border-radius: 50%;\n}\n\n._card_1gkj9_127 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._cardTitle_1gkj9_133 {\n color: var(--dsw-alias-label-primary);\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n}\n\n._cardNote_1gkj9_139 {\n color: var(--dsw-alias-label-secondary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n._item_lyox9_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n}\n\n._item_lyox9_1 + ._item_lyox9_1 {\n padding-top: var(--wb-len-14);\n border-top: var(--wb-len-0-5) solid var(--dsw-alias-settings-card-stroke);\n}\n\n._head_lyox9_12 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._title_lyox9_19 {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._description_lyox9_31 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._body_1rhdh_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._sources_1rhdh_7 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_1rhdh_14 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_1rhdh_19 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_1rhdh_22 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_1rhdh_29 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_1rhdh_35 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_1rhdh_45 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_1rhdh_55 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_1rhdh_62 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_1rhdh_67 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_1rhdh_73 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_1rhdh_73 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_1rhdh_92 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_1rhdh_99 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_1rhdh_99 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_1rhdh_111 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_1rhdh_116,\n._conflict_1rhdh_117 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_1rhdh_123 {\n display: flex;\n justify-content: flex-end;\n}\n._body_zi2j5_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_zi2j5_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._title_zi2j5_14 {\n font-size: var(--wb-font-18);\n line-height: var(--wb-line-24);\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_1whum_1 {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: var(--wb-z-10);\n visibility: hidden;\n}\n\n._panel_1whum_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1whum_1[data-open] {\n visibility: visible;\n}\n\n._columns_1whum_18 {\n display: block;\n column-gap: var(--wb-len-12);\n}\n\n._cell_1whum_23 {\n display: flow-root;\n min-width: 0;\n break-inside: avoid;\n margin-bottom: var(--wb-len-12);\n}\n._root_1cmz0_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._rail_1cmz0_7 {\n margin: 0 0 var(--wb-len-4);\n}\n\n._glyphBox_1cmz0_11 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n\n._glyph_1cmz0_11 {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._glyphActive_1cmz0_30 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1cmz0_34 {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n font-size: var(--wb-font-row);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n._dir_1cmz0_45 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1cmz0_53 {\n flex: 0 1 auto;\n max-width: 50%;\n font-size: var(--dsw-font-xxs-12-font-size);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._triggerName_1cmz0_34 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1cmz0_66 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1cmz0_74 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n margin-inline-start: auto;\n}\n\n._trailing_1cmz0_74 ._rowAction_1cmz0_84 {\n width: var(--wb-len-20);\n min-width: var(--wb-len-20);\n height: var(--wb-len-20);\n min-height: var(--wb-len-20);\n padding: 0;\n border-radius: var(--dsw-radius-sm);\n}\n\n._row_1cmz0_66 ._name_1cmz0_53 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1cmz0_97 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dot_sosf1_1 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n._overlay_sosf1_8 {\n position: absolute;\n inset-block-start: var(--wb-len-neg-3);\n inset-inline-end: var(--wb-len-neg-3);\n}\n._tag_g9dg8_1 {\n flex: none;\n margin-inline-start: auto;\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._dot_14w1n_1 {\n display: inline-flex;\n align-items: center;\n}\n\n._hover_14w1n_6 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
|
|
11215
11850
|
function workbenchCss() {
|
|
11216
11851
|
return `${tokens_default}\n${palette_default}\n${scale_default}\n${sidebar_default}\n${sidebar_app_default}\n${rightbar_default}\n${chrome_default}\n${board_default}\n${motion_default}\n${COMPONENT_CSS_MARKER}`;
|
|
11217
11852
|
}
|
|
@@ -11373,37 +12008,77 @@ function mount(ctx) {
|
|
|
11373
12008
|
ctx.effect(() => () => borrow.dispose(), "dsh-workbench: 官方椅面订阅与借道");
|
|
11374
12009
|
borrow.start();
|
|
11375
12010
|
if (store.getSnapshot().column === "workbench") armWorkbenchColumn();
|
|
11376
|
-
|
|
11377
|
-
|
|
11378
|
-
|
|
12011
|
+
let ownSidebarRegistered = false;
|
|
12012
|
+
const registerOwnSidebar = () => {
|
|
12013
|
+
if (ownSidebarRegistered) return;
|
|
12014
|
+
ownSidebarRegistered = true;
|
|
12015
|
+
ctx.slots.inject("sidebar", () => ctx.slots.register({
|
|
12016
|
+
name: "sidebar",
|
|
12017
|
+
priority: -1,
|
|
12018
|
+
locale: LOCALE_NS,
|
|
12019
|
+
children: sidebarChildren(ctx),
|
|
12020
|
+
inject: () => ({
|
|
12021
|
+
listPanels: () => readPanels(ctx),
|
|
12022
|
+
subscribePanels: (callback) => ctx.slots.subscribe("sidebar.panellist", callback),
|
|
12023
|
+
renameWorkspace: async (workspaceId, title) => {
|
|
12024
|
+
try {
|
|
12025
|
+
await ctx.workspaces.rename(workspaceId, title);
|
|
12026
|
+
return true;
|
|
12027
|
+
} catch {
|
|
12028
|
+
return false;
|
|
12029
|
+
}
|
|
12030
|
+
},
|
|
12031
|
+
openWorkspace: (workspaceId) => {
|
|
12032
|
+
ctx.uiWorkspace.openWorkspace(workspaceId);
|
|
12033
|
+
},
|
|
12034
|
+
createWorkspace: (path) => ctx.workspaces.create({ path }),
|
|
12035
|
+
pickDirectory: () => ctx.uiWorkspace.pickDirectory(),
|
|
12036
|
+
openSession: (sessionId) => ctx.uiWorkspace.openSession(sessionId),
|
|
12037
|
+
startSession: startSessionIn,
|
|
12038
|
+
toggleSidebar: () => ctx.layout.toggleSidebar(),
|
|
12039
|
+
selectPanel: (panelId) => ctx.layout.selectPanel(panelId)
|
|
12040
|
+
})
|
|
12041
|
+
}, Sidebar));
|
|
12042
|
+
};
|
|
12043
|
+
bootSidebarEdition(ctx, registerOwnSidebar);
|
|
12044
|
+
ctx.slots.inject("sidebar.session.row.leading", () => ctx.slots.register({
|
|
12045
|
+
name: "sidebar.session.row.leading",
|
|
12046
|
+
id: "long-task",
|
|
12047
|
+
order: 50,
|
|
11379
12048
|
locale: LOCALE_NS,
|
|
11380
|
-
|
|
11381
|
-
|
|
11382
|
-
|
|
11383
|
-
|
|
11384
|
-
|
|
11385
|
-
|
|
11386
|
-
|
|
11387
|
-
|
|
11388
|
-
|
|
11389
|
-
|
|
11390
|
-
|
|
11391
|
-
|
|
11392
|
-
|
|
11393
|
-
|
|
11394
|
-
|
|
11395
|
-
|
|
11396
|
-
|
|
11397
|
-
|
|
11398
|
-
|
|
11399
|
-
|
|
11400
|
-
|
|
11401
|
-
})
|
|
11402
|
-
|
|
12049
|
+
inject: () => ({ t: ctx.locale.bind(LOCALE_NS) })
|
|
12050
|
+
}, LongTaskDot));
|
|
12051
|
+
ctx.slots.inject("sidebar.session.row.hover", () => ctx.slots.register({
|
|
12052
|
+
name: "sidebar.session.row.hover",
|
|
12053
|
+
id: "long-task",
|
|
12054
|
+
order: 50,
|
|
12055
|
+
locale: LOCALE_NS,
|
|
12056
|
+
inject: () => ({ t: ctx.locale.bind(LOCALE_NS) })
|
|
12057
|
+
}, LongTaskHover));
|
|
12058
|
+
ctx.effect(() => {
|
|
12059
|
+
const mirror = () => {
|
|
12060
|
+
if (runtimeSidebarEdition() !== "official") return;
|
|
12061
|
+
const sessions = ctx.get("sessions");
|
|
12062
|
+
if (sessions === void 0) return;
|
|
12063
|
+
const current = currentSessionId(sessions.list.getSnapshot(), false);
|
|
12064
|
+
const workspace = workspaceOfSession(ctx.workspaces.list.getSnapshot().items, current);
|
|
12065
|
+
if (workspace === null) return;
|
|
12066
|
+
if (selectedProjectId() !== workspace.workspaceId) selectProject(workspace.workspaceId);
|
|
12067
|
+
};
|
|
12068
|
+
const sessions = ctx.get("sessions");
|
|
12069
|
+
const offWorkspaces = ctx.workspaces.list.subscribe(mirror);
|
|
12070
|
+
const offSessions = sessions?.list.subscribe?.(mirror) ?? (() => {});
|
|
12071
|
+
const offEdition = subscribeSidebarEdition(mirror);
|
|
12072
|
+
return () => {
|
|
12073
|
+
offWorkspaces();
|
|
12074
|
+
offSessions();
|
|
12075
|
+
offEdition();
|
|
12076
|
+
};
|
|
12077
|
+
}, "dsh-workbench: 官方左栏选中的项目就是右栏的项目");
|
|
11403
12078
|
registerMarketPanel(ctx, units);
|
|
11404
12079
|
registerDebugFooter(ctx);
|
|
11405
12080
|
registerRecordFooter(ctx);
|
|
11406
|
-
|
|
12081
|
+
registerWorkbenchSettingsSection(ctx);
|
|
11407
12082
|
ctx.effect(() => {
|
|
11408
12083
|
const workshop = workshopWorkspace();
|
|
11409
12084
|
if (workshop === void 0) return;
|
|
@@ -11433,16 +12108,16 @@ function mount(ctx) {
|
|
|
11433
12108
|
})
|
|
11434
12109
|
}, ColumnSwitch));
|
|
11435
12110
|
}
|
|
11436
|
-
var
|
|
11437
|
-
function
|
|
12111
|
+
var WORKBENCH_SETTINGS_SECTION_ID = "workbench-settings";
|
|
12112
|
+
function registerWorkbenchSettingsSection(ctx) {
|
|
11438
12113
|
ctx.slots.inject("settings.section", () => ctx.slots.register({
|
|
11439
12114
|
name: "settings.section",
|
|
11440
|
-
id:
|
|
12115
|
+
id: WORKBENCH_SETTINGS_SECTION_ID,
|
|
11441
12116
|
order: 40,
|
|
11442
12117
|
locale: LOCALE_NS,
|
|
11443
|
-
label: () => ctx.locale.bind(LOCALE_NS)("
|
|
12118
|
+
label: () => ctx.locale.bind(LOCALE_NS)("workbenchSettings.nav"),
|
|
11444
12119
|
inject: () => ({ t: ctx.locale.bind(LOCALE_NS) })
|
|
11445
|
-
},
|
|
12120
|
+
}, WorkbenchSettingsSection));
|
|
11446
12121
|
}
|
|
11447
12122
|
function sidebarChildren(ctx) {
|
|
11448
12123
|
return {
|