@dsh-workbench/core 0.1.8 → 0.1.10

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.
Files changed (37) hide show
  1. package/client.js +983 -391
  2. package/dist/client/client.body.js +983 -391
  3. package/dist/client/index.js +984 -392
  4. package/dist/host/index.js +366 -106
  5. package/dist/types/app/client.d.ts +140 -12
  6. package/dist/types/app/layouts/env-gate/__tests__/gate-deadline.test.d.ts +1 -0
  7. package/dist/types/app/layouts/env-gate/gate-deadline.d.ts +4 -0
  8. package/dist/types/app/layouts/rightbar/MarketStates.d.ts +7 -0
  9. package/dist/types/app/layouts/rightbar/MarketView.d.ts +2 -1
  10. package/dist/types/app/layouts/rightbar/SharedSection.d.ts +11 -0
  11. package/dist/types/app/layouts/rightbar/__tests__/market-change.test.d.ts +1 -0
  12. package/dist/types/app/layouts/rightbar/__tests__/market-live.test.d.ts +1 -0
  13. package/dist/types/app/layouts/rightbar/__tests__/market-settle.test.d.ts +1 -0
  14. package/dist/types/app/layouts/rightbar/board-plan.d.ts +2 -0
  15. package/dist/types/app/layouts/rightbar/market-change.d.ts +4 -0
  16. package/dist/types/app/layouts/rightbar/market-rows.d.ts +3 -1
  17. package/dist/types/app/layouts/rightbar/market-settle.d.ts +2 -0
  18. package/dist/types/app/layouts/rightbar/market-view-text.d.ts +10 -0
  19. package/dist/types/app/layouts/sidebar/ProjectSwitcher.d.ts +2 -2
  20. package/dist/types/app/layouts/sidebar/Sidebar.d.ts +1 -1
  21. package/dist/types/app/layouts/sidebar/WorkspaceRenameDialog.d.ts +8 -0
  22. package/dist/types/app/layouts/sidebar/WorkspaceRowAction.d.ts +7 -0
  23. package/dist/types/app/layouts/sidebar/WorkspaceRowLabel.d.ts +8 -0
  24. package/dist/types/app/layouts/sidebar/WorkspaceSearchField.d.ts +9 -0
  25. package/dist/types/app/layouts/sidebar/__tests__/workspace-name.test.d.ts +1 -0
  26. package/dist/types/app/layouts/sidebar/workspace-items.d.ts +11 -0
  27. package/dist/types/app/layouts/sidebar/workspace-name.d.ts +16 -0
  28. package/dist/types/app/units/__tests__/registry.test.d.ts +1 -0
  29. package/dist/types/app/units/fixture-unit-mock.d.ts +3 -1
  30. package/dist/types/modules/panels/__tests__/market-registries.test.d.ts +1 -0
  31. package/dist/types/modules/panels/model/market.d.ts +2 -0
  32. package/dist/types/shared/api/host/__tests__/profile-registries.test.d.ts +1 -0
  33. package/dist/types/shared/api/host/mount-units.d.ts +13 -6
  34. package/dist/types/shared/api/host/profile-registries.d.ts +21 -0
  35. package/dist/types/shared/hooks/mock-mode.d.ts +1 -0
  36. package/docs/OPERATIONS.md +2 -0
  37. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- import { Button, CodeBlock, DisclosureRow, IconCheckCircleFillRegular, IconChevronDownOutlineRegular, IconCodeOutlineRegular, IconEllipsisOutlineRegular, IconFlatListOutlineRegular, IconFolderCloseRegular, IconFolderOpenRegular, IconInfoOutlineRegular, IconNewChatOutlineRegular, IconPanelLeftOutlineRegular, IconPinOutlineRegular, IconPlusOutlineRegular, IconRefreshOutlineRegular, IconRightUpOutlineRegular, IconSettingsOutlineRegular, IconTrashOutlineRegular, IconWarningOutlineRegular, Menu, Modal, RiskConfirmation, StateDot, Switch, Tag, TextShimmer, Tooltip, useAnchoredPosition, useDismissOnOutsidePointer, writeClipboard } from "@deepseek-ai/dsh-client-ui-primitives";
1
+ import { Button, CodeBlock, DisclosureRow, IconCheckCircleFillRegular, IconCheckOutlineRegular, IconChevronDownOutlineRegular, IconCodeOutlineRegular, IconEditOutlineRegular, IconEllipsisOutlineRegular, IconFlatListOutlineRegular, IconFolderCloseRegular, IconFolderOpenRegular, IconInfoOutlineRegular, IconNewChatOutlineRegular, IconPanelLeftOutlineRegular, IconPinOutlineRegular, IconPlusOutlineRegular, IconRefreshOutlineRegular, IconRightUpOutlineRegular, IconSearchOutlineRegular, IconSettingsOutlineRegular, IconTrashOutlineRegular, IconWarningOutlineRegular, Menu, Modal, RiskConfirmation, StateDot, Switch, Tag, TextShimmer, Tooltip, useAnchoredPosition, useDismissOnOutsidePointer, writeClipboard } from "@deepseek-ai/dsh-client-ui-primitives";
2
2
  //#region \0rolldown/runtime.js
3
3
  var __defProp = Object.defineProperty;
4
4
  var __exportAll = (all, no_symbols) => {
@@ -142,6 +142,14 @@ function blockerOfCapability(capability, t) {
142
142
  }] : [],
143
143
  ...capability.command === void 0 || sourceUnknown ? [] : [copyAction(t, capability.command)]
144
144
  ];
145
+ if (capability.status === "failed") return {
146
+ id: "unit-mount-failed",
147
+ severity: "block",
148
+ title: t("env.unit.failed"),
149
+ hint: t("env.unit.failedHint"),
150
+ ...capability.detail === void 0 ? {} : { detail: capability.detail },
151
+ actions: [retryAction(t)]
152
+ };
145
153
  if (capability.status === "missing-plugin") return {
146
154
  id: "unit-missing-plugin",
147
155
  severity: "block",
@@ -478,6 +486,7 @@ async function apiPost(route, body) {
478
486
  var react = __require("react");
479
487
  var h = react.createElement;
480
488
  var Fragment = react.Fragment;
489
+ var Component = react.Component;
481
490
  var useState = react.useState;
482
491
  var useEffect = react.useEffect;
483
492
  var useLayoutEffect = react.useLayoutEffect;
@@ -520,6 +529,46 @@ function ActivityAction({ label, hint, icon, href, onClick, failed }) {
520
529
  }));
521
530
  }
522
531
  //#endregion
532
+ //#region ../shared/dist/components/Note.js
533
+ function Note({ tone = "muted", as, children }) {
534
+ const className = tone === "problem" ? "wb-problem" : "wb-note";
535
+ return as === "span" ? h("span", { className }, children) : h("p", { className }, children);
536
+ }
537
+ //#endregion
538
+ //#region ../shared/dist/components/CardBoundary.js
539
+ function errorReasonOf(error) {
540
+ if (error instanceof Error) return error.message;
541
+ return typeof error === "string" ? error : JSON.stringify(error) ?? String(error);
542
+ }
543
+ var CardBoundary = class extends Component {
544
+ state = { reason: null };
545
+ static getDerivedStateFromError(error) {
546
+ return { reason: errorReasonOf(error) };
547
+ }
548
+ componentDidCatch(error) {
549
+ console.error(`[dsh-workbench] 模块 ${this.props.unit} 渲染失败:${errorReasonOf(error)}`, error);
550
+ }
551
+ componentDidUpdate(previous) {
552
+ if (previous.resetKey !== this.props.resetKey && this.state.reason !== null) this.setState({ reason: null });
553
+ }
554
+ retry = () => {
555
+ this.setState({ reason: null });
556
+ };
557
+ render() {
558
+ const { reason } = this.state;
559
+ if (reason === null) return this.props.children;
560
+ return h(Note, { tone: "problem" }, h("span", null, this.props.t("panels.cardBroken", {
561
+ unit: this.props.unit,
562
+ reason
563
+ })), " ", h(Button, {
564
+ type: "button",
565
+ variant: "outline",
566
+ size: "sm",
567
+ onClick: this.retry
568
+ }, this.props.t("panels.cardRetry")));
569
+ }
570
+ };
571
+ //#endregion
523
572
  //#region ../shared/dist/components/ApprovalDetail.js
524
573
  function callOf(snapshot, callId) {
525
574
  if (callId === void 0) return void 0;
@@ -550,10 +599,17 @@ function ApprovalDetail(props) {
550
599
  };
551
600
  const command = typeof args.command === "string" ? args.command : "";
552
601
  const owner = (props.units ?? []).find((face) => face.approval?.tools.includes(input.tool) === true);
553
- if (owner?.approval !== void 0) return h(owner.approval.render, {
554
- input,
555
- t
556
- });
602
+ if (owner?.approval !== void 0) {
603
+ const Render = owner.approval.render;
604
+ return h(CardBoundary, {
605
+ unit: owner.manifest.id,
606
+ resetKey: props.callId ?? "",
607
+ t
608
+ }, h(Render, {
609
+ input,
610
+ t
611
+ }));
612
+ }
557
613
  if (command === "") return null;
558
614
  return h(CodeBlock, {
559
615
  code: command,
@@ -716,12 +772,6 @@ function MockStrip({ mocks, index, onPick, note, real }) {
716
772
  }, mock.label)));
717
773
  }
718
774
  //#endregion
719
- //#region ../shared/dist/components/Note.js
720
- function Note({ tone = "muted", as, children }) {
721
- const className = tone === "problem" ? "wb-problem" : "wb-note";
722
- return as === "span" ? h("span", { className }, children) : h("p", { className }, children);
723
- }
724
- //#endregion
725
775
  //#region ../shared/dist/components/ResourceStates.js
