@dsh-workbench/core 0.2.11 → 0.2.13

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.
@@ -464,11 +464,6 @@ function probeKeyOf(error) {
464
464
  if (error === void 0) return null;
465
465
  return error.code === "" ? "unknown" : error.code;
466
466
  }
467
- //#endregion
468
- //#region ../shared/dist/api/unit.js
469
- function hasEnvSupply(manifest) {
470
- return (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0;
471
- }
472
467
  var SUPPORTED_API_VERSIONS = [1];
473
468
  var DECLARATION_KEYS = [
474
469
  "apiVersion",
@@ -597,6 +592,11 @@ function readDeclaration(subject, raw) {
597
592
  };
598
593
  }
599
594
  //#endregion
595
+ //#region ../shared/dist/api/unit.js
596
+ function hasEnvSupply(manifest) {
597
+ return (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0;
598
+ }
599
+ //#endregion
600
600
  //#region ../shared/dist/config/constants.js
601
601
  var PLUGIN_ID = "@dsh-workbench/core";
602
602
  var RELEASE_SIBLINGS = ["@dsh-workbench/shared", "@dsh-workbench/module-tools"];
@@ -894,13 +894,26 @@ function CardAnchor({ unit, children }) {
894
894
  }, children);
895
895
  }
896
896
  //#endregion
897
+ //#region ../shared/dist/components/Spinner.js
898
+ function Spinner({ size = 14, label }) {
899
+ return h("span", {
900
+ className: "wb-spinner",
901
+ ...label === void 0 ? { "aria-hidden": true } : {
902
+ role: "status",
903
+ "aria-label": label
904
+ }
905
+ }, h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
906
+ state: "ongoing",
907
+ size
908
+ }));
909
+ }
910
+ //#endregion
897
911
  //#region ../shared/dist/components/ChoiceGroup.js
898
912
  function ChoiceMenu(input) {
899
- return h("div", {
900
- className: "wb-choiceMenu",
901
- role: input.multi ? "group" : "radiogroup",
902
- "aria-label": input.label
903
- }, input.options.map((option) => {
913
+ const body = input.loading ? h("span", {
914
+ className: "wb-choiceLoading",
915
+ role: "status"
916
+ }, h(Spinner, { size: 14 }), h("span", { className: "wb-choiceLoadingText" }, input.loadingText ?? "…")) : input.options.length === 0 ? input.emptyText === void 0 ? null : h("span", { className: "wb-choiceEmpty" }, input.emptyText) : input.options.map((option) => {
904
917
  const row = input.rowOf(option.value);
905
918
  return h(Fragment, { key: option.value }, h("label", { className: `wb-choiceOption${row.checked ? " wb-choiceOptionOn" : ""}` }, h("input", {
906
919
  className: input.multi ? "wb-checkbox" : "wb-radio",
@@ -912,15 +925,26 @@ function ChoiceMenu(input) {
912
925
  }), input.multi ? h("span", {
913
926
  className: "wb-checkboxBox",
914
927
  "aria-hidden": "true"
915
- }, row.checked ? h(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 12 }) : null) : null, h("span", { className: "wb-choiceLabel" }, option.label)));
916
- }));
928
+ }, row.checked ? h(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutlineRegular, { size: 12 }) : null) : null, h("span", { className: "wb-choiceLabel" }, h("span", { className: "wb-choiceLabelText" }, option.label), option.description === void 0 ? null : h("span", { className: "wb-choiceDescription" }, option.description))));
929
+ });
930
+ return h("div", {
931
+ className: "wb-choiceMenu",
932
+ "data-variant": input.variant,
933
+ role: input.multi ? "group" : "radiogroup",
934
+ "aria-label": input.label,
935
+ "aria-busy": input.loading ? true : void 0
936
+ }, body);
917
937
  }
