@dsh-workbench/core 0.3.9 → 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 +1687 -1022
- package/cordis.patch.yml +60 -35
- package/dist/client/client.body.js +1687 -1022
- package/dist/client/index.js +1372 -707
- package/dist/host/index.js +2897 -2335
- 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-rows.d.ts +1 -1
- 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-shared-rows.d.ts +0 -1
- 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` 原样再导出 ——
|
|
741
|
-
*/
|
|
742
|
-
var useState = react.useState;
|
|
743
|
-
/**
|
|
744
|
-
* React 的 `useEffect` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
745
|
-
*/
|
|
746
|
-
var useEffect = react.useEffect;
|
|
747
|
-
/**
|
|
748
|
-
* React 的 `useLayoutEffect` 原样再导出 —— 模块从这里拿,就不必自己直接依赖 react。
|
|
657
|
+
* React 的 `useState` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
749
658
|
*/
|
|
750
|
-
var
|
|
659
|
+
var useState$1 = react.useState;
|
|
751
660
|
/**
|
|
752
|
-
* React 的 `
|
|
661
|
+
* React 的 `useEffect` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
753
662
|
*/
|
|
754
|
-
var
|
|
663
|
+
var useEffect$1 = react.useEffect;
|
|
664
|
+
react.useLayoutEffect;
|
|
755
665
|
/**
|
|
756
|
-
* React 的 `
|
|
666
|
+
* React 的 `useMemo` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
757
667
|
*/
|
|
758
|
-
var
|
|
668
|
+
var useMemo$1 = react.useMemo;
|
|
669
|
+
react.useCallback;
|
|
759
670
|
/**
|
|
760
|
-
* React 的 `useRef` 原样再导出 ——
|
|
671
|
+
* React 的 `useRef` 原样再导出 —— 共享包的哑组件用它;模块写 JSX 一律直接 import react(这一份不进公开入口)。
|
|
761
672
|
*/
|
|
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": "⚠ 起不来",
|
|
@@ -2564,12 +2416,20 @@ var dictionaries = {
|
|
|
2564
2416
|
"panels.market.sharedMissing": "未装",
|
|
2565
2417
|
"panels.market.sharedOutdated": "有新版",
|
|
2566
2418
|
"panels.market.sharedUnsatisfied": "版本不对",
|
|
2567
|
-
"panels.market.sharedOk": "
|
|
2419
|
+
"panels.market.sharedOk": "已就绪",
|
|
2568
2420
|
"panels.market.versionArrow": "{from} → {to}",
|
|
2569
2421
|
"panels.market.lead": "装在这台机器上,所有项目共用。",
|
|
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",
|
|
@@ -3019,12 +2891,20 @@ var dictionaries = {
|
|
|
3019
2891
|
"panels.market.sharedMissing": "not installed",
|
|
3020
2892
|
"panels.market.sharedOutdated": "update available",
|
|
3021
2893
|
"panels.market.sharedUnsatisfied": "wrong version",
|
|
3022
|
-
"panels.market.sharedOk": "
|
|
2894
|
+
"panels.market.sharedOk": "ready",
|
|
3023
2895
|
"panels.market.versionArrow": "{from} → {to}",
|
|
3024
2896
|
"panels.market.lead": "Installed on this machine, shared by every project.",
|
|
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
|
}
|
|
@@ -4009,14 +4020,6 @@ var SHARED_STATE_KEY = {
|
|
|
4009
4020
|
missing: "panels.market.sharedMissing",
|
|
4010
4021
|
unchecked: "panels.market.unchecked"
|
|
4011
4022
|
};
|
|
4012
|
-
var SHARED_DOT = {
|
|
4013
|
-
checking: "ongoing",
|
|
4014
|
-
installed: "done",
|
|
4015
|
-
outdated: "warning",
|
|
4016
|
-
unsatisfied: "warning",
|
|
4017
|
-
missing: "idle",
|
|
4018
|
-
unchecked: "idle"
|
|
4019
|
-
};
|
|
4020
4023
|
function sharedActions(row) {
|
|
4021
4024
|
return [...row.canUpdate ? ["update-dependency"] : []];
|
|
4022
4025
|
}
|
|
@@ -4488,7 +4491,7 @@ function marketHintOf(input) {
|
|
|
4488
4491
|
}
|
|
4489
4492
|
//#endregion
|
|
4490
4493
|
//#region src/app/layouts/rightbar/market-busy.ts
|
|
4491
|
-
var listeners$
|
|
4494
|
+
var listeners$4 = /* @__PURE__ */ new Set();
|
|
4492
4495
|
var published = /* @__PURE__ */ new Map();
|
|
4493
4496
|
var live$2 = /* @__PURE__ */ new Set();
|
|
4494
4497
|
var timer$1;
|
|
@@ -4519,9 +4522,9 @@ function publishMarketBusy(ids) {
|
|
|
4519
4522
|
* 订阅这份事实的变化(发布内容真变了、或有条目到期才通知)。返回退订函数。
|
|
4520
4523
|
*/
|
|
4521
4524
|
function subscribeMarketBusy(listener) {
|
|
4522
|
-
listeners$
|
|
4525
|
+
listeners$4.add(listener);
|
|
4523
4526
|
return () => {
|
|
4524
|
-
listeners$
|
|
4527
|
+
listeners$4.delete(listener);
|
|
4525
4528
|
};
|
|
4526
4529
|
}
|
|
4527
4530
|
/**
|
|
@@ -4557,11 +4560,52 @@ function refresh(now) {
|
|
|
4557
4560
|
const next = new Set(published.keys());
|
|
4558
4561
|
if (!sameSet(live$2, next)) {
|
|
4559
4562
|
live$2 = next;
|
|
4560
|
-
for (const listener of [...listeners$
|
|
4563
|
+
for (const listener of [...listeners$4]) listener();
|
|
4561
4564
|
}
|
|
4562
4565
|
schedule(now);
|
|
4563
4566
|
}
|
|
4564
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
|
|
4565
4609
|
//#region src/shared/hooks/use-host-write.ts
|
|
4566
4610
|
var use_host_write_exports = /* @__PURE__ */ __exportAll({ useHostWrite: () => useHostWrite });
|
|
4567
4611
|
/**
|
|
@@ -4668,11 +4712,19 @@ function useVisibleBusy(active, floorMs) {
|
|
|
4668
4712
|
//#endregion
|
|
4669
4713
|
//#region src/app/layouts/rightbar/market-settle-hold.ts
|
|
4670
4714
|
function useSettleHold(input) {
|
|
4671
|
-
const { pending, landed, t, onChanged, setPending, setFailed } = input;
|
|
4715
|
+
const { pending, landed, t, onChanged, selfUpdate, setPending, setFailed } = input;
|
|
4672
4716
|
const until = pending?.until;
|
|
4673
4717
|
const id = pending?.id ?? "";
|
|
4674
4718
|
const watching = pending !== null && (pending.until !== void 0 || pending.readBack === true);
|
|
4675
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;
|
|
4676
4728
|
useEffect(() => {
|
|
4677
4729
|
if (!watching || !landed) return;
|
|
4678
4730
|
setPending(null);
|
|
@@ -4681,6 +4733,22 @@ function useSettleHold(input) {
|
|
|
4681
4733
|
landed,
|
|
4682
4734
|
setPending
|
|
4683
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
|
+
]);
|
|
4684
4752
|
useEffect(() => {
|
|
4685
4753
|
if (!watching) {
|
|
4686
4754
|
sinceRef.current = 0;
|
|
@@ -4734,60 +4802,61 @@ function useMarketTransient(input) {
|
|
|
4734
4802
|
};
|
|
4735
4803
|
}
|
|
4736
4804
|
var MarketPage_module_default = {
|
|
4737
|
-
marketList: "
|
|
4738
|
-
marketRow: "
|
|
4739
|
-
marketIcon: "
|
|
4740
|
-
marketMain: "
|
|
4741
|
-
marketName: "
|
|
4742
|
-
marketDesc: "
|
|
4743
|
-
marketUsedBy: "
|
|
4744
|
-
marketVersion: "
|
|
4745
|
-
marketLocalTag: "
|
|
4746
|
-
marketEnd: "
|
|
4747
|
-
marketSwitchSeat: "
|
|
4748
|
-
marketActions: "
|
|
4749
|
-
marketUpdateAction: "
|
|
4750
|
-
marketSelfDivider: "
|
|
4751
|
-
marketSection: "
|
|
4752
|
-
marketSectionHead: "
|
|
4753
|
-
marketSectionIcon: "
|
|
4754
|
-
marketSectionTitle: "
|
|
4755
|
-
marketSectionCount: "
|
|
4756
|
-
|
|
4757
|
-
|
|
4758
|
-
|
|
4759
|
-
|
|
4760
|
-
|
|
4761
|
-
|
|
4762
|
-
|
|
4763
|
-
|
|
4764
|
-
|
|
4765
|
-
|
|
4766
|
-
|
|
4767
|
-
|
|
4768
|
-
|
|
4769
|
-
|
|
4770
|
-
|
|
4771
|
-
|
|
4772
|
-
|
|
4805
|
+
marketList: "_marketList_1rftb_1",
|
|
4806
|
+
marketRow: "_marketRow_1rftb_10",
|
|
4807
|
+
marketIcon: "_marketIcon_1rftb_20",
|
|
4808
|
+
marketMain: "_marketMain_1rftb_32",
|
|
4809
|
+
marketName: "_marketName_1rftb_39",
|
|
4810
|
+
marketDesc: "_marketDesc_1rftb_48",
|
|
4811
|
+
marketUsedBy: "_marketUsedBy_1rftb_59",
|
|
4812
|
+
marketVersion: "_marketVersion_1rftb_73",
|
|
4813
|
+
marketLocalTag: "_marketLocalTag_1rftb_95",
|
|
4814
|
+
marketEnd: "_marketEnd_1rftb_106",
|
|
4815
|
+
marketSwitchSeat: "_marketSwitchSeat_1rftb_113",
|
|
4816
|
+
marketActions: "_marketActions_1rftb_126",
|
|
4817
|
+
marketUpdateAction: "_marketUpdateAction_1rftb_132",
|
|
4818
|
+
marketSelfDivider: "_marketSelfDivider_1rftb_138",
|
|
4819
|
+
marketSection: "_marketSection_1rftb_143",
|
|
4820
|
+
marketSectionHead: "_marketSectionHead_1rftb_150",
|
|
4821
|
+
marketSectionIcon: "_marketSectionIcon_1rftb_156",
|
|
4822
|
+
marketSectionTitle: "_marketSectionTitle_1rftb_163",
|
|
4823
|
+
marketSectionCount: "_marketSectionCount_1rftb_169",
|
|
4824
|
+
marketSectionQuiet: "_marketSectionQuiet_1rftb_175",
|
|
4825
|
+
marketProgress: "_marketProgress_1rftb_192",
|
|
4826
|
+
marketNote: "_marketNote_1rftb_202",
|
|
4827
|
+
marketNotePlain: "_marketNotePlain_1rftb_209",
|
|
4828
|
+
marketFailure: "_marketFailure_1rftb_217",
|
|
4829
|
+
marketEmpty: "_marketEmpty_1rftb_224",
|
|
4830
|
+
marketPage: "_marketPage_1rftb_229",
|
|
4831
|
+
marketPageHead: "_marketPageHead_1rftb_247",
|
|
4832
|
+
marketPageTitle: "_marketPageTitle_1rftb_255",
|
|
4833
|
+
marketPageIntro: "_marketPageIntro_1rftb_260",
|
|
4834
|
+
marketPageTools: "_marketPageTools_1rftb_266",
|
|
4835
|
+
marketIconButton: "_marketIconButton_1rftb_275",
|
|
4836
|
+
marketIconWrap: "_marketIconWrap_1rftb_300",
|
|
4837
|
+
marketIconButtonSpinning: "_marketIconButtonSpinning_1rftb_304",
|
|
4838
|
+
"wb-spin": "_wb-spin_1rftb_1",
|
|
4839
|
+
marketAddButton: "_marketAddButton_1rftb_308",
|
|
4840
|
+
marketChecking: "_marketChecking_1rftb_325",
|
|
4841
|
+
marketEmptyTitle: "_marketEmptyTitle_1rftb_333"
|
|
4773
4842
|
};
|
|
4774
4843
|
//#endregion
|
|
4775
4844
|
//#region src/app/layouts/rightbar/MarketStates.tsx
|
|
4776
4845
|
function MarketChecking({ t }) {
|
|
4777
|
-
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")));
|
|
4778
4847
|
}
|
|
4779
4848
|
function MarketEmpty({ t }) {
|
|
4780
|
-
return /* @__PURE__ */
|
|
4849
|
+
return /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
|
|
4781
4850
|
}
|
|
4782
4851
|
//#endregion
|
|
4783
4852
|
//#region src/app/layouts/rightbar/market-section-icon.ts
|
|
4784
4853
|
var SIZE$1 = 14;
|
|
4785
4854
|
function marketSectionIcon(kind) {
|
|
4786
4855
|
switch (kind) {
|
|
4787
|
-
case "installed": return
|
|
4788
|
-
case "pending": return
|
|
4789
|
-
case "plugins": return
|
|
4790
|
-
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 });
|
|
4791
4860
|
}
|
|
4792
4861
|
}
|
|
4793
4862
|
//#endregion
|
|
@@ -4795,10 +4864,10 @@ function marketSectionIcon(kind) {
|
|
|
4795
4864
|
var SIZE = 18;
|
|
4796
4865
|
function packageIcon(kind) {
|
|
4797
4866
|
switch (kind) {
|
|
4798
|
-
case "module": return
|
|
4799
|
-
case "plugin": return
|
|
4800
|
-
case "lib": return
|
|
4801
|
-
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 });
|
|
4802
4871
|
}
|
|
4803
4872
|
}
|
|
4804
4873
|
function marketRowKind(row) {
|
|
@@ -4841,8 +4910,9 @@ function holdOf(pending, application) {
|
|
|
4841
4910
|
row: pending.row
|
|
4842
4911
|
};
|
|
4843
4912
|
}
|
|
4844
|
-
function pendingLanded(pending, updates, capabilities, installed) {
|
|
4913
|
+
function pendingLanded(pending, updates, capabilities, installed, shared = [], plugins = null) {
|
|
4845
4914
|
if (pending === null) return true;
|
|
4915
|
+
if (pending.action === "update" && capabilities === null) return false;
|
|
4846
4916
|
return settleLanded({
|
|
4847
4917
|
action: pending.action,
|
|
4848
4918
|
until: pending.until,
|
|
@@ -4850,7 +4920,9 @@ function pendingLanded(pending, updates, capabilities, installed) {
|
|
|
4850
4920
|
installed,
|
|
4851
4921
|
entry: updates[pending.id],
|
|
4852
4922
|
clicked: pending.version,
|
|
4853
|
-
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 } : {}
|
|
4854
4926
|
});
|
|
4855
4927
|
}
|
|
4856
4928
|
function holdExpired(held, backInRoster, elapsedMs) {
|
|
@@ -4931,35 +5003,32 @@ function SharedLine({ t, row, pending, failure, onAct }) {
|
|
|
4931
5003
|
const actions = sharedActions(row);
|
|
4932
5004
|
const stateText = t(SHARED_STATE_KEY[row.state]);
|
|
4933
5005
|
const version = row.version;
|
|
4934
|
-
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", {
|
|
4935
5007
|
from: version.installed,
|
|
4936
5008
|
to: version.latest
|
|
4937
5009
|
}) : version.installed ?? version.latest ?? ""));
|
|
4938
|
-
return /* @__PURE__ */
|
|
5010
|
+
return /* @__PURE__ */ createElement("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ createElement("span", {
|
|
4939
5011
|
className: MarketPage_module_default.marketIcon,
|
|
4940
5012
|
"aria-hidden": "true"
|
|
4941
|
-
}, 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", {
|
|
4942
5014
|
className: MarketPage_module_default.marketDesc,
|
|
4943
5015
|
role: "img",
|
|
4944
5016
|
"aria-label": stateText
|
|
4945
|
-
}, row.state === "checking" ? /* @__PURE__ */
|
|
4946
|
-
state: SHARED_DOT[row.state],
|
|
4947
|
-
size: 9
|
|
4948
|
-
}), stateText, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(Button, {
|
|
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, {
|
|
4949
5018
|
key: action,
|
|
4950
5019
|
type: "button",
|
|
4951
5020
|
size: "sm",
|
|
4952
5021
|
variant: "outline",
|
|
4953
5022
|
disabled: locked,
|
|
4954
5023
|
onClick: () => onAct(action)
|
|
4955
|
-
}, 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));
|
|
4956
5025
|
}
|
|
4957
5026
|
function SharedSection({ t, rows, pending, failureOf, act }) {
|
|
4958
5027
|
if (rows.length === 0) return null;
|
|
4959
|
-
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", {
|
|
4960
5029
|
className: MarketPage_module_default.marketSectionIcon,
|
|
4961
5030
|
"aria-hidden": "true"
|
|
4962
|
-
}, 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, {
|
|
4963
5032
|
key: row.id,
|
|
4964
5033
|
t,
|
|
4965
5034
|
row,
|
|
@@ -5023,49 +5092,49 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
|
|
|
5023
5092
|
const actions = marketActions$1(row);
|
|
5024
5093
|
const switchLocked = marketSwitchLocked(row);
|
|
5025
5094
|
const stateText = t(MARKET_STATE_KEY[row.state]);
|
|
5026
|
-
return /* @__PURE__ */
|
|
5095
|
+
return /* @__PURE__ */ createElement("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ createElement("span", {
|
|
5027
5096
|
className: MarketPage_module_default.marketIcon,
|
|
5028
5097
|
"aria-hidden": "true"
|
|
5029
|
-
}, 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", {
|
|
5030
5099
|
from: row.version.installed,
|
|
5031
5100
|
to: row.version.latest
|
|
5032
|
-
}) : 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", {
|
|
5033
5102
|
className: MarketPage_module_default.marketDesc,
|
|
5034
5103
|
role: "img",
|
|
5035
5104
|
"aria-label": stateText
|
|
5036
|
-
}, row.state === "checking" ? /* @__PURE__ */
|
|
5105
|
+
}, row.state === "checking" ? /* @__PURE__ */ createElement(Spinner, { size: 14 }) : /* @__PURE__ */ createElement(StateDot, {
|
|
5037
5106
|
state: MARKET_DOT[row.state],
|
|
5038
5107
|
size: 9
|
|
5039
|
-
}), 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) => {
|
|
5040
5109
|
const danger = dangerActions.includes(action);
|
|
5041
5110
|
const update = updateActions.includes(action);
|
|
5042
|
-
return /* @__PURE__ */
|
|
5111
|
+
return /* @__PURE__ */ createElement(Button, {
|
|
5043
5112
|
key: action,
|
|
5044
5113
|
type: "button",
|
|
5045
5114
|
size: "sm",
|
|
5046
5115
|
variant: action === "install" ? "primary" : "outline",
|
|
5047
5116
|
className: danger ? "wb-dangerAction" : update ? MarketPage_module_default.marketUpdateAction : void 0,
|
|
5048
|
-
icon: danger ? /* @__PURE__ */
|
|
5117
|
+
icon: danger ? /* @__PURE__ */ createElement(IconTrashOutlineRegular, { size: 13 }) : void 0,
|
|
5049
5118
|
"aria-label": danger ? t("panels.market.uninstallLabel", { name: marketRowTitle(row, t) }) : void 0,
|
|
5050
5119
|
disabled: locked,
|
|
5051
5120
|
onClick: () => onAct(action)
|
|
5052
5121
|
}, t(ACTION_LABEL_KEY[action]));
|
|
5053
|
-
})), 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, {
|
|
5054
5123
|
checked: row.defaultShown,
|
|
5055
5124
|
disabled: boardBusy === true || locked || switchLocked,
|
|
5056
5125
|
label: `${marketRowTitle(row, t)} · ${t("panels.market.defaultLabel")}`,
|
|
5057
5126
|
onChange: (next) => onDefault?.(next)
|
|
5058
|
-
})))), row.note === void 0 ? null : /* @__PURE__ */
|
|
5127
|
+
})))), row.note === void 0 ? null : /* @__PURE__ */ createElement("div", {
|
|
5059
5128
|
className: row.note.tone === "plain" ? MarketPage_module_default.marketNotePlain : MarketPage_module_default.marketNote,
|
|
5060
5129
|
title: row.note.params.reason === void 0 ? void 0 : t("panels.market.moduleRefusedDetail", row.note.params)
|
|
5061
|
-
}, 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));
|
|
5062
5131
|
}
|
|
5063
5132
|
function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy }) {
|
|
5064
5133
|
if (rows.length === 0) return null;
|
|
5065
|
-
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", {
|
|
5066
5135
|
className: MarketPage_module_default.marketSectionIcon,
|
|
5067
5136
|
"aria-hidden": "true"
|
|
5068
|
-
}, 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, {
|
|
5069
5138
|
key: row.id,
|
|
5070
5139
|
t,
|
|
5071
5140
|
row,
|
|
@@ -5299,8 +5368,63 @@ function changeFailure(change, t) {
|
|
|
5299
5368
|
return failureReason(failureCode(change), change.application, t);
|
|
5300
5369
|
}
|
|
5301
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
|
|
5302
5410
|
//#region src/app/layouts/rightbar/market-act.ts
|
|
5303
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
|
+
}
|
|
5304
5428
|
function marketActOf(options) {
|
|
5305
5429
|
const { t, mocked, rowOf, seats, send, onChanged } = options;
|
|
5306
5430
|
return async (id, action) => {
|
|
@@ -5310,10 +5434,12 @@ function marketActOf(options) {
|
|
|
5310
5434
|
const next = {
|
|
5311
5435
|
id,
|
|
5312
5436
|
action,
|
|
5437
|
+
since: Date.now(),
|
|
5313
5438
|
...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
|
|
5314
5439
|
...label === void 0 ? {} : { label },
|
|
5315
5440
|
...row?.pkg === void 0 ? {} : { pkg: row.pkg },
|
|
5316
5441
|
...row?.version?.installed === void 0 ? {} : { version: row.version.installed },
|
|
5442
|
+
...row?.version?.latest === void 0 ? {} : { latest: row.version.latest },
|
|
5317
5443
|
...row === void 0 || !STEADY_ACTIONS.has(action) ? {} : { row: label === void 0 ? row : {
|
|
5318
5444
|
...row,
|
|
5319
5445
|
label
|
|
@@ -5334,27 +5460,48 @@ function marketActOf(options) {
|
|
|
5334
5460
|
unit: id
|
|
5335
5461
|
});
|
|
5336
5462
|
if (!outcome.ok) {
|
|
5463
|
+
onChanged({ force: true });
|
|
5337
5464
|
seats.setPending(null);
|
|
5338
5465
|
seats.setHeld(void 0);
|
|
5339
|
-
onChanged();
|
|
5340
5466
|
seats.setFailed({
|
|
5341
5467
|
id,
|
|
5342
5468
|
message: t("panels.market.failed", { reason: outcome.message })
|
|
5343
5469
|
});
|
|
5344
5470
|
return;
|
|
5345
5471
|
}
|
|
5346
|
-
const
|
|
5347
|
-
const
|
|
5348
|
-
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);
|
|
5349
5497
|
seats.setPending(until === void 0 && !readBack ? null : {
|
|
5350
5498
|
...next,
|
|
5351
5499
|
...until === void 0 ? {} : { until },
|
|
5352
5500
|
...readBack ? { readBack: true } : {}
|
|
5353
5501
|
});
|
|
5354
5502
|
seats.setHeld(readBack ? void 0 : holdOf(next, change?.application));
|
|
5355
|
-
if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(
|
|
5503
|
+
if (action === "uninstall-plugin") seats.setNotice(installedPluginNotice(value, t));
|
|
5356
5504
|
const reason = changeFailure(change, t);
|
|
5357
|
-
onChanged();
|
|
5358
5505
|
if (reason !== void 0) seats.setFailed({
|
|
5359
5506
|
id,
|
|
5360
5507
|
message: t("panels.market.failed", { reason })
|
|
@@ -5375,7 +5522,7 @@ var PanelFoot_module_default = {
|
|
|
5375
5522
|
* @param props.children - 右侧那一格内容(一般是按钮或状态),可省略。
|
|
5376
5523
|
*/
|
|
5377
5524
|
function PanelFoot({ text, size = "sm", children }) {
|
|
5378
|
-
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);
|
|
5379
5526
|
}
|
|
5380
5527
|
//#endregion
|
|
5381
5528
|
//#region src/app/layouts/rightbar/MarketView.tsx
|
|
@@ -5386,7 +5533,7 @@ var CONFIRM_UNINSTALL = [
|
|
|
5386
5533
|
];
|
|
5387
5534
|
function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
|
|
5388
5535
|
const [acknowledged, setAcknowledged] = useState(false);
|
|
5389
|
-
return /* @__PURE__ */
|
|
5536
|
+
return /* @__PURE__ */ createElement(RiskConfirmation, {
|
|
5390
5537
|
open: name !== null,
|
|
5391
5538
|
title: t("panels.market.confirmUninstallTitle", { name: name ?? "" }),
|
|
5392
5539
|
description: t("panels.market.confirmUninstallDetail"),
|
|
@@ -5403,7 +5550,7 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
|
|
|
5403
5550
|
function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy }) {
|
|
5404
5551
|
const failureOf = (id) => failed?.id === id ? failed.message : null;
|
|
5405
5552
|
const foot = marketFootVisible(shown, installedList);
|
|
5406
|
-
return /* @__PURE__ */
|
|
5553
|
+
return /* @__PURE__ */ createElement(Fragment, null, notice === null ? null : /* @__PURE__ */ createElement("div", { className: MarketPage_module_default.marketNote }, notice), /* @__PURE__ */ createElement(MarketSection, {
|
|
5407
5554
|
t,
|
|
5408
5555
|
rows: self === void 0 ? [] : [self],
|
|
5409
5556
|
onDefault: setDefault,
|
|
@@ -5413,10 +5560,10 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
|
|
|
5413
5560
|
act,
|
|
5414
5561
|
confirmActions: CONFIRM_UNINSTALL,
|
|
5415
5562
|
onConfirming
|
|
5416
|
-
}), self === void 0 ? null : /* @__PURE__ */
|
|
5563
|
+
}), self === void 0 ? null : /* @__PURE__ */ createElement("div", {
|
|
5417
5564
|
className: MarketPage_module_default.marketSelfDivider,
|
|
5418
5565
|
"aria-hidden": "true"
|
|
5419
|
-
}), 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, {
|
|
5420
5567
|
key: section.id,
|
|
5421
5568
|
t,
|
|
5422
5569
|
titleKey: section.titleKey,
|
|
@@ -5429,7 +5576,7 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
|
|
|
5429
5576
|
act,
|
|
5430
5577
|
confirmActions: CONFIRM_UNINSTALL,
|
|
5431
5578
|
onConfirming
|
|
5432
|
-
})), /* @__PURE__ */
|
|
5579
|
+
})), /* @__PURE__ */ createElement(MarketSection, {
|
|
5433
5580
|
t,
|
|
5434
5581
|
titleKey: "panels.market.sectionPlugins",
|
|
5435
5582
|
icon: marketSectionIcon("plugins"),
|
|
@@ -5441,10 +5588,10 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
|
|
|
5441
5588
|
act,
|
|
5442
5589
|
confirmActions: CONFIRM_UNINSTALL,
|
|
5443
5590
|
onConfirming
|
|
5444
|
-
}), foot ? /* @__PURE__ */
|
|
5591
|
+
}), foot ? /* @__PURE__ */ createElement(PanelFoot, {
|
|
5445
5592
|
size: "md",
|
|
5446
5593
|
text: t("panels.market.foot")
|
|
5447
|
-
}) : null, /* @__PURE__ */
|
|
5594
|
+
}) : null, /* @__PURE__ */ createElement(SharedSection, {
|
|
5448
5595
|
t,
|
|
5449
5596
|
rows: shared,
|
|
5450
5597
|
pending,
|
|
@@ -5452,7 +5599,8 @@ function MarketBody({ t, self, shown, pluginList, installedList, shared, pending
|
|
|
5452
5599
|
act
|
|
5453
5600
|
}));
|
|
5454
5601
|
}
|
|
5455
|
-
function
|
|
5602
|
+
function useMarketScene(input) {
|
|
5603
|
+
const { manifests, installable, capabilities, updates, installed, settling, mock, defaults, changed, pending, failed } = input;
|
|
5456
5604
|
const titles = useMarketTitles(manifests, mock !== void 0);
|
|
5457
5605
|
const catalog = mock?.manifests ?? manifests;
|
|
5458
5606
|
const marketable = mock === void 0 ? marketCatalog(manifests, installable) : catalog;
|
|
@@ -5462,10 +5610,44 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
5462
5610
|
const updateMap = mock?.updates ?? updates ?? {};
|
|
5463
5611
|
const rows = marketRows(source, effective, updateMap, byDefault, changed);
|
|
5464
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 = {} }) {
|
|
5465
5633
|
const { pending, setPending, confirming, setConfirming, failed, setFailed, notice, setNotice } = useMarketTransient({
|
|
5466
5634
|
mock,
|
|
5467
5635
|
onPending
|
|
5468
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);
|
|
5469
5651
|
const provision = useHostWrite({
|
|
5470
5652
|
channel: "provision",
|
|
5471
5653
|
networkText: t("panels.failed")
|
|
@@ -5493,21 +5675,16 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
5493
5675
|
setNotice(t("panels.failed"));
|
|
5494
5676
|
}
|
|
5495
5677
|
};
|
|
5496
|
-
const removing = removingIdOf(pending, failed);
|
|
5497
|
-
const steady = useHeldRow(pending, (id) => catalog.some((manifest) => manifest.id === id));
|
|
5498
|
-
const pinned = pinnedRowOf(pending, steady.held);
|
|
5499
|
-
usePublishMarketBusy(heldIdOf(pending, steady.held));
|
|
5500
|
-
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);
|
|
5501
5678
|
const pendingRow = pendingRowOf({
|
|
5502
5679
|
pending,
|
|
5503
5680
|
removing,
|
|
5504
5681
|
rows,
|
|
5505
5682
|
titles
|
|
5506
5683
|
});
|
|
5507
|
-
const
|
|
5684
|
+
const self = workbenchRow(mock === void 0 ? workbench : mock.workbench);
|
|
5508
5685
|
const shown = withPinnedRow(pendingRow === void 0 ? rows : [...rows, pendingRow], pinned);
|
|
5509
|
-
const
|
|
5510
|
-
const pluginList = installedPluginRows(
|
|
5686
|
+
const pluginSource = mock?.plugins ?? plugins ?? null;
|
|
5687
|
+
const pluginList = installedPluginRows(pluginSource ?? [], byDefault, changed);
|
|
5511
5688
|
const rowById = new Map([
|
|
5512
5689
|
...shown,
|
|
5513
5690
|
...self === void 0 ? [] : [self],
|
|
@@ -5532,17 +5709,18 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
5532
5709
|
});
|
|
5533
5710
|
useSettleHold({
|
|
5534
5711
|
pending,
|
|
5535
|
-
landed: pendingLanded(pending, updateMap, effective, workbench?.installed),
|
|
5712
|
+
landed: pendingLanded(pending, updateMap, effective, workbench?.installed, shared, pluginSource === null ? null : pluginList),
|
|
5536
5713
|
t,
|
|
5537
5714
|
onChanged,
|
|
5715
|
+
selfUpdate: mock?.selfUpdate ?? selfUpdate,
|
|
5538
5716
|
setPending,
|
|
5539
5717
|
setFailed
|
|
5540
5718
|
});
|
|
5541
5719
|
const settled = marketSettled(freshness, installedRead);
|
|
5542
5720
|
const nothing = shown.length === 0 && self === void 0 && installedList.length === 0 && pluginList.length === 0;
|
|
5543
|
-
if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */
|
|
5544
|
-
if (nothing) return /* @__PURE__ */
|
|
5545
|
-
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, {
|
|
5546
5724
|
t,
|
|
5547
5725
|
self,
|
|
5548
5726
|
shown,
|
|
@@ -5556,7 +5734,7 @@ function MarketView({ t, manifests, installable, capabilities, freshness, onChan
|
|
|
5556
5734
|
onConfirming: setConfirming,
|
|
5557
5735
|
setDefault,
|
|
5558
5736
|
boardBusy
|
|
5559
|
-
}), /* @__PURE__ */
|
|
5737
|
+
}), /* @__PURE__ */ createElement(ConfirmUninstall, {
|
|
5560
5738
|
key: confirming ?? "",
|
|
5561
5739
|
t,
|
|
5562
5740
|
name: confirmingRow === void 0 ? null : marketRowTitle(confirmingRow, t),
|
|
@@ -5860,23 +6038,61 @@ function attentionWordLabel(attention, t) {
|
|
|
5860
6038
|
}
|
|
5861
6039
|
//#endregion
|
|
5862
6040
|
//#region src/app/layouts/project-selection.ts
|
|
5863
|
-
var listeners$
|
|
6041
|
+
var listeners$3 = /* @__PURE__ */ new Set();
|
|
5864
6042
|
function selectedProjectId() {
|
|
5865
6043
|
const stored = readText(STORAGE_KEY_PROJECT);
|
|
5866
6044
|
return stored === "" ? null : stored;
|
|
5867
6045
|
}
|
|
5868
6046
|
function selectProject(workspaceId) {
|
|
5869
6047
|
writeText(STORAGE_KEY_PROJECT, workspaceId);
|
|
5870
|
-
for (const listener of [...listeners$
|
|
6048
|
+
for (const listener of [...listeners$3]) try {
|
|
5871
6049
|
listener();
|
|
5872
6050
|
} catch {}
|
|
5873
6051
|
}
|
|
5874
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) {
|
|
5875
6084
|
listeners$2.add(listener);
|
|
5876
6085
|
return () => {
|
|
5877
6086
|
listeners$2.delete(listener);
|
|
5878
6087
|
};
|
|
5879
6088
|
}
|
|
6089
|
+
/**
|
|
6090
|
+
* 组件里读运行态档位(启动后解析出来才变一次,变了会重渲染)。
|
|
6091
|
+
* @returns 运行态档位。
|
|
6092
|
+
*/
|
|
6093
|
+
function useRuntimeSidebarEdition() {
|
|
6094
|
+
return useSyncExternalStore(subscribeSidebarEdition, runtimeSidebarEdition, runtimeSidebarEdition);
|
|
6095
|
+
}
|
|
5880
6096
|
//#endregion
|
|
5881
6097
|
//#region src/app/layouts/rightbar/use-panels.ts
|
|
5882
6098
|
function shouldDropPanels(workspace, previous) {
|
|
@@ -5885,6 +6101,7 @@ function shouldDropPanels(workspace, previous) {
|
|
|
5885
6101
|
function useEnabledUnits(refreshToken, workspace) {
|
|
5886
6102
|
const [enabled, setEnabled] = useState(null);
|
|
5887
6103
|
const lastWorkspace = useRef(workspace);
|
|
6104
|
+
const factRev = useFactRevision("panels");
|
|
5888
6105
|
useEffect(() => {
|
|
5889
6106
|
let cancelled = false;
|
|
5890
6107
|
if (shouldDropPanels(workspace, lastWorkspace.current)) {
|
|
@@ -5908,7 +6125,7 @@ function useEnabledUnits(refreshToken, workspace) {
|
|
|
5908
6125
|
};
|
|
5909
6126
|
}, [
|
|
5910
6127
|
refreshToken,
|
|
5911
|
-
|
|
6128
|
+
factRev,
|
|
5912
6129
|
workspace
|
|
5913
6130
|
]);
|
|
5914
6131
|
return enabled;
|
|
@@ -5920,7 +6137,10 @@ function useSelectedProjectId() {
|
|
|
5920
6137
|
}
|
|
5921
6138
|
function useBoardWorkspace(workspaces, sessions) {
|
|
5922
6139
|
const projectId = useSelectedProjectId();
|
|
5923
|
-
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;
|
|
5924
6144
|
return {
|
|
5925
6145
|
workspace,
|
|
5926
6146
|
path: workspace?.path ?? null
|
|
@@ -5963,12 +6183,11 @@ function readModuleVersions(force = false) {
|
|
|
5963
6183
|
function readInstalledPlugins(force = false) {
|
|
5964
6184
|
return apiGet(INSTALLED_PLUGINS_ROUTE, force ? { force: "1" } : void 0);
|
|
5965
6185
|
}
|
|
5966
|
-
//#endregion
|
|
5967
|
-
//#region src/app/layouts/market/use-module-versions.ts
|
|
5968
6186
|
var state = {
|
|
5969
6187
|
modules: null,
|
|
5970
6188
|
plugins: null,
|
|
5971
6189
|
workbench: null,
|
|
6190
|
+
selfUpdate: null,
|
|
5972
6191
|
read: false,
|
|
5973
6192
|
checkedAt: null
|
|
5974
6193
|
};
|
|
@@ -5976,6 +6195,14 @@ var listeners$1 = /* @__PURE__ */ new Set();
|
|
|
5976
6195
|
var inFlight = null;
|
|
5977
6196
|
var readSeq = 0;
|
|
5978
6197
|
var newestForceSeq = -1;
|
|
6198
|
+
var epoch = 0;
|
|
6199
|
+
/**
|
|
6200
|
+
* 写完之后把读数作废:这之前发出去的在飞读取即使回来也不许再发布(它读的是改之前的盘)。
|
|
6201
|
+
* 每次写成功都调用一次,再配一次 `force + fresh` 的读。
|
|
6202
|
+
*/
|
|
6203
|
+
function bumpModuleVersionsEpoch() {
|
|
6204
|
+
epoch += 1;
|
|
6205
|
+
}
|
|
5979
6206
|
function moduleVersionsValue() {
|
|
5980
6207
|
return state;
|
|
5981
6208
|
}
|
|
@@ -5989,11 +6216,13 @@ function publish(next) {
|
|
|
5989
6216
|
state = next;
|
|
5990
6217
|
for (const listener of [...listeners$1]) listener();
|
|
5991
6218
|
}
|
|
5992
|
-
function runModuleVersionsRead(force = false) {
|
|
5993
|
-
|
|
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;
|
|
5994
6222
|
const seq = readSeq += 1;
|
|
5995
6223
|
if (force) newestForceSeq = seq;
|
|
5996
6224
|
const promise = Promise.all([readModuleVersions(force), readInstalledPlugins(force)]).catch(() => null).then((responses) => {
|
|
6225
|
+
if (at !== epoch) return;
|
|
5997
6226
|
if (!force && seq < newestForceSeq) return;
|
|
5998
6227
|
const versions = responses?.[0];
|
|
5999
6228
|
const plugins = responses?.[1];
|
|
@@ -6001,6 +6230,7 @@ function runModuleVersionsRead(force = false) {
|
|
|
6001
6230
|
modules: versions?.ok === true ? versions.modules : state.modules,
|
|
6002
6231
|
plugins: plugins?.ok === true ? plugins.plugins : state.plugins,
|
|
6003
6232
|
workbench: versions?.ok === true ? versions.workbench ?? null : state.workbench,
|
|
6233
|
+
selfUpdate: versions?.ok === true ? versions.selfUpdate ?? null : state.selfUpdate,
|
|
6004
6234
|
read: true,
|
|
6005
6235
|
checkedAt: Date.now()
|
|
6006
6236
|
});
|
|
@@ -6009,6 +6239,7 @@ function runModuleVersionsRead(force = false) {
|
|
|
6009
6239
|
});
|
|
6010
6240
|
inFlight = {
|
|
6011
6241
|
force,
|
|
6242
|
+
epoch: at,
|
|
6012
6243
|
promise
|
|
6013
6244
|
};
|
|
6014
6245
|
return promise;
|
|
@@ -6028,12 +6259,13 @@ function useModuleVersions() {
|
|
|
6028
6259
|
runModuleVersionsRead(false);
|
|
6029
6260
|
}, [factRev]);
|
|
6030
6261
|
const reload = useCallback((options) => {
|
|
6031
|
-
runModuleVersionsRead(options?.force === true);
|
|
6262
|
+
runModuleVersionsRead(options?.force === true, options?.fresh === true);
|
|
6032
6263
|
}, []);
|
|
6033
6264
|
return {
|
|
6034
6265
|
modules: value.modules,
|
|
6035
6266
|
plugins: value.plugins,
|
|
6036
6267
|
workbench: value.workbench,
|
|
6268
|
+
selfUpdate: value.selfUpdate,
|
|
6037
6269
|
read: value.read,
|
|
6038
6270
|
checkedAt: value.checkedAt,
|
|
6039
6271
|
reload
|
|
@@ -6111,7 +6343,7 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6111
6343
|
useDismissOnOutsidePointer(registryRoot, state.registryOpen, (next) => {
|
|
6112
6344
|
if (!next) state.closeRegistry();
|
|
6113
6345
|
});
|
|
6114
|
-
return /* @__PURE__ */
|
|
6346
|
+
return /* @__PURE__ */ createElement("div", {
|
|
6115
6347
|
className: AddModule_module_default.registryWrap,
|
|
6116
6348
|
ref: registryRoot,
|
|
6117
6349
|
onKeyDown: (event) => {
|
|
@@ -6119,7 +6351,7 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6119
6351
|
event.stopPropagation();
|
|
6120
6352
|
state.closeRegistry();
|
|
6121
6353
|
}
|
|
6122
|
-
}, /* @__PURE__ */
|
|
6354
|
+
}, /* @__PURE__ */ createElement("button", {
|
|
6123
6355
|
type: "button",
|
|
6124
6356
|
ref: registryAnchor,
|
|
6125
6357
|
className: AddModule_module_default.registryToggle,
|
|
@@ -6128,7 +6360,7 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6128
6360
|
"aria-controls": REGISTRY_ID,
|
|
6129
6361
|
disabled: state.phase === "inspecting",
|
|
6130
6362
|
onClick: state.toggleRegistry
|
|
6131
|
-
}, /* @__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", {
|
|
6132
6364
|
id: REGISTRY_ID,
|
|
6133
6365
|
className: AddModule_module_default.registry,
|
|
6134
6366
|
ref: registryPanel,
|
|
@@ -6137,17 +6369,17 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6137
6369
|
style: registryPosition ?? void 0
|
|
6138
6370
|
}, state.choices.map((option) => {
|
|
6139
6371
|
const active = option.choice.kind === state.choice.kind && option.choice.value === state.choice.value;
|
|
6140
|
-
if (!(option.choice.kind === "custom")) return /* @__PURE__ */
|
|
6372
|
+
if (!(option.choice.kind === "custom")) return /* @__PURE__ */ createElement("label", {
|
|
6141
6373
|
key: `${option.choice.kind}|${option.choice.value}`,
|
|
6142
6374
|
className: AddModule_module_default.registryOption,
|
|
6143
6375
|
"data-checked": active
|
|
6144
|
-
}, /* @__PURE__ */
|
|
6376
|
+
}, /* @__PURE__ */ createElement("input", {
|
|
6145
6377
|
type: "radio",
|
|
6146
6378
|
name: REGISTRY_ID,
|
|
6147
6379
|
checked: active,
|
|
6148
6380
|
onChange: () => state.setChoice(option.choice)
|
|
6149
|
-
}), /* @__PURE__ */
|
|
6150
|
-
return /* @__PURE__ */
|
|
6381
|
+
}), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ createElement("span", null, optionLabel(option, t))));
|
|
6382
|
+
return /* @__PURE__ */ createElement("div", {
|
|
6151
6383
|
key: `${option.choice.kind}|${option.choice.value}`,
|
|
6152
6384
|
className: AddModule_module_default.registryOption,
|
|
6153
6385
|
"data-checked": active,
|
|
@@ -6157,12 +6389,12 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6157
6389
|
onFocusCapture: () => {
|
|
6158
6390
|
if (!active) state.setChoice(option.choice);
|
|
6159
6391
|
}
|
|
6160
|
-
}, /* @__PURE__ */
|
|
6392
|
+
}, /* @__PURE__ */ createElement("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ createElement("input", {
|
|
6161
6393
|
type: "radio",
|
|
6162
6394
|
name: REGISTRY_ID,
|
|
6163
6395
|
checked: active,
|
|
6164
6396
|
onChange: () => state.setChoice(option.choice)
|
|
6165
|
-
}), /* @__PURE__ */
|
|
6397
|
+
}), /* @__PURE__ */ createElement("span", { className: AddModule_module_default.registryTitle }, /* @__PURE__ */ createElement("span", null, t("panels.market.add.registryCustom")))), /* @__PURE__ */ createElement(TextField, {
|
|
6166
6398
|
type: "text",
|
|
6167
6399
|
className: AddModule_module_default.registryField,
|
|
6168
6400
|
"aria-label": t("panels.market.add.registryCustom"),
|
|
@@ -6170,16 +6402,16 @@ function AddModuleRegistry({ t, state }) {
|
|
|
6170
6402
|
value: state.custom,
|
|
6171
6403
|
invalid: customBad,
|
|
6172
6404
|
onChange: (event) => state.setCustom(event.target.value)
|
|
6173
|
-
}), customBad ? /* @__PURE__ */
|
|
6405
|
+
}), customBad ? /* @__PURE__ */ createElement("span", {
|
|
6174
6406
|
className: AddModule_module_default.inputError,
|
|
6175
6407
|
role: "alert"
|
|
6176
|
-
}, 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")));
|
|
6177
6409
|
})) : null);
|
|
6178
6410
|
}
|
|
6179
6411
|
//#endregion
|
|
6180
6412
|
//#region src/app/layouts/market/AddModuleForm.tsx
|
|
6181
6413
|
function AddModuleForm({ t, state }) {
|
|
6182
|
-
return /* @__PURE__ */
|
|
6414
|
+
return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.field }, /* @__PURE__ */ createElement(TextField, {
|
|
6183
6415
|
type: "text",
|
|
6184
6416
|
className: AddModule_module_default.input,
|
|
6185
6417
|
value: state.spec,
|
|
@@ -6192,27 +6424,27 @@ function AddModuleForm({ t, state }) {
|
|
|
6192
6424
|
onKeyDown: (event) => {
|
|
6193
6425
|
if (event.key === "Enter" && state.spec.trim() !== "") state.check();
|
|
6194
6426
|
}
|
|
6195
|
-
})), state.problem === null ? null : /* @__PURE__ */
|
|
6427
|
+
})), state.problem === null ? null : /* @__PURE__ */ createElement("p", {
|
|
6196
6428
|
className: AddModule_module_default.problem,
|
|
6197
6429
|
role: "alert"
|
|
6198
|
-
}, 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", {
|
|
6199
6431
|
className: AddModule_module_default.problem,
|
|
6200
6432
|
role: "alert"
|
|
6201
|
-
}, state.failure), /* @__PURE__ */
|
|
6433
|
+
}, state.failure), /* @__PURE__ */ createElement("div", { className: AddModule_module_default.options }, /* @__PURE__ */ createElement("button", {
|
|
6202
6434
|
type: "button",
|
|
6203
6435
|
className: AddModule_module_default.guideToggle,
|
|
6204
6436
|
"aria-expanded": state.guideOpen,
|
|
6205
6437
|
onClick: state.toggleGuide
|
|
6206
|
-
}, /* @__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, {
|
|
6207
6439
|
t,
|
|
6208
6440
|
state
|
|
6209
|
-
})), 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", {
|
|
6210
6442
|
className: AddModule_module_default.guideItem,
|
|
6211
6443
|
key: item.exampleKey
|
|
6212
|
-
}, /* @__PURE__ */
|
|
6444
|
+
}, /* @__PURE__ */ createElement("span", {
|
|
6213
6445
|
className: AddModule_module_default.guideIndex,
|
|
6214
6446
|
"aria-hidden": "true"
|
|
6215
|
-
}, 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, {
|
|
6216
6448
|
type: "button",
|
|
6217
6449
|
size: "sm",
|
|
6218
6450
|
variant: "outline",
|
|
@@ -6224,13 +6456,13 @@ var SafetyNote_module_default = { note: "_note_1enlz_1" };
|
|
|
6224
6456
|
//#endregion
|
|
6225
6457
|
//#region src/app/layouts/market/SafetyNote.tsx
|
|
6226
6458
|
function SafetyNote({ t }) {
|
|
6227
|
-
return /* @__PURE__ */
|
|
6459
|
+
return /* @__PURE__ */ createElement("p", {
|
|
6228
6460
|
className: SafetyNote_module_default.note,
|
|
6229
6461
|
role: "note"
|
|
6230
|
-
}, /* @__PURE__ */
|
|
6462
|
+
}, /* @__PURE__ */ createElement(IconWarningOutlineRegular, {
|
|
6231
6463
|
size: 14,
|
|
6232
6464
|
"aria-hidden": "true"
|
|
6233
|
-
}), /* @__PURE__ */
|
|
6465
|
+
}), /* @__PURE__ */ createElement("span", null, t("panels.market.add.guideSafety")));
|
|
6234
6466
|
}
|
|
6235
6467
|
//#endregion
|
|
6236
6468
|
//#region src/app/layouts/market/AddModuleStages.tsx
|
|
@@ -6243,11 +6475,11 @@ function supplyTone(state) {
|
|
|
6243
6475
|
return SUPPLY_TONES[state] ?? AddModule_module_default.note;
|
|
6244
6476
|
}
|
|
6245
6477
|
function AddModulePending({ t, kind }) {
|
|
6246
|
-
return /* @__PURE__ */
|
|
6478
|
+
return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ createElement("span", {
|
|
6247
6479
|
className: AddModule_module_default.heroIcon,
|
|
6248
6480
|
"data-state": "ongoing",
|
|
6249
6481
|
"aria-hidden": "true"
|
|
6250
|
-
}, /* @__PURE__ */
|
|
6482
|
+
}, /* @__PURE__ */ createElement(Spinner, { size: 28 })), /* @__PURE__ */ createElement("h2", {
|
|
6251
6483
|
className: AddModule_module_default.pendingTitle,
|
|
6252
6484
|
role: "status"
|
|
6253
6485
|
}, kind === "inspecting" ? t("panels.market.add.classifying") : t("panels.market.add.installingTitle"))));
|
|
@@ -6258,7 +6490,7 @@ function AddModulePreview({ t, state }) {
|
|
|
6258
6490
|
const source = preview.registry === "" ? t("panels.market.add.registryDefault") : preview.registry;
|
|
6259
6491
|
const plugin = preview.kind === "plugin";
|
|
6260
6492
|
const pluginName = plugin ? preview.pluginName : void 0;
|
|
6261
|
-
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);
|
|
6262
6494
|
}
|
|
6263
6495
|
function AddModuleResult({ t, state }) {
|
|
6264
6496
|
const outcome = state.outcome;
|
|
@@ -6274,20 +6506,20 @@ function AddModuleResult({ t, state }) {
|
|
|
6274
6506
|
});
|
|
6275
6507
|
const name = outcome.module.kind === "module" ? outcome.module.unit : outcome.module.pkg;
|
|
6276
6508
|
const why = restartWhy(outcome.change, t);
|
|
6277
|
-
return /* @__PURE__ */
|
|
6509
|
+
return /* @__PURE__ */ createElement("div", { className: AddModule_module_default.body }, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.hero }, /* @__PURE__ */ createElement("span", {
|
|
6278
6510
|
className: AddModule_module_default.heroIcon,
|
|
6279
6511
|
"data-state": kind === "failed" ? "error" : kind === "cancelled" ? "idle" : "done",
|
|
6280
6512
|
"aria-hidden": "true"
|
|
6281
|
-
}, kind === "failed" ? /* @__PURE__ */
|
|
6513
|
+
}, kind === "failed" ? /* @__PURE__ */ createElement(IconWarningOutlineRegular, { size: 28 }) : kind === "cancelled" ? /* @__PURE__ */ createElement(StateDot, {
|
|
6282
6514
|
state: "idle",
|
|
6283
6515
|
size: 28
|
|
6284
|
-
}) : /* @__PURE__ */
|
|
6516
|
+
}) : /* @__PURE__ */ createElement(IconCheckCircleFillRegular, { size: 28 })), /* @__PURE__ */ createElement("h2", {
|
|
6285
6517
|
className: AddModule_module_default.wizardTitle,
|
|
6286
6518
|
role: kind === "failed" ? "alert" : "status"
|
|
6287
|
-
}, 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", {
|
|
6288
6520
|
className: AddModule_module_default.resultWarn,
|
|
6289
6521
|
role: "alert"
|
|
6290
|
-
}, 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)));
|
|
6291
6523
|
}
|
|
6292
6524
|
//#endregion
|
|
6293
6525
|
//#region src/app/layouts/market/use-add-module.ts
|
|
@@ -6499,7 +6731,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
|
|
|
6499
6731
|
const failed = state.outcome?.change.application === "failed";
|
|
6500
6732
|
const builds = state.builds;
|
|
6501
6733
|
const notModule = state.outcome?.supply.state === "not-a-module";
|
|
6502
|
-
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, {
|
|
6503
6735
|
type: "button",
|
|
6504
6736
|
variant: "primary",
|
|
6505
6737
|
size: "md",
|
|
@@ -6507,27 +6739,27 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
|
|
|
6507
6739
|
disabled: empty || checking,
|
|
6508
6740
|
"aria-busy": checking,
|
|
6509
6741
|
onClick: state.check
|
|
6510
|
-
}, 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, {
|
|
6511
6743
|
type: "button",
|
|
6512
6744
|
variant: "outline",
|
|
6513
6745
|
size: "md",
|
|
6514
6746
|
onClick: state.edit
|
|
6515
|
-
}, t("panels.market.add.edit")), /* @__PURE__ */
|
|
6747
|
+
}, t("panels.market.add.edit")), /* @__PURE__ */ createElement(Button, {
|
|
6516
6748
|
type: "button",
|
|
6517
6749
|
variant: "primary",
|
|
6518
6750
|
size: "md",
|
|
6519
6751
|
onClick: () => state.install()
|
|
6520
|
-
}, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */
|
|
6752
|
+
}, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ createElement(Button, {
|
|
6521
6753
|
type: "button",
|
|
6522
6754
|
variant: "outline",
|
|
6523
6755
|
size: "md",
|
|
6524
6756
|
onClick: state.cancelInstall
|
|
6525
|
-
}, 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, {
|
|
6526
6758
|
type: "button",
|
|
6527
6759
|
variant: "outline",
|
|
6528
6760
|
size: "md",
|
|
6529
6761
|
onClick: state.edit
|
|
6530
|
-
}, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */
|
|
6762
|
+
}, t("panels.market.add.changeRegistry")) : null, notModule ? /* @__PURE__ */ createElement(Button, {
|
|
6531
6763
|
type: "button",
|
|
6532
6764
|
variant: "outline",
|
|
6533
6765
|
size: "md",
|
|
@@ -6535,23 +6767,23 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
|
|
|
6535
6767
|
disabled: state.removing,
|
|
6536
6768
|
"aria-busy": state.removing,
|
|
6537
6769
|
onClick: state.removeIt
|
|
6538
|
-
}, 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, {
|
|
6539
6771
|
type: "button",
|
|
6540
6772
|
variant: "outline",
|
|
6541
6773
|
size: "md",
|
|
6542
6774
|
onClick: onClose
|
|
6543
|
-
}, t("panels.market.add.close")), builds.length === 0 ? null : /* @__PURE__ */
|
|
6775
|
+
}, t("panels.market.add.close")), builds.length === 0 ? null : /* @__PURE__ */ createElement(Button, {
|
|
6544
6776
|
type: "button",
|
|
6545
6777
|
variant: "primary",
|
|
6546
6778
|
size: "md",
|
|
6547
6779
|
onClick: () => state.install(builds)
|
|
6548
|
-
}, t("panels.market.add.approveRun")), failed && builds.length === 0 ? /* @__PURE__ */
|
|
6780
|
+
}, t("panels.market.add.approveRun")), failed && builds.length === 0 ? /* @__PURE__ */ createElement(Button, {
|
|
6549
6781
|
type: "button",
|
|
6550
6782
|
variant: "primary",
|
|
6551
6783
|
size: "md",
|
|
6552
6784
|
onClick: () => state.install()
|
|
6553
6785
|
}, t("panels.market.add.retry")) : null) : null);
|
|
6554
|
-
return /* @__PURE__ */
|
|
6786
|
+
return /* @__PURE__ */ createElement(Modal, {
|
|
6555
6787
|
open,
|
|
6556
6788
|
onClose: () => {
|
|
6557
6789
|
if (!installing) onClose();
|
|
@@ -6562,19 +6794,19 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
|
|
|
6562
6794
|
className: AddModule_module_default.dialog,
|
|
6563
6795
|
contentClassName: AddModule_module_default.content,
|
|
6564
6796
|
footer
|
|
6565
|
-
}, /* @__PURE__ */
|
|
6797
|
+
}, /* @__PURE__ */ createElement("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ createElement(AddModuleForm, {
|
|
6566
6798
|
t,
|
|
6567
6799
|
state
|
|
6568
|
-
}) : null, state.phase === "inspecting" ? /* @__PURE__ */
|
|
6800
|
+
}) : null, state.phase === "inspecting" ? /* @__PURE__ */ createElement(AddModulePending, {
|
|
6569
6801
|
t,
|
|
6570
6802
|
kind: "inspecting"
|
|
6571
|
-
}) : null, state.phase === "preview" ? /* @__PURE__ */
|
|
6803
|
+
}) : null, state.phase === "preview" ? /* @__PURE__ */ createElement(AddModulePreview, {
|
|
6572
6804
|
t,
|
|
6573
6805
|
state
|
|
6574
|
-
}) : null, state.phase === "installing" ? /* @__PURE__ */
|
|
6806
|
+
}) : null, state.phase === "installing" ? /* @__PURE__ */ createElement(AddModulePending, {
|
|
6575
6807
|
t,
|
|
6576
6808
|
kind: "installing"
|
|
6577
|
-
}) : null, state.phase === "result" ? /* @__PURE__ */
|
|
6809
|
+
}) : null, state.phase === "result" ? /* @__PURE__ */ createElement(AddModuleResult, {
|
|
6578
6810
|
t,
|
|
6579
6811
|
state
|
|
6580
6812
|
}) : null));
|
|
@@ -6589,11 +6821,15 @@ var MOCK_FRESHNESS = {
|
|
|
6589
6821
|
};
|
|
6590
6822
|
var NO_UNITS = /* @__PURE__ */ new Set();
|
|
6591
6823
|
function useLiveManifests(units) {
|
|
6592
|
-
|
|
6824
|
+
const subscribe = useCallback((listener) => units.subscribe(listener), [units]);
|
|
6825
|
+
const revision = useCallback(() => units.version(), [units]);
|
|
6826
|
+
useSyncExternalStore(subscribe, revision);
|
|
6593
6827
|
return units.manifests();
|
|
6594
6828
|
}
|
|
6595
6829
|
function useInstallableUnits(units) {
|
|
6596
|
-
|
|
6830
|
+
const subscribe = useCallback((listener) => units.subscribe(listener), [units]);
|
|
6831
|
+
const revision = useCallback(() => units.version(), [units]);
|
|
6832
|
+
useSyncExternalStore(subscribe, revision);
|
|
6597
6833
|
return units.installable();
|
|
6598
6834
|
}
|
|
6599
6835
|
function makeMarketEntryIcon(units) {
|
|
@@ -6618,24 +6854,38 @@ function makeMarketEntryIcon(units) {
|
|
|
6618
6854
|
useEffect(() => () => {
|
|
6619
6855
|
publishPanelHint(MARKET_PANEL_ID, null);
|
|
6620
6856
|
}, []);
|
|
6621
|
-
return /* @__PURE__ */
|
|
6857
|
+
return /* @__PURE__ */ createElement(IconModules, { size });
|
|
6622
6858
|
};
|
|
6623
6859
|
}
|
|
6624
6860
|
function MarketPanel({ t, units }) {
|
|
6625
6861
|
const manifests = useLiveManifests(units);
|
|
6626
6862
|
const installable = useInstallableUnits(units);
|
|
6627
6863
|
const { capabilities, checkedAt, checking, forceProbe, reload: reloadCapability } = useCapabilityMap(0);
|
|
6628
|
-
const { modules, plugins, workbench, read: installedRead, reload: reloadVersions } = useModuleVersions();
|
|
6864
|
+
const { modules, plugins, workbench, selfUpdate, read: installedRead, reload: reloadVersions } = useModuleVersions();
|
|
6629
6865
|
const machineBoard = useEnabledUnits(0, null);
|
|
6630
6866
|
const [adding, setAdding] = useState(false);
|
|
6631
6867
|
const [acting, setActing] = useState(false);
|
|
6632
6868
|
const openAddModule = useCallback(() => setAdding(true), []);
|
|
6633
6869
|
const updates = useMemo(() => marketUpdatesOf(modules), [modules]);
|
|
6634
6870
|
const installed = modules === null ? void 0 : withClientRefusals(modules, units.refusals());
|
|
6635
|
-
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
|
+
}
|
|
6636
6882
|
reloadCapability();
|
|
6637
6883
|
reloadVersions();
|
|
6638
|
-
}, [
|
|
6884
|
+
}, [
|
|
6885
|
+
reloadCapability,
|
|
6886
|
+
reloadVersions,
|
|
6887
|
+
forceProbe
|
|
6888
|
+
]);
|
|
6639
6889
|
const enteredRef = useRef(false);
|
|
6640
6890
|
useEffect(() => {
|
|
6641
6891
|
if (enteredRef.current) return;
|
|
@@ -6687,26 +6937,23 @@ function MarketPanel({ t, units }) {
|
|
|
6687
6937
|
const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
|
|
6688
6938
|
const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
|
|
6689
6939
|
const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
|
|
6690
|
-
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", {
|
|
6691
6941
|
type: "button",
|
|
6692
6942
|
className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
|
|
6693
6943
|
"aria-label": t("panels.market.checkUpdates"),
|
|
6694
6944
|
disabled: busy,
|
|
6695
|
-
onClick: () => {
|
|
6696
|
-
|
|
6697
|
-
reloadVersions({ force: true });
|
|
6698
|
-
}
|
|
6699
|
-
}, /* @__PURE__ */ h("span", {
|
|
6945
|
+
onClick: () => reload({ force: true })
|
|
6946
|
+
}, /* @__PURE__ */ createElement("span", {
|
|
6700
6947
|
className: MarketPage_module_default.marketIconWrap,
|
|
6701
6948
|
"aria-hidden": "true"
|
|
6702
|
-
}, /* @__PURE__ */
|
|
6949
|
+
}, /* @__PURE__ */ createElement(IconRefreshOutlineRegular, null)))), /* @__PURE__ */ createElement(Button, {
|
|
6703
6950
|
variant: "primary",
|
|
6704
6951
|
size: "sm",
|
|
6705
6952
|
className: MarketPage_module_default.marketAddButton,
|
|
6706
|
-
icon: /* @__PURE__ */
|
|
6953
|
+
icon: /* @__PURE__ */ createElement(IconPlusOutlineRegular, { size: 13 }),
|
|
6707
6954
|
disabled: busy,
|
|
6708
6955
|
onClick: openAddModule
|
|
6709
|
-
}, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */
|
|
6956
|
+
}, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ createElement(MarketView, {
|
|
6710
6957
|
key: `${mock?.id ?? "real-market"}-${mockNonce}`,
|
|
6711
6958
|
t,
|
|
6712
6959
|
manifests,
|
|
@@ -6719,16 +6966,17 @@ function MarketPanel({ t, units }) {
|
|
|
6719
6966
|
installed,
|
|
6720
6967
|
installedRead: shownRead,
|
|
6721
6968
|
workbench,
|
|
6969
|
+
selfUpdate,
|
|
6722
6970
|
plugins,
|
|
6723
6971
|
settling: mock === void 0 ? settling : void 0,
|
|
6724
6972
|
mock,
|
|
6725
6973
|
defaults: machineBoard?.defaults ?? [],
|
|
6726
6974
|
changed: machineBoard?.changed ?? {}
|
|
6727
|
-
}), /* @__PURE__ */
|
|
6975
|
+
}), /* @__PURE__ */ createElement(AddModuleDialog, {
|
|
6728
6976
|
t,
|
|
6729
6977
|
open: adding,
|
|
6730
6978
|
onClose: () => setAdding(false),
|
|
6731
|
-
onInstalled: reload
|
|
6979
|
+
onInstalled: () => reload({ force: true })
|
|
6732
6980
|
}));
|
|
6733
6981
|
}
|
|
6734
6982
|
function registerMarketPanel(ctx, units) {
|
|
@@ -7103,7 +7351,7 @@ function DebugFooterAction({ wide, t, useWorkspaces, useSessions }) {
|
|
|
7103
7351
|
where: here.path ?? ""
|
|
7104
7352
|
}, workspacePath);
|
|
7105
7353
|
const view = debugFooterView(state, t, situation === "off-workspace" || situation === "other-board" ? "workspace" : situation === "panel-closed" ? "panel" : "none");
|
|
7106
|
-
const dot = /* @__PURE__ */
|
|
7354
|
+
const dot = /* @__PURE__ */ createElement(StateDot, {
|
|
7107
7355
|
state: view.trouble !== "none" ? "error" : view.stalled ? "warning" : "done",
|
|
7108
7356
|
className: view.trouble === "none" && !view.stalled ? DebugFooterAction_module_default.pulse : void 0
|
|
7109
7357
|
});
|
|
@@ -7121,37 +7369,37 @@ function DebugFooterAction({ wide, t, useWorkspaces, useSessions }) {
|
|
|
7121
7369
|
setArmed(false);
|
|
7122
7370
|
act.send({ intent: "stop" });
|
|
7123
7371
|
};
|
|
7124
|
-
const acts = /* @__PURE__ */
|
|
7372
|
+
const acts = /* @__PURE__ */ createElement("span", { className: DebugFooterAction_module_default.acts }, view.stalled ? /* @__PURE__ */ createElement("button", {
|
|
7125
7373
|
type: "button",
|
|
7126
7374
|
className: DebugFooterAction_module_default.act,
|
|
7127
7375
|
"aria-label": t("debug.act.resume"),
|
|
7128
7376
|
onClick: press("resume")
|
|
7129
|
-
}, /* @__PURE__ */
|
|
7377
|
+
}, /* @__PURE__ */ createElement(IconPlayOutlineRegular, { size: 12 })) : /* @__PURE__ */ createElement("button", {
|
|
7130
7378
|
type: "button",
|
|
7131
7379
|
className: DebugFooterAction_module_default.act,
|
|
7132
7380
|
"aria-label": t("debug.act.pause"),
|
|
7133
7381
|
onClick: press("pause")
|
|
7134
|
-
}, /* @__PURE__ */
|
|
7382
|
+
}, /* @__PURE__ */ createElement(IconPauseOutlineRegular, { size: 12 })), /* @__PURE__ */ createElement("button", {
|
|
7135
7383
|
type: "button",
|
|
7136
7384
|
className: cx(DebugFooterAction_module_default.act, DebugFooterAction_module_default.actStop, armed ? DebugFooterAction_module_default.actArmed : void 0),
|
|
7137
7385
|
"data-act-state": armed ? "armed" : "idle",
|
|
7138
7386
|
"aria-label": armed ? t("debug.act.stop.ask") : t("debug.act.stop"),
|
|
7139
7387
|
onClick: onStop,
|
|
7140
7388
|
onBlur: () => setArmed(false)
|
|
7141
|
-
}, /* @__PURE__ */
|
|
7142
|
-
const status = /* @__PURE__ */
|
|
7143
|
-
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", {
|
|
7144
7392
|
className: DebugFooterAction_module_default.entry,
|
|
7145
7393
|
role: "status",
|
|
7146
7394
|
"aria-label": `${view.label},${view.note}`
|
|
7147
|
-
}, wide === true ? /* @__PURE__ */
|
|
7395
|
+
}, wide === true ? /* @__PURE__ */ createElement(Tip, {
|
|
7148
7396
|
label: view.note,
|
|
7149
7397
|
side: "top"
|
|
7150
7398
|
}, status) : status), wide === true ? acts : null);
|
|
7151
|
-
if (wide === true) return /* @__PURE__ */
|
|
7152
|
-
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, {
|
|
7153
7401
|
anchor: row,
|
|
7154
|
-
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),
|
|
7155
7403
|
openDelayMs: 200
|
|
7156
7404
|
}));
|
|
7157
7405
|
}
|
|
@@ -7248,12 +7496,12 @@ function RecordFooterAction({ wide, t }) {
|
|
|
7248
7496
|
const act = useDiyRecordAct();
|
|
7249
7497
|
if (state === null) return null;
|
|
7250
7498
|
const view = recordFooterView(state, t);
|
|
7251
|
-
const dot = /* @__PURE__ */
|
|
7499
|
+
const dot = /* @__PURE__ */ createElement(StateDot, {
|
|
7252
7500
|
state: state.phase === "finished" ? "done" : "warning",
|
|
7253
7501
|
className: state.phase === "armed" ? RecordFooterAction_module_default.pulse : void 0
|
|
7254
7502
|
});
|
|
7255
7503
|
const tone = state.phase === "finished" ? RecordFooterAction_module_default.done : RecordFooterAction_module_default.live;
|
|
7256
|
-
const acts = /* @__PURE__ */
|
|
7504
|
+
const acts = /* @__PURE__ */ createElement("span", { className: RecordFooterAction_module_default.acts }, view.acts.map((one) => /* @__PURE__ */ createElement("button", {
|
|
7257
7505
|
key: one.intent,
|
|
7258
7506
|
type: "button",
|
|
7259
7507
|
className: RecordFooterAction_module_default.act,
|
|
@@ -7263,19 +7511,19 @@ function RecordFooterAction({ wide, t }) {
|
|
|
7263
7511
|
act.send({ intent: one.intent });
|
|
7264
7512
|
}
|
|
7265
7513
|
}, one.label)));
|
|
7266
|
-
const status = /* @__PURE__ */
|
|
7267
|
-
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", {
|
|
7268
7516
|
className: RecordFooterAction_module_default.entry,
|
|
7269
7517
|
role: "status",
|
|
7270
7518
|
"aria-label": `${view.label},${view.note}`
|
|
7271
|
-
}, wide === true ? /* @__PURE__ */
|
|
7519
|
+
}, wide === true ? /* @__PURE__ */ createElement(Tip, {
|
|
7272
7520
|
label: view.note,
|
|
7273
7521
|
side: "top"
|
|
7274
7522
|
}, status) : status), wide === true ? acts : null);
|
|
7275
|
-
if (wide === true) return /* @__PURE__ */
|
|
7276
|
-
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, {
|
|
7277
7525
|
anchor: row,
|
|
7278
|
-
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),
|
|
7279
7527
|
openDelayMs: 200
|
|
7280
7528
|
}));
|
|
7281
7529
|
}
|
|
@@ -7294,30 +7542,52 @@ function registerRecordFooter(ctx) {
|
|
|
7294
7542
|
//#region src/shared/api/config-sync.ts
|
|
7295
7543
|
var CONFIG_SYNC_ROUTE = "config-sync";
|
|
7296
7544
|
var CONFIG_SYNC_RESOURCE = "configSync";
|
|
7297
|
-
var
|
|
7298
|
-
|
|
7299
|
-
|
|
7300
|
-
|
|
7301
|
-
|
|
7302
|
-
|
|
7303
|
-
|
|
7304
|
-
|
|
7305
|
-
|
|
7306
|
-
|
|
7307
|
-
|
|
7308
|
-
|
|
7309
|
-
|
|
7310
|
-
|
|
7311
|
-
|
|
7312
|
-
|
|
7313
|
-
|
|
7314
|
-
|
|
7315
|
-
|
|
7316
|
-
|
|
7317
|
-
|
|
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"
|
|
7318
7588
|
};
|
|
7319
7589
|
//#endregion
|
|
7320
|
-
//#region src/app/layouts/
|
|
7590
|
+
//#region src/app/layouts/workbench-settings/ConfigSyncItem.tsx
|
|
7321
7591
|
var AUTO_RETRY_MS = 1200;
|
|
7322
7592
|
var DIFF_MAX_LINES = 9;
|
|
7323
7593
|
var TAG_KEYS = {
|
|
@@ -7344,41 +7614,41 @@ function diffLabels(t) {
|
|
|
7344
7614
|
}
|
|
7345
7615
|
function SourcePicker({ t, profiles, source, onPick }) {
|
|
7346
7616
|
if (profiles.length === 0) return null;
|
|
7347
|
-
return /* @__PURE__ */
|
|
7348
|
-
className:
|
|
7617
|
+
return /* @__PURE__ */ createElement("div", {
|
|
7618
|
+
className: ConfigSyncItem_module_default.sources,
|
|
7349
7619
|
role: "group",
|
|
7350
7620
|
"aria-label": t("configSync.source")
|
|
7351
|
-
}, /* @__PURE__ */
|
|
7621
|
+
}, /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.sourcesLabel }, t("configSync.source")), profiles.map((profile) => /* @__PURE__ */ createElement(Button, {
|
|
7352
7622
|
key: profile.name,
|
|
7353
7623
|
variant: profile.name === source ? "outline" : "ghost",
|
|
7354
7624
|
size: "sm",
|
|
7355
|
-
className: profile.name === source ?
|
|
7625
|
+
className: profile.name === source ? ConfigSyncItem_module_default.sourceOn : void 0,
|
|
7356
7626
|
"aria-pressed": profile.name === source,
|
|
7357
7627
|
title: profile.readable ? t("configSync.sourceRows", {
|
|
7358
7628
|
name: profile.name,
|
|
7359
7629
|
count: profile.candidates
|
|
7360
7630
|
}) : t("configSync.sourceBroken"),
|
|
7361
7631
|
onClick: () => onPick(profile.name)
|
|
7362
|
-
}, profile.name, /* @__PURE__ */
|
|
7632
|
+
}, profile.name, /* @__PURE__ */ createElement("span", { className: ConfigSyncItem_module_default.sourceCount }, profile.readable ? profile.candidates : t("configSync.sourceDead")))));
|
|
7363
7633
|
}
|
|
7364
7634
|
function SourceRows({ t, rows, picked, profile, onToggle }) {
|
|
7365
|
-
return /* @__PURE__ */
|
|
7635
|
+
return /* @__PURE__ */ createElement("ul", { className: ConfigSyncItem_module_default.rows }, rows.map((row) => /* @__PURE__ */ createElement("li", {
|
|
7366
7636
|
key: row.key,
|
|
7367
|
-
className:
|
|
7368
|
-
}, /* @__PURE__ */
|
|
7637
|
+
className: ConfigSyncItem_module_default.row
|
|
7638
|
+
}, /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.head }, /* @__PURE__ */ createElement(Checkbox, {
|
|
7369
7639
|
checked: picked.includes(row.key),
|
|
7370
7640
|
label: row.id,
|
|
7371
7641
|
title: row.state === "differs" ? t("configSync.conflictNote") : void 0,
|
|
7372
|
-
className:
|
|
7642
|
+
className: ConfigSyncItem_module_default.pick,
|
|
7373
7643
|
onChange: (next) => onToggle(row.key, next)
|
|
7374
|
-
}), /* @__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, {
|
|
7375
7645
|
code: row.body,
|
|
7376
7646
|
lang: "yaml",
|
|
7377
|
-
className:
|
|
7647
|
+
className: ConfigSyncItem_module_default.code,
|
|
7378
7648
|
copyLabel: t("configSync.code.copy"),
|
|
7379
7649
|
copiedLabel: t("configSync.code.copied"),
|
|
7380
7650
|
toolbarLabels: codeToolbarLabels(t)
|
|
7381
|
-
}) : /* @__PURE__ */
|
|
7651
|
+
}) : /* @__PURE__ */ createElement(DiffBlock, {
|
|
7382
7652
|
diffs: [{
|
|
7383
7653
|
path: row.id,
|
|
7384
7654
|
oldText: row.ownBody,
|
|
@@ -7386,37 +7656,37 @@ function SourceRows({ t, rows, picked, profile, onToggle }) {
|
|
|
7386
7656
|
}],
|
|
7387
7657
|
labels: diffLabels(t),
|
|
7388
7658
|
maxLines: DIFF_MAX_LINES,
|
|
7389
|
-
className:
|
|
7390
|
-
}), row.missing.map((pkg) => /* @__PURE__ */
|
|
7659
|
+
className: ConfigSyncItem_module_default.code
|
|
7660
|
+
}), row.missing.map((pkg) => /* @__PURE__ */ createElement("span", {
|
|
7391
7661
|
key: pkg,
|
|
7392
|
-
className:
|
|
7662
|
+
className: ConfigSyncItem_module_default.missing
|
|
7393
7663
|
}, t("configSync.missing", {
|
|
7394
7664
|
pkg,
|
|
7395
7665
|
profile
|
|
7396
|
-
}))), 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)));
|
|
7397
7667
|
}
|
|
7398
7668
|
function AppliedRows({ t, applied }) {
|
|
7399
|
-
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("、") })}`);
|
|
7400
7670
|
}
|
|
7401
7671
|
function ReadingRow({ t }) {
|
|
7402
|
-
return /* @__PURE__ */
|
|
7403
|
-
className:
|
|
7672
|
+
return /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.reading }, /* @__PURE__ */ createElement("p", {
|
|
7673
|
+
className: ConfigSyncItem_module_default.status,
|
|
7404
7674
|
role: "status"
|
|
7405
|
-
}, /* @__PURE__ */
|
|
7675
|
+
}, /* @__PURE__ */ createElement(Spinner, null), t("configSync.loading")), /* @__PURE__ */ createElement(SkeletonRows, { rows: 3 }));
|
|
7406
7676
|
}
|
|
7407
7677
|
function FailureRow({ t, blocker, onRetry }) {
|
|
7408
|
-
return /* @__PURE__ */
|
|
7409
|
-
className:
|
|
7678
|
+
return /* @__PURE__ */ createElement("div", {
|
|
7679
|
+
className: ConfigSyncItem_module_default.failure,
|
|
7410
7680
|
role: "alert",
|
|
7411
7681
|
"data-config-sync-failure": ""
|
|
7412
|
-
}, /* @__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, {
|
|
7413
7683
|
size: "sm",
|
|
7414
7684
|
variant: "ghost",
|
|
7415
|
-
className:
|
|
7685
|
+
className: ConfigSyncItem_module_default.failureAction,
|
|
7416
7686
|
onClick: onRetry
|
|
7417
7687
|
}, t("blocker.retry")));
|
|
7418
7688
|
}
|
|
7419
|
-
function
|
|
7689
|
+
function ConfigSyncItem({ t }) {
|
|
7420
7690
|
const [source, setSource] = useState("");
|
|
7421
7691
|
const [revision, setRevision] = useState(0);
|
|
7422
7692
|
const [guard, setGuard] = useState(0);
|
|
@@ -7492,13 +7762,13 @@ function ConfigSyncSection({ t }) {
|
|
|
7492
7762
|
setRevision((current) => current + 1);
|
|
7493
7763
|
});
|
|
7494
7764
|
};
|
|
7495
|
-
return /* @__PURE__ */
|
|
7496
|
-
label: t("configSync.nav"),
|
|
7765
|
+
return /* @__PURE__ */ createElement(SettingsItem, {
|
|
7497
7766
|
title: t("configSync.nav"),
|
|
7498
|
-
|
|
7767
|
+
description: t("configSync.lead"),
|
|
7768
|
+
action: failure === null ? /* @__PURE__ */ createElement(Button, {
|
|
7499
7769
|
variant: "ghost",
|
|
7500
7770
|
size: "sm",
|
|
7501
|
-
icon: /* @__PURE__ */
|
|
7771
|
+
icon: /* @__PURE__ */ createElement(IconRefreshOutlineRegular, {
|
|
7502
7772
|
size: 16,
|
|
7503
7773
|
"aria-hidden": "true"
|
|
7504
7774
|
}),
|
|
@@ -7506,42 +7776,319 @@ function ConfigSyncSection({ t }) {
|
|
|
7506
7776
|
disabled: reading.busy,
|
|
7507
7777
|
title: t("configSync.refresh")
|
|
7508
7778
|
}, t("configSync.refresh")) : void 0
|
|
7509
|
-
}, /* @__PURE__ */
|
|
7779
|
+
}, /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.body }, value === void 0 ? null : /* @__PURE__ */ createElement(SourcePicker, {
|
|
7510
7780
|
t,
|
|
7511
7781
|
profiles: value.profiles,
|
|
7512
7782
|
source: value.source,
|
|
7513
7783
|
onPick: pickSource
|
|
7514
|
-
}), reading.busy ? /* @__PURE__ */
|
|
7784
|
+
}), reading.busy ? /* @__PURE__ */ createElement(ReadingRow, { t }) : null, failure !== null && !reading.busy ? /* @__PURE__ */ createElement(FailureRow, {
|
|
7515
7785
|
t,
|
|
7516
7786
|
blocker: failure,
|
|
7517
7787
|
onRetry: reread
|
|
7518
|
-
}) : null, write.failed !== null ? /* @__PURE__ */
|
|
7788
|
+
}) : null, write.failed !== null ? /* @__PURE__ */ createElement(Note, {
|
|
7519
7789
|
tone: "problem",
|
|
7520
7790
|
role: "alert"
|
|
7521
|
-
}, write.failed) : null, applied !== null ? /* @__PURE__ */
|
|
7791
|
+
}, write.failed) : null, applied !== null ? /* @__PURE__ */ createElement(AppliedRows, {
|
|
7522
7792
|
t,
|
|
7523
7793
|
applied
|
|
7524
|
-
}) : 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", {
|
|
7525
7795
|
path: broken.path,
|
|
7526
7796
|
reason: broken.reason
|
|
7527
|
-
})) : 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, {
|
|
7528
7798
|
t,
|
|
7529
7799
|
rows,
|
|
7530
7800
|
picked,
|
|
7531
7801
|
profile: value.self,
|
|
7532
7802
|
onToggle: toggle
|
|
7533
|
-
}) : null, rows.length > 0 ? /* @__PURE__ */
|
|
7803
|
+
}) : null, rows.length > 0 ? /* @__PURE__ */ createElement("div", { className: ConfigSyncItem_module_default.foot }, /* @__PURE__ */ createElement(Button, {
|
|
7534
7804
|
variant: "primary",
|
|
7535
7805
|
size: "md",
|
|
7536
|
-
icon: /* @__PURE__ */ h(IconRefreshOutlineRegular, {
|
|
7537
|
-
size: 16,
|
|
7538
|
-
"aria-hidden": "true"
|
|
7539
|
-
}),
|
|
7540
7806
|
disabled: chosen.length === 0 || busy.busy,
|
|
7541
7807
|
onClick: apply
|
|
7542
7808
|
}, chosen.length === 0 ? t("configSync.applyNone") : busy.busy ? t("configSync.applying") : t("configSync.apply", { count: chosen.length }))) : null) : null));
|
|
7543
7809
|
}
|
|
7544
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
|
|
7545
8092
|
//#region src/shared/api/diy.ts
|
|
7546
8093
|
var DIY_PRESET_ID = "workbench-diy";
|
|
7547
8094
|
var WORKSHOP_RELATIVE = "workbench/diy";
|
|
@@ -7948,7 +8495,7 @@ function createForcePlan() {
|
|
|
7948
8495
|
* 拿到这一拍之后门该怎么办:`close` 撤掉放行、`hold` 停在原地等用户动手、`wait` 接着轮询。
|
|
7949
8496
|
* 桥接坏了(`bridgeIssues` 非空)与 DIY 模式挂不起来(`diyGap` 非空)都是**不拦路**的,
|
|
7950
8497
|
* 但那块「怎么解决」得先真的画出来 —— 停在原地 + 一颗「先进入工作台」才叫不拦路,
|
|
7951
|
-
* 就绪即撤等于把那块提示连同修法一起丢掉,用户进去只会发现「工作台 DIY
|
|
8498
|
+
* 就绪即撤等于把那块提示连同修法一起丢掉,用户进去只会发现「工作台 DIY 模式」整个不在。
|
|
7952
8499
|
*/
|
|
7953
8500
|
function gateActionOf(snapshot) {
|
|
7954
8501
|
if (snapshot.phase === "failed") return "hold";
|
|
@@ -8249,7 +8796,6 @@ var MODULES_UPDATE_DEPENDENCY_TOOL = "workbench_modules_update_dependency";
|
|
|
8249
8796
|
var MODULES_UPDATE_PLUGIN_TOOL = "workbench_modules_update_plugin";
|
|
8250
8797
|
var MODULES_UNINSTALL_PLUGIN_TOOL = "workbench_modules_uninstall_plugin";
|
|
8251
8798
|
var MODULES_UPDATE_WORKBENCH_TOOL = "workbench_modules_update_workbench";
|
|
8252
|
-
var DIY_LIST_TOOL = "workbench_diy_list";
|
|
8253
8799
|
var DIY_STATUS_TOOL = "workbench_diy_status";
|
|
8254
8800
|
var DIY_PANEL_TOOL = "workbench_diy_panel";
|
|
8255
8801
|
var DIY_COMPONENTS_TOOL = "workbench_diy_components";
|
|
@@ -8300,7 +8846,6 @@ var ALL_TOOLS = [
|
|
|
8300
8846
|
MODULES_UPDATE_PLUGIN_TOOL,
|
|
8301
8847
|
MODULES_UNINSTALL_PLUGIN_TOOL,
|
|
8302
8848
|
MODULES_UPDATE_WORKBENCH_TOOL,
|
|
8303
|
-
DIY_LIST_TOOL,
|
|
8304
8849
|
DIY_STATUS_TOOL,
|
|
8305
8850
|
DIY_PANEL_TOOL,
|
|
8306
8851
|
DIY_COMPONENTS_TOOL,
|
|
@@ -8339,7 +8884,6 @@ var ALL_TOOLS = [
|
|
|
8339
8884
|
var READ_TOOLS = [
|
|
8340
8885
|
PANELS_LIST_TOOL,
|
|
8341
8886
|
MODULES_LIST_TOOL,
|
|
8342
|
-
DIY_LIST_TOOL,
|
|
8343
8887
|
DIY_STATUS_TOOL,
|
|
8344
8888
|
DIY_PANEL_TOOL,
|
|
8345
8889
|
DIY_COMPONENTS_TOOL,
|
|
@@ -8447,14 +8991,34 @@ function shellApprovalPlan(input, t) {
|
|
|
8447
8991
|
function shellApprovalDetail(input, t) {
|
|
8448
8992
|
const plan = shellApprovalPlan(input, t);
|
|
8449
8993
|
if (plan === void 0) return void 0;
|
|
8450
|
-
if (plan.rows.length === 0) return
|
|
8451
|
-
return /* @__PURE__ */
|
|
8994
|
+
if (plan.rows.length === 0) return createElement(Fragment, null);
|
|
8995
|
+
return /* @__PURE__ */ createElement(ApprovalPlan, {
|
|
8452
8996
|
rows: plan.rows,
|
|
8453
8997
|
warn: plan.warn
|
|
8454
8998
|
});
|
|
8455
8999
|
}
|
|
8456
9000
|
//#endregion
|
|
8457
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
|
+
}
|
|
8458
9022
|
var browserPersistence = {
|
|
8459
9023
|
readFlag,
|
|
8460
9024
|
writeFlag,
|
|
@@ -8548,27 +9112,27 @@ var ColumnSwitch_module_default = {
|
|
|
8548
9112
|
function ColumnSwitch({ useRightbar, selectColumn, dshColumn, t }) {
|
|
8549
9113
|
const pressed = pressedColumns(useRightbar((snapshot) => snapshot), useSyncExternalStore(dshColumn.subscribe, dshColumn.getSnapshot));
|
|
8550
9114
|
const workbenchLabel = pressed.workbench ? t("rightbar.collapse") : t("rightbar.column.workbench");
|
|
8551
|
-
return /* @__PURE__ */
|
|
9115
|
+
return /* @__PURE__ */ createElement("span", {
|
|
8552
9116
|
className: ColumnSwitch_module_default.group,
|
|
8553
9117
|
role: "group",
|
|
8554
9118
|
"aria-label": t("rightbar.column.label")
|
|
8555
|
-
}, /* @__PURE__ */
|
|
9119
|
+
}, /* @__PURE__ */ createElement(Tip, { label: workbenchLabel }, /* @__PURE__ */ createElement(Button, {
|
|
8556
9120
|
type: "button",
|
|
8557
9121
|
size: "sm",
|
|
8558
9122
|
variant: "ghost",
|
|
8559
9123
|
className: pressed.workbench ? `${ColumnSwitch_module_default.button} ${ColumnSwitch_module_default.active}` : ColumnSwitch_module_default.button,
|
|
8560
9124
|
"aria-pressed": pressed.workbench,
|
|
8561
9125
|
"aria-label": workbenchLabel,
|
|
8562
|
-
icon: /* @__PURE__ */
|
|
9126
|
+
icon: /* @__PURE__ */ createElement("span", { className: ColumnSwitch_module_default.icon }, /* @__PURE__ */ createElement(IconPanelScreen, { size: 15 })),
|
|
8563
9127
|
onClick: () => selectColumn("workbench")
|
|
8564
|
-
})), /* @__PURE__ */
|
|
9128
|
+
})), /* @__PURE__ */ createElement(Tip, { label: t("rightbar.column.dsh") }, /* @__PURE__ */ createElement(Button, {
|
|
8565
9129
|
type: "button",
|
|
8566
9130
|
size: "sm",
|
|
8567
9131
|
variant: "ghost",
|
|
8568
9132
|
className: pressed.dsh ? `${ColumnSwitch_module_default.button} ${ColumnSwitch_module_default.active}` : ColumnSwitch_module_default.button,
|
|
8569
9133
|
"aria-pressed": pressed.dsh,
|
|
8570
9134
|
"aria-label": t("rightbar.column.dsh"),
|
|
8571
|
-
icon: /* @__PURE__ */
|
|
9135
|
+
icon: /* @__PURE__ */ createElement("span", { className: `${ColumnSwitch_module_default.icon} ${ColumnSwitch_module_default.mirror}` }, /* @__PURE__ */ createElement(IconPanelLeftOutlineRegular, { size: 15 })),
|
|
8572
9136
|
onClick: () => selectColumn("dsh")
|
|
8573
9137
|
})));
|
|
8574
9138
|
}
|
|
@@ -8740,42 +9304,42 @@ function stepLabel(step, titleKeyOf, t) {
|
|
|
8740
9304
|
return titleKey === void 0 ? t("panels.unknownStep") : t(titleKey);
|
|
8741
9305
|
}
|
|
8742
9306
|
function Breadcrumbs({ trail, onGoTo, titleKeyOf, t }) {
|
|
8743
|
-
return /* @__PURE__ */
|
|
9307
|
+
return /* @__PURE__ */ createElement("div", {
|
|
8744
9308
|
className: Breadcrumbs_module_default.stripTabs,
|
|
8745
9309
|
role: "presentation"
|
|
8746
9310
|
}, trail.map((step, index) => {
|
|
8747
9311
|
const current = index === trail.length - 1;
|
|
8748
|
-
return /* @__PURE__ */
|
|
9312
|
+
return /* @__PURE__ */ createElement(Fragment, { key: `${step.kind}-${index}` }, index > 0 ? /* @__PURE__ */ createElement("span", {
|
|
8749
9313
|
className: Breadcrumbs_module_default.sep,
|
|
8750
9314
|
"aria-hidden": "true"
|
|
8751
|
-
}, "›") : null, current ? /* @__PURE__ */
|
|
9315
|
+
}, "›") : null, current ? /* @__PURE__ */ createElement("div", {
|
|
8752
9316
|
className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabActive}`,
|
|
8753
9317
|
"aria-current": "page"
|
|
8754
|
-
}, /* @__PURE__ */
|
|
9318
|
+
}, /* @__PURE__ */ createElement("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))) : /* @__PURE__ */ createElement("button", {
|
|
8755
9319
|
type: "button",
|
|
8756
9320
|
className: `${Breadcrumbs_module_default.tab} ${Breadcrumbs_module_default.tabQuiet}`,
|
|
8757
9321
|
onClick: () => onGoTo(index)
|
|
8758
|
-
}, /* @__PURE__ */
|
|
9322
|
+
}, /* @__PURE__ */ createElement("span", { className: Breadcrumbs_module_default.tabTitle }, stepLabel(step, titleKeyOf, t))));
|
|
8759
9323
|
}));
|
|
8760
9324
|
}
|
|
8761
9325
|
//#endregion
|
|
8762
9326
|
//#region src/app/layouts/rightbar/BoardEmpty.tsx
|
|
8763
9327
|
function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
|
|
8764
|
-
return /* @__PURE__ */
|
|
8765
|
-
icon: /* @__PURE__ */
|
|
9328
|
+
return /* @__PURE__ */ createElement(CenteredState, {
|
|
9329
|
+
icon: /* @__PURE__ */ createElement(IconBrandMark, { size: 32 }),
|
|
8766
9330
|
title: t("panels.empty"),
|
|
8767
9331
|
hint: t("panels.emptyHint"),
|
|
8768
|
-
action: /* @__PURE__ */
|
|
9332
|
+
action: /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
|
|
8769
9333
|
type: "button",
|
|
8770
9334
|
size: "sm",
|
|
8771
9335
|
variant: "primary",
|
|
8772
9336
|
onClick: onBuildModule
|
|
8773
|
-
}, t("panels.buildModule")), /* @__PURE__ */
|
|
9337
|
+
}, t("panels.buildModule")), /* @__PURE__ */ createElement(Button, {
|
|
8774
9338
|
type: "button",
|
|
8775
9339
|
size: "sm",
|
|
8776
9340
|
variant: "toolbar",
|
|
8777
9341
|
onClick: onOpenModules
|
|
8778
|
-
}, t("panels.choose")), /* @__PURE__ */
|
|
9342
|
+
}, t("panels.choose")), /* @__PURE__ */ createElement(Button, {
|
|
8779
9343
|
type: "button",
|
|
8780
9344
|
size: "sm",
|
|
8781
9345
|
variant: "toolbar",
|
|
@@ -8881,7 +9445,7 @@ function aggregateSummaries(summaries) {
|
|
|
8881
9445
|
//#endregion
|
|
8882
9446
|
//#region src/app/layouts/rightbar/PanelRowControls.tsx
|
|
8883
9447
|
function PanelRowControls({ t, unit, label, busy, onWrite }) {
|
|
8884
|
-
return /* @__PURE__ */
|
|
9448
|
+
return /* @__PURE__ */ createElement("span", { className: ModulesPage_module_default.rowControls }, /* @__PURE__ */ createElement(Switch, {
|
|
8885
9449
|
checked: unit.shown,
|
|
8886
9450
|
label: `${label} · ${unit.shown ? t("panels.enabled") : t("panels.disabled")}`,
|
|
8887
9451
|
disabled: busy,
|
|
@@ -8895,12 +9459,12 @@ function PanelRowControls({ t, unit, label, busy, onWrite }) {
|
|
|
8895
9459
|
//#region src/app/layouts/rightbar/PanelGroupRows.tsx
|
|
8896
9460
|
function PanelGroupRows({ t, rows, titleKey, busy, onWrite }) {
|
|
8897
9461
|
if (rows.length === 0) return null;
|
|
8898
|
-
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) => {
|
|
8899
9463
|
const title = row.title ?? t(row.titleKey ?? row.id);
|
|
8900
|
-
return /* @__PURE__ */
|
|
9464
|
+
return /* @__PURE__ */ createElement("li", {
|
|
8901
9465
|
key: row.id,
|
|
8902
9466
|
className: `${ModulesPage_module_default.row} ${row.shown ? "" : ModulesPage_module_default.rowOff}`
|
|
8903
|
-
}, /* @__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, {
|
|
8904
9468
|
t,
|
|
8905
9469
|
unit: row,
|
|
8906
9470
|
label: title,
|
|
@@ -8950,14 +9514,14 @@ function gripClass(drag) {
|
|
|
8950
9514
|
return `${ModulesPage_module_default.grip} ${drag.over === null ? ModulesPage_module_default.gripBlocked : ModulesPage_module_default.gripDragging}`;
|
|
8951
9515
|
}
|
|
8952
9516
|
function RowLabel({ t, row }) {
|
|
8953
|
-
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)));
|
|
8954
9518
|
}
|
|
8955
9519
|
function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }) {
|
|
8956
|
-
return /* @__PURE__ */
|
|
9520
|
+
return /* @__PURE__ */ createElement("li", { className: rowClass(row, index, drag) }, row.shown && row.hasCard !== false ? /* @__PURE__ */ createElement(Tip, {
|
|
8957
9521
|
key: tipEpoch,
|
|
8958
9522
|
label: t("panels.dragHint"),
|
|
8959
9523
|
disabled: drag !== null
|
|
8960
|
-
}, /* @__PURE__ */
|
|
9524
|
+
}, /* @__PURE__ */ createElement("span", {
|
|
8961
9525
|
className: gripClass(drag),
|
|
8962
9526
|
"aria-hidden": "true",
|
|
8963
9527
|
onPointerDown: (event) => {
|
|
@@ -8966,10 +9530,10 @@ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }
|
|
|
8966
9530
|
event.currentTarget.setPointerCapture(event.pointerId);
|
|
8967
9531
|
handlers.begin(index, event.clientX, event.clientY);
|
|
8968
9532
|
}
|
|
8969
|
-
}, "⠿")) : /* @__PURE__ */
|
|
9533
|
+
}, "⠿")) : /* @__PURE__ */ createElement("span", { "aria-hidden": "true" }), /* @__PURE__ */ createElement(RowLabel, {
|
|
8970
9534
|
t,
|
|
8971
9535
|
row
|
|
8972
|
-
}), /* @__PURE__ */
|
|
9536
|
+
}), /* @__PURE__ */ createElement(PanelRowControls, {
|
|
8973
9537
|
t,
|
|
8974
9538
|
unit: row,
|
|
8975
9539
|
label: t(row.titleKey ?? row.id),
|
|
@@ -8978,12 +9542,12 @@ function PanelRowItem({ t, row, index, drag, handlers, tipEpoch, busy, onWrite }
|
|
|
8978
9542
|
}));
|
|
8979
9543
|
}
|
|
8980
9544
|
function PanelEmpty({ t, onOpenMarket }) {
|
|
8981
|
-
return /* @__PURE__ */
|
|
9545
|
+
return /* @__PURE__ */ createElement(CenteredState, {
|
|
8982
9546
|
compact: true,
|
|
8983
9547
|
icon: null,
|
|
8984
9548
|
title: t("panels.noneInstalled"),
|
|
8985
9549
|
hint: t("panels.noneInstalledHint"),
|
|
8986
|
-
action: /* @__PURE__ */
|
|
9550
|
+
action: /* @__PURE__ */ createElement(Button, {
|
|
8987
9551
|
type: "button",
|
|
8988
9552
|
size: "sm",
|
|
8989
9553
|
variant: "outline",
|
|
@@ -8992,7 +9556,7 @@ function PanelEmpty({ t, onOpenMarket }) {
|
|
|
8992
9556
|
});
|
|
8993
9557
|
}
|
|
8994
9558
|
function DragGhost({ label, at }) {
|
|
8995
|
-
return /* @__PURE__ */
|
|
9559
|
+
return /* @__PURE__ */ createElement("div", {
|
|
8996
9560
|
className: ModulesPage_module_default.ghost,
|
|
8997
9561
|
style: {
|
|
8998
9562
|
left: `${at.x + 12}px`,
|
|
@@ -9006,7 +9570,7 @@ function ResetConfirmation({ t, open, busy, onCancel, onConfirm }) {
|
|
|
9006
9570
|
setAcknowledged(false);
|
|
9007
9571
|
next();
|
|
9008
9572
|
};
|
|
9009
|
-
return /* @__PURE__ */
|
|
9573
|
+
return /* @__PURE__ */ createElement(RiskConfirmation, {
|
|
9010
9574
|
open,
|
|
9011
9575
|
title: t("panels.followAllConfirmTitle"),
|
|
9012
9576
|
description: t("panels.followAllConfirmDetail"),
|
|
@@ -9106,16 +9670,17 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
|
|
|
9106
9670
|
};
|
|
9107
9671
|
useDragListeners(drag !== null, handlers);
|
|
9108
9672
|
const dragged = drag === null ? void 0 : carded[drag.from];
|
|
9109
|
-
|
|
9673
|
+
const ghost = drag?.at === void 0 || dragged === void 0 ? null : /* @__PURE__ */ createElement(DragGhost, {
|
|
9110
9674
|
label: t(dragged.titleKey ?? dragged.id),
|
|
9111
9675
|
at: drag.at
|
|
9112
|
-
})
|
|
9676
|
+
});
|
|
9677
|
+
return /* @__PURE__ */ createElement(Fragment, null, ghost, empty ? /* @__PURE__ */ createElement(PanelEmpty, {
|
|
9113
9678
|
t,
|
|
9114
9679
|
onOpenMarket
|
|
9115
|
-
}) : null, carded.length === 0 ? null : /* @__PURE__ */
|
|
9680
|
+
}) : null, carded.length === 0 ? null : /* @__PURE__ */ createElement("ul", {
|
|
9116
9681
|
ref: listRef,
|
|
9117
9682
|
className: `${ModulesPage_module_default.list}${drag === null ? "" : ` ${ModulesPage_module_default.listDragging}`}`
|
|
9118
|
-
}, carded.map((row, index) => /* @__PURE__ */
|
|
9683
|
+
}, carded.map((row, index) => /* @__PURE__ */ createElement(PanelRowItem, {
|
|
9119
9684
|
key: row.id,
|
|
9120
9685
|
t,
|
|
9121
9686
|
row,
|
|
@@ -9125,24 +9690,24 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
|
|
|
9125
9690
|
tipEpoch,
|
|
9126
9691
|
busy,
|
|
9127
9692
|
onWrite: writeRow
|
|
9128
|
-
}))), /* @__PURE__ */
|
|
9693
|
+
}))), /* @__PURE__ */ createElement(PanelGroupRows, {
|
|
9129
9694
|
t,
|
|
9130
9695
|
rows: boardless,
|
|
9131
9696
|
titleKey: "panels.groupBoardless",
|
|
9132
9697
|
busy,
|
|
9133
9698
|
onWrite: writeRow
|
|
9134
|
-
}), /* @__PURE__ */
|
|
9699
|
+
}), /* @__PURE__ */ createElement(PanelGroupRows, {
|
|
9135
9700
|
t,
|
|
9136
9701
|
rows: pluginRows,
|
|
9137
9702
|
titleKey: "panels.groupPlugins",
|
|
9138
9703
|
busy,
|
|
9139
9704
|
onWrite: writeRow
|
|
9140
|
-
}), own ? /* @__PURE__ */
|
|
9705
|
+
}), own ? /* @__PURE__ */ createElement(PanelFoot, null, /* @__PURE__ */ createElement("button", {
|
|
9141
9706
|
type: "button",
|
|
9142
9707
|
className: ModulesPage_module_default.reset,
|
|
9143
9708
|
disabled: busy,
|
|
9144
9709
|
onClick: () => setConfirmingReset(true)
|
|
9145
|
-
}, t("panels.followAll"))) : null, /* @__PURE__ */
|
|
9710
|
+
}, t("panels.followAll"))) : null, /* @__PURE__ */ createElement(ResetConfirmation, {
|
|
9146
9711
|
t,
|
|
9147
9712
|
open: confirmingReset,
|
|
9148
9713
|
busy,
|
|
@@ -9151,7 +9716,7 @@ function ModulesPage({ t, units, plugins = [], workspace, capabilities, loading
|
|
|
9151
9716
|
setConfirmingReset(false);
|
|
9152
9717
|
write({ action: "reset" });
|
|
9153
9718
|
}
|
|
9154
|
-
}), failed ? /* @__PURE__ */
|
|
9719
|
+
}), failed ? /* @__PURE__ */ createElement("p", { className: ModulesPage_module_default.error }, t("panels.failed")) : null);
|
|
9155
9720
|
}
|
|
9156
9721
|
//#endregion
|
|
9157
9722
|
//#region src/app/layouts/rightbar/panel-dismiss.ts
|
|
@@ -9189,23 +9754,23 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
|
|
|
9189
9754
|
const mockNonce = devPanel.pick.nonce;
|
|
9190
9755
|
useDismissOnOutsidePointer(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
|
|
9191
9756
|
const units = enabledUnits?.units ?? [];
|
|
9192
|
-
return /* @__PURE__ */
|
|
9757
|
+
return /* @__PURE__ */ createElement("div", {
|
|
9193
9758
|
className: ModulesPage_module_default.trigger,
|
|
9194
9759
|
ref: root
|
|
9195
|
-
}, /* @__PURE__ */
|
|
9760
|
+
}, /* @__PURE__ */ createElement(Tip, { label: t("panels.title") }, /* @__PURE__ */ createElement(Button, {
|
|
9196
9761
|
type: "button",
|
|
9197
9762
|
size: "sm",
|
|
9198
9763
|
variant: "ghost",
|
|
9199
9764
|
className: `wb-stripButton${open ? " wb-stripButtonActive" : ""}`,
|
|
9200
9765
|
"aria-label": t("panels.title"),
|
|
9201
9766
|
"aria-expanded": open,
|
|
9202
|
-
icon: /* @__PURE__ */
|
|
9767
|
+
icon: /* @__PURE__ */ createElement(IconModules, { size: 16 }),
|
|
9203
9768
|
onClick: () => onOpenChange(!open)
|
|
9204
|
-
})), open ? /* @__PURE__ */
|
|
9769
|
+
})), open ? /* @__PURE__ */ createElement("div", {
|
|
9205
9770
|
className: ModulesPage_module_default.pop,
|
|
9206
9771
|
role: "dialog",
|
|
9207
9772
|
"aria-label": t("panels.title")
|
|
9208
|
-
}, /* @__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, {
|
|
9209
9774
|
key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
|
|
9210
9775
|
t,
|
|
9211
9776
|
units: panelMock?.units ?? units,
|
|
@@ -9501,7 +10066,8 @@ function workspacePathOf(world) {
|
|
|
9501
10066
|
}
|
|
9502
10067
|
function ModuleHost({ module, step, panelToken, onPanelRefresh, onSummary, ...rest }) {
|
|
9503
10068
|
const [ownToken, setOwnToken] = useState(0);
|
|
9504
|
-
|
|
10069
|
+
const View = step === void 0 ? module.View : module.steps?.[step]?.View ?? module.View;
|
|
10070
|
+
return /* @__PURE__ */ createElement(View, {
|
|
9505
10071
|
...rest,
|
|
9506
10072
|
refreshToken: panelToken + ownToken,
|
|
9507
10073
|
onRefresh: () => setOwnToken((value) => value + 1),
|
|
@@ -9518,13 +10084,13 @@ function BoardGrid({ entries, panelWidth, world, panelToken, onPanelRefresh, onN
|
|
|
9518
10084
|
trailing: false
|
|
9519
10085
|
}));
|
|
9520
10086
|
const order = slots !== null && slots.length === entries.length ? slots : plain;
|
|
9521
|
-
return /* @__PURE__ */
|
|
10087
|
+
return /* @__PURE__ */ createElement("div", {
|
|
9522
10088
|
className: Rightbar_module_default.columns,
|
|
9523
10089
|
ref: root,
|
|
9524
10090
|
style: { columnCount }
|
|
9525
10091
|
}, order.map((slot) => {
|
|
9526
10092
|
const entry = entries[slot.index];
|
|
9527
|
-
return /* @__PURE__ */
|
|
10093
|
+
return /* @__PURE__ */ createElement("div", {
|
|
9528
10094
|
className: Rightbar_module_default.cell,
|
|
9529
10095
|
key: entry.key,
|
|
9530
10096
|
"data-wb-cell": entry.key,
|
|
@@ -9532,12 +10098,12 @@ function BoardGrid({ entries, panelWidth, world, panelToken, onPanelRefresh, onN
|
|
|
9532
10098
|
breakBefore: slot.breakBefore ? "column" : void 0,
|
|
9533
10099
|
marginBottom: slot.trailing ? 0 : void 0
|
|
9534
10100
|
}
|
|
9535
|
-
}, /* @__PURE__ */
|
|
10101
|
+
}, /* @__PURE__ */ createElement(CardAnchor, { unit: entry.module.id }, /* @__PURE__ */ createElement(CardBoundary, {
|
|
9536
10102
|
unit: entry.module.id,
|
|
9537
10103
|
resetKey: `${entry.key}:${panelToken}:${workspacePathOf(world)}`,
|
|
9538
10104
|
t,
|
|
9539
10105
|
onFailure: (reason) => onCardFailure(entry.module.id, reason)
|
|
9540
|
-
}, /* @__PURE__ */
|
|
10106
|
+
}, /* @__PURE__ */ createElement(ModuleHost, {
|
|
9541
10107
|
module: entry.module,
|
|
9542
10108
|
world,
|
|
9543
10109
|
panelToken,
|
|
@@ -9577,21 +10143,21 @@ function createSuiteWorld(input) {
|
|
|
9577
10143
|
//#endregion
|
|
9578
10144
|
//#region src/app/layouts/rightbar/Rightbar.tsx
|
|
9579
10145
|
function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnabled, onRefresh, modulesOpen, onModulesOpenChange, enabledUnits, manifests, workspace, refreshToken, onOpenMarket, onCollapse }) {
|
|
9580
|
-
return /* @__PURE__ */
|
|
10146
|
+
return /* @__PURE__ */ createElement("header", { className: "wb-panelHeader" }, /* @__PURE__ */ createElement("div", { className: "wb-tabStrip" }, /* @__PURE__ */ createElement(Breadcrumbs, {
|
|
9581
10147
|
trail,
|
|
9582
10148
|
onGoTo,
|
|
9583
10149
|
titleKeyOf,
|
|
9584
10150
|
t
|
|
9585
|
-
}), /* @__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, {
|
|
9586
10152
|
type: "button",
|
|
9587
10153
|
size: "sm",
|
|
9588
10154
|
variant: "ghost",
|
|
9589
10155
|
className: `wb-stripButton${refreshing ? " wb-spinning" : ""}`,
|
|
9590
10156
|
"aria-label": refreshing ? t("rightbar.refreshing") : t("rightbar.refresh"),
|
|
9591
10157
|
disabled: refreshing || !refreshEnabled,
|
|
9592
|
-
icon: /* @__PURE__ */
|
|
10158
|
+
icon: /* @__PURE__ */ createElement(IconRefreshOutlineRegular, { size: 16 }),
|
|
9593
10159
|
onClick: onRefresh
|
|
9594
|
-
})), /* @__PURE__ */
|
|
10160
|
+
})), /* @__PURE__ */ createElement(PanelModules, {
|
|
9595
10161
|
t,
|
|
9596
10162
|
open: modulesOpen,
|
|
9597
10163
|
onOpenChange: onModulesOpenChange,
|
|
@@ -9600,33 +10166,33 @@ function PanelHeader({ t, trail, onGoTo, titleKeyOf, refreshing, at, refreshEnab
|
|
|
9600
10166
|
refreshToken,
|
|
9601
10167
|
manifests,
|
|
9602
10168
|
onOpenMarket
|
|
9603
|
-
}), /* @__PURE__ */
|
|
10169
|
+
}), /* @__PURE__ */ createElement(Tip, { label: t("rightbar.collapse") }, /* @__PURE__ */ createElement(Button, {
|
|
9604
10170
|
type: "button",
|
|
9605
10171
|
size: "sm",
|
|
9606
10172
|
variant: "ghost",
|
|
9607
10173
|
className: "wb-stripButton",
|
|
9608
10174
|
"aria-label": t("rightbar.collapse"),
|
|
9609
|
-
icon: /* @__PURE__ */
|
|
10175
|
+
icon: /* @__PURE__ */ createElement("span", { className: "wb-stripIconFlip" }, /* @__PURE__ */ createElement(IconPanelLeftOutlineRegular, { size: 16 })),
|
|
9610
10176
|
onClick: onCollapse
|
|
9611
10177
|
})))));
|
|
9612
10178
|
}
|
|
9613
10179
|
function BoardContent({ top, plan, world, board, panelWidth, panelToken, onPanelRefresh, onNavigate, onOpenMarket, onSummary, onOpenModules, onCardFailure, buildModule, t }) {
|
|
9614
10180
|
if (top.kind !== "board") {
|
|
9615
10181
|
const owner = board.stepOwner(top.kind);
|
|
9616
|
-
if (owner === void 0) return /* @__PURE__ */
|
|
9617
|
-
icon: /* @__PURE__ */
|
|
10182
|
+
if (owner === void 0) return /* @__PURE__ */ createElement(CenteredState, {
|
|
10183
|
+
icon: /* @__PURE__ */ createElement(IconBrandMark, { size: 32 }),
|
|
9618
10184
|
title: t("panels.unknownStep")
|
|
9619
10185
|
});
|
|
9620
10186
|
const key = `${owner.id}:${top.kind}`;
|
|
9621
|
-
return /* @__PURE__ */
|
|
10187
|
+
return /* @__PURE__ */ createElement(CardAnchor, {
|
|
9622
10188
|
key,
|
|
9623
10189
|
unit: owner.id
|
|
9624
|
-
}, /* @__PURE__ */
|
|
10190
|
+
}, /* @__PURE__ */ createElement(CardBoundary, {
|
|
9625
10191
|
unit: owner.id,
|
|
9626
10192
|
resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
|
|
9627
10193
|
t,
|
|
9628
10194
|
onFailure: (reason) => onCardFailure(owner.id, reason)
|
|
9629
|
-
}, /* @__PURE__ */
|
|
10195
|
+
}, /* @__PURE__ */ createElement(ModuleHost, {
|
|
9630
10196
|
module: owner,
|
|
9631
10197
|
step: top.kind,
|
|
9632
10198
|
world,
|
|
@@ -9638,15 +10204,15 @@ function BoardContent({ top, plan, world, board, panelWidth, panelToken, onPanel
|
|
|
9638
10204
|
t
|
|
9639
10205
|
})));
|
|
9640
10206
|
}
|
|
9641
|
-
return /* @__PURE__ */
|
|
10207
|
+
return /* @__PURE__ */ createElement(Fragment, null, plan.reading ? /* @__PURE__ */ createElement(CenteredState, {
|
|
9642
10208
|
icon: null,
|
|
9643
|
-
title: /* @__PURE__ */
|
|
9644
|
-
}) : null, plan.empty ? /* @__PURE__ */
|
|
10209
|
+
title: /* @__PURE__ */ createElement(TextShimmer, { active: true }, t("panels.reading"))
|
|
10210
|
+
}) : null, plan.empty ? /* @__PURE__ */ createElement(BoardEmpty, {
|
|
9645
10211
|
t,
|
|
9646
10212
|
onBuildModule: buildModule,
|
|
9647
10213
|
onOpenModules,
|
|
9648
10214
|
onOpenMarket
|
|
9649
|
-
}) : null, /* @__PURE__ */
|
|
10215
|
+
}) : null, /* @__PURE__ */ createElement(BoardGrid, {
|
|
9650
10216
|
entries: plan.modules,
|
|
9651
10217
|
panelWidth,
|
|
9652
10218
|
world,
|
|
@@ -9758,7 +10324,7 @@ function Rightbar(props) {
|
|
|
9758
10324
|
const top = state.trail[state.trail.length - 1] ?? { kind: "board" };
|
|
9759
10325
|
const navigate = (step) => props.openPanel(step);
|
|
9760
10326
|
const openMarket = () => props.openMarket();
|
|
9761
|
-
return /* @__PURE__ */
|
|
10327
|
+
return /* @__PURE__ */ createElement("aside", {
|
|
9762
10328
|
ref: asideRef,
|
|
9763
10329
|
className: `wb-rightbar ${Rightbar_module_default.panel}`,
|
|
9764
10330
|
style: { width: panelWidth },
|
|
@@ -9767,7 +10333,7 @@ function Rightbar(props) {
|
|
|
9767
10333
|
"data-wb-board": fixtureMode ? void 0 : boardWorkspace ?? void 0,
|
|
9768
10334
|
"data-wb-open": fixtureMode || !shown ? void 0 : "",
|
|
9769
10335
|
"aria-label": props.t("rightbar.label")
|
|
9770
|
-
}, /* @__PURE__ */
|
|
10336
|
+
}, /* @__PURE__ */ createElement(PanelHeader, {
|
|
9771
10337
|
t: props.t,
|
|
9772
10338
|
trail: state.trail,
|
|
9773
10339
|
onGoTo: props.goToPanel,
|
|
@@ -9784,7 +10350,7 @@ function Rightbar(props) {
|
|
|
9784
10350
|
refreshToken: panelToken,
|
|
9785
10351
|
onOpenMarket: openMarket,
|
|
9786
10352
|
onCollapse: props.toggleRightbar
|
|
9787
|
-
}), 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, {
|
|
9788
10354
|
top,
|
|
9789
10355
|
plan,
|
|
9790
10356
|
world,
|
|
@@ -10059,29 +10625,29 @@ function openNewSession(input) {
|
|
|
10059
10625
|
//#region src/app/layouts/sidebar/SidebarHeader.tsx
|
|
10060
10626
|
function SidebarHeader(props) {
|
|
10061
10627
|
const { collapsed, wide, attention, t, renderSlot } = props;
|
|
10062
|
-
return /* @__PURE__ */
|
|
10628
|
+
return /* @__PURE__ */ createElement("div", { className: "wb-logoRow" }, wide ? /* @__PURE__ */ createElement(Tip, { label: t("panel.conversation") }, /* @__PURE__ */ createElement("button", {
|
|
10063
10629
|
type: "button",
|
|
10064
10630
|
className: "wb-brand",
|
|
10065
10631
|
onClick: () => props.onSelectPanel(null)
|
|
10066
|
-
}, /* @__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", {
|
|
10067
10633
|
type: "button",
|
|
10068
10634
|
className: "wb-iconButton wb-toggle",
|
|
10069
10635
|
"aria-label": t(collapsed ? "toggle.open" : "toggle.collapse"),
|
|
10070
10636
|
onClick: props.onToggle
|
|
10071
|
-
}, !wide ? /* @__PURE__ */
|
|
10637
|
+
}, !wide ? /* @__PURE__ */ createElement("span", {
|
|
10072
10638
|
className: "wb-railMark",
|
|
10073
10639
|
"aria-hidden": "true"
|
|
10074
|
-
}, 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));
|
|
10075
10641
|
}
|
|
10076
10642
|
//#endregion
|
|
10077
10643
|
//#region src/app/layouts/sidebar/WorkspaceSection.tsx
|
|
10078
10644
|
function WorkspaceSection({ t, wide, onNewSession }) {
|
|
10079
|
-
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", {
|
|
10080
10646
|
type: "button",
|
|
10081
10647
|
className: "wb-iconButton wb-wsNew",
|
|
10082
10648
|
"aria-label": t("session.new"),
|
|
10083
10649
|
onClick: onNewSession
|
|
10084
|
-
}, /* @__PURE__ */
|
|
10650
|
+
}, /* @__PURE__ */ createElement(IconNewChatOutlineRegular, { size: 16 })))));
|
|
10085
10651
|
}
|
|
10086
10652
|
//#endregion
|
|
10087
10653
|
//#region src/shared/hooks/use-shell-long-tasks.ts
|
|
@@ -10153,22 +10719,22 @@ function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntr
|
|
|
10153
10719
|
const glyph = fallbackGlyph ?? (id !== null && renderEntry !== void 0 ? renderEntry(id, active, wide) : null);
|
|
10154
10720
|
const hint = usePanelHint(id);
|
|
10155
10721
|
const name = panelRowName(label, hint, t);
|
|
10156
|
-
return /* @__PURE__ */
|
|
10722
|
+
return /* @__PURE__ */ createElement(Tip, {
|
|
10157
10723
|
label: name,
|
|
10158
10724
|
disabled: !(hint !== null || !wide)
|
|
10159
|
-
}, /* @__PURE__ */
|
|
10725
|
+
}, /* @__PURE__ */ createElement("button", {
|
|
10160
10726
|
type: "button",
|
|
10161
10727
|
className: cx("wb-panelRow", active && "wb-panelActive"),
|
|
10162
10728
|
"aria-current": active ? "page" : void 0,
|
|
10163
10729
|
"aria-label": name,
|
|
10164
10730
|
onClick: () => onSelect(id)
|
|
10165
|
-
}, /* @__PURE__ */
|
|
10731
|
+
}, /* @__PURE__ */ createElement("span", {
|
|
10166
10732
|
className: "wb-panelGlyph",
|
|
10167
10733
|
"aria-hidden": "true"
|
|
10168
|
-
}, glyph, hint !== null && !wide ? /* @__PURE__ */
|
|
10734
|
+
}, glyph, hint !== null && !wide ? /* @__PURE__ */ createElement("span", { className: "wb-panelDot" }, /* @__PURE__ */ createElement(StateDot, {
|
|
10169
10735
|
state: hint.tone === "danger" ? "error" : "warning",
|
|
10170
10736
|
size: 9
|
|
10171
|
-
})) : null), wide ? /* @__PURE__ */
|
|
10737
|
+
})) : null), wide ? /* @__PURE__ */ createElement("span", { className: "wb-panelTitle" }, label) : null, hint === null || !wide ? null : /* @__PURE__ */ createElement(Tag, {
|
|
10172
10738
|
tone: hint.tone,
|
|
10173
10739
|
className: "wb-panelTag"
|
|
10174
10740
|
}, t(hint.labelKey))));
|
|
@@ -10196,22 +10762,22 @@ var WorkspaceAttentionDot_module_default = {
|
|
|
10196
10762
|
function WorkspaceAttentionDot({ attention, t, variant = "inline", tip = false }) {
|
|
10197
10763
|
if (attention === null) return null;
|
|
10198
10764
|
const label = attentionLabel(attention, t);
|
|
10199
|
-
const dot = /* @__PURE__ */
|
|
10765
|
+
const dot = /* @__PURE__ */ createElement("span", {
|
|
10200
10766
|
className: variant === "overlay" ? cx(WorkspaceAttentionDot_module_default.dot, WorkspaceAttentionDot_module_default.overlay) : WorkspaceAttentionDot_module_default.dot,
|
|
10201
10767
|
role: "img",
|
|
10202
10768
|
"aria-label": label
|
|
10203
|
-
}, /* @__PURE__ */
|
|
10769
|
+
}, /* @__PURE__ */ createElement(StateDot, {
|
|
10204
10770
|
state: attention.severity,
|
|
10205
10771
|
size: variant === "overlay" ? 9 : void 0
|
|
10206
10772
|
}));
|
|
10207
|
-
return tip ? /* @__PURE__ */
|
|
10773
|
+
return tip ? /* @__PURE__ */ createElement(Tip, { label }, dot) : dot;
|
|
10208
10774
|
}
|
|
10209
10775
|
var WorkspaceAttentionTag_module_default = { tag: "_tag_g9dg8_1" };
|
|
10210
10776
|
//#endregion
|
|
10211
10777
|
//#region src/app/layouts/sidebar/WorkspaceAttentionTag.tsx
|
|
10212
10778
|
function WorkspaceAttentionTag({ attention, t }) {
|
|
10213
10779
|
if (attention === null) return null;
|
|
10214
|
-
return /* @__PURE__ */
|
|
10780
|
+
return /* @__PURE__ */ createElement(Tip, { label: attentionLabel(attention, t) }, /* @__PURE__ */ createElement(Tag, {
|
|
10215
10781
|
tone: attention.severity === "warning" ? "warning" : "success",
|
|
10216
10782
|
className: WorkspaceAttentionTag_module_default.tag
|
|
10217
10783
|
}, attentionWordLabel(attention, t)));
|
|
@@ -10269,7 +10835,7 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
|
|
|
10269
10835
|
else setFailed(true);
|
|
10270
10836
|
});
|
|
10271
10837
|
};
|
|
10272
|
-
return /* @__PURE__ */
|
|
10838
|
+
return /* @__PURE__ */ createElement(Modal, {
|
|
10273
10839
|
open: true,
|
|
10274
10840
|
onClose: () => {
|
|
10275
10841
|
if (!busy) onClose();
|
|
@@ -10278,13 +10844,13 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
|
|
|
10278
10844
|
description: t("project.rename.description"),
|
|
10279
10845
|
closeLabel: t("project.rename.cancel"),
|
|
10280
10846
|
className: WorkspaceRenameDialog_module_default.dialog,
|
|
10281
|
-
footer: /* @__PURE__ */
|
|
10847
|
+
footer: /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(Button, {
|
|
10282
10848
|
type: "button",
|
|
10283
10849
|
variant: "outline",
|
|
10284
10850
|
size: "md",
|
|
10285
10851
|
disabled: busy,
|
|
10286
10852
|
onClick: onClose
|
|
10287
|
-
}, t("project.rename.cancel")), /* @__PURE__ */
|
|
10853
|
+
}, t("project.rename.cancel")), /* @__PURE__ */ createElement(Button, {
|
|
10288
10854
|
type: "button",
|
|
10289
10855
|
variant: "primary",
|
|
10290
10856
|
size: "md",
|
|
@@ -10292,7 +10858,7 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
|
|
|
10292
10858
|
"aria-busy": busy,
|
|
10293
10859
|
onClick: save
|
|
10294
10860
|
}, t(busy ? "project.rename.saving" : "project.rename.save")))
|
|
10295
|
-
}, /* @__PURE__ */
|
|
10861
|
+
}, /* @__PURE__ */ createElement("div", { className: WorkspaceRenameDialog_module_default.stack }, /* @__PURE__ */ createElement(TextField, {
|
|
10296
10862
|
className: WorkspaceRenameDialog_module_default.input,
|
|
10297
10863
|
"data-modal-autofocus": "",
|
|
10298
10864
|
id: "wb-workspace-name",
|
|
@@ -10308,10 +10874,10 @@ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
|
|
|
10308
10874
|
event.preventDefault();
|
|
10309
10875
|
save();
|
|
10310
10876
|
}
|
|
10311
|
-
}), /* @__PURE__ */
|
|
10877
|
+
}), /* @__PURE__ */ createElement("div", { className: WorkspaceRenameDialog_module_default.meta }, /* @__PURE__ */ createElement(Note, { as: "span" }, t("project.rename.hint")), /* @__PURE__ */ createElement(Note, {
|
|
10312
10878
|
as: "span",
|
|
10313
10879
|
tone: tooLong ? "problem" : "muted"
|
|
10314
|
-
}, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */
|
|
10880
|
+
}, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */ createElement(Note, { tone: "problem" }, t("project.rename.failed")) : null));
|
|
10315
10881
|
}
|
|
10316
10882
|
//#endregion
|
|
10317
10883
|
//#region src/app/layouts/sidebar/workspace-groups.ts
|
|
@@ -10344,12 +10910,12 @@ function workspaceSections(items, headings) {
|
|
|
10344
10910
|
//#endregion
|
|
10345
10911
|
//#region src/app/layouts/sidebar/WorkspaceRowAction.tsx
|
|
10346
10912
|
function WorkspaceRowAction({ workspace, t, onEdit }) {
|
|
10347
|
-
return /* @__PURE__ */
|
|
10913
|
+
return /* @__PURE__ */ createElement(Button, {
|
|
10348
10914
|
type: "button",
|
|
10349
10915
|
variant: "ghost",
|
|
10350
10916
|
size: "sm",
|
|
10351
10917
|
className: ProjectSwitcher_module_default.rowAction,
|
|
10352
|
-
icon: /* @__PURE__ */
|
|
10918
|
+
icon: /* @__PURE__ */ createElement(IconEditOutlineRegular, { size: 14 }),
|
|
10353
10919
|
"aria-label": t("project.rename.row", { name: displayNameOf(workspace).dir }),
|
|
10354
10920
|
onClick: (event) => {
|
|
10355
10921
|
event.stopPropagation();
|
|
@@ -10378,13 +10944,13 @@ function WorkspaceRowLabel({ workspace, current, action, onHover }) {
|
|
|
10378
10944
|
row.removeEventListener("mouseleave", leave);
|
|
10379
10945
|
};
|
|
10380
10946
|
}, []);
|
|
10381
|
-
return /* @__PURE__ */
|
|
10947
|
+
return /* @__PURE__ */ createElement("span", {
|
|
10382
10948
|
ref: hostRef,
|
|
10383
10949
|
className: ProjectSwitcher_module_default.row
|
|
10384
|
-
}, /* @__PURE__ */
|
|
10950
|
+
}, /* @__PURE__ */ createElement("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ createElement("span", {
|
|
10385
10951
|
className: ProjectSwitcher_module_default.name,
|
|
10386
10952
|
title: name
|
|
10387
|
-
}, 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)));
|
|
10388
10954
|
}
|
|
10389
10955
|
//#endregion
|
|
10390
10956
|
//#region src/app/layouts/sidebar/workspace-items.tsx
|
|
@@ -10395,15 +10961,15 @@ function workspaceOptions(options) {
|
|
|
10395
10961
|
return {
|
|
10396
10962
|
value: workspace.workspaceId,
|
|
10397
10963
|
group,
|
|
10398
|
-
icon: own === null ? /* @__PURE__ */
|
|
10964
|
+
icon: own === null ? /* @__PURE__ */ createElement(IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ createElement(WorkspaceAttentionDot, {
|
|
10399
10965
|
attention: own,
|
|
10400
10966
|
t
|
|
10401
10967
|
}),
|
|
10402
|
-
label: /* @__PURE__ */
|
|
10968
|
+
label: /* @__PURE__ */ createElement(WorkspaceRowLabel, {
|
|
10403
10969
|
workspace,
|
|
10404
10970
|
current: workspace.workspaceId === currentId,
|
|
10405
10971
|
onHover: (hovering) => onHover(hovering ? workspace.workspaceId : null),
|
|
10406
|
-
action: hoverId === workspace.workspaceId ? /* @__PURE__ */
|
|
10972
|
+
action: hoverId === workspace.workspaceId ? /* @__PURE__ */ createElement(WorkspaceRowAction, {
|
|
10407
10973
|
workspace,
|
|
10408
10974
|
t,
|
|
10409
10975
|
onEdit: () => onEdit(workspace)
|
|
@@ -10449,26 +11015,26 @@ function ProjectSwitcher({ items, current, attention, compact = false, onPick, o
|
|
|
10449
11015
|
const out = /* @__PURE__ */ new Map();
|
|
10450
11016
|
for (const workspace of items) {
|
|
10451
11017
|
const { dir, name } = displayNameOf(workspace);
|
|
10452
|
-
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)));
|
|
10453
11019
|
}
|
|
10454
11020
|
return out;
|
|
10455
11021
|
}, [items]);
|
|
10456
|
-
return /* @__PURE__ */
|
|
11022
|
+
return /* @__PURE__ */ createElement("div", { className: cx(ProjectSwitcher_module_default.root, compact && ProjectSwitcher_module_default.rail) }, /* @__PURE__ */ createElement(SelectField, {
|
|
10457
11023
|
value: currentId,
|
|
10458
11024
|
options,
|
|
10459
11025
|
onChange: onPick,
|
|
10460
11026
|
open,
|
|
10461
11027
|
onOpenChange: setOpen,
|
|
10462
|
-
icon: /* @__PURE__ */
|
|
11028
|
+
icon: /* @__PURE__ */ createElement(Tip, {
|
|
10463
11029
|
label: current?.path ?? "",
|
|
10464
11030
|
disabled: current === null
|
|
10465
|
-
}, /* @__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, {
|
|
10466
11032
|
attention: attention.overall,
|
|
10467
11033
|
t,
|
|
10468
11034
|
variant: "overlay",
|
|
10469
11035
|
tip: true
|
|
10470
11036
|
}) : null))),
|
|
10471
|
-
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, {
|
|
10472
11038
|
attention: attention.elsewhere,
|
|
10473
11039
|
t
|
|
10474
11040
|
})),
|
|
@@ -10487,10 +11053,10 @@ function ProjectSwitcher({ items, current, attention, compact = false, onPick, o
|
|
|
10487
11053
|
},
|
|
10488
11054
|
footer: {
|
|
10489
11055
|
label: t("project.add"),
|
|
10490
|
-
icon: /* @__PURE__ */
|
|
11056
|
+
icon: /* @__PURE__ */ createElement(IconPlusOutlineRegular, { size: 14 })
|
|
10491
11057
|
},
|
|
10492
11058
|
onFooter: onAdd
|
|
10493
|
-
}), naming === null ? null : /* @__PURE__ */
|
|
11059
|
+
}), naming === null ? null : /* @__PURE__ */ createElement(WorkspaceRenameDialog, {
|
|
10494
11060
|
key: naming.workspaceId,
|
|
10495
11061
|
workspace: naming,
|
|
10496
11062
|
t,
|
|
@@ -10561,17 +11127,17 @@ function useTitleMarquee(title) {
|
|
|
10561
11127
|
function SessionLeading({ node, statuses, renderSlot }) {
|
|
10562
11128
|
if (node.blank) return null;
|
|
10563
11129
|
const primary = statuses[0];
|
|
10564
|
-
if (primary === void 0 || primary.state === "idle") return /* @__PURE__ */
|
|
10565
|
-
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", {
|
|
10566
11132
|
className: "wb-visuallyHidden",
|
|
10567
11133
|
key: status.label
|
|
10568
11134
|
}, status.label)));
|
|
10569
11135
|
}
|
|
10570
11136
|
function SessionHoverContent({ node, statuses, renderSlot, t }) {
|
|
10571
|
-
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", {
|
|
10572
11138
|
className: "wb-sessionHoverStatus",
|
|
10573
11139
|
key: status.label
|
|
10574
|
-
}, /* @__PURE__ */
|
|
11140
|
+
}, /* @__PURE__ */ createElement(StateDot, { state: status.state }), /* @__PURE__ */ createElement("span", null, status.label))));
|
|
10575
11141
|
}
|
|
10576
11142
|
function SessionRow({ node, active, onOpen, renderSlot, t }) {
|
|
10577
11143
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
@@ -10585,36 +11151,36 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
|
|
|
10585
11151
|
sessionId: node.id,
|
|
10586
11152
|
displayTitle: node.title
|
|
10587
11153
|
};
|
|
10588
|
-
return /* @__PURE__ */
|
|
10589
|
-
anchor: /* @__PURE__ */
|
|
11154
|
+
return /* @__PURE__ */ createElement(HoverCard, {
|
|
11155
|
+
anchor: /* @__PURE__ */ createElement("div", {
|
|
10590
11156
|
className: cx("wb-sessionRow", active && "wb-selected", menuOpen && "wb-menuOpen"),
|
|
10591
11157
|
role: "treeitem",
|
|
10592
11158
|
"aria-selected": active,
|
|
10593
11159
|
onClick: () => onOpen(node.id),
|
|
10594
11160
|
onPointerEnter: marquee.enter,
|
|
10595
11161
|
onPointerLeave: marquee.leave
|
|
10596
|
-
}, /* @__PURE__ */
|
|
11162
|
+
}, /* @__PURE__ */ createElement("span", { className: "wb-sessionLeading" }, /* @__PURE__ */ createElement(SessionLeading, {
|
|
10597
11163
|
node,
|
|
10598
11164
|
statuses,
|
|
10599
11165
|
renderSlot
|
|
10600
|
-
})), /* @__PURE__ */
|
|
11166
|
+
})), /* @__PURE__ */ createElement("span", {
|
|
10601
11167
|
className: "wb-sessionTitle",
|
|
10602
11168
|
ref: titleRef
|
|
10603
|
-
}, label), node.blank ? null : /* @__PURE__ */
|
|
11169
|
+
}, label), node.blank ? null : /* @__PURE__ */ createElement("span", {
|
|
10604
11170
|
className: "wb-sessionTime",
|
|
10605
11171
|
"aria-hidden": trailing === void 0 ? void 0 : true
|
|
10606
|
-
}, 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", {
|
|
10607
11173
|
className: "wb-sessionPin",
|
|
10608
11174
|
role: "img",
|
|
10609
11175
|
"aria-label": t("session.pinned")
|
|
10610
|
-
}, /* @__PURE__ */
|
|
11176
|
+
}, /* @__PURE__ */ createElement(IconPinFillRegular, { size: 14 }))) : null, node.blank ? null : /* @__PURE__ */ createElement("span", {
|
|
10611
11177
|
className: "wb-rowActions",
|
|
10612
11178
|
onClick: (event) => event.stopPropagation()
|
|
10613
|
-
}, /* @__PURE__ */
|
|
11179
|
+
}, /* @__PURE__ */ createElement(Menu, {
|
|
10614
11180
|
open: menuOpen,
|
|
10615
11181
|
portal: true,
|
|
10616
11182
|
closeOnPointerLeave: true,
|
|
10617
|
-
anchor: /* @__PURE__ */
|
|
11183
|
+
anchor: /* @__PURE__ */ createElement("button", {
|
|
10618
11184
|
type: "button",
|
|
10619
11185
|
className: "wb-iconButton",
|
|
10620
11186
|
"aria-haspopup": "menu",
|
|
@@ -10624,10 +11190,10 @@ function SessionRow({ node, active, onOpen, renderSlot, t }) {
|
|
|
10624
11190
|
event.stopPropagation();
|
|
10625
11191
|
setMenuOpen((value) => !value);
|
|
10626
11192
|
}
|
|
10627
|
-
}, /* @__PURE__ */
|
|
11193
|
+
}, /* @__PURE__ */ createElement(IconEllipsisOutlineRegular, { size: 16 })),
|
|
10628
11194
|
onClose: () => setMenuOpen(false)
|
|
10629
11195
|
}, renderSlot("sidebar.workspaces.session.menu.item", owner, { hookContext: menuState })), renderSlot("sidebar.workspaces.session.row.action", owner))),
|
|
10630
|
-
content: /* @__PURE__ */
|
|
11196
|
+
content: /* @__PURE__ */ createElement(SessionHoverContent, {
|
|
10631
11197
|
node,
|
|
10632
11198
|
statuses,
|
|
10633
11199
|
renderSlot,
|
|
@@ -10678,14 +11244,14 @@ function SessionList({ workspace, pinnedIds, archived, panelActive, longTasks, u
|
|
|
10678
11244
|
]);
|
|
10679
11245
|
const listRef = useRef(null);
|
|
10680
11246
|
const edges = useScrollEdges(listRef, rows);
|
|
10681
|
-
if (workspace === null) return /* @__PURE__ */
|
|
10682
|
-
if (rows.length === 0) return /* @__PURE__ */
|
|
10683
|
-
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", {
|
|
10684
11250
|
ref: listRef,
|
|
10685
11251
|
className: cx("wb-sessions", edges.canScrollUp && "wb-fadeTop", edges.canScrollDown && "wb-fadeBottom"),
|
|
10686
11252
|
role: "tree",
|
|
10687
11253
|
"aria-label": t("session.list.label")
|
|
10688
|
-
}, rows.map((row) => /* @__PURE__ */
|
|
11254
|
+
}, rows.map((row) => /* @__PURE__ */ createElement(SessionRow, {
|
|
10689
11255
|
key: row.id,
|
|
10690
11256
|
node: sessionNode(row, statusById, list, pinned, archivedSet, longTasks.bySession),
|
|
10691
11257
|
active: row.id === currentId,
|
|
@@ -10768,10 +11334,10 @@ function Sidebar(props) {
|
|
|
10768
11334
|
});
|
|
10769
11335
|
};
|
|
10770
11336
|
const wide = !collapsed;
|
|
10771
|
-
return /* @__PURE__ */
|
|
11337
|
+
return /* @__PURE__ */ createElement("div", {
|
|
10772
11338
|
className: cx("wb-root", collapsed && "wb-collapsed"),
|
|
10773
11339
|
"data-wb-where": board.path ?? void 0
|
|
10774
|
-
}, /* @__PURE__ */
|
|
11340
|
+
}, /* @__PURE__ */ createElement(SidebarHeader, {
|
|
10775
11341
|
collapsed,
|
|
10776
11342
|
wide,
|
|
10777
11343
|
attention: attention.overall,
|
|
@@ -10779,10 +11345,10 @@ function Sidebar(props) {
|
|
|
10779
11345
|
renderSlot,
|
|
10780
11346
|
onToggle: props.toggleSidebar,
|
|
10781
11347
|
onSelectPanel: props.selectPanel
|
|
10782
|
-
}), /* @__PURE__ */
|
|
11348
|
+
}), /* @__PURE__ */ createElement("nav", {
|
|
10783
11349
|
className: "wb-panelList",
|
|
10784
11350
|
"aria-label": t("panels.label")
|
|
10785
|
-
}, panelEntries.map((entry) => /* @__PURE__ */
|
|
11351
|
+
}, panelEntries.map((entry) => /* @__PURE__ */ createElement(PanelRow, {
|
|
10786
11352
|
key: entry.id,
|
|
10787
11353
|
id: entry.id,
|
|
10788
11354
|
label: panelLabel(entry),
|
|
@@ -10794,7 +11360,7 @@ function Sidebar(props) {
|
|
|
10794
11360
|
size: isWide ? 16 : 18,
|
|
10795
11361
|
active
|
|
10796
11362
|
}, { only: id })
|
|
10797
|
-
}))), wide ? /* @__PURE__ */
|
|
11363
|
+
}))), wide ? /* @__PURE__ */ createElement(Fragment, null, /* @__PURE__ */ createElement(ProjectSwitcher, {
|
|
10798
11364
|
items,
|
|
10799
11365
|
current,
|
|
10800
11366
|
attention,
|
|
@@ -10802,10 +11368,10 @@ function Sidebar(props) {
|
|
|
10802
11368
|
onAdd: addProject,
|
|
10803
11369
|
onRename: props.renameWorkspace,
|
|
10804
11370
|
t
|
|
10805
|
-
}), creating ? /* @__PURE__ */
|
|
11371
|
+
}), creating ? /* @__PURE__ */ createElement("p", {
|
|
10806
11372
|
className: "wb-workspaceBusy",
|
|
10807
11373
|
role: "status"
|
|
10808
|
-
}, /* @__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, {
|
|
10809
11375
|
items,
|
|
10810
11376
|
current,
|
|
10811
11377
|
attention,
|
|
@@ -10814,7 +11380,7 @@ function Sidebar(props) {
|
|
|
10814
11380
|
onAdd: addProject,
|
|
10815
11381
|
onRename: props.renameWorkspace,
|
|
10816
11382
|
t
|
|
10817
|
-
}), /* @__PURE__ */
|
|
11383
|
+
}), /* @__PURE__ */ createElement(WorkspaceSection, {
|
|
10818
11384
|
t,
|
|
10819
11385
|
wide,
|
|
10820
11386
|
onNewSession: () => {
|
|
@@ -10827,7 +11393,7 @@ function Sidebar(props) {
|
|
|
10827
11393
|
startSession
|
|
10828
11394
|
});
|
|
10829
11395
|
}
|
|
10830
|
-
}), /* @__PURE__ */
|
|
11396
|
+
}), /* @__PURE__ */ createElement("div", { className: "wb-regionArea" }, wide ? /* @__PURE__ */ createElement(SessionList, {
|
|
10831
11397
|
workspace: current,
|
|
10832
11398
|
pinnedIds,
|
|
10833
11399
|
archived,
|
|
@@ -10838,7 +11404,41 @@ function Sidebar(props) {
|
|
|
10838
11404
|
onOpen: props.openSession,
|
|
10839
11405
|
renderSlot,
|
|
10840
11406
|
t
|
|
10841
|
-
}) : 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")));
|
|
10842
11442
|
}
|
|
10843
11443
|
//#endregion
|
|
10844
11444
|
//#region src/shared/styles/rightbar.css?raw
|
|
@@ -11040,6 +11640,30 @@ function useBlockerActions(onRetry, onOpenMarket) {
|
|
|
11040
11640
|
failure
|
|
11041
11641
|
};
|
|
11042
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
|
+
}
|
|
11043
11667
|
var BlockerState_module_default = {
|
|
11044
11668
|
blocker: "_blocker_1oaj0_1",
|
|
11045
11669
|
icon: "_icon_1oaj0_10",
|
|
@@ -11077,7 +11701,7 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
|
|
|
11077
11701
|
const pending = blockerPending(busy, running);
|
|
11078
11702
|
const inlineActions = blocker.actions.filter((action) => action.kind === "open-url" && action.inline === true);
|
|
11079
11703
|
const buttonActions = blocker.actions.filter((action) => !(action.kind === "open-url" && action.inline === true) || blocker.hint === void 0);
|
|
11080
|
-
const buttons = buttonActions.map((action, index) => /* @__PURE__ */
|
|
11704
|
+
const buttons = buttonActions.map((action, index) => /* @__PURE__ */ createElement(Button, {
|
|
11081
11705
|
key: `${action.kind}:${action.label}`,
|
|
11082
11706
|
type: "button",
|
|
11083
11707
|
size: "sm",
|
|
@@ -11089,35 +11713,35 @@ function BlockerState({ blocker, t, onRetry, busy = false, flush = false, onOpen
|
|
|
11089
11713
|
running,
|
|
11090
11714
|
copied
|
|
11091
11715
|
}, t)));
|
|
11092
|
-
const failureBlock = failure === null ? null : /* @__PURE__ */
|
|
11093
|
-
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", {
|
|
11094
11718
|
className: `${BlockerState_module_default.notice}${flush ? ` ${BlockerState_module_default.noticeFlat}` : ""}`,
|
|
11095
11719
|
role: "status",
|
|
11096
11720
|
"aria-busy": pending
|
|
11097
|
-
}, /* @__PURE__ */
|
|
11098
|
-
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", {
|
|
11099
11723
|
className: `${BlockerState_module_default.blocker}${flush ? ` ${BlockerState_module_default.blockerInline}` : ""}`,
|
|
11100
11724
|
role: "status",
|
|
11101
11725
|
"aria-busy": pending
|
|
11102
|
-
}, flush ? null : /* @__PURE__ */
|
|
11726
|
+
}, flush ? null : /* @__PURE__ */ createElement("span", {
|
|
11103
11727
|
className: BlockerState_module_default.icon,
|
|
11104
11728
|
"aria-hidden": "true"
|
|
11105
|
-
}, /* @__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", {
|
|
11106
11730
|
key: `inline:${action.kind}:${action.label}`,
|
|
11107
11731
|
type: "button",
|
|
11108
11732
|
className: `wb-link ${BlockerState_module_default.inlineAction}`,
|
|
11109
11733
|
disabled: pending,
|
|
11110
11734
|
onClick: () => run(action)
|
|
11111
|
-
}, 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, {
|
|
11112
11736
|
className: BlockerState_module_default.raw,
|
|
11113
|
-
icon: /* @__PURE__ */
|
|
11737
|
+
icon: /* @__PURE__ */ createElement(IconInfoOutlineRegular, { size: 14 }),
|
|
11114
11738
|
title: t("env.fix.details"),
|
|
11115
11739
|
open: rawOpen,
|
|
11116
11740
|
expandable: true,
|
|
11117
11741
|
expandOnRowClick: true,
|
|
11118
11742
|
previewChevron: true,
|
|
11119
11743
|
onToggle: () => setRawOpen(!rawOpen)
|
|
11120
|
-
}, /* @__PURE__ */
|
|
11744
|
+
}, /* @__PURE__ */ createElement(CodeBlock, {
|
|
11121
11745
|
code: blocker.detail,
|
|
11122
11746
|
className: BlockerState_module_default.rawText,
|
|
11123
11747
|
copyLabel: t("blocker.copy"),
|
|
@@ -11181,6 +11805,7 @@ var kit = {
|
|
|
11181
11805
|
api: {
|
|
11182
11806
|
apiGet,
|
|
11183
11807
|
apiPost,
|
|
11808
|
+
factOfRoute,
|
|
11184
11809
|
...context_chips_exports
|
|
11185
11810
|
},
|
|
11186
11811
|
lib: {
|
|
@@ -11221,7 +11846,7 @@ function messagesOf(units) {
|
|
|
11221
11846
|
...face.messages === void 0 ? {} : { messages: face.messages }
|
|
11222
11847
|
}));
|
|
11223
11848
|
}
|
|
11224
|
-
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_csyus_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_csyus_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_csyus_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_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_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_csyus_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_csyus_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_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_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_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_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_csyus_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_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_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_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_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_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\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_csyus_186 {\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_csyus_193 {\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_csyus_201 {\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_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\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_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\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_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\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_csyus_250 {\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_csyus_259 {\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_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\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_csyus_208 {\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_csyus_309 {\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_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_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*/";
|
|
11225
11850
|
function workbenchCss() {
|
|
11226
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}`;
|
|
11227
11852
|
}
|
|
@@ -11383,37 +12008,77 @@ function mount(ctx) {
|
|
|
11383
12008
|
ctx.effect(() => () => borrow.dispose(), "dsh-workbench: 官方椅面订阅与借道");
|
|
11384
12009
|
borrow.start();
|
|
11385
12010
|
if (store.getSnapshot().column === "workbench") armWorkbenchColumn();
|
|
11386
|
-
|
|
11387
|
-
|
|
11388
|
-
|
|
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,
|
|
11389
12048
|
locale: LOCALE_NS,
|
|
11390
|
-
|
|
11391
|
-
|
|
11392
|
-
|
|
11393
|
-
|
|
11394
|
-
|
|
11395
|
-
|
|
11396
|
-
|
|
11397
|
-
|
|
11398
|
-
|
|
11399
|
-
|
|
11400
|
-
|
|
11401
|
-
|
|
11402
|
-
|
|
11403
|
-
|
|
11404
|
-
|
|
11405
|
-
|
|
11406
|
-
|
|
11407
|
-
|
|
11408
|
-
|
|
11409
|
-
|
|
11410
|
-
|
|
11411
|
-
})
|
|
11412
|
-
|
|
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: 官方左栏选中的项目就是右栏的项目");
|
|
11413
12078
|
registerMarketPanel(ctx, units);
|
|
11414
12079
|
registerDebugFooter(ctx);
|
|
11415
12080
|
registerRecordFooter(ctx);
|
|
11416
|
-
|
|
12081
|
+
registerWorkbenchSettingsSection(ctx);
|
|
11417
12082
|
ctx.effect(() => {
|
|
11418
12083
|
const workshop = workshopWorkspace();
|
|
11419
12084
|
if (workshop === void 0) return;
|
|
@@ -11443,16 +12108,16 @@ function mount(ctx) {
|
|
|
11443
12108
|
})
|
|
11444
12109
|
}, ColumnSwitch));
|
|
11445
12110
|
}
|
|
11446
|
-
var
|
|
11447
|
-
function
|
|
12111
|
+
var WORKBENCH_SETTINGS_SECTION_ID = "workbench-settings";
|
|
12112
|
+
function registerWorkbenchSettingsSection(ctx) {
|
|
11448
12113
|
ctx.slots.inject("settings.section", () => ctx.slots.register({
|
|
11449
12114
|
name: "settings.section",
|
|
11450
|
-
id:
|
|
12115
|
+
id: WORKBENCH_SETTINGS_SECTION_ID,
|
|
11451
12116
|
order: 40,
|
|
11452
12117
|
locale: LOCALE_NS,
|
|
11453
|
-
label: () => ctx.locale.bind(LOCALE_NS)("
|
|
12118
|
+
label: () => ctx.locale.bind(LOCALE_NS)("workbenchSettings.nav"),
|
|
11454
12119
|
inject: () => ({ t: ctx.locale.bind(LOCALE_NS) })
|
|
11455
|
-
},
|
|
12120
|
+
}, WorkbenchSettingsSection));
|
|
11456
12121
|
}
|
|
11457
12122
|
function sidebarChildren(ctx) {
|
|
11458
12123
|
return {
|