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