918
938
  function ChoiceGroup(props) {
919
939
  const common = {
920
940
  label: props.label,
921
941
  name: props.name,
922
942
  options: props.options,
923
- disabled: props.disabled === true
943
+ disabled: props.disabled === true,
944
+ variant: props.variant ?? "boxed",
945
+ loading: props.loading === true,
946
+ loadingText: props.loadingText,
947
+ emptyText: props.emptyText
924
948
  };
925
949
  if (props.multi === true) {
926
950
  const values = props.values;
@@ -931,6 +955,10 @@ function ChoiceGroup(props) {
931
955
  options: common.options,
932
956
  disabled: common.disabled,
933
957
  multi: true,
958
+ variant: common.variant,
959
+ loading: common.loading,
960
+ loadingText: common.loadingText,
961
+ emptyText: common.emptyText,
934
962
  rowOf: (value) => ({
935
963
  checked: values.includes(value),
936
964
  onSelect: () => {
@@ -947,6 +975,10 @@ function ChoiceGroup(props) {
947
975
  options: common.options,
948
976
  disabled: common.disabled,
949
977
  multi: false,
978
+ variant: common.variant,
979
+ loading: common.loading,
980
+ loadingText: common.loadingText,
981
+ emptyText: common.emptyText,
950
982
  rowOf: (option) => ({
951
983
  checked: option === value,
952
984
  onSelect: () => {
@@ -956,6 +988,23 @@ function ChoiceGroup(props) {
956
988
  });
957
989
  }
958
990
  //#endregion
991
+ //#region ../shared/dist/components/Field.js
992
+ function Field({ label, hint, children }) {
993
+ return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
994
+ }
995
+ //#endregion
996
+ //#region ../shared/dist/components/FormRows.js
997
+ function FormRows({ children }) {
998
+ return h("div", { className: "wb-formRows" }, children);
999
+ }
1000
+ function FormRow({ label, hint, problem, layout = "inline", children }) {
1001
+ return h("label", {
1002
+ className: "wb-formRow",
1003
+ "data-layout": layout,
1004
+ "data-wb-problem": problem === void 0 ? void 0 : ""
1005
+ }, h("span", { className: "wb-formLabel" }, label), h("span", { className: "wb-formControl" }, children), problem === void 0 ? hint === void 0 ? null : h("span", { className: "wb-formHint" }, hint) : h("span", { className: "wb-formProblem" }, problem));
1006
+ }
1007
+ //#endregion
959
1008
  //#region ../shared/dist/components/Link.js
960
1009
  function Link({ href, children, title, external = true, className }) {
961
1010
  return h("a", {
@@ -1023,20 +1072,6 @@ function LongTaskRow(props) {
1023
1072
  }))));
1024
1073
  }
1025
1074
  //#endregion
1026
- //#region ../shared/dist/components/MockStrip.js
1027
- function MockStrip({ mocks, index, onPick, note, real }) {
1028
- return h("div", { className: "wb-mockStrip" }, h("span", { className: "wb-mockNote" }, note ?? "夹具:只切状态,不发请求"), real === void 0 ? null : h("button", {
1029
- type: "button",
1030
- className: `wb-mockChip${real.active ? " wb-mockChipOn" : ""}`,
1031
- onClick: real.onPick
1032
- }, real.label), mocks.map((mock, at) => h("button", {
1033
- key: mock.id,
1034
- type: "button",
1035
- className: `wb-mockChip${at === index ? " wb-mockChipOn" : ""}`,
1036
- onClick: () => onPick(at)
1037
- }, mock.label)));
1038
- }
1039
- //#endregion
1040
1075
  //#region ../shared/dist/components/ResourceStates.js
1041
1076
  function SkeletonRows({ rows = 4 }) {
1042
1077
  return h("div", {
@@ -1089,20 +1124,6 @@ function SaveBar({ busy, disabled, labels, onCancel, onSave }) {
1089
1124
  }, busy ? labels.saving : labels.save));
1090
1125
  }
1091
1126
  //#endregion
1092
- //#region ../shared/dist/components/SettingsSection.js
1093
- function SettingsSection({ label, title, action, children }) {
1094
- return h("section", {
1095
- className: "wb-settings",
1096
- role: "group",
1097
- "aria-label": label
1098
- }, h("header", { className: "wb-settingsHead" }, h("span", { className: "wb-settingsTitle" }, title), action), children);
1099
- }
1100
- //#endregion
1101
- //#region ../shared/dist/components/Field.js
1102
- function Field({ label, hint, children }) {
1103
- return h("label", { className: "wb-field" }, h("span", { className: "wb-fieldLabel" }, label), children, hint === void 0 ? null : h("span", { className: "wb-fieldHint" }, hint));
1104
- }
1105
- //#endregion
1106
1127
  //#region ../shared/dist/components/TextField.js
1107
1128
  function TextField({ invalid = false, className, ...rest }) {
1108
1129
  return h("input", {
@@ -1134,6 +1155,7 @@ function triggerNode(args) {
1134
1155
  disabled: args.disabled,
1135
1156
  "aria-haspopup": "listbox",
1136
1157
  "aria-expanded": args.open,
1158
+ "aria-invalid": args.invalid || void 0,
1137
1159
  "aria-label": args.ariaLabel,
1138
1160
  title: args.title,
1139
1161
  onClick: args.onOpen
@@ -1146,12 +1168,10 @@ function loadingNode(args) {
1146
1168
  className: `${args.className} wb-selectLoading`,
1147
1169
  disabled: true,
1148
1170
  "aria-busy": "true",
1171
+ "aria-invalid": args.invalid || void 0,
1149
1172
  "aria-label": args.ariaLabel,
1150
1173
  title: args.loadingText
1151
- }, h("span", { className: "wb-selectValue" }, h(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, { active: true }, args.loadingText ?? "…")), h("span", { className: "wb-selectChevron" }, h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1152
- state: "ongoing",
1153
- size: 14
1154
- })));
1174
+ }, h("span", { className: "wb-selectValue" }, h(_deepseek_ai_dsh_client_ui_primitives.TextShimmer, { active: true }, args.loadingText ?? "…")), h("span", { className: "wb-selectChevron" }, h(Spinner, { size: 14 })));
1155
1175
  }
1156
1176
  function searchNode(args) {
1157
1177
  return h("span", {
@@ -1297,7 +1317,7 @@ function useSelectState(props) {
1297
1317
  };
1298
1318
  }
1299
1319
  function SelectField(props) {
1300
- const { value, options, onChange, label, hint, icon, renderValue, placeholder, search = true, searchLabel, searchPlaceholder, footer, onFooter, disabled = false, loading = false, loadingText, fallback, selection = "fill", variant = "boxed", ariaLabel, title, id, name, className, menuClassName } = props;
1320
+ const { value, options, onChange, label, hint, icon, renderValue, placeholder, search = true, searchLabel, searchPlaceholder, footer, onFooter, disabled = false, invalid = false, loading = false, loadingText, fallback, selection = "fill", variant = "boxed", ariaLabel, title, id, name, className, menuClassName } = props;
1301
1321
  const state = useSelectState(props);
1302
1322
  const current = options.find((option) => option.value === value);
1303
1323
  const variantClass = variant === "ghost" ? "wb-selectGhost" : void 0;
@@ -1305,6 +1325,7 @@ function SelectField(props) {
1305
1325
  if (loading) return framed(label, hint, className, loadingNode({
1306
1326
  id,
1307
1327
  className: triggerClass,
1328
+ invalid,
1308
1329
  ariaLabel,
1309
1330
  loadingText
1310
1331
  }));
@@ -1312,6 +1333,7 @@ function SelectField(props) {
1312
1333
  id,
1313
1334
  name,
1314
1335
  className: "wb-selectFallback",
1336
+ invalid,
1315
1337
  "aria-label": ariaLabel,
1316
1338
  value: fallback.value,
1317
1339
  onChange: (event) => fallback.onChange(event.currentTarget.value)
@@ -1320,6 +1342,7 @@ function SelectField(props) {
1320
1342
  id,
1321
1343
  className: triggerClass,
1322
1344
  disabled,
1345
+ invalid,
1323
1346
  open: state.open,
1324
1347
  ariaLabel,
1325
1348
  title,
@@ -1378,6 +1401,15 @@ function SelectField(props) {
1378
1401
  }));
1379
1402
  }
1380
1403
  //#endregion
1404
+ //#region ../shared/dist/components/SettingsSection.js
1405
+ function SettingsSection({ label, title, action, children }) {
1406
+ return h("section", {
1407
+ className: "wb-settings",
1408
+ role: "group",
1409
+ "aria-label": label
1410
+ }, h("header", { className: "wb-settingsHead" }, h("span", { className: "wb-settingsTitle" }, title), action), children);
1411
+ }
1412
+ //#endregion
1381
1413
  //#region ../shared/dist/components/Stack.js
1382
1414
  function Stack({ children }) {
1383
1415
  return h("div", { className: "wb-stack" }, children);
@@ -2499,6 +2531,27 @@ function holdBusy(since, now, floorMs) {
2499
2531
  releaseInMs: left
2500
2532
  };
2501
2533
  }
2534
+ //#endregion
2535
+ //#region ../shared/dist/lib/form-problem.js
2536
+ var PROBLEM_SELECTOR = "[data-wb-problem]";
2537
+ var FOCUSABLE_SELECTOR = [
2538
+ "input:not([disabled])",
2539
+ "select:not([disabled])",
2540
+ "textarea:not([disabled])",
2541
+ "button:not([disabled])",
2542
+ "a[href]",
2543
+ "[tabindex]:not([tabindex=\"-1\"])"
2544
+ ].join(", ");
2545
+ function firstProblemOf(root) {
2546
+ return root.querySelector(PROBLEM_SELECTOR);
2547
+ }
2548
+ function revealFirstProblem(root) {
2549
+ const problem = firstProblemOf(root);
2550
+ if (problem === null) return false;
2551
+ problem.scrollIntoView?.({ block: "nearest" });
2552
+ problem.querySelector(FOCUSABLE_SELECTOR)?.focus?.();
2553
+ return true;
2554
+ }
2502
2555
  var PANEL_STATE_CRASH_WINDOW_MS = 6e5;
2503
2556
  var PANEL_STATE_MAX_TEXT = 2e3;
2504
2557
  var PHASES = [
@@ -2771,6 +2824,8 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2771
2824
  EmptyState: () => EmptyState,
2772
2825
  FACT_SCOPE_SUFFIX: () => "*",
2773
2826
  Field: () => Field,
2827
+ FormRow: () => FormRow,
2828
+ FormRows: () => FormRows,
2774
2829
  Fragment: () => Fragment,
2775
2830
  GIT_TIMEOUT_MS: () => GIT_TIMEOUT_MS,
2776
2831
  HANDOFF_TTL_MS: () => HANDOFF_TTL_MS,
@@ -2789,7 +2844,6 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2789
2844
  Link: () => Link,
2790
2845
  LongTaskRow: () => LongTaskRow,
2791
2846
  MIN_BUSY_MS: () => 500,
2792
- MockStrip: () => MockStrip,
2793
2847
  Note: () => Note,
2794
2848
  OPENCLI_MAX_CONCURRENT: () => 4,
2795
2849
  OPENCLI_PIN: () => OPENCLI_PIN,
@@ -2821,6 +2875,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2821
2875
  SelectField: () => SelectField,
2822
2876
  SettingsSection: () => SettingsSection,
2823
2877
  SkeletonRows: () => SkeletonRows,
2878
+ Spinner: () => Spinner,
2824
2879
  Stack: () => Stack,
2825
2880
  StateBlock: () => StateBlock,
2826
2881
  TextField: () => TextField,
@@ -2851,6 +2906,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2851
2906
  excerpt: () => excerpt,
2852
2907
  factOfRoute: () => factOfRoute,
2853
2908
  filterSelectOptions: () => filterSelectOptions,
2909
+ firstProblemOf: () => firstProblemOf,
2854
2910
  gateOf: () => gateOf,
2855
2911
  h: () => h,
2856
2912
  hasEnvSupply: () => hasEnvSupply,
@@ -2877,6 +2933,7 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2877
2933
  relativeTimeAgo: () => relativeTimeAgo,
2878
2934
  relativeTimeBucket: () => relativeTimeBucket,
2879
2935
  relativeTimeCompact: () => relativeTimeCompact,
2936
+ revealFirstProblem: () => revealFirstProblem,
2880
2937
  runsRouteOf: () => runsRouteOf,
2881
2938
  scopePrefixOf: () => scopePrefixOf,
2882
2939
  searchTextOf: () => searchTextOf,
@@ -3018,10 +3075,10 @@ var silentNextProbe = false;
3018
3075
  function markNextProbeSilent() {
3019
3076
  silentNextProbe = true;
3020
3077
  }
3021
- var probe$2 = NO_PROBE;
3078
+ var probe = NO_PROBE;
3022
3079
  var probeListeners = /* @__PURE__ */ new Set();
3023
3080
  function probeValue() {
3024
- return probe$2;
3081
+ return probe;
3025
3082
  }
3026
3083
  function subscribeProbe(listener) {
3027
3084
  probeListeners.add(listener);
@@ -3030,8 +3087,8 @@ function subscribeProbe(listener) {
3030
3087
  };
3031
3088
  }
3032
3089
  function setProbe(next) {
3033
- if (next === probe$2) return;
3034
- probe$2 = next;
3090
+ if (next === probe) return;
3091
+ probe = next;
3035
3092
  for (const listener of [...probeListeners]) listener();
3036
3093
  }
3037
3094
  var CAPABILITY_FACT = "capability";
@@ -3050,7 +3107,7 @@ function subscribeCapabilities(listener) {
3050
3107
  function setCapabilities(next, rechecked = false) {
3051
3108
  if (next === null) setProbe(NO_PROBE);
3052
3109
  else if (rechecked) setProbe({
3053
- ...probe$2,
3110
+ ...probe,
3054
3111
  checkedAt: Date.now()
3055
3112
  });
3056
3113
  if (next === current$1) return;
@@ -3058,15 +3115,15 @@ function setCapabilities(next, rechecked = false) {
3058
3115
  for (const listener of [...listeners$3]) listener();
3059
3116
  }
3060
3117
  function beginProbe() {
3061
- if (probe$2.checking) return;
3118
+ if (probe.checking) return;
3062
3119
  setProbe({
3063
- ...probe$2,
3120
+ ...probe,
3064
3121
  checking: true
3065
3122
  });
3066
3123
  }
3067
3124
  function endProbe() {
3068
3125
  setProbe({
3069
- ...probe$2,
3126
+ ...probe,
3070
3127
  checking: false
3071
3128
  });
3072
3129
  }
@@ -3162,41 +3219,34 @@ function useCapabilityMap(refreshToken) {
3162
3219
  };
3163
3220
  }
3164
3221
  //#endregion
3165
- //#region src/shared/hooks/mock-mode.ts
3166
- var mock_mode_exports = /* @__PURE__ */ __exportAll({
3167
- crashModeOn: () => crashModeOn,
3168
- mockModeOn: () => mockModeOn
3169
- });
3170
- function mockModeOn(search) {
3171
- return /(?:^|[?&])(?:wbMock|wbMarketMock)=1(?:&|$)/.test(search);
3172
- }
3173
- function crashModeOn(search) {
3174
- return /(?:^|[?&])wbCrash=1(?:&|$)/.test(search);
3175
- }
3176
- //#endregion
3177
- //#region src/shared/hooks/use-fixture-pick.ts
3178
- var use_fixture_pick_exports = /* @__PURE__ */ __exportAll({ useFixturePick: () => useFixturePick });
3179
- function useFixturePick(options) {
3180
- const controlled = options.selected !== void 0 || options.onSelect !== void 0;
3181
- const [ownActive, setOwnActive] = useState(options.initial ?? null);
3182
- const [nonce, setNonce] = useState(0);
3183
- const [on] = useState(() => mockModeOn(window.location.search));
3184
- const enabled = options.enabled ?? on;
3185
- const active = controlled ? options.selected ?? null : ownActive;
3186
- const pick = useCallback((id) => {
3187
- if (!controlled) setOwnActive(id);
3188
- options.onSelect?.(id);
3189
- setNonce((value) => value + 1);
3190
- }, [controlled, options]);
3191
- return {
3192
- enabled,
3193
- active,
3194
- current: options.fixtures.find((fixture) => fixture.id === active),
3195
- pick,
3196
- nonce,
3197
- index: options.fixtures.findIndex((fixture) => fixture.id === active)
3198
- };
3199
- }
3222
+ //#region src/dev/surface.stub.ts
3223
+ var noop = () => void 0;
3224
+ var devSurface = {
3225
+ on: () => false,
3226
+ crash: () => false,
3227
+ useBoard: ({ all }) => ({
3228
+ shape: { kind: "real" },
3229
+ seed: all,
3230
+ strip: () => null,
3231
+ mode: false
3232
+ }),
3233
+ useStrips: () => ({
3234
+ pick: {
3235
+ enabled: false,
3236
+ active: null,
3237
+ current: void 0,
3238
+ nonce: 0,
3239
+ index: 0,
3240
+ pick: noop
3241
+ },
3242
+ current: void 0,
3243
+ enabled: false,
3244
+ strip: null
3245
+ }),
3246
+ addModuleState: (base) => base,
3247
+ gateStrip: () => null,
3248
+ kitModule: null
3249
+ };
3200
3250
  //#endregion
3201
3251
  //#region src/app/layouts/panel-hint.ts
3202
3252
  var hints = /* @__PURE__ */ new Map();
@@ -3277,1182 +3327,130 @@ function holdWindowMs(until) {
3277
3327
  return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
3278
3328
  }
3279
3329
  //#endregion
3280
- //#region src/app/layouts/rightbar/market-installed-mock.ts
3281
- function installedMocks(input) {
3282
- const { id, found, mine, probe } = input;
3283
- return [
3284
- {
3285
- id: "no-supply",
3286
- label: "没有环境依赖的模块(供给是基座命令那种):市场里有它这一行",
3287
- manifests: [found],
3288
- capabilities: probe(id, "ok"),
3289
- installed: [{
3290
- unit: id,
3291
- pkg: "@dsh-workbench/module-one",
3292
- installed: "0.1.2"
3293
- }],
3294
- expect: {
3295
- rows: 1,
3296
- state: "installed",
3297
- actions: ["uninstall"],
3298
- installed: 0,
3299
- shared: 0
3300
- }
3301
- },
3302
- {
3303
- id: "no-card",
3304
- label: "没有卡片的模块(只有基座命令那种):市场里有它这一行,有版本、有「更新」",
3305
- manifests: [{
3306
- ...found,
3307
- card: null
3308
- }],
3309
- capabilities: probe(id, "ok"),
3310
- updates: { [id]: {
3311
- installed: "0.1.2",
3312
- latest: "0.2.0"
3313
- } },
3314
- installed: [{
3315
- unit: id,
3316
- pkg: "@dsh-workbench/module-one",
3317
- installed: "0.1.2"
3318
- }],
3319
- expect: {
3320
- rows: 1,
3321
- state: "outdated",
3322
- actions: ["update-bundle", "uninstall"],
3323
- version: {
3324
- installed: "0.1.2",
3325
- latest: "0.2.0"
3326
- },
3327
- installed: 0,
3328
- shared: 0
3329
- }
3330
- },
3331
- {
3332
- id: "no-env-installed",
3333
- label: "本机装着、又没有依赖要探(DIY 本地那份那种):写「已安装」,不是「状态未知」",
3334
- manifests: [{
3335
- ...found,
3336
- env: void 0
3337
- }],
3338
- capabilities: {},
3339
- updates: { [id]: { installed: "0.1.2" } },
3340
- installed: [{
3341
- unit: id,
3342
- pkg: "@dsh-workbench/module-one",
3343
- installed: "0.1.2"
3344
- }],
3345
- expect: {
3346
- rows: 1,
3347
- state: "installed",
3348
- actions: ["uninstall"],
3349
- version: { installed: "0.1.2" },
3350
- installed: 0
3351
- }
3352
- },
3353
- {
3354
- id: "local-no-update",
3355
- label: "本机那份(link: 装的):有「本地」标记、不给「更新」",
3356
- manifests: [mine],
3357
- capabilities: probe(id, "ok", { plugins: [{
3358
- name: "fixture",
3359
- status: "ok",
3360
- missing: []
3361
- }] }),
3362
- updates: { [id]: {
3363
- installed: "0.1.0",
3364
- local: true
3365
- } },
3366
- installed: [{
3367
- unit: id,
3368
- pkg: "@dsh-workbench/module-one",
3369
- installed: "0.1.0",
3370
- local: true
3371
- }],
3372
- expect: {
3373
- rows: 1,
3374
- state: "installed",
3375
- actions: ["uninstall"],
3376
- local: true,
3377
- version: { installed: "0.1.0" },
3378
- installed: 0
3379
- }
3380
- },
3381
- {
3382
- id: "installed-refused",
3383
- label: "本机装了,但宿主不认它的声明(行上说得出理由)",
3384
- manifests: [],
3385
- capabilities: {},
3386
- installed: [{
3387
- unit: id,
3388
- pkg: "@dsh-workbench/module-one",
3389
- installed: "0.1.2",
3390
- refused: ["dsh.workbench 缺 apiVersion —— 协议从 v1 起,写 \"apiVersion\": 1"]
3391
- }],
3392
- expect: {
3393
- rows: 0,
3394
- installed: 1,
3395
- installedState: "unusable",
3396
- installedActions: ["remove-bundle"],
3397
- installedNote: true
3398
- }
3399
- },
3400
- {
3401
- id: "installed-pending",
3402
- label: "本机装了、宿主还没加载它(重启一次就会出来)",
3403
- manifests: [],
3404
- capabilities: {},
3405
- installed: [{
3406
- unit: id,
3407
- pkg: "@dsh-workbench/module-one",
3408
- installed: "0.1.2"
3409
- }],
3410
- expect: {
3411
- rows: 0,
3412
- installed: 1,
3413
- installedState: "inactive",
3414
- installedActions: ["remove-bundle"],
3415
- installedHint: "panels.market.moduleRestartHint"
3416
- }
3417
- },
3418
- {
3419
- id: "installed-pending-update",
3420
- label: "本机装了、还没加载 + 源上有新版(给「更新」,也说明要重启)",
3421
- manifests: [],
3422
- capabilities: {},
3423
- installed: [{
3424
- unit: id,
3425
- pkg: "@dsh-workbench/module-one",
3426
- installed: "0.1.0",
3427
- latest: "0.1.2"
3428
- }],
3429
- expect: {
3430
- rows: 0,
3431
- installed: 1,
3432
- installedState: "outdated",
3433
- installedActions: ["update-bundle", "remove-bundle"],
3434
- installedHint: "panels.market.moduleRestartHint"
3435
- }
3436
- },
3437
- {
3438
- id: "installed-confirm",
3439
- label: "卸载本机模块(还没加载的那种:Modal 确认,标题是包名)",
3440
- manifests: [],
3441
- capabilities: {},
3442
- installed: [{
3443
- unit: id,
3444
- pkg: "@dsh-workbench/module-one",
3445
- installed: "0.1.2"
3446
- }],
3447
- confirming: id,
3448
- expect: {
3449
- rows: 0,
3450
- installed: 1,
3451
- installedState: "inactive",
3452
- installedActions: ["remove-bundle"]
3453
- }
3454
- },
3455
- {
3456
- id: "first-paint",
3457
- label: "刚进页面(检测中:能力与本机清单都还没结论)",
3458
- manifests: [mine],
3459
- capabilities: null,
3460
- installedRead: false,
3461
- loaded: false,
3462
- expect: {
3463
- rows: 1,
3464
- state: "checking",
3465
- actions: []
3466
- }
3467
- }
3468
- ];
3330
+ //#region src/app/layouts/rightbar/market-shared-rows.ts
3331
+ var SHARED_STATE_KEY = {
3332
+ checking: "panels.market.checking",
3333
+ installed: "panels.market.sharedOk",
3334
+ outdated: "panels.market.sharedOutdated",
3335
+ unsatisfied: "panels.market.sharedUnsatisfied",
3336
+ missing: "panels.market.sharedMissing",
3337
+ unchecked: "panels.market.unchecked"
3338
+ };
3339
+ var SHARED_DOT = {
3340
+ checking: "ongoing",
3341
+ installed: "done",
3342
+ outdated: "warning",
3343
+ unsatisfied: "warning",
3344
+ missing: "idle",
3345
+ unchecked: "idle"
3346
+ };
3347
+ function sharedActions(row) {
3348
+ return [...row.canUpdate ? ["update-dependency"] : []];
3469
3349
  }
3470
- //#endregion
3471
- //#region src/app/layouts/rightbar/market-mock.ts
3472
- function installable(manifest) {
3473
- return {
3474
- ...manifest,
3475
- env: {
3476
- command: "opencli",
3477
- plugins: [{
3478
- name: "fixture",
3479
- commands: ["x"]
3480
- }]
3481
- }
3350
+ var SHARED_RANK = {
3351
+ checking: -1,
3352
+ unchecked: 0,
3353
+ installed: 1,
3354
+ outdated: 2,
3355
+ unsatisfied: 3,
3356
+ missing: 4
3357
+ };
3358
+ function sharedRows(manifests, capabilities) {
3359
+ const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
3360
+ const byId = new Map(catalog.map((manifest) => [manifest.id, manifest]));
3361
+ const buckets = /* @__PURE__ */ new Map();
3362
+ const bucketOf = (kind, name, label, purpose) => {
3363
+ const id = `${kind}:${name}`;
3364
+ const found = buckets.get(id);
3365
+ if (found !== void 0) return found;
3366
+ const created = {
3367
+ kind,
3368
+ name,
3369
+ label,
3370
+ users: [],
3371
+ states: [],
3372
+ ...purpose === void 0 ? {} : { purpose }
3373
+ };
3374
+ buckets.set(id, created);
3375
+ return created;
3482
3376
  };
3483
- }
3484
- function withEnvSource(manifest, env) {
3485
- const [first, ...rest] = manifest.env?.plugins ?? [];
3486
- if (first === void 0) return manifest;
3487
- return {
3488
- ...manifest,
3489
- env: {
3490
- ...manifest.env,
3491
- plugins: [{
3492
- ...first,
3493
- installSource: {
3494
- kind: "local",
3495
- env
3496
- }
3497
- }, ...rest]
3377
+ for (const manifest of catalog) {
3378
+ const capability = capabilities?.[manifest.id];
3379
+ const released = capability?.released === true;
3380
+ for (const need of manifest.env?.plugins ?? []) {
3381
+ const source = need.installSource;
3382
+ const bucket = bucketOf("plugin", need.name, source?.kind === "npm" ? source.package : need.name);
3383
+ if (released) continue;
3384
+ bucket.users.push(manifest.id);
3385
+ const state = capability?.plugins?.find((item) => item.name === need.name);
3386
+ bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3387
+ if (state?.release !== void 0) {
3388
+ bucket.installed ??= state.release.installed;
3389
+ bucket.latest ??= state.release.latest;
3390
+ }
3391
+ bucket.command ??= state?.command;
3498
3392
  }
3499
- };
3500
- }
3501
- function withSecondNeed(manifest) {
3502
- return {
3503
- ...manifest,
3504
- env: {
3505
- ...manifest.env,
3506
- plugins: [...manifest.env?.plugins ?? [], {
3507
- name: "fixture-second",
3508
- commands: ["y"]
3509
- }]
3393
+ for (const need of manifest.env?.libs ?? []) {
3394
+ const bucket = bucketOf("lib", need.name, need.name, need.purpose);
3395
+ if (released) continue;
3396
+ bucket.users.push(manifest.id);
3397
+ const state = capability?.libs?.find((item) => item.name === need.name);
3398
+ bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
3399
+ bucket.installed ??= state?.installed;
3400
+ bucket.latest ??= state?.latest;
3401
+ bucket.command ??= state?.command;
3510
3402
  }
3511
- };
3403
+ }
3404
+ const rows = [];
3405
+ for (const bucket of buckets.values()) {
3406
+ if (bucket.users.length === 0) continue;
3407
+ const state = capabilities === null ? "checking" : bucket.states.reduce((soFar, item) => SHARED_RANK[item] > SHARED_RANK[soFar] ? item : soFar, "unchecked");
3408
+ const version = bucket.installed === void 0 && bucket.latest === void 0 ? void 0 : {
3409
+ ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
3410
+ ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
3411
+ };
3412
+ const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
3413
+ rows.push({
3414
+ id: `${bucket.kind}:${bucket.name}`,
3415
+ kind: bucket.kind,
3416
+ label: bucket.label,
3417
+ usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
3418
+ state,
3419
+ canUpdate: state === "outdated" || state === "unsatisfied",
3420
+ ...version === void 0 ? {} : { version },
3421
+ ...detail === void 0 ? {} : { detail }
3422
+ });
3423
+ }
3424
+ return rows;
3512
3425
  }
3513
- function twin(manifest) {
3426
+ //#endregion
3427
+ //#region src/app/layouts/rightbar/market-workbench-row.ts
3428
+ var WORKBENCH_ROW_ID = "workbench:self";
3429
+ var WORKBENCH_TITLE_KEY = "panels.market.workbenchName";
3430
+ function workbenchRow(version) {
3431
+ if (version === null || version === void 0 || version.installed === "") return void 0;
3432
+ const local = version.local === true;
3433
+ const latest = local ? void 0 : version.latest;
3434
+ const update = latest !== void 0 && latest !== version.installed ? {
3435
+ installed: version.installed,
3436
+ latest
3437
+ } : void 0;
3438
+ const note = local ? {
3439
+ key: "panels.market.workbenchLocal",
3440
+ params: {}
3441
+ } : void 0;
3514
3442
  return {
3515
- ...manifest,
3516
- id: `${manifest.id}-b`
3517
- };
3518
- }
3519
- function copies(manifest, count) {
3520
- return Array.from({ length: count }, (_, index) => ({
3521
- ...manifest,
3522
- id: `${manifest.id}-${index}`,
3523
- env: {
3524
- ...manifest.env,
3525
- plugins: [{
3526
- name: `fixture-${index}`,
3527
- commands: manifest.env?.plugins?.[0]?.commands ?? []
3528
- }]
3529
- }
3530
- }));
3531
- }
3532
- function probe$1(unit, status, extra = {}) {
3533
- return { [unit]: {
3534
- unit,
3535
- status,
3536
- required: ["x"],
3537
- missing: [],
3538
- detail: "夹具",
3539
- ...extra
3540
- } };
3541
- }
3542
- function buildMarketMocks(roster) {
3543
- const found = roster.find((manifest) => manifest.card !== null);
3544
- if (found === void 0) return [{
3545
- id: "empty",
3546
- label: "市场空态",
3547
- manifests: [],
3548
- capabilities: {},
3549
- expect: { rows: 0 }
3550
- }];
3551
- const mine = installable(found);
3552
- const second = twin(mine);
3553
- const id = mine.id;
3554
- const secondId = second.id;
3555
- return [
3556
- {
3557
- id: "installed",
3558
- label: "已装",
3559
- manifests: [mine],
3560
- capabilities: probe$1(id, "ok", { plugins: [{
3561
- name: "fixture",
3562
- status: "ok",
3563
- missing: []
3564
- }] }),
3565
- expect: {
3566
- rows: 1,
3567
- state: "installed",
3568
- actions: ["uninstall"],
3569
- shared: 1,
3570
- sharedActions: []
3571
- }
3572
- },
3573
- {
3574
- id: "outdated",
3575
- label: "要更新",
3576
- manifests: [mine],
3577
- capabilities: probe$1(id, "missing-commands", { missing: ["x"] }),
3578
- expect: {
3579
- rows: 1,
3580
- state: "outdated",
3581
- actions: ["update", "uninstall"],
3582
- noteKey: "panels.market.needCommands"
3583
- }
3584
- },
3585
- {
3586
- id: "module-update",
3587
- label: "模块包有新版(行上给「更新」,装了要重启)",
3588
- manifests: [mine],
3589
- capabilities: probe$1(id, "ok", { plugins: [{
3590
- name: "fixture",
3591
- status: "ok",
3592
- missing: []
3593
- }] }),
3594
- updates: { [id]: {
3595
- installed: "0.1.2",
3596
- latest: "0.2.0"
3597
- } },
3598
- expect: {
3599
- rows: 1,
3600
- state: "outdated",
3601
- actions: ["update-bundle", "uninstall"],
3602
- shared: 1,
3603
- sharedActions: []
3604
- }
3605
- },
3606
- {
3607
- id: "outdated-release",
3608
- label: "源上有新版(模块行不变,共用依赖行给「更新」)",
3609
- manifests: [mine],
3610
- capabilities: probe$1(id, "ok", { plugins: [{
3611
- name: "fixture",
3612
- status: "outdated",
3613
- missing: [],
3614
- release: {
3615
- installed: "1.0.16",
3616
- latest: "1.0.17"
3617
- }
3618
- }] }),
3619
- expect: {
3620
- rows: 1,
3621
- state: "installed",
3622
- actions: ["uninstall"],
3623
- shared: 1,
3624
- sharedActions: ["update-dependency"]
3625
- }
3626
- },
3627
- {
3628
- id: "missing",
3629
- label: "未装(可装)",
3630
- manifests: [mine],
3631
- capabilities: probe$1(id, "missing-plugin", {
3632
- install: "ready",
3633
- plugins: [{
3634
- name: "fixture",
3635
- status: "missing",
3636
- missing: ["x"],
3637
- install: "ready"
3638
- }]
3639
- }),
3640
- expect: {
3641
- rows: 1,
3642
- state: "missing",
3643
- actions: ["install"],
3644
- shared: 1,
3645
- sharedActions: []
3646
- }
3647
- },
3648
- {
3649
- id: "missing-env",
3650
- label: "未装 + 要先设环境变量",
3651
- manifests: [withEnvSource(mine, "WB_FIXTURE_HOME")],
3652
- capabilities: probe$1(id, "missing-plugin", { install: "env-missing" }),
3653
- expect: {
3654
- rows: 1,
3655
- state: "missing",
3656
- actions: []
3657
- }
3658
- },
3659
- {
3660
- id: "missing-undeclared",
3661
- label: "未装 + 没声明怎么装",
3662
- manifests: [mine],
3663
- capabilities: probe$1(id, "missing-plugin", { install: "not-declared" }),
3664
- expect: {
3665
- rows: 1,
3666
- state: "missing",
3667
- actions: []
3668
- }
3669
- },
3670
- {
3671
- id: "unknown",
3672
- label: "探测失败(状态未知)",
3673
- manifests: [mine],
3674
- capabilities: {},
3675
- expect: {
3676
- rows: 1,
3677
- state: "unknown",
3678
- actions: []
3679
- }
3680
- },
3681
- {
3682
- id: "checking",
3683
- label: "检测中",
3684
- manifests: [mine],
3685
- capabilities: null,
3686
- expect: {
3687
- rows: 1,
3688
- state: "checking",
3689
- actions: []
3690
- }
3691
- },
3692
- {
3693
- id: "shared",
3694
- label: "两个模块(第二行是复制的)",
3695
- manifests: [mine, second],
3696
- capabilities: {
3697
- ...probe$1(id, "ok"),
3698
- ...probe$1(secondId, "ok")
3699
- },
3700
- expect: {
3701
- rows: 2,
3702
- state: "installed",
3703
- actions: ["uninstall"],
3704
- shared: 1
3705
- }
3706
- },
3707
- {
3708
- id: "busy",
3709
- label: "正在装",
3710
- manifests: [mine],
3711
- capabilities: probe$1(id, "missing-plugin", { install: "ready" }),
3712
- pending: {
3713
- id,
3714
- action: "install"
3715
- },
3716
- expect: {
3717
- rows: 1,
3718
- state: "missing",
3719
- actions: ["install"]
3720
- }
3721
- },
3722
- {
3723
- id: "confirm",
3724
- label: "等确认卸载",
3725
- manifests: [mine],
3726
- capabilities: probe$1(id, "ok"),
3727
- confirming: id,
3728
- expect: {
3729
- rows: 1,
3730
- state: "installed",
3731
- actions: ["uninstall"]
3732
- }
3733
- },
3734
- {
3735
- id: "failed",
3736
- label: "失败(红字贴行)",
3737
- manifests: [mine],
3738
- capabilities: probe$1(id, "ok"),
3739
- failure: {
3740
- id,
3741
- message: "没成功:命令失败(退出码 1):夹具里的一条失败原因"
3742
- },
3743
- expect: {
3744
- rows: 1,
3745
- state: "installed",
3746
- actions: ["uninstall"]
3747
- }
3748
- },
3749
- {
3750
- id: "long-title",
3751
- label: "超长模块名",
3752
- manifests: [{
3753
- ...mine,
3754
- card: {
3755
- titleKey: "一个名字特别特别长的模块用来验证省略号会不会把按钮挤下去",
3756
- order: 10
3757
- }
3758
- }],
3759
- capabilities: probe$1(id, "ok"),
3760
- expect: {
3761
- rows: 1,
3762
- state: "installed",
3763
- actions: ["uninstall"],
3764
- titleChars: 25
3765
- }
3766
- },
3767
- {
3768
- id: "long-env",
3769
- label: "超长环境变量名",
3770
- manifests: [withEnvSource(mine, "DSH_WORKBENCH_SOMETHING_VERY_LONG_ENV_NAME_FOR_THE_MODULE")],
3771
- capabilities: probe$1(id, "missing-plugin", { install: "env-missing" }),
3772
- expect: {
3773
- rows: 1,
3774
- state: "missing",
3775
- actions: []
3776
- }
3777
- },
3778
- {
3779
- id: "long-error",
3780
- label: "超长错误信息",
3781
- manifests: [mine],
3782
- capabilities: probe$1(id, "ok"),
3783
- failure: {
3784
- id,
3785
- message: "没成功:命令失败(退出码 1):Error: EPERM: operation not permitted, unlink '/Users/someone/.dsh/workbench/opencli/home/.opencli/plugins/example-permission-copy-with-a-very-long-directory-name'"
3786
- },
3787
- expect: {
3788
- rows: 1,
3789
- state: "installed",
3790
- actions: ["uninstall"]
3791
- }
3792
- },
3793
- {
3794
- id: "two-deps",
3795
- label: "两份依赖(只装缺的)",
3796
- manifests: [withSecondNeed(mine)],
3797
- capabilities: probe$1(id, "missing-plugin", {
3798
- install: "ready",
3799
- plugins: [{
3800
- name: "fixture",
3801
- status: "ok",
3802
- missing: []
3803
- }, {
3804
- name: "fixture-second",
3805
- status: "missing",
3806
- missing: ["y"],
3807
- install: "ready"
3808
- }]
3809
- }),
3810
- expect: {
3811
- rows: 1,
3812
- state: "missing",
3813
- actions: ["install"]
3814
- }
3815
- },
3816
- {
3817
- id: "many",
3818
- label: "很多行(要滚)",
3819
- manifests: [mine, ...copies(mine, 13)],
3820
- capabilities: Object.fromEntries([id, ...copies(mine, 13).map((item) => item.id)].map((unit) => [unit, probe$1(unit, "ok")[unit]])),
3821
- expect: {
3822
- rows: 14,
3823
- state: "installed",
3824
- actions: ["uninstall"]
3825
- }
3826
- },
3827
- ...installedMocks({
3828
- id,
3829
- found,
3830
- mine,
3831
- probe: probe$1
3832
- }),
3833
- {
3834
- id: "shared-many",
3835
- label: "三个模块(同一份安装)",
3836
- manifests: [
3837
- mine,
3838
- twin(mine),
3839
- {
3840
- ...twin(mine),
3841
- id: `${mine.id}-c`
3842
- }
3843
- ],
3844
- capabilities: {
3845
- ...probe$1(id, "ok"),
3846
- ...probe$1(secondId, "ok"),
3847
- ...probe$1(`${mine.id}-c`, "ok")
3848
- },
3849
- expect: {
3850
- rows: 3,
3851
- state: "installed",
3852
- actions: ["uninstall"]
3853
- }
3854
- },
3855
- {
3856
- id: "plugin-outdated",
3857
- label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
3858
- manifests: [],
3859
- capabilities: {},
3860
- plugins: [{
3861
- pkg: "opencli-plugin-cmdb",
3862
- name: "cmdb",
3863
- installed: "1.0.24",
3864
- latest: "1.0.25"
3865
- }],
3866
- expect: {
3867
- rows: 0,
3868
- plugins: 1,
3869
- pluginActions: ["update-plugin", "uninstall-plugin"]
3870
- }
3871
- },
3872
- {
3873
- id: "plugin-local",
3874
- label: "本地目录装的 opencli 插件:没有版本源,只给卸载",
3875
- manifests: [],
3876
- capabilities: {},
3877
- plugins: [{
3878
- pkg: "/Users/me/my-local-plugin",
3879
- name: "my-local-plugin",
3880
- local: true
3881
- }],
3882
- expect: {
3883
- rows: 0,
3884
- plugins: 1,
3885
- pluginActions: ["uninstall-plugin"],
3886
- pluginNote: false
3887
- }
3888
- },
3889
- {
3890
- id: "plugin-alias",
3891
- label: "插件名 ≠ 包名:行上两个都写出来(更新 / 卸载按包名)",
3892
- manifests: [],
3893
- capabilities: {},
3894
- plugins: [{
3895
- pkg: "opencli-plugin-cmdb",
3896
- name: "cmdb",
3897
- installed: "1.0.24",
3898
- latest: "1.0.25"
3899
- }],
3900
- expect: {
3901
- rows: 0,
3902
- plugins: 1,
3903
- pluginActions: ["update-plugin", "uninstall-plugin"]
3904
- }
3905
- },
3906
- {
3907
- id: "plugin-broken",
3908
- label: "装坏了的那一份(目录在但看不出是个插件):行上直说,给卸载与指路",
3909
- manifests: [],
3910
- capabilities: {},
3911
- plugins: [{
3912
- pkg: "opencli-plugin-cmdb",
3913
- name: "cmdb",
3914
- installed: "1.0.24",
3915
- broken: true
3916
- }],
3917
- expect: {
3918
- rows: 0,
3919
- plugins: 1,
3920
- pluginState: "broken",
3921
- pluginActions: ["uninstall-plugin"],
3922
- pluginNoteKey: "panels.market.pluginBroken"
3923
- }
3924
- },
3925
- {
3926
- id: "plugin-kept",
3927
- label: "卸掉用户装的插件,但还有模块在用:文件先留着(行上给一句为什么)",
3928
- manifests: [],
3929
- capabilities: {},
3930
- plugins: [{
3931
- pkg: "opencli-plugin-cmdb",
3932
- name: "cmdb",
3933
- installed: "1.0.24"
3934
- }],
3935
- notice: "文件先留着:cmdb、argocd 还要用它。",
3936
- expect: {
3937
- rows: 0,
3938
- plugins: 1,
3939
- pluginActions: ["uninstall-plugin"],
3940
- notice: true
3941
- }
3942
- },
3943
- {
3944
- id: "workbench-update",
3945
- label: "工作台有新版(这一行也给「更新」,装完面板自己换上)",
3946
- manifests: [],
3947
- capabilities: {},
3948
- workbench: {
3949
- pkg: "@dsh-workbench/core",
3950
- installed: "0.1.18",
3951
- latest: "0.1.19"
3952
- },
3953
- expect: {
3954
- rows: 0,
3955
- workbenchState: "outdated",
3956
- workbenchActions: ["update-workbench"]
3957
- }
3958
- },
3959
- {
3960
- id: "workbench-current",
3961
- label: "工作台已经最新(只显示版本,没有按钮)",
3962
- manifests: [],
3963
- capabilities: {},
3964
- workbench: {
3965
- pkg: "@dsh-workbench/core",
3966
- installed: "0.1.19"
3967
- },
3968
- expect: {
3969
- rows: 0,
3970
- workbenchState: "installed",
3971
- workbenchActions: []
3972
- }
3973
- },
3974
- {
3975
- id: "workbench-local",
3976
- label: "工作台是本仓那份(link: 装的:不给更新,行上说清)",
3977
- manifests: [],
3978
- capabilities: {},
3979
- workbench: {
3980
- pkg: "@dsh-workbench/core",
3981
- installed: "0.1.18",
3982
- latest: "0.1.19",
3983
- local: true
3984
- },
3985
- expect: {
3986
- rows: 0,
3987
- workbenchState: "installed",
3988
- workbenchActions: [],
3989
- workbenchNoteKey: "panels.market.workbenchLocal"
3990
- }
3991
- },
3992
- {
3993
- id: "workbench-updated",
3994
- label: "工作台刚更新完(新版已经在盘上:行上就是新版,没有按钮、也不劝人重启)",
3995
- manifests: [],
3996
- capabilities: {},
3997
- workbench: {
3998
- pkg: "@dsh-workbench/core",
3999
- installed: "0.1.19"
4000
- },
4001
- expect: {
4002
- rows: 0,
4003
- workbenchState: "installed",
4004
- workbenchActions: []
4005
- }
4006
- },
4007
- {
4008
- id: "workbench-restart-pending",
4009
- label: "工作台更新完了但这份进程里还是旧的(盘上 0.1.19、跑着的 0.1.18:状态那格是红点「重启后生效」——重启一次 dsh 才真的换上)",
4010
- manifests: [],
4011
- capabilities: {},
4012
- workbench: {
4013
- pkg: "@dsh-workbench/core",
4014
- installed: "0.1.19",
4015
- running: "0.1.18"
4016
- },
4017
- expect: {
4018
- rows: 0,
4019
- workbenchState: "pending-restart",
4020
- workbenchActions: []
4021
- }
4022
- },
4023
- {
4024
- id: "workbench-restart-pending-local",
4025
- label: "本仓那份(link: 装的)永远等于盘上那份 → 不亮这句、也不劝重启",
4026
- manifests: [],
4027
- capabilities: {},
4028
- workbench: {
4029
- pkg: "@dsh-workbench/core",
4030
- installed: "0.1.19",
4031
- running: "0.1.18",
4032
- local: true
4033
- },
4034
- expect: {
4035
- rows: 0,
4036
- workbenchState: "installed",
4037
- workbenchActions: []
4038
- }
4039
- },
4040
- {
4041
- id: "empty",
4042
- label: "市场空态",
4043
- manifests: [],
4044
- capabilities: {},
4045
- expect: {
4046
- rows: 0,
4047
- shared: 0
4048
- }
4049
- }
4050
- ];
4051
- }
4052
- //#endregion
4053
- //#region src/app/layouts/rightbar/registry.ts
4054
- function createBoardRegistry() {
4055
- const modules = [];
4056
- const listeners = /* @__PURE__ */ new Set();
4057
- let revision = 0;
4058
- let sorted = [];
4059
- let index = /* @__PURE__ */ new Map();
4060
- let steps = /* @__PURE__ */ new Map();
4061
- function rebuild() {
4062
- sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
4063
- index = new Map(sorted.map((module) => [module.id, module]));
4064
- const table = /* @__PURE__ */ new Map();
4065
- for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
4066
- const owner = table.get(kind);
4067
- if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
4068
- table.set(kind, module);
4069
- }
4070
- steps = table;
4071
- }
4072
- function notify() {
4073
- revision += 1;
4074
- for (const listener of listeners) listener();
4075
- }
4076
- return {
4077
- register(module) {
4078
- if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
4079
- modules.push(module);
4080
- try {
4081
- rebuild();
4082
- } catch (error) {
4083
- modules.pop();
4084
- rebuild();
4085
- throw error;
4086
- }
4087
- notify();
4088
- return () => {
4089
- const at = modules.indexOf(module);
4090
- if (at < 0) return;
4091
- modules.splice(at, 1);
4092
- rebuild();
4093
- notify();
4094
- };
4095
- },
4096
- all: () => sorted,
4097
- byId: (id) => index.get(id),
4098
- stepOwner: (kind) => steps.get(kind),
4099
- subscribe(listener) {
4100
- listeners.add(listener);
4101
- return () => listeners.delete(listener);
4102
- },
4103
- version: () => revision
4104
- };
4105
- }
4106
- //#endregion
4107
- //#region src/app/units/registry.ts
4108
- function toBoardModule(face, manifest) {
4109
- const View = face.card;
4110
- if (View === void 0) return void 0;
4111
- return {
4112
- id: manifest.id,
4113
- titleKey: manifest.card?.titleKey ?? manifest.id,
4114
- order: manifest.card?.order ?? 100,
4115
- View,
4116
- ...face.steps === void 0 ? {} : { steps: face.steps }
4117
- };
4118
- }
4119
- function createClientUnitRegistry(options = {}) {
4120
- const registrations = [];
4121
- const refusals = [];
4122
- const listeners = /* @__PURE__ */ new Set();
4123
- const board = createBoardRegistry();
4124
- let known = /* @__PURE__ */ new Map();
4125
- let installableIds = null;
4126
- let revision = 0;
4127
- let manifestsCache;
4128
- function notify() {
4129
- revision += 1;
4130
- for (const listener of [...listeners]) try {
4131
- listener();
4132
- } catch (error) {
4133
- console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
4134
- }
4135
- }
4136
- function warnRefusal(unit, kind, reasons) {
4137
- refusals.push({
4138
- unit,
4139
- kind,
4140
- reasons
4141
- });
4142
- console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
4143
- }
4144
- function takeBackRefusal(unit) {
4145
- for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
4146
- }
4147
- function attach(entry) {
4148
- const manifest = known.get(entry.unit);
4149
- if (manifest === void 0) return false;
4150
- const boardModule = toBoardModule(entry.face, manifest);
4151
- entry.mounted = {
4152
- manifest,
4153
- unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
4154
- };
4155
- takeBackRefusal(entry.unit);
4156
- return true;
4157
- }
4158
- function detach(entry) {
4159
- entry.mounted?.unmount();
4160
- entry.mounted = null;
4161
- }
4162
- return {
4163
- register(face) {
4164
- const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
4165
- if (unit === "") {
4166
- warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
4167
- notify();
4168
- return () => {};
4169
- }
4170
- if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
4171
- const entry = {
4172
- face,
4173
- unit,
4174
- mounted: null
4175
- };
4176
- registrations.push(entry);
4177
- manifestsCache = void 0;
4178
- if (!attach(entry)) {
4179
- warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
4180
- options.onUnknownUnit?.(unit);
4181
- }
4182
- notify();
4183
- return () => {
4184
- const at = registrations.indexOf(entry);
4185
- if (at < 0) return;
4186
- registrations.splice(at, 1);
4187
- detach(entry);
4188
- takeBackRefusal(unit);
4189
- manifestsCache = void 0;
4190
- notify();
4191
- };
4192
- },
4193
- all: () => registrations.map((entry) => entry.face),
4194
- manifests: () => {
4195
- manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
4196
- return manifestsCache;
4197
- },
4198
- refusals: () => refusals,
4199
- installable: () => installableIds,
4200
- setManifests(manifests, installable) {
4201
- known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
4202
- installableIds = installable === void 0 ? null : new Set(installable);
4203
- let changed = false;
4204
- for (const entry of registrations) {
4205
- const next = known.get(entry.unit);
4206
- if (entry.mounted === null) {
4207
- if (next !== void 0 && attach(entry)) changed = true;
4208
- continue;
4209
- }
4210
- if (next === void 0) {
4211
- detach(entry);
4212
- warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
4213
- changed = true;
4214
- }
4215
- }
4216
- if (!changed) return;
4217
- manifestsCache = void 0;
4218
- notify();
4219
- },
4220
- board,
4221
- subscribe(listener) {
4222
- listeners.add(listener);
4223
- return () => listeners.delete(listener);
4224
- },
4225
- version: () => revision
4226
- };
4227
- }
4228
- //#endregion
4229
- //#region src/app/units/fixture-unit-mock.tsx
4230
- var FIXTURE_UNIT_ID = "wb-fixture";
4231
- var CRASH_UNIT_ID = "wb-fixture-crash";
4232
- var KEY = {
4233
- cardTitle: `${FIXTURE_UNIT_ID}.cardTitle`,
4234
- cardMeta: `${FIXTURE_UNIT_ID}.cardMeta`,
4235
- rowKey: `${FIXTURE_UNIT_ID}.rowKey`,
4236
- rowValue: `${FIXTURE_UNIT_ID}.rowValue`
4237
- };
4238
- var messages = {
4239
- zh: {
4240
- [KEY.cardTitle]: "示例模块",
4241
- [KEY.cardMeta]: "夹具",
4242
- [KEY.rowKey]: "示例",
4243
- [KEY.rowValue]: "第 {n} 行"
4244
- },
4245
- en: {
4246
- [KEY.cardTitle]: "Sample module",
4247
- [KEY.cardMeta]: "Fixture",
4248
- [KEY.rowKey]: "Sample",
4249
- [KEY.rowValue]: "Row {n}"
4250
- }
4251
- };
4252
- var manifest = {
4253
- id: FIXTURE_UNIT_ID,
4254
- card: {
4255
- titleKey: KEY.cardTitle,
4256
- order: 900
4257
- },
4258
- tools: [],
4259
- host: { inject: [] }
4260
- };
4261
- function FixtureCard({ t, onRefresh }) {
4262
- return /* @__PURE__ */ h(Card, {
4263
- t,
4264
- title: t(KEY.cardTitle),
4265
- meta: t(KEY.cardMeta),
4266
- refreshing: false,
4267
- onRefresh
4268
- }, /* @__PURE__ */ h(Rows, null, [
4269
- 1,
4270
- 2,
4271
- 3
4272
- ].map((n) => /* @__PURE__ */ h(Row, {
4273
- key: String(n),
4274
- label: t(KEY.rowKey),
4275
- value: t(KEY.rowValue, { n: String(n) })
4276
- }))));
4277
- }
4278
- var FIXTURE_FACE = {
4279
- unit: FIXTURE_UNIT_ID,
4280
- manifest,
4281
- messages,
4282
- card: FixtureCard
4283
- };
4284
- var CRASH_KEY = {
4285
- cardTitle: `${CRASH_UNIT_ID}.cardTitle`,
4286
- cardMeta: `${CRASH_UNIT_ID}.cardMeta`
4287
- };
4288
- var crashMessages = {
4289
- zh: {
4290
- [CRASH_KEY.cardTitle]: "崩溃的卡片",
4291
- [CRASH_KEY.cardMeta]: "夹具:渲染时抛错"
4292
- },
4293
- en: {
4294
- [CRASH_KEY.cardTitle]: "Crashing card",
4295
- [CRASH_KEY.cardMeta]: "Fixture: throws while rendering"
4296
- }
4297
- };
4298
- var crashManifest = {
4299
- id: CRASH_UNIT_ID,
4300
- card: {
4301
- titleKey: CRASH_KEY.cardTitle,
4302
- order: 899
4303
- },
4304
- tools: [],
4305
- host: { inject: [] }
4306
- };
4307
- function CrashingCard() {
4308
- throw new Error("夹具:这张卡片按 wbCrash=1 故意渲染失败(守「一张卡片崩溃不带走面板」)");
4309
- }
4310
- var CRASH_FACE = {
4311
- unit: CRASH_UNIT_ID,
4312
- manifest: crashManifest,
4313
- messages: crashMessages,
4314
- card: CrashingCard
4315
- };
4316
- var SAMPLE_ROSTER = [manifest];
4317
- function hasCard(roster) {
4318
- return roster.some((item) => item.card !== null);
4319
- }
4320
- function fixtureRoster(roster) {
4321
- return hasCard(roster) ? roster : SAMPLE_ROSTER;
4322
- }
4323
- function boardModuleOf(face) {
4324
- const module = toBoardModule(face, face.manifest);
4325
- return module === void 0 ? [] : [module];
4326
- }
4327
- function fixtureSeed(roster, all, crash = false) {
4328
- const base = hasCard(roster) ? all : boardModuleOf(FIXTURE_FACE);
4329
- return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
4330
- }
4331
- //#endregion
4332
- //#region src/app/layouts/rightbar/market-shared-rows.ts
4333
- var SHARED_STATE_KEY = {
4334
- checking: "panels.market.checking",
4335
- installed: "panels.market.sharedOk",
4336
- outdated: "panels.market.sharedOutdated",
4337
- unsatisfied: "panels.market.sharedUnsatisfied",
4338
- missing: "panels.market.sharedMissing",
4339
- unchecked: "panels.market.unchecked"
4340
- };
4341
- var SHARED_DOT = {
4342
- checking: "ongoing",
4343
- installed: "done",
4344
- outdated: "warning",
4345
- unsatisfied: "warning",
4346
- missing: "idle",
4347
- unchecked: "idle"
4348
- };
4349
- function sharedActions(row) {
4350
- return [...row.canUpdate ? ["update-dependency"] : []];
4351
- }
4352
- var SHARED_RANK = {
4353
- checking: -1,
4354
- unchecked: 0,
4355
- installed: 1,
4356
- outdated: 2,
4357
- unsatisfied: 3,
4358
- missing: 4
4359
- };
4360
- function sharedRows(manifests, capabilities) {
4361
- const catalog = manifests.filter((manifest) => (manifest.env?.plugins ?? []).length > 0 || (manifest.env?.libs ?? []).length > 0);
4362
- const byId = new Map(catalog.map((manifest) => [manifest.id, manifest]));
4363
- const buckets = /* @__PURE__ */ new Map();
4364
- const bucketOf = (kind, name, label, purpose) => {
4365
- const id = `${kind}:${name}`;
4366
- const found = buckets.get(id);
4367
- if (found !== void 0) return found;
4368
- const created = {
4369
- kind,
4370
- name,
4371
- label,
4372
- users: [],
4373
- states: [],
4374
- ...purpose === void 0 ? {} : { purpose }
4375
- };
4376
- buckets.set(id, created);
4377
- return created;
4378
- };
4379
- for (const manifest of catalog) {
4380
- const capability = capabilities?.[manifest.id];
4381
- const released = capability?.released === true;
4382
- for (const need of manifest.env?.plugins ?? []) {
4383
- const source = need.installSource;
4384
- const bucket = bucketOf("plugin", need.name, source?.kind === "npm" ? source.package : need.name);
4385
- if (released) continue;
4386
- bucket.users.push(manifest.id);
4387
- const state = capability?.plugins?.find((item) => item.name === need.name);
4388
- bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
4389
- if (state?.release !== void 0) {
4390
- bucket.installed ??= state.release.installed;
4391
- bucket.latest ??= state.release.latest;
4392
- }
4393
- bucket.command ??= state?.command;
4394
- }
4395
- for (const need of manifest.env?.libs ?? []) {
4396
- const bucket = bucketOf("lib", need.name, need.name, need.purpose);
4397
- if (released) continue;
4398
- bucket.users.push(manifest.id);
4399
- const state = capability?.libs?.find((item) => item.name === need.name);
4400
- bucket.states.push(state === void 0 ? "unchecked" : state.status === "ok" ? "installed" : state.status);
4401
- bucket.installed ??= state?.installed;
4402
- bucket.latest ??= state?.latest;
4403
- bucket.command ??= state?.command;
4404
- }
4405
- }
4406
- const rows = [];
4407
- for (const bucket of buckets.values()) {
4408
- if (bucket.users.length === 0) continue;
4409
- const state = capabilities === null ? "checking" : bucket.states.reduce((soFar, item) => SHARED_RANK[item] > SHARED_RANK[soFar] ? item : soFar, "unchecked");
4410
- const version = bucket.installed === void 0 && bucket.latest === void 0 ? void 0 : {
4411
- ...bucket.installed === void 0 ? {} : { installed: bucket.installed },
4412
- ...bucket.latest === void 0 ? {} : { latest: bucket.latest }
4413
- };
4414
- const detail = bucket.purpose === void 0 ? void 0 : `${bucket.label} —— ${bucket.purpose}`;
4415
- rows.push({
4416
- id: `${bucket.kind}:${bucket.name}`,
4417
- kind: bucket.kind,
4418
- label: bucket.label,
4419
- usedByKeys: bucket.users.map((unit) => byId.get(unit)?.card?.titleKey ?? unit),
4420
- state,
4421
- canUpdate: state === "outdated" || state === "unsatisfied",
4422
- ...version === void 0 ? {} : { version },
4423
- ...detail === void 0 ? {} : { detail }
4424
- });
4425
- }
4426
- return rows;
4427
- }
4428
- //#endregion
4429
- //#region src/app/layouts/rightbar/market-workbench-row.ts
4430
- var WORKBENCH_ROW_ID = "workbench:self";
4431
- var WORKBENCH_TITLE_KEY = "panels.market.workbenchName";
4432
- function workbenchRow(version) {
4433
- if (version === null || version === void 0 || version.installed === "") return void 0;
4434
- const local = version.local === true;
4435
- const latest = local ? void 0 : version.latest;
4436
- const update = latest !== void 0 && latest !== version.installed ? {
4437
- installed: version.installed,
4438
- latest
4439
- } : void 0;
4440
- const note = local ? {
4441
- key: "panels.market.workbenchLocal",
4442
- params: {}
4443
- } : void 0;
4444
- return {
4445
- id: WORKBENCH_ROW_ID,
4446
- titleKey: WORKBENCH_TITLE_KEY,
4447
- workbench: true,
4448
- state: !local && version.running !== void 0 && version.running !== version.installed ? "pending-restart" : update === void 0 ? "installed" : "outdated",
4449
- canInstall: false,
4450
- canUpdate: update !== void 0,
4451
- canUninstall: false,
4452
- ...note === void 0 ? {} : { note },
4453
- version: {
4454
- installed: version.installed,
4455
- ...latest === void 0 ? {} : { latest }
3443
+ id: WORKBENCH_ROW_ID,
3444
+ titleKey: WORKBENCH_TITLE_KEY,
3445
+ workbench: true,
3446
+ state: !local && version.running !== void 0 && version.running !== version.installed ? "pending-restart" : update === void 0 ? "installed" : "outdated",
3447
+ canInstall: false,
3448
+ canUpdate: update !== void 0,
3449
+ canUninstall: false,
3450
+ ...note === void 0 ? {} : { note },
3451
+ version: {
3452
+ installed: version.installed,
3453
+ ...latest === void 0 ? {} : { latest }
4456
3454
  },
4457
3455
  ...update === void 0 ? {} : { moduleUpdate: update },
4458
3456
  pkg: version.pkg
@@ -4955,10 +3953,7 @@ var MarketPage_module_default = {
4955
3953
  //#endregion
4956
3954
  //#region src/app/layouts/rightbar/MarketStates.tsx
4957
3955
  function MarketChecking({ t }) {
4958
- return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4959
- state: "ongoing",
4960
- size: 14
4961
- }), t("panels.market.checking")));
3956
+ return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketChecking }, /* @__PURE__ */ h(Spinner, { size: 14 }), t("panels.market.checking")));
4962
3957
  }
4963
3958
  function MarketEmpty({ t }) {
4964
3959
  return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
@@ -5126,16 +4121,10 @@ function SharedLine({ t, row, pending, failure, onAct }) {
5126
4121
  className: MarketPage_module_default.marketDesc,
5127
4122
  role: "img",
5128
4123
  "aria-label": stateText
5129
- }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
5130
- state: "ongoing",
5131
- size: 14
5132
- }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4124
+ }, row.state === "checking" ? /* @__PURE__ */ h(Spinner, { size: 14 }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
5133
4125
  state: SHARED_DOT[row.state],
5134
4126
  size: 9
5135
- }), 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(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
5136
- state: "ongoing",
5137
- size: 14
5138
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
4127
+ }), stateText, /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketUsedBy }, t("panels.market.sharedUsedBy", { modules: row.usedByKeys.map((key) => t(key)).join(t("panels.market.listSeparator")) })))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEnd }, running !== null ? /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketProgress }, /* @__PURE__ */ h(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
5139
4128
  key: action,
5140
4129
  type: "button",
5141
4130
  size: "sm",
@@ -5223,16 +4212,10 @@ function MarketLine({ t, row, pending, failure, onAct, onDefault, boardBusy }) {
5223
4212
  className: MarketPage_module_default.marketDesc,
5224
4213
  role: "img",
5225
4214
  "aria-label": stateText
5226
- }, row.state === "checking" ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
5227
- state: "ongoing",
5228
- size: 14
5229
- }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
4215
+ }, row.state === "checking" ? /* @__PURE__ */ h(Spinner, { size: 14 }) : /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
5230
4216
  state: MARKET_DOT[row.state],
5231
4217
  size: 9
5232
- }), 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(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
5233
- state: "ongoing",
5234
- size: 14
5235
- }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
4218
+ }), 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(Spinner, { size: 14 }), t(PROGRESS_KEY[running.action])) : actions.length === 0 ? null : /* @__PURE__ */ h("span", { className: MarketPage_module_default.marketActions }, actions.map((action) => {
5236
4219
  const danger = dangerActions.includes(action);
5237
4220
  const update = updateActions.includes(action);
5238
4221
  return /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
@@ -6263,10 +5246,7 @@ function AddModulePending({ t, kind }) {
6263
5246
  className: AddModule_module_default.heroIcon,
6264
5247
  "data-state": "ongoing",
6265
5248
  "aria-hidden": "true"
6266
- }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
6267
- state: "ongoing",
6268
- size: 28
6269
- })), /* @__PURE__ */ h("h2", {
5249
+ }, /* @__PURE__ */ h(Spinner, { size: 28 })), /* @__PURE__ */ h("h2", {
6270
5250
  className: AddModule_module_default.pendingTitle,
6271
5251
  role: "status"
6272
5252
  }, kind === "inspecting" ? t("panels.market.add.classifying") : t("panels.market.add.installingTitle"))));
