@dsh-workbench/core 0.2.11 → 0.2.12

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.
@@ -1026,20 +1026,6 @@ function LongTaskRow(props) {
1026
1026
  }))));
1027
1027
  }
1028
1028
  //#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
1029
  //#region ../shared/dist/components/ResourceStates.js
1044
1030
  function SkeletonRows({ rows = 4 }) {
1045
1031
  return h("div", {
@@ -2792,7 +2778,6 @@ var dist_exports = /* @__PURE__ */ __exportAll({
2792
2778
  Link: () => Link,
2793
2779
  LongTaskRow: () => LongTaskRow,
2794
2780
  MIN_BUSY_MS: () => 500,
2795
- MockStrip: () => MockStrip,
2796
2781
  Note: () => Note,
2797
2782
  OPENCLI_MAX_CONCURRENT: () => 4,
2798
2783
  OPENCLI_PIN: () => OPENCLI_PIN,
@@ -3021,10 +3006,10 @@ var silentNextProbe = false;
3021
3006
  function markNextProbeSilent() {
3022
3007
  silentNextProbe = true;
3023
3008
  }
3024
- var probe$2 = NO_PROBE;
3009
+ var probe = NO_PROBE;
3025
3010
  var probeListeners = /* @__PURE__ */ new Set();
3026
3011
  function probeValue() {
3027
- return probe$2;
3012
+ return probe;
3028
3013
  }
3029
3014
  function subscribeProbe(listener) {
3030
3015
  probeListeners.add(listener);
@@ -3033,8 +3018,8 @@ function subscribeProbe(listener) {
3033
3018
  };
3034
3019
  }
3035
3020
  function setProbe(next) {
3036
- if (next === probe$2) return;
3037
- probe$2 = next;
3021
+ if (next === probe) return;
3022
+ probe = next;
3038
3023
  for (const listener of [...probeListeners]) listener();
3039
3024
  }
3040
3025
  var CAPABILITY_FACT = "capability";
@@ -3053,7 +3038,7 @@ function subscribeCapabilities(listener) {
3053
3038
  function setCapabilities(next, rechecked = false) {
3054
3039
  if (next === null) setProbe(NO_PROBE);
3055
3040
  else if (rechecked) setProbe({
3056
- ...probe$2,
3041
+ ...probe,
3057
3042
  checkedAt: Date.now()
3058
3043
  });
3059
3044
  if (next === current$1) return;
@@ -3061,15 +3046,15 @@ function setCapabilities(next, rechecked = false) {
3061
3046
  for (const listener of [...listeners$3]) listener();
3062
3047
  }
3063
3048
  function beginProbe() {
3064
- if (probe$2.checking) return;
3049
+ if (probe.checking) return;
3065
3050
  setProbe({
3066
- ...probe$2,
3051
+ ...probe,
3067
3052
  checking: true
3068
3053
  });
3069
3054
  }
3070
3055
  function endProbe() {
3071
3056
  setProbe({
3072
- ...probe$2,
3057
+ ...probe,
3073
3058
  checking: false
3074
3059
  });
3075
3060
  }
@@ -3165,41 +3150,34 @@ function useCapabilityMap(refreshToken) {
3165
3150
  };
3166
3151
  }
3167
3152
  //#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
- }
3153
+ //#region src/dev/surface.stub.ts
3154
+ var noop = () => void 0;
3155
+ var devSurface = {
3156
+ on: () => false,
3157
+ crash: () => false,
3158
+ useBoard: ({ all }) => ({
3159
+ shape: { kind: "real" },
3160
+ seed: all,
3161
+ strip: () => null,
3162
+ mode: false
3163
+ }),
3164
+ useStrips: () => ({
3165
+ pick: {
3166
+ enabled: false,
3167
+ active: null,
3168
+ current: void 0,
3169
+ nonce: 0,
3170
+ index: 0,
3171
+ pick: noop
3172
+ },
3173
+ current: void 0,
3174
+ enabled: false,
3175
+ strip: null
3176
+ }),
3177
+ addModuleState: (base) => base,
3178
+ gateStrip: () => null,
3179
+ kitModule: null
3180
+ };
3203
3181
  //#endregion
3204
3182
  //#region src/app/layouts/panel-hint.ts
3205
3183
  var hints = /* @__PURE__ */ new Map();
@@ -3235,1101 +3213,49 @@ var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
3235
3213
  function marketSettled(freshness, installedRead) {
3236
3214
  return freshness.loaded && installedRead !== false;
3237
3215
  }
3238
- function shouldProbeOnEnter(input) {
3239
- if (input.checkedAt === null) return true;
3240
- return input.now - input.checkedAt >= input.staleMs;
3241
- }
3242
- //#endregion
3243
- //#region src/app/layouts/rightbar/market-settle.ts
3244
- var MODULE_SETTLE_MS = 15e3;
3245
- function holdBack(installed, roster, active, previous) {
3246
- const pending = installed.filter((unit) => !roster.has(unit));
3247
- const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
3248
- return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
3249
- }
3250
- var WORKBENCH_SWAP_MS = 18e4;
3251
- function swapLanded(until, installed) {
3252
- return until !== void 0 && installed === until;
3253
- }
3254
- function swapUntil(action, application, latest) {
3255
- if (action !== "update-workbench" || application !== "restart-required") return void 0;
3256
- return latest;
3257
- }
3258
- var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
3259
- function awaitsReadBack(action, application, version) {
3260
- return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
3261
- }
3262
- function readBackDone(input) {
3263
- if (input.action === "update") return !input.outdated;
3264
- if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
3265
- if (input.entry.latest === input.entry.installed) return true;
3266
- if (input.clicked === void 0) return true;
3267
- return input.entry.installed !== input.clicked;
3268
- }
3269
- function settleLanded(input) {
3270
- if (input.until !== void 0) return swapLanded(input.until, input.installed);
3271
- if (input.readBack !== true) return true;
3272
- return readBackDone({
3273
- action: input.action,
3274
- entry: input.entry,
3275
- clicked: input.clicked,
3276
- outdated: input.outdated
3277
- });
3278
- }
3279
- function holdWindowMs(until) {
3280
- return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
3281
- }
3282
- //#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
- ];
3472
- }
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
- }
3485
- };
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]
3501
- }
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
- }]
3513
- }
3514
- };
3515
- }
3516
- function twin(manifest) {
3517
- 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
- };
3216
+ function shouldProbeOnEnter(input) {
3217
+ if (input.checkedAt === null) return true;
3218
+ return input.now - input.checkedAt >= input.staleMs;
4230
3219
  }