726
776
  function SkeletonRows({ rows = 4 }) {
727
777
  return h("div", {
@@ -932,6 +982,20 @@ var en = {
932
982
  "project.none": "No project",
933
983
  "project.empty": "No projects yet. Use “Add project” below.",
934
984
  "project.add": "Add project…",
985
+ "project.search.label": "Search workspaces",
986
+ "project.search.placeholder": "Search workspaces (folder / name / path)",
987
+ "project.search.empty": "No workspace matches “{query}”.",
988
+ "project.rename.row": "Rename “{name}”",
989
+ "project.rename.current": "Give this workspace a display name…",
990
+ "project.rename.title": "Give “{name}” a display name",
991
+ "project.rename.description": "Shown after the folder name. It renames the workspace itself.",
992
+ "project.rename.field": "Display name",
993
+ "project.rename.placeholder": "e.g. Workbench shell",
994
+ "project.rename.hint": "Empty = folder name only",
995
+ "project.rename.save": "Save",
996
+ "project.rename.saving": "Saving…",
997
+ "project.rename.cancel": "Cancel",
998
+ "project.rename.failed": "Rename failed. Try again.",
935
999
  "session.new": "New session",
936
1000
  "session.new.label": "Start a session in the current project",
937
1001
  "session.empty": "No sessions in this project yet.",
@@ -960,6 +1024,7 @@ var en = {
960
1024
  "panels.dragHint": "Drag to reorder",
961
1025
  "panels.unknownStep": "No suite provides this view",
962
1026
  "panels.labelWithHint": "{label} ({hint})",
1027
+ "panels.dep.failed": "⚠ failed to start",
963
1028
  "panels.dep.missingPlugin": "⚠ not ready yet",
964
1029
  "panels.dep.missingCommands": "⚠ needs an update",
965
1030
  "panels.dep.unchecked": "⚠ cannot check",
@@ -1004,7 +1069,7 @@ var en = {
1004
1069
  "panels.market.empty": "No modules available",
1005
1070
  "panels.market.installedSection": "Installed",
1006
1071
  "panels.market.moduleOutdated": "update available",
1007
- "panels.market.moduleRestartHint": "it may need a restart after installing",
1072
+ "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1008
1073
  "panels.market.restartNeeded": "The new version is installed — restart once to pick it up.",
1009
1074
  "panels.market.foot": "After installing, enable it in the panel page of that project.",
1010
1075
  "panels.market.recheck": "Check for updates",
@@ -1153,6 +1218,8 @@ var en = {
1153
1218
  "blocker.exec.hint": "Make sure opencli is installed and on PATH (which opencli).",
1154
1219
  "blocker.unknown.title": "Something went wrong",
1155
1220
  "panels.reading": "Reading the panel setup…",
1221
+ "panels.cardBroken": "This module will not render: {unit} ({reason})",
1222
+ "panels.cardRetry": "Retry",
1156
1223
  "panels.empty": "No modules on the panel yet",
1157
1224
  "panels.emptyHint": "You can also just tell the agent: “add a module to the panel”.",
1158
1225
  "env.title": "Preparing the workbench",
@@ -1191,6 +1258,8 @@ var en = {
1191
1258
  "env.step.warm": "Warming up site sessions",
1192
1259
  "env.warm.done": "{n} site(s) warmed up",
1193
1260
  "env.warm.short": "Not warmed this time — harmless; the panel heals on first read",
1261
+ "env.unit.failed": "This module cannot start",
1262
+ "env.unit.failedHint": "It failed while assembling itself; other modules are unaffected.",
1194
1263
  "env.unit.missingPlugin": "This module is not ready yet",
1195
1264
  "env.unit.missingCommandsHint": "Updating it should fix this.",
1196
1265
  "env.unit.unchecked": "Cannot check: no shell channel",
@@ -1224,6 +1293,20 @@ var zh = {
1224
1293
  "project.none": "未选择项目",
1225
1294
  "project.empty": "还没有项目。用下面的「添加项目」选一个目录。",
1226
1295
  "project.add": "添加项目…",
1296
+ "project.search.label": "搜索工作区",
1297
+ "project.search.placeholder": "搜索工作区(目录名 / 中文名 / 路径)",
1298
+ "project.search.empty": "没有匹配「{query}」的工作区。",
1299
+ "project.rename.row": "改「{name}」的中文名",
1300
+ "project.rename.current": "改当前工作区的中文名…",
1301
+ "project.rename.title": "给「{name}」配一个中文名",
1302
+ "project.rename.description": "显示在目录名后面。改的是工作区本身的名字。",
1303
+ "project.rename.field": "中文名",
1304
+ "project.rename.placeholder": "例如:工作台外壳",
1305
+ "project.rename.hint": "留空 = 只显示目录名",
1306
+ "project.rename.save": "保存",
1307
+ "project.rename.saving": "保存中…",
1308
+ "project.rename.cancel": "取消",
1309
+ "project.rename.failed": "改名失败了,再试一次。",
1227
1310
  "session.new": "新会话",
1228
1311
  "session.new.label": "在当前项目新建会话",
1229
1312
  "session.empty": "这个项目还没有会话。",
@@ -1252,6 +1335,7 @@ var zh = {
1252
1335
  "panels.dragHint": "拖动调整顺序",
1253
1336
  "panels.unknownStep": "这一层没有套件提供",
1254
1337
  "panels.labelWithHint": "{label}({hint})",
1338
+ "panels.dep.failed": "⚠ 起不来",
1255
1339
  "panels.dep.missingPlugin": "⚠ 还没装好",
1256
1340
  "panels.dep.missingCommands": "⚠ 需要更新",
1257
1341
  "panels.dep.unchecked": "⚠ 检测不了",
@@ -1296,7 +1380,7 @@ var zh = {
1296
1380
  "panels.market.empty": "暂无可用模块",
1297
1381
  "panels.market.installedSection": "已装",
1298
1382
  "panels.market.moduleOutdated": "有新版",
1299
- "panels.market.moduleRestartHint": "安装完成后可能需要重启才生效",
1383
+ "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1300
1384
  "panels.market.restartNeeded": "新版装好了,重启一次才生效。",
1301
1385
  "panels.market.foot": "装好后到那个项目的面板页勾选它,模块才会出现。",
1302
1386
  "panels.market.recheck": "重新检查更新",
@@ -1445,6 +1529,8 @@ var zh = {
1445
1529
  "blocker.exec.hint": "确认 opencli 已安装且在 PATH 里(which opencli)。",
1446
1530
  "blocker.unknown.title": "出了点问题",
1447
1531
  "panels.reading": "正在读取面板配置…",
1532
+ "panels.cardBroken": "这个模块起不来:{unit}({reason})",
1533
+ "panels.cardRetry": "重试",
1448
1534
  "panels.empty": "面板里还没有模块",
1449
1535
  "panels.emptyHint": "也可以直接跟 agent 说:「把某个模块加到面板」。",
1450
1536
  "env.title": "准备工作台",
@@ -1483,6 +1569,8 @@ var zh = {
1483
1569
  "env.step.warm": "预热站点登录态",
1484
1570
  "env.warm.done": "已预热 {n} 个站点",
1485
1571
  "env.warm.short": "这次没热上 —— 不影响用,面板第一次读取会自己补",
1572
+ "env.unit.failed": "这个模块起不来",
1573
+ "env.unit.failedHint": "它自己装配时报了错,别的模块不受影响。",
1486
1574
  "env.unit.missingPlugin": "这个模块还没装好",
1487
1575
  "env.unit.missingCommandsHint": "更新之后就能用了。",
1488
1576
  "env.unit.unchecked": "检测不了:拿不到执行通道",
@@ -1541,6 +1629,31 @@ function mergeMessages(base, contributions) {
1541
1629
  en
1542
1630
  };
1543
1631
  }
1632
+ function reasonOf(error) {
1633
+ if (error instanceof Error) return error.message;
1634
+ return typeof error === "string" ? error : String(error);
1635
+ }
1636
+ function mergeMessagesSkipping(base, contributions) {
1637
+ let dictionaries = base;
1638
+ const accepted = [];
1639
+ const problems = [];
1640
+ for (const item of contributions) {
1641
+ if (item.messages === void 0) continue;
1642
+ try {
1643
+ dictionaries = mergeMessages(base, [...accepted, item]);
1644
+ accepted.push(item);
1645
+ } catch (error) {
1646
+ problems.push({
1647
+ unit: item.unit,
1648
+ reason: reasonOf(error)
1649
+ });
1650
+ }
1651
+ }
1652
+ return {
1653
+ dictionaries,
1654
+ problems
1655
+ };
1656
+ }
1544
1657
  //#endregion
1545
1658
  //#region ../shared/dist/lib/blocker-action.js
1546
1659
  function blockerPending(busy, running) {
@@ -1616,9 +1729,11 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1616
1729
  CODING_ISSUES_SERVICE: () => CODING_ISSUES_SERVICE,
1617
1730
  CONTEXT_MARKER_NAME: () => CONTEXT_MARKER_NAME,
1618
1731
  Card: () => Card,
1732
+ CardBoundary: () => CardBoundary,
1619
1733
  CardHead: () => CardHead,
1620
1734
  CenteredState: () => CenteredState,
1621
1735
  ChoiceGroup: () => ChoiceGroup,
1736
+ Component: () => Component,
1622
1737
  DEFAULT_WORKSPACE_TITLE: () => DEFAULT_WORKSPACE_TITLE,
1623
1738
  EVENTS_PATH: () => EVENTS_PATH,
1624
1739
  EmptyState: () => EmptyState,
@@ -1678,6 +1793,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1678
1793
  dictionaries: () => dictionaries,
1679
1794
  en: () => en,
1680
1795
  encodeRef: () => encodeRef,
1796
+ errorReasonOf: () => errorReasonOf,
1681
1797
  excerpt: () => excerpt,
1682
1798
  factOfRoute: () => factOfRoute,
1683
1799
  gateOf: () => gateOf,
@@ -1689,6 +1805,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
1689
1805
  longTaskRunsOf: () => longTaskRunsOf,
1690
1806
  markerBody: () => markerBody,
1691
1807
  mergeMessages: () => mergeMessages,
1808
+ mergeMessagesSkipping: () => mergeMessagesSkipping,
1692
1809
  parseFactFrame: () => parseFactFrame,
1693
1810
  parseJsonLoose: () => parseJsonLoose,
1694
1811
  parseLocalTimestamp: () => parseLocalTimestamp,
@@ -1848,10 +1965,10 @@ function setProbe(next) {
1848
1965
  }
1849
1966
  var CAPABILITY_FACT = "capability";
1850
1967
  var shared = null;
1851
- var current = null;
1968
+ var current$1 = null;
1852
1969
  var listeners$2 = /* @__PURE__ */ new Set();
1853
1970
  function capabilityValue() {
1854
- return current;
1971
+ return current$1;
1855
1972
  }
1856
1973
  function subscribeCapabilities(listener) {
1857
1974
  listeners$2.add(listener);
@@ -1865,8 +1982,8 @@ function setCapabilities(next, rechecked = false) {
1865
1982
  ...probe$2,
1866
1983
  checkedAt: Date.now()
1867
1984
  });
1868
- if (next === current) return;
1869
- current = next;
1985
+ if (next === current$1) return;
1986
+ current$1 = next;
1870
1987
  for (const listener of [...listeners$2]) listener();
1871
1988
  }
1872
1989
  function beginProbe() {
@@ -1975,10 +2092,16 @@ function useCapabilityMap(refreshToken) {
1975
2092
  }
1976
2093
  //#endregion
1977
2094
  //#region src/shared/hooks/mock-mode.ts
1978
- var mock_mode_exports = /* @__PURE__ */ __exportAll({ mockModeOn: () => mockModeOn });
2095
+ var mock_mode_exports = /* @__PURE__ */ __exportAll({
2096
+ crashModeOn: () => crashModeOn,
2097
+ mockModeOn: () => mockModeOn
2098
+ });
1979
2099
  function mockModeOn(search) {
1980
2100
  return /(?:^|[?&])(?:wbMock|wbMarketMock)=1(?:&|$)/.test(search);
1981
2101
  }
2102
+ function crashModeOn(search) {
2103
+ return /(?:^|[?&])wbCrash=1(?:&|$)/.test(search);
2104
+ }
1982
2105
  //#endregion
1983
2106
  //#region src/shared/hooks/use-fixture-pick.ts
1984
2107
  var use_fixture_pick_exports = /* @__PURE__ */ __exportAll({ useFixturePick: () => useFixturePick });
@@ -2040,6 +2163,14 @@ function shouldProbeOnEnter(input) {
2040
2163
  return input.now - input.checkedAt >= input.staleMs;
2041
2164
  }
2042
2165
  //#endregion
2166
+ //#region src/app/layouts/rightbar/market-settle.ts
2167
+ var MODULE_SETTLE_MS = 15e3;
2168
+ function holdBack(installed, roster, active, previous) {
2169
+ const pending = installed.filter((unit) => !roster.has(unit));
2170
+ const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
2171
+ return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
2172
+ }
2173
+ //#endregion
2043
2174
  //#region src/app/layouts/rightbar/market-mock.ts
2044
2175
  function installable(manifest) {
2045
2176
  return {
@@ -2564,7 +2695,11 @@ function createClientUnitRegistry() {
2564
2695
  let manifestsCache;
2565
2696
  function notify() {
2566
2697
  revision += 1;
2567
- for (const listener of listeners) listener();
2698
+ for (const listener of [...listeners]) try {
2699
+ listener();
2700
+ } catch (error) {
2701
+ console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
2702
+ }
2568
2703
  }
2569
2704
  return {
2570
2705
  register(face) {
@@ -2599,6 +2734,7 @@ function createClientUnitRegistry() {
2599
2734
  //#endregion
2600
2735
  //#region src/app/units/fixture-unit-mock.tsx
2601
2736
  var FIXTURE_UNIT_ID = "wb-fixture";
2737
+ var CRASH_UNIT_ID = "wb-fixture-crash";
2602
2738
  var KEY = {
2603
2739
  cardTitle: `${FIXTURE_UNIT_ID}.cardTitle`,
2604
2740
  cardMeta: `${FIXTURE_UNIT_ID}.cardMeta`,
@@ -2652,6 +2788,39 @@ var FIXTURE_FACE = {
2652
2788
  messages,
2653
2789
  card: FixtureCard
2654
2790
  };
2791
+ var CRASH_KEY = {
2792
+ cardTitle: `${CRASH_UNIT_ID}.cardTitle`,
2793
+ cardMeta: `${CRASH_UNIT_ID}.cardMeta`
2794
+ };
2795
+ var crashMessages = {
2796
+ zh: {
2797
+ [CRASH_KEY.cardTitle]: "崩溃的卡片",
2798
+ [CRASH_KEY.cardMeta]: "夹具:渲染时抛错"
2799
+ },
2800
+ en: {
2801
+ [CRASH_KEY.cardTitle]: "Crashing card",
2802
+ [CRASH_KEY.cardMeta]: "Fixture: throws while rendering"
2803
+ }
2804
+ };
2805
+ var crashManifest = {
2806
+ id: CRASH_UNIT_ID,
2807
+ kind: "board",
2808
+ card: {
2809
+ titleKey: CRASH_KEY.cardTitle,
2810
+ order: 899,
2811
+ enabledByDefault: true
2812
+ },
2813
+ tools: [],
2814
+ host: { inject: [] }
2815
+ };
2816
+ function CrashingCard() {
2817
+ throw new Error("夹具:这张卡片按 wbCrash=1 故意渲染失败(守「一张卡片崩溃不带走面板」)");
2818
+ }
2819
+ var CRASH_FACE = {
2820
+ manifest: crashManifest,
2821
+ messages: crashMessages,
2822
+ card: CrashingCard
2823
+ };
2655
2824
  var SAMPLE_ROSTER = [manifest];
2656
2825
  function hasCard(roster) {
2657
2826
  return roster.some((item) => item.card !== null);
@@ -2659,8 +2828,9 @@ function hasCard(roster) {
2659
2828
  function fixtureRoster(roster) {
2660
2829
  return hasCard(roster) ? roster : SAMPLE_ROSTER;
2661
2830
  }
2662
- function fixtureSeed(roster, all) {
2663
- return hasCard(roster) ? all : [toBoardModule(FIXTURE_FACE)];
2831
+ function fixtureSeed(roster, all, crash = false) {
2832
+ const base = hasCard(roster) ? all : [toBoardModule(FIXTURE_FACE)];
2833
+ return crash ? [toBoardModule(CRASH_FACE), ...base] : base;
2664
2834
  }
2665
2835
  //#endregion
2666
2836
  //#region src/app/layouts/rightbar/market-rows.ts
@@ -2680,7 +2850,17 @@ var MARKET_DOT = {
2680
2850
  unchecked: "idle",
2681
2851
  unknown: "idle"
2682
2852
  };
2683
- function installedRows(modules, manifests, listed) {
2853
+ function mergeTitles(known, manifests) {
2854
+ let next = null;
2855
+ for (const manifest of manifests) {
2856
+ const titleKey = manifest.card?.titleKey;
2857
+ if (titleKey === void 0 || known.has(manifest.id)) continue;
2858
+ next ??= new Map(known);
2859
+ next.set(manifest.id, titleKey);
2860
+ }
2861
+ return next ?? known;
2862
+ }
2863
+ function installedRows(modules, manifests, listed, known) {
2684
2864
  const titles = new Map(manifests.map((manifest) => [manifest.id, manifest.card?.titleKey]));
2685
2865
  const rows = [];
2686
2866
  for (const module of modules) {
@@ -2689,8 +2869,9 @@ function installedRows(modules, manifests, listed) {
2689
2869
  const outdated = latest !== void 0 && latest !== module.installed;
2690
2870
  rows.push({
2691
2871
  id: module.unit,
2692
- titleKey: titles.get(module.unit) ?? module.pkg,
2872
+ titleKey: titles.get(module.unit) ?? known?.get(module.unit) ?? module.pkg,
2693
2873
  state: outdated ? "outdated" : "installed",
2874
+ hint: "panels.market.moduleRestartHint",
2694
2875
  pkg: module.pkg,
2695
2876
  canInstall: false,
2696
2877
  canUpdate: outdated,
@@ -2749,6 +2930,12 @@ function noteOf(state, install, manifest) {
2749
2930
  function isOnMachine(state) {
2750
2931
  return state === "installed" || state === "outdated";
2751
2932
  }
2933
+ function liveManifests(manifests, capabilities, installed) {
2934
+ if (capabilities === null || installed === null) return manifests;
2935
+ const gone = new Set(marketRows(manifests, capabilities).filter((row) => !installed.has(row.id) && marketActions$1(row).length === 0 && (row.state === "unknown" || row.state === "unchecked")).map((row) => row.id));
2936
+ if (gone.size === 0) return manifests;
2937
+ return manifests.filter((manifest) => !gone.has(manifest.id));
2938
+ }
2752
2939
  function marketHasUpdates(rows, shared = []) {
2753
2940
  return rows.some((row) => row.state === "outdated" || row.moduleUpdate !== void 0) || shared.some((row) => row.state === "outdated" || row.state === "unsatisfied");
2754
2941
  }
@@ -2878,6 +3065,7 @@ function sharedRows(manifests, capabilities) {
2878
3065
  ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
2879
3066
  ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
2880
3067
  };
3068
+ const detail = bucket.purpose === void 0 && bucket.command === void 0 ? void 0 : `${bucket.label}${bucket.purpose === void 0 ? "" : ` —— ${bucket.purpose}`}${bucket.command === void 0 ? "" : ` · ${bucket.command}`}`;
2881
3069
  rows.push({
2882
3070
  id: `${bucket.kind}:${bucket.name}`,
2883
3071
  label: bucket.label,
@@ -2885,7 +3073,7 @@ function sharedRows(manifests, capabilities) {
2885
3073
  state,
2886
3074
  canUpdate: state === "outdated" || state === "unsatisfied",
2887
3075
  ...version === void 0 ? {} : { version },
2888
- detail: `${bucket.label}${bucket.purpose === void 0 ? "" : ` —— ${bucket.purpose}`}${bucket.command === void 0 ? "" : ` · ${bucket.command}`}`
3076
+ ...detail === void 0 ? {} : { detail }
2889
3077
  });
2890
3078
  }
2891
3079
  return rows;
@@ -2942,15 +3130,188 @@ function useHostWrite(options) {
2942
3130
  clear
2943
3131
  };
2944
3132
  }
2945
- var PanelFoot_module_default = {
2946
- foot: "_foot_1us83_1",
2947
- footText: "_footText_1us83_12",
2948
- footTextMd: "_footTextMd_1us83_17"
3133
+ //#endregion
3134
+ //#region src/app/layouts/market/add-module-text.ts
3135
+ var GUIDE_ITEMS = [
3136
+ {
3137
+ titleKey: "panels.market.add.guideIdTitle",
3138
+ exampleKey: "panels.market.add.guideIdExample",
3139
+ hintKey: "panels.market.add.guideIdHint"
3140
+ },
3141
+ {
3142
+ titleKey: "panels.market.add.guideGitTitle",
3143
+ exampleKey: "panels.market.add.guideGitExample",
3144
+ hintKey: "panels.market.add.guideGitHint"
3145
+ },
3146
+ {
3147
+ titleKey: "panels.market.add.guidePathTitle",
3148
+ exampleKey: "panels.market.add.guidePathExample",
3149
+ hintKey: "panels.market.add.guidePathHint"
3150
+ }
3151
+ ];
3152
+ function hostOf(url) {
3153
+ try {
3154
+ return new URL(url).host;
3155
+ } catch {
3156
+ return url;
3157
+ }
3158
+ }
3159
+ var OFFICIAL_NPM_HOST = "registry.npmjs.org";
3160
+ var KNOWN_HOSTS = {
3161
+ [OFFICIAL_NPM_HOST]: "panels.market.add.registryOfficial",
3162
+ "registry.npmmirror.com": "panels.market.add.registryMirror"
3163
+ };
3164
+ function registryNameKey(host) {
3165
+ return KNOWN_HOSTS[host];
3166
+ }
3167
+ function normalizeRegistry(url) {
3168
+ const parsed = new URL(url);
3169
+ if (!parsed.pathname.endsWith("/")) parsed.pathname += "/";
3170
+ return parsed.href;
3171
+ }
3172
+ function registryKey(url, resolved) {
3173
+ const target = url ?? resolved;
3174
+ if (target === null) return "";
3175
+ try {
3176
+ return normalizeRegistry(target);
3177
+ } catch {
3178
+ return target;
3179
+ }
3180
+ }
3181
+ function registryOptions(registries) {
3182
+ const resolved = registries === null ? null : registries.resolved;
3183
+ const entries = [
3184
+ registries === null ? null : registries.registry,
3185
+ ...registries === null ? [] : registries.fallbackRegistries,
3186
+ null
3187
+ ];
3188
+ const offered = [];
3189
+ const keys = /* @__PURE__ */ new Set();
3190
+ for (const entry of entries) {
3191
+ const key = registryKey(entry, resolved);
3192
+ if (keys.has(key)) continue;
3193
+ keys.add(key);
3194
+ const url = entry ?? resolved;
3195
+ if (url === null) {
3196
+ offered.push({
3197
+ choice: {
3198
+ kind: "default",
3199
+ value: ""
3200
+ },
3201
+ host: OFFICIAL_NPM_HOST,
3202
+ nameKey: "panels.market.add.registryDefault"
3203
+ });
3204
+ continue;
3205
+ }
3206
+ const host = hostOf(url);
3207
+ const nameKey = registryNameKey(host);
3208
+ offered.push({
3209
+ choice: entry === null ? {
3210
+ kind: "default",
3211
+ value: ""
3212
+ } : {
3213
+ kind: "url",
3214
+ value: entry
3215
+ },
3216
+ host,
3217
+ ...nameKey === void 0 ? {} : { nameKey }
3218
+ });
3219
+ }
3220
+ offered.push({ choice: {
3221
+ kind: "custom",
3222
+ value: ""
3223
+ } });
3224
+ return offered;
3225
+ }
3226
+ function customRegistryAllowed(value) {
3227
+ return /^https?:\/\//.test(value.trim());
3228
+ }
3229
+ function registryOf(choice, custom) {
3230
+ if (choice.kind === "custom") return customRegistryAllowed(custom) ? custom.trim() : void 0;
3231
+ return choice.value === "" ? void 0 : choice.value;
3232
+ }
3233
+ function registryName(option, t) {
3234
+ if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3235
+ if (option.nameKey !== void 0) return t(option.nameKey);
3236
+ return option.host ?? t("panels.market.add.registryDefault");
3237
+ }
3238
+ function optionLabel(option, t) {
3239
+ if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3240
+ if (option.host === void 0) return t("panels.market.add.registryDefault");
3241
+ return option.nameKey === void 0 ? option.host : t("panels.market.add.registryWithHost", {
3242
+ name: t(option.nameKey),
3243
+ host: option.host
3244
+ });
3245
+ }
3246
+ var PROBLEM_KEYS = {
3247
+ "invalid-spec": "panels.market.add.problemInvalid",
3248
+ "already-installed": "panels.market.add.problemInstalled",
3249
+ "not-found": "panels.market.add.problemNotFound",
3250
+ "not-a-package": "panels.market.add.problemNotPackage",
3251
+ "not-a-bundle": "panels.market.add.problemNotBundle",
3252
+ network: "panels.market.add.problemNetwork",
3253
+ unknown: "panels.market.add.problemUnknown"
3254
+ };
3255
+ function problemKey(problem) {
3256
+ return PROBLEM_KEYS[problem] ?? PROBLEM_KEYS.unknown;
3257
+ }
3258
+ var FAILURE_KEYS = {
3259
+ network: "panels.market.add.failureNetwork",
3260
+ "spec-host": "panels.market.add.failureNetworkHost",
3261
+ "not-found": "panels.market.add.failureNotFound",
3262
+ "no-matching-version": "panels.market.add.failureNoMatchingVersion",
3263
+ "disk-full": "panels.market.add.failureDiskFull",
3264
+ permission: "panels.market.add.failurePermission",
3265
+ "build-blocked": "panels.market.add.failureBuildBlocked",
3266
+ integrity: "panels.market.add.failureIntegrity",
3267
+ timeout: "panels.market.add.failureTimeout",
3268
+ "pnpm-missing": "panels.market.add.failurePnpmMissing",
3269
+ "operation-error": "panels.market.add.failureGeneric",
3270
+ "incompatible-version": "panels.market.add.failureGeneric",
3271
+ "not-bundle": "panels.market.add.failureGeneric",
3272
+ "invalid-spec": "panels.market.add.failureGeneric",
3273
+ "bundle-in-use": "panels.market.add.failureGeneric",
3274
+ "not-removable": "panels.market.add.failureGeneric",
3275
+ "stop-profile": "panels.market.add.failureGeneric",
3276
+ "stale-approval": "panels.market.add.failureGeneric"
3277
+ };
3278
+ function failureCode(change) {
3279
+ if (change.failedAt === "spec-host") return "spec-host";
3280
+ return change.errorCode ?? change.packageResult?.kind ?? change.application;
3281
+ }
3282
+ function failureReasonKey(code) {
3283
+ return FAILURE_KEYS[code];
3284
+ }
3285
+ function failureReason(code, application, t) {
3286
+ const key = failureReasonKey(code);
3287
+ if (key !== void 0) return t(key);
3288
+ if (code === application) return t("panels.market.add.reason.unknown");
3289
+ return code;
3290
+ }
3291
+ var SUPPLY_KEYS = {
3292
+ "pending-restart": "panels.market.add.supplyPending",
3293
+ failed: "panels.market.add.supplyFailed",
3294
+ "not-a-module": "panels.market.add.notModule",
3295
+ "no-needs": void 0
2949
3296
  };
3297
+ function supplyKey(state) {
3298
+ return SUPPLY_KEYS[state];
3299
+ }
2950
3300
  //#endregion
2951
- //#region src/shared/components/PanelFoot.tsx
2952
- function PanelFoot({ text, size = "sm", children }) {
2953
- return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3301
+ //#region src/app/layouts/rightbar/market-change.ts
3302
+ var SHIPPED = [
3303
+ "applied",
3304
+ "restart-required",
3305
+ "overridden"
3306
+ ];
3307
+ function changeOf(value) {
3308
+ const change = value?.change;
3309
+ if (typeof change !== "object" || change === null) return void 0;
3310
+ return typeof change.application === "string" ? change : void 0;
3311
+ }
3312
+ function changeFailure(change, t) {
3313
+ if (change === void 0 || SHIPPED.includes(change.application)) return void 0;
3314
+ return failureReason(failureCode(change), change.application, t);
2954
3315
  }
2955
3316
  var MarketPage_module_default = {
2956
3317
  marketList: "_marketList_7yq35_1",
@@ -2985,7 +3346,18 @@ var MarketPage_module_default = {
2985
3346
  marketEmptyTitle: "_marketEmptyTitle_7yq35_267"
2986
3347
  };
2987
3348
  //#endregion
2988
- //#region src/app/layouts/rightbar/MarketView.tsx
3349
+ //#region src/app/layouts/rightbar/MarketStates.tsx
3350
+ function MarketChecking({ t }) {
3351
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(StateDot, {
3352
+ state: "ongoing",
3353
+ size: 14
3354
+ }), t("panels.market.checking")));
3355
+ }
3356
+ function MarketEmpty({ t }) {
3357
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3358
+ }
3359
+ //#endregion
3360
+ //#region src/app/layouts/rightbar/market-view-text.ts
2989
3361
  var PROGRESS_KEY = {
2990
3362
  install: "panels.market.installing",
2991
3363
  update: "panels.market.updating",
@@ -3002,18 +3374,80 @@ var ACTION_LABEL_KEY = {
3002
3374
  uninstall: "panels.market.uninstall",
3003
3375
  "update-dependency": "panels.market.update"
3004
3376
  };
3005
- function MarketLine({ t, row, pending, failure, onAct }) {
3377
+ //#endregion
3378
+ //#region src/app/layouts/rightbar/SharedSection.tsx
3379
+ function SharedLine({ t, row, pending, failure, onAct }) {
3006
3380
  const running = pending !== null && pending.id === row.id ? pending : null;
3007
3381
  const locked = pending !== null;
3008
- const actions = marketActions$1(row);
3009
- const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
3382
+ const actions = sharedActions(row);
3383
+ const stateText = t(SHARED_STATE_KEY[row.state]);
3384
+ const version = row.version;
3385
+ const name = /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
3386
+ from: version.installed,
3387
+ to: version.latest
3388
+ }) : version.installed ?? version.latest ?? ""));
3389
+ return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3390
+ className: MarketPage_module_default.marketIcon,
3391
+ "aria-hidden": "true"
3392
+ }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, row.detail === void 0 ? name : /* @__PURE__ */ h(Tip, { label: row.detail }, name), /* @__PURE__ */ h("span", {
3393
+ className: MarketPage_module_default.marketDesc,
3394
+ role: "img",
3395
+ "aria-label": stateText
3396
+ }, row.state === "checking" ? /* @__PURE__ */ h(StateDot, {
3397
+ state: "ongoing",
3398
+ size: 14
3399
+ }) : /* @__PURE__ */ h(StateDot, {
3400
+ state: SHARED_DOT[row.state],
3401
+ size: 9
3402
+ }), 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(StateDot, {
3403
+ state: "ongoing",
3404
+ size: 14
3405
+ }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(Button, {
3406
+ key: action,
3407
+ type: "button",
3408
+ size: "sm",
3409
+ variant: "outline",
3410
+ disabled: locked,
3411
+ onClick: () => onAct(action)
3412
+ }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3413
+ }
3414
+ function SharedSection({ t, rows, pending, failureOf, act }) {
3415
+ if (rows.length === 0) return null;
3416
+ return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(SharedLine, {
3417
+ key: row.id,
3418
+ t,
3419
+ row,
3420
+ pending,
3421
+ failure: failureOf(row.id),
3422
+ onAct: (action) => void act(row.id, action)
3423
+ }))));
3424
+ }
3425
+ var PanelFoot_module_default = {
3426
+ foot: "_foot_1us83_1",
3427
+ footText: "_footText_1us83_12",
3428
+ footTextMd: "_footTextMd_1us83_17"
3429
+ };
3430
+ //#endregion
3431
+ //#region src/shared/components/PanelFoot.tsx
3432
+ function PanelFoot({ text, size = "sm", children }) {
3433
+ return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3434
+ }
3435
+ //#endregion
3436
+ //#region src/app/layouts/rightbar/MarketView.tsx
3437
+ var CONFIRM_UNINSTALL = ["uninstall", "remove-bundle"];
3438
+ var CONFIRM_REMOVE = ["remove-bundle"];
3439
+ function MarketLine({ t, row, pending, failure, onAct }) {
3440
+ const running = pending !== null && pending.id === row.id ? pending : null;
3441
+ const locked = pending !== null;
3442
+ const actions = marketActions$1(row);
3443
+ const stateText = t(row.moduleUpdate === void 0 ? MARKET_STATE_KEY[row.state] : "panels.market.moduleOutdated");
3010
3444
  return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3011
3445
  className: MarketPage_module_default.marketIcon,
3012
3446
  "aria-hidden": "true"
3013
3447
  }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, t(row.titleKey), row.version === void 0 ? null : /* @__PURE__ */ h("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", {
3014
3448
  from: row.version.installed,
3015
3449
  to: row.version.latest
3016
- }) : row.version.installed ?? row.version.latest ?? "")), /* @__PURE__ */ h(Tip, { label: stateText }, /* @__PURE__ */ h("span", {
3450
+ }) : row.version.installed ?? row.version.latest ?? "")), /* @__PURE__ */ h("span", {
3017
3451
  className: MarketPage_module_default.marketDesc,
3018
3452
  role: "img",
3019
3453
  "aria-label": stateText
@@ -3023,7 +3457,7 @@ function MarketLine({ t, row, pending, failure, onAct }) {
3023
3457
  }) : /* @__PURE__ */ h(StateDot, {
3024
3458
  state: MARKET_DOT[row.state],
3025
3459
  size: 9
3026
- }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint))))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(StateDot, {
3460
+ }), stateText, row.hint === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t(row.hint)))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(StateDot, {
3027
3461
  state: "ongoing",
3028
3462
  size: 14
3029
3463
  }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
@@ -3041,40 +3475,6 @@ function MarketLine({ t, row, pending, failure, onAct }) {
3041
3475
  }, t(ACTION_LABEL_KEY[action]));
3042
3476
  }))), row.note === void 0 ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketNote }, t(row.note.key, row.note.params)), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3043
3477
  }
3044
- function SharedLine({ t, row, pending, failure, onAct }) {
3045
- const running = pending !== null && pending.id === row.id ? pending : null;
3046
- const locked = pending !== null;
3047
- const actions = sharedActions(row);
3048
- const stateText = t(SHARED_STATE_KEY[row.state]);
3049
- const version = row.version;
3050
- return /* @__PURE__ */ h("li", { className: MarketPage_module_default.marketRow }, /* @__PURE__ */ h("span", {
3051
- className: MarketPage_module_default.marketIcon,
3052
- "aria-hidden": "true"
3053
- }, /* @__PURE__ */ h(IconModules, { size: 18 })), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketMain }, /* @__PURE__ */ h(Tip, { label: row.detail ?? "" }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketName }, row.label, version === void 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketVersion }, version.installed !== void 0 && version.latest !== void 0 && version.installed !== version.latest ? t("panels.market.versionArrow", {
3054
- from: version.installed,
3055
- to: version.latest
3056
- }) : version.installed ?? version.latest ?? ""))), /* @__PURE__ */ h(Tip, { label: stateText }, /* @__PURE__ */ h("span", {
3057
- className: MarketPage_module_default.marketDesc,
3058
- role: "img",
3059
- "aria-label": stateText
3060
- }, row.state === "checking" ? /* @__PURE__ */ h(StateDot, {
3061
- state: "ongoing",
3062
- size: 14
3063
- }) : /* @__PURE__ */ h(StateDot, {
3064
- state: SHARED_DOT[row.state],
3065
- size: 9
3066
- }), 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(StateDot, {
3067
- state: "ongoing",
3068
- size: 14
3069
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(Button, {
3070
- key: action,
3071
- type: "button",
3072
- size: "sm",
3073
- variant: "outline",
3074
- disabled: locked,
3075
- onClick: () => onAct(action)
3076
- }, t(ACTION_LABEL_KEY[action]))))), failure === null ? null : /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketFailure }, failure));
3077
- }
3078
3478
  function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
3079
3479
  const [acknowledged, setAcknowledged] = useState(false);
3080
3480
  return /* @__PURE__ */ h(RiskConfirmation, {
@@ -3091,7 +3491,7 @@ function ConfirmUninstall({ t, name, onConfirm, onCancel }) {
3091
3491
  onConfirm
3092
3492
  });
3093
3493
  }
3094
- function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmAction, onConfirming }) {
3494
+ function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmActions, onConfirming }) {
3095
3495
  if (rows.length === 0) return null;
3096
3496
  return /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t(titleKey)), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, rows.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, rows.map((row) => /* @__PURE__ */ h(MarketLine, {
3097
3497
  key: row.id,
@@ -3099,29 +3499,50 @@ function MarketSection({ t, titleKey, rows, pending, failureOf, act, confirmActi
3099
3499
  row,
3100
3500
  pending,
3101
3501
  failure: failureOf(row.id),
3102
- onAct: (action) => action === confirmAction ? onConfirming(row.id) : void act(row.id, action)
3502
+ onAct: (action) => confirmActions.includes(action) ? onConfirming(row.id) : void act(row.id, action)
3103
3503
  }))));
3104
3504
  }
3105
- function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, mock }) {
3106
- const source = mock?.manifests ?? manifests;
3505
+ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates, installed, installedRead, settling, mock }) {
3506
+ const [titles, setTitles] = useState(/* @__PURE__ */ new Map());
3507
+ useEffect(() => {
3508
+ if (mock === void 0) setTitles((known) => mergeTitles(known, manifests));
3509
+ }, [manifests, mock]);
3510
+ const catalog = mock?.manifests ?? manifests;
3107
3511
  const effective = mock === void 0 ? capabilities : mock.capabilities;
3512
+ const source = liveManifests(catalog, effective, mock === void 0 && installed !== void 0 ? new Set(installed.map((item) => item.unit)) : null);
3108
3513
  const rows = marketRows(source, effective, mock?.updates ?? updates ?? {});
3109
3514
  const shared = sharedRows(source, effective);
3110
- const installedList = installedRows(mock?.installed ?? installed ?? [], source, new Set(rows.map((row) => row.id)));
3111
- const rowById = new Map([...rows, ...installedList].map((row) => [row.id, row]));
3112
3515
  const [pending, setPending] = useState(mock?.pending ?? null);
3113
3516
  const provision = useHostWrite({
3114
3517
  channel: "provision",
3115
3518
  networkText: t("panels.failed")
3116
3519
  });
3117
3520
  const [confirming, setConfirming] = useState(mock?.confirming ?? null);
3118
- const confirmingRow = confirming === null ? void 0 : rowById.get(confirming);
3119
3521
  const [failed, setFailed] = useState(mock?.failure ?? null);
3522
+ const removing = pending !== null && pending.action === "remove-bundle" && failed?.id !== pending.id ? pending.id : null;
3523
+ const installedList = installedRows((mock?.installed ?? installed ?? []).filter((module) => !(settling?.has(module.unit) ?? false) && module.unit !== removing), source, new Set(rows.map((row) => row.id)), titles);
3524
+ const pendingRow = removing === null || pending === null || rows.some((row) => row.id === removing) ? void 0 : {
3525
+ id: removing,
3526
+ titleKey: pending.titleKey ?? titles.get(removing) ?? removing,
3527
+ state: "installed",
3528
+ canInstall: false,
3529
+ canUpdate: false,
3530
+ canUninstall: true,
3531
+ ...pending.pkg === void 0 ? {} : { pkg: pending.pkg },
3532
+ ...pending.version === void 0 ? {} : { version: { installed: pending.version } }
3533
+ };
3534
+ const shown = pendingRow === void 0 ? rows : [...rows, pendingRow];
3535
+ const rowById = new Map([...shown, ...installedList].map((row) => [row.id, row]));
3536
+ const confirmingRow = confirming === null ? void 0 : rowById.get(confirming);
3120
3537
  const act = async (id, action) => {
3121
3538
  if (mock !== void 0) return;
3539
+ const row = rowById.get(id);
3122
3540
  setPending({
3123
3541
  id,
3124
- action
3542
+ action,
3543
+ ...row?.titleKey === void 0 ? {} : { titleKey: row.titleKey },
3544
+ ...row?.pkg === void 0 ? {} : { pkg: row.pkg },
3545
+ ...row?.version?.installed === void 0 ? {} : { version: row.version.installed }
3125
3546
  });
3126
3547
  setConfirming(null);
3127
3548
  setFailed(null);
@@ -3138,20 +3559,23 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
3138
3559
  });