@@ -6309,285 +5289,6 @@ function AddModuleResult({ t, state }) {
6309
5289
  }, t("panels.market.add.failed", { reason })) : kind === "restart" ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("p", { className: AddModule_module_default.resultWarn }, t("panels.market.add.doneRestart")), why === void 0 ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.resultMeta }, why)) : kind === "quiet" ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.result }, t("panels.market.add.tookEffect")), builds.length === 0 ? null : /* @__PURE__ */ h("div", { className: AddModule_module_default.approval }, /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalTitle }, t("panels.market.add.approveTitle")), /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalText }, t("panels.market.add.approveHint", { packages: builds.join("、") })), /* @__PURE__ */ h("p", { className: AddModule_module_default.approvalCaution }, t("panels.market.add.approveCaution"))), supply === void 0 || outcome.supply.state !== "failed" && (kind === "failed" || kind === "cancelled") ? null : /* @__PURE__ */ h("p", { className: supplyTone(outcome.supply.state) }, t(supply, { reason: outcome.supply.reason ?? "" })), state.failure === null ? null : /* @__PURE__ */ h("p", { className: AddModule_module_default.problem }, state.failure), outcome.change.errorDetail === void 0 ? null : /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h("p", { className: AddModule_module_default.detailLabel }, t("panels.market.add.details")), /* @__PURE__ */ h("p", { className: AddModule_module_default.detail }, outcome.change.errorDetail)));
6310
5290
  }
6311
5291
  //#endregion
6312
- //#region src/app/layouts/market/add-module-mock.ts
6313
- function change(over) {
6314
- return {
6315
- application: "applied",
6316
- stage: "install",
6317
- changed: true,
6318
- target: "@dsh-workbench/module-hello",
6319
- ...over
6320
- };
6321
- }
6322
- function outcome(over, supply = { state: "installed" }) {
6323
- return {
6324
- change: change(over),
6325
- module: {
6326
- kind: "module",
6327
- pkg: "@dsh-workbench/module-hello",
6328
- unit: "hello",
6329
- version: "0.1.2"
6330
- },
6331
- supply
6332
- };
6333
- }
6334
- function refused(problem, reason = "") {
6335
- return {
6336
- id: `refused-${problem}`,
6337
- label: `预检拒:${problem}`,
6338
- phase: "idle",
6339
- spec: "@dsh-workbench/module-nope",
6340
- problem: {
6341
- problem,
6342
- reason
6343
- }
6344
- };
6345
- }
6346
- var ADD_MODULE_MOCKS = [
6347
- {
6348
- id: "empty",
6349
- label: "刚打开",
6350
- phase: "idle",
6351
- spec: ""
6352
- },
6353
- {
6354
- id: "typed",
6355
- label: "填了包名",
6356
- phase: "idle",
6357
- spec: "@dsh-workbench/module-hello"
6358
- },
6359
- {
6360
- id: "guide",
6361
- label: "展开了示例",
6362
- phase: "idle",
6363
- spec: "",
6364
- guideOpen: true
6365
- },
6366
- {
6367
- id: "inspecting",
6368
- label: "正在预检",
6369
- phase: "inspecting",
6370
- spec: "@dsh-workbench/module-hello"
6371
- },
6372
- refused("invalid-spec"),
6373
- refused("already-installed", "已经在 profile 里:@dsh-workbench/module-hello@0.1.2"),
6374
- refused("not-found"),
6375
- refused("not-a-package"),
6376
- refused("not-a-bundle"),
6377
- refused("not-a-module-or-plugin", "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上"),
6378
- refused("network", "getaddrinfo ENOTFOUND registry.example.com"),
6379
- refused("unknown", "pnpm 的返回码是 1"),
6380
- {
6381
- id: "preview",
6382
- label: "预览(可装)",
6383
- phase: "preview",
6384
- spec: "@dsh-workbench/module-hello",
6385
- preview: {
6386
- kind: "module",
6387
- name: "@dsh-workbench/module-hello",
6388
- version: "0.1.2",
6389
- description: "最小样本模块:一枚「你好」卡片",
6390
- registry: "registry.npmmirror.com"
6391
- }
6392
- },
6393
- {
6394
- id: "preview-no-source",
6395
- label: "预览(问不出源)",
6396
- phase: "preview",
6397
- spec: "@dsh-workbench/module-hello",
6398
- preview: {
6399
- kind: "module",
6400
- name: "@dsh-workbench/module-hello",
6401
- version: "",
6402
- description: "",
6403
- registry: ""
6404
- }
6405
- },
6406
- {
6407
- id: "preview-plugin",
6408
- label: "预览(opencli 插件)",
6409
- phase: "preview",
6410
- spec: "opencli-plugin-grafana",
6411
- preview: {
6412
- kind: "plugin",
6413
- name: "opencli-plugin-grafana",
6414
- version: "1.0.16",
6415
- description: "",
6416
- registry: "registry.npmmirror.com",
6417
- pluginName: "grafana"
6418
- }
6419
- },
6420
- {
6421
- id: "installing",
6422
- label: "正在安装(可取消)",
6423
- phase: "installing",
6424
- spec: "@dsh-workbench/module-hello"
6425
- },
6426
- {
6427
- id: "needs-approval",
6428
- label: "安装脚本待批",
6429
- phase: "result",
6430
- spec: "@dsh-workbench/module-hello",
6431
- outcome: {
6432
- ...outcome({
6433
- application: "failed",
6434
- stage: "install",
6435
- errorCode: "build-blocked",
6436
- pendingBuilds: ["esbuild", "sharp"]
6437
- }),
6438
- supply: {
6439
- state: "failed",
6440
- reason: "装上之前得先允许安装脚本"
6441
- }
6442
- }
6443
- },
6444
- {
6445
- id: "failed-registry",
6446
- label: "失败:源上没有",
6447
- phase: "result",
6448
- spec: "@dsh-workbench/module-nope",
6449
- outcome: outcome({
6450
- application: "failed",
6451
- stage: "install",
6452
- failedAt: "registry",
6453
- errorCode: "not-found"
6454
- })
6455
- },
6456
- {
6457
- id: "failed-pnpm",
6458
- label: "失败:pnpm 执行出错",
6459
- phase: "result",
6460
- spec: "@dsh-workbench/module-hello",
6461
- outcome: outcome({
6462
- application: "failed",
6463
- stage: "install",
6464
- errorCode: "operation-error",
6465
- errorDetail: "ERR_PNPM_FETCH_404 GET https://registry.example.com/@dsh-workbench%2Fmodule-hello: Not Found"
6466
- })
6467
- },
6468
- {
6469
- id: "done-applied",
6470
- label: "装好了(已生效)",
6471
- phase: "result",
6472
- spec: "@dsh-workbench/module-hello",
6473
- outcome: outcome({})
6474
- },
6475
- {
6476
- id: "done-plugin",
6477
- label: "装好了(opencli 插件)",
6478
- phase: "result",
6479
- spec: "opencli-plugin-cmdb",
6480
- outcome: {
6481
- change: change({ target: "opencli-plugin-cmdb" }),
6482
- module: {
6483
- kind: "unknown",
6484
- pkg: "opencli-plugin-cmdb"
6485
- },
6486
- supply: { state: "no-needs" },
6487
- plugin: {
6488
- kind: "opencli-plugin",
6489
- pkg: "opencli-plugin-cmdb",
6490
- name: "cmdb"
6491
- }
6492
- }
6493
- },
6494
- {
6495
- id: "done-restart",
6496
- label: "装好了(要重启,并说清是哪种:这一格是「某个已装的包换了目录」)",
6497
- phase: "result",
6498
- spec: "@dsh-workbench/module-hello",
6499
- outcome: outcome({
6500
- application: "restart-required",
6501
- restartReason: "package-moved"
6502
- }, { state: "pending-restart" })
6503
- },
6504
- {
6505
- id: "not-a-module",
6506
- label: "装进来的不是模块",
6507
- phase: "result",
6508
- spec: "some-random-package",
6509
- outcome: {
6510
- change: change({ target: "some-random-package" }),
6511
- module: {
6512
- kind: "not-module",
6513
- pkg: "some-random-package"
6514
- },
6515
- supply: { state: "not-a-module" }
6516
- }
6517
- },
6518
- {
6519
- id: "cancelled",
6520
- label: "已取消",
6521
- phase: "result",
6522
- spec: "@dsh-workbench/module-hello",
6523
- outcome: outcome({
6524
- application: "cancelled",
6525
- changed: false
6526
- }, { state: "no-needs" })
6527
- },
6528
- {
6529
- id: "done-no-needs",
6530
- label: "装好了(不要额外供给)",
6531
- phase: "result",
6532
- spec: "@dsh-workbench/module-plain",
6533
- outcome: {
6534
- change: change({ target: "@dsh-workbench/module-plain" }),
6535
- module: {
6536
- kind: "module",
6537
- pkg: "@dsh-workbench/module-plain",
6538
- unit: "plain",
6539
- version: "1.0.0"
6540
- },
6541
- supply: { state: "no-needs" }
6542
- }
6543
- },
6544
- {
6545
- id: "removed",
6546
- label: "移除掉了",
6547
- phase: "result",
6548
- spec: "some-random-package",
6549
- outcome: {
6550
- change: change({
6551
- stage: "remove",
6552
- target: "some-random-package"
6553
- }),
6554
- module: {
6555
- kind: "not-module",
6556
- pkg: "some-random-package"
6557
- },
6558
- supply: { state: "not-a-module" }
6559
- }
6560
- }
6561
- ];
6562
- var frozen = () => {};
6563
- function stateOfMock(base, mock) {
6564
- return {
6565
- ...base,
6566
- spec: mock.spec,
6567
- guideOpen: mock.guideOpen ?? false,
6568
- phase: mock.phase,
6569
- choices: base.choices,
6570
- custom: "",
6571
- registryOpen: false,
6572
- problem: mock.problem ?? null,
6573
- preview: mock.preview ?? null,
6574
- outcome: mock.outcome ?? null,
6575
- failure: mock.failure ?? null,
6576
- builds: mock.outcome?.change.pendingBuilds ?? [],
6577
- setSpec: frozen,
6578
- setChoice: frozen,
6579
- setCustom: frozen,
6580
- toggleRegistry: frozen,
6581
- closeRegistry: frozen,
6582
- toggleGuide: frozen,
6583
- check: frozen,
6584
- edit: frozen,
6585
- install: frozen,
6586
- cancelInstall: frozen,
6587
- removeIt: frozen
6588
- };
6589
- }
6590
- //#endregion
6591
5292
  //#region src/app/layouts/market/use-add-module.ts