4231
3220
  //#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
- }))));
3221
+ //#region src/app/layouts/rightbar/market-settle.ts
3222
+ var MODULE_SETTLE_MS = 15e3;
3223
+ function holdBack(installed, roster, active, previous) {
3224
+ const pending = installed.filter((unit) => !roster.has(unit));
3225
+ const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
3226
+ return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
4280
3227
  }
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);
3228
+ var WORKBENCH_SWAP_MS = 18e4;
3229
+ function swapLanded(until, installed) {
3230
+ return until !== void 0 && installed === until;
3231
+ }
3232
+ function swapUntil(action, application, latest) {
3233
+ if (action !== "update-workbench" || application !== "restart-required") return void 0;
3234
+ return latest;
4322
3235
  }
4323
- function fixtureRoster(roster) {
4324
- return hasCard(roster) ? roster : SAMPLE_ROSTER;
3236
+ var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
3237
+ function awaitsReadBack(action, application, version) {
3238
+ return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
3239
+ }
3240
+ function readBackDone(input) {
3241
+ if (input.action === "update") return !input.outdated;
3242
+ if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
3243
+ if (input.entry.latest === input.entry.installed) return true;
3244
+ if (input.clicked === void 0) return true;
3245
+ return input.entry.installed !== input.clicked;
4325
3246
  }
4326
- function boardModuleOf(face) {
4327
- const module = toBoardModule(face, face.manifest);
4328
- return module === void 0 ? [] : [module];
3247
+ function settleLanded(input) {
3248
+ if (input.until !== void 0) return swapLanded(input.until, input.installed);
3249
+ if (input.readBack !== true) return true;
3250
+ return readBackDone({
3251
+ action: input.action,
3252
+ entry: input.entry,
3253
+ clicked: input.clicked,
3254
+ outdated: input.outdated
3255
+ });
4329
3256
  }
4330
- function fixtureSeed(roster, all, crash = false) {
4331
- const base = hasCard(roster) ? all : boardModuleOf(FIXTURE_FACE);
4332
- return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
3257
+ function holdWindowMs(until) {
3258
+ return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
4333
3259
  }
4334
3260
  //#endregion
4335
3261
  //#region src/app/layouts/rightbar/market-shared-rows.ts
@@ -6312,285 +5238,6 @@ function AddModuleResult({ t, state }) {
6312
5238
  }, 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
5239
  }
6314
5240
  //#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
5241
  //#region src/app/layouts/market/use-add-module.ts
6595
5242
  function newRequestId() {
6596
5243
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
@@ -6790,12 +5437,9 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6790
5437
  onInstalled,
6791
5438
  failedText: t("panels.failed")
6792
5439
  });
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);
5440
+ const devAdd = devSurface.useStrips("addModule", []);
5441
+ const mock = devAdd.current;
5442
+ const state = mock === void 0 ? real : devSurface.addModuleState(real, mock);
6799
5443
  if (!open) return null;