3139
3560
  setPending(null);
3140
3561
  if (!outcome.ok) {
3562
+ onChanged();
3141
3563
  setFailed({
3142
3564
  id,
3143
3565
  message: t("panels.market.failed", { reason: outcome.message })
3144
3566
  });
3145
3567
  return;
3146
3568
  }
3569
+ const reason = changeFailure(changeOf(outcome.value), t);
3147
3570
  onChanged();
3571
+ if (reason !== void 0) setFailed({
3572
+ id,
3573
+ message: t("panels.market.failed", { reason })
3574
+ });
3148
3575
  };
3149
- if (!(freshness.loaded && installedRead !== false)) return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(StateDot, {
3150
- state: "ongoing",
3151
- size: 14
3152
- }), t("panels.market.checking")));
3153
- if (rows.length === 0 && installedList.length === 0) return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3154
- return /* @__PURE__ */ h(Fragment, null, marketSections(rows).map((section) => /* @__PURE__ */ h(MarketSection, {
3576
+ if (!(freshness.loaded && installedRead !== false) || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
3577
+ if (shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketEmpty, { t });
3578
+ return /* @__PURE__ */ h(Fragment, null, marketSections(shown).map((section) => /* @__PURE__ */ h(MarketSection, {
3155
3579
  key: section.id,
3156
3580
  t,
3157
3581
  titleKey: section.titleKey,
@@ -3159,7 +3583,7 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
3159
3583
  pending,
3160
3584
  failureOf: (id) => failed?.id === id ? failed.message : null,
3161
3585
  act,
3162
- confirmAction: "uninstall",
3586
+ confirmActions: CONFIRM_UNINSTALL,
3163
3587
  onConfirming: setConfirming
3164
3588
  })), /* @__PURE__ */ h(MarketSection, {
3165
3589
  t,
@@ -3168,268 +3592,100 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
3168
3592
  pending,
3169
3593
  failureOf: (id) => failed?.id === id ? failed.message : null,
3170
3594
  act,
3171
- confirmAction: "remove-bundle",
3595
+ confirmActions: CONFIRM_REMOVE,
3172
3596
  onConfirming: setConfirming
3173
3597
  }), /* @__PURE__ */ h(PanelFoot, {
3174
- size: "md",
3175
- text: t("panels.market.foot")
3176
- }), shared.length === 0 ? null : /* @__PURE__ */ h("section", { className: MarketPage_module_default.marketSection }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketSectionHead }, /* @__PURE__ */ h("h2", { className: MarketPage_module_default.marketSectionTitle }, t("panels.market.sectionShared")), /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketSectionCount }, shared.length)), /* @__PURE__ */ h("ul", { className: MarketPage_module_default.marketList }, shared.map((row) => /* @__PURE__ */ h(SharedLine, {
3177
- key: row.id,
3178
- t,
3179
- row,
3180
- pending,
3181
- failure: failed?.id === row.id ? failed.message : null,
3182
- onAct: (action) => void act(row.id, action)
3183
- })))), /* @__PURE__ */ h(ConfirmUninstall, {
3184
- key: confirming ?? "",
3185
- t,
3186
- name: confirmingRow === void 0 ? null : t(confirmingRow.titleKey),
3187
- onCancel: () => setConfirming(null),
3188
- onConfirm: () => {
3189
- const id = confirming;
3190
- setConfirming(null);
3191
- if (id === null) return;
3192
- act(id, rowById.get(id)?.pkg === void 0 ? "uninstall" : "remove-bundle");
3193
- }
3194
- }));
3195
- }
3196
- //#endregion
3197
- //#region src/shared/api/bundle-install.ts
3198
- var BUNDLE_REGISTRIES_ROUTE = "bundle-registries";
3199
- var BUNDLE_INSPECT_ROUTE = "bundle-inspect";
3200
- var MODULE_VERSIONS_ROUTE = "module-versions";
3201
- //#endregion
3202
- //#region src/shared/hooks/bundle-queries.ts
3203
- function readBundleRegistries() {
3204
- return apiGet(BUNDLE_REGISTRIES_ROUTE);
3205
- }
3206
- function readBundleInspection(spec, registry) {
3207
- return apiGet(BUNDLE_INSPECT_ROUTE, {
3208
- spec,
3209
- ...registry === void 0 || registry === "" ? {} : { registry }
3210
- });
3211
- }
3212
- function readModuleVersions(force = false) {
3213
- return apiGet(MODULE_VERSIONS_ROUTE, force ? { force: "1" } : void 0);
3214
- }
3215
- var AddModule_module_default = {
3216
- wide: "_wide_1coeb_1",
3217
- dialog: "_dialog_1coeb_8",
3218
- content: "_content_1coeb_13",
3219
- stack: "_stack_1coeb_18",
3220
- body: "_body_1coeb_25",
3221
- field: "_field_1coeb_32",
3222
- input: "_input_1coeb_39",
3223
- registryField: "_registryField_1coeb_45",
3224
- options: "_options_1coeb_51",
3225
- guideToggle: "_guideToggle_1coeb_59",
3226
- registryToggle: "_registryToggle_1coeb_78",
3227
- registryWrap: "_registryWrap_1coeb_87",
3228
- registryChosen: "_registryChosen_1coeb_121",
3229
- registry: "_registry_1coeb_45",
3230
- registryOption: "_registryOption_1coeb_143",
3231
- registryPick: "_registryPick_1coeb_159",
3232
- registryTitle: "_registryTitle_1coeb_179",
3233
- registryHint: "_registryHint_1coeb_189",
3234
- inputError: "_inputError_1coeb_197",
3235
- guide: "_guide_1coeb_59",
3236
- guideList: "_guideList_1coeb_214",
3237
- guideItem: "_guideItem_1coeb_223",
3238
- guideIndex: "_guideIndex_1coeb_230",
3239
- guideMain: "_guideMain_1coeb_244",
3240
- guideTitle: "_guideTitle_1coeb_252",
3241
- guideHint: "_guideHint_1coeb_258",
3242
- guideExample: "_guideExample_1coeb_264",
3243
- guideExampleLabel: "_guideExampleLabel_1coeb_274",
3244
- footer: "_footer_1coeb_278",
3245
- hero: "_hero_1coeb_285",
3246
- heroIcon: "_heroIcon_1coeb_294",
3247
- pendingTitle: "_pendingTitle_1coeb_311",
3248
- wizardTitle: "_wizardTitle_1coeb_319",
3249
- subject: "_subject_1coeb_326",
3250
- subjectName: "_subjectName_1coeb_337",
3251
- subjectMeta: "_subjectMeta_1coeb_343",
3252
- subjectDesc: "_subjectDesc_1coeb_344",
3253
- result: "_result_1coeb_351",
3254
- resultWarn: "_resultWarn_1coeb_352",
3255
- approval: "_approval_1coeb_365",
3256
- approvalTitle: "_approvalTitle_1coeb_375",
3257
- approvalText: "_approvalText_1coeb_382",
3258
- approvalCaution: "_approvalCaution_1coeb_388",
3259
- note: "_note_1coeb_395",
3260
- noteWarn: "_noteWarn_1coeb_402",
3261
- noteError: "_noteError_1coeb_406",
3262
- problem: "_problem_1coeb_410",
3263
- detailLabel: "_detailLabel_1coeb_417",
3264
- detail: "_detail_1coeb_417"
3265
- };
3266
- //#endregion
3267
- //#region src/app/layouts/market/add-module-text.ts
3268
- var GUIDE_ITEMS = [
3269
- {
3270
- titleKey: "panels.market.add.guideIdTitle",
3271
- exampleKey: "panels.market.add.guideIdExample",
3272
- hintKey: "panels.market.add.guideIdHint"
3273
- },
3274
- {
3275
- titleKey: "panels.market.add.guideGitTitle",
3276
- exampleKey: "panels.market.add.guideGitExample",
3277
- hintKey: "panels.market.add.guideGitHint"
3278
- },
3279
- {
3280
- titleKey: "panels.market.add.guidePathTitle",
3281
- exampleKey: "panels.market.add.guidePathExample",
3282
- hintKey: "panels.market.add.guidePathHint"
3283
- }
3284
- ];
3285
- function hostOf(url) {
3286
- try {
3287
- return new URL(url).host;
3288
- } catch {
3289
- return url;
3290
- }
3291
- }
3292
- var OFFICIAL_NPM_HOST = "registry.npmjs.org";
3293
- var KNOWN_HOSTS = {
3294
- [OFFICIAL_NPM_HOST]: "panels.market.add.registryOfficial",
3295
- "registry.npmmirror.com": "panels.market.add.registryMirror"
3296
- };
3297
- function registryNameKey(host) {
3298
- return KNOWN_HOSTS[host];
3299
- }
3300
- function normalizeRegistry(url) {
3301
- const parsed = new URL(url);
3302
- if (!parsed.pathname.endsWith("/")) parsed.pathname += "/";
3303
- return parsed.href;
3304
- }
3305
- function registryKey(url, resolved) {
3306
- const target = url ?? resolved;
3307
- if (target === null) return "";
3308
- try {
3309
- return normalizeRegistry(target);
3310
- } catch {
3311
- return target;
3312
- }
3313
- }
3314
- function registryOptions(registries) {
3315
- const resolved = registries === null ? null : registries.resolved;
3316
- const entries = [
3317
- registries === null ? null : registries.registry,
3318
- ...registries === null ? [] : registries.fallbackRegistries,
3319
- null
3320
- ];
3321
- const offered = [];
3322
- const keys = /* @__PURE__ */ new Set();
3323
- for (const entry of entries) {
3324
- const key = registryKey(entry, resolved);
3325
- if (keys.has(key)) continue;
3326
- keys.add(key);
3327
- const url = entry ?? resolved;
3328
- if (url === null) {
3329
- offered.push({
3330
- choice: {
3331
- kind: "default",
3332
- value: ""
3333
- },
3334
- host: OFFICIAL_NPM_HOST,
3335
- nameKey: "panels.market.add.registryDefault"
3336
- });
3337
- continue;
3338
- }
3339
- const host = hostOf(url);
3340
- const nameKey = registryNameKey(host);
3341
- offered.push({
3342
- choice: entry === null ? {
3343
- kind: "default",
3344
- value: ""
3345
- } : {
3346
- kind: "url",
3347
- value: entry
3348
- },
3349
- host,
3350
- ...nameKey === void 0 ? {} : { nameKey }
3351
- });
3352
- }
3353
- offered.push({ choice: {
3354
- kind: "custom",
3355
- value: ""
3356
- } });
3357
- return offered;
3358
- }
3359
- function customRegistryAllowed(value) {
3360
- return /^https?:\/\//.test(value.trim());
3361
- }
3362
- function registryOf(choice, custom) {
3363
- if (choice.kind === "custom") return customRegistryAllowed(custom) ? custom.trim() : void 0;
3364
- return choice.value === "" ? void 0 : choice.value;
3598
+ size: "md",
3599
+ text: t("panels.market.foot")
3600
+ }), /* @__PURE__ */ h(SharedSection, {
3601
+ t,
3602
+ rows: shared,
3603
+ pending,
3604
+ failureOf: (id) => failed?.id === id ? failed.message : null,
3605
+ act
3606
+ }), /* @__PURE__ */ h(ConfirmUninstall, {
3607
+ key: confirming ?? "",
3608
+ t,
3609
+ name: confirmingRow === void 0 ? null : t(confirmingRow.titleKey),
3610
+ onCancel: () => setConfirming(null),
3611
+ onConfirm: () => {
3612
+ const id = confirming;
3613
+ setConfirming(null);
3614
+ if (id === null) return;
3615
+ act(id, rowById.get(id)?.pkg === void 0 ? "uninstall" : "remove-bundle");
3616
+ }
3617
+ }));
3365
3618
  }