6592
5293
  function newRequestId() {
6593
5294
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
@@ -6787,12 +5488,9 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6787
5488
  onInstalled,
6788
5489
  failedText: t("panels.failed")
6789
5490
  });
6790
- const pick = useFixturePick({
6791
- fixtures: ADD_MODULE_MOCKS,
6792
- initial: ADD_MODULE_MOCKS[0]?.id ?? null
6793
- });
6794
- const mock = pick.enabled ? pick.current : void 0;
6795
- const state = mock === void 0 ? real : stateOfMock(real, mock);
5491
+ const devAdd = devSurface.useStrips("addModule", []);
5492
+ const mock = devAdd.current;
5493
+ const state = mock === void 0 ? real : devSurface.addModuleState(real, mock);
6796
5494
  if (!open) return null;
6797
5495
  const installing = state.phase === "installing";
6798
5496
  const checking = state.phase === "inspecting";
@@ -6808,10 +5506,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6808
5506
  disabled: empty || checking,
6809
5507
  "aria-busy": checking,
6810
5508
  onClick: state.check
6811
- }, checking ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
6812
- state: "ongoing",
6813
- size: 12
6814
- }) : null, t(checking ? "panels.market.add.checking" : "panels.market.add.run"))) : null, state.phase === "preview" ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
5509
+ }, checking ? /* @__PURE__ */ h(Spinner, { size: 12 }) : null, t(checking ? "panels.market.add.checking" : "panels.market.add.run"))) : null, state.phase === "preview" ? /* @__PURE__ */ h(Fragment, null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
6815
5510
  type: "button",
6816
5511
  variant: "outline",
6817
5512
  size: "md",
@@ -6839,10 +5534,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6839
5534
  disabled: state.removing,
6840
5535
  "aria-busy": state.removing,
6841
5536
  onClick: state.removeIt
6842
- }, state.removing ? /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
6843
- state: "ongoing",
6844
- size: 12
6845
- }) : null, t(state.removing ? "panels.market.uninstalling" : "panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
5537
+ }, state.removing ? /* @__PURE__ */ h(Spinner, { size: 12 }) : null, t(state.removing ? "panels.market.uninstalling" : "panels.market.add.remove")) : null, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.Button, {
6846
5538
  type: "button",
6847
5539
  variant: "outline",
6848
5540
  size: "md",
@@ -6869,12 +5561,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6869
5561
  className: AddModule_module_default.dialog,
6870
5562
  contentClassName: AddModule_module_default.content,
6871
5563
  footer
6872
- }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, pick.enabled ? /* @__PURE__ */ h(MockStrip, {
6873
- mocks: ADD_MODULE_MOCKS,
6874
- index: pick.index,
6875
- note: "夹具:只切状态,不发请求",
6876
- onPick: (at) => pick.pick(ADD_MODULE_MOCKS[at]?.id ?? null)
6877
- }) : null, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
5564
+ }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
6878
5565
  t,
6879
5566
  state
6880
5567
  }) : null, state.phase === "inspecting" ? /* @__PURE__ */ h(AddModulePending, {
@@ -6982,13 +5669,9 @@ function MarketPanel({ t, units }) {
6982
5669
  checking: true,
6983
5670
  checkedAt: null
6984
5671
  };
6985
- const marketMocks = useMemo(() => buildMarketMocks(fixtureRoster(manifests)), [manifests]);
6986
- const fixturePick = useFixturePick({
6987
- fixtures: marketMocks,
6988
- initial: marketMocks[0]?.id ?? null
6989
- });
6990
- const mock = fixturePick.enabled ? fixturePick.current : void 0;
6991
- const mockNonce = fixturePick.nonce;
5672
+ const devMarket = devSurface.useStrips("market", manifests);
5673
+ const mock = devMarket.current;
5674
+ const mockNonce = devMarket.pick.nonce;
6992
5675
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
6993
5676
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
6994
5677
  const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
@@ -7011,11 +5694,7 @@ function MarketPanel({ t, units }) {
7011
5694
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
7012
5695
  disabled: busy,
7013
5696
  onClick: openAddModule
7014
- }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
7015
- mocks: marketMocks,
7016
- index: fixturePick.index,
7017
- onPick: (at) => fixturePick.pick(marketMocks[at]?.id ?? null)
7018
- }) : null, /* @__PURE__ */ h(MarketView, {
5697
+ }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ h(MarketView, {
7019
5698
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
7020
5699
  t,
7021
5700
  manifests,
@@ -7359,7 +6038,7 @@ function ReadingRow({ t }) {
7359
6038
  return /* @__PURE__ */ h("div", { className: ConfigSyncSection_module_default.reading }, /* @__PURE__ */ h("p", {
7360
6039
  className: ConfigSyncSection_module_default.status,
7361
6040
  role: "status"
7362
- }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: "ongoing" }), t("configSync.loading")), /* @__PURE__ */ h(SkeletonRows, { rows: 3 }));
6041
+ }, /* @__PURE__ */ h(Spinner, null), t("configSync.loading")), /* @__PURE__ */ h(SkeletonRows, { rows: 3 }));
7363
6042
  }