6800
5444
  const installing = state.phase === "installing";
6801
5445
  const checking = state.phase === "inspecting";
@@ -6872,12 +5516,7 @@ function AddModuleDialog({ t, open, onClose, onInstalled }) {
6872
5516
  className: AddModule_module_default.dialog,
6873
5517
  contentClassName: AddModule_module_default.content,
6874
5518
  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, {
5519
+ }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
6881
5520
  t,
6882
5521
  state
6883
5522
  }) : null, state.phase === "inspecting" ? /* @__PURE__ */ h(AddModulePending, {
@@ -6985,13 +5624,9 @@ function MarketPanel({ t, units }) {
6985
5624
  checking: true,
6986
5625
  checkedAt: null
6987
5626
  };
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;
5627
+ const devMarket = devSurface.useStrips("market", manifests);
5628
+ const mock = devMarket.current;
5629
+ const mockNonce = devMarket.pick.nonce;
6995
5630
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
6996
5631
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
6997
5632
  const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
@@ -7014,11 +5649,7 @@ function MarketPanel({ t, units }) {
7014
5649
  icon: /* @__PURE__ */ h(IconPlusOutlineRegular, { size: 13 }),
7015
5650
  disabled: busy,
7016
5651
  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, {
5652
+ }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ h(MarketView, {
7022
5653
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
7023
5654
  t,
7024
5655
  manifests,
@@ -7520,6 +6151,182 @@ function assembleClientUnits(registry) {
7520
6151
  for (const face of CLIENT_UNITS) registry.register(face);
7521
6152
  }
7522
6153
  //#endregion
6154
+ //#region src/app/layouts/rightbar/registry.ts
6155
+ function createBoardRegistry() {
6156
+ const modules = [];
6157
+ const listeners = /* @__PURE__ */ new Set();
6158
+ let revision = 0;
6159
+ let sorted = [];
6160
+ let index = /* @__PURE__ */ new Map();
6161
+ let steps = /* @__PURE__ */ new Map();
6162
+ function rebuild() {
6163
+ sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
6164
+ index = new Map(sorted.map((module) => [module.id, module]));
6165
+ const table = /* @__PURE__ */ new Map();
6166
+ for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
6167
+ const owner = table.get(kind);
6168
+ if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
6169
+ table.set(kind, module);
6170
+ }
6171
+ steps = table;
6172
+ }
6173
+ function notify() {
6174
+ revision += 1;
6175
+ for (const listener of listeners) listener();
6176
+ }
6177
+ return {
6178
+ register(module) {
6179
+ if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
6180
+ modules.push(module);
6181
+ try {
6182
+ rebuild();
6183
+ } catch (error) {
6184
+ modules.pop();
6185
+ rebuild();
6186
+ throw error;
6187
+ }
6188
+ notify();
6189
+ return () => {
6190
+ const at = modules.indexOf(module);
6191
+ if (at < 0) return;
6192
+ modules.splice(at, 1);
6193
+ rebuild();
6194
+ notify();
6195
+ };
6196
+ },
6197
+ all: () => sorted,
6198
+ byId: (id) => index.get(id),
6199
+ stepOwner: (kind) => steps.get(kind),
6200
+ subscribe(listener) {
6201
+ listeners.add(listener);
6202
+ return () => listeners.delete(listener);
6203
+ },
6204
+ version: () => revision
6205
+ };
6206
+ }
6207
+ //#endregion
6208
+ //#region src/app/units/registry.ts
6209
+ function toBoardModule(face, manifest) {
6210
+ const View = face.card;
6211
+ if (View === void 0) return void 0;
6212
+ return {
6213
+ id: manifest.id,
6214
+ titleKey: manifest.card?.titleKey ?? manifest.id,
6215
+ order: manifest.card?.order ?? 100,
6216
+ View,
6217
+ ...face.steps === void 0 ? {} : { steps: face.steps }
6218
+ };
6219
+ }
6220
+ function createClientUnitRegistry(options = {}) {
6221
+ const registrations = [];
6222
+ const refusals = [];
6223
+ const listeners = /* @__PURE__ */ new Set();
6224
+ const board = createBoardRegistry();
6225
+ let known = /* @__PURE__ */ new Map();
6226
+ let installableIds = null;
6227
+ let revision = 0;
6228
+ let manifestsCache;
6229
+ function notify() {
6230
+ revision += 1;
6231
+ for (const listener of [...listeners]) try {
6232
+ listener();
6233
+ } catch (error) {
6234
+ console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
6235
+ }
6236
+ }
6237
+ function warnRefusal(unit, kind, reasons) {
6238
+ refusals.push({
6239
+ unit,
6240
+ kind,
6241
+ reasons
6242
+ });
6243
+ console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
6244
+ }
6245
+ function takeBackRefusal(unit) {
6246
+ for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
6247
+ }
6248
+ function attach(entry) {
6249
+ const manifest = known.get(entry.unit);
6250
+ if (manifest === void 0) return false;
6251
+ const boardModule = toBoardModule(entry.face, manifest);
6252
+ entry.mounted = {
6253
+ manifest,
6254
+ unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
6255
+ };
6256
+ takeBackRefusal(entry.unit);
6257
+ return true;
6258
+ }
6259
+ function detach(entry) {
6260
+ entry.mounted?.unmount();
6261
+ entry.mounted = null;
6262
+ }
6263
+ return {
6264
+ register(face) {
6265
+ const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
6266
+ if (unit === "") {
6267
+ warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
6268
+ notify();
6269
+ return () => {};
6270
+ }
6271
+ if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
6272
+ const entry = {
6273
+ face,
6274
+ unit,
6275
+ mounted: null
6276
+ };
6277
+ registrations.push(entry);
6278
+ manifestsCache = void 0;
6279
+ if (!attach(entry)) {
6280
+ warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
6281
+ options.onUnknownUnit?.(unit);
6282
+ }
6283
+ notify();
6284
+ return () => {
6285
+ const at = registrations.indexOf(entry);
6286
+ if (at < 0) return;
6287
+ registrations.splice(at, 1);
6288
+ detach(entry);
6289
+ takeBackRefusal(unit);
6290
+ manifestsCache = void 0;
6291
+ notify();
6292
+ };
6293
+ },
6294
+ all: () => registrations.map((entry) => entry.face),
6295
+ manifests: () => {
6296
+ manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
6297
+ return manifestsCache;
6298
+ },
6299
+ refusals: () => refusals,
6300
+ installable: () => installableIds,
6301
+ setManifests(manifests, installable) {
6302
+ known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
6303
+ installableIds = installable === void 0 ? null : new Set(installable);
6304
+ let changed = false;
6305
+ for (const entry of registrations) {
6306
+ const next = known.get(entry.unit);
6307
+ if (entry.mounted === null) {
6308
+ if (next !== void 0 && attach(entry)) changed = true;
6309
+ continue;
6310
+ }
6311
+ if (next === void 0) {
6312
+ detach(entry);
6313
+ warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
6314
+ changed = true;
6315
+ }
6316
+ }
6317
+ if (!changed) return;
6318
+ manifestsCache = void 0;
6319
+ notify();
6320
+ },
6321
+ board,
6322
+ subscribe(listener) {
6323
+ listeners.add(listener);
6324
+ return () => listeners.delete(listener);
6325
+ },
6326
+ version: () => revision
6327
+ };
6328
+ }
6329
+ //#endregion
7523
6330
  //#region src/shared/api/unit-manifests.ts
7524
6331
  var UNIT_MANIFESTS_ROUTE = "unit-manifests";
7525
6332
  //#endregion
@@ -7683,281 +6490,12 @@ function spinnerIcon(size = 14) {
7683
6490
  svg.append(group);
7684
6491
  return svg;
7685
6492
  }
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
6493
  function el(tag, className, text) {
7925
6494
  const node = document.createElement(tag);
7926
6495
  node.className = className;
7927
6496
  if (text !== void 0) node.textContent = text;
7928
6497
  return node;
7929
6498
  }
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
6499
  //#endregion
7962
6500
  //#region src/app/layouts/env-gate/boot-gate.ts
7963
6501
  var POLL_MS = 400;
@@ -7988,9 +6526,9 @@ function createForcePlan() {
7988
6526
  };
7989
6527
  }
7990
6528
  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);
6529
+ const row = el("div", BootGate_module_default.commandRow);
6530
+ const code = el("code", BootGate_module_default.command);
6531
+ const copy = el("button", BootGate_module_default.copy);
7994
6532
  copy.setAttribute("type", "button");
7995
6533
  copy.setAttribute("aria-label", t("env.copyCommand"));
7996
6534
  copy.title = t("env.copyCommand");
@@ -8023,47 +6561,47 @@ function createBootGate(ctx, options = {}) {
8023
6561
  const request = options.request ?? apiGet;
8024
6562
  if (typeof document === "undefined" || typeof document.getElementById !== "function" || document.body === void 0) return { close: () => {} };
8025
6563
  const root = document.getElementById("root");
8026
- const overlay = el$1("div", BootGate_module_default.gate);
6564
+ const overlay = el("div", BootGate_module_default.gate);
8027
6565
  overlay.setAttribute("role", "dialog");
8028
6566
  overlay.setAttribute("aria-modal", "true");
8029
6567
  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);
6568
+ const card = el("div", BootGate_module_default.card);
6569
+ const title = el("h1", BootGate_module_default.title, t("env.title"));
6570
+ const hint = el("p", BootGate_module_default.hint, t("env.checking"));
6571
+ const list = el("ul", BootGate_module_default.steps);
6572
+ const progressRow = el("div", BootGate_module_default.progress);
8035
6573
  progressRow.hidden = true;
8036
- const elapsed = el$1("span", BootGate_module_default.elapsed);
6574
+ const elapsed = el("span", BootGate_module_default.elapsed);
8037
6575
  progressRow.append(elapsed);
8038
- const actions = el$1("div", BootGate_module_default.actions);
6576
+ const actions = el("div", BootGate_module_default.actions);
8039
6577
  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);
6578
+ const fixTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6579
+ const fixWhy = el("p", BootGate_module_default.hint);
6580
+ const fixStep = el("p", BootGate_module_default.hint);
6581
+ const fixAdvice = el("p", BootGate_module_default.hint);
6582
+ const raw = el("details", BootGate_module_default.raw);
6583
+ const rawSummary = el("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
6584
+ const errorBox = el("pre", BootGate_module_default.error);
8047
6585
  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"));
6586
+ const buttons = el("div", BootGate_module_default.buttons);
6587
+ const retry = el("button", BootGate_module_default.button, t("env.retry"));
8050
6588
  retry.setAttribute("type", "button");
8051
6589
  const fixCommand = commandRow(t);
8052
6590
  buttons.append(retry);
8053
6591
  actions.append(fixTitle, fixWhy, fixStep, fixCommand.row, fixAdvice, buttons, raw);
8054
- const bridge = el$1("div", BootGate_module_default.bridge);
6592
+ const bridge = el("div", BootGate_module_default.bridge);
8055
6593
  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);
6594
+ const bridgeTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6595
+ const bridgeWhy = el("p", BootGate_module_default.hint, t("env.bridge.why"));
6596
+ const bridgeLines = el("ul", BootGate_module_default.bridgeLines);
8059
6597
  const bridgeCommand = commandRow(t);
8060
- const bridgeRetry = el$1("button", BootGate_module_default.button, t("env.retry"));
6598
+ const bridgeRetry = el("button", BootGate_module_default.button, t("env.retry"));
8061
6599
  bridgeRetry.setAttribute("type", "button");
8062
- const bridgeButtons = el$1("div", BootGate_module_default.buttons);
6600
+ const bridgeButtons = el("div", BootGate_module_default.buttons);
8063
6601
  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);
