@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.
package/client.js CHANGED
@@ -1030,20 +1030,6 @@ window.__ModuleLoader__.load({
1030
1030
  }))));
1031
1031
  }
1032
1032
  //#endregion
1033
- //#region ../shared/dist/components/MockStrip.js
1034
- function MockStrip({ mocks, index, onPick, note, real }) {
1035
- return h("div", { className: "wb-mockStrip" }, h("span", { className: "wb-mockNote" }, note ?? "夹具:只切状态,不发请求"), real === void 0 ? null : h("button", {
1036
- type: "button",
1037
- className: `wb-mockChip${real.active ? " wb-mockChipOn" : ""}`,
1038
- onClick: real.onPick
1039
- }, real.label), mocks.map((mock, at) => h("button", {
1040
- key: mock.id,
1041
- type: "button",
1042
- className: `wb-mockChip${at === index ? " wb-mockChipOn" : ""}`,
1043
- onClick: () => onPick(at)
1044
- }, mock.label)));
1045
- }
1046
- //#endregion
1047
1033
  //#region ../shared/dist/components/ResourceStates.js
1048
1034
  function SkeletonRows({ rows = 4 }) {
1049
1035
  return h("div", {
@@ -2796,7 +2782,6 @@ window.__ModuleLoader__.load({
2796
2782
  Link: () => Link,
2797
2783
  LongTaskRow: () => LongTaskRow,
2798
2784
  MIN_BUSY_MS: () => 500,
2799
- MockStrip: () => MockStrip,
2800
2785
  Note: () => Note,
2801
2786
  OPENCLI_MAX_CONCURRENT: () => 4,
2802
2787
  OPENCLI_PIN: () => OPENCLI_PIN,
@@ -3025,10 +3010,10 @@ window.__ModuleLoader__.load({
3025
3010
  function markNextProbeSilent() {
3026
3011
  silentNextProbe = true;
3027
3012
  }
3028
- var probe$2 = NO_PROBE;
3013
+ var probe = NO_PROBE;
3029
3014
  var probeListeners = /* @__PURE__ */ new Set();
3030
3015
  function probeValue() {
3031
- return probe$2;
3016
+ return probe;
3032
3017
  }
3033
3018
  function subscribeProbe(listener) {
3034
3019
  probeListeners.add(listener);
@@ -3037,8 +3022,8 @@ window.__ModuleLoader__.load({
3037
3022
  };
3038
3023
  }
3039
3024
  function setProbe(next) {
3040
- if (next === probe$2) return;
3041
- probe$2 = next;
3025
+ if (next === probe) return;
3026
+ probe = next;
3042
3027
  for (const listener of [...probeListeners]) listener();
3043
3028
  }
3044
3029
  var CAPABILITY_FACT = "capability";
@@ -3057,7 +3042,7 @@ window.__ModuleLoader__.load({
3057
3042
  function setCapabilities(next, rechecked = false) {
3058
3043
  if (next === null) setProbe(NO_PROBE);
3059
3044
  else if (rechecked) setProbe({
3060
- ...probe$2,
3045
+ ...probe,
3061
3046
  checkedAt: Date.now()
3062
3047
  });
3063
3048
  if (next === current$1) return;
@@ -3065,15 +3050,15 @@ window.__ModuleLoader__.load({
3065
3050
  for (const listener of [...listeners$3]) listener();
3066
3051
  }
3067
3052
  function beginProbe() {
3068
- if (probe$2.checking) return;
3053
+ if (probe.checking) return;
3069
3054
  setProbe({
3070
- ...probe$2,
3055
+ ...probe,
3071
3056
  checking: true
3072
3057
  });
3073
3058
  }
3074
3059
  function endProbe() {
3075
3060
  setProbe({
3076
- ...probe$2,
3061
+ ...probe,
3077
3062
  checking: false
3078
3063
  });
3079
3064
  }
@@ -3169,41 +3154,34 @@ window.__ModuleLoader__.load({
3169
3154
  };
3170
3155
  }
3171
3156
  //#endregion
3172
- //#region src/shared/hooks/mock-mode.ts
3173
- var mock_mode_exports = /* @__PURE__ */ __exportAll({
3174
- crashModeOn: () => crashModeOn,
3175
- mockModeOn: () => mockModeOn
3176
- });
3177
- function mockModeOn(search) {
3178
- return /(?:^|[?&])(?:wbMock|wbMarketMock)=1(?:&|$)/.test(search);
3179
- }
3180
- function crashModeOn(search) {
3181
- return /(?:^|[?&])wbCrash=1(?:&|$)/.test(search);
3182
- }
3183
- //#endregion
3184
- //#region src/shared/hooks/use-fixture-pick.ts
3185
- var use_fixture_pick_exports = /* @__PURE__ */ __exportAll({ useFixturePick: () => useFixturePick });
3186
- function useFixturePick(options) {
3187
- const controlled = options.selected !== void 0 || options.onSelect !== void 0;
3188
- const [ownActive, setOwnActive] = useState(options.initial ?? null);
3189
- const [nonce, setNonce] = useState(0);
3190
- const [on] = useState(() => mockModeOn(window.location.search));
3191
- const enabled = options.enabled ?? on;
3192
- const active = controlled ? options.selected ?? null : ownActive;
3193
- const pick = useCallback((id) => {
3194
- if (!controlled) setOwnActive(id);
3195
- options.onSelect?.(id);
3196
- setNonce((value) => value + 1);
3197
- }, [controlled, options]);
3198
- return {
3199
- enabled,
3200
- active,
3201
- current: options.fixtures.find((fixture) => fixture.id === active),
3202
- pick,
3203
- nonce,
3204
- index: options.fixtures.findIndex((fixture) => fixture.id === active)
3205
- };
3206
- }
3157
+ //#region src/dev/surface.stub.ts
3158
+ var noop = () => void 0;
3159
+ var devSurface = {
3160
+ on: () => false,
3161
+ crash: () => false,
3162
+ useBoard: ({ all }) => ({
3163
+ shape: { kind: "real" },
3164
+ seed: all,
3165
+ strip: () => null,
3166
+ mode: false
3167
+ }),
3168
+ useStrips: () => ({
3169
+ pick: {
3170
+ enabled: false,
3171
+ active: null,
3172
+ current: void 0,
3173
+ nonce: 0,
3174
+ index: 0,
3175
+ pick: noop
3176
+ },
3177
+ current: void 0,
3178
+ enabled: false,
3179
+ strip: null
3180
+ }),
3181
+ addModuleState: (base) => base,
3182
+ gateStrip: () => null,
3183
+ kitModule: null
3184
+ };
3207
3185
  //#endregion
3208
3186
  //#region src/app/layouts/panel-hint.ts
3209
3187
  var hints = /* @__PURE__ */ new Map();
@@ -3239,1101 +3217,49 @@ window.__ModuleLoader__.load({
3239
3217
  function marketSettled(freshness, installedRead) {
3240
3218
  return freshness.loaded && installedRead !== false;
3241
3219
  }
3242
- function shouldProbeOnEnter(input) {
3243
- if (input.checkedAt === null) return true;
3244
- return input.now - input.checkedAt >= input.staleMs;
3245
- }
3246
- //#endregion
3247
- //#region src/app/layouts/rightbar/market-settle.ts
3248
- var MODULE_SETTLE_MS = 15e3;
3249
- function holdBack(installed, roster, active, previous) {
3250
- const pending = installed.filter((unit) => !roster.has(unit));
3251
- const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
3252
- return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
3253
- }
3254
- var WORKBENCH_SWAP_MS = 18e4;
3255
- function swapLanded(until, installed) {
3256
- return until !== void 0 && installed === until;
3257
- }
3258
- function swapUntil(action, application, latest) {
3259
- if (action !== "update-workbench" || application !== "restart-required") return void 0;
3260
- return latest;
3261
- }
3262
- var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
3263
- function awaitsReadBack(action, application, version) {
3264
- return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
3265
- }
3266
- function readBackDone(input) {
3267
- if (input.action === "update") return !input.outdated;
3268
- if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
3269
- if (input.entry.latest === input.entry.installed) return true;
3270
- if (input.clicked === void 0) return true;
3271
- return input.entry.installed !== input.clicked;
3272
- }
3273
- function settleLanded(input) {
3274
- if (input.until !== void 0) return swapLanded(input.until, input.installed);
3275
- if (input.readBack !== true) return true;
3276
- return readBackDone({
3277
- action: input.action,
3278
- entry: input.entry,
3279
- clicked: input.clicked,
3280
- outdated: input.outdated
3281
- });
3282
- }
3283
- function holdWindowMs(until) {
3284
- return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
3285
- }
3286
- //#endregion
3287
- //#region src/app/layouts/rightbar/market-installed-mock.ts
3288
- function installedMocks(input) {
3289
- const { id, found, mine, probe } = input;
3290
- return [
3291
- {
3292
- id: "no-supply",
3293
- label: "没有环境依赖的模块(供给是基座命令那种):市场里有它这一行",
3294
- manifests: [found],
3295
- capabilities: probe(id, "ok"),
3296
- installed: [{
3297
- unit: id,
3298
- pkg: "@dsh-workbench/module-one",
3299
- installed: "0.1.2"
3300
- }],
3301
- expect: {
3302
- rows: 1,
3303
- state: "installed",
3304
- actions: ["uninstall"],
3305
- installed: 0,
3306
- shared: 0
3307
- }
3308
- },
3309
- {
3310
- id: "no-card",
3311
- label: "没有卡片的模块(只有基座命令那种):市场里有它这一行,有版本、有「更新」",
3312
- manifests: [{
3313
- ...found,
3314
- card: null
3315
- }],
3316
- capabilities: probe(id, "ok"),
3317
- updates: { [id]: {
3318
- installed: "0.1.2",
3319
- latest: "0.2.0"
3320
- } },
3321
- installed: [{
3322
- unit: id,
3323
- pkg: "@dsh-workbench/module-one",
3324
- installed: "0.1.2"
3325
- }],
3326
- expect: {
3327
- rows: 1,
3328
- state: "outdated",
3329
- actions: ["update-bundle", "uninstall"],
3330
- version: {
3331
- installed: "0.1.2",
3332
- latest: "0.2.0"
3333
- },
3334
- installed: 0,
3335
- shared: 0
3336
- }
3337
- },
3338
- {
3339
- id: "no-env-installed",
3340
- label: "本机装着、又没有依赖要探(DIY 本地那份那种):写「已安装」,不是「状态未知」",
3341
- manifests: [{
3342
- ...found,
3343
- env: void 0
3344
- }],
3345
- capabilities: {},
3346
- updates: { [id]: { installed: "0.1.2" } },
3347
- installed: [{
3348
- unit: id,
3349
- pkg: "@dsh-workbench/module-one",
3350
- installed: "0.1.2"
3351
- }],
3352
- expect: {
3353
- rows: 1,
3354
- state: "installed",
3355
- actions: ["uninstall"],
3356
- version: { installed: "0.1.2" },
3357
- installed: 0
3358
- }
3359
- },
3360
- {
3361
- id: "local-no-update",
3362
- label: "本机那份(link: 装的):有「本地」标记、不给「更新」",
3363
- manifests: [mine],
3364
- capabilities: probe(id, "ok", { plugins: [{
3365
- name: "fixture",
3366
- status: "ok",
3367
- missing: []
3368
- }] }),
3369
- updates: { [id]: {
3370
- installed: "0.1.0",
3371
- local: true
3372
- } },
3373
- installed: [{
3374
- unit: id,
3375
- pkg: "@dsh-workbench/module-one",
3376
- installed: "0.1.0",
3377
- local: true
3378
- }],
3379
- expect: {
3380
- rows: 1,
3381
- state: "installed",
3382
- actions: ["uninstall"],
3383
- local: true,
3384
- version: { installed: "0.1.0" },
3385
- installed: 0
3386
- }
3387
- },
3388
- {
3389
- id: "installed-refused",
3390
- label: "本机装了,但宿主不认它的声明(行上说得出理由)",
3391
- manifests: [],
3392
- capabilities: {},
3393
- installed: [{
3394
- unit: id,
3395
- pkg: "@dsh-workbench/module-one",
3396
- installed: "0.1.2",
3397
- refused: ["dsh.workbench 缺 apiVersion —— 协议从 v1 起,写 \"apiVersion\": 1"]
3398
- }],
3399
- expect: {
3400
- rows: 0,
3401
- installed: 1,
3402
- installedState: "unusable",
3403
- installedActions: ["remove-bundle"],
3404
- installedNote: true
3405
- }
3406
- },
3407
- {
3408
- id: "installed-pending",
3409
- label: "本机装了、宿主还没加载它(重启一次就会出来)",
3410
- manifests: [],
3411
- capabilities: {},
3412
- installed: [{
3413
- unit: id,
3414
- pkg: "@dsh-workbench/module-one",
3415
- installed: "0.1.2"
3416
- }],
3417
- expect: {
3418
- rows: 0,
3419
- installed: 1,
3420
- installedState: "inactive",
3421
- installedActions: ["remove-bundle"],
3422
- installedHint: "panels.market.moduleRestartHint"
3423
- }
3424
- },
3425
- {
3426
- id: "installed-pending-update",
3427
- label: "本机装了、还没加载 + 源上有新版(给「更新」,也说明要重启)",
3428
- manifests: [],
3429
- capabilities: {},
3430
- installed: [{
3431
- unit: id,
3432
- pkg: "@dsh-workbench/module-one",
3433
- installed: "0.1.0",
3434
- latest: "0.1.2"
3435
- }],
3436
- expect: {
3437
- rows: 0,
3438
- installed: 1,
3439
- installedState: "outdated",
3440
- installedActions: ["update-bundle", "remove-bundle"],
3441
- installedHint: "panels.market.moduleRestartHint"
3442
- }
3443
- },
3444
- {
3445
- id: "installed-confirm",
3446
- label: "卸载本机模块(还没加载的那种:Modal 确认,标题是包名)",
3447
- manifests: [],
3448
- capabilities: {},
3449
- installed: [{
3450
- unit: id,
3451
- pkg: "@dsh-workbench/module-one",
3452
- installed: "0.1.2"
3453
- }],
3454
- confirming: id,
3455
- expect: {
3456
- rows: 0,
3457
- installed: 1,
3458
- installedState: "inactive",
3459
- installedActions: ["remove-bundle"]
3460
- }
3461
- },
3462
- {
3463
- id: "first-paint",
3464
- label: "刚进页面(检测中:能力与本机清单都还没结论)",
3465
- manifests: [mine],
3466
- capabilities: null,
3467
- installedRead: false,
3468
- loaded: false,
3469
- expect: {
3470
- rows: 1,
3471
- state: "checking",
3472
- actions: []
3473
- }
3474
- }
3475
- ];
3476
- }
3477
- //#endregion
3478
- //#region src/app/layouts/rightbar/market-mock.ts
3479
- function installable(manifest) {
3480
- return {
3481
- ...manifest,
3482
- env: {
3483
- command: "opencli",
3484
- plugins: [{
3485
- name: "fixture",
3486
- commands: ["x"]
3487
- }]
3488
- }
3489
- };
3490
- }
3491
- function withEnvSource(manifest, env) {
3492
- const [first, ...rest] = manifest.env?.plugins ?? [];
3493
- if (first === void 0) return manifest;
3494
- return {
3495
- ...manifest,
3496
- env: {
3497
- ...manifest.env,
3498
- plugins: [{
3499
- ...first,
3500
- installSource: {
3501
- kind: "local",
3502
- env
3503
- }
3504
- }, ...rest]
3505
- }
3506
- };
3507
- }
3508
- function withSecondNeed(manifest) {
3509
- return {
3510
- ...manifest,
3511
- env: {
3512
- ...manifest.env,
3513
- plugins: [...manifest.env?.plugins ?? [], {
3514
- name: "fixture-second",
3515
- commands: ["y"]
3516
- }]
3517
- }
3518
- };
3519
- }
3520
- function twin(manifest) {
3521
- return {
3522
- ...manifest,
3523
- id: `${manifest.id}-b`
3524
- };
3525
- }
3526
- function copies(manifest, count) {
3527
- return Array.from({ length: count }, (_, index) => ({
3528
- ...manifest,
3529
- id: `${manifest.id}-${index}`,
3530
- env: {
3531
- ...manifest.env,
3532
- plugins: [{
3533
- name: `fixture-${index}`,
3534
- commands: manifest.env?.plugins?.[0]?.commands ?? []
3535
- }]
3536
- }
3537
- }));
3538
- }
3539
- function probe$1(unit, status, extra = {}) {
3540
- return { [unit]: {
3541
- unit,
3542
- status,
3543
- required: ["x"],
3544
- missing: [],
3545
- detail: "夹具",
3546
- ...extra
3547
- } };
3548
- }
3549
- function buildMarketMocks(roster) {
3550
- const found = roster.find((manifest) => manifest.card !== null);
3551
- if (found === void 0) return [{
3552
- id: "empty",
3553
- label: "市场空态",
3554
- manifests: [],
3555
- capabilities: {},
3556
- expect: { rows: 0 }
3557
- }];
3558
- const mine = installable(found);
3559
- const second = twin(mine);
3560
- const id = mine.id;
3561
- const secondId = second.id;
3562
- return [
3563
- {
3564
- id: "installed",
3565
- label: "已装",
3566
- manifests: [mine],
3567
- capabilities: probe$1(id, "ok", { plugins: [{
3568
- name: "fixture",
3569
- status: "ok",
3570
- missing: []
3571
- }] }),
3572
- expect: {
3573
- rows: 1,
3574
- state: "installed",
3575
- actions: ["uninstall"],
3576
- shared: 1,
3577
- sharedActions: []
3578
- }
3579
- },
3580
- {
3581
- id: "outdated",
3582
- label: "要更新",
3583
- manifests: [mine],
3584
- capabilities: probe$1(id, "missing-commands", { missing: ["x"] }),
3585
- expect: {
3586
- rows: 1,
3587
- state: "outdated",
3588
- actions: ["update", "uninstall"],
3589
- noteKey: "panels.market.needCommands"
3590
- }
3591
- },
3592
- {
3593
- id: "module-update",
3594
- label: "模块包有新版(行上给「更新」,装了要重启)",
3595
- manifests: [mine],
3596
- capabilities: probe$1(id, "ok", { plugins: [{
3597
- name: "fixture",
3598
- status: "ok",
3599
- missing: []
3600
- }] }),
3601
- updates: { [id]: {
3602
- installed: "0.1.2",
3603
- latest: "0.2.0"
3604
- } },
3605
- expect: {
3606
- rows: 1,
3607
- state: "outdated",
3608
- actions: ["update-bundle", "uninstall"],
3609
- shared: 1,
3610
- sharedActions: []
3611
- }
3612
- },
3613
- {
3614
- id: "outdated-release",
3615
- label: "源上有新版(模块行不变,共用依赖行给「更新」)",
3616
- manifests: [mine],
3617
- capabilities: probe$1(id, "ok", { plugins: [{
3618
- name: "fixture",
3619
- status: "outdated",
3620
- missing: [],
3621
- release: {
3622
- installed: "1.0.16",
3623
- latest: "1.0.17"
3624
- }
3625
- }] }),
3626
- expect: {
3627
- rows: 1,
3628
- state: "installed",
3629
- actions: ["uninstall"],
3630
- shared: 1,
3631
- sharedActions: ["update-dependency"]
3632
- }
3633
- },
3634
- {
3635
- id: "missing",
3636
- label: "未装(可装)",
3637
- manifests: [mine],
3638
- capabilities: probe$1(id, "missing-plugin", {
3639
- install: "ready",
3640
- plugins: [{
3641
- name: "fixture",
3642
- status: "missing",
3643
- missing: ["x"],
3644
- install: "ready"
3645
- }]
3646
- }),
3647
- expect: {
3648
- rows: 1,
3649
- state: "missing",
3650
- actions: ["install"],
3651
- shared: 1,
3652
- sharedActions: []
3653
- }
3654
- },
3655
- {
3656
- id: "missing-env",
3657
- label: "未装 + 要先设环境变量",
3658
- manifests: [withEnvSource(mine, "WB_FIXTURE_HOME")],
3659
- capabilities: probe$1(id, "missing-plugin", { install: "env-missing" }),
3660
- expect: {
3661
- rows: 1,
3662
- state: "missing",
3663
- actions: []
3664
- }
3665
- },
3666
- {
3667
- id: "missing-undeclared",
3668
- label: "未装 + 没声明怎么装",
3669
- manifests: [mine],
3670
- capabilities: probe$1(id, "missing-plugin", { install: "not-declared" }),
3671
- expect: {
3672
- rows: 1,
3673
- state: "missing",
3674
- actions: []
3675
- }
3676
- },
3677
- {
3678
- id: "unknown",
3679
- label: "探测失败(状态未知)",
3680
- manifests: [mine],
3681
- capabilities: {},
3682
- expect: {
3683
- rows: 1,
3684
- state: "unknown",
3685
- actions: []
3686
- }
3687
- },
3688
- {
3689
- id: "checking",
3690
- label: "检测中",
3691
- manifests: [mine],
3692
- capabilities: null,
3693
- expect: {
3694
- rows: 1,
3695
- state: "checking",
3696
- actions: []
3697
- }
3698
- },
3699
- {
3700
- id: "shared",
3701
- label: "两个模块(第二行是复制的)",
3702
- manifests: [mine, second],
3703
- capabilities: {
3704
- ...probe$1(id, "ok"),
3705
- ...probe$1(secondId, "ok")
3706
- },
3707
- expect: {
3708
- rows: 2,
3709
- state: "installed",
3710
- actions: ["uninstall"],
3711
- shared: 1
3712
- }
3713
- },
3714
- {
3715
- id: "busy",
3716
- label: "正在装",
3717
- manifests: [mine],
3718
- capabilities: probe$1(id, "missing-plugin", { install: "ready" }),
3719
- pending: {
3720
- id,
3721
- action: "install"
3722
- },
3723
- expect: {
3724
- rows: 1,
3725
- state: "missing",
3726
- actions: ["install"]
3727
- }
3728
- },
3729
- {
3730
- id: "confirm",
3731
- label: "等确认卸载",
3732
- manifests: [mine],
3733
- capabilities: probe$1(id, "ok"),
3734
- confirming: id,
3735
- expect: {
3736
- rows: 1,
3737
- state: "installed",
3738
- actions: ["uninstall"]
3739
- }
3740
- },
3741
- {
3742
- id: "failed",
3743
- label: "失败(红字贴行)",
3744
- manifests: [mine],
3745
- capabilities: probe$1(id, "ok"),
3746
- failure: {
3747
- id,
3748
- message: "没成功:命令失败(退出码 1):夹具里的一条失败原因"
3749
- },
3750
- expect: {
3751
- rows: 1,
3752
- state: "installed",
3753
- actions: ["uninstall"]
3754
- }
3755
- },
3756
- {
3757
- id: "long-title",
3758
- label: "超长模块名",
3759
- manifests: [{
3760
- ...mine,
3761
- card: {
3762
- titleKey: "一个名字特别特别长的模块用来验证省略号会不会把按钮挤下去",
3763
- order: 10
3764
- }
3765
- }],
3766
- capabilities: probe$1(id, "ok"),
3767
- expect: {
3768
- rows: 1,
3769
- state: "installed",
3770
- actions: ["uninstall"],
3771
- titleChars: 25
3772
- }
3773
- },
3774
- {
3775
- id: "long-env",
3776
- label: "超长环境变量名",
3777
- manifests: [withEnvSource(mine, "DSH_WORKBENCH_SOMETHING_VERY_LONG_ENV_NAME_FOR_THE_MODULE")],
3778
- capabilities: probe$1(id, "missing-plugin", { install: "env-missing" }),
3779
- expect: {
3780
- rows: 1,
3781
- state: "missing",
3782
- actions: []
3783
- }
3784
- },
3785
- {
3786
- id: "long-error",
3787
- label: "超长错误信息",
3788
- manifests: [mine],
3789
- capabilities: probe$1(id, "ok"),
3790
- failure: {
3791
- id,
3792
- 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'"
3793
- },
3794
- expect: {
3795
- rows: 1,
3796
- state: "installed",
3797
- actions: ["uninstall"]
3798
- }
3799
- },
3800
- {
3801
- id: "two-deps",
3802
- label: "两份依赖(只装缺的)",
3803
- manifests: [withSecondNeed(mine)],
3804
- capabilities: probe$1(id, "missing-plugin", {
3805
- install: "ready",
3806
- plugins: [{
3807
- name: "fixture",
3808
- status: "ok",
3809
- missing: []
3810
- }, {
3811
- name: "fixture-second",
3812
- status: "missing",
3813
- missing: ["y"],
3814
- install: "ready"
3815
- }]
3816
- }),
3817
- expect: {
3818
- rows: 1,
3819
- state: "missing",
3820
- actions: ["install"]
3821
- }
3822
- },
3823
- {
3824
- id: "many",
3825
- label: "很多行(要滚)",
3826
- manifests: [mine, ...copies(mine, 13)],
3827
- capabilities: Object.fromEntries([id, ...copies(mine, 13).map((item) => item.id)].map((unit) => [unit, probe$1(unit, "ok")[unit]])),
3828
- expect: {
3829
- rows: 14,
3830
- state: "installed",
3831
- actions: ["uninstall"]
3832
- }
3833
- },
3834
- ...installedMocks({
3835
- id,
3836
- found,
3837
- mine,
3838
- probe: probe$1
3839
- }),
3840
- {
3841
- id: "shared-many",
3842
- label: "三个模块(同一份安装)",
3843
- manifests: [
3844
- mine,
3845
- twin(mine),
3846
- {
3847
- ...twin(mine),
3848
- id: `${mine.id}-c`
3849
- }
3850
- ],
3851
- capabilities: {
3852
- ...probe$1(id, "ok"),
3853
- ...probe$1(secondId, "ok"),
3854
- ...probe$1(`${mine.id}-c`, "ok")
3855
- },
3856
- expect: {
3857
- rows: 3,
3858
- state: "installed",
3859
- actions: ["uninstall"]
3860
- }
3861
- },
3862
- {
3863
- id: "plugin-outdated",
3864
- label: "用户装的 opencli 插件:有新版(给更新 / 卸载)",
3865
- manifests: [],
3866
- capabilities: {},
3867
- plugins: [{
3868
- pkg: "opencli-plugin-cmdb",
3869
- name: "cmdb",
3870
- installed: "1.0.24",
3871
- latest: "1.0.25"
3872
- }],
3873
- expect: {
3874
- rows: 0,
3875
- plugins: 1,
3876
- pluginActions: ["update-plugin", "uninstall-plugin"]
3877
- }
3878
- },
3879
- {
3880
- id: "plugin-local",
3881
- label: "本地目录装的 opencli 插件:没有版本源,只给卸载",
3882
- manifests: [],
3883
- capabilities: {},
3884
- plugins: [{
3885
- pkg: "/Users/me/my-local-plugin",
3886
- name: "my-local-plugin",
3887
- local: true
3888
- }],
3889
- expect: {
3890
- rows: 0,
3891
- plugins: 1,
3892
- pluginActions: ["uninstall-plugin"],
3893
- pluginNote: false
3894
- }
3895
- },
3896
- {
3897
- id: "plugin-alias",
3898
- label: "插件名 ≠ 包名:行上两个都写出来(更新 / 卸载按包名)",
3899
- manifests: [],
3900
- capabilities: {},
3901
- plugins: [{
3902
- pkg: "opencli-plugin-cmdb",
3903
- name: "cmdb",
3904
- installed: "1.0.24",
3905
- latest: "1.0.25"
3906
- }],
3907
- expect: {
3908
- rows: 0,
3909
- plugins: 1,
3910
- pluginActions: ["update-plugin", "uninstall-plugin"]
3911
- }
3912
- },
3913
- {
3914
- id: "plugin-broken",
3915
- label: "装坏了的那一份(目录在但看不出是个插件):行上直说,给卸载与指路",
3916
- manifests: [],
3917
- capabilities: {},
3918
- plugins: [{
3919
- pkg: "opencli-plugin-cmdb",
3920
- name: "cmdb",
3921
- installed: "1.0.24",
3922
- broken: true
3923
- }],
3924
- expect: {
3925
- rows: 0,
3926
- plugins: 1,
3927
- pluginState: "broken",
3928
- pluginActions: ["uninstall-plugin"],
3929
- pluginNoteKey: "panels.market.pluginBroken"
3930
- }
3931
- },
3932
- {
3933
- id: "plugin-kept",
3934
- label: "卸掉用户装的插件,但还有模块在用:文件先留着(行上给一句为什么)",
3935
- manifests: [],
3936
- capabilities: {},
3937
- plugins: [{
3938
- pkg: "opencli-plugin-cmdb",
3939
- name: "cmdb",
3940
- installed: "1.0.24"
3941
- }],
3942
- notice: "文件先留着:cmdb、argocd 还要用它。",
3943
- expect: {
3944
- rows: 0,
3945
- plugins: 1,
3946
- pluginActions: ["uninstall-plugin"],
3947
- notice: true
3948
- }
3949
- },
3950
- {
3951
- id: "workbench-update",
3952
- label: "工作台有新版(这一行也给「更新」,装完面板自己换上)",
3953
- manifests: [],
3954
- capabilities: {},
3955
- workbench: {
3956
- pkg: "@dsh-workbench/core",
3957
- installed: "0.1.18",
3958
- latest: "0.1.19"
3959
- },
3960
- expect: {
3961
- rows: 0,
3962
- workbenchState: "outdated",
3963
- workbenchActions: ["update-workbench"]
3964
- }
3965
- },
3966
- {
3967
- id: "workbench-current",
3968
- label: "工作台已经最新(只显示版本,没有按钮)",
3969
- manifests: [],
3970
- capabilities: {},
3971
- workbench: {
3972
- pkg: "@dsh-workbench/core",
3973
- installed: "0.1.19"
3974
- },
3975
- expect: {
3976
- rows: 0,
3977
- workbenchState: "installed",
3978
- workbenchActions: []
3979
- }
3980
- },
3981
- {
3982
- id: "workbench-local",
3983
- label: "工作台是本仓那份(link: 装的:不给更新,行上说清)",
3984
- manifests: [],
3985
- capabilities: {},
3986
- workbench: {
3987
- pkg: "@dsh-workbench/core",
3988
- installed: "0.1.18",
3989
- latest: "0.1.19",
3990
- local: true
3991
- },
3992
- expect: {
3993
- rows: 0,
3994
- workbenchState: "installed",
3995
- workbenchActions: [],
3996
- workbenchNoteKey: "panels.market.workbenchLocal"
3997
- }
3998
- },
3999
- {
4000
- id: "workbench-updated",
4001
- label: "工作台刚更新完(新版已经在盘上:行上就是新版,没有按钮、也不劝人重启)",
4002
- manifests: [],
4003
- capabilities: {},
4004
- workbench: {
4005
- pkg: "@dsh-workbench/core",
4006
- installed: "0.1.19"
4007
- },
4008
- expect: {
4009
- rows: 0,
4010
- workbenchState: "installed",
4011
- workbenchActions: []
4012
- }
4013
- },
4014
- {
4015
- id: "workbench-restart-pending",
4016
- label: "工作台更新完了但这份进程里还是旧的(盘上 0.1.19、跑着的 0.1.18:状态那格是红点「重启后生效」——重启一次 dsh 才真的换上)",
4017
- manifests: [],
4018
- capabilities: {},
4019
- workbench: {
4020
- pkg: "@dsh-workbench/core",
4021
- installed: "0.1.19",
4022
- running: "0.1.18"
4023
- },
4024
- expect: {
4025
- rows: 0,
4026
- workbenchState: "pending-restart",
4027
- workbenchActions: []
4028
- }
4029
- },
4030
- {
4031
- id: "workbench-restart-pending-local",
4032
- label: "本仓那份(link: 装的)永远等于盘上那份 → 不亮这句、也不劝重启",
4033
- manifests: [],
4034
- capabilities: {},
4035
- workbench: {
4036
- pkg: "@dsh-workbench/core",
4037
- installed: "0.1.19",
4038
- running: "0.1.18",
4039
- local: true
4040
- },
4041
- expect: {
4042
- rows: 0,
4043
- workbenchState: "installed",
4044
- workbenchActions: []
4045
- }
4046
- },
4047
- {
4048
- id: "empty",
4049
- label: "市场空态",
4050
- manifests: [],
4051
- capabilities: {},
4052
- expect: {
4053
- rows: 0,
4054
- shared: 0
4055
- }
4056
- }
4057
- ];
4058
- }
4059
- //#endregion
4060
- //#region src/app/layouts/rightbar/registry.ts
4061
- function createBoardRegistry() {
4062
- const modules = [];
4063
- const listeners = /* @__PURE__ */ new Set();
4064
- let revision = 0;
4065
- let sorted = [];
4066
- let index = /* @__PURE__ */ new Map();
4067
- let steps = /* @__PURE__ */ new Map();
4068
- function rebuild() {
4069
- sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
4070
- index = new Map(sorted.map((module) => [module.id, module]));
4071
- const table = /* @__PURE__ */ new Map();
4072
- for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
4073
- const owner = table.get(kind);
4074
- if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
4075
- table.set(kind, module);
4076
- }
4077
- steps = table;
4078
- }
4079
- function notify() {
4080
- revision += 1;
4081
- for (const listener of listeners) listener();
4082
- }
4083
- return {
4084
- register(module) {
4085
- if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
4086
- modules.push(module);
4087
- try {
4088
- rebuild();
4089
- } catch (error) {
4090
- modules.pop();
4091
- rebuild();
4092
- throw error;
4093
- }
4094
- notify();
4095
- return () => {
4096
- const at = modules.indexOf(module);
4097
- if (at < 0) return;
4098
- modules.splice(at, 1);
4099
- rebuild();
4100
- notify();
4101
- };
4102
- },
4103
- all: () => sorted,
4104
- byId: (id) => index.get(id),
4105
- stepOwner: (kind) => steps.get(kind),
4106
- subscribe(listener) {
4107
- listeners.add(listener);
4108
- return () => listeners.delete(listener);
4109
- },
4110
- version: () => revision
4111
- };
4112
- }
4113
- //#endregion
4114
- //#region src/app/units/registry.ts
4115
- function toBoardModule(face, manifest) {
4116
- const View = face.card;
4117
- if (View === void 0) return void 0;
4118
- return {
4119
- id: manifest.id,
4120
- titleKey: manifest.card?.titleKey ?? manifest.id,
4121
- order: manifest.card?.order ?? 100,
4122
- View,
4123
- ...face.steps === void 0 ? {} : { steps: face.steps }
4124
- };
4125
- }
4126
- function createClientUnitRegistry(options = {}) {
4127
- const registrations = [];
4128
- const refusals = [];
4129
- const listeners = /* @__PURE__ */ new Set();
4130
- const board = createBoardRegistry();
4131
- let known = /* @__PURE__ */ new Map();
4132
- let installableIds = null;
4133
- let revision = 0;
4134
- let manifestsCache;
4135
- function notify() {
4136
- revision += 1;
4137
- for (const listener of [...listeners]) try {
4138
- listener();
4139
- } catch (error) {
4140
- console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
4141
- }
4142
- }
4143
- function warnRefusal(unit, kind, reasons) {
4144
- refusals.push({
4145
- unit,
4146
- kind,
4147
- reasons
4148
- });
4149
- console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
4150
- }
4151
- function takeBackRefusal(unit) {
4152
- for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
4153
- }
4154
- function attach(entry) {
4155
- const manifest = known.get(entry.unit);
4156
- if (manifest === void 0) return false;
4157
- const boardModule = toBoardModule(entry.face, manifest);
4158
- entry.mounted = {
4159
- manifest,
4160
- unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
4161
- };
4162
- takeBackRefusal(entry.unit);
4163
- return true;
4164
- }
4165
- function detach(entry) {
4166
- entry.mounted?.unmount();
4167
- entry.mounted = null;
4168
- }
4169
- return {
4170
- register(face) {
4171
- const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
4172
- if (unit === "") {
4173
- warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
4174
- notify();
4175
- return () => {};
4176
- }
4177
- if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
4178
- const entry = {
4179
- face,
4180
- unit,
4181
- mounted: null
4182
- };
4183
- registrations.push(entry);
4184
- manifestsCache = void 0;
4185
- if (!attach(entry)) {
4186
- warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
4187
- options.onUnknownUnit?.(unit);
4188
- }
4189
- notify();
4190
- return () => {
4191
- const at = registrations.indexOf(entry);
4192
- if (at < 0) return;
4193
- registrations.splice(at, 1);
4194
- detach(entry);
4195
- takeBackRefusal(unit);
4196
- manifestsCache = void 0;
4197
- notify();
4198
- };
4199
- },
4200
- all: () => registrations.map((entry) => entry.face),
4201
- manifests: () => {
4202
- manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
4203
- return manifestsCache;
4204
- },
4205
- refusals: () => refusals,
4206
- installable: () => installableIds,
4207
- setManifests(manifests, installable) {
4208
- known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
4209
- installableIds = installable === void 0 ? null : new Set(installable);
4210
- let changed = false;
4211
- for (const entry of registrations) {
4212
- const next = known.get(entry.unit);
4213
- if (entry.mounted === null) {
4214
- if (next !== void 0 && attach(entry)) changed = true;
4215
- continue;
4216
- }
4217
- if (next === void 0) {
4218
- detach(entry);
4219
- warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
4220
- changed = true;
4221
- }
4222
- }
4223
- if (!changed) return;
4224
- manifestsCache = void 0;
4225
- notify();
4226
- },
4227
- board,
4228
- subscribe(listener) {
4229
- listeners.add(listener);
4230
- return () => listeners.delete(listener);
4231
- },
4232
- version: () => revision
4233
- };
3220
+ function shouldProbeOnEnter(input) {
3221
+ if (input.checkedAt === null) return true;
3222
+ return input.now - input.checkedAt >= input.staleMs;
4234
3223
  }
4235
3224
  //#endregion
4236
- //#region src/app/units/fixture-unit-mock.tsx
4237
- var FIXTURE_UNIT_ID = "wb-fixture";
4238
- var CRASH_UNIT_ID = "wb-fixture-crash";
4239
- var KEY = {
4240
- cardTitle: `${FIXTURE_UNIT_ID}.cardTitle`,
4241
- cardMeta: `${FIXTURE_UNIT_ID}.cardMeta`,
4242
- rowKey: `${FIXTURE_UNIT_ID}.rowKey`,
4243
- rowValue: `${FIXTURE_UNIT_ID}.rowValue`
4244
- };
4245
- var messages = {
4246
- zh: {
4247
- [KEY.cardTitle]: "示例模块",
4248
- [KEY.cardMeta]: "夹具",
4249
- [KEY.rowKey]: "示例",
4250
- [KEY.rowValue]: "第 {n} 行"
4251
- },
4252
- en: {
4253
- [KEY.cardTitle]: "Sample module",
4254
- [KEY.cardMeta]: "Fixture",
4255
- [KEY.rowKey]: "Sample",
4256
- [KEY.rowValue]: "Row {n}"
4257
- }
4258
- };
4259
- var manifest = {
4260
- id: FIXTURE_UNIT_ID,
4261
- card: {
4262
- titleKey: KEY.cardTitle,
4263
- order: 900
4264
- },
4265
- tools: [],
4266
- host: { inject: [] }
4267
- };
4268
- function FixtureCard({ t, onRefresh }) {
4269
- return /* @__PURE__ */ h(Card, {
4270
- t,
4271
- title: t(KEY.cardTitle),
4272
- meta: t(KEY.cardMeta),
4273
- refreshing: false,
4274
- onRefresh
4275
- }, /* @__PURE__ */ h(Rows, null, [
4276
- 1,
4277
- 2,
4278
- 3
4279
- ].map((n) => /* @__PURE__ */ h(Row, {
4280
- key: String(n),
4281
- label: t(KEY.rowKey),
4282
- value: t(KEY.rowValue, { n: String(n) })
4283
- }))));
3225
+ //#region src/app/layouts/rightbar/market-settle.ts
3226
+ var MODULE_SETTLE_MS = 15e3;
3227
+ function holdBack(installed, roster, active, previous) {
3228
+ const pending = installed.filter((unit) => !roster.has(unit));
3229
+ const fresh = previous === null ? [] : pending.filter((unit) => !previous.has(unit));
3230
+ return pending.filter((unit) => active.has(unit) || fresh.includes(unit));
4284
3231
  }
4285
- var FIXTURE_FACE = {
4286
- unit: FIXTURE_UNIT_ID,
4287
- manifest,
4288
- messages,
4289
- card: FixtureCard
4290
- };
4291
- var CRASH_KEY = {
4292
- cardTitle: `${CRASH_UNIT_ID}.cardTitle`,
4293
- cardMeta: `${CRASH_UNIT_ID}.cardMeta`
4294
- };
4295
- var crashMessages = {
4296
- zh: {
4297
- [CRASH_KEY.cardTitle]: "崩溃的卡片",
4298
- [CRASH_KEY.cardMeta]: "夹具:渲染时抛错"
4299
- },
4300
- en: {
4301
- [CRASH_KEY.cardTitle]: "Crashing card",
4302
- [CRASH_KEY.cardMeta]: "Fixture: throws while rendering"
4303
- }
4304
- };
4305
- var crashManifest = {
4306
- id: CRASH_UNIT_ID,
4307
- card: {
4308
- titleKey: CRASH_KEY.cardTitle,
4309
- order: 899
4310
- },
4311
- tools: [],
4312
- host: { inject: [] }
4313
- };
4314
- function CrashingCard() {
4315
- throw new Error("夹具:这张卡片按 wbCrash=1 故意渲染失败(守「一张卡片崩溃不带走面板」)");
4316
- }
4317
- var CRASH_FACE = {
4318
- unit: CRASH_UNIT_ID,
4319
- manifest: crashManifest,
4320
- messages: crashMessages,
4321
- card: CrashingCard
4322
- };
4323
- var SAMPLE_ROSTER = [manifest];
4324
- function hasCard(roster) {
4325
- return roster.some((item) => item.card !== null);
3232
+ var WORKBENCH_SWAP_MS = 18e4;
3233
+ function swapLanded(until, installed) {
3234
+ return until !== void 0 && installed === until;
3235
+ }
3236
+ function swapUntil(action, application, latest) {
3237
+ if (action !== "update-workbench" || application !== "restart-required") return void 0;
3238
+ return latest;
4326
3239
  }
4327
- function fixtureRoster(roster) {
4328
- return hasCard(roster) ? roster : SAMPLE_ROSTER;
3240
+ var READ_BACK_ACTIONS = /* @__PURE__ */ new Set(["update", "update-bundle"]);
3241
+ function awaitsReadBack(action, application, version) {
3242
+ return application === "applied" && version !== void 0 && READ_BACK_ACTIONS.has(action);
3243
+ }
3244
+ function readBackDone(input) {
3245
+ if (input.action === "update") return !input.outdated;
3246
+ if (input.entry === void 0 || input.entry.local === true || input.entry.latest === void 0) return true;
3247
+ if (input.entry.latest === input.entry.installed) return true;
3248
+ if (input.clicked === void 0) return true;
3249
+ return input.entry.installed !== input.clicked;
4329
3250
  }
4330
- function boardModuleOf(face) {
4331
- const module = toBoardModule(face, face.manifest);
4332
- return module === void 0 ? [] : [module];
3251
+ function settleLanded(input) {
3252
+ if (input.until !== void 0) return swapLanded(input.until, input.installed);
3253
+ if (input.readBack !== true) return true;
3254
+ return readBackDone({
3255
+ action: input.action,
3256
+ entry: input.entry,
3257
+ clicked: input.clicked,
3258
+ outdated: input.outdated
3259
+ });
4333
3260
  }
4334
- function fixtureSeed(roster, all, crash = false) {
4335
- const base = hasCard(roster) ? all : boardModuleOf(FIXTURE_FACE);
4336
- return crash ? [...boardModuleOf(CRASH_FACE), ...base] : base;
3261
+ function holdWindowMs(until) {
3262
+ return until === void 0 ? MODULE_SETTLE_MS : WORKBENCH_SWAP_MS;
4337
3263
  }
4338
3264
  //#endregion
4339
3265
  //#region src/app/layouts/rightbar/market-shared-rows.ts
@@ -6316,285 +5242,6 @@ window.__ModuleLoader__.load({
6316
5242
  }, 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)));
6317
5243
  }
6318
5244
  //#endregion
6319
- //#region src/app/layouts/market/add-module-mock.ts
6320
- function change(over) {
6321
- return {
6322
- application: "applied",
6323
- stage: "install",
6324
- changed: true,
6325
- target: "@dsh-workbench/module-hello",
6326
- ...over
6327
- };
6328
- }
6329
- function outcome(over, supply = { state: "installed" }) {
6330
- return {
6331
- change: change(over),
6332
- module: {
6333
- kind: "module",
6334
- pkg: "@dsh-workbench/module-hello",
6335
- unit: "hello",
6336
- version: "0.1.2"
6337
- },
6338
- supply
6339
- };
6340
- }
6341
- function refused(problem, reason = "") {
6342
- return {
6343
- id: `refused-${problem}`,
6344
- label: `预检拒:${problem}`,
6345
- phase: "idle",
6346
- spec: "@dsh-workbench/module-nope",
6347
- problem: {
6348
- problem,
6349
- reason
6350
- }
6351
- };
6352
- }
6353
- var ADD_MODULE_MOCKS = [
6354
- {
6355
- id: "empty",
6356
- label: "刚打开",
6357
- phase: "idle",
6358
- spec: ""
6359
- },
6360
- {
6361
- id: "typed",
6362
- label: "填了包名",
6363
- phase: "idle",
6364
- spec: "@dsh-workbench/module-hello"
6365
- },
6366
- {
6367
- id: "guide",
6368
- label: "展开了示例",
6369
- phase: "idle",
6370
- spec: "",
6371
- guideOpen: true
6372
- },
6373
- {
6374
- id: "inspecting",
6375
- label: "正在预检",
6376
- phase: "inspecting",
6377
- spec: "@dsh-workbench/module-hello"
6378
- },
6379
- refused("invalid-spec"),
6380
- refused("already-installed", "已经在 profile 里:@dsh-workbench/module-hello@0.1.2"),
6381
- refused("not-found"),
6382
- refused("not-a-package"),
6383
- refused("not-a-bundle"),
6384
- refused("not-a-module-or-plugin", "这个包既不是工作台的模块,也不是 opencli 的插件,装了也用不上"),
6385
- refused("network", "getaddrinfo ENOTFOUND registry.example.com"),
6386
- refused("unknown", "pnpm 的返回码是 1"),
6387
- {
6388
- id: "preview",
6389
- label: "预览(可装)",
6390
- phase: "preview",
6391
- spec: "@dsh-workbench/module-hello",
6392
- preview: {
6393
- kind: "module",
6394
- name: "@dsh-workbench/module-hello",
6395
- version: "0.1.2",
6396
- description: "最小样本模块:一枚「你好」卡片",
6397
- registry: "registry.npmmirror.com"
6398
- }
6399
- },
6400
- {
6401
- id: "preview-no-source",
6402
- label: "预览(问不出源)",
6403
- phase: "preview",
6404
- spec: "@dsh-workbench/module-hello",
6405
- preview: {
6406
- kind: "module",
6407
- name: "@dsh-workbench/module-hello",
6408
- version: "",
6409
- description: "",
6410
- registry: ""
6411
- }
6412
- },
6413
- {
6414
- id: "preview-plugin",
6415
- label: "预览(opencli 插件)",
6416
- phase: "preview",
6417
- spec: "opencli-plugin-grafana",
6418
- preview: {
6419
- kind: "plugin",
6420
- name: "opencli-plugin-grafana",
6421
- version: "1.0.16",
6422
- description: "",
6423
- registry: "registry.npmmirror.com",
6424
- pluginName: "grafana"
6425
- }
6426
- },
6427
- {
6428
- id: "installing",
6429
- label: "正在安装(可取消)",
6430
- phase: "installing",
6431
- spec: "@dsh-workbench/module-hello"
6432
- },
6433
- {
6434
- id: "needs-approval",
6435
- label: "安装脚本待批",
6436
- phase: "result",
6437
- spec: "@dsh-workbench/module-hello",
6438
- outcome: {
6439
- ...outcome({
6440
- application: "failed",
6441
- stage: "install",
6442
- errorCode: "build-blocked",
6443
- pendingBuilds: ["esbuild", "sharp"]
6444
- }),
6445
- supply: {
6446
- state: "failed",
6447
- reason: "装上之前得先允许安装脚本"
6448
- }
6449
- }
6450
- },
6451
- {
6452
- id: "failed-registry",
6453
- label: "失败:源上没有",
6454
- phase: "result",
6455
- spec: "@dsh-workbench/module-nope",
6456
- outcome: outcome({
6457
- application: "failed",
6458
- stage: "install",
6459
- failedAt: "registry",
6460
- errorCode: "not-found"
6461
- })
6462
- },
6463
- {
6464
- id: "failed-pnpm",
6465
- label: "失败:pnpm 执行出错",
6466
- phase: "result",
6467
- spec: "@dsh-workbench/module-hello",
6468
- outcome: outcome({
6469
- application: "failed",
6470
- stage: "install",
6471
- errorCode: "operation-error",
6472
- errorDetail: "ERR_PNPM_FETCH_404 GET https://registry.example.com/@dsh-workbench%2Fmodule-hello: Not Found"
6473
- })
6474
- },
6475
- {
6476
- id: "done-applied",
6477
- label: "装好了(已生效)",
6478
- phase: "result",
6479
- spec: "@dsh-workbench/module-hello",
6480
- outcome: outcome({})
6481
- },
6482
- {
6483
- id: "done-plugin",
6484
- label: "装好了(opencli 插件)",
6485
- phase: "result",
6486
- spec: "opencli-plugin-cmdb",
6487
- outcome: {
6488
- change: change({ target: "opencli-plugin-cmdb" }),
6489
- module: {
6490
- kind: "unknown",
6491
- pkg: "opencli-plugin-cmdb"
6492
- },
6493
- supply: { state: "no-needs" },
6494
- plugin: {
6495
- kind: "opencli-plugin",
6496
- pkg: "opencli-plugin-cmdb",
6497
- name: "cmdb"
6498
- }
6499
- }
6500
- },
6501
- {
6502
- id: "done-restart",
6503
- label: "装好了(要重启,并说清是哪种:这一格是「某个已装的包换了目录」)",
6504
- phase: "result",
6505
- spec: "@dsh-workbench/module-hello",
6506
- outcome: outcome({
6507
- application: "restart-required",
6508
- restartReason: "package-moved"
6509
- }, { state: "pending-restart" })
6510
- },
6511
- {
6512
- id: "not-a-module",
6513
- label: "装进来的不是模块",
6514
- phase: "result",
6515
- spec: "some-random-package",
6516
- outcome: {
6517
- change: change({ target: "some-random-package" }),
6518
- module: {
6519
- kind: "not-module",
6520
- pkg: "some-random-package"
6521
- },
6522
- supply: { state: "not-a-module" }
6523
- }
6524
- },
6525
- {
6526
- id: "cancelled",
6527
- label: "已取消",
6528
- phase: "result",
6529
- spec: "@dsh-workbench/module-hello",
6530
- outcome: outcome({
6531
- application: "cancelled",
6532
- changed: false
6533
- }, { state: "no-needs" })
6534
- },
6535
- {
6536
- id: "done-no-needs",
6537
- label: "装好了(不要额外供给)",
6538
- phase: "result",
6539
- spec: "@dsh-workbench/module-plain",
6540
- outcome: {
6541
- change: change({ target: "@dsh-workbench/module-plain" }),
6542
- module: {
6543
- kind: "module",
6544
- pkg: "@dsh-workbench/module-plain",
6545
- unit: "plain",
6546
- version: "1.0.0"
6547
- },
6548
- supply: { state: "no-needs" }
6549
- }
6550
- },
6551
- {
6552
- id: "removed",
6553
- label: "移除掉了",
6554
- phase: "result",
6555
- spec: "some-random-package",
6556
- outcome: {
6557
- change: change({
6558
- stage: "remove",
6559
- target: "some-random-package"
6560
- }),
6561
- module: {
6562
- kind: "not-module",
6563
- pkg: "some-random-package"
6564
- },
6565
- supply: { state: "not-a-module" }
6566
- }
6567
- }
6568
- ];
6569
- var frozen = () => {};
6570
- function stateOfMock(base, mock) {
6571
- return {
6572
- ...base,
6573
- spec: mock.spec,
6574
- guideOpen: mock.guideOpen ?? false,
6575
- phase: mock.phase,
6576
- choices: base.choices,
6577
- custom: "",
6578
- registryOpen: false,
6579
- problem: mock.problem ?? null,
6580
- preview: mock.preview ?? null,
6581
- outcome: mock.outcome ?? null,
6582
- failure: mock.failure ?? null,
6583
- builds: mock.outcome?.change.pendingBuilds ?? [],
6584
- setSpec: frozen,
6585
- setChoice: frozen,
6586
- setCustom: frozen,
6587
- toggleRegistry: frozen,
6588
- closeRegistry: frozen,
6589
- toggleGuide: frozen,
6590
- check: frozen,
6591
- edit: frozen,
6592
- install: frozen,
6593
- cancelInstall: frozen,
6594
- removeIt: frozen
6595
- };
6596
- }
6597
- //#endregion
6598
5245
  //#region src/app/layouts/market/use-add-module.ts
6599
5246
  function newRequestId() {
6600
5247
  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
@@ -6794,12 +5441,9 @@ window.__ModuleLoader__.load({
6794
5441
  onInstalled,
6795
5442
  failedText: t("panels.failed")
6796
5443
  });
6797
- const pick = useFixturePick({
6798
- fixtures: ADD_MODULE_MOCKS,
6799
- initial: ADD_MODULE_MOCKS[0]?.id ?? null
6800
- });
6801
- const mock = pick.enabled ? pick.current : void 0;
6802
- const state = mock === void 0 ? real : stateOfMock(real, mock);
5444
+ const devAdd = devSurface.useStrips("addModule", []);
5445
+ const mock = devAdd.current;
5446
+ const state = mock === void 0 ? real : devSurface.addModuleState(real, mock);
6803
5447
  if (!open) return null;
6804
5448
  const installing = state.phase === "installing";
6805
5449
  const checking = state.phase === "inspecting";
@@ -6876,12 +5520,7 @@ window.__ModuleLoader__.load({
6876
5520
  className: AddModule_module_default.dialog,
6877
5521
  contentClassName: AddModule_module_default.content,
6878
5522
  footer
6879
- }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, pick.enabled ? /* @__PURE__ */ h(MockStrip, {
6880
- mocks: ADD_MODULE_MOCKS,
6881
- index: pick.index,
6882
- note: "夹具:只切状态,不发请求",
6883
- onPick: (at) => pick.pick(ADD_MODULE_MOCKS[at]?.id ?? null)
6884
- }) : null, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
5523
+ }, /* @__PURE__ */ h("div", { className: AddModule_module_default.stack }, devAdd.strip, state.phase === "idle" ? /* @__PURE__ */ h(AddModuleForm, {
6885
5524
  t,
6886
5525
  state
6887
5526
  }) : null, state.phase === "inspecting" ? /* @__PURE__ */ h(AddModulePending, {
@@ -6989,13 +5628,9 @@ window.__ModuleLoader__.load({
6989
5628
  checking: true,
6990
5629
  checkedAt: null
6991
5630
  };
6992
- const marketMocks = useMemo(() => buildMarketMocks(fixtureRoster(manifests)), [manifests]);
6993
- const fixturePick = useFixturePick({
6994
- fixtures: marketMocks,
6995
- initial: marketMocks[0]?.id ?? null
6996
- });
6997
- const mock = fixturePick.enabled ? fixturePick.current : void 0;
6998
- const mockNonce = fixturePick.nonce;
5631
+ const devMarket = devSurface.useStrips("market", manifests);
5632
+ const mock = devMarket.current;
5633
+ const mockNonce = devMarket.pick.nonce;
6999
5634
  const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
7000
5635
  const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
7001
5636
  const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking || acting;
@@ -7018,11 +5653,7 @@ window.__ModuleLoader__.load({
7018
5653
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
7019
5654
  disabled: busy,
7020
5655
  onClick: openAddModule
7021
- }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
7022
- mocks: marketMocks,
7023
- index: fixturePick.index,
7024
- onPick: (at) => fixturePick.pick(marketMocks[at]?.id ?? null)
7025
- }) : null, /* @__PURE__ */ h(MarketView, {
5656
+ }, t("panels.market.add.open")))), devMarket.strip, /* @__PURE__ */ h(MarketView, {
7026
5657
  key: `${mock?.id ?? "real-market"}-${mockNonce}`,
7027
5658
  t,
7028
5659
  manifests,
@@ -7524,6 +6155,182 @@ window.__ModuleLoader__.load({
7524
6155
  for (const face of CLIENT_UNITS) registry.register(face);
7525
6156
  }
7526
6157
  //#endregion
6158
+ //#region src/app/layouts/rightbar/registry.ts
6159
+ function createBoardRegistry() {
6160
+ const modules = [];
6161
+ const listeners = /* @__PURE__ */ new Set();
6162
+ let revision = 0;
6163
+ let sorted = [];
6164
+ let index = /* @__PURE__ */ new Map();
6165
+ let steps = /* @__PURE__ */ new Map();
6166
+ function rebuild() {
6167
+ sorted = [...modules].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));
6168
+ index = new Map(sorted.map((module) => [module.id, module]));
6169
+ const table = /* @__PURE__ */ new Map();
6170
+ for (const module of sorted) for (const kind of Object.keys(module.steps ?? {})) {
6171
+ const owner = table.get(kind);
6172
+ if (owner !== void 0) throw new Error(`看板层名重复:${kind}(${owner.id} 与 ${module.id} 都声明了它)`);
6173
+ table.set(kind, module);
6174
+ }
6175
+ steps = table;
6176
+ }
6177
+ function notify() {
6178
+ revision += 1;
6179
+ for (const listener of listeners) listener();
6180
+ }
6181
+ return {
6182
+ register(module) {
6183
+ if (modules.some((item) => item.id === module.id)) throw new Error(`看板模块 id 重复:${module.id}(id 会进持久化配置,不能撞)`);
6184
+ modules.push(module);
6185
+ try {
6186
+ rebuild();
6187
+ } catch (error) {
6188
+ modules.pop();
6189
+ rebuild();
6190
+ throw error;
6191
+ }
6192
+ notify();
6193
+ return () => {
6194
+ const at = modules.indexOf(module);
6195
+ if (at < 0) return;
6196
+ modules.splice(at, 1);
6197
+ rebuild();
6198
+ notify();
6199
+ };
6200
+ },
6201
+ all: () => sorted,
6202
+ byId: (id) => index.get(id),
6203
+ stepOwner: (kind) => steps.get(kind),
6204
+ subscribe(listener) {
6205
+ listeners.add(listener);
6206
+ return () => listeners.delete(listener);
6207
+ },
6208
+ version: () => revision
6209
+ };
6210
+ }
6211
+ //#endregion
6212
+ //#region src/app/units/registry.ts
6213
+ function toBoardModule(face, manifest) {
6214
+ const View = face.card;
6215
+ if (View === void 0) return void 0;
6216
+ return {
6217
+ id: manifest.id,
6218
+ titleKey: manifest.card?.titleKey ?? manifest.id,
6219
+ order: manifest.card?.order ?? 100,
6220
+ View,
6221
+ ...face.steps === void 0 ? {} : { steps: face.steps }
6222
+ };
6223
+ }
6224
+ function createClientUnitRegistry(options = {}) {
6225
+ const registrations = [];
6226
+ const refusals = [];
6227
+ const listeners = /* @__PURE__ */ new Set();
6228
+ const board = createBoardRegistry();
6229
+ let known = /* @__PURE__ */ new Map();
6230
+ let installableIds = null;
6231
+ let revision = 0;
6232
+ let manifestsCache;
6233
+ function notify() {
6234
+ revision += 1;
6235
+ for (const listener of [...listeners]) try {
6236
+ listener();
6237
+ } catch (error) {
6238
+ console.warn(`[dsh-workbench] 套件注册的订阅者报错(不影响其它订阅者与这次注册):${String(error)}`);
6239
+ }
6240
+ }
6241
+ function warnRefusal(unit, kind, reasons) {
6242
+ refusals.push({
6243
+ unit,
6244
+ kind,
6245
+ reasons
6246
+ });
6247
+ console.warn(`[dsh-workbench] ${unit === "" ? "这个模块" : unit} 的卡片没挂上:${reasons.join(";")}`);
6248
+ }
6249
+ function takeBackRefusal(unit) {
6250
+ for (let at = refusals.length - 1; at >= 0; at -= 1) if (refusals[at]?.unit === unit) refusals.splice(at, 1);
6251
+ }
6252
+ function attach(entry) {
6253
+ const manifest = known.get(entry.unit);
6254
+ if (manifest === void 0) return false;
6255
+ const boardModule = toBoardModule(entry.face, manifest);
6256
+ entry.mounted = {
6257
+ manifest,
6258
+ unmount: boardModule === void 0 ? () => {} : board.register(boardModule)
6259
+ };
6260
+ takeBackRefusal(entry.unit);
6261
+ return true;
6262
+ }
6263
+ function detach(entry) {
6264
+ entry.mounted?.unmount();
6265
+ entry.mounted = null;
6266
+ }
6267
+ return {
6268
+ register(face) {
6269
+ const unit = typeof face?.unit === "string" ? face.unit.trim() : "";
6270
+ if (unit === "") {
6271
+ warnRefusal("", "old-shape", ["registerUnit({ unit, card }) 里的 unit 是空的 —— U1b 之前的旧形状是 registerUnit({ manifest, card });现在清单由外壳从**已装清单**读出来、按 unit 交给浏览器(ADR-0038 §2.2)"]);
6272
+ notify();
6273
+ return () => {};
6274
+ }
6275
+ if (registrations.some((entry) => entry.unit === unit)) throw new Error(`套件 id 重复:${unit}(id 会进持久化配置,不能撞)`);
6276
+ const entry = {
6277
+ face,
6278
+ unit,
6279
+ mounted: null
6280
+ };
6281
+ registrations.push(entry);
6282
+ manifestsCache = void 0;
6283
+ if (!attach(entry)) {
6284
+ warnRefusal(unit, "no-manifest", [`宿主没有担保 unit「${unit}」的清单 —— 这个包要么没装进这份 profile,要么它的 dsh.workbench 没通过校验。卡片先不挂:清单只有一处真相(ADR-0038 §2.2)`]);
6285
+ options.onUnknownUnit?.(unit);
6286
+ }
6287
+ notify();
6288
+ return () => {
6289
+ const at = registrations.indexOf(entry);
6290
+ if (at < 0) return;
6291
+ registrations.splice(at, 1);
6292
+ detach(entry);
6293
+ takeBackRefusal(unit);
6294
+ manifestsCache = void 0;
6295
+ notify();
6296
+ };
6297
+ },
6298
+ all: () => registrations.map((entry) => entry.face),
6299
+ manifests: () => {
6300
+ manifestsCache ??= registrations.flatMap((entry) => entry.mounted === null ? [] : [entry.mounted.manifest]);
6301
+ return manifestsCache;
6302
+ },
6303
+ refusals: () => refusals,
6304
+ installable: () => installableIds,
6305
+ setManifests(manifests, installable) {
6306
+ known = new Map(manifests.map((manifest) => [manifest.id, manifest]));
6307
+ installableIds = installable === void 0 ? null : new Set(installable);
6308
+ let changed = false;
6309
+ for (const entry of registrations) {
6310
+ const next = known.get(entry.unit);
6311
+ if (entry.mounted === null) {
6312
+ if (next !== void 0 && attach(entry)) changed = true;
6313
+ continue;
6314
+ }
6315
+ if (next === void 0) {
6316
+ detach(entry);
6317
+ warnRefusal(entry.unit, "withdrawn", [`宿主不再担保 unit「${entry.unit}」的清单(模块被卸了?)—— 这张卡片先摘下来`]);
6318
+ changed = true;
6319
+ }
6320
+ }
6321
+ if (!changed) return;
6322
+ manifestsCache = void 0;
6323
+ notify();
6324
+ },
6325
+ board,
6326
+ subscribe(listener) {
6327
+ listeners.add(listener);
6328
+ return () => listeners.delete(listener);
6329
+ },
6330
+ version: () => revision
6331
+ };
6332
+ }
6333
+ //#endregion
7527
6334
  //#region src/shared/api/unit-manifests.ts
7528
6335
  var UNIT_MANIFESTS_ROUTE = "unit-manifests";
7529
6336
  //#endregion
@@ -7687,281 +6494,12 @@ window.__ModuleLoader__.load({
7687
6494
  svg.append(group);
7688
6495
  return svg;
7689
6496
  }
7690
- function el$1(tag, className, text) {
7691
- const node = document.createElement(tag);
7692
- node.className = className;
7693
- if (text !== void 0) node.textContent = text;
7694
- return node;
7695
- }
7696
- //#endregion
7697
- //#region src/app/layouts/env-gate/gate-mock.ts
7698
- var INSTALL_COMMAND = "npm i --prefix '/Users/you/.dsh/workbench/opencli/toolchain' @jackwener/opencli@1.8.8";
7699
- var EXTENSION_REPORT = [
7700
- "[OK] Daemon: running on port 19825 (v1.8.8)",
7701
- "[MISSING] Extension: not connected",
7702
- "[OK] Connectivity: connected in 0.0s",
7703
- "",
7704
- "Issues:",
7705
- " • Daemon is running but the Chrome/Chromium extension is not connected.",
7706
- "If the extension is already installed, try: opencli daemon restart",
7707
- "If the extension is not installed:",
7708
- " 1. Download from https://github.com/jackwener/opencli/releases",
7709
- " 2. Open chrome://extensions/ → Enable Developer Mode",
7710
- " 3. Click \"Load unpacked\" → select the extension folder"
7711
- ].join("\n");
7712
- var DAEMON_REPORT = [
7713
- "[MISSING] Daemon: not running",
7714
- "[MISSING] Extension: not connected",
7715
- "[FAIL] Connectivity: failed (daemon not reachable)",
7716
- "",
7717
- "Issues:",
7718
- " • Daemon is not running. It should start automatically when you run an opencli browser command.",
7719
- " • Daemon is running but the Chrome/Chromium extension is not connected.",
7720
- "If the extension is already installed, try: opencli daemon restart"
7721
- ].join("\n");
7722
- var PROFILE_REPORT = [
7723
- "[OK] Daemon: running on port 19825 (v1.8.8)",
7724
- "[MISSING] Extension: not connected",
7725
- "[FAIL] Connectivity: failed (profile-required)",
7726
- "",
7727
- "Issues:",
7728
- " • Multiple Chrome profiles are connected to the daemon, but no default profile was selected.",
7729
- " Run opencli profile list, then opencli profile use <name>, or pass --profile <name>."
7730
- ].join("\n");
7731
- var AT = 1790574156506;
7732
- function mock(id, label, note, snapshot, expect) {
7733
- return {
7734
- id,
7735
- label,
7736
- note,
7737
- snapshot: {
7738
- ...snapshot,
7739
- at: AT
7740
- },
7741
- expect
7742
- };
7743
- }
7744
- var BRIDGE_PENDING = {
7745
- id: "bridge",
7746
- status: "pending"
7747
- };
7748
- var GATE_MOCKS = [
7749
- mock("boot", "刚立起来", "还没拿到体检结果的那一帧:只有标题 + 一句\"正在检测运行环境…\",一行步骤都还没有。", {
7750
- phase: "idle",
7751
- steps: []
7752
- }, {
7753
- hint: "checking",
7754
- command: false
7755
- }),
7756
- mock("checking", "检测中", "第一步在跑(转圈 + 它正在执行的命令),第二步还没轮到(短横)。", {
7757
- phase: "checking",
7758
- steps: [{
7759
- id: "opencli",
7760
- status: "running",
7761
- action: "opencli --version"
7762
- }, BRIDGE_PENDING]
7763
- }, {
7764
- hint: "checking",
7765
- command: false
7766
- }),
7767
- mock("installing", "安装中(npm 在跑)", "缺 opencli:正在装。右边会**数秒**(静止的圆点看不出在干活)。", {
7768
- phase: "installing",
7769
- steps: [{
7770
- id: "opencli",
7771
- status: "running",
7772
- action: INSTALL_COMMAND,
7773
- command: INSTALL_COMMAND
7774
- }, BRIDGE_PENDING]
7775
- }, {
7776
- hint: "installing",
7777
- command: false
7778
- }),
7779
- mock("ready", "都就绪(真机到这就放行)", "两步都过。这一帧之后 gate 立刻撤掉 —— 钉住它只是为了看一眼这两行长什么样。", {
7780
- phase: "ready",
7781
- steps: [{
7782
- id: "opencli",
7783
- status: "ok",
7784
- detail: "1.8.8"
7785
- }, {
7786
- id: "bridge",
7787
- status: "ok",
7788
- detail: "Everything looks good!"
7789
- }]
7790
- }, {
7791
- hint: "checking",
7792
- command: false
7793
- }),
7794
- mock("warn-extension", "浏览器通道:扩展没连上", "daemon 在跑、扩展没连上(最常见):行尾说\"没连上\",下面给「去应用商店装扩展」+ `daemon restart`,原文折叠当证据。", {
7795
- phase: "ready",
7796
- steps: [{
7797
- id: "opencli",
7798
- status: "ok",
7799
- detail: "1.8.8"
7800
- }, {
7801
- id: "bridge",
7802
- status: "warn",
7803
- detail: EXTENSION_REPORT,
7804
- command: "opencli daemon restart"
7805
- }],
7806
- bridgeIssues: ["extension"]
7807
- }, {
7808
- hint: "checking",
7809
- command: false,
7810
- bridgeIssues: ["extension"]
7811
- }),
7812
- mock("warn-daemon", "浏览器通道:服务没起来", "daemon 没起来(扩展跟着也连不上):两条人话都摆出来,命令给 `daemon restart`。", {
7813
- phase: "ready",
7814
- steps: [{
7815
- id: "opencli",
7816
- status: "ok",
7817
- detail: "1.8.8"
7818
- }, {
7819
- id: "bridge",
7820
- status: "warn",
7821
- detail: DAEMON_REPORT,
7822
- command: "opencli daemon restart"
7823
- }],
7824
- bridgeIssues: ["daemon", "extension"]
7825
- }, {
7826
- hint: "checking",
7827
- command: false,
7828
- bridgeIssues: ["daemon", "extension"]
7829
- }),
7830
- mock("warn-profile", "浏览器通道:没选默认 profile", "连了多个浏览器 profile 但没选默认:只说\"选哪个\"(重启服务解决不了它),命令给 `profile list`。", {
7831
- phase: "ready",
7832
- steps: [{
7833
- id: "opencli",
7834
- status: "ok",
7835
- detail: "1.8.8"
7836
- }, {
7837
- id: "bridge",
7838
- status: "warn",
7839
- detail: PROFILE_REPORT,
7840
- command: "opencli profile list"
7841
- }],
7842
- bridgeIssues: ["profile"]
7843
- }, {
7844
- hint: "checking",
7845
- command: false,
7846
- bridgeIssues: ["profile"]
7847
- }),
7848
- mock("failed-permission", "装不上:权限不足", "失败态:为什么需要它 → 确切命令(可复制)→ 照做能解决的一句人话(EACCES → 换目录 / sudo)。", {
7849
- phase: "failed",
7850
- steps: [{
7851
- id: "opencli",
7852
- status: "failed",
7853
- detail: "npm ERR! code EACCES",
7854
- command: INSTALL_COMMAND
7855
- }, BRIDGE_PENDING],
7856
- error: "npm ERR! code EACCES\nnpm ERR! syscall mkdir\nnpm ERR! path /usr/local/lib/node_modules",
7857
- failure: "permission",
7858
- guidance: "install"
7859
- }, {
7860
- hint: "failed",
7861
- guidance: "install",
7862
- command: true
7863
- }),
7864
- mock("failed-network", "装不上:网络不通", "同一档失败,但人话换成\"查代理\"那条(EAI_AGAIN / ENOTFOUND)。", {
7865
- phase: "failed",
7866
- steps: [{
7867
- id: "opencli",
7868
- status: "failed",
7869
- detail: "npm ERR! code EAI_AGAIN",
7870
- command: INSTALL_COMMAND
7871
- }, BRIDGE_PENDING],
7872
- error: "npm ERR! code EAI_AGAIN\nnpm ERR! network request to https://registry.npmjs.org failed",
7873
- failure: "network",
7874
- guidance: "install"
7875
- }, {
7876
- hint: "failed",
7877
- guidance: "install",
7878
- command: true
7879
- }),
7880
- mock("failed-unknown", "装不上:认不出的错", "认不出失败种类时**不编**建议:只给命令与原文(多一句假建议比少一句更糟)。", {
7881
- phase: "failed",
7882
- steps: [{
7883
- id: "opencli",
7884
- status: "failed",
7885
- detail: "something went wrong",
7886
- command: INSTALL_COMMAND
7887
- }, BRIDGE_PENDING],
7888
- error: "something went wrong",
7889
- failure: "unknown",
7890
- guidance: "install"
7891
- }, {
7892
- hint: "failed",
7893
- guidance: "install",
7894
- command: true
7895
- }),
7896
- mock("failed-path", "装了但还找不到", "装完了 `--version` 还是不行:**不再让用户装一遍**(PATH / 新终端的事),所以不给命令。", {
7897
- phase: "failed",
7898
- steps: [{
7899
- id: "opencli",
7900
- status: "failed",
7901
- detail: "zsh: command not found: opencli",
7902
- command: INSTALL_COMMAND
7903
- }, BRIDGE_PENDING],
7904
- error: "zsh: command not found: opencli",
7905
- failure: "missing",
7906
- guidance: "path"
7907
- }, {
7908
- hint: "failed",
7909
- guidance: "path",
7910
- command: false
7911
- }),
7912
- mock("failed-shell", "执行缝坏了", "连 shell 都调不动:装也不可能成功。没有\"正在执行的动作\"、也没有命令 —— 该做的是重启宿主。", {
7913
- phase: "failed",
7914
- steps: [{
7915
- id: "opencli",
7916
- status: "failed",
7917
- detail: "Error: spawn /bin/sh ENOENT"
7918
- }, BRIDGE_PENDING],
7919
- error: "Error: spawn /bin/sh ENOENT",
7920
- failure: "unknown",
7921
- guidance: "shell"
7922
- }, {
7923
- hint: "failed",
7924
- guidance: "shell",
7925
- command: false
7926
- })
7927
- ];
7928
6497
  function el(tag, className, text) {
7929
6498
  const node = document.createElement(tag);
7930
6499
  node.className = className;
7931
6500
  if (text !== void 0) node.textContent = text;
7932
6501
  return node;
7933
6502
  }
7934
- function mountGateMockStrip(options) {
7935
- const strip = el("div", `wb-mockStrip ${BootGate_module_default.mockSlot}`);
7936
- const note = el("span", "wb-mockNote");
7937
- const chips = [];
7938
- const paint = (active) => {
7939
- note.textContent = `夹具:钉住启动页的状态,不轮询、不放行 —— ${active?.note ?? "不接管:按真机走(就绪就放行)。"}`;
7940
- chips.forEach((chip) => {
7941
- chip.className = `wb-mockChip${chip.dataset.mock === active?.id ? " wb-mockChipOn" : ""}`;
7942
- });
7943
- };
7944
- const pick = (active) => {
7945
- paint(active);
7946
- options.onPick(active === null ? null : active.snapshot);
7947
- };
7948
- const real = el("button", "wb-mockChip", "真实");
7949
- real.setAttribute("type", "button");
7950
- real.dataset.mock = "";
7951
- real.addEventListener("click", () => pick(null));
7952
- strip.append(note, real);
7953
- chips.push(real);
7954
- for (const item of GATE_MOCKS) {
7955
- const chip = el("button", "wb-mockChip", item.label);
7956
- chip.setAttribute("type", "button");
7957
- chip.dataset.mock = item.id;
7958
- chip.addEventListener("click", () => pick(item));
7959
- strip.append(chip);
7960
- chips.push(chip);
7961
- }
7962
- pick(GATE_MOCKS[0] ?? null);
7963
- return strip;
7964
- }
7965
6503
  //#endregion
7966
6504
  //#region src/app/layouts/env-gate/boot-gate.ts
7967
6505
  var POLL_MS = 400;
@@ -7992,9 +6530,9 @@ window.__ModuleLoader__.load({
7992
6530
  };
7993
6531
  }
7994
6532
  function commandRow(t) {
7995
- const row = el$1("div", BootGate_module_default.commandRow);
7996
- const code = el$1("code", BootGate_module_default.command);
7997
- const copy = el$1("button", BootGate_module_default.copy);
6533
+ const row = el("div", BootGate_module_default.commandRow);
6534
+ const code = el("code", BootGate_module_default.command);
6535
+ const copy = el("button", BootGate_module_default.copy);
7998
6536
  copy.setAttribute("type", "button");
7999
6537
  copy.setAttribute("aria-label", t("env.copyCommand"));
8000
6538
  copy.title = t("env.copyCommand");
@@ -8027,47 +6565,47 @@ window.__ModuleLoader__.load({
8027
6565
  const request = options.request ?? apiGet;
8028
6566
  if (typeof document === "undefined" || typeof document.getElementById !== "function" || document.body === void 0) return { close: () => {} };
8029
6567
  const root = document.getElementById("root");
8030
- const overlay = el$1("div", BootGate_module_default.gate);
6568
+ const overlay = el("div", BootGate_module_default.gate);
8031
6569
  overlay.setAttribute("role", "dialog");
8032
6570
  overlay.setAttribute("aria-modal", "true");
8033
6571
  overlay.setAttribute("aria-label", t("env.title"));
8034
- const card = el$1("div", BootGate_module_default.card);
8035
- const title = el$1("h1", BootGate_module_default.title, t("env.title"));
8036
- const hint = el$1("p", BootGate_module_default.hint, t("env.checking"));
8037
- const list = el$1("ul", BootGate_module_default.steps);
8038
- const progressRow = el$1("div", BootGate_module_default.progress);
6572
+ const card = el("div", BootGate_module_default.card);
6573
+ const title = el("h1", BootGate_module_default.title, t("env.title"));
6574
+ const hint = el("p", BootGate_module_default.hint, t("env.checking"));
6575
+ const list = el("ul", BootGate_module_default.steps);
6576
+ const progressRow = el("div", BootGate_module_default.progress);
8039
6577
  progressRow.hidden = true;
8040
- const elapsed = el$1("span", BootGate_module_default.elapsed);
6578
+ const elapsed = el("span", BootGate_module_default.elapsed);
8041
6579
  progressRow.append(elapsed);
8042
- const actions = el$1("div", BootGate_module_default.actions);
6580
+ const actions = el("div", BootGate_module_default.actions);
8043
6581
  actions.hidden = true;
8044
- const fixTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
8045
- const fixWhy = el$1("p", BootGate_module_default.hint);
8046
- const fixStep = el$1("p", BootGate_module_default.hint);
8047
- const fixAdvice = el$1("p", BootGate_module_default.hint);
8048
- const raw = el$1("details", BootGate_module_default.raw);
8049
- const rawSummary = el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
8050
- const errorBox = el$1("pre", BootGate_module_default.error);
6582
+ const fixTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6583
+ const fixWhy = el("p", BootGate_module_default.hint);
6584
+ const fixStep = el("p", BootGate_module_default.hint);
6585
+ const fixAdvice = el("p", BootGate_module_default.hint);
6586
+ const raw = el("details", BootGate_module_default.raw);
6587
+ const rawSummary = el("summary", BootGate_module_default.rawSummary, t("env.fix.details"));
6588
+ const errorBox = el("pre", BootGate_module_default.error);
8051
6589
  raw.append(rawSummary, errorBox);
8052
- const buttons = el$1("div", BootGate_module_default.buttons);
8053
- const retry = el$1("button", BootGate_module_default.button, t("env.retry"));
6590
+ const buttons = el("div", BootGate_module_default.buttons);
6591
+ const retry = el("button", BootGate_module_default.button, t("env.retry"));
8054
6592
  retry.setAttribute("type", "button");
8055
6593
  const fixCommand = commandRow(t);
8056
6594
  buttons.append(retry);
8057
6595
  actions.append(fixTitle, fixWhy, fixStep, fixCommand.row, fixAdvice, buttons, raw);
8058
- const bridge = el$1("div", BootGate_module_default.bridge);
6596
+ const bridge = el("div", BootGate_module_default.bridge);
8059
6597
  bridge.hidden = true;
8060
- const bridgeTitle = el$1("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
8061
- const bridgeWhy = el$1("p", BootGate_module_default.hint, t("env.bridge.why"));
8062
- const bridgeLines = el$1("ul", BootGate_module_default.bridgeLines);
6598
+ const bridgeTitle = el("h2", BootGate_module_default.fixTitle, t("env.fix.title"));
6599
+ const bridgeWhy = el("p", BootGate_module_default.hint, t("env.bridge.why"));
6600
+ const bridgeLines = el("ul", BootGate_module_default.bridgeLines);
8063
6601
  const bridgeCommand = commandRow(t);
8064
- const bridgeRetry = el$1("button", BootGate_module_default.button, t("env.retry"));
6602
+ const bridgeRetry = el("button", BootGate_module_default.button, t("env.retry"));
8065
6603
  bridgeRetry.setAttribute("type", "button");
8066
- const bridgeButtons = el$1("div", BootGate_module_default.buttons);
6604
+ const bridgeButtons = el("div", BootGate_module_default.buttons);
8067
6605
  bridgeButtons.append(bridgeRetry);
8068
- const bridgeRaw = el$1("details", BootGate_module_default.raw);
8069
- const bridgeRawText = el$1("pre", BootGate_module_default.error);
8070
- bridgeRaw.append(el$1("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
6606
+ const bridgeRaw = el("details", BootGate_module_default.raw);
6607
+ const bridgeRawText = el("pre", BootGate_module_default.error);
6608
+ bridgeRaw.append(el("summary", BootGate_module_default.rawSummary, t("env.fix.details")), bridgeRawText);
8071
6609
  bridge.append(bridgeTitle, bridgeWhy, bridgeLines, bridgeCommand.row, bridgeButtons, bridgeRaw);
8072
6610
  card.append(title, hint, list, progressRow, actions, bridge);
8073
6611
  overlay.append(card);
@@ -8113,16 +6651,16 @@ window.__ModuleLoader__.load({
8113
6651
  function ensureRow(step) {
8114
6652
  const existing = rows.get(step.id);
8115
6653
  if (existing !== void 0) return existing;
8116
- const item = el$1("li", BootGate_module_default.step);
8117
- const mark = el$1("span", BootGate_module_default.mark);
6654
+ const item = el("li", BootGate_module_default.step);
6655
+ const mark = el("span", BootGate_module_default.mark);
8118
6656
  mark.setAttribute("aria-hidden", "true");
8119
6657
  const row = {
8120
6658
  item,
8121
6659
  mark,
8122
- detail: el$1("span", BootGate_module_default.detail),
6660
+ detail: el("span", BootGate_module_default.detail),
8123
6661
  status: ""
8124
6662
  };
8125
- item.append(mark, el$1("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
6663
+ item.append(mark, el("span", BootGate_module_default.label, stepLabel$1(step.id, t)), row.detail);
8126
6664
  rows.set(step.id, row);
8127
6665
  return row;
8128
6666
  }
@@ -8169,7 +6707,7 @@ window.__ModuleLoader__.load({
8169
6707
  if (bridgeBroken && bridgeStep !== void 0) {
8170
6708
  bridgeLines.replaceChildren(...(snapshot.bridgeIssues ?? ["unknown"]).map((issue) => {
8171
6709
  const advice = bridgeAdvice(issue);
8172
- const item = el$1("li", BootGate_module_default.bridgeLine, t(advice.textKey));
6710
+ const item = el("li", BootGate_module_default.bridgeLine, t(advice.textKey));
8173
6711
  if (advice.link !== void 0) {
8174
6712
  const link = document.createElement("a");
8175
6713
  link.className = BootGate_module_default.link;
@@ -8218,8 +6756,9 @@ window.__ModuleLoader__.load({
8218
6756
  }
8219
6757
  retry.addEventListener("click", retryNow);
8220
6758
  bridgeRetry.addEventListener("click", retryNow);
8221
- if (mockModeOn(typeof window === "undefined" ? "" : window.location?.search ?? "")) {
8222
- const strip = mountGateMockStrip({ onPick: (snapshot) => {
6759
+ const search = typeof window === "undefined" ? "" : window.location?.search ?? "";
6760
+ if (devSurface.on(search)) {
6761
+ const strip = devSurface.gateStrip({ onPick: (snapshot) => {
8223
6762
  pinned = snapshot;
8224
6763
  if (snapshot !== null) {
8225
6764
  render(snapshot);
@@ -8227,7 +6766,7 @@ window.__ModuleLoader__.load({
8227
6766
  }
8228
6767
  poll();
8229
6768
  } });
8230
- overlay.append(strip);
6769
+ if (strip !== null) overlay.append(strip);
8231
6770
  }
8232
6771
  poll();
8233
6772
  return { close };
@@ -8562,18 +7101,6 @@ window.__ModuleLoader__.load({
8562
7101
  }, t("panels.browseMarket")))
8563
7102
  });
8564
7103
  }
8565
- //#endregion
8566
- //#region src/app/layouts/rightbar/BoardMockStrip.tsx
8567
- function BoardMockStrip({ fixtures, show }) {
8568
- const current = fixtures.mock;
8569
- if (!show || current === void 0) return null;
8570
- return /* @__PURE__ */ h(MockStrip, {
8571
- note: `夹具:只切形状,不碰真实配置;卡片上的数据看卡片夹具 —— ${current.note}`,
8572
- mocks: fixtures.mocks,
8573
- index: fixtures.index,
8574
- onPick: fixtures.pick
8575
- });
8576
- }
8577
7104
  var ModulesPage_module_default = {
8578
7105
  trigger: "_trigger_15ptp_1",
8579
7106
  pop: "_pop_15ptp_6",
@@ -8600,250 +7127,6 @@ window.__ModuleLoader__.load({
8600
7127
  groupTitle: "_groupTitle_15ptp_191"
8601
7128
  };
8602
7129
  //#endregion
8603
- //#region src/app/layouts/rightbar/panel-mock.ts
8604
- function row$1(id, titleKey, shown) {
8605
- return {
8606
- id,
8607
- titleKey,
8608
- shown,
8609
- source: "user",
8610
- hasCard: true
8611
- };
8612
- }
8613
- function noCardRow(id, titleKey) {
8614
- return {
8615
- id,
8616
- titleKey,
8617
- shown: false,
8618
- source: "user",
8619
- hasCard: false
8620
- };
8621
- }
8622
- function plugin(id, pkg, title, shown) {
8623
- return {
8624
- id,
8625
- pkg,
8626
- title,
8627
- shown,
8628
- source: "user"
8629
- };
8630
- }
8631
- var PLUGIN_MOCK = {
8632
- id: "plugin",
8633
- label: "opencli 插件行(标出是插件,能开能关)",
8634
- units: [],
8635
- plugins: [plugin("plugin:opencli-plugin-cmdb", "opencli-plugin-cmdb", "cmdb", true), plugin("plugin:opencli-plugin-notes", "opencli-plugin-notes", "notes", false)],
8636
- capabilities: {},
8637
- expect: { rows: 0 }
8638
- };
8639
- function probe(unit, status) {
8640
- return { [unit]: {
8641
- unit,
8642
- status,
8643
- required: [],
8644
- missing: [],
8645
- detail: "夹具"
8646
- } };
8647
- }
8648
- function buildPanelMocks(roster) {
8649
- const found = roster.find((manifest) => manifest.card !== null);
8650
- if (found === void 0) return [{
8651
- id: "empty",
8652
- label: "列表空(都卸了/都关了)",
8653
- units: [],
8654
- capabilities: {},
8655
- expect: { rows: 0 }
8656
- }, PLUGIN_MOCK];
8657
- const titleKey = found.card?.titleKey ?? found.id;
8658
- const id = found.id;
8659
- const on = row$1(id, titleKey, true);
8660
- const off = row$1(id, titleKey, false);
8661
- const twin = row$1(`${id}-b`, titleKey, true);
8662
- const third = row$1(`${id}-c`, titleKey, false);
8663
- return [
8664
- {
8665
- id: "one",
8666
- label: "一行:已启用、装好了",
8667
- units: [on],
8668
- capabilities: probe(id, "ok"),
8669
- expect: {
8670
- rows: 1,
8671
- badge: null,
8672
- on: true
8673
- }
8674
- },
8675
- {
8676
- id: "off",
8677
- label: "已停用(开关关着)",
8678
- units: [off],
8679
- capabilities: probe(id, "ok"),
8680
- expect: {
8681
- rows: 1,
8682
- badge: null,
8683
- on: false
8684
- }
8685
- },
8686
- {
8687
- id: "missing",
8688
- label: "⚠ 没装好 → 不列(去市场装)",
8689
- units: [on],
8690
- capabilities: probe(id, "missing-plugin"),
8691
- expect: { rows: 0 }
8692
- },
8693
- {
8694
- id: "outdated",
8695
- label: "⚠ 缺命令(也没装好)→ 同样不列",
8696
- units: [on],
8697
- capabilities: probe(id, "missing-commands"),
8698
- expect: { rows: 0 }
8699
- },
8700
- {
8701
- id: "unchecked",
8702
- label: "⚠ 检测不了",
8703
- units: [on],
8704
- capabilities: probe(id, "unchecked"),
8705
- expect: {
8706
- rows: 1,
8707
- badge: "panels.dep.unchecked",
8708
- on: true
8709
- }
8710
- },
8711
- {
8712
- id: "checking",
8713
- label: "还没探到(没有徽标)",
8714
- units: [on],
8715
- capabilities: null,
8716
- expect: {
8717
- rows: 1,
8718
- badge: null,
8719
- on: true
8720
- }
8721
- },
8722
- {
8723
- id: "many",
8724
- label: "三行(顺序 / 停用混着)",
8725
- units: [
8726
- on,
8727
- twin,
8728
- third
8729
- ],
8730
- capabilities: {
8731
- ...probe(id, "ok"),
8732
- ...probe(`${id}-b`, "ok"),
8733
- ...probe(`${id}-c`, "ok")
8734
- },
8735
- expect: {
8736
- rows: 3,
8737
- badge: null,
8738
- on: true
8739
- }
8740
- },
8741
- {
8742
- id: "no-card",
8743
- label: "没看板的模块(只有基座命令那种):也列出来、带「无看板」标签,开关照常能用,只是不参与排序",
8744
- units: [on, noCardRow(`${id}-c`, `${titleKey}(无看板)`)],
8745
- capabilities: {
8746
- ...probe(id, "ok"),
8747
- ...probe(`${id}-c`, "ok")
8748
- },
8749
- expect: {
8750
- rows: 2,
8751
- badge: null,
8752
- on: true
8753
- }
8754
- },
8755
- {
8756
- id: "long",
8757
- label: "超长模块名",
8758
- units: [row$1(id, "一个名字特别特别长的模块用来验证省略号会不会把开关挤下去", true)],
8759
- capabilities: probe(id, "ok"),
8760
- expect: {
8761
- rows: 1,
8762
- badge: null
8763
- }
8764
- },
8765
- {
8766
- id: "hidden",
8767
- label: "卸载后不显示(未启用 + 没装)",
8768
- units: [off],
8769
- capabilities: probe(id, "missing-plugin"),
8770
- expect: { rows: 0 }
8771
- },
8772
- {
8773
- id: "busy",
8774
- label: "正在改配置(开关禁用)",
8775
- units: [on, twin],
8776
- capabilities: {
8777
- ...probe(id, "ok"),
8778
- ...probe(`${id}-b`, "ok")
8779
- },
8780
- busy: true,
8781
- expect: { rows: 2 }
8782
- },
8783
- {
8784
- id: "failed",
8785
- label: "改配置失败(红字)",
8786
- units: [on],
8787
- capabilities: probe(id, "ok"),
8788
- failed: true,
8789
- expect: { rows: 1 }
8790
- },
8791
- {
8792
- id: "drag",
8793
- label: "拖动中的落点提示",
8794
- units: [
8795
- on,
8796
- twin,
8797
- third
8798
- ],
8799
- capabilities: {
8800
- ...probe(id, "ok"),
8801
- ...probe(`${id}-b`, "ok"),
8802
- ...probe(`${id}-c`, "ok")
8803
- },
8804
- drag: {
8805
- from: 1,
8806
- over: 0,
8807
- at: {
8808
- x: 1230,
8809
- y: 300
8810
- }
8811
- },
8812
- expect: {
8813
- rows: 3,
8814
- on: true
8815
- }
8816
- },
8817
- {
8818
- id: "drag-off",
8819
- label: "拖到未开启的那一行上:落点不亮(松手也不动)",
8820
- units: [
8821
- on,
8822
- twin,
8823
- third
8824
- ],
8825
- capabilities: {
8826
- ...probe(id, "ok"),
8827
- ...probe(`${id}-b`, "ok"),
8828
- ...probe(`${id}-c`, "ok")
8829
- },
8830
- drag: {
8831
- from: 0,
8832
- over: null,
8833
- at: {
8834
- x: 1230,
8835
- y: 300
8836
- }
8837
- },
8838
- expect: {
8839
- rows: 3,
8840
- on: true
8841
- }
8842
- },
8843
- PLUGIN_MOCK
8844
- ];
8845
- }
8846
- //#endregion
8847
7130
  //#region src/app/layouts/rightbar/board-selection.ts
8848
7131
  function available(capability) {
8849
7132
  if (capability === void 0) return true;
@@ -9219,13 +7502,9 @@ window.__ModuleLoader__.load({
9219
7502
  forceProbe
9220
7503
  ]);
9221
7504
  const root = useRef(null);
9222
- const panelMocks = useMemo(() => buildPanelMocks(fixtureRoster(manifests)), [manifests]);
9223
- const fixturePick = useFixturePick({
9224
- fixtures: panelMocks,
9225
- initial: panelMocks[0]?.id ?? null
9226
- });
9227
- const panelMock = fixturePick.enabled ? fixturePick.current : void 0;
9228
- const mockNonce = fixturePick.nonce;
7505
+ const devPanel = devSurface.useStrips("panel", manifests);
7506
+ const panelMock = devPanel.current;
7507
+ const mockNonce = devPanel.pick.nonce;
9229
7508
  (0, _deepseek_ai_dsh_client_ui_primitives.useDismissOnOutsidePointer)(root, open, (next) => dismissPanelByPointer(next, document, onOpenChange));
9230
7509
  const units = enabledUnits?.units ?? [];
9231
7510
  return /* @__PURE__ */ h("div", {
@@ -9244,20 +7523,16 @@ window.__ModuleLoader__.load({
9244
7523
  className: ModulesPage_module_default.pop,
9245
7524
  role: "dialog",
9246
7525
  "aria-label": t("panels.title")
9247
- }, /* @__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, {
9248
- mocks: panelMocks,
9249
- index: fixturePick.index,
9250
- onPick: (at) => fixturePick.pick(panelMocks[at]?.id ?? null)
9251
- }) : null, /* @__PURE__ */ h(ModulesPage, {
7526
+ }, /* @__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, {
9252
7527
  key: `${panelMock?.id ?? "real-modules"}-${mockNonce}`,
9253
7528
  t,
9254
7529
  units: panelMock?.units ?? units,
9255
7530
  plugins: panelMock?.plugins ?? enabledUnits?.plugins ?? [],
9256
- capabilities: panelMock === void 0 ? fixturePick.enabled ? null : capabilities : panelMock.capabilities,
7531
+ capabilities: panelMock === void 0 ? devPanel.enabled ? null : capabilities : panelMock.capabilities,
9257
7532
  loading: enabledUnits === null,
9258
7533
  own: enabledUnits?.own === true,
9259
7534
  onOpenMarket,
9260
- mocked: fixturePick.enabled,
7535
+ mocked: devPanel.enabled,
9261
7536
  workspace,
9262
7537
  mock: panelMock
9263
7538
  })) : null);
@@ -9278,589 +7553,6 @@ window.__ModuleLoader__.load({
9278
7553
  return splitBoardColumns(items);
9279
7554
  }
9280
7555
  //#endregion
9281
- //#region src/app/layouts/rightbar/board-mock.ts
9282
- var REAL = {
9283
- id: "real",
9284
- label: "真实",
9285
- note: "不接管:宿主配置里开着什么就摆什么。",
9286
- shape: { kind: "real" }
9287
- };
9288
- var EMPTY = {
9289
- id: "empty",
9290
- label: "空看板",
9291
- note: "一个模块都没开:内容区那条空态与它的两条出路。",
9292
- shape: { kind: "empty" },
9293
- expect: {
9294
- cards: 0,
9295
- empty: true
9296
- }
9297
- };
9298
- var UNREAD = {
9299
- id: "unread",
9300
- label: "配置还没读到",
9301
- note: "还没读到配置:内容区说一句\"正在读取面板配置…\",头部 ⟳ 留着(按一下立刻重读)。",
9302
- shape: { kind: "unread" },
9303
- expect: {
9304
- cards: 0,
9305
- empty: false
9306
- }
9307
- };
9308
- var KIT = {
9309
- id: "kit",
9310
- label: "公共组件预览",
9311
- note: "把 shared 那套哑组件按\"样式 + 交互\"摆一遍(下拉的常规档与无边框档、搜索、分组、禁用、加载、手填退化、卡片头、状态、行、活动流、长任务那一行):不碰配置、不读数据。",
9312
- shape: { kind: "kit" },
9313
- expect: {
9314
- cards: 1,
9315
- empty: false
9316
- }
9317
- };
9318
- function buildBoardMocks(roster) {
9319
- return [
9320
- REAL,
9321
- KIT,
9322
- ...!roster.some((manifest) => manifest.card !== null) ? [] : [
9323
- {
9324
- id: "one",
9325
- label: "一张卡",
9326
- note: "常态:面板上只有一个模块时的样子。",
9327
- shape: {
9328
- kind: "copies",
9329
- count: 1
9330
- },
9331
- expect: {
9332
- cards: 1,
9333
- empty: false
9334
- }
9335
- },
9336
- {
9337
- id: "two",
9338
- label: "两张卡",
9339
- note: "同一个模块摆两份 —— 量卡片之间的间距与分界(卡片夹具条已收起)。",
9340
- shape: {
9341
- kind: "copies",
9342
- count: 2
9343
- },
9344
- expect: {
9345
- cards: 2,
9346
- empty: false
9347
- }
9348
- },
9349
- {
9350
- id: "many",
9351
- label: "八张卡(要滚)",
9352
- note: "同一个模块摆八份 —— 量滚动、滚动条与底部留白(卡片夹具条已收起)。",
9353
- shape: {
9354
- kind: "copies",
9355
- count: 8
9356
- },
9357
- expect: {
9358
- cards: 8,
9359
- empty: false
9360
- }
9361
- },
9362
- {
9363
- id: "crash",
9364
- label: "坏卡 + 好卡",
9365
- note: "一张渲染必炸的卡 + 你装的模块(配 ?wbCrash=1 才摆得出来):要看到坏的那张只剩一句\"这个模块起不来\",别的卡与面板壳都还在。",
9366
- shape: { kind: "all" },
9367
- expect: {
9368
- cards: 1,
9369
- empty: false
9370
- }
9371
- }
9372
- ],
9373
- EMPTY,
9374
- UNREAD
9375
- ];
9376
- }
9377
- var REAL_SHAPE = { kind: "real" };
9378
- function useBoardMock(roster) {
9379
- const [on] = useState(() => mockModeOn(window.location.search));
9380
- const mocks = useMemo(() => on ? buildBoardMocks(roster) : [], [on, roster]);
9381
- const [index, setIndex] = useState(0);
9382
- const mock = mocks[index];
9383
- return {
9384
- mock,
9385
- mocks,
9386
- index,
9387
- pick: setIndex,
9388
- shape: mock?.shape ?? REAL_SHAPE
9389
- };
9390
- }
9391
- var kit_preview_module_default = {
9392
- gallery: "_gallery_eqvi8_1",
9393
- section: "_section_eqvi8_7",
9394
- heading: "_heading_eqvi8_13",
9395
- title: "_title_eqvi8_20",
9396
- note: "_note_eqvi8_26",
9397
- cells: "_cells_eqvi8_32",
9398
- cell: "_cell_eqvi8_32",
9399
- cellLabel: "_cellLabel_eqvi8_46",
9400
- span: "_span_eqvi8_51",
9401
- stack: "_stack_eqvi8_55",
9402
- inline: "_inline_eqvi8_61",
9403
- panel: "_panel_eqvi8_68",
9404
- bound: "_bound_eqvi8_75"
9405
- };
9406
- //#endregion
9407
- //#region src/app/layouts/rightbar/kit-preview-controls.tsx
9408
- var ENV_OPTIONS = [
9409
- {
9410
- value: "prod",
9411
- label: "生产环境"
9412
- },
9413
- {
9414
- value: "stage",
9415
- label: "预发环境"
9416
- },
9417
- {
9418
- value: "dev",
9419
- label: "开发环境"
9420
- }
9421
- ];
9422
- var CLOUD_OPTIONS = [
9423
- {
9424
- value: "ali-prod",
9425
- label: "生产集群",
9426
- group: "阿里云",
9427
- searchText: "aliyun 生产 prod"
9428
- },
9429
- {
9430
- value: "ali-stage",
9431
- label: "预发集群",
9432
- group: "阿里云",
9433
- searchText: "aliyun 预发 stage"
9434
- },
9435
- {
9436
- value: "tencent-prod",
9437
- label: "生产集群",
9438
- group: "腾讯云",
9439
- searchText: "tencent 生产 prod"
9440
- },
9441
- {
9442
- value: "tencent-dev",
9443
- label: "开发集群",
9444
- group: "腾讯云",
9445
- disabled: true,
9446
- searchText: "tencent 开发 dev"
9447
- }
9448
- ];
9449
- var CHOICES = [
9450
- {
9451
- value: "small",
9452
- label: "小"
9453
- },
9454
- {
9455
- value: "medium",
9456
- label: "中"
9457
- },
9458
- {
9459
- value: "large",
9460
- label: "大"
9461
- }
9462
- ];
9463
- function TextFieldDemo() {
9464
- const [text, setText] = useState("");
9465
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(Field, {
9466
- label: "名字",
9467
- hint: "随手敲点字,看描边与焦点环"
9468
- }, /* @__PURE__ */ h(TextField, {
9469
- value: text,
9470
- placeholder: "例如:生产",
9471
- onChange: (event) => setText(event.currentTarget.value)
9472
- })), /* @__PURE__ */ h(TextField, {
9473
- invalid: true,
9474
- value: "这份填错了",
9475
- onChange: () => {}
9476
- }), /* @__PURE__ */ h(TextField, {
9477
- value: "禁用的一格",
9478
- disabled: true,
9479
- onChange: () => {}
9480
- }));
9481
- }
9482
- function SelectDemo({ variant }) {
9483
- const [value, setValue] = useState("stage");
9484
- return /* @__PURE__ */ h(SelectField, {
9485
- value,
9486
- options: ENV_OPTIONS,
9487
- onChange: setValue,
9488
- ...variant === void 0 ? {} : { variant },
9489
- label: variant === "ghost" ? void 0 : "环境",
9490
- hint: variant === "ghost" ? void 0 : "展开后锚点换成搜索框,↑↓ 走游标"
9491
- });
9492
- }
9493
- function SelectRichDemo() {
9494
- const [value, setValue] = useState("ali-prod");
9495
- const [added, setAdded] = useState(0);
9496
- return /* @__PURE__ */ h(SelectField, {
9497
- value,
9498
- options: CLOUD_OPTIONS,
9499
- onChange: setValue,
9500
- label: "集群",
9501
- hint: added === 0 ? "试试点页脚那颗「新建集群…」" : `页脚接过 ${added} 次`,
9502
- searchLabel: "搜集群",
9503
- searchPlaceholder: "搜名字或别名…",
9504
- emptyText: (query) => `没有匹配「${query}」的集群`,
9505
- footer: {
9506
- label: "新建集群…",
9507
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 14 })
9508
- },
9509
- onFooter: () => setAdded((count) => count + 1)
9510
- });
9511
- }
9512
- function SelectStateDemo() {
9513
- const [manual, setManual] = useState("手填的环境名");
9514
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(SelectField, {
9515
- value: "prod",
9516
- options: ENV_OPTIONS,
9517
- onChange: () => {},
9518
- disabled: true,
9519
- label: "禁用"
9520
- }), /* @__PURE__ */ h(SelectField, {
9521
- value: "",
9522
- options: [],
9523
- onChange: () => {},
9524
- loading: true,
9525
- loadingText: "正在读环境…",
9526
- label: "加载中"
9527
- }), /* @__PURE__ */ h(SelectField, {
9528
- value: "",
9529
- options: [],
9530
- onChange: () => {},
9531
- fallback: {
9532
- value: manual,
9533
- onChange: setManual
9534
- },
9535
- label: "名单读不到 → 退化成手填"
9536
- }));
9537
- }
9538
- function AppearanceDemo() {
9539
- const [value, setValue] = useState("medium");
9540
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(SelectField, {
9541
- value,
9542
- options: CHOICES,
9543
- onChange: setValue,
9544
- variant: "ghost",
9545
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutlineRegular, { size: 16 }),
9546
- ariaLabel: "尺寸",
9547
- title: "无边框变体:图标 + 当前值 + 箭头"
9548
- }), /* @__PURE__ */ h(SelectField, {
9549
- value,
9550
- options: CHOICES,
9551
- onChange: setValue,
9552
- selection: "check",
9553
- label: "selection=check(打勾那一种)"
9554
- }));
9555
- }
9556
- function ChoiceDemo() {
9557
- const [single, setSingle] = useState("medium");
9558
- const [many, setMany] = useState(["small", "large"]);
9559
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(ChoiceGroup, {
9560
- label: "尺寸",
9561
- name: "kit-size",
9562
- options: CHOICES,
9563
- value: single,
9564
- onChange: setSingle
9565
- }), /* @__PURE__ */ h(ChoiceGroup, {
9566
- label: "多选",
9567
- name: "kit-many",
9568
- options: CHOICES,
9569
- multi: true,
9570
- values: many,
9571
- onChange: setMany
9572
- }), /* @__PURE__ */ h(ChoiceGroup, {
9573
- label: "禁用",
9574
- name: "kit-off",
9575
- options: CHOICES,
9576
- value: "small",
9577
- onChange: () => {},
9578
- disabled: true
9579
- }));
9580
- }
9581
- function SaveBarDemo() {
9582
- const [busy, setBusy] = useState(false);
9583
- return /* @__PURE__ */ h(SaveBar, {
9584
- busy,
9585
- labels: {
9586
- cancel: "取消",
9587
- save: "保存",
9588
- saving: "保存中…"
9589
- },
9590
- onCancel: () => setBusy(false),
9591
- onSave: () => setBusy(true)
9592
- });
9593
- }
9594
- function LinkDemo() {
9595
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.inline }, /* @__PURE__ */ h(Link, {
9596
- href: "https://example.com/report",
9597
- title: "外部链接:新窗口打开"
9598
- }, "外部报告"), /* @__PURE__ */ h(Link, {
9599
- href: "#kit-preview",
9600
- external: false
9601
- }, "站内锚点"));
9602
- }
9603
- //#endregion
9604
- //#region src/app/layouts/rightbar/kit-preview-frame.tsx
9605
- function Section({ title, note, children }) {
9606
- 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);
9607
- }
9608
- function Grid({ children }) {
9609
- return /* @__PURE__ */ h("div", { className: kit_preview_module_default.cells }, children);
9610
- }
9611
- function Cell({ label, wide, children }) {
9612
- 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);
9613
- }
9614
- //#endregion
9615
- //#region src/app/layouts/rightbar/kit-preview-rows.tsx
9616
- function RowsSection() {
9617
- return /* @__PURE__ */ h(Section, {
9618
- title: "行与分组",
9619
- note: "Rows / Row 是键值行;Stack 只管间距;SettingsSection 是设置页那一节"
9620
- }, /* @__PURE__ */ h(Grid, null, /* @__PURE__ */ h(Cell, { label: "Rows + Row" }, /* @__PURE__ */ h(Rows, null, /* @__PURE__ */ h(Row, {
9621
- label: "环境",
9622
- value: "生产"
9623
- }), /* @__PURE__ */ h(Row, {
9624
- label: "集群",
9625
- value: "ali-prod"
9626
- }), /* @__PURE__ */ h(Row, {
9627
- label: "指纹",
9628
- value: "a1b2c3d4"
9629
- }))), /* @__PURE__ */ h(Cell, { label: "Stack(只管间距)" }, /* @__PURE__ */ h(Stack, null, /* @__PURE__ */ h(Note, null, "第一行说明:默认 muted。"), /* @__PURE__ */ h(Note, { tone: "problem" }, "第二行是个问题:tone=problem。"))), /* @__PURE__ */ h(Cell, {
9630
- label: "SettingsSection(设置页那一节)",
9631
- wide: true
9632
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.bound }, /* @__PURE__ */ h(SettingsSection, {
9633
- label: "面板",
9634
- title: "显示"
9635
- }, /* @__PURE__ */ h(Rows, null, /* @__PURE__ */ h(Row, {
9636
- label: "每页条数",
9637
- value: "20"
9638
- }), /* @__PURE__ */ h(Row, {
9639
- label: "自动刷新",
9640
- value: "开"
9641
- })))))));
9642
- }
9643
- function ActivitySection() {
9644
- return /* @__PURE__ */ h(Section, {
9645
- title: "活动流",
9646
- note: "ActivityBlock / ActivityLine / ActivityAction:一行一个动作,右边是时间与按钮"
9647
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.panel }, /* @__PURE__ */ h(ActivityBlock, { head: "今天的动作" }, /* @__PURE__ */ h(ActivityLine, {
9648
- dot: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9649
- state: "done",
9650
- size: 10
9651
- }),
9652
- text: "读了构建列表",
9653
- at: "2 分钟前"
9654
- }), /* @__PURE__ */ h(ActivityLine, {
9655
- dot: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9656
- state: "ongoing",
9657
- size: 10
9658
- }),
9659
- text: "正在发布",
9660
- at: "刚刚",
9661
- actions: /* @__PURE__ */ h(ActivityAction, {
9662
- label: "看日志",
9663
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconCodeOutlineRegular, { size: 14 }),
9664
- onClick: () => {}
9665
- })
9666
- }), /* @__PURE__ */ h(ActivityLine, {
9667
- dot: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9668
- state: "error",
9669
- size: 10
9670
- }),
9671
- text: "发布失败",
9672
- at: "1 小时前",
9673
- actions: /* @__PURE__ */ h(ActivityAction, {
9674
- label: "重试",
9675
- hint: "失败的那次再跑一遍",
9676
- icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconRefreshOutlineRegular, { size: 14 }),
9677
- failed: true,
9678
- onClick: () => {}
9679
- })
9680
- }))));
9681
- }
9682
- function LongTaskSection() {
9683
- return /* @__PURE__ */ h(Section, {
9684
- title: "长任务那一行",
9685
- note: "四种状态:跑着 / 要登录 / 好了 / 失败(带步骤与原文)"
9686
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.stack }, /* @__PURE__ */ h(LongTaskRow, {
9687
- status: "running",
9688
- headline: "正在发布(2/3)",
9689
- stepsTitle: "步骤",
9690
- steps: [
9691
- "拉代码",
9692
- "构建",
9693
- "发布"
9694
- ]
9695
- }), /* @__PURE__ */ h(LongTaskRow, {
9696
- status: "needs-login",
9697
- headline: "要登录腾讯云",
9698
- problem: "凭证过期了"
9699
- }), /* @__PURE__ */ h(LongTaskRow, {
9700
- status: "ok",
9701
- headline: "发布完成",
9702
- rawTitle: "原文",
9703
- raw: "ok · 12.4s",
9704
- copyLabel: "复制",
9705
- copiedLabel: "复制好了",
9706
- links: [{
9707
- href: "https://example.com/log",
9708
- text: "日志"
9709
- }]
9710
- }), /* @__PURE__ */ h(LongTaskRow, {
9711
- status: "failed",
9712
- headline: "发布失败",
9713
- problem: "站点回的是 HTTP 403"
9714
- })));
9715
- }
9716
- function IconSection() {
9717
- return /* @__PURE__ */ h(Section, {
9718
- title: "外壳自己的图标",
9719
- note: "dsh 那一套 Icon*Regular 直接从原语拿,这几个是外壳自己画的"
9720
- }, /* @__PURE__ */ h(Grid, null, [
9721
- {
9722
- label: "IconBrandMark",
9723
- node: /* @__PURE__ */ h(IconBrandMark, { size: 20 })
9724
- },
9725
- {
9726
- label: "IconModuleMark",
9727
- node: /* @__PURE__ */ h(IconModuleMark, { size: 20 })
9728
- },
9729
- {
9730
- label: "IconModules",
9731
- node: /* @__PURE__ */ h(IconModules, { size: 16 })
9732
- },
9733
- {
9734
- label: "IconPanelScreen",
9735
- node: /* @__PURE__ */ h(IconPanelScreen, { size: 16 })
9736
- },
9737
- {
9738
- label: "IconOpencli",
9739
- node: /* @__PURE__ */ h(IconOpencli, { size: 16 })
9740
- },
9741
- {
9742
- label: "IconNpm",
9743
- node: /* @__PURE__ */ h(IconNpm, { size: 16 })
9744
- }
9745
- ].map((one) => /* @__PURE__ */ h(Cell, {
9746
- key: one.label,
9747
- label: one.label
9748
- }, /* @__PURE__ */ h("span", { className: kit_preview_module_default.panel }, one.node)))));
9749
- }
9750
- function StripSection() {
9751
- const [index, setIndex] = useState(0);
9752
- return /* @__PURE__ */ h(Section, {
9753
- title: "夹具条",
9754
- note: "MockStrip:只在 ?wbMock=1 下出现的那条,自己也可以摆出来"
9755
- }, /* @__PURE__ */ h(MockStrip, {
9756
- note: "这是夹具条本身:点一下就换一个形状",
9757
- index,
9758
- onPick: setIndex,
9759
- mocks: [
9760
- {
9761
- id: "one",
9762
- label: "一张卡"
9763
- },
9764
- {
9765
- id: "two",
9766
- label: "两张卡"
9767
- },
9768
- {
9769
- id: "eight",
9770
- label: "八张卡"
9771
- }
9772
- ]
9773
- }));
9774
- }
9775
- //#endregion
9776
- //#region src/app/layouts/rightbar/kit-preview.tsx
9777
- function SelectSection() {
9778
- return /* @__PURE__ */ h(Section, {
9779
- title: "下拉选择 SelectField",
9780
- note: "默认是常规下拉框;无边框那档要显式给 variant=ghost。展开后锚点换成搜索框,↑↓ 走游标、Enter 选中、Esc / 外点关掉"
9781
- }, /* @__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, {
9782
- label: "图标 + 当前值(无边框)与 selection=check",
9783
- wide: true
9784
- }, /* @__PURE__ */ h(AppearanceDemo, null))));
9785
- }
9786
- function FormsSection() {
9787
- return /* @__PURE__ */ h(Section, {
9788
- title: "输入与本机选择",
9789
- note: "TextField 的三个态、ChoiceGroup 的单选 / 多选 / 禁用、SaveBar、Link"
9790
- }, /* @__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))));
9791
- }
9792
- function CardSection({ t }) {
9793
- return /* @__PURE__ */ h(Section, {
9794
- title: "卡片与卡头",
9795
- note: "模块卡片自己渲染 Card;外壳只在外层套 CardAnchor(display: contents)与 CardBoundary(崩了才看得见)"
9796
- }, /* @__PURE__ */ h(Grid, null, /* @__PURE__ */ h(Cell, {
9797
- label: "Card(整张卡)",
9798
- wide: true
9799
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.bound }, /* @__PURE__ */ h(Card, {
9800
- t,
9801
- title: "示例卡片",
9802
- meta: "夹具",
9803
- refreshing: false,
9804
- onRefresh: () => {}
9805
- }, /* @__PURE__ */ h(Note, null, "卡身里放什么都行:这张预览卡自己就是个例子。")))), /* @__PURE__ */ h(Cell, {
9806
- label: "CardHead(带齿轮与平台跳转)",
9807
- wide: true
9808
- }, /* @__PURE__ */ h("div", { className: kit_preview_module_default.bound }, /* @__PURE__ */ h(CardHead, {
9809
- t,
9810
- title: "卡头",
9811
- meta: "3 分钟前",
9812
- refreshing: false,
9813
- onRefresh: () => {},
9814
- gear: "面板设置",
9815
- gearOpen: true,
9816
- onToggleGear: () => {},
9817
- platform: "打开平台",
9818
- platformTitle: "去平台上看看",
9819
- platformHref: "https://example.com/panel"
9820
- })))));
9821
- }
9822
- function StateSection() {
9823
- return /* @__PURE__ */ h(Section, {
9824
- title: "状态与提示",
9825
- note: "Note / StateBlock / CenteredState / EmptyState / SkeletonRows:卡里那几种“没东西可看”的说法"
9826
- }, /* @__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, {
9827
- dot: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
9828
- state: "ongoing",
9829
- size: 10
9830
- }),
9831
- title: "正在读",
9832
- hint: "读回来之前这一块先这么说",
9833
- resolving: "还剩 3 秒"
9834
- }, /* @__PURE__ */ h(SkeletonRows, { rows: 3 }))), /* @__PURE__ */ h(Cell, { label: "CenteredState(大图标 / 紧凑)" }, /* @__PURE__ */ h(CenteredState, {
9835
- icon: /* @__PURE__ */ h(IconPanelScreen, { size: 32 }),
9836
- title: "这块还没接上",
9837
- hint: "接上之后这里会有数据",
9838
- action: /* @__PURE__ */ h(Note, null, "动作用 Note 或 Button 都行")
9839
- }), /* @__PURE__ */ h(CenteredState, {
9840
- compact: true,
9841
- icon: /* @__PURE__ */ h(IconModules, { size: 20 }),
9842
- title: "紧凑的那一档"
9843
- })), /* @__PURE__ */ h(Cell, { label: "EmptyState 与 SkeletonRows" }, /* @__PURE__ */ h(EmptyState, {
9844
- text: "一条都还没有",
9845
- icon: /* @__PURE__ */ h(IconBrandMark, { size: 20 })
9846
- }), /* @__PURE__ */ h(SkeletonRows, { rows: 2 }))));
9847
- }
9848
- function KitPreview({ t }) {
9849
- return /* @__PURE__ */ h(Card, {
9850
- t,
9851
- title: "公共组件预览",
9852
- meta: "夹具 · 只在 ?wbMock=1 下摆出来",
9853
- refreshing: false,
9854
- onRefresh: () => {}
9855
- }, /* @__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)));
9856
- }
9857
- var KIT_PREVIEW_MODULE = {
9858
- id: "wb-kit-preview",
9859
- titleKey: "组件预览",
9860
- order: 999,
9861
- View: KitPreview
9862
- };
9863
- //#endregion
9864
7556
  //#region src/app/layouts/rightbar/board-plan.ts
9865
7557
  function planBoard(shape, real, all) {
9866
7558
  if (shape.kind === "real") return {
@@ -9884,15 +7576,18 @@ window.__ModuleLoader__.load({
9884
7576
  reading: true,
9885
7577
  repeated: false
9886
7578
  };
9887
- if (shape.kind === "kit") return {
9888
- modules: [{
9889
- key: KIT_PREVIEW_MODULE.id,
9890
- module: KIT_PREVIEW_MODULE
9891
- }],
9892
- empty: false,
9893
- reading: false,
9894
- repeated: false
9895
- };
7579
+ if (shape.kind === "kit") {
7580
+ const kit = devSurface.kitModule;
7581
+ return {
7582
+ modules: kit === null ? [] : [{
7583
+ key: kit.id,
7584
+ module: kit
7585
+ }],
7586
+ empty: false,
7587
+ reading: false,
7588
+ repeated: false
7589
+ };
7590
+ }
9896
7591
  if (shape.kind === "all") return {
9897
7592
  modules: all.map((module) => ({
9898
7593
  key: module.id,
@@ -10072,12 +7767,16 @@ window.__ModuleLoader__.load({
10072
7767
  const panelBoard = useEnabledUnits(panelToken, boardWorkspace);
10073
7768
  const enabledUnits = panelBoard?.units ?? null;
10074
7769
  const [modulesOpen, setModulesOpen] = useState(false);
10075
- const fixtures = useBoardMock(fixtureRoster(manifests));
7770
+ const devBoard = devSurface.useBoard({
7771
+ manifests,
7772
+ all: modules.all(),
7773
+ search: window.location.search
7774
+ });
10076
7775
  const visibleModules = selectBoardModules(enabledUnits, (id) => modules.byId(id), capabilities);
10077
- const plan = planBoard(fixtures.shape, {
7776
+ const plan = planBoard(devBoard.shape, {
10078
7777
  modules: visibleModules,
10079
7778
  configRead: panelBoard !== null
10080
- }, fixtureSeed(manifests, modules.all(), crashModeOn(window.location.search)));
7779
+ }, devBoard.seed);
10081
7780
  const world = createSuiteWorld({
10082
7781
  workspaces,
10083
7782
  sessions,
@@ -10099,7 +7798,7 @@ window.__ModuleLoader__.load({
10099
7798
  reason
10100
7799
  });
10101
7800
  }, []);
10102
- const fixtureMode = mockModeOn(window.location.search) || crashModeOn(window.location.search);
7801
+ const fixtureMode = devBoard.mode;
10103
7802
  useEffect(() => {
10104
7803
  setPanelWorkspace(fixtureMode ? null : boardWorkspace);
10105
7804
  }, [boardWorkspace, fixtureMode]);
@@ -10153,10 +7852,7 @@ window.__ModuleLoader__.load({
10153
7852
  refreshToken: panelToken,
10154
7853
  onOpenMarket: openMarket,
10155
7854
  onCollapse: props.toggleRightbar
10156
- }), /* @__PURE__ */ h(BoardMockStrip, {
10157
- fixtures,
10158
- show: top.kind === "board"
10159
- }), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-fixtureMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
7855
+ }), devBoard.strip(top.kind === "board"), /* @__PURE__ */ h("div", { className: `wb-panelBody${plan.repeated ? " wb-panelMany" : ""}` }, /* @__PURE__ */ h(BoardContent, {
10160
7856
  top,
10161
7857
  plan,
10162
7858
  world,
@@ -10957,7 +8653,7 @@ window.__ModuleLoader__.load({
10957
8653
  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";
10958
8654
  //#endregion
10959
8655
  //#region src/shared/styles/chrome.css?raw
10960
- 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 }}";
8656
+ 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 }}";
10961
8657
  //#endregion
10962
8658
  //#region src/shared/styles/board.css?raw
10963
8659
  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";
@@ -11177,11 +8873,9 @@ window.__ModuleLoader__.load({
11177
8873
  hooks: {
11178
8874
  ...use_api_resource_exports,
11179
8875
  ...use_card_summary_exports,
11180
- ...use_fixture_pick_exports,
11181
8876
  ...use_facts_exports,
11182
8877
  ...use_host_write_exports,
11183
8878
  ...use_long_task_exports,
11184
- ...mock_mode_exports,
11185
8879
  ...use_capability_gate_exports,
11186
8880
  ...use_unit_board_exports,
11187
8881
  ...use_visible_busy_exports
@@ -11196,7 +8890,6 @@ window.__ModuleLoader__.load({
11196
8890
  ...dist_exports,
11197
8891
  ...dist_exports,
11198
8892
  ...dist_exports,
11199
- ...dist_exports,
11200
8893
  Tip
11201
8894
  },
11202
8895
  api: {
@@ -11214,7 +8907,7 @@ window.__ModuleLoader__.load({
11214
8907
  ...face.messages === void 0 ? {} : { messages: face.messages }
11215
8908
  }));
11216
8909
  }
11217
- 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*/";
8910
+ 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*/";
11218
8911
  function workbenchCss() {
11219
8912
  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}`;
11220
8913
  }