7364
6043
  function FailureRow({ t, blocker, onRetry }) {
7365
6044
  return /* @__PURE__ */ h("div", {
@@ -7517,6 +6196,182 @@ function assembleClientUnits(registry) {
7517
6196
  for (const face of CLIENT_UNITS) registry.register(face);
7518
6197
  }
7519
6198
  //#endregion
6199
+ //#region src/app/layouts/rightbar/registry.ts
6200
+ function createBoardRegistry() {
6201
+ const modules = [];
6202
+ const listeners = /* @__PURE__ */ new Set();
6203
+ let revision = 0;
6204
+ let sorted = [];
6205
+ let index = /* @__PURE__ */ new Map();
6206
+ let steps = /* @__PURE__ */ new Map();
6207
+ function rebuild() {
6208
+ sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
6209
+ index = new Map(sorted.map((module) => [module.id, module]));
6210
+ const table = /* @__PURE__ */ new Map();
6211
+ for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
6212
+ const owner = table.get(kind);
6213
+ if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
6214
+ table.set(kind, module);
6215
+ }
6216
+ steps = table;
6217
+ }
6218
+ function notify() {
6219
+ revision += 1;
6220
+ for (const listener of listeners) listener();
6221
+ }
6222
+ return {
6223
+ register(module) {
6224
+ if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
6225
+ modules.push(module);
6226
+ try {
6227
+ rebuild();
6228
+ } catch (error) {
6229
+ modules.pop();
6230
+ rebuild();
6231
+ throw error;
6232
+ }
6233
+ notify();
6234
+ return () => {
6235
+ const at = modules.indexOf(module);
6236
+ if (at < 0) return;
6237
+ modules.splice(at, 1);
6238
+ rebuild();
6239
+ notify();
6240
+ };
6241
+ },
6242
+ all: () => sorted,
6243
+ byId: (id) => index.get(id),
6244
+ stepOwner: (kind) => steps.get(kind),
6245
+ subscribe(listener) {
6246
+ listeners.add(listener);
6247
+ return () => listeners.delete(listener);
6248
+ },
6249
+ version: () => revision
6250
+ };
6251
+ }
6252
+ //#endregion
6253
+ //#region src/app/units/registry.ts
6254
+ function toBoardModule(face, manifest) {
6255
+ const View = face.card;
6256
+ if (View === void 0) return void 0;
6257
+ return {
6258
+ id: manifest.id,
6259
+ titleKey: manifest.card?.titleKey ?? manifest.id,
6260
+ order: manifest.card?.order ?? 100,
6261
+ View,
6262
+ ...face.steps === void 0 ? {} : { steps: face.steps }
6263
+ };
6264
+ }
6265
+ function createClientUnitRegistry(options = {}) {
6266
+ const registrations = [];
6267
+ const refusals = [];
6268
+ const listeners = /* @__PURE__ */ new Set();
6269
+ const board = createBoardRegistry();
6270
+ let known = /* @__PURE__ */ new Map();
6271
+ let installableIds = null;
6272
+ let revision = 0;
6273
+ let manifestsCache;
6274
+ function notify() {
6275
+ revision += 1;
6276
+ for (const listener of [...listeners]) try {
6277
+ listener();
6278
+ } catch (error) {
6279
+ console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
6280
+ }
6281
+ }
6282
+ function warnRefusal(unit, kind, reasons) {
6283
+ refusals.push({
6284
+ unit,
6285
+ kind,
6286
+ reasons
6287
+ });
6288
+ console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
6289
+ }
6290
+ function takeBackRefusal(unit) {
6291
+ for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
6292
+ }
6293
+ function attach(entry) {
6294
+ const manifest = known.get(entry.unit);
6295
+ if (manifest === void 0) return false;
6296
+ const boardModule = toBoardModule(entry.face, manifest);
6297
+ entry.mounted = {
6298
+ manifest,
6299
+ unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
6300
+ };
6301
+ takeBackRefusal(entry.unit);
6302
+ return true;
6303
+ }
6304
+ function detach(entry) {
6305
+ entry.mounted?.unmount();
6306
+ entry.mounted = null;
6307
+ }
6308
+ return {
6309
+ register(face) {
6310
+ const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
6311
+ if (unit === "") {
6312
+ warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
6313
+ notify();
6314
+ return () => {};
6315
+ }
6316
+ if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
6317
+ const entry = {
6318
+ face,
6319
+ unit,
6320
+ mounted: null
6321
+ };
6322
+ registrations.push(entry);
6323
+ manifestsCache = void 0;
6324
+ if (!attach(entry)) {
6325
+ warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
6326
+ options.onUnknownUnit?.(unit);
6327
+ }
6328
+ notify();
6329
+ return () => {
6330
+ const at = registrations.indexOf(entry);
6331
+ if (at < 0) return;
6332
+ registrations.splice(at, 1);
6333
+ detach(entry);
6334
+ takeBackRefusal(unit);
6335
+ manifestsCache = void 0;
6336
+ notify();
6337
+ };
6338
+ },
6339
+ all: () => registrations.map((entry) => entry.face),
6340
+ manifests: () => {
6341
+ manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
6342
+ return manifestsCache;
6343
+ },
6344
+ refusals: () => refusals,
6345
+ installable: () => installableIds,
6346
+ setManifests(manifests, installable) {
6347
+ known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
6348
+ installableIds = installable === void 0 ? null : new Set(installable);
6349
+ let changed = false;
6350
+ for (const entry of registrations) {
6351
+ const next = known.get(entry.unit);
6352
+ if (entry.mounted === null) {
6353
+ if (next !== void 0 && attach(entry)) changed = true;
6354
+ continue;
6355
+ }
6356
+ if (next === void 0) {
6357
+ detach(entry);
6358
+ warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
6359
+ changed = true;
6360
+ }
6361
+ }
6362
+ if (!changed) return;
6363
+ manifestsCache = void 0;
6364
+ notify();
6365
+ },
6366
+ board,
6367
+ subscribe(listener) {
6368
+ listeners.add(listener);
6369
+ return () => listeners.delete(listener);
6370
+ },
6371
+ version: () => revision
6372
+ };
6373
+ }
6374
+ //#endregion
7520
6375
  //#region src/shared/api/unit-manifests.ts
7521
6376
  var UNIT_MANIFESTS_ROUTE = "unit-manifests";
7522
6377
  //#endregion
@@ -7680,281 +6535,12 @@ function spinnerIcon(size = 14) {
7680
6535
  svg.append(group);
7681
6536
  return svg;
7682
6537
  }
7683
- function el$1(tag, className, text) {
7684
- const node = document.createElement(tag);
7685
- node.className = className;
7686
- if (text !== void 0) node.textContent = text;
7687
- return node;
7688
- }
7689
- //#endregion
7690
- //#region src/app/layouts/env-gate/gate-mock.ts
7691
- var INSTALL_COMMAND = "npm i --prefix '/Users/you/.dsh/workbench/opencli/toolchain' @jackwener/opencli@1.8.8";
7692
- var EXTENSION_REPORT = [
7693
- "[OK] Daemon: running on port 19825 (v1.8.8)",
7694
- "[MISSING] Extension: not connected",
7695
- "[OK] Connectivity: connected in 0.0s",
7696
- "",
7697
- "Issues:",
7698
- " • Daemon is running but the Chrome/Chromium extension is not connected.",
7699
- "If the extension is already installed, try: opencli daemon restart",
7700
- "If the extension is not installed:",
7701
- " 1. Download from https://github.com/jackwener/opencli/releases",
7702
- " 2. Open chrome://extensions/ → Enable Developer Mode",
7703
- " 3. Click \"Load unpacked\" → select the extension folder"
7704
- ].join("\n");
7705
- var DAEMON_REPORT = [
7706
- "[MISSING] Daemon: not running",
7707
- "[MISSING] Extension: not connected",
7708
- "[FAIL] Connectivity: failed (daemon not reachable)",
7709
- "",
7710
- "Issues:",
7711
- " • Daemon is not running. It should start automatically when you run an opencli browser command.",
7712
- " • Daemon is running but the Chrome/Chromium extension is not connected.",
7713
- "If the extension is already installed, try: opencli daemon restart"
7714
- ].join("\n");
7715
- var PROFILE_REPORT = [
7716
- "[OK] Daemon: running on port 19825 (v1.8.8)",
7717
- "[MISSING] Extension: not connected",
7718
- "[FAIL] Connectivity: failed (profile-required)",
7719
- "",
7720
- "Issues:",
7721
- " • Multiple Chrome profiles are connected to the daemon, but no default profile was selected.",
7722
- " Run opencli profile list, then opencli profile use <name>, or pass --profile <name>."
7723
- ].join("\n");
7724
- var AT = 1790574156506;
7725
- function mock(id, label, note, snapshot, expect) {
7726
- return {
7727
- id,
7728
- label,
7729
- note,
7730
- snapshot: {
7731
- ...snapshot,
7732
- at: AT
7733
- },
7734
- expect
7735
- };
7736
- }
7737
- var BRIDGE_PENDING = {
7738
- id: "bridge",
7739
- status: "pending"
7740
- };
7741
- var GATE_MOCKS = [
7742
- mock("boot", "刚立起来", "还没拿到体检结果的那一帧:只有标题 + 一句\"正在检测运行环境…\",一行步骤都还没有。", {
7743
- phase: "idle",
7744
- steps: []
7745
- }, {
7746
- hint: "checking",
7747
- command: false
7748
- }),
7749
- mock("checking", "检测中", "第一步在跑(转圈 + 它正在执行的命令),第二步还没轮到(短横)。", {
7750
- phase: "checking",
7751
- steps: [{
7752
- id: "opencli",
7753
- status: "running",
7754
- action: "opencli --version"
7755
- }, BRIDGE_PENDING]
7756
- }, {
7757
- hint: "checking",
7758
- command: false
7759
- }),
7760
- mock("installing", "安装中(npm 在跑)", "缺 opencli:正在装。右边会**数秒**(静止的圆点看不出在干活)。", {
7761
- phase: "installing",
7762
- steps: [{
7763
- id: "opencli",
7764
- status: "running",
7765
- action: INSTALL_COMMAND,
7766
- command: INSTALL_COMMAND
7767
- }, BRIDGE_PENDING]
7768
- }, {
7769
- hint: "installing",
7770
- command: false
7771
- }),
7772
- mock("ready", "都就绪(真机到这就放行)", "两步都过。这一帧之后 gate 立刻撤掉 —— 钉住它只是为了看一眼这两行长什么样。", {
7773
- phase: "ready",
7774
- steps: [{
7775
- id: "opencli",
7776
- status: "ok",
7777
- detail: "1.8.8"
7778
- }, {
7779
- id: "bridge",
7780
- status: "ok",
7781
- detail: "Everything looks good!"
7782
- }]
7783
- }, {
7784
- hint: "checking",
7785
- command: false
7786
- }),
7787
- mock("warn-extension", "浏览器通道:扩展没连上", "daemon 在跑、扩展没连上(最常见):行尾说\"没连上\",下面给「去应用商店装扩展」+ `daemon restart`,原文折叠当证据。", {
7788
- phase: "ready",
7789
- steps: [{
7790
- id: "opencli",
7791
- status: "ok",
7792
- detail: "1.8.8"
7793
- }, {
7794
- id: "bridge",
7795
- status: "warn",
7796
- detail: EXTENSION_REPORT,
7797
- command: "opencli daemon restart"
7798
- }],
7799
- bridgeIssues: ["extension"]
7800
- }, {
7801
- hint: "checking",
7802
- command: false,
7803
- bridgeIssues: ["extension"]
7804
- }),
7805
- mock("warn-daemon", "浏览器通道:服务没起来", "daemon 没起来(扩展跟着也连不上):两条人话都摆出来,命令给 `daemon restart`。", {
7806
- phase: "ready",
7807
- steps: [{
7808
- id: "opencli",
7809
- status: "ok",
7810
- detail: "1.8.8"
7811
- }, {
7812
- id: "bridge",
7813
- status: "warn",
7814
- detail: DAEMON_REPORT,
7815
- command: "opencli daemon restart"
7816
- }],
7817
- bridgeIssues: ["daemon", "extension"]
7818
- }, {
7819
- hint: "checking",
7820
- command: false,
7821
- bridgeIssues: ["daemon", "extension"]
7822
- }),
7823
- mock("warn-profile", "浏览器通道:没选默认 profile", "连了多个浏览器 profile 但没选默认:只说\"选哪个\"(重启服务解决不了它),命令给 `profile list`。", {
7824
- phase: "ready",
7825
- steps: [{
7826
- id: "opencli",
7827
- status: "ok",
7828
- detail: "1.8.8"
7829
- }, {
7830
- id: "bridge",
7831
- status: "warn",
7832
- detail: PROFILE_REPORT,
7833
- command: "opencli profile list"
7834
- }],
7835
- bridgeIssues: ["profile"]
7836
- }, {
7837
- hint: "checking",
7838
- command: false,
7839
- bridgeIssues: ["profile"]
7840
- }),
7841
- mock("failed-permission", "装不上:权限不足", "失败态:为什么需要它 → 确切命令(可复制)→ 照做能解决的一句人话(EACCES → 换目录 / sudo)。", {
7842
- phase: "failed",
7843
- steps: [{
7844
- id: "opencli",
7845
- status: "failed",
7846
- detail: "npm ERR! code EACCES",
7847
- command: INSTALL_COMMAND
7848
- }, BRIDGE_PENDING],
7849
- error: "npm ERR! code EACCES\nnpm ERR! syscall mkdir\nnpm ERR! path /usr/local/lib/node_modules",
7850
- failure: "permission",
7851
- guidance: "install"
7852
- }, {
7853
- hint: "failed",
7854
- guidance: "install",
7855
- command: true
7856
- }),
7857
- mock("failed-network", "装不上:网络不通", "同一档失败,但人话换成\"查代理\"那条(EAI_AGAIN / ENOTFOUND)。", {
7858
- phase: "failed",
7859
- steps: [{
7860
- id: "opencli",
7861
- status: "failed",
7862
- detail: "npm ERR! code EAI_AGAIN",
7863
- command: INSTALL_COMMAND
7864
- }, BRIDGE_PENDING],
7865
- error: "npm ERR! code EAI_AGAIN\nnpm ERR! network request to https://registry.npmjs.org failed",
7866
- failure: "network",
7867
- guidance: "install"
7868
- }, {
7869
- hint: "failed",
7870
- guidance: "install",
7871
- command: true
7872
- }),
7873
- mock("failed-unknown", "装不上:认不出的错", "认不出失败种类时**不编**建议:只给命令与原文(多一句假建议比少一句更糟)。", {
7874
- phase: "failed",
7875
- steps: [{
7876
- id: "opencli",
7877
- status: "failed",
7878
- detail: "something went wrong",
7879
- command: INSTALL_COMMAND
7880
- }, BRIDGE_PENDING],
7881
- error: "something went wrong",
7882
- failure: "unknown",
7883
- guidance: "install"
7884
- }, {
7885
- hint: "failed",
7886
- guidance: "install",
7887
- command: true
7888
- }),
7889
- mock("failed-path", "装了但还找不到", "装完了 `--version` 还是不行:**不再让用户装一遍**(PATH / 新终端的事),所以不给命令。", {
7890
- phase: "failed",
7891
- steps: [{
7892
- id: "opencli",
7893
- status: "failed",
7894
- detail: "zsh: command not found: opencli",
7895
- command: INSTALL_COMMAND
7896
- }, BRIDGE_PENDING],
7897
- error: "zsh: command not found: opencli",
7898
- failure: "missing",
7899
- guidance: "path"
7900
- }, {
7901
- hint: "failed",
7902
- guidance: "path",
7903
- command: false
7904
- }),
7905
- mock("failed-shell", "执行缝坏了", "连 shell 都调不动:装也不可能成功。没有\"正在执行的动作\"、也没有命令 —— 该做的是重启宿主。", {
7906
- phase: "failed",
7907
- steps: [{
7908
- id: "opencli",
7909
- status: "failed",
7910
- detail: "Error: spawn /bin/sh ENOENT"
7911
- }, BRIDGE_PENDING],
7912
- error: "Error: spawn /bin/sh ENOENT",
7913
- failure: "unknown",
7914
- guidance: "shell"
7915
- }, {
7916
- hint: "failed",
7917
- guidance: "shell",
7918
- command: false
7919
- })
7920
- ];
7921
6538
  function el(tag, className, text) {
7922
6539
  const node = document.createElement(tag);
7923
6540
  node.className = className;
7924
6541
  if (text !== void 0) node.textContent = text;
7925
6542
  return node;
7926
6543
  }
7927
- function mountGateMockStrip(options) {
7928
- const strip = el("div", `wb-mockStrip ${BootGate_module_default.mockSlot}`);
7929
- const note = el("span", "wb-mockNote");
7930
- const chips = [];
7931
- const paint = (active) => {
7932
- note.textContent = `夹具:钉住启动页的状态,不轮询、不放行 —— ${active?.note ?? "不接管:按真机走(就绪就放行)。"}`;
7933
- chips.forEach((chip) => {
7934
- chip.className = `wb-mockChip${chip.dataset.mock === active?.id ? " wb-mockChipOn" : ""}`;
7935
- });
7936
- };
7937
- const pick = (active) => {
7938
- paint(active);
7939
- options.onPick(active === null ? null : active.snapshot);
7940
- };
7941
- const real = el("button", "wb-mockChip", "真实");
7942
- real.setAttribute("type", "button");
7943
- real.dataset.mock = "";
7944
- real.addEventListener("click", () => pick(null));
7945
- strip.append(note, real);
7946
- chips.push(real);
7947
- for (const item of GATE_MOCKS) {
7948
- const chip = el("button", "wb-mockChip", item.label);
7949
- chip.setAttribute("type", "button");
7950
- chip.dataset.mock = item.id;
7951
- chip.addEventListener("click", () => pick(item));
7952
- strip.append(chip);
7953
- chips.push(chip);
7954
- }
7955
- pick(GATE_MOCKS[0] ?? null);
7956
- return strip;
7957
- }
7958
6544
  //#endregion
7959
6545
  //#region src/app/layouts/env-gate/boot-gate.ts
7960
6546
  var POLL_MS = 400;
@@ -7985,9 +6571,9 @@ function createForcePlan() {
7985
6571
  };
7986
6572
  }
7987
6573
  function commandRow(t) {
7988
- const row = el$1("div", BootGate_module_default.commandRow);
7989
- const code = el$1("code", BootGate_module_default.command);
7990
- const copy = el$1("button", BootGate_module_default.copy);
6574
+ const row = el("div", BootGate_module_default.commandRow);
6575
+ const code = el("code", BootGate_module_default.command);
6576
+ const copy = el("button", BootGate_module_default.copy);
7991
6577
  copy.setAttribute("type", "button");
7992
6578
  copy.setAttribute("aria-label", t("env.copyCommand"));
7993
6579
  copy.title = t("env.copyCommand");
@@ -8020,47 +6606,47 @@ function createBootGate(ctx, options = {}) {
8020
6606
  const request = options.request ?? apiGet;
8021
6607
  if (typeof document === "undefined" || typeof document.getElementById !== "function" || document.body === void 0) return { close: () => {} };
8022
6608
  const root = document.getElementById("root");
8023
- const overlay = el$1("div", BootGate_module_default.gate);
6609
+ const overlay = el("div", BootGate_module_default.gate);
8024
6610
  overlay.setAttribute("role", "dialog");
8025
6611
  overlay.setAttribute("aria-modal", "true");
8026
6612
  overlay.setAttribute("aria-label", t("env.title"));
8027
- const card = el$1("div", BootGate_module_default.card);
8028
- const title = el$1("h1", BootGate_module_default.title, t("env.title"));
8029
- const hint = el$1("p", BootGate_module_default.hint, t("env.checking"));
8030
- const list = el$1("ul", BootGate_module_default.steps);
8031
- const progressRow = el$1("div", BootGate_module_default.progress);
6613
+ const card = el("div", BootGate_module_default.card);
6614
+ const title = el("h1", BootGate_module_default.title, t("env.title"));
6615
+ const hint = el("p", BootGate_module_default.hint, t("env.checking"));
6616
+ const list = el("ul", BootGate_module_default.steps);
6617
+ const progressRow = el("div", BootGate_module_default.progress);
8032
6618
  progressRow.hidden = true;
8033
- const elapsed = el$1("span", BootGate_module_default.elapsed);
6619
+ const elapsed = el("span", BootGate_module_default.elapsed);
8034
6620
  progressRow.append(elapsed);
8035
- const actions = el$1("div", BootGate_module_default.actions);
6621
+ const actions = el("div", BootGate_module_default.actions);
8036
6622
  actions.hidden = true;
8037
- const fixTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
8038
- const fixWhy = el$1("p", BootGate_module_default.hint);
8039
- const fixStep = el$1("p", BootGate_module_default.hint);
8040
- const fixAdvice = el$1("p", BootGate_module_default.hint);
8041
- const raw = el$1("details", BootGate_module_default.raw);
8042
- const rawSummary = el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
8043
- const errorBox = el$1("pre", BootGate_module_default.error);
6623
+ const fixTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6624
+ const fixWhy = el("p", BootGate_module_default.hint);
6625
+ const fixStep = el("p", BootGate_module_default.hint);
6626
+ const fixAdvice = el("p", BootGate_module_default.hint);
6627
+ const raw = el("details", BootGate_module_default.raw);
6628
+ const rawSummary = el("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
6629
+ const errorBox = el("pre", BootGate_module_default.error);
8044
6630
  raw.append(rawSummary, errorBox);
8045
- const buttons = el$1("div", BootGate_module_default.buttons);
8046
- const retry = el$1("button", BootGate_module_default.button, t("env.retry"));
6631
+ const buttons = el("div", BootGate_module_default.buttons);
6632
+ const retry = el("button", BootGate_module_default.button, t("env.retry"));
8047
6633
  retry.setAttribute("type", "button");
8048
6634
  const fixCommand = commandRow(t);
8049
6635
  buttons.append(retry);
8050
6636
  actions.append(fixTitle, fixWhy, fixStep, fixCommand.row, fixAdvice, buttons, raw);
8051
- const bridge = el$1("div", BootGate_module_default.bridge);
6637
+ const bridge = el("div", BootGate_module_default.bridge);
8052
6638
  bridge.hidden = true;
8053
- const bridgeTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
8054
- const bridgeWhy = el$1("p", BootGate_module_default.hint, t("env.bridge.why"));
8055
- const bridgeLines = el$1("ul", BootGate_module_default.bridgeLines);
6639
+ const bridgeTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6640
+ const bridgeWhy = el("p", BootGate_module_default.hint, t("env.bridge.why"));
6641
+ const bridgeLines = el("ul", BootGate_module_default.bridgeLines);
8056
6642
  const bridgeCommand = commandRow(t);
8057
- const bridgeRetry = el$1("button", BootGate_module_default.button, t("env.retry"));
6643
+ const bridgeRetry = el("button", BootGate_module_default.button, t("env.retry"));
8058
6644
  bridgeRetry.setAttribute("type", "button");
8059
- const bridgeButtons = el$1("div", BootGate_module_default.buttons);
6645
+ const bridgeButtons = el("div", BootGate_module_default.buttons);
8060
6646
  bridgeButtons.append(bridgeRetry);
8061
- const bridgeRaw = el$1("details", BootGate_module_default.raw);
8062
- const bridgeRawText = el$1("pre", BootGate_module_default.error);
8063
- bridgeRaw.append(el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
6647
+ const bridgeRaw = el("details", BootGate_module_default.raw);
6648
+ const bridgeRawText = el("pre", BootGate_module_default.error);
6649
+ bridgeRaw.append(el("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
8064
6650
  bridge.append(bridgeTitle, bridgeWhy, bridgeLines, bridgeCommand.row, bridgeButtons, bridgeRaw);
8065
6651
  card.append(title, hint, list, progressRow, actions, bridge);
8066
6652
  overlay.append(card);
@@ -8106,16 +6692,16 @@ function createBootGate(ctx, options = {}) {
8106
6692
  function ensureRow(step) {
8107
6693
  const existing = rows.get(step.id);
8108
6694
  if (existing !== void 0) return existing;
8109
- const item = el$1("li", BootGate_module_default.step);
8110
- const mark = el$1("span", BootGate_module_default.mark);
6695
+ const item = el("li", BootGate_module_default.step);
6696
+ const mark = el("span", BootGate_module_default.mark);
8111
6697
  mark.setAttribute("aria-hidden", "true");
8112
6698
  const row = {
8113
6699
  item,
8114
6700
  mark,
8115
- detail: el$1("span", BootGate_module_default.detail),
6701
+ detail: el("span", BootGate_module_default.detail),
8116
6702
  status: ""
8117
6703
  };
8118
- item.append(mark, el$1("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
6704
+ item.append(mark, el("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
8119
6705
  rows.set(step.id, row);
8120
6706
  return row;
8121
6707
  }
@@ -8162,7 +6748,7 @@ function createBootGate(ctx, options = {}) {
8162
6748
  if (bridgeBroken && bridgeStep !== void 0) {
8163
6749
  bridgeLines.replaceChildren(...(snapshot.bridgeIssues ?? ["unknown"]).map((issue) => {
8164
6750
  const advice = bridgeAdvice(issue);
8165
- const item = el$1("li", BootGate_module_default.bridgeLine, t(advice.textKey));
6751
+ const item = el("li", BootGate_module_default.bridgeLine, t(advice.textKey));
8166
6752
  if (advice.link !== void 0) {
8167
6753
  const link = document.createElement("a");
8168
6754
  link.className = BootGate_module_default.link;
@@ -8211,8 +6797,9 @@ function createBootGate(ctx, options = {}) {
8211
6797
  }
8212
6798
  retry.addEventListener("click", retryNow);
8213
6799
  bridgeRetry.addEventListener("click", retryNow);
8214
- if (mockModeOn(typeof window === "undefined" ? "" : window.location?.search ?? "")) {
8215
- const strip = mountGateMockStrip({ onPick: (snapshot) => {
6800
+ const search = typeof window === "undefined" ? "" : window.location?.search ?? "";
6801
+ if (devSurface.on(search)) {
6802
+ const strip = devSurface.gateStrip({ onPick: (snapshot) => {
8216
6803
  pinned = snapshot;
8217
6804
  if (snapshot !== null) {
8218
6805
  render(snapshot);
@@ -8220,7 +6807,7 @@ function createBootGate(ctx, options = {}) {
8220
6807
  }
8221
6808
  poll();
8222
6809
  } });
8223
- overlay.append(strip);
6810
+ if (strip !== null) overlay.append(strip);
8224
6811
  }
8225
6812
  poll();
8226
6813
  return { close };
@@ -8555,18 +7142,6 @@ function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
8555
7142
  }, t("panels.browseMarket")))
8556
7143
  });
8557
7144
  }
8558
- //#endregion
8559
- //#region src/app/layouts/rightbar/BoardMockStrip.tsx
8560
- function BoardMockStrip({ fixtures, show }) {
8561
- const current = fixtures.mock;
8562
- if (!show || current === void 0) return null;
8563
- return /* @__PURE__ */ h(MockStrip, {
8564
- note: `夹具:只切形状,不碰真实配置;卡片上的数据看卡片夹具 —— ${current.note}`,
8565
- mocks: fixtures.mocks,
8566
- index: fixtures.index,
8567
- onPick: fixtures.pick
8568
- });
8569
- }
8570
7145
  var ModulesPage_module_default = {
8571
7146
  trigger: "_trigger_15ptp_1",
8572
7147
  pop: "_pop_15ptp_6",
@@ -8593,250 +7168,6 @@ var ModulesPage_module_default = {
8593
7168
  groupTitle: "_groupTitle_15ptp_191"
8594
7169
  };
8595
7170
  //#endregion
8596
- //#region src/app/layouts/rightbar/panel-mock.ts
8597
- function row$1(id, titleKey, shown) {
8598
- return {
8599
- id,
8600
- titleKey,
8601
- shown,
8602
- source: "user",
8603
- hasCard: true
8604
- };
8605
- }
8606
- function noCardRow(id, titleKey) {
8607
- return {
8608
- id,
8609
- titleKey,
8610
- shown: false,
8611
- source: "user",
8612
- hasCard: false
8613
- };
8614
- }
8615
- function plugin(id, pkg, title, shown) {
8616
- return {
8617
- id,
8618
- pkg,
8619
- title,
8620
- shown,
8621
- source: "user"
8622
- };
8623
- }
8624
- var PLUGIN_MOCK = {
8625
- id: "plugin",
8626
- label: "opencli 插件行(标出是插件,能开能关)",
8627
- units: [],
8628
- plugins: [plugin("plugin:opencli-plugin-cmdb", "opencli-plugin-cmdb", "cmdb", true), plugin("plugin:opencli-plugin-notes", "opencli-plugin-notes", "notes", false)],
8629
- capabilities: {},
8630
- expect: { rows: 0 }
8631
- };
8632
- function probe(unit, status) {
8633
- return { [unit]: {
8634
- unit,
8635
- status,
8636
- required: [],
8637
- missing: [],
8638
- detail: "夹具"
8639
- } };
8640
- }
8641
- function buildPanelMocks(roster) {
8642
- const found = roster.find((manifest) => manifest.card !== null);
8643
- if (found === void 0) return [{
8644
- id: "empty",
8645
- label: "列表空(都卸了/都关了)",
8646
- units: [],
8647
- capabilities: {},
8648
- expect: { rows: 0 }
8649
- }, PLUGIN_MOCK];
8650
- const titleKey = found.card?.titleKey ?? found.id;
8651
- const id = found.id;
8652
- const on = row$1(id, titleKey, true);
8653
- const off = row$1(id, titleKey, false);
8654
- const twin = row$1(`${id}-b`, titleKey, true);
8655
- const third = row$1(`${id}-c`, titleKey, false);
8656
- return [
8657
- {
8658
- id: "one",
8659
- label: "一行:已启用、装好了",
8660
- units: [on],
8661
- capabilities: probe(id, "ok"),
8662
- expect: {
8663
- rows: 1,
8664
- badge: null,
8665
- on: true
8666
- }
8667
- },
8668
- {
8669
- id: "off",
8670
- label: "已停用(开关关着)",
8671
- units: [off],
8672
- capabilities: probe(id, "ok"),
8673
- expect: {
8674
- rows: 1,
8675
- badge: null,
8676
- on: false
8677
- }
8678
- },
8679
- {
8680
- id: "missing",
8681
- label: "⚠ 没装好 → 不列(去市场装)",
8682
- units: [on],
8683
- capabilities: probe(id, "missing-plugin"),
8684
- expect: { rows: 0 }
8685
- },
8686
- {
8687
- id: "outdated",
8688
- label: "⚠ 缺命令(也没装好)→ 同样不列",
8689
- units: [on],
8690
- capabilities: probe(id, "missing-commands"),
8691
- expect: { rows: 0 }
8692
- },
8693
- {
8694
- id: "unchecked",
8695
- label: "⚠ 检测不了",
8696
- units: [on],
8697
- capabilities: probe(id, "unchecked"),
8698
- expect: {
8699
- rows: 1,
8700
- badge: "panels.dep.unchecked",
8701
- on: true
8702
- }
8703
- },
8704
- {
8705
- id: "checking",
8706
- label: "还没探到(没有徽标)",
8707
- units: [on],
8708
- capabilities: null,
8709
- expect: {
8710
- rows: 1,
8711
- badge: null,
8712
- on: true
8713
- }
8714
- },
8715
- {
8716
- id: "many",
8717
- label: "三行(顺序 / 停用混着)",
8718
- units: [
8719
- on,
8720
- twin,
8721
- third
8722
- ],
8723
- capabilities: {
8724
- ...probe(id, "ok"),
8725
- ...probe(`${id}-b`, "ok"),
8726
- ...probe(`${id}-c`, "ok")
8727
- },
8728
- expect: {
8729
- rows: 3,
8730
- badge: null,
8731
- on: true
8732
- }
8733
- },
8734
- {
8735
- id: "no-card",
8736
- label: "没看板的模块(只有基座命令那种):也列出来、带「无看板」标签,开关照常能用,只是不参与排序",
8737
- units: [on, noCardRow(`${id}-c`, `${titleKey}(无看板)`)],
8738
- capabilities: {
8739
- ...probe(id, "ok"),
8740
- ...probe(`${id}-c`, "ok")
8741
- },
8742
- expect: {
8743
- rows: 2,
8744
- badge: null,
8745
- on: true
8746
- }
8747
- },
8748
- {
8749
- id: "long",
8750
- label: "超长模块名",
8751
- units: [row$1(id, "一个名字特别特别长的模块用来验证省略号会不会把开关挤下去", true)],
8752
- capabilities: probe(id, "ok"),
8753
- expect: {
8754
- rows: 1,
8755
- badge: null
8756
- }
8757
- },
8758
- {
8759
- id: "hidden",
8760
- label: "卸载后不显示(未启用 + 没装)",
8761
- units: [off],
8762
- capabilities: probe(id, "missing-plugin"),
8763
- expect: { rows: 0 }
8764
- },
8765
- {
8766
- id: "busy",
8767
- label: "正在改配置(开关禁用)",
8768
- units: [on, twin],
8769
- capabilities: {
8770
- ...probe(id, "ok"),
8771
- ...probe(`${id}-b`, "ok")
8772
- },
8773
- busy: true,
8774
- expect: { rows: 2 }
8775
- },
8776
- {
8777
- id: "failed",
8778
- label: "改配置失败(红字)",
8779
- units: [on],
8780
- capabilities: probe(id, "ok"),
8781
- failed: true,
8782
- expect: { rows: 1 }
8783
- },
8784
- {
8785
- id: "drag",
8786
- label: "拖动中的落点提示",
8787
- units: [
8788
- on,
8789
- twin,
8790
- third
8791
- ],
8792
- capabilities: {
8793
- ...probe(id, "ok"),
8794
- ...probe(`${id}-b`, "ok"),
8795
- ...probe(`${id}-c`, "ok")
8796
- },
8797
- drag: {
8798
- from: 1,
8799
- over: 0,
8800
- at: {
8801
- x: 1230,
8802
- y: 300
8803
- }
8804
- },
8805
- expect: {
8806
- rows: 3,
8807
- on: true
8808
- }
8809
- },
8810
- {
8811
- id: "drag-off",
8812
- label: "拖到未开启的那一行上:落点不亮(松手也不动)",
8813
- units: [
8814
- on,
8815
- twin,
8816
- third
8817
- ],
8818
- capabilities: {
8819
- ...probe(id, "ok"),
8820
- ...probe(`${id}-b`, "ok"),
8821
- ...probe(`${id}-c`, "ok")
8822
- },
8823
- drag: {
8824
- from: 0,
8825
- over: null,
8826
- at: {
8827
- x: 1230,
8828
- y: 300
8829
- }
8830
- },
8831
- expect: {
8832
- rows: 3,
8833
- on: true
8834
- }
8835
- },
8836
- PLUGIN_MOCK
8837
- ];
8838
- }
8839
- //#endregion
8840
7171
  //#region src/app/layouts/rightbar/board-selection.ts
8841
7172
  function available(capability) {
8842
7173
  if (capability === void 0) return true;
@@ -9212,13 +7543,9 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
9212
7543
  forceProbe
9213
7544
  ]);
9214
7545
  const root = useRef(null);
9215
- const panelMocks = useMemo(() => buildPanelMocks(fixtureRoster(manifests)), [manifests]);
9216
- const fixturePick = useFixturePick({
9217
- fixtures: panelMocks,
9218
- initial: panelMocks[0]?.id ?? null
9219
- });
9220
- const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
9221
- const mockNonce = fixturePick.nonce;
7546
+ const devPanel = devSurface.useStrips("panel", manifests);
7547
+ const panelMock = devPanel.current;
7548
+ const mockNonce = devPanel.pick.nonce;
9222
7549
  (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
9223
7550
  const units = enabledUnits?.units ?? [];
9224
7551
  return /* @__PURE__ */ h("div", {
@@ -9237,20 +7564,16 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
9237
7564
  className: ModulesPage_module_default.pop,
9238
7565
  role: "dialog",
9239
7566
  "aria-label": t("panels.title")
9240
- }, /* @__PURE__ */ h("header", { className: ModulesPage_module_default.head }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.title }, t("panels.tab.modules"))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
9241
- mocks: panelMocks,
9242
- index: fixturePick.index,
9243
- onPick: (at) => fixturePick.pick(panelMocks[at]?.id ?? null)
9244
- }) : null, /* @__PURE__ */ h(ModulesPage, {
7567
+ }, /* @__PURE__ */ h("header", { className: ModulesPage_module_default.head }, /* @__PURE__ */ h("span", { className: ModulesPage_module_default.title }, t("panels.tab.modules"))), devPanel.strip, /* @__PURE__ */ h(ModulesPage, {
9245
7568
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
9246
7569
  t,
9247
7570
  units: panelMock?.units ?? units,
9248
7571
  plugins: panelMock?.plugins ?? enabledUnits?.plugins ?? [],
9249
- capabilities: panelMock === void 0 ? fixturePick.enabled ? null : capabilities : panelMock.capabilities,
7572
+ capabilities: panelMock === void 0 ? devPanel.enabled ? null : capabilities : panelMock.capabilities,
9250
7573
  loading: enabledUnits === null,
9251
7574
  own: enabledUnits?.own === true,
9252
7575
  onOpenMarket,
9253
- mocked: fixturePick.enabled,
7576
+ mocked: devPanel.enabled,
9254
7577
  workspace,
9255
7578
  mock: panelMock
9256
7579
  })) : null);
@@ -9271,589 +7594,6 @@ function boardColumnsOf(items, twoColumns) {
9271
7594
  return splitBoardColumns(items);
9272
7595
  }
9273
7596
  //#endregion
9274
- //#region src/app/layouts/rightbar/board-mock.ts
9275
- var REAL = {
9276
- id: "real",
9277
- label: "真实",
9278
- note: "不接管:宿主配置里开着什么就摆什么。",
9279
- shape: { kind: "real" }
9280
- };
9281
- var EMPTY = {
9282
- id: "empty",
9283
- label: "空看板",
9284
- note: "一个模块都没开:内容区那条空态与它的两条出路。",
9285
- shape: { kind: "empty" },
9286
- expect: {
9287
- cards: 0,
9288
- empty: true
9289
- }
9290
- };
9291
- var UNREAD = {
9292
- id: "unread",
9293
- label: "配置还没读到",
9294
- note: "还没读到配置:内容区说一句\"正在读取面板配置…\",头部 ⟳ 留着(按一下立刻重读)。",
9295
- shape: { kind: "unread" },
9296
- expect: {
9297
- cards: 0,
9298
- empty: false
9299
- }
9300
- };
9301
- var KIT = {
9302
- id: "kit",
9303
- label: "公共组件预览",
9304
- note: "把 shared 那套哑组件按\"样式 + 交互\"摆一遍(下拉的常规档与无边框档、搜索、分组、禁用、加载、手填退化、卡片头、状态、行、活动流、长任务那一行):不碰配置、不读数据。",
9305
- shape: { kind: "kit" },
9306
- expect: {
9307
- cards: 1,
9308
- empty: false
9309
- }
9310
- };
9311
- function buildBoardMocks(roster) {
9312
- return [
9313
- REAL,
9314
- KIT,
9315
- ...!roster.some((manifest) => manifest.card !== null) ? [] : [
9316
- {
9317
- id: "one",
9318
- label: "一张卡",
9319
- note: "常态:面板上只有一个模块时的样子。",
9320
- shape: {
9321
- kind: "copies",
9322
- count: 1
9323
- },
9324
- expect: {
9325
- cards: 1,
9326
- empty: false
9327
- }
9328
- },
9329
- {
9330
- id: "two",
9331
- label: "两张卡",
9332
- note: "同一个模块摆两份 —— 量卡片之间的间距与分界(卡片夹具条已收起)。",
9333
- shape: {
9334
- kind: "copies",
9335
- count: 2
9336
- },
9337
- expect: {
9338
- cards: 2,
9339
- empty: false
9340
- }
9341
- },
9342
- {
9343
- id: "many",
9344
- label: "八张卡(要滚)",
9345
- note: "同一个模块摆八份 —— 量滚动、滚动条与底部留白(卡片夹具条已收起)。",
9346
- shape: {
9347
- kind: "copies",
9348
- count: 8
9349
- },
9350
- expect: {
9351
- cards: 8,
9352
- empty: false
9353
- }
9354
- },
9355
- {
9356
- id: "crash",
9357
- label: "坏卡 + 好卡",
9358
- note: "一张渲染必炸的卡 + 你装的模块(配 ?wbCrash=1 才摆得出来):要看到坏的那张只剩一句\"这个模块起不来\",别的卡与面板壳都还在。",
9359
- shape: { kind: "all" },
9360
- expect: {
9361
- cards: 1,
9362
- empty: false
9363
- }
9364
- }
9365
- ],
9366
- EMPTY,
9367
- UNREAD
9368
- ];
9369
- }
9370
- var REAL_SHAPE = { kind: "real" };
9371
- function useBoardMock(roster) {
9372
- const [on] = useState(() => mockModeOn(window.location.search));
9373
- const mocks = useMemo(() => on ? buildBoardMocks(roster) : [], [on, roster]);
9374
- const [index, setIndex] = useState(0);
9375
- const mock = mocks[index];
9376
- return {
9377
- mock,
9378
- mocks,
9379
- index,
9380
- pick: setIndex,
9381
- shape: mock?.shape ?? REAL_SHAPE
9382
- };
9383
- }
9384
- var kit_preview_module_default = {
9385
- gallery: "_gallery_eqvi8_1",
9386
- section: "_section_eqvi8_7",
9387
- heading: "_heading_eqvi8_13",
9388
- title: "_title_eqvi8_20",
9389
- note: "_note_eqvi8_26",
9390
- cells: "_cells_eqvi8_32",
9391
- cell: "_cell_eqvi8_32",
9392
- cellLabel: "_cellLabel_eqvi8_46",
9393
- span: "_span_eqvi8_51",
9394
- stack: "_stack_eqvi8_55",
9395
- inline: "_inline_eqvi8_61",
9396
- panel: "_panel_eqvi8_68",
9397
- bound: "_bound_eqvi8_75"
9398
- };
9399
- //#endregion
9400
- //#region src/app/layouts/rightbar/kit-preview-controls.tsx
9401
- var ENV_OPTIONS = [
9402
- {
9403
- value: "prod",
9404
- label: "生产环境"
9405
- },
9406
- {
9407
- value: "stage",
9408
- label: "预发环境"
9409
- },
9410
- {
9411
- value: "dev",
9412
- label: "开发环境"
9413
- }
9414
- ];
9415
- var CLOUD_OPTIONS = [
9416
- {
9417
- value: "ali-prod",
9418
- label: "生产集群",
9419
- group: "阿里云",
9420
- searchText: "aliyun 生产 prod"
9421
- },
9422
- {
9423
- value: "ali-stage",
9424
- label: "预发集群",
9425
- group: "阿里云",
9426
- searchText: "aliyun 预发 stage"
9427
- },
9428
- {
9429
- value: "tencent-prod",
9430
- label: "生产集群",
9431
- group: "腾讯云",
9432
- searchText: "tencent 生产 prod"
9433
- },
9434
- {
9435
- value: "tencent-dev",
9436
- label: "开发集群",
9437
- group: "腾讯云",
9438
- disabled: true,
9439
- searchText: "tencent 开发 dev"
9440
- }
9441
- ];
9442
- var CHOICES = [
9443
- {
9444
- value: "small",
9445
- label: "小"
9446
- },
9447
- {
9448
- value: "medium",
9449
- label: "中"
9450
- },
9451
- {
9452
- value: "large",
9453
- label: "大"
9454
- }
9455
- ];
9456
- function TextFieldDemo() {
9457
- const [text, setText] = useState("");
9458
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(Field, {
9459
- label: "名字",
9460
- hint: "随手敲点字,看描边与焦点环"
9461
- }, /* @__PURE__ */ h(TextField, {
9462
- value: text,
9463
- placeholder: "例如:生产",
9464
- onChange: (event) => setText(event.currentTarget.value)
9465
- })), /* @__PURE__ */ h(TextField, {
9466
- invalid: true,
9467
- value: "这份填错了",
9468
- onChange: () => {}
9469
- }), /* @__PURE__ */ h(TextField, {
9470
- value: "禁用的一格",
9471
- disabled: true,
9472
- onChange: () => {}
9473
- }));
9474
- }
9475
- function SelectDemo({ variant }) {
9476
- const [value, setValue] = useState("stage");
9477
- return /* @__PURE__ */ h(SelectField, {
9478
- value,
9479
- options: ENV_OPTIONS,
9480
- onChange: setValue,
9481
- ...variant === void 0 ? {} : { variant },
9482
- label: variant === "ghost" ? void 0 : "环境",
9483
- hint: variant === "ghost" ? void 0 : "展开后锚点换成搜索框,↑↓ 走游标"
9484
- });
9485
- }
9486
- function SelectRichDemo() {
9487
- const [value, setValue] = useState("ali-prod");
9488
- const [added, setAdded] = useState(0);
9489
- return /* @__PURE__ */ h(SelectField, {
9490
- value,
9491
- options: CLOUD_OPTIONS,
9492
- onChange: setValue,
9493
- label: "集群",
9494
- hint: added === 0 ? "试试点页脚那颗「新建集群…」" : `页脚接过 ${added} 次`,
9495
- searchLabel: "搜集群",
9496
- searchPlaceholder: "搜名字或别名…",
9497
- emptyText: (query) => `没有匹配「${query}」的集群`,
9498
- footer: {
9499
- label: "新建集群…",
9500
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 14 })
9501
- },
9502
- onFooter: () => setAdded((count) => count + 1)
9503
- });
9504
- }
9505
- function SelectStateDemo() {
9506
- const [manual, setManual] = useState("手填的环境名");
9507
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(SelectField, {
9508
- value: "prod",
9509
- options: ENV_OPTIONS,
9510
- onChange: () => {},
9511
- disabled: true,
9512
- label: "禁用"
9513
- }), /* @__PURE__ */ h(SelectField, {
9514
- value: "",
9515
- options: [],
9516
- onChange: () => {},
9517
- loading: true,
9518
- loadingText: "正在读环境…",
9519
- label: "加载中"
9520
- }), /* @__PURE__ */ h(SelectField, {
9521
- value: "",
9522
- options: [],
9523
- onChange: () => {},
9524
- fallback: {
9525
- value: manual,
9526
- onChange: setManual
9527
- },
9528
- label: "名单读不到 → 退化成手填"
9529
- }));
9530
- }
9531
- function AppearanceDemo() {
9532
- const [value, setValue] = useState("medium");
9533
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(SelectField, {
9534
- value,
9535
- options: CHOICES,
9536
- onChange: setValue,
9537
- variant: "ghost",
9538
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 16 }),
9539
- ariaLabel: "尺寸",
9540
- title: "无边框变体:图标 + 当前值 + 箭头"
9541
- }), /* @__PURE__ */ h(SelectField, {
9542
- value,
9543
- options: CHOICES,
9544
- onChange: setValue,
9545
- selection: "check",
9546
- label: "selection=check(打勾那一种)"
9547
- }));
9548
- }
9549
- function ChoiceDemo() {
9550
- const [single, setSingle] = useState("medium");
9551
- const [many, setMany] = useState(["small", "large"]);
9552
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(ChoiceGroup, {
9553
- label: "尺寸",
9554
- name: "kit-size",
9555
- options: CHOICES,
9556
- value: single,
9557
- onChange: setSingle
9558
- }), /* @__PURE__ */ h(ChoiceGroup, {
9559
- label: "多选",
9560
- name: "kit-many",
9561
- options: CHOICES,
9562
- multi: true,
9563
- values: many,
9564
- onChange: setMany
9565
- }), /* @__PURE__ */ h(ChoiceGroup, {
9566
- label: "禁用",
9567
- name: "kit-off",
9568
- options: CHOICES,
9569
- value: "small",
9570
- onChange: () => {},
9571
- disabled: true
9572
- }));
9573
- }
9574
- function SaveBarDemo() {
9575
- const [busy, setBusy] = useState(false);
9576
- return /* @__PURE__ */ h(SaveBar, {
9577
- busy,
9578
- labels: {
9579
- cancel: "取消",
9580
- save: "保存",
9581
- saving: "保存中…"
9582
- },
9583
- onCancel: () => setBusy(false),
9584
- onSave: () => setBusy(true)
9585
- });
9586
- }
9587
- function LinkDemo() {
9588
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.inline }, /* @__PURE__ */ h(Link, {
9589
- href: "https://example.com/report",
9590
- title: "外部链接:新窗口打开"
9591
- }, "外部报告"), /* @__PURE__ */ h(Link, {
9592
- href: "#kit-preview",
9593
- external: false
9594
- }, "站内锚点"));
9595
- }
9596
- //#endregion
9597
- //#region src/app/layouts/rightbar/kit-preview-frame.tsx
9598
- function Section({ title, note, children }) {
9599
- return /* @__PURE__ */ h("section", { className: kit_preview_module_default.section }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.heading }, /* @__PURE__ */ h("span", { className: kit_preview_module_default.title }, title), note === void 0 ? null : /* @__PURE__ */ h("span", { className: kit_preview_module_default.note }, note)), children);
9600
- }
9601
- function Grid({ children }) {
9602
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.cells }, children);
9603
- }
9604
- function Cell({ label, wide, children }) {
9605
- return /* @__PURE__ */ h("div", { className: wide === true ? `${kit_preview_module_default.cell} ${kit_preview_module_default.span}` : kit_preview_module_default.cell }, /* @__PURE__ */ h("span", { className: kit_preview_module_default.cellLabel }, label), children);
9606
- }
9607
- //#endregion
9608
- //#region src/app/layouts/rightbar/kit-preview-rows.tsx
9609
- function RowsSection() {
9610
- return /* @__PURE__ */ h(Section, {
9611
- title: "行与分组",
9612
- note: "Rows / Row 是键值行;Stack 只管间距;SettingsSection 是设置页那一节"
9613
- }, /* @__PURE__ */ h(Grid, null, /* @__PURE__ */ h(Cell, { label: "Rows + Row" }, /* @__PURE__ */ h(Rows, null, /* @__PURE__ */ h(Row, {
9614
- label: "环境",
9615
- value: "生产"
9616
- }), /* @__PURE__ */ h(Row, {
9617
- label: "集群",
9618
- value: "ali-prod"
9619
- }), /* @__PURE__ */ h(Row, {
9620
- label: "指纹",
9621
- value: "a1b2c3d4"
9622
- }))), /* @__PURE__ */ h(Cell, { label: "Stack(只管间距)" }, /* @__PURE__ */ h(Stack, null, /* @__PURE__ */ h(Note, null, "第一行说明:默认 muted。"), /* @__PURE__ */ h(Note, { tone: "problem" }, "第二行是个问题:tone=problem。"))), /* @__PURE__ */ h(Cell, {
9623
- label: "SettingsSection(设置页那一节)",
9624
- wide: true
9625
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.bound }, /* @__PURE__ */ h(SettingsSection, {
9626
- label: "面板",
9627
- title: "显示"
9628
- }, /* @__PURE__ */ h(Rows, null, /* @__PURE__ */ h(Row, {
9629
- label: "每页条数",
9630
- value: "20"
9631
- }), /* @__PURE__ */ h(Row, {
9632
- label: "自动刷新",
9633
- value: "开"
9634
- })))))));
9635
- }
9636
- function ActivitySection() {
9637
- return /* @__PURE__ */ h(Section, {
9638
- title: "活动流",
9639
- note: "ActivityBlock / ActivityLine / ActivityAction:一行一个动作,右边是时间与按钮"
9640
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.panel }, /* @__PURE__ */ h(ActivityBlock, { head: "今天的动作" }, /* @__PURE__ */ h(ActivityLine, {
9641
- dot: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9642
- state: "done",
9643
- size: 10
9644
- }),
9645
- text: "读了构建列表",
9646
- at: "2 分钟前"
9647
- }), /* @__PURE__ */ h(ActivityLine, {
9648
- dot: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9649
- state: "ongoing",
9650
- size: 10
9651
- }),
9652
- text: "正在发布",
9653
- at: "刚刚",
9654
- actions: /* @__PURE__ */ h(ActivityAction, {
9655
- label: "看日志",
9656
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutlineRegular, { size: 14 }),
9657
- onClick: () => {}
9658
- })
9659
- }), /* @__PURE__ */ h(ActivityLine, {
9660
- dot: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9661
- state: "error",
9662
- size: 10
9663
- }),
9664
- text: "发布失败",
9665
- at: "1 小时前",
9666
- actions: /* @__PURE__ */ h(ActivityAction, {
9667
- label: "重试",
9668
- hint: "失败的那次再跑一遍",
9669
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 }),
9670
- failed: true,
9671
- onClick: () => {}
9672
- })
9673
- }))));
9674
- }
9675
- function LongTaskSection() {
9676
- return /* @__PURE__ */ h(Section, {
9677
- title: "长任务那一行",
9678
- note: "四种状态:跑着 / 要登录 / 好了 / 失败(带步骤与原文)"
9679
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(LongTaskRow, {
9680
- status: "running",
9681
- headline: "正在发布(2/3)",
9682
- stepsTitle: "步骤",
9683
- steps: [
9684
- "拉代码",
9685
- "构建",
9686
- "发布"
9687
- ]
9688
- }), /* @__PURE__ */ h(LongTaskRow, {
9689
- status: "needs-login",
9690
- headline: "要登录腾讯云",
9691
- problem: "凭证过期了"
9692
- }), /* @__PURE__ */ h(LongTaskRow, {
9693
- status: "ok",
9694
- headline: "发布完成",
9695
- rawTitle: "原文",
9696
- raw: "ok · 12.4s",
9697
- copyLabel: "复制",
9698
- copiedLabel: "复制好了",
9699
- links: [{
9700
- href: "https://example.com/log",
9701
- text: "日志"
9702
- }]
9703
- }), /* @__PURE__ */ h(LongTaskRow, {
9704
- status: "failed",
9705
- headline: "发布失败",
9706
- problem: "站点回的是 HTTP 403"
9707
- })));
9708
- }
9709
- function IconSection() {
9710
- return /* @__PURE__ */ h(Section, {
9711
- title: "外壳自己的图标",
9712
- note: "dsh 那一套 Icon*Regular 直接从原语拿,这几个是外壳自己画的"
9713
- }, /* @__PURE__ */ h(Grid, null, [
9714
- {
9715
- label: "IconBrandMark",
9716
- node: /* @__PURE__ */ h(IconBrandMark, { size: 20 })
9717
- },
9718
- {
9719
- label: "IconModuleMark",
9720
- node: /* @__PURE__ */ h(IconModuleMark, { size: 20 })
9721
- },
9722
- {
9723
- label: "IconModules",
9724
- node: /* @__PURE__ */ h(IconModules, { size: 16 })
9725
- },
9726
- {
9727
- label: "IconPanelScreen",
9728
- node: /* @__PURE__ */ h(IconPanelScreen, { size: 16 })
9729
- },
9730
- {
9731
- label: "IconOpencli",
9732
- node: /* @__PURE__ */ h(IconOpencli, { size: 16 })
9733
- },
9734
- {
9735
- label: "IconNpm",
9736
- node: /* @__PURE__ */ h(IconNpm, { size: 16 })
9737
- }
9738
- ].map((one) => /* @__PURE__ */ h(Cell, {
9739
- key: one.label,
9740
- label: one.label
9741
- }, /* @__PURE__ */ h("span", { className: kit_preview_module_default.panel }, one.node)))));
9742
- }
9743
- function StripSection() {
9744
- const [index, setIndex] = useState(0);
9745
- return /* @__PURE__ */ h(Section, {
9746
- title: "夹具条",
9747
- note: "MockStrip:只在 ?wbMock=1 下出现的那条,自己也可以摆出来"
9748
- }, /* @__PURE__ */ h(MockStrip, {
9749
- note: "这是夹具条本身:点一下就换一个形状",
9750
- index,
9751
- onPick: setIndex,
9752
- mocks: [
9753
- {
9754
- id: "one",
9755
- label: "一张卡"
9756
- },
9757
- {
9758
- id: "two",
9759
- label: "两张卡"
9760
- },
9761
- {
9762
- id: "eight",
9763
- label: "八张卡"
9764
- }
9765
- ]
9766
- }));
9767
- }
9768
- //#endregion
9769
- //#region src/app/layouts/rightbar/kit-preview.tsx
9770
- function SelectSection() {
9771
- return /* @__PURE__ */ h(Section, {
9772
- title: "下拉选择 SelectField",
9773
- note: "默认是常规下拉框;无边框那档要显式给 variant=ghost。展开后锚点换成搜索框,↑↓ 走游标、Enter 选中、Esc / 外点关掉"
9774
- }, /* @__PURE__ */ h(Grid, null, /* @__PURE__ */ h(Cell, { label: "常规档(默认,带 label / hint)" }, /* @__PURE__ */ h(SelectDemo, null)), /* @__PURE__ */ h(Cell, { label: "variant=ghost(左栏工作区那一种)" }, /* @__PURE__ */ h(SelectDemo, { variant: "ghost" })), /* @__PURE__ */ h(Cell, { label: "搜索 + 分组 + 禁用项 + 页脚动作" }, /* @__PURE__ */ h(SelectRichDemo, null)), /* @__PURE__ */ h(Cell, { label: "禁用 / 加载中 / 名单读不到时退化成手填" }, /* @__PURE__ */ h(SelectStateDemo, null)), /* @__PURE__ */ h(Cell, {
9775
- label: "图标 + 当前值(无边框)与 selection=check",
9776
- wide: true
9777
- }, /* @__PURE__ */ h(AppearanceDemo, null))));
9778
- }
9779
- function FormsSection() {
9780
- return /* @__PURE__ */ h(Section, {
9781
- title: "输入与本机选择",
9782
- note: "TextField 的三个态、ChoiceGroup 的单选 / 多选 / 禁用、SaveBar、Link"
9783
- }, /* @__PURE__ */ h(Grid, null, /* @__PURE__ */ h(Cell, { label: "TextField(正常 / invalid / 禁用)" }, /* @__PURE__ */ h(TextFieldDemo, null)), /* @__PURE__ */ h(Cell, { label: "ChoiceGroup(单选 / 多选 / 禁用)" }, /* @__PURE__ */ h(ChoiceDemo, null)), /* @__PURE__ */ h(Cell, { label: "SaveBar(点保存看它转起来)" }, /* @__PURE__ */ h(SaveBarDemo, null)), /* @__PURE__ */ h(Cell, { label: "Link(外链与站内)" }, /* @__PURE__ */ h(LinkDemo, null))));
9784
- }
9785
- function CardSection({ t }) {
9786
- return /* @__PURE__ */ h(Section, {
9787
- title: "卡片与卡头",
9788
- note: "模块卡片自己渲染 Card;外壳只在外层套 CardAnchor(display: contents)与 CardBoundary(崩了才看得见)"
9789
- }, /* @__PURE__ */ h(Grid, null, /* @__PURE__ */ h(Cell, {
9790
- label: "Card(整张卡)",
9791
- wide: true
9792
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.bound }, /* @__PURE__ */ h(Card, {
9793
- t,
9794
- title: "示例卡片",
9795
- meta: "夹具",
9796
- refreshing: false,
9797
- onRefresh: () => {}
9798
- }, /* @__PURE__ */ h(Note, null, "卡身里放什么都行:这张预览卡自己就是个例子。")))), /* @__PURE__ */ h(Cell, {
9799
- label: "CardHead(带齿轮与平台跳转)",
9800
- wide: true
9801
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.bound }, /* @__PURE__ */ h(CardHead, {
9802
- t,
9803
- title: "卡头",
9804
- meta: "3 分钟前",
9805
- refreshing: false,
9806
- onRefresh: () => {},
9807
- gear: "面板设置",
9808
- gearOpen: true,
9809
- onToggleGear: () => {},
9810
- platform: "打开平台",
9811
- platformTitle: "去平台上看看",
9812
- platformHref: "https://example.com/panel"
9813
- })))));
9814
- }
9815
- function StateSection() {
9816
- return /* @__PURE__ */ h(Section, {
9817
- title: "状态与提示",
9818
- note: "Note / StateBlock / CenteredState / EmptyState / SkeletonRows:卡里那几种“没东西可看”的说法"
9819
- }, /* @__PURE__ */ h(Grid, null, /* @__PURE__ */ h(Cell, { label: "Note(muted 与 problem)" }, /* @__PURE__ */ h(Note, null, "这句是说明。"), /* @__PURE__ */ h(Note, { tone: "problem" }, "这句是问题。")), /* @__PURE__ */ h(Cell, { label: "StateBlock(点 + 标题 + 提示 + 动作)" }, /* @__PURE__ */ h(StateBlock, {
9820
- dot: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9821
- state: "ongoing",
9822
- size: 10
9823
- }),
9824
- title: "正在读",
9825
- hint: "读回来之前这一块先这么说",
9826
- resolving: "还剩 3 秒"
9827
- }, /* @__PURE__ */ h(SkeletonRows, { rows: 3 }))), /* @__PURE__ */ h(Cell, { label: "CenteredState(大图标 / 紧凑)" }, /* @__PURE__ */ h(CenteredState, {
9828
- icon: /* @__PURE__ */ h(IconPanelScreen, { size: 32 }),
9829
- title: "这块还没接上",
9830
- hint: "接上之后这里会有数据",
9831
- action: /* @__PURE__ */ h(Note, null, "动作用 Note 或 Button 都行")
9832
- }), /* @__PURE__ */ h(CenteredState, {
9833
- compact: true,
9834
- icon: /* @__PURE__ */ h(IconModules, { size: 20 }),
9835
- title: "紧凑的那一档"
9836
- })), /* @__PURE__ */ h(Cell, { label: "EmptyState 与 SkeletonRows" }, /* @__PURE__ */ h(EmptyState, {
9837
- text: "一条都还没有",
9838
- icon: /* @__PURE__ */ h(IconBrandMark, { size: 20 })
9839
- }), /* @__PURE__ */ h(SkeletonRows, { rows: 2 }))));
9840
- }
9841
- function KitPreview({ t }) {
9842
- return /* @__PURE__ */ h(Card, {
9843
- t,
9844
- title: "公共组件预览",
9845
- meta: "夹具 · 只在 ?wbMock=1 下摆出来",
9846
- refreshing: false,
9847
- onRefresh: () => {}
9848
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.gallery }, /* @__PURE__ */ h(Note, null, "这里把 ", /* @__PURE__ */ h("code", null, "@dsh-workbench/shared"), " 里那套哑组件按“样式 + 交互”摆了一遍:能点的都点得动, 能搜的都能搜。没摆的是要真实数据的那些(ApprovalDetail 要一份会话快照、CardBoundary 要一张会炸的卡 —— 那个走 ?wbCrash=1)。"), /* @__PURE__ */ h(SelectSection, null), /* @__PURE__ */ h(FormsSection, null), /* @__PURE__ */ h(CardSection, { t }), /* @__PURE__ */ h(StateSection, null), /* @__PURE__ */ h(RowsSection, null), /* @__PURE__ */ h(ActivitySection, null), /* @__PURE__ */ h(LongTaskSection, null), /* @__PURE__ */ h(IconSection, null), /* @__PURE__ */ h(StripSection, null)));
9849
- }
9850
- var KIT_PREVIEW_MODULE = {
9851
- id: "wb-kit-preview",
9852
- titleKey: "组件预览",
9853
- order: 999,
9854
- View: KitPreview
9855
- };
9856
- //#endregion
9857
7597
  //#region src/app/layouts/rightbar/board-plan.ts