6602
+ const bridgeRaw = el("details", BootGate_module_default.raw);
6603
+ const bridgeRawText = el("pre", BootGate_module_default.error);
6604
+ bridgeRaw.append(el("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
8067
6605
  bridge.append(bridgeTitle, bridgeWhy, bridgeLines, bridgeCommand.row, bridgeButtons, bridgeRaw);
8068
6606
  card.append(title, hint, list, progressRow, actions, bridge);
8069
6607
  overlay.append(card);
@@ -8109,16 +6647,16 @@ function createBootGate(ctx, options = {}) {
8109
6647
  function ensureRow(step) {
8110
6648
  const existing = rows.get(step.id);
8111
6649
  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);
6650
+ const item = el("li", BootGate_module_default.step);
6651
+ const mark = el("span", BootGate_module_default.mark);
8114
6652
  mark.setAttribute("aria-hidden", "true");
8115
6653
  const row = {
8116
6654
  item,
8117
6655
  mark,
8118
- detail: el$1("span", BootGate_module_default.detail),
6656
+ detail: el("span", BootGate_module_default.detail),
8119
6657
  status: ""
8120
6658
  };
8121
- item.append(mark, el$1("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
6659
+ item.append(mark, el("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
8122
6660
  rows.set(step.id, row);
8123
6661
  return row;
8124
6662
  }
@@ -8165,7 +6703,7 @@ function createBootGate(ctx, options = {}) {
8165
6703
  if (bridgeBroken && bridgeStep !== void 0) {
8166
6704
  bridgeLines.replaceChildren(...(snapshot.bridgeIssues ?? ["unknown"]).map((issue) => {
8167
6705
  const advice = bridgeAdvice(issue);
8168
- const item = el$1("li", BootGate_module_default.bridgeLine, t(advice.textKey));
6706
+ const item = el("li", BootGate_module_default.bridgeLine, t(advice.textKey));
8169
6707
  if (advice.link !== void 0) {
8170
6708
  const link = document.createElement("a");
8171
6709
  link.className = BootGate_module_default.link;
@@ -8214,8 +6752,9 @@ function createBootGate(ctx, options = {}) {
8214
6752
  }
8215
6753
  retry.addEventListener("click", retryNow);
8216
6754
  bridgeRetry.addEventListener("click", retryNow);
8217
- if (mockModeOn(typeof window === "undefined" ? "" : window.location?.search ?? "")) {
8218
- const strip = mountGateMockStrip({ onPick: (snapshot) => {
6755
+ const search = typeof window === "undefined" ? "" : window.location?.search ?? "";
6756
+ if (devSurface.on(search)) {
6757
+ const strip = devSurface.gateStrip({ onPick: (snapshot) => {
8219
6758
  pinned = snapshot;
8220
6759
  if (snapshot !== null) {
8221
6760
  render(snapshot);
@@ -8223,7 +6762,7 @@ function createBootGate(ctx, options = {}) {
8223
6762
  }
8224
6763
  poll();
8225
6764
  } });
8226
- overlay.append(strip);
6765
+ if (strip !== null) overlay.append(strip);
8227
6766
  }
8228
6767
  poll();
8229
6768
  return { close };
@@ -8558,18 +7097,6 @@ function BoardEmpty({ t, onBuildModule, onOpenModules, onOpenMarket }) {
8558
7097
  }, t("panels.browseMarket")))
8559
7098
  });
8560
7099
  }
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
7100
  var ModulesPage_module_default = {
8574
7101
  trigger: "_trigger_15ptp_1",
8575
7102
  pop: "_pop_15ptp_6",
@@ -8596,250 +7123,6 @@ var ModulesPage_module_default = {
8596
7123
  groupTitle: "_groupTitle_15ptp_191"
8597
7124
  };
8598
7125
  //#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
7126
  //#region src/app/layouts/rightbar/board-selection.ts
8844
7127
  function available(capability) {
8845
7128
  if (capability === void 0) return true;
@@ -9215,13 +7498,9 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
9215
7498
  forceProbe
9216
7499
  ]);
9217
7500
  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;
7501
+ const devPanel = devSurface.useStrips("panel", manifests);
7502
+ const panelMock = devPanel.current;
7503
+ const mockNonce = devPanel.pick.nonce;
9225
7504
  useDismissOnOutsidePointer(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
9226
7505
  const units = enabledUnits?.units ?? [];
9227
7506
  return /* @__PURE__ */ h("div", {
@@ -9240,20 +7519,16 @@ function PanelModules({ t, open, onOpenChange, enabledUnits, workspace, refreshT
9240
7519
  className: ModulesPage_module_default.pop,
9241
7520
  role: "dialog",
9242
7521
  "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, {
7522
+ }, /* @__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
7523
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
9249
7524
  t,
9250
7525
  units: panelMock?.units ?? units,
9251
7526
  plugins: panelMock?.plugins ?? enabledUnits?.plugins ?? [],
9252
- capabilities: panelMock === void 0 ? fixturePick.enabled ? null : capabilities : panelMock.capabilities,
7527
+ capabilities: panelMock === void 0 ? devPanel.enabled ? null : capabilities : panelMock.capabilities,
9253
7528
  loading: enabledUnits === null,
9254
7529
  own: enabledUnits?.own === true,
9255
7530
  onOpenMarket,
9256
- mocked: fixturePick.enabled,
7531
+ mocked: devPanel.enabled,
9257
7532
  workspace,
9258
7533
  mock: panelMock
9259
7534
  })) : null);
@@ -9274,589 +7549,6 @@ function boardColumnsOf(items, twoColumns) {
9274
7549
  return splitBoardColumns(items);
9275
7550
  }
9276
7551
  //#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
7552
  //#region src/app/layouts/rightbar/board-plan.ts
9861
7553
  function planBoard(shape, real, all) {
9862
7554
  if (shape.kind === "real") return {
@@ -9880,15 +7572,18 @@ function planBoard(shape, real, all) {
9880
7572
  reading: true,
9881
7573
  repeated: false
9882
7574
  };
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
- };
7575
+ if (shape.kind === "kit") {
7576
+ const kit = devSurface.kitModule;
7577
+ return {
7578
+ modules: kit === null ? [] : [{
7579
+ key: kit.id,
7580
+ module: kit
7581
+ }],
7582
+ empty: false,
7583
+ reading: false,
7584
+ repeated: false
7585
+ };
7586
+ }
9892
7587
  if (shape.kind === "all") return {
9893
7588
  modules: all.map((module) => ({
9894
7589
  key: module.id,
@@ -10068,12 +7763,16 @@ function Rightbar(props) {
10068
7763
  const panelBoard = useEnabledUnits(panelToken, boardWorkspace);
10069
7764
  const enabledUnits = panelBoard?.units ?? null;
10070
7765
  const [modulesOpen, setModulesOpen] = useState(false);
10071
- const fixtures = useBoardMock(fixtureRoster(manifests));
7766
+ const devBoard = devSurface.useBoard({
7767
+ manifests,
7768
+ all: modules.all(),
7769
+ search: window.location.search
7770
+ });
10072
7771
  const visibleModules = selectBoardModules(enabledUnits, (id) => modules.byId(id), capabilities);
10073
- const plan = planBoard(fixtures.shape, {
7772
+ const plan = planBoard(devBoard.shape, {
10074
7773
  modules: visibleModules,
10075
7774
  configRead: panelBoard !== null
10076
- }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
7775
+ }, devBoard.seed);
10077
7776
  const world = createSuiteWorld({
10078
7777
  workspaces,
10079
7778
  sessions,
@@ -10095,7 +7794,7 @@ function Rightbar(props) {
10095
7794
  reason
10096
7795
  });
10097
7796
  }, []);
10098
- const fixtureMode = mockModeOn(window.location.search) || crashModeOn(window.location.search);
7797
+ const fixtureMode = devBoard.mode;
10099
7798
  useEffect(() => {
10100
7799
  setPanelWorkspace(fixtureMode ? null : boardWorkspace);
10101
7800
  }, [boardWorkspace, fixtureMode]);
@@ -10149,10 +7848,7 @@ function Rightbar(props) {
10149
7848
  refreshToken: panelToken,
10150
7849
  onOpenMarket: openMarket,
10151
7850
  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, {
7851
+ }), devBoard.strip(top.kind === "board"), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-panelMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
10156
7852
  top,
10157
7853
  plan,
10158
7854
  world,
@@ -10953,7 +8649,7 @@ var sidebar_app_default = ".wb-wsSection {\n position: relative;\n flex: none;
10953
8649
  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
8650
  //#endregion
10955
8651
  //#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 }}";
8652
+ 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
8653
  //#endregion
10958
8654
  //#region src/shared/styles/board.css?raw
10959
8655
  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 +8869,9 @@ var kit = {
11173
8869
  hooks: {
11174
8870
  ...use_api_resource_exports,
11175
8871
  ...use_card_summary_exports,
11176
- ...use_fixture_pick_exports,
11177
8872
  ...use_facts_exports,
11178
8873
  ...use_host_write_exports,
11179
8874
  ...use_long_task_exports,
11180
- ...mock_mode_exports,
11181
8875
  ...use_capability_gate_exports,
11182
8876
  ...use_unit_board_exports,
11183
8877
  ...use_visible_busy_exports
@@ -11192,7 +8886,6 @@ var kit = {
11192
8886
  ...dist_exports,
11193
8887
  ...dist_exports,
11194
8888
  ...dist_exports,
11195
- ...dist_exports,
11196
8889
  Tip
11197
8890
  },
11198
8891
  api: {
@@ -11210,7 +8903,7 @@ function messagesOf(units) {
11210
8903
  ...face.messages === void 0 ? {} : { messages: face.messages }
11211
8904
  }));
11212
8905
  }
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*/";
8906
+ 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-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._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
8907
  function workbenchCss() {
11215
8908
  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
8909
  }