3366
- function registryName(option, t) {
3367
- if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3368
- if (option.nameKey !== void 0) return t(option.nameKey);
3369
- return option.host ?? t("panels.market.add.registryDefault");
3619
+ //#endregion
3620
+ //#region src/shared/api/bundle-install.ts
3621
+ var BUNDLE_REGISTRIES_ROUTE = "bundle-registries";
3622
+ var BUNDLE_INSPECT_ROUTE = "bundle-inspect";
3623
+ var MODULE_VERSIONS_ROUTE = "module-versions";
3624
+ //#endregion
3625
+ //#region src/shared/hooks/bundle-queries.ts
3626
+ function readBundleRegistries() {
3627
+ return apiGet(BUNDLE_REGISTRIES_ROUTE);
3370
3628
  }
3371
- function optionLabel(option, t) {
3372
- if (option.choice.kind === "custom") return t("panels.market.add.registryCustom");
3373
- if (option.host === void 0) return t("panels.market.add.registryDefault");
3374
- return option.nameKey === void 0 ? option.host : t("panels.market.add.registryWithHost", {
3375
- name: t(option.nameKey),
3376
- host: option.host
3629
+ function readBundleInspection(spec, registry) {
3630
+ return apiGet(BUNDLE_INSPECT_ROUTE, {
3631
+ spec,
3632
+ ...registry === void 0 || registry === "" ? {} : { registry }
3377
3633
  });
3378
3634
  }
3379
- var PROBLEM_KEYS = {
3380
- "invalid-spec": "panels.market.add.problemInvalid",
3381
- "already-installed": "panels.market.add.problemInstalled",
3382
- "not-found": "panels.market.add.problemNotFound",
3383
- "not-a-package": "panels.market.add.problemNotPackage",
3384
- "not-a-bundle": "panels.market.add.problemNotBundle",
3385
- network: "panels.market.add.problemNetwork",
3386
- unknown: "panels.market.add.problemUnknown"
3387
- };
3388
- function problemKey(problem) {
3389
- return PROBLEM_KEYS[problem] ?? PROBLEM_KEYS.unknown;
3390
- }
3391
- var FAILURE_KEYS = {
3392
- network: "panels.market.add.failureNetwork",
3393
- "spec-host": "panels.market.add.failureNetworkHost",
3394
- "not-found": "panels.market.add.failureNotFound",
3395
- "no-matching-version": "panels.market.add.failureNoMatchingVersion",
3396
- "disk-full": "panels.market.add.failureDiskFull",
3397
- permission: "panels.market.add.failurePermission",
3398
- "build-blocked": "panels.market.add.failureBuildBlocked",
3399
- integrity: "panels.market.add.failureIntegrity",
3400
- timeout: "panels.market.add.failureTimeout",
3401
- "pnpm-missing": "panels.market.add.failurePnpmMissing",
3402
- "operation-error": "panels.market.add.failureGeneric",
3403
- "incompatible-version": "panels.market.add.failureGeneric",
3404
- "not-bundle": "panels.market.add.failureGeneric",
3405
- "invalid-spec": "panels.market.add.failureGeneric",
3406
- "bundle-in-use": "panels.market.add.failureGeneric",
3407
- "not-removable": "panels.market.add.failureGeneric",
3408
- "stop-profile": "panels.market.add.failureGeneric",
3409
- "stale-approval": "panels.market.add.failureGeneric"
3410
- };
3411
- function failureCode(change) {
3412
- if (change.failedAt === "spec-host") return "spec-host";
3413
- return change.errorCode ?? change.packageResult?.kind ?? change.application;
3414
- }
3415
- function failureReasonKey(code) {
3416
- return FAILURE_KEYS[code];
3417
- }
3418
- function failureReason(code, application, t) {
3419
- const key = failureReasonKey(code);
3420
- if (key !== void 0) return t(key);
3421
- if (code === application) return t("panels.market.add.reason.unknown");
3422
- return code;
3635
+ function readModuleVersions(force = false) {
3636
+ return apiGet(MODULE_VERSIONS_ROUTE, force ? { force: "1" } : void 0);
3423
3637
  }
3424
- var SUPPLY_KEYS = {
3425
- "pending-restart": "panels.market.add.supplyPending",
3426
- failed: "panels.market.add.supplyFailed",
3427
- "not-a-module": "panels.market.add.notModule",
3428
- "no-needs": void 0
3638
+ var AddModule_module_default = {
3639
+ wide: "_wide_1coeb_1",
3640
+ dialog: "_dialog_1coeb_8",
3641
+ content: "_content_1coeb_13",
3642
+ stack: "_stack_1coeb_18",
3643
+ body: "_body_1coeb_25",
3644
+ field: "_field_1coeb_32",
3645
+ input: "_input_1coeb_39",
3646
+ registryField: "_registryField_1coeb_45",
3647
+ options: "_options_1coeb_51",
3648
+ guideToggle: "_guideToggle_1coeb_59",
3649
+ registryToggle: "_registryToggle_1coeb_78",
3650
+ registryWrap: "_registryWrap_1coeb_87",
3651
+ registryChosen: "_registryChosen_1coeb_121",
3652
+ registry: "_registry_1coeb_45",
3653
+ registryOption: "_registryOption_1coeb_143",
3654
+ registryPick: "_registryPick_1coeb_159",
3655
+ registryTitle: "_registryTitle_1coeb_179",
3656
+ registryHint: "_registryHint_1coeb_189",
3657
+ inputError: "_inputError_1coeb_197",
3658
+ guide: "_guide_1coeb_59",
3659
+ guideList: "_guideList_1coeb_214",
3660
+ guideItem: "_guideItem_1coeb_223",
3661
+ guideIndex: "_guideIndex_1coeb_230",
3662
+ guideMain: "_guideMain_1coeb_244",
3663
+ guideTitle: "_guideTitle_1coeb_252",
3664
+ guideHint: "_guideHint_1coeb_258",
3665
+ guideExample: "_guideExample_1coeb_264",
3666
+ guideExampleLabel: "_guideExampleLabel_1coeb_274",
3667
+ footer: "_footer_1coeb_278",
3668
+ hero: "_hero_1coeb_285",
3669
+ heroIcon: "_heroIcon_1coeb_294",
3670
+ pendingTitle: "_pendingTitle_1coeb_311",
3671
+ wizardTitle: "_wizardTitle_1coeb_319",
3672
+ subject: "_subject_1coeb_326",
3673
+ subjectName: "_subjectName_1coeb_337",
3674
+ subjectMeta: "_subjectMeta_1coeb_343",
3675
+ subjectDesc: "_subjectDesc_1coeb_344",
3676
+ result: "_result_1coeb_351",
3677
+ resultWarn: "_resultWarn_1coeb_352",
3678
+ approval: "_approval_1coeb_365",
3679
+ approvalTitle: "_approvalTitle_1coeb_375",
3680
+ approvalText: "_approvalText_1coeb_382",
3681
+ approvalCaution: "_approvalCaution_1coeb_388",
3682
+ note: "_note_1coeb_395",
3683
+ noteWarn: "_noteWarn_1coeb_402",
3684
+ noteError: "_noteError_1coeb_406",
3685
+ problem: "_problem_1coeb_410",
3686
+ detailLabel: "_detailLabel_1coeb_417",
3687
+ detail: "_detail_1coeb_417"
3429
3688
  };
3430
- function supplyKey(state) {
3431
- return SUPPLY_KEYS[state];
3432
- }
3433
3689
  //#endregion
3434
3690
  //#region src/app/layouts/market/AddModuleRegistry.tsx
3435
3691
  var REGISTRY_ID = "wb-add-module-registry";
@@ -3489,7 +3745,13 @@ function AddModuleRegistry({ t, state }) {
3489
3745
  return /* @__PURE__ */ h("div", {
3490
3746
  key: `${option.choice.kind}|${option.choice.value}`,
3491
3747
  className: AddModule_module_default.registryOption,
3492
- "data-checked": active
3748
+ "data-checked": active,
3749
+ onPointerDown: () => {
3750
+ if (!active) state.setChoice(option.choice);
3751
+ },
3752
+ onFocusCapture: () => {
3753
+ if (!active) state.setChoice(option.choice);
3754
+ }
3493
3755
  }, /* @__PURE__ */ h("label", { className: AddModule_module_default.registryPick }, /* @__PURE__ */ h("input", {
3494
3756
  type: "radio",
3495
3757
  name: REGISTRY_ID,
@@ -3501,7 +3763,6 @@ function AddModuleRegistry({ t, state }) {
3501
3763
  "aria-label": t("panels.market.add.registryCustom"),
3502
3764
  placeholder: t("panels.market.add.registryCustomPlaceholder"),
3503
3765
  value: state.custom,
3504
- disabled: !active,
3505
3766
  invalid: customBad,
3506
3767
  onChange: (event) => state.setCustom(event.target.value)
3507
3768
  }), customBad ? /* @__PURE__ */ h("span", {
@@ -4093,7 +4354,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
4093
4354
  }, t("panels.market.add.run"))) : null, installing ? /* @__PURE__ */ h(Button, {
4094
4355
  type: "button",
4095
4356
  variant: "outline",
4096
- size: "sm",
4357
+ size: "md",
4097
4358
  onClick: state.cancelInstall
4098
4359
  }, t("panels.market.add.cancel")) : null, state.phase === "result" ? /* @__PURE__ */ h(Fragment, null, failed && builds.length === 0 ? /* @__PURE__ */ h(Button, {
4099
4360
  type: "button",
@@ -4163,6 +4424,7 @@ var MOCK_FRESHNESS = {
4163
4424
  checking: false,
4164
4425
  checkedAt: null
4165
4426
  };
4427
+ var NO_UNITS = /* @__PURE__ */ new Set();
4166
4428
  function useLiveManifests(units) {
4167
4429
  useSyncExternalStore(useCallback((listener) => units.subscribe(listener), [units]), useCallback(() => units.version(), [units]));
4168
4430
  return units.manifests();
@@ -4185,7 +4447,7 @@ function MarketPanel({ t, units }) {
4185
4447
  const [decided, setDecided] = useState(false);
4186
4448
  const [adding, setAdding] = useState(false);
4187
4449
  const [updates, setUpdates] = useState({});
4188
- const [installed, setInstalled] = useState([]);
4450
+ const [installed, setInstalled] = useState(void 0);
4189
4451
  const [installedRead, setInstalledRead] = useState(false);
4190
4452
  const loadUpdates = useCallback((force = false) => {
4191
4453
  readModuleVersions(force).then((response) => {
@@ -4221,6 +4483,24 @@ function MarketPanel({ t, units }) {
4221
4483
  forceProbe,
4222
4484
  loadUpdates
4223
4485
  ]);
4486
+ const installedKey = (installed ?? []).map((module) => module.unit).join("|");
4487
+ const rosterKey = manifests.map((manifest) => manifest.id).join("|");
4488
+ const activeKey = Object.keys(capabilities ?? {}).join("|");
4489
+ const seenRef = useRef(null);
4490
+ const [settling, setSettling] = useState(NO_UNITS);
4491
+ useEffect(() => {
4492
+ const units = installedKey === "" ? [] : installedKey.split("|");
4493
+ const held = holdBack(units, new Set(rosterKey === "" ? [] : rosterKey.split("|")), new Set(activeKey === "" ? [] : activeKey.split("|")), seenRef.current);
4494
+ seenRef.current = new Set(units);
4495
+ setSettling(held.length === 0 ? NO_UNITS : new Set(held));
4496
+ if (held.length === 0) return;
4497
+ const timer = setTimeout(() => setSettling(NO_UNITS), MODULE_SETTLE_MS);
4498
+ return () => clearTimeout(timer);
4499
+ }, [
4500
+ installedKey,
4501
+ rosterKey,
4502
+ activeKey
4503
+ ]);
4224
4504
  const freshness = {
4225
4505
  loaded: capabilities !== null,
4226
4506
  checking,
@@ -4270,6 +4550,7 @@ function MarketPanel({ t, units }) {
4270
4550
  updates,
4271
4551
  installed,
4272
4552
  installedRead: mock === void 0 ? installedRead : mock.installedRead ?? true,
4553
+ settling: mock === void 0 ? settling : void 0,
4273
4554
  mock
4274
4555
  }), /* @__PURE__ */ h(AddModuleDialog, {
4275
4556
  t,
@@ -4368,6 +4649,14 @@ function bridgeAdvice(issue) {
4368
4649
  return { textKey: "env.bridge.unknown" };
4369
4650
  }
4370
4651
  //#endregion
4652
+ //#region src/app/layouts/env-gate/gate-deadline.ts
4653
+ function createGateDeadline(giveUpMs, expire) {
4654
+ const timer = setTimeout(expire, giveUpMs);
4655
+ return { disarm() {
4656
+ clearTimeout(timer);
4657
+ } };
4658
+ }
4659
+ //#endregion
4371
4660
  //#region src/app/layouts/env-gate/gate-dom.ts
4372
4661
  var SVG_NS = "http://www.w3.org/2000/svg";
4373
4662
  function svgIcon(kind) {
@@ -4830,7 +5119,6 @@ function createBootGate(ctx, options = {}) {
4830
5119
  }
4831
5120
  let cancelled = false;
4832
5121
  const forcePlan = createForcePlan();
4833
- const startedAt = Date.now();
4834
5122
  let pinned = null;
4835
5123
  function close() {
4836
5124
  if (closed) return;
@@ -4838,9 +5126,11 @@ function createBootGate(ctx, options = {}) {
4838
5126
  cancelled = true;
4839
5127
  if (timer !== void 0) clearTimeout(timer);
4840
5128
  if (ticker !== void 0) clearInterval(ticker);
5129
+ deadline.disarm();
4841
5130
  overlay.remove();
4842
5131
  if (root !== null) root.inert = previousInert;
4843
5132
  }
5133
+ const deadline = createGateDeadline(GIVE_UP_MS, close);
4844
5134
  const rows = /* @__PURE__ */ new Map();
4845
5135
  let renderedOrder = "";
4846
5136
  function ensureRow(step) {
@@ -4934,10 +5224,6 @@ function createBootGate(ctx, options = {}) {
4934
5224
  return;
4935
5225
  }
4936
5226
  if (response.phase === "failed") return;
4937
- if (Date.now() - startedAt > GIVE_UP_MS) {
4938
- close();
4939
- return;
4940
- }
4941
5227
  timer = setTimeout(() => void poll(), POLL_MS);
4942
5228
  }
4943
5229
  function retryNow() {
@@ -5199,7 +5485,7 @@ var ModulesPage_module_default = {
5199
5485
  };
5200
5486
  //#endregion
5201
5487
  //#region src/app/layouts/rightbar/panel-mock.ts
5202
- function row(id, titleKey, shown) {
5488
+ function row$1(id, titleKey, shown) {
5203
5489
  return {
5204
5490
  id,
5205
5491
  titleKey,
@@ -5228,10 +5514,10 @@ function buildPanelMocks(roster) {
5228
5514
  }];
5229
5515
  const titleKey = found.card?.titleKey ?? found.id;
5230
5516
  const id = found.id;
5231
- const on = row(id, titleKey, true);
5232
- const off = row(id, titleKey, false);
5233
- const twin = row(`${id}-b`, titleKey, true);
5234
- const third = row(`${id}-c`, titleKey, false);
5517
+ const on = row$1(id, titleKey, true);
5518
+ const off = row$1(id, titleKey, false);
5519
+ const twin = row$1(`${id}-b`, titleKey, true);
5520
+ const third = row$1(`${id}-c`, titleKey, false);
5235
5521
  return [
5236
5522
  {
5237
5523
  id: "one",
@@ -5313,7 +5599,7 @@ function buildPanelMocks(roster) {
5313
5599
  {
5314
5600
  id: "long",
5315
5601
  label: "超长模块名",
5316
- units: [row(id, "一个名字特别特别长的模块用来验证省略号会不会把开关挤下去", true)],
5602
+ units: [row$1(id, "一个名字特别特别长的模块用来验证省略号会不会把开关挤下去", true)],
5317
5603
  capabilities: probe(id, "ok"),
5318
5604
  expect: {
5319
5605
  rows: 1,
@@ -5379,13 +5665,14 @@ function buildPanelMocks(roster) {
5379
5665
  function available(capability) {
5380
5666
  if (capability === void 0) return true;
5381
5667
  if (capability.released === true) return false;
5382
- return capability.status === "ok" || capability.status === "unchecked";
5668
+ return capability.status === "ok" || capability.status === "unchecked" || capability.status === "failed";
5383
5669
  }
5384
5670
  function selectPanelUnits(units, capabilities) {
5385
5671
  return units.filter((unit) => available(capabilities?.[unit.id]));
5386
5672
  }
5387
5673
  function panelBadgeKey(capability) {
5388
5674
  if (capability === void 0 || capability.status === "ok") return void 0;
5675
+ if (capability.status === "failed") return "panels.dep.failed";
5389
5676
  if (capability.status === "missing-plugin") return "panels.dep.missingPlugin";
5390
5677
  if (capability.status === "missing-commands") return "panels.dep.missingCommands";
5391
5678
  return "panels.dep.unchecked";
@@ -5644,6 +5931,16 @@ function buildBoardMocks(roster) {
5644
5931
  cards: 8,
5645
5932
  empty: false
5646
5933
  }
5934
+ },
5935
+ {
5936
+ id: "crash",
5937
+ label: "坏卡 + 好卡",
5938
+ note: "一张渲染必炸的卡 + 你装的模块(配 ?wbCrash=1 才摆得出来):要看到坏的那张只剩一句\"这个模块起不来\",别的卡与面板壳都还在。",
5939
+ shape: { kind: "all" },
5940
+ expect: {
5941
+ cards: 1,
5942
+ empty: false
5943
+ }
5647
5944
  }
5648
5945
  ],
5649
5946
  EMPTY,
@@ -5688,6 +5985,15 @@ function planBoard(shape, real, all) {
5688
5985
  reading: true,
5689
5986
  repeated: false
5690
5987
  };
5988
+ if (shape.kind === "all") return {
5989
+ modules: all.map((module) => ({
5990
+ key: module.id,
5991
+ module
5992
+ })),
5993
+ empty: false,
5994
+ reading: false,
5995
+ repeated: all.length > 1
5996
+ };
5691
5997
  const seed = all[0];
5692
5998
  const modules = seed === void 0 ? [] : Array.from({ length: Math.max(0, shape.count) }, (_unused, at) => ({
5693
5999
  key: `${seed.id}#${at}`,
@@ -5898,6 +6204,9 @@ function useBoardWorkspace(workspaces, sessions) {
5898
6204
  var Rightbar_module_default = { panel: "_panel_1oyh4_1" };
5899
6205
  //#endregion
5900
6206
  //#region src/app/layouts/rightbar/Rightbar.tsx
6207
+ function workspacePathOf(world) {
6208
+ return world.current.workspace?.path ?? "";
6209
+ }
5901
6210
  function ModuleHost({ module, step, panelToken, onPanelRefresh, onSummary, ...rest }) {
5902
6211
  const [ownToken, setOwnToken] = useState(0);
5903
6212
  return /* @__PURE__ */ h(step === void 0 ? module.View : module.steps?.[step]?.View ?? module.View, {
@@ -5948,8 +6257,13 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
5948
6257
  icon: /* @__PURE__ */ h(IconBrandMark, { size: 32 }),
5949
6258
  title: t("panels.unknownStep")
5950
6259
  });
5951
- return /* @__PURE__ */ h(ModuleHost, {
5952
- key: `${owner.id}:${top.kind}`,
6260
+ const key = `${owner.id}:${top.kind}`;
6261
+ return /* @__PURE__ */ h(CardBoundary, {
6262
+ key,
6263
+ unit: owner.id,
6264
+ resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
6265
+ t
6266
+ }, /* @__PURE__ */ h(ModuleHost, {
5953
6267
  module: owner,
5954
6268
  step: top.kind,
5955
6269
  world,
@@ -5959,7 +6273,7 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
5959
6273
  onOpenMarket,
5960
6274
  onSummary,
5961
6275
  t
5962
- });
6276
+ }));
5963
6277
  }
5964
6278
  return /* @__PURE__ */ h(Fragment, null, plan.reading ? /* @__PURE__ */ h(CenteredState, {
5965
6279
  icon: null,
@@ -5968,8 +6282,12 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
5968
6282
  t,
5969
6283
  onOpenModules,
5970
6284
  onOpenMarket
5971
- }) : null, plan.modules.map(({ key, module }) => /* @__PURE__ */ h(ModuleHost, {
6285
+ }) : null, plan.modules.map(({ key, module }) => /* @__PURE__ */ h(CardBoundary, {
5972
6286
  key,
6287
+ unit: module.id,
6288
+ resetKey: `${key}:${panelToken}:${workspacePathOf(world)}`,
6289
+ t
6290
+ }, /* @__PURE__ */ h(ModuleHost, {
5973
6291
  module,
5974
6292
  world,
5975
6293
  panelToken,
@@ -5978,7 +6296,7 @@ function BoardContent({ top, plan, world, board, panelToken, onPanelRefresh, onN
5978
6296
  onOpenMarket,
5979
6297
  onSummary,
5980
6298
  t
5981
- })));
6299
+ }))));
5982
6300
  }
5983
6301
  function Rightbar(props) {
5984
6302
  const units = props.units;
@@ -6001,7 +6319,7 @@ function Rightbar(props) {
6001
6319
  const plan = planBoard(fixtures.shape, {
6002
6320
  modules: visibleModules,
6003
6321
  configRead: enabledUnits !== null
6004
- }, fixtureSeed(manifests, modules.all()));
6322
+ }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
6005
6323
  const world = createSuiteWorld({
6006
6324
  workspaces,
6007
6325
  sessions,
@@ -6241,59 +6559,324 @@ function PanelRow({ id, label, active, wide, onSelect, fallbackGlyph, renderEntr
6241
6559
  className: "wb-panelTag"
6242
6560
  }, t(hint.labelKey))));
6243
6561
  }
6562
+ var ProjectSwitcher_module_default = {
6563
+ root: "_root_1vd78_1",
6564
+ anchor: "_anchor_1vd78_7",
6565
+ menu: "_menu_1vd78_12",
6566
+ trigger: "_trigger_1vd78_17",
6567
+ glyph: "_glyph_1vd78_44",
6568
+ glyphActive: "_glyphActive_1vd78_54",
6569
+ triggerName: "_triggerName_1vd78_58",
6570
+ dir: "_dir_1vd78_69",
6571
+ name: "_name_1vd78_77",
6572
+ chevron: "_chevron_1vd78_90",
6573
+ row: "_row_1vd78_96",
6574
+ trailing: "_trailing_1vd78_104",
6575
+ rowAction: "_rowAction_1vd78_114",
6576
+ current: "_current_1vd78_127",
6577
+ field: "_field_1vd78_134",
6578
+ searchIcon: "_searchIcon_1vd78_151",
6579
+ search: "_search_1vd78_151"
6580
+ };
6581
+ var WorkspaceRenameDialog_module_default = {
6582
+ dialog: "_dialog_1vye5_1",
6583
+ stack: "_stack_1vye5_5",
6584
+ input: "_input_1vye5_12",
6585
+ meta: "_meta_1vye5_18"
6586
+ };
6587
+ function basenameOf(value) {
6588
+ const trimmed = value.replace(/[/\\]+$/, "");
6589
+ const at = Math.max(trimmed.lastIndexOf("/"), trimmed.lastIndexOf("\\"));
6590
+ return at === -1 ? trimmed : trimmed.slice(at + 1);
6591
+ }
6592
+ function displayNameOf(workspace) {
6593
+ const dir = basenameOf(workspace.path) || workspace.path;
6594
+ const title = workspace.title.trim();
6595
+ return {
6596
+ dir,
6597
+ name: title !== "" && title !== dir && title !== "default-workspace" ? title : ""
6598
+ };
6599
+ }
6600
+ function matchWorkspaces(items, query) {
6601
+ const needle = query.trim().toLowerCase();
6602
+ if (needle === "") return [...items];
6603
+ return items.filter((workspace) => {
6604
+ const { dir, name } = displayNameOf(workspace);
6605
+ return `${dir} ${name} ${workspace.path}`.toLowerCase().includes(needle);
6606
+ });
6607
+ }
6608
+ function titleFor(workspace, draft) {
6609
+ const trimmed = draft.trim();
6610
+ if (trimmed === "") return basenameOf(workspace.path) || workspace.path;
6611
+ return trimmed;
6612
+ }
6613
+ function nameTooLong(draft) {
6614
+ return draft.trim().length > 20;
6615
+ }
6616
+ //#endregion
6617
+ //#region src/app/layouts/sidebar/WorkspaceRenameDialog.tsx
6618
+ function WorkspaceRenameDialog({ workspace, t, onClose, onSubmit }) {
6619
+ const [draft, setDraft] = useState(() => displayNameOf(workspace).name);
6620
+ const [busy, setBusy] = useState(false);
6621
+ const [failed, setFailed] = useState(false);
6622
+ const dir = displayNameOf(workspace).dir;
6623
+ const tooLong = nameTooLong(draft);
6624
+ const save = () => {
6625
+ if (busy || tooLong) return;
6626
+ setBusy(true);
6627
+ setFailed(false);
6628
+ onSubmit(titleFor(workspace, draft)).then((ok) => {
6629
+ setBusy(false);
6630
+ if (ok) onClose();
6631
+ else setFailed(true);
6632
+ });
6633
+ };
6634
+ return /* @__PURE__ */ h(Modal, {
6635
+ open: true,
6636
+ onClose: () => {
6637
+ if (!busy) onClose();
6638
+ },
6639
+ title: t("project.rename.title", { name: dir }),
6640
+ description: t("project.rename.description"),
6641
+ closeLabel: t("project.rename.cancel"),
6642
+ className: WorkspaceRenameDialog_module_default.dialog,
6643
+ footer: /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(Button, {
6644
+ type: "button",
6645
+ variant: "outline",
6646
+ size: "md",
6647
+ disabled: busy,
6648
+ onClick: onClose
6649
+ }, t("project.rename.cancel")), /* @__PURE__ */ h(Button, {
6650
+ type: "button",
6651
+ variant: "primary",
6652
+ size: "md",
6653
+ disabled: busy || tooLong,
6654
+ "aria-busy": busy,
6655
+ onClick: save
6656
+ }, t(busy ? "project.rename.saving" : "project.rename.save")))
6657
+ }, /* @__PURE__ */ h("div", { className: WorkspaceRenameDialog_module_default.stack }, /* @__PURE__ */ h(TextField, {
6658
+ className: WorkspaceRenameDialog_module_default.input,
6659
+ "data-modal-autofocus": "",
6660
+ id: "wb-workspace-name",
6661
+ name: "wb-workspace-name",
6662
+ "aria-label": t("project.rename.field"),
6663
+ "aria-invalid": tooLong ? "true" : void 0,
6664
+ placeholder: t("project.rename.placeholder"),
6665
+ maxLength: 40,
6666
+ value: draft,
6667
+ onChange: (event) => setDraft(event.currentTarget.value),
6668
+ onKeyDown: (event) => {
6669
+ if (event.key !== "Enter" || event.nativeEvent.isComposing) return;
6670
+ event.preventDefault();
6671
+ save();
6672
+ }
6673
+ }), /* @__PURE__ */ h("div", { className: WorkspaceRenameDialog_module_default.meta }, /* @__PURE__ */ h(Note, { as: "span" }, t("project.rename.hint")), /* @__PURE__ */ h(Note, {
6674
+ as: "span",
6675
+ tone: tooLong ? "problem" : "muted"
6676
+ }, `${draft.trim().length}/20`)), failed ? /* @__PURE__ */ h(Note, { tone: "problem" }, t("project.rename.failed")) : null));
6677
+ }
6678
+ //#endregion
6679
+ //#region src/app/layouts/sidebar/WorkspaceSearchField.tsx
6680
+ function WorkspaceSearchField({ t, query, onQuery, onCursor, onSubmit }) {
6681
+ const boxRef = useRef(null);
6682
+ useEffect(() => {
6683
+ boxRef.current?.querySelector("input")?.focus();
6684
+ }, []);
6685
+ return /* @__PURE__ */ h("span", {
6686
+ ref: boxRef,
6687
+ className: ProjectSwitcher_module_default.field
6688
+ }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.searchIcon }, /* @__PURE__ */ h(IconSearchOutlineRegular, { size: 14 })), /* @__PURE__ */ h(TextField, {
6689
+ className: ProjectSwitcher_module_default.search,
6690
+ id: "wb-workspace-search",
6691
+ name: "wb-workspace-search",
6692
+ "aria-label": t("project.search.label"),
6693
+ placeholder: t("project.search.placeholder"),
6694
+ value: query,
6695
+ onChange: (event) => onQuery(event.currentTarget.value),
6696
+ onKeyDown: (event) => {
6697
+ if (event.nativeEvent.isComposing) return;
6698
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
6699
+ event.stopPropagation();
6700
+ event.preventDefault();
6701
+ onCursor(event.key === "ArrowDown" ? 1 : -1);
6702
+ return;
6703
+ }
6704
+ if (event.key !== "Enter") return;
6705
+ event.stopPropagation();
6706
+ onSubmit();
6707
+ }
6708
+ }));
6709
+ }
6710
+ //#endregion
6711
+ //#region src/app/layouts/sidebar/WorkspaceRowAction.tsx
6712
+ function WorkspaceRowAction({ workspace, t, onEdit }) {
6713
+ return /* @__PURE__ */ h(Button, {
6714
+ type: "button",
6715
+ variant: "ghost",
6716
+ size: "sm",
6717
+ className: ProjectSwitcher_module_default.rowAction,
6718
+ icon: /* @__PURE__ */ h(IconEditOutlineRegular, { size: 14 }),
6719
+ "aria-label": t("project.rename.row", { name: displayNameOf(workspace).dir }),
6720
+ onClick: (event) => {
6721
+ event.stopPropagation();
6722
+ onEdit();
6723
+ }
6724
+ });
6725
+ }
6726
+ //#endregion
6727
+ //#region src/app/layouts/sidebar/WorkspaceRowLabel.tsx
6728
+ function WorkspaceRowLabel({ workspace, current, action, onHover }) {
6729
+ const { dir, name } = displayNameOf(workspace);
6730
+ const hostRef = useRef(null);
6731
+ const hoverRef = useRef(onHover);
6732
+ useEffect(() => {
6733
+ hoverRef.current = onHover;
6734
+ });
6735
+ useEffect(() => {
6736
+ const row = hostRef.current?.closest("[role=\"menuitem\"]");
6737
+ if (row === null || row === void 0) return;
6738
+ const enter = () => hoverRef.current?.(true);
6739
+ const leave = () => hoverRef.current?.(false);
6740
+ row.addEventListener("mouseenter", enter);
6741
+ row.addEventListener("mouseleave", leave);
6742
+ return () => {
6743
+ row.removeEventListener("mouseenter", enter);
6744
+ row.removeEventListener("mouseleave", leave);
6745
+ };
6746
+ }, []);
6747
+ return /* @__PURE__ */ h("span", {
6748
+ ref: hostRef,
6749
+ className: ProjectSwitcher_module_default.row
6750
+ }, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ h("span", {
6751
+ className: ProjectSwitcher_module_default.name,
6752
+ title: name
6753
+ }, name), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.trailing }, action ?? (current ? /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.current }, /* @__PURE__ */ h(IconCheckOutlineRegular, { size: 12 })) : null)));
6754
+ }
6755
+ //#endregion
6756
+ //#region src/app/layouts/sidebar/workspace-items.tsx
6757
+ function workspaceMenuItems(options) {
6758
+ const { results, currentId, hoverId, t, onHover, onEdit } = options;
6759
+ return results.map((workspace) => ({
6760
+ id: workspace.workspaceId,
6761
+ icon: /* @__PURE__ */ h(IconFolderOpenRegular, { size: 16 }),
6762
+ label: /* @__PURE__ */ h(WorkspaceRowLabel, {
6763
+ workspace,
6764
+ current: workspace.workspaceId === currentId,
6765
+ onHover: (hovering) => onHover(hovering ? workspace.workspaceId : null),
6766
+ action: hoverId === workspace.workspaceId ? /* @__PURE__ */ h(WorkspaceRowAction, {
6767
+ workspace,
6768
+ t,
6769
+ onEdit: () => onEdit(workspace)
6770
+ }) : void 0
6771
+ })
6772
+ }));
6773
+ }
6244
6774
  //#endregion
6245
6775
  //#region src/app/layouts/sidebar/ProjectSwitcher.tsx
6246
6776
  var ADD_WORKSPACE_ID = "__wb-add-workspace__";
6247
- function ProjectSwitcher({ items, current, workspaceTitle, onPick, onAdd, t }) {
6777
+ function triggerName(current, t) {
6778
+ if (current === null) return t("project.none");
6779
+ const { dir, name } = displayNameOf(current);
6780
+ return /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.dir }, dir), name === "" ? null : /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.name }, name));
6781
+ }
6782
+ function ProjectSwitcher({ items, current, onPick, onAdd, onRename, t }) {
6248
6783
  const [open, setOpen] = useState(false);
6784
+ const [query, setQuery] = useState("");
6785
+ const [cursor, setCursor] = useState(null);
6786
+ const [hoverId, setHoverId] = useState(null);
6787
+ const [naming, setNaming] = useState(null);
6249
6788
  const triggerRef = useRef(null);
6250
- const title = current ? workspaceTitle(current.title) : t("project.none");
6789
+ const wasOpenRef = useRef(false);
6251
6790
  const currentId = current?.workspaceId ?? null;
6252
- const trigger = /* @__PURE__ */ h("button", {
6791
+ const results = useMemo(() => matchWorkspaces(items, query), [items, query]);
6792
+ const cursorId = cursor === null || results.length === 0 ? null : results[Math.min(cursor, results.length - 1)]?.workspaceId ?? null;
6793
+ useEffect(() => {
6794
+ if (open) {
6795
+ wasOpenRef.current = true;
6796
+ return;
6797
+ }
6798
+ setQuery("");
6799
+ setCursor(null);
6800
+ setHoverId(null);
6801
+ if (wasOpenRef.current && naming === null) {
6802
+ wasOpenRef.current = false;
6803
+ triggerRef.current?.focus();
6804
+ }
6805
+ }, [open, naming]);
6806
+ const close = () => setOpen(false);
6807
+ const anchor = open ? /* @__PURE__ */ h(WorkspaceSearchField, {
6808
+ t,
6809
+ query,
6810
+ onQuery: (next) => {
6811
+ setQuery(next);
6812
+ setCursor(null);
6813
+ },
6814
+ onCursor: (step) => {
6815
+ if (results.length === 0) return;
6816
+ setCursor((at) => at === null ? step === 1 ? 0 : results.length - 1 : (at + step + results.length) % results.length);
6817
+ },
6818
+ onSubmit: () => {
6819
+ const pick = results[Math.min(cursor ?? 0, results.length - 1)];
6820
+ if (pick === void 0) return;
6821
+ close();
6822
+ onPick(pick.workspaceId);
6823
+ }
6824
+ }) : /* @__PURE__ */ h("button", {
6253
6825
  type: "button",
6254
6826
  ref: triggerRef,
6255
- className: "wb-projectButton",
6827
+ className: ProjectSwitcher_module_default.trigger,
6256
6828
  "aria-haspopup": "listbox",
6257
6829
  "aria-expanded": open,
6258
6830
  "aria-label": t("project.label"),
6259
- title: current ? current.path : title,
6260
- onClick: () => {
6261
- document.documentElement.style.setProperty("--wb-project-menu-min-width", `${Math.round(triggerRef.current?.getBoundingClientRect().width ?? 0)}px`);
6262
- setOpen((value) => !value);
6263
- }
6264
- }, /* @__PURE__ */ h("span", { className: "wb-projectGlyph wb-projectGlyphActive" }, open ? /* @__PURE__ */ h(IconFolderOpenRegular, { size: 16 }) : /* @__PURE__ */ h(IconFolderCloseRegular, { size: 16 })), /* @__PURE__ */ h("span", { className: "wb-projectName" }, title), /* @__PURE__ */ h("span", { className: cx("wb-projectChevron", open && "wb-projectChevronOpen") }, /* @__PURE__ */ h(IconChevronDownOutlineRegular, { size: 14 })));
6265
- return /* @__PURE__ */ h("div", { className: "wb-project" }, /* @__PURE__ */ h(Menu, {
6831
+ title: current?.path ?? void 0,
6832
+ onClick: () => setOpen(true)
6833
+ }, /* @__PURE__ */ h("span", { className: cx(ProjectSwitcher_module_default.glyph, ProjectSwitcher_module_default.glyphActive) }, /* @__PURE__ */ h(IconFolderCloseRegular, { size: 16 })), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.triggerName }, triggerName(current, t)), /* @__PURE__ */ h("span", { className: ProjectSwitcher_module_default.chevron }, /* @__PURE__ */ h(IconChevronDownOutlineRegular, { size: 14 })));
6834
+ return /* @__PURE__ */ h("div", { className: ProjectSwitcher_module_default.root }, /* @__PURE__ */ h(Menu, {
6266
6835
  open,
6267
6836
  portal: true,
6268
- className: "wb-projectAnchor",
6269
- anchor: trigger,
6837
+ className: ProjectSwitcher_module_default.anchor,
6838
+ listClassName: ProjectSwitcher_module_default.menu,
6839
+ anchor,
6270
6840
  align: "start",
6271
6841
  side: "bottom",
6272
- selection: "check",
6273
- selectedId: currentId ?? void 0,
6274
- items: [...items.length === 0 ? [{
6842
+ selection: "fill",
6843
+ selectedId: cursorId ?? void 0,
6844
+ items: [...results.length === 0 ? [{
6275
6845
  type: "label",
6276
6846
  id: "empty",
6277
- text: t("project.empty")
6278
- }] : [], ...items.map((workspace) => ({
6279
- id: workspace.workspaceId,
6280
- label: workspaceTitle(workspace.title),
6281
- icon: /* @__PURE__ */ h(IconFolderCloseRegular, { size: 16 })
6282
- }))],
6847
+ text: t("project.search.empty", { query: query.trim() })
6848
+ }] : [], ...workspaceMenuItems({
6849
+ results,
6850
+ currentId,
6851
+ hoverId,
6852
+ t,
6853
+ onHover: setHoverId,
6854
+ onEdit: (workspace) => {
6855
+ close();
6856
+ setNaming(workspace);
6857
+ }
6858
+ })],
6283
6859
  footer: [{
6284
6860
  id: ADD_WORKSPACE_ID,
6285
6861
  label: t("project.add"),
6286
6862
  icon: /* @__PURE__ */ h(IconPlusOutlineRegular, { size: 14 })
6287
6863
  }],
6288
6864
  onSelect: (id) => {
6289
- setOpen(false);
6290
6865
  if (id === ADD_WORKSPACE_ID) {
6866
+ close();
6291
6867
  onAdd();
6292
6868
  return;
6293
6869
  }
6870
+ close();
6294
6871
  onPick(id);
6295
6872
  },
6296
- onClose: () => setOpen(false)
6873
+ onClose: close
6874
+ }), naming === null ? null : /* @__PURE__ */ h(WorkspaceRenameDialog, {
6875
+ key: naming.workspaceId,
6876
+ workspace: naming,
6877
+ t,
6878
+ onClose: () => setNaming(null),
6879
+ onSubmit: (title) => onRename(naming.workspaceId, title)
6297
6880
  }));
6298
6881
  }
6299
6882
  //#endregion
@@ -6443,9 +7026,9 @@ function Sidebar(props) {
6443
7026
  }))), wide ? /* @__PURE__ */ h(ProjectSwitcher, {
6444
7027
  items,
6445
7028
  current,
6446
- workspaceTitle: props.workspaceDisplayTitle,
6447
7029
  onPick: pickProject,
6448
7030
  onAdd: addProject,
7031
+ onRename: props.renameWorkspace,
6449
7032
  t
6450
7033
  }) : null, /* @__PURE__ */ h(WorkspaceSection, {
6451
7034
  t,
@@ -6894,12 +7477,12 @@ var kit = {
6894
7477
  }
6895
7478
  };
6896
7479
  function messagesOf(units) {
6897
- return mergeMessages(dictionaries, units.map((face) => ({
7480
+ return units.map((face) => ({
6898
7481
  unit: face.manifest.id,
6899
7482
  ...face.messages === void 0 ? {} : { messages: face.messages }
6900
- })));
7483
+ }));
6901
7484
  }
6902
- 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 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-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-len-20);\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-cardRefresh.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\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);\n}\n.wb-cardBody > :not([data-wb-bleed]) {\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-8);\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: transparent;\n}\n\n.wb-choiceOption {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-30);\n padding: var(--wb-len-6) 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-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\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 opacity: 0.5;\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}\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 display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n color: var(--dsw-alias-label-secondary);\n text-decoration: none;\n white-space: nowrap;\n}\n.wb-longTaskLink:hover,\n.wb-longTaskLink:focus-visible {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n.wb-longTaskLink: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-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.wb-mockStrip {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-12);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n flex: none;\n}\n\n.wb-mockNote {\n flex: 1 0 100%;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-mockChip {\n flex: none;\n padding: var(--wb-len-2) var(--wb-len-7);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: transparent;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-mockChip:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-mockChipOn {\n border-color: transparent;\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-label-primary-foreground);\n}\n.wb-note {\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-problem {\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-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\n.wb-row:has(> [data-wb-dot]) {\n grid-template-columns: 84px minmax(0, 1fr);\n}\n.wb-rows {\n display: flex;\n flex-direction: column;\n}\n.wb-row {\n display: grid;\n grid-template-columns: 56px 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 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-formActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.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-xxs-12-font-size);\n line-height: var(--wb-line-18);\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.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[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._foot_1us83_1 {\n display: flex;\n align-items: center;\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_1us83_12 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1us83_17 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_7yq35_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 max-height: var(--wb-len-320);\n overflow-y: auto;\n}\n\n._marketRow_7yq35_12 {\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_7yq35_22 {\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_7yq35_34 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_7yq35_41 {\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_7yq35_50 {\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_7yq35_61 {\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_7yq35_61::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_7yq35_41 ._marketVersion_7yq35_75 {\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_7yq35_75 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_7yq35_75::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._marketEnd_7yq35_97 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._marketActions_7yq35_104 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketSection_7yq35_110 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_7yq35_117 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionTitle_7yq35_123 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_7yq35_129 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketProgress_7yq35_135 {\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_7yq35_145 {\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._marketFailure_7yq35_152 {\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_7yq35_159 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_7yq35_164 {\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: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_7yq35_164 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_7yq35_181 {\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_7yq35_189 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_7yq35_194 {\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_7yq35_200 {\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_7yq35_209 {\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_7yq35_209:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_7yq35_209:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_7yq35_234 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_7yq35_238 svg {\n animation: _wb-spin_7yq35_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_7yq35_242 {\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_7yq35_159 {\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_7yq35_259 {\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_7yq35_267 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_7yq35_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._wide_1coeb_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_1coeb_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1coeb_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1coeb_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1coeb_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1coeb_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_1coeb_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1coeb_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_1coeb_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_1coeb_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_1coeb_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1coeb_59 svg,\n._registryToggle_1coeb_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1coeb_59[aria-expanded='true'] svg,\n._registryToggle_1coeb_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1coeb_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1coeb_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_1coeb_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1coeb_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1coeb_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1coeb_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1coeb_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_1coeb_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_1coeb_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1coeb_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1coeb_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1coeb_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1coeb_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1coeb_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1coeb_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1coeb_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1coeb_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_1coeb_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_1coeb_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1coeb_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1coeb_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_1coeb_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_1coeb_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_1coeb_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1coeb_343,\n._subjectDesc_1coeb_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_1coeb_351,\n._resultWarn_1coeb_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_1coeb_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._approval_1coeb_365 {\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_1coeb_375 {\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_1coeb_382 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1coeb_388 {\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_1coeb_395 {\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_1coeb_402 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1coeb_406 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1coeb_410 {\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_1coeb_417 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1coeb_417 {\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._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_1weg4_1 {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n._pop_1weg4_7 {\n position: absolute;\n top: calc(100% + var(--wb-len-8));\n right: 0;\n z-index: var(--wb-z-30);\n width: var(--wb-len-360);\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_1weg4_21 {\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_1weg4_29 {\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._reset_1weg4_37 {\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_1weg4_37:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_1weg4_37:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_1weg4_59 {\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_1weg4_68 {\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: grab;\n}\n\n._row_1weg4_68:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOver_1weg4_83::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_1weg4_93 {\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_1weg4_108 {\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}\n\n._label_1weg4_116 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_1weg4_123 {\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_1weg4_134 {\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_1weg4_142 {\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._panel_1oyh4_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_1oyh4_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1oyh4_1[data-open] {\n visibility: visible;\n}\n._blocker_cfaak_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_cfaak_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_cfaak_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_cfaak_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_cfaak_1._blockerInline_cfaak_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_cfaak_1._blockerInline_cfaak_32 ._title_cfaak_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._hint_cfaak_23 {\n max-width: 100%;\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._actions_cfaak_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._raw_cfaak_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_cfaak_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_cfaak_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_cfaak_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_cfaak_71._noticeFlat_cfaak_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_cfaak_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_cfaak_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_cfaak_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_cfaak_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_cfaak_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_cfaak_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._inlineLink_cfaak_134 {\n margin-left: var(--wb-len-2);\n padding: 0;\n border: none;\n background: transparent;\n font: inherit;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n vertical-align: baseline;\n}\n\n._inlineLink_cfaak_134:hover {\n text-decoration: underline;\n}\n\n._inlineLink_cfaak_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n._rawText_cfaak_156 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
7485
+ 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 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-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\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-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-len-20);\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-cardRefresh.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\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);\n}\n.wb-cardBody > :not([data-wb-bleed]) {\n padding-left: var(--wb-len-8);\n padding-right: var(--wb-len-8);\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: transparent;\n}\n\n.wb-choiceOption {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-30);\n padding: var(--wb-len-6) 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-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\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 opacity: 0.5;\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}\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 display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n color: var(--dsw-alias-label-secondary);\n text-decoration: none;\n white-space: nowrap;\n}\n.wb-longTaskLink:hover,\n.wb-longTaskLink:focus-visible {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n.wb-longTaskLink: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-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.wb-mockStrip {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-12);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n flex: none;\n}\n\n.wb-mockNote {\n flex: 1 0 100%;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-mockChip {\n flex: none;\n padding: var(--wb-len-2) var(--wb-len-7);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: transparent;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-14);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n.wb-mockChip:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-mockChipOn {\n border-color: transparent;\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-label-primary-foreground);\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\n.wb-row:has(> [data-wb-dot]) {\n grid-template-columns: 84px minmax(0, 1fr);\n}\n.wb-rows {\n display: flex;\n flex-direction: column;\n}\n.wb-row {\n display: grid;\n grid-template-columns: 56px 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 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-formActions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n}\n.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-1);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.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-xxs-12-font-size);\n line-height: var(--wb-line-18);\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.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[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._marketList_7yq35_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 max-height: var(--wb-len-320);\n overflow-y: auto;\n}\n\n._marketRow_7yq35_12 {\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_7yq35_22 {\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_7yq35_34 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_7yq35_41 {\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_7yq35_50 {\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_7yq35_61 {\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_7yq35_61::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_7yq35_41 ._marketVersion_7yq35_75 {\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_7yq35_75 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_7yq35_75::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._marketEnd_7yq35_97 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._marketActions_7yq35_104 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketSection_7yq35_110 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_7yq35_117 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionTitle_7yq35_123 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_7yq35_129 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketProgress_7yq35_135 {\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_7yq35_145 {\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._marketFailure_7yq35_152 {\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_7yq35_159 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_7yq35_164 {\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: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_7yq35_164 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_7yq35_181 {\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_7yq35_189 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_7yq35_194 {\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_7yq35_200 {\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_7yq35_209 {\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_7yq35_209:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_7yq35_209:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_7yq35_234 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_7yq35_238 svg {\n animation: _wb-spin_7yq35_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_7yq35_242 {\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_7yq35_159 {\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_7yq35_259 {\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_7yq35_267 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_7yq35_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1us83_1 {\n display: flex;\n align-items: center;\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_1us83_12 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1us83_17 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1coeb_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_1coeb_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1coeb_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1coeb_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1coeb_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1coeb_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_1coeb_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1coeb_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_1coeb_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_1coeb_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_1coeb_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1coeb_59 svg,\n._registryToggle_1coeb_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1coeb_59[aria-expanded='true'] svg,\n._registryToggle_1coeb_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1coeb_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1coeb_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_1coeb_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1coeb_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1coeb_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1coeb_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1coeb_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_1coeb_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_1coeb_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1coeb_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_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_1coeb_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1coeb_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1coeb_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1coeb_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1coeb_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1coeb_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1coeb_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1coeb_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_1coeb_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_1coeb_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1coeb_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1coeb_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_1coeb_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_1coeb_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_1coeb_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1coeb_343,\n._subjectDesc_1coeb_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_1coeb_351,\n._resultWarn_1coeb_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_1coeb_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._approval_1coeb_365 {\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_1coeb_375 {\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_1coeb_382 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1coeb_388 {\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_1coeb_395 {\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_1coeb_402 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1coeb_406 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1coeb_410 {\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_1coeb_417 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1coeb_417 {\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._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_1weg4_1 {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n._pop_1weg4_7 {\n position: absolute;\n top: calc(100% + var(--wb-len-8));\n right: 0;\n z-index: var(--wb-z-30);\n width: var(--wb-len-360);\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_1weg4_21 {\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_1weg4_29 {\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._reset_1weg4_37 {\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_1weg4_37:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_1weg4_37:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_1weg4_59 {\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_1weg4_68 {\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: grab;\n}\n\n._row_1weg4_68:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOver_1weg4_83::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_1weg4_93 {\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_1weg4_108 {\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}\n\n._label_1weg4_116 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_1weg4_123 {\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_1weg4_134 {\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_1weg4_142 {\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._panel_1oyh4_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_1oyh4_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_1oyh4_1[data-open] {\n visibility: visible;\n}\n._root_1vd78_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._anchor_1vd78_7 {\n display: block;\n width: 100%;\n}\n\n._menu_1vd78_12 {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n}\n\n._trigger_1vd78_17 {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n border-radius: var(--dsw-radius-md);\n background: transparent;\n color: var(--dsw-alias-label-primary);\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n._trigger_1vd78_17:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._trigger_1vd78_17: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}\n\n._glyph_1vd78_44 {\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_1vd78_54 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1vd78_58 {\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_1vd78_69 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1vd78_77 {\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_1vd78_58 ._name_1vd78_77 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._chevron_1vd78_90 {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n._row_1vd78_96 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1vd78_104 {\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_1vd78_104 ._rowAction_1vd78_114 {\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_1vd78_96 ._name_1vd78_77 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1vd78_127 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n\n._field_1vd78_134 {\n display: flex;\n align-items: center;\n gap: var(--wb-gap-xs);\n box-sizing: border-box;\n width: 100%;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._field_1vd78_134:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n}\n\n._searchIcon_1vd78_151 {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._field_1vd78_134 ._search_1vd78_151 {\n flex: 1;\n min-width: 0;\n height: var(--wb-len-24);\n border: none;\n background: transparent;\n}\n\n._field_1vd78_134 ._search_1vd78_151:focus {\n border-color: transparent;\n box-shadow: none;\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_cfaak_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_cfaak_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_cfaak_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_cfaak_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_cfaak_1._blockerInline_cfaak_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_cfaak_1._blockerInline_cfaak_32 ._title_cfaak_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._hint_cfaak_23 {\n max-width: 100%;\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._actions_cfaak_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_cfaak_1._blockerInline_cfaak_32 ._raw_cfaak_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_cfaak_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_cfaak_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_cfaak_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_cfaak_71._noticeFlat_cfaak_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_cfaak_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_cfaak_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_cfaak_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_cfaak_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_cfaak_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_cfaak_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._inlineLink_cfaak_134 {\n margin-left: var(--wb-len-2);\n padding: 0;\n border: none;\n background: transparent;\n font: inherit;\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n vertical-align: baseline;\n}\n\n._inlineLink_cfaak_134:hover {\n text-decoration: underline;\n}\n\n._inlineLink_cfaak_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n._rawText_cfaak_156 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
6903
7486
  function installStyles() {
6904
7487
  const style = document.createElement("style");
6905
7488
  style.setAttribute(STYLE_MARKER, "");
@@ -6959,7 +7542,9 @@ function mount(ctx) {
6959
7542
  let disposeDictionary;
6960
7543
  const publish = () => {
6961
7544
  disposeDictionary?.();
6962
- disposeDictionary = ctx.locale.register(LOCALE_NS, messagesOf(units.all()));
7545
+ const { dictionaries: merged, problems } = mergeMessagesSkipping(dictionaries, messagesOf(units.all()));
7546
+ for (const problem of problems) console.warn(`[dsh-workbench] 套件 ${problem.unit} 的文案没并进来(只有它少了这几句):${problem.reason}`);
7547
+ disposeDictionary = ctx.locale.register(LOCALE_NS, merged);
6963
7548
  };
6964
7549
  publish();
6965
7550
  const unsubscribe = units.subscribe(publish);
@@ -7111,7 +7696,14 @@ function mount(ctx) {
7111
7696
  inject: () => ({
7112
7697
  listPanels: () => readPanels(ctx),
7113
7698
  subscribePanels: (callback) => ctx.slots.subscribe("sidebar.panellist", callback),
7114
- workspaceDisplayTitle: (title) => title === "default-workspace" ? ctx.locale.bind("common")("workspace.defaultName") : title,
7699
+ renameWorkspace: async (workspaceId, title) => {
7700
+ try {
7701
+ await ctx.workspaces.rename(workspaceId, title);
7702
+ return true;
7703
+ } catch {
7704
+ return false;
7705
+ }
7706
+ },
7115
7707
  openWorkspace: (workspaceId) => {
7116
7708
  ctx.uiWorkspace.openWorkspace(workspaceId);
7117
7709
  },