9858
7598
  function planBoard(shape, real, all) {
9859
7599
  if (shape.kind === "real") return {
@@ -9877,15 +7617,18 @@ function planBoard(shape, real, all) {
9877
7617
  reading: true,
9878
7618
  repeated: false
9879
7619
  };
9880
- if (shape.kind === "kit") return {
9881
- modules: [{
9882
- key: KIT_PREVIEW_MODULE.id,
9883
- module: KIT_PREVIEW_MODULE
9884
- }],
9885
- empty: false,
9886
- reading: false,
9887
- repeated: false
9888
- };
7620
+ if (shape.kind === "kit") {
7621
+ const kit = devSurface.kitModule;
7622
+ return {
7623
+ modules: kit === null ? [] : [{
7624
+ key: kit.id,
7625
+ module: kit
7626
+ }],
7627
+ empty: false,
7628
+ reading: false,
7629
+ repeated: false
7630
+ };
7631
+ }
9889
7632
  if (shape.kind === "all") return {
9890
7633
  modules: all.map((module) => ({
9891
7634
  key: module.id,
@@ -10065,12 +7808,16 @@ function Rightbar(props) {
10065
7808
  const panelBoard = useEnabledUnits(panelToken, boardWorkspace);
10066
7809
  const enabledUnits = panelBoard?.units ?? null;
10067
7810
  const [modulesOpen, setModulesOpen] = useState(false);
10068
- const fixtures = useBoardMock(fixtureRoster(manifests));
7811
+ const devBoard = devSurface.useBoard({
7812
+ manifests,
7813
+ all: modules.all(),
7814
+ search: window.location.search
7815
+ });
10069
7816
  const visibleModules = selectBoardModules(enabledUnits, (id) => modules.byId(id), capabilities);
10070
- const plan = planBoard(fixtures.shape, {
7817
+ const plan = planBoard(devBoard.shape, {
10071
7818
  modules: visibleModules,
10072
7819
  configRead: panelBoard !== null
10073
- }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
7820
+ }, devBoard.seed);
10074
7821
  const world = createSuiteWorld({
10075
7822
  workspaces,
10076
7823
  sessions,
@@ -10092,7 +7839,7 @@ function Rightbar(props) {
10092
7839
  reason
10093
7840
  });
10094
7841
  }, []);
10095
- const fixtureMode = mockModeOn(window.location.search) || crashModeOn(window.location.search);
7842
+ const fixtureMode = devBoard.mode;
10096
7843
  useEffect(() => {
10097
7844
  setPanelWorkspace(fixtureMode ? null : boardWorkspace);
10098
7845
  }, [boardWorkspace, fixtureMode]);
@@ -10146,10 +7893,7 @@ function Rightbar(props) {
10146
7893
  refreshToken: panelToken,
10147
7894
  onOpenMarket: openMarket,
10148
7895
  onCollapse: props.toggleRightbar
10149
- }), /* @__PURE__ */ h(BoardMockStrip, {
10150
- fixtures,
10151
- show: top.kind === "board"
10152
- }), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-fixtureMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
7896
+ }), devBoard.strip(top.kind === "board"), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-panelMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
10153
7897
  top,
10154
7898
  plan,
10155
7899
  world,
@@ -10902,10 +8646,7 @@ function Sidebar(props) {
10902
8646
  }), creating ? /* @__PURE__ */ h("p", {
10903
8647
  className: "wb-workspaceBusy",
10904
8648
  role: "status"
10905
- }, /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
10906
- state: "ongoing",
10907
- size: 12
10908
- }), t("project.add.busy")) : null, createFailed ? /* @__PURE__ */ h("p", { className: "wb-workspaceError" }, t("project.add.failed")) : null) : null, /* @__PURE__ */ h(WorkspaceSection, {
8649
+ }, /* @__PURE__ */ h(Spinner, { size: 12 }), t("project.add.busy")) : null, createFailed ? /* @__PURE__ */ h("p", { className: "wb-workspaceError" }, t("project.add.failed")) : null) : null, /* @__PURE__ */ h(WorkspaceSection, {
10909
8650
  t,
10910
8651
  wide,
10911
8652
  onNewSession: () => {
@@ -10950,7 +8691,7 @@ var sidebar_app_default = ".wb-wsSection {\n position: relative;\n flex: none;
10950
8691
  var sidebar_default = ".wb-root{--dsh-sidebar-inline-padding:12px;height:100%;padding:var(--wb-len-6) var(--dsh-sidebar-inline-padding);box-sizing:border-box;background:var(--dsw-specific-sidebar-fill);color:var(--dsw-alias-label-primary);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);flex-direction:column;font-size:var(--dsw-font-s-14-font-size);display:flex}[data-platform=darwin] .wb-root{background:0 0}.wb-root.wb-collapsed{padding:var(--wb-len-18) var(--wb-len-10) var(--wb-len-6)}[data-windows-titlebar] .wb-root .wb-logoRow{height:var(--wb-len-40);margin:0;padding:0}[data-windows-titlebar] .wb-toggle{top:calc((var(--dsh-windows-titlebar-height) - var(--wb-len-28)) / 2);z-index:var(--wb-z-30);-webkit-app-region:no-drag;position:fixed;left:var(--wb-len-12)}[data-windows-titlebar] .wb-root.wb-collapsed .wb-logoRow{height:0}[data-windows-titlebar] .wb-root:not(.wb-collapsed) .wb-brand{padding-left:var(--wb-len-4)}[data-windows-titlebar] .wb-brandIdentity{transform:translateY(1px)}[data-windows-titlebar] .wb-brandMark{transform:translate(1px)}[data-windows-titlebar] .wb-brandName{font-weight:400}[data-windows-titlebar] .wb-root.wb-collapsed{padding:0}[data-windows-titlebar] .wb-collapsed .wb-panelList,[data-windows-titlebar] .wb-collapsed .wb-regionArea,[data-windows-titlebar] .wb-collapsed .wb-footArea{display:none}html[data-windows-titlebar]:has([data-sidebar-collapsed=true]){--dsh-windows-menu-start:84px}[data-windows-titlebar] .wb-collapsed .wb-toggle{corner-shape:round;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);border-radius:50%}[data-windows-titlebar] .wb-collapsed .wb-toggle .wb-panelIcon{display:inline-flex}.wb-logoRow{box-sizing:border-box;flex:none;justify-content:flex-end;align-items:center;gap:var(--wb-len-8);height:var(--wb-len-60);margin-bottom:var(--wb-len-4);padding:var(--wb-len-8) 0 var(--wb-len-8) var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-logoRow{justify-content:flex-start;height:var(--wb-len-36);margin-bottom:var(--wb-len-12);padding:0;overflow:visible}.wb-brand{min-width:0;color:inherit;cursor:pointer;background:0 0;border:none;flex:1;align-items:center;padding:0;display:inline-flex;overflow:hidden}[data-platform=darwin] .wb-brand{cursor:default}.wb-brandIdentity{align-items:center;gap:var(--wb-len-8);min-width:0;height:var(--wb-len-24);display:inline-flex}.wb-brandMark{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-brandName{letter-spacing:var(--wb-track-brand);align-items:center;gap:var(--wb-len-6);min-width:0;height:var(--wb-len-24);font-size:var(--wb-font-18);font-weight:600;line-height:var(--wb-line-24);display:inline-flex}.wb-panelIcon{display:inline-flex;align-items:center;justify-content:center}.wb-iconButton{border-radius:var(--dsw-radius-sm);cursor:pointer;width:var(--wb-len-28);height:var(--wb-len-28);color:var(--dsw-alias-label-secondary);background:0 0;border:none;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.wb-iconButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-iconButton.wb-toggle:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-collapsed .wb-iconButton{border-radius:var(--dsw-radius-md);width:var(--wb-len-36);height:var(--wb-len-36)}.wb-collapsed .wb-toggle .wb-panelIcon{display:none}.wb-collapsed .wb-toggle:hover .wb-panelIcon{display:inline}.wb-collapsed .wb-toggle:hover .wb-railMark{display:none}.wb-railMark{justify-content:center;align-items:center;display:inline-flex}.wb-collapsed .wb-iconButton{color:var(--dsw-alias-label-primary)}.wb-panelList{flex-direction:column;flex:none;gap:var(--wb-len-4);margin-bottom:var(--wb-len-8);display:flex}.wb-panelRow{box-sizing:border-box;border-radius:var(--dsw-radius-md);min-height:var(--wb-len-36);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;align-items:center;gap:var(--wb-len-8);margin:0 var(--wb-len-2);padding:var(--wb-len-7) var(--wb-len-8);line-height:var(--wb-line-22);display:flex}.wb-panelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.wb-panelRow.wb-panelActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.wb-panelRow:focus-visible{outline:var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:-2px}.wb-panelGlyph{flex:none;justify-content:center;align-items:center;display:inline-flex}.wb-panelTitle{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.wb-collapsed .wb-panelList{gap:var(--wb-len-12);margin-bottom:var(--wb-len-12)}.wb-collapsed .wb-panelRow{width:var(--wb-len-36);height:var(--wb-len-36);color:var(--dsw-alias-label-primary);justify-content:center;margin:0;padding:0}.wb-regionArea{min-height:0;margin-left:var(--wb-len-neg-4);margin-right:calc(-1 * var(--dsh-sidebar-inline-padding));flex-direction:column;flex:1;padding-left:var(--wb-len-4);display:flex;overflow:hidden}.wb-collapsed .wb-regionArea{margin-left:0;margin-right:0;padding-left:0}.wb-footArea{flex-direction:column;flex:none;display:flex}.wb-settingsArea,.wb-footerActions{flex:none;width:100%;min-width:0}.wb-footerActions{display:flex}.wb-collapsed .wb-footArea{align-items:center}.wb-collapsed .wb-settingsArea,.wb-collapsed .wb-footerActions{justify-content:center;width:auto;display:flex}\n";
10951
8692
  //#endregion
10952
8693
  //#region src/shared/styles/chrome.css?raw
10953
- var chrome_default = ".wb-stripButton {\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}.wb-stripIconFlip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transform: scaleX(-1);\n}.wb-stripButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}.wb-stripButton:disabled {\n cursor: default;\n opacity: 1;\n}.wb-stripButtonActive {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}.wb-panelBody.wb-fixtureMany .wb-mockStrip {\n display: none;\n}@keyframes wb-spin {\n from {\n transform: rotate(0deg);\n }to {\n transform: rotate(360deg);\n }}";
8694
+ var chrome_default = ".wb-stripButton {\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}.wb-stripIconFlip {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transform: scaleX(-1);\n}.wb-stripButton:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}.wb-stripButton:disabled {\n cursor: default;\n opacity: 1;\n}.wb-stripButtonActive {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}@keyframes wb-spin {\n from {\n transform: rotate(0deg);\n }to {\n transform: rotate(360deg);\n }}";
10954
8695
  //#endregion
10955
8696
  //#region src/shared/styles/board.css?raw
10956
8697
  var board_default = "[data-wb-dot] {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-iconButton:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-iconButton: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.wb-spinning svg {\n animation: wb-spin var(--wb-dur-0-9) linear infinite;\n}\n";
@@ -11170,11 +8911,9 @@ var kit = {
11170
8911
  hooks: {
11171
8912
  ...use_api_resource_exports,
11172
8913
  ...use_card_summary_exports,
11173
- ...use_fixture_pick_exports,
11174
8914
  ...use_facts_exports,
11175
8915
  ...use_host_write_exports,
11176
8916
  ...use_long_task_exports,
11177
- ...mock_mode_exports,
11178
8917
  ...use_capability_gate_exports,
11179
8918
  ...use_unit_board_exports,
11180
8919
  ...use_visible_busy_exports
@@ -11189,7 +8928,6 @@ var kit = {
11189
8928
  ...dist_exports,
11190
8929
  ...dist_exports,
11191
8930
  ...dist_exports,
11192
- ...dist_exports,
11193
8931
  Tip
11194
8932
  },
11195
8933
  api: {
@@ -11207,7 +8945,7 @@ function messagesOf(units) {
11207
8945
  ...face.messages === void 0 ? {} : { messages: face.messages }
11208
8946
  }));
11209
8947
  }
11210
- var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-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 position: relative;\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-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n 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}\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}:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n.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\n.wb-mockChipOn:hover {\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}\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-32);\n padding: var(--wb-len-6) var(--wb-len-12);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-32);\n padding: var(--wb-len-6) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-32);\n padding: var(--wb-len-6) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._gallery_eqvi8_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-24);\n}\n\n._section_eqvi8_7 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n}\n\n._heading_eqvi8_13 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._title_eqvi8_20 {\n flex: none;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-primary);\n}\n\n._note_eqvi8_26 {\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._cells_eqvi8_32 {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(var(--wb-len-220), 1fr));\n gap: var(--wb-len-12);\n align-items: start;\n}\n\n._cell_eqvi8_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._cellLabel_eqvi8_46 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-caption);\n}\n\n._span_eqvi8_51 {\n grid-column: 1 / -1;\n}\n\n._stack_eqvi8_55 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n}\n\n._inline_eqvi8_61 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._panel_eqvi8_68 {\n padding: var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._bound_eqvi8_75 {\n max-width: var(--wb-len-360);\n}\n._panel_135e7_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_135e7_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_135e7_1[data-open] {\n visibility: visible;\n}\n\n._columns_135e7_18 {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: var(--wb-len-12);\n}\n\n._columns_135e7_18[data-two] {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n._column_135e7_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._root_1ubj2_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._glyph_1ubj2_7 {\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_1ubj2_17 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1ubj2_21 {\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_1ubj2_32 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1ubj2_40 {\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_1ubj2_21 ._name_1ubj2_40 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1ubj2_53 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1ubj2_61 {\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_1ubj2_61 ._rowAction_1ubj2_71 {\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_1ubj2_53 ._name_1ubj2_40 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1ubj2_84 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
8948
+ var COMPONENT_CSS_MARKER = "\n.wb-activityBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding-top: var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n.wb-activityBlock:first-child {\n padding-top: 0;\n border-top: none;\n}\n\n.wb-activityBlockHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8);\n}\n\n.wb-activityLine {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-activityLineText {\n flex: none;\n min-width: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n max-height: var(--wb-len-72);\n overflow-y: auto;\n}\n\n.wb-activityLineAt {\n flex: none;\n margin-left: auto;\n font-size: var(--wb-font-10);\n line-height: var(--wb-line-16);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-activityLine > .wb-activityLineAt,\n.wb-activityLine > .wb-activityLineActions {\n margin-left: auto;\n}\n\n.wb-activityLine > .wb-activityLineAt + .wb-activityLineActions {\n margin-left: 0;\n}\n\n.wb-activityLineActions {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n}\n\n.wb-activityActionFailed {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-note {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-problem {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-approvalCommand {\n max-width: 100%;\n}\n.wb-approvalPlan {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-approvalHint {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n.wb-approvalRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n}\n.wb-approvalRow {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n.wb-approvalLabel {\n flex: none;\n width: var(--wb-len-56);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-approvalValue {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n overflow-wrap: anywhere;\n}\n.wb-approvalWarn {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-8) var(--wb-card-gutter);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-cardTitle {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-cardMeta {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-cardMeta::before {\n content: '\\00b7';\n margin-right: var(--wb-len-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardOpen ~ .wb-cardRefresh {\n margin-left: 0;\n}\n\n.wb-cardOpen:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh {\n margin-left: auto;\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-4);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardRefresh:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-cardRefresh:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-cardGear {\n flex: none;\n width: var(--wb-len-22);\n height: var(--wb-len-22);\n padding: var(--wb-len-3);\n border-radius: var(--wb-radius-6);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-cardGear:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-card {\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n flex: none;\n}\n.wb-cardBody {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-card-gutter);\n font-size: var(--dsw-font-xxs-12-font-size);\n}\n.wb-cardBleed {\n margin-inline: calc(-1 * var(--wb-card-gutter));\n}\n._anchor_yq4s2_1 {\n display: contents;\n}\n\n.wb-spinner {\n display: inline-flex;\n align-items: center;\n flex: none;\n}\n\n.wb-choiceMenu {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n background: transparent;\n}\n\n.wb-choiceMenu[data-variant='boxed'] {\n padding: var(--wb-len-4);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n}\n\n.wb-choiceOption {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n border-radius: var(--dsw-radius-md);\n cursor: pointer;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-choiceOptionOn {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-checkbox {\n position: absolute;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: 0;\n opacity: 0;\n pointer-events: none;\n}\n\n.wb-checkboxBox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-xs);\n corner-shape: round;\n color: var(--dsw-alias-label-primary-foreground);\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-choiceOption:hover .wb-checkboxBox {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-checkbox:checked + .wb-checkboxBox {\n border-color: var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n}\n\n.wb-checkbox:disabled + .wb-checkboxBox {\n cursor: default;\n}\n\n.wb-checkbox:focus-visible + .wb-checkboxBox {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}\n\n.wb-choiceOption:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-choiceOption:has(:disabled) {\n cursor: default;\n opacity: 0.5;\n}\n\n.wb-choiceOption:has(:disabled),\n.wb-choiceOption:has(:disabled):hover {\n background: transparent;\n}\n\n.wb-choiceLabel {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.wb-choiceLabelText {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceLabel:has(.wb-choiceDescription) .wb-choiceLabelText {\n overflow: visible;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n\n.wb-choiceDescription {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n.wb-choiceLoading {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-choiceLoadingText {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wb-choiceEmpty {\n display: flex;\n align-items: center;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-8);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio {\n appearance: none;\n -webkit-appearance: none;\n flex: none;\n box-sizing: border-box;\n width: var(--wb-len-12);\n height: var(--wb-len-12);\n margin: 0;\n border: 1px solid var(--dsw-alias-border-l3);\n border-radius: 50%;\n corner-shape: round;\n background-color: transparent;\n cursor: pointer;\n transition:\n background-color var(--wb-dur-0-12) ease, border-color var(--wb-dur-0-12) ease;\n}\n\n.wb-radio:not(:checked):hover {\n border-color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-radio:checked {\n border-color: var(--dsw-alias-brand-primary);\n background-image: radial-gradient(\n circle at center,\n var(--dsw-alias-brand-primary) 0 3px,\n transparent 3px\n );\n}\n\n.wb-radio:disabled {\n cursor: default;\n}\n\n.wb-radio:focus-visible {\n outline: var(--dsw-focus-ring-width, var(--wb-len-2)) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: 2px;\n}.wb-field {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n.wb-fieldLabel {\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-fieldHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-field:has(:disabled) .wb-fieldLabel {\n opacity: 0.4;\n}\n.wb-formRows {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n.wb-formRow {\n display: grid;\n grid-template-columns: 72px minmax(0, 1fr);\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n.wb-formRow[data-layout='stacked'] {\n grid-template-columns: minmax(0, 1fr);\n align-items: stretch;\n gap: var(--wb-len-6);\n}\n\n.wb-formLabel {\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n.wb-formControl {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.wb-formHint {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-formProblem {\n grid-column: 2;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(.wb-formProblem) .wb-formLabel {\n color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-formRow:has(:disabled) .wb-formLabel {\n opacity: 0.4;\n}\n:where(.wb-link) {\n margin-left: var(--wb-len-2);\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\n:where(.wb-link:hover) {\n text-decoration: underline;\n}\n\n:where(.wb-link:focus-visible) {\n outline: var(--dsw-focus-ring-width) solid var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n}\n\n.wb-longTask {\n padding-top: var(--wb-len-12);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n.wb-longTaskHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n}\n\n.wb-longTaskLink {\n flex: none;\n}\n\n.wb-longTaskHeadline {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n}\n\n.wb-longTaskProblem {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n.wb-longTaskDump {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-longTaskDump pre {\n margin: var(--wb-len-4) 0 0;\n max-height: var(--wb-len-220);\n overflow: auto;\n}\n.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}.wb-textField {\n box-sizing: border-box;\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n outline: none;\n}\n\n.wb-textField:focus {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-textField:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-textField[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-textField[aria-invalid='true']:focus {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n:where(.wb-textField) {\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n}\n:where(.wb-selectTrigger) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-primary);\n text-align: left;\n cursor: pointer;\n}\n\n.wb-selectTrigger:focus-visible {\n outline: none;\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true'] {\n border-color: var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger[aria-invalid='true']:focus-visible {\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-error-primary);\n}\n\n.wb-selectTrigger:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wb-selectLoading:disabled {\n cursor: default;\n opacity: 1;\n}\n\n.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: none;\n background: transparent;\n font-size: var(--wb-font-row);\n}\n\n.wb-selectGhost:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.wb-selectGhost:focus-visible {\n outline: var(--dsw-focus-ring-width) solid\n var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));\n outline-offset: -2px;\n border-color: transparent;\n box-shadow: none;\n}\n\n.wb-selectAnchor {\n display: block;\n width: 100%;\n}\n\n.wb-selectIcon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-16);\n height: var(--wb-len-20);\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectValue {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-6);\n line-height: var(--wb-line-20);\n overflow: hidden;\n}\n\n.wb-selectPlaceholder {\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-selectChevron {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-caption);\n}\n\n.wb-selectMenu {\n min-width: var(--wb-len-240);\n max-width: var(--wb-len-360);\n max-height: min(var(--wb-len-320), calc(100vh - var(--wb-len-24)));\n}\n\n:where(.wb-selectSearch) {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n width: 100%;\n min-height: var(--wb-len-28);\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n.wb-selectSearch:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-state-business-primary);\n}\n\n.wb-selectSearch.wb-selectGhost {\n gap: var(--wb-gap-xs);\n min-height: 0;\n height: var(--wb-len-34);\n padding: 0 var(--wb-len-8);\n border: 0.5px solid var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.wb-selectSearch.wb-selectGhost:focus-within {\n border-color: var(--dsw-alias-state-business-primary);\n box-shadow: none;\n}\n\n.wb-selectSearchIcon {\n flex: none;\n display: inline-flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n.wb-textField.wb-selectSearchInput {\n flex: 1;\n min-width: 0;\n min-height: 0;\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.wb-textField.wb-selectSearchInput:focus {\n box-shadow: none;\n}\n\n.wb-selectFallback {\n width: 100%;\n}\n\n.wb-selectHint {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\nsection.wb-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n padding: var(--wb-len-12) var(--wb-len-16);\n border: 0;\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-settings-card-fill);\n}\n.wb-settingsHead {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n.wb-settings .wb-settingsTitle {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-s-strong-14-font-size);\n line-height: var(--wb-line-24);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n.wb-stack {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n min-height: 0;\n}\n\n.wb-stateBlock {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n}\n.wb-stateBlockTitle {\n margin: 0;\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n.wb-stateBlockHint {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n.wb-stateBlockActions {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-2);\n}\n.wb-stateBlockResolving {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n._marketList_csyus_1 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._marketRow_csyus_10 {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--wb-len-14);\n row-gap: var(--wb-len-4);\n padding: var(--wb-len-8);\n border-radius: var(--dsw-radius-lg);\n}\n\n._marketIcon_csyus_20 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-40);\n height: var(--wb-len-40);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-md);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketMain_csyus_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n min-width: 0;\n}\n\n._marketName_csyus_39 {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketDesc_csyus_48 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketUsedBy_csyus_59 {\n margin-left: var(--wb-len-8);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n opacity: 0.75;\n}\n\n._marketUsedBy_csyus_59::before {\n content: '·';\n margin-right: var(--wb-len-6);\n opacity: 0.8;\n}\n\n._marketName_csyus_39 ._marketVersion_csyus_73 {\n margin-left: var(--wb-len-6);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n}\n\n._marketVersion_csyus_73 {\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketVersion_csyus_73::before {\n content: '';\n display: inline-block;\n width: var(--wb-len-1);\n height: var(--wb-len-10);\n margin: 0 var(--wb-len-8) 0 var(--wb-len-2);\n vertical-align: -1px;\n background: var(--dsw-alias-border-l2);\n}\n\n._marketLocalTag_csyus_95 {\n margin-left: var(--wb-len-8);\n padding: 0 var(--wb-len-6);\n border: var(--wb-len-1) solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n font-weight: 400;\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n}\n\n._marketEnd_csyus_106 {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-10);\n}\n\n._marketSwitchSeat_csyus_113::before {\n content: '';\n width: 0;\n height: var(--wb-len-14);\n border-left: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketActions_csyus_126 {\n flex: none;\n display: flex;\n gap: var(--wb-len-6);\n}\n\n._marketUpdateAction_csyus_132 {\n color: var(--dsw-alias-state-warn-primary);\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 30%, transparent);\n --dsw-alias-interactive-bg-hover: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._marketSelfDivider_csyus_138 {\n height: 0;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n._marketSection_csyus_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._marketSectionHead_csyus_150 {\n display: flex;\n align-items: baseline;\n gap: var(--wb-len-8);\n}\n\n._marketSectionIcon_csyus_156 {\n display: inline-flex;\n align-items: center;\n align-self: center;\n color: var(--dsw-alias-label-caption);\n}\n\n._marketSectionTitle_csyus_163 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n._marketSectionCount_csyus_169 {\n font: var(--dsw-font-s-14);\n font-variant-numeric: tabular-nums;\n color: var(--dsw-alias-label-caption);\n}\n\n\n._marketProgress_csyus_176 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-height: var(--wb-len-32);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketNote_csyus_186 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-warn-primary);\n overflow-wrap: anywhere;\n}\n\n._marketNotePlain_csyus_193 {\n grid-column: 2 / -1;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-caption);\n overflow-wrap: anywhere;\n}\n\n._marketFailure_csyus_201 {\n grid-column: 2 / -1;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._marketEmpty_csyus_208 {\n padding: var(--wb-len-18) var(--wb-len-16);\n text-align: center;\n}\n\n._marketPage_csyus_213 {\n box-sizing: border-box;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-32);\n padding: 0 clamp(var(--wb-len-24), 4vw, var(--wb-len-48)) var(--wb-len-48);\n overflow-x: hidden;\n overflow-y: auto;\n color: var(--dsw-alias-label-primary);\n}\n\n._marketPage_csyus_213 > * {\n width: 100%;\n max-width: var(--wb-len-960);\n}\n\n._marketPageHead_csyus_231 {\n box-sizing: border-box;\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-16);\n padding-top: var(--wb-len-28);\n}\n\n._marketPageTitle_csyus_239 {\n margin: 0;\n font: var(--dsw-font-l-20);\n}\n\n._marketPageIntro_csyus_244 {\n margin: var(--wb-len-4) 0 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketPageTools_csyus_250 {\n flex: none;\n align-self: center;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--wb-len-16);\n}\n\n._marketIconButton_csyus_259 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n color: var(--dsw-alias-label-caption);\n cursor: pointer;\n}\n\n._marketIconButton_csyus_259:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketIconButton_csyus_259:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._marketIconWrap_csyus_284 {\n display: inline-flex;\n}\n\n._marketIconButtonSpinning_csyus_288 svg {\n animation: _wb-spin_csyus_1 var(--wb-dur-0-9) linear infinite;\n}\n\n._marketAddButton_csyus_292 {\n height: var(--wb-len-32);\n padding: 0 var(--wb-len-12);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n border-radius: var(--dsw-radius-md);\n}\n\n._marketEmpty_csyus_208 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-64) var(--wb-len-16);\n text-align: center;\n}\n\n._marketChecking_csyus_309 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n\n._marketEmptyTitle_csyus_317 {\n font: var(--dsw-font-base-strong-16);\n color: var(--dsw-alias-label-primary);\n}\n\n@keyframes _wb-spin_csyus_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n._foot_1ud1j_1 {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wb-len-8);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-10);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._footText_1ud1j_13 {\n flex: 1;\n min-width: 0;\n}\n\n._footTextMd_1ud1j_18 {\n flex: 1;\n min-width: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n}\n._wide_1lv8f_1 {\n justify-content: center;\n width: 100%;\n height: var(--wb-len-40);\n border-radius: var(--dsw-radius-md);\n}\n\n._dialog_1lv8f_8 {\n width: min(var(--wb-len-560), 100%);\n max-height: min(var(--wb-len-800), 100%);\n}\n\n._content_1lv8f_13 {\n min-height: 0;\n overflow: auto;\n}\n\n._stack_1lv8f_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._body_1lv8f_25 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n\n._field_1lv8f_32 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._input_1lv8f_39 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-14);\n}\n\n._registryField_1lv8f_45 {\n height: var(--wb-len-32);\n margin-left: var(--wb-len-26);\n padding: 0 var(--wb-len-10);\n}\n\n._options_1lv8f_51 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-8) var(--wb-len-12);\n}\n\n._guideToggle_1lv8f_59 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-4);\n align-self: flex-start;\n margin-top: var(--wb-len-4);\n padding: 0;\n border: 0;\n background: transparent;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._guideToggle_1lv8f_59:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n._guideToggle_1lv8f_59 svg,\n._registryToggle_1lv8f_78 svg {\n transition: transform var(--wb-dur-0-12) ease;\n}\n\n._guideToggle_1lv8f_59[aria-expanded='true'] svg,\n._registryToggle_1lv8f_78[aria-expanded='true'] svg {\n transform: rotate(180deg);\n}\n\n._registryWrap_1lv8f_87 {\n position: relative;\n flex: none;\n}\n\n._registryToggle_1lv8f_78 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n height: var(--wb-len-26);\n padding: 0 var(--wb-len-8) 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n font: inherit;\n font-size: var(--wb-font-12-5);\n color: var(--dsw-alias-label-secondary);\n cursor: pointer;\n}\n\n._registryToggle_1lv8f_78:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._registryToggle_1lv8f_78:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n._registryToggle_1lv8f_78[aria-expanded='true'] {\n border-color: var(--dsw-alias-border-l3);\n background: var(--dsw-alias-bg-layer-3);\n}\n\n._registryChosen_1lv8f_121 {\n color: var(--dsw-alias-label-primary);\n font-weight: 500;\n}\n\n._registry_1lv8f_45 {\n position: fixed;\n z-index: var(--wb-z-1100);\n box-sizing: border-box;\n width: min(var(--wb-len-440), 100vw - var(--wb-len-24));\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10) var(--wb-len-12);\n border: 0;\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-2);\n --dsw-elevation-stroke-color: var(--dsw-alias-border-l3);\n box-shadow: var(--dsw-elevation-prominent);\n}\n\n._registryOption_1lv8f_143 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid transparent;\n border-radius: var(--dsw-radius-lg);\n cursor: pointer;\n}\n\nlabel._registryOption_1lv8f_143 {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--wb-len-10);\n}\n\n._registryPick_1lv8f_159 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n cursor: pointer;\n}\n\n._registryOption_1lv8f_143[data-checked='true'] {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 40%, transparent);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._registryOption_1lv8f_143 input[type='radio'] {\n flex: none;\n width: var(--wb-len-16);\n height: var(--wb-len-16);\n margin: var(--wb-len-2) 0 0;\n accent-color: var(--dsw-alias-brand-primary);\n}\n\n._registryTitle_1lv8f_179 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n font: var(--dsw-font-xs-13);\n line-height: var(--wb-line-20);\n color: var(--dsw-alias-label-primary);\n}\n\n._registryHint_1lv8f_189 {\n margin-left: var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._inputError_1lv8f_197 {\n margin: var(--wb-len-neg-4) 0 0 var(--wb-len-26);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._guide_1lv8f_59 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) var(--wb-len-14) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-border-l4);\n border-radius: var(--dsw-radius-lg);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._guideList_1lv8f_214 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._guideItem_1lv8f_223 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0;\n}\n\n._guideIndex_1lv8f_230 {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-20);\n height: var(--wb-len-20);\n border-radius: var(--wb-radius-pill);\n corner-shape: round;\n background: var(--dsw-alias-bg-module-platform);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._guideMain_1lv8f_244 {\n display: flex;\n flex-direction: column;\n flex: 1;\n gap: 0;\n min-width: 0;\n}\n\n._guideTitle_1lv8f_252 {\n font: var(--dsw-font-s-14);\n font-weight: 500;\n color: var(--dsw-alias-label-primary);\n}\n\n._guideHint_1lv8f_258 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._guideExample_1lv8f_264 {\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._guideExample_1lv8f_264 code {\n font-family: var(--dsw-font-mono, monospace);\n}\n\n._guideExampleLabel_1lv8f_274 {\n color: var(--dsw-alias-label-caption);\n}\n\n._footer_1lv8f_278 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-20);\n width: 100%;\n}\n\n._hero_1lv8f_285 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-10);\n padding: var(--wb-len-8) 0 var(--wb-len-4);\n text-align: center;\n}\n\n._heroIcon_1lv8f_294 {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-44);\n height: var(--wb-len-44);\n color: var(--dsw-alias-label-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='done'] {\n color: var(--dsw-alias-state-success-secondary);\n}\n\n._heroIcon_1lv8f_294[data-state='error'] {\n color: var(--dsw-alias-state-warn-label);\n}\n\n._pendingTitle_1lv8f_311 {\n margin: 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 500;\n color: var(--dsw-alias-label-secondary);\n}\n\n._wizardTitle_1lv8f_319 {\n margin: 0;\n font-size: var(--wb-font-18);\n line-height: var(--wb-len-26);\n font-weight: 600;\n}\n\n._subject_1lv8f_326 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-lg);\n text-align: center;\n}\n\n._subjectName_1lv8f_337 {\n margin: 0;\n font: var(--dsw-font-base-strong-16);\n overflow-wrap: anywhere;\n}\n\n._subjectMeta_1lv8f_343,\n._subjectDesc_1lv8f_344 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._result_1lv8f_351,\n._resultWarn_1lv8f_352 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 10%, transparent);\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-primary);\n}\n\n._resultWarn_1lv8f_352 {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n}\n\n._resultMeta_1lv8f_365 {\n margin: 0;\n padding: 0 var(--wb-len-12);\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._approval_1lv8f_373 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-state-warn-primary);\n border-radius: var(--dsw-radius-lg);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n._approvalTitle_1lv8f_383 {\n margin: 0;\n font: var(--dsw-font-s-14);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._approvalText_1lv8f_390 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-secondary);\n}\n\n._approvalCaution_1lv8f_396 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._note_1lv8f_403 {\n margin: 0;\n font: var(--dsw-font-s-14);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n}\n\n._noteWarn_1lv8f_410 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._noteError_1lv8f_414 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._problem_1lv8f_418 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._detailLabel_1lv8f_425 {\n margin: 0;\n font: var(--dsw-font-xs-13);\n color: var(--dsw-alias-label-caption);\n}\n\n._detail_1lv8f_425 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l1);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-3);\n font-family: var(--dsw-font-mono, monospace);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n._note_1enlz_1 {\n display: flex;\n align-items: flex-start;\n gap: var(--wb-len-8);\n margin: 0;\n padding: var(--wb-len-10) var(--wb-len-12);\n border-radius: var(--dsw-radius-md);\n background: var(--dsw-alias-state-warn-tertiary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._note_1enlz_1 > svg {\n flex: none;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-state-warn-primary);\n}\n._body_lw2ph_1 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n}\n\n._lead_lw2ph_7 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n}\n\n._sources_lw2ph_14 {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._sourcesLabel_lw2ph_21 {\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-secondary);\n}\n\nbutton._sourceOn_lw2ph_26 {\n border-color: var(--dsw-alias-brand-primary);\n}\n._sourceCount_lw2ph_29 {\n margin-left: var(--wb-len-4);\n font-variant-numeric: tabular-nums;\n font-size: var(--dsw-font-xxs-12-font-size);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._reading_lw2ph_36 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-4);\n}\n\n._status_lw2ph_42 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failure_lw2ph_52 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n column-gap: var(--wb-len-10);\n row-gap: var(--wb-len-2);\n color: var(--dsw-alias-state-error-primary);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n}\n\n._failureTitle_lw2ph_62 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._failureHint_lw2ph_69 {\n grid-column: 1;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._failureAction_lw2ph_74 {\n grid-column: 2;\n grid-row: 1;\n justify-self: end;\n}\n\n._rows_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n._row_lw2ph_80 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-6);\n padding: var(--wb-len-12) var(--wb-len-14);\n border: 0.5px solid var(--dsw-alias-settings-card-stroke);\n border-radius: var(--dsw-radius-xl);\n background: var(--dsw-alias-settings-card-fill);\n}\n\n._head_lw2ph_99 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._pick_lw2ph_106 {\n flex: 0 1 auto;\n min-width: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n}\n\n._pick_lw2ph_106 > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._code_lw2ph_118 {\n --dsl-code-block-background: var(--dsw-alias-bg-layer-1);\n margin: 0;\n}\n\n._missing_lw2ph_123,\n._conflict_lw2ph_124 {\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._foot_lw2ph_130 {\n display: flex;\n justify-content: flex-end;\n}\n._actions_jlw8j_1[hidden],\n._progress_jlw8j_2[hidden],\n._commandRow_jlw8j_3[hidden],\n._bridge_jlw8j_4[hidden],\n._raw_jlw8j_5[hidden] {\n display: none;\n}\n\n._gate_jlw8j_9 {\n position: fixed;\n inset: 0;\n z-index: var(--wb-z-top);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--wb-len-24);\n background: var(--dsw-alias-bg-base);\n}\n\n._card_jlw8j_20 {\n width: 100%;\n max-width: var(--wb-len-420);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-16);\n text-align: center;\n}\n\n._card_jlw8j_20:has(._actions_jlw8j_1:not([hidden])),\n._card_jlw8j_20:has(._bridge_jlw8j_4:not([hidden])) {\n max-width: var(--wb-len-520);\n}\n\n._title_jlw8j_35 {\n margin: 0;\n font-size: var(--dsw-font-base-16-font-size);\n line-height: var(--wb-line-24);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._steps_jlw8j_50 {\n list-style: none;\n margin: var(--wb-len-6) 0 0;\n padding: 0;\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n text-align: left;\n}\n\n._step_jlw8j_50 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-6) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._step_jlw8j_50[data-status='running'] {\n color: var(--dsw-alias-label-primary);\n}\n\n._mark_jlw8j_77 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-14);\n height: var(--wb-len-14);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._step_jlw8j_50[data-status='ok'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-success-primary);\n}\n\n._step_jlw8j_50[data-status='warn'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-warn-primary);\n}\n\n._step_jlw8j_50[data-status='failed'] ._mark_jlw8j_77 {\n color: var(--dsw-alias-state-error-primary);\n}\n\n._label_jlw8j_102 {\n flex: none;\n}\n\n._detail_jlw8j_106 {\n margin-left: auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._progress_jlw8j_2 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-8);\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._elapsed_jlw8j_124 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n._error_jlw8j_132 {\n margin: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n max-height: var(--wb-len-120);\n overflow: auto;\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n white-space: pre-wrap;\n word-break: break-all;\n text-align: left;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._commandRow_jlw8j_3 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n margin: 0 0 var(--wb-len-8);\n padding-right: var(--wb-len-4);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n._copy_jlw8j_158 {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--wb-len-24);\n height: var(--wb-len-24);\n padding: 0;\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._copy_jlw8j_158:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._command_jlw8j_3 {\n flex: 1;\n min-width: 0;\n padding: var(--wb-len-8) var(--wb-len-10);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font-family: var(--ds-font-family-code, monospace);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-primary);\n}\n\n._buttons_jlw8j_191 {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--wb-len-12);\n}\n\n._mockSlot_jlw8j_198 {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n justify-content: center;\n background: var(--dsw-alias-bg-base);\n}\n\n._button_jlw8j_191 {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: transparent;\n font: inherit;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n cursor: pointer;\n}\n\n._button_jlw8j_191:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._button_jlw8j_191:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n._actions_jlw8j_1,\n._bridge_jlw8j_4 {\n box-sizing: border-box;\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-4);\n padding: var(--wb-len-14) var(--wb-len-16);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-1);\n text-align: left;\n}\n\n._fixTitle_jlw8j_249 {\n margin: 0;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._actions_jlw8j_1 ._hint_jlw8j_43,\n._bridge_jlw8j_4 ._hint_jlw8j_43 {\n margin: 0;\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._actions_jlw8j_1 ._commandRow_jlw8j_3,\n._bridge_jlw8j_4 ._commandRow_jlw8j_3 {\n margin: 0;\n}\n\n._actions_jlw8j_1 ._buttons_jlw8j_191,\n._bridge_jlw8j_4 ._buttons_jlw8j_191 {\n justify-content: flex-start;\n}\n\n._raw_jlw8j_5 {\n margin: 0;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n}\n\n._rawSummary_jlw8j_282 {\n cursor: pointer;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._actions_jlw8j_1 ._error_jlw8j_132,\n._bridge_jlw8j_4 ._error_jlw8j_132 {\n margin-top: var(--wb-len-6);\n}\n\n._bridgeLines_jlw8j_292 {\n margin: 0;\n padding-left: var(--wb-len-18);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-19);\n color: var(--dsw-alias-label-secondary);\n}\n\n._bridgeLine_jlw8j_292 a {\n display: block;\n margin-top: var(--wb-len-4);\n width: fit-content;\n}\n\n._link_jlw8j_309 {\n color: var(--dsw-alias-label-primary);\n text-decoration: none;\n}\n\n._link_jlw8j_309::after {\n content: '↗';\n margin-left: var(--wb-len-2);\n}\n\n._link_jlw8j_309:hover {\n text-decoration: underline;\n}\n\n._loading_jlw8j_323 {\n flex: none;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._loading_jlw8j_323[hidden] {\n display: none;\n}\n\n._loadingMotion_jlw8j_332 {\n transform-origin: center;\n animation: _wb-spin_jlw8j_1 var(--wb-dur-1-5) linear infinite;\n}\n\n._loadingTrack_jlw8j_337,\n._loadingArc_jlw8j_338 {\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n}\n\n._loadingTrack_jlw8j_337 {\n opacity: 0.25;\n}\n\n._loadingArc_jlw8j_338 {\n stroke-dasharray: 12 150;\n animation: _wb-dash_jlw8j_1 var(--wb-dur-1-5) ease-in-out infinite;\n}\n\n@keyframes _wb-spin_jlw8j_1 {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes _wb-dash_jlw8j_1 {\n 0% {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 24 150;\n stroke-dashoffset: -6;\n }\n to {\n stroke-dasharray: 12 150;\n stroke-dashoffset: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n ._loadingMotion_jlw8j_332,\n ._loadingArc_jlw8j_338 {\n animation: none;\n }\n}\n._group_1hxis_1 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-2);\n}\n\n._button_1hxis_7 {\n flex: none;\n width: var(--wb-len-28);\n height: var(--wb-len-28);\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n}\n\n._button_1hxis_7:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n}\n\n._active_1hxis_19 {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._icon_1hxis_23 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n._icon_1hxis_23 svg {\n display: block;\n width: var(--wb-len-15);\n height: var(--wb-len-15);\n}\n\n._mirror_1hxis_35 {\n transform: scaleX(-1);\n}\n._stripTabs_1dqp4_1 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-4);\n min-width: 0;\n overflow: hidden;\n}\n\n._tab_1dqp4_9 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n flex: none;\n height: var(--wb-len-28);\n padding: 0 var(--wb-len-10);\n border: 0;\n border-radius: var(--dsw-radius-sm);\n background: none;\n font: inherit;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-16);\n max-width: 100%;\n}\n\n._tabActive_1dqp4_25 {\n color: var(--dsw-alias-label-primary);\n}\n\n._tabQuiet_1dqp4_29 {\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._tabQuiet_1dqp4_29:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._tabTitle_1dqp4_39 {\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._sep_1dqp4_49 {\n flex: none;\n color: var(--dsw-alias-label-dimmed);\n}\n._trigger_15ptp_1 {\n display: flex;\n align-items: center;\n}\n\n._pop_15ptp_6 {\n position: absolute;\n top: calc(var(--wb-len-38) + var(--wb-len-8));\n right: var(--wb-len-6);\n z-index: var(--wb-z-30);\n width: min(var(--wb-len-360), calc(100% - var(--wb-len-12)));\n max-width: calc(100vw - var(--wb-len-48));\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--wb-radius-14);\n background: var(--dsw-alias-bg-layer-2);\n box-shadow: var(--dsw-shadow-lv3);\n overflow: hidden;\n}\n\n._head_15ptp_20 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-10) var(--wb-len-12) var(--wb-len-9) var(--wb-len-14);\n border-bottom: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._title_15ptp_28 {\n flex: 1;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._rowControls_15ptp_36 {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wb-len-8);\n}\n\n._reset_15ptp_43 {\n flex: none;\n padding: var(--wb-len-3) var(--wb-len-8);\n border: none;\n border-radius: var(--wb-radius-6);\n background: transparent;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n cursor: pointer;\n}\n\n._reset_15ptp_43:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover);\n color: var(--dsw-alias-label-primary);\n}\n\n._reset_15ptp_43:disabled {\n cursor: default;\n opacity: 0.5;\n}\n\n._list_15ptp_65 {\n list-style: none;\n margin: 0;\n padding: var(--wb-len-6);\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-2);\n}\n\n._row_15ptp_36 {\n position: relative;\n display: grid;\n grid-template-columns: 12px minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wb-len-8);\n padding: var(--wb-len-7) var(--wb-len-8);\n border-radius: var(--dsw-radius-sm);\n cursor: default;\n}\n\n._rowDragging_15ptp_85 {\n cursor: grabbing;\n}\n\n._rowBlocked_15ptp_89 {\n cursor: not-allowed;\n}\n\n._listDragging_15ptp_93 ._rowControls_15ptp_36 {\n pointer-events: none;\n}\n\n._row_15ptp_36:hover {\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n._rowOff_15ptp_101 {\n opacity: 0.55;\n}\n\n._rowOff_15ptp_101:hover {\n opacity: 1;\n}\n\n._rowOver_15ptp_109::before {\n content: '';\n position: absolute;\n top: var(--wb-len-neg-3);\n left: var(--wb-len-8);\n right: var(--wb-len-8);\n height: var(--wb-len-2);\n background: var(--dsw-alias-brand-primary);\n}\n\n._ghost_15ptp_119 {\n position: fixed;\n z-index: var(--wb-z-40);\n pointer-events: none;\n padding: var(--wb-len-4) var(--wb-len-10);\n border: 0.5px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n box-shadow: var(--wb-static-shadow-ghost);\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n white-space: nowrap;\n}\n\n._grip_15ptp_134 {\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n text-align: center;\n color: var(--dsw-alias-label-tertiary);\n user-select: none;\n cursor: grab;\n touch-action: none;\n}\n\n._gripDragging_15ptp_144 {\n cursor: grabbing;\n}\n\n._gripBlocked_15ptp_148 {\n cursor: not-allowed;\n}\n\n._label_15ptp_152 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n min-width: 0;\n}\n\n._name_15ptp_159 {\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-primary);\n}\n\n._error_15ptp_170 {\n margin: 0;\n padding: 0 var(--wb-len-14) var(--wb-len-10);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-state-error-primary);\n}\n\n._dep_15ptp_178 {\n flex: none;\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n color: var(--dsw-alias-label-tertiary);\n white-space: nowrap;\n}\n\n._group_15ptp_186 {\n padding-top: var(--wb-len-6);\n border-top: 0.5px solid var(--dsw-alias-border-l2);\n}\n\n._groupTitle_15ptp_191 {\n margin: 0;\n padding: var(--wb-len-2) var(--wb-len-8) 0 var(--wb-len-14);\n font-size: var(--dsw-font-xxxs-11-font-size);\n line-height: var(--wb-line-16);\n font-weight: 400;\n color: var(--dsw-alias-label-tertiary);\n}\n._panel_135e7_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_135e7_1[data-fullscreen] {\n z-index: var(--wb-z-40);\n}\n\n._panel_135e7_1[data-open] {\n visibility: visible;\n}\n\n._columns_135e7_18 {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n align-items: start;\n gap: var(--wb-len-12);\n}\n\n._columns_135e7_18[data-two] {\n grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n\n._column_135e7_18 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._root_1ubj2_1 {\n position: relative;\n flex: none;\n margin: 0 var(--wb-len-2) var(--wb-len-4);\n}\n\n._glyph_1ubj2_7 {\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_1ubj2_17 {\n color: var(--dsw-alias-state-business-primary);\n}\n\n._triggerName_1ubj2_21 {\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_1ubj2_32 {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n._name_1ubj2_40 {\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_1ubj2_21 ._name_1ubj2_40 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._row_1ubj2_53 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n width: 100%;\n min-width: 0;\n}\n\n._trailing_1ubj2_61 {\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_1ubj2_61 ._rowAction_1ubj2_71 {\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_1ubj2_53 ._name_1ubj2_40 {\n color: var(--dsw-alias-label-tertiary);\n}\n\n._current_1ubj2_84 {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-primary);\n}\n._dialog_1vye5_1 {\n width: min(var(--wb-len-420), 100%);\n}\n\n._stack_1vye5_5 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-8);\n min-width: 0;\n}\n\n._input_1vye5_12 {\n width: 100%;\n height: var(--wb-len-40);\n padding: 0 var(--wb-len-12);\n}\n\n._meta_1vye5_18 {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--wb-len-12);\n min-width: 0;\n}\n._blocker_1oaj0_1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wb-len-6);\n padding: var(--wb-len-20) var(--wb-len-16);\n text-align: center;\n}\n\n._icon_1oaj0_10 {\n display: flex;\n color: var(--dsw-alias-label-tertiary);\n}\n\n._title_1oaj0_15 {\n margin: var(--wb-len-2) 0 0;\n font-size: var(--dsw-font-s-14-font-size);\n line-height: var(--wb-line-22);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._hint_1oaj0_23 {\n margin: 0;\n max-width: var(--wb-len-42em);\n font-size: var(--dsw-font-xxs-12-font-size);\n line-height: var(--wb-line-18);\n color: var(--dsw-alias-label-tertiary);\n text-wrap: pretty;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 {\n align-items: flex-start;\n gap: var(--wb-len-6);\n padding: var(--wb-len-4) 0 var(--wb-len-2);\n text-align: left;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._title_1oaj0_15 {\n font-size: var(--dsw-font-xs-13-font-size);\n line-height: var(--wb-line-20);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._hint_1oaj0_23 {\n max-width: 100%;\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._actions_1oaj0_48 {\n margin-top: var(--wb-len-8);\n}\n\n._blocker_1oaj0_1._blockerInline_1oaj0_32 ._raw_1oaj0_52 {\n margin-top: var(--wb-len-4);\n max-width: 100%;\n}\n\n._actions_1oaj0_48 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-10);\n margin-top: var(--wb-len-6);\n}\n\n._raw_1oaj0_52 {\n margin-top: var(--wb-len-10);\n width: 100%;\n max-width: var(--wb-len-360);\n text-align: left;\n}\n\n._notice_1oaj0_71 {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n column-gap: var(--wb-len-10);\n margin: 0 0 var(--wb-len-10);\n padding: var(--wb-len-10) var(--wb-len-12);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-left: 2px solid var(--dsw-alias-border-l3);\n border-radius: var(--dsw-radius-sm);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n._notice_1oaj0_71._noticeFlat_1oaj0_84 {\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n}\n\n._noticeText_1oaj0_91 {\n display: flex;\n flex-direction: column;\n gap: var(--wb-len-3);\n min-width: 0;\n}\n\n._noticeTitle_1oaj0_98 {\n font-size: var(--wb-font-12-5);\n line-height: var(--wb-line-18);\n font-weight: 600;\n color: var(--dsw-alias-label-primary);\n}\n\n._noticeHint_1oaj0_105 {\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-label-tertiary);\n overflow-wrap: anywhere;\n}\n\n._noticeActions_1oaj0_112 {\n display: flex;\n align-items: center;\n gap: var(--wb-len-6);\n margin-top: var(--wb-len-neg-2);\n}\n\n._failure_1oaj0_119 {\n margin: var(--wb-len-8) 0 0;\n font-size: var(--wb-font-11-5);\n line-height: var(--wb-line-17);\n color: var(--dsw-alias-state-error-primary);\n overflow-wrap: anywhere;\n}\n\n._failureDetail_1oaj0_127 {\n display: block;\n margin-top: var(--wb-len-2);\n color: var(--dsw-alias-label-tertiary);\n white-space: pre-wrap;\n}\n\n._inlineAction_1oaj0_134 {\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n}\n\n._inlineAction_1oaj0_134:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n._rawText_1oaj0_146 {\n margin: var(--wb-len-6) 0 0;\n max-width: 100%;\n}\n/*$vite$:1*/";
11211
8949
  function workbenchCss() {
11212
8950
  return `${tokens_default}\n${palette_default}\n${scale_default}\n${sidebar_default}\n${sidebar_app_default}\n${rightbar_default}\n${chrome_default}\n${board_default}\n${motion_default}\n${COMPONENT_CSS_MARKER}`;
11213
8951
  }