dsh-plugin-shop 0.7.0 → 0.7.1-beta.1

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/lib/client.js CHANGED
@@ -4347,7 +4347,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4347
4347
  literal("denied"),
4348
4348
  literal("version-mismatch"),
4349
4349
  literal("needs-acknowledgement"),
4350
- literal("git-missing"),
4351
4350
  literal("tarball-integrity")
4352
4351
  ]),
4353
4352
  "detail": string()
@@ -4437,7 +4436,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4437
4436
  },
4438
4437
  sourceLocation: {
4439
4438
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4440
- "line": 568,
4439
+ "line": 574,
4441
4440
  "column": 9
4442
4441
  }
4443
4442
  },
@@ -4455,7 +4454,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4455
4454
  },
4456
4455
  sourceLocation: {
4457
4456
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4458
- "line": 748,
4457
+ "line": 759,
4459
4458
  "column": 9
4460
4459
  }
4461
4460
  },
@@ -4483,7 +4482,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4483
4482
  },
4484
4483
  sourceLocation: {
4485
4484
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4486
- "line": 618,
4485
+ "line": 624,
4487
4486
  "column": 9
4488
4487
  }
4489
4488
  },
@@ -4510,7 +4509,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4510
4509
  },
4511
4510
  sourceLocation: {
4512
4511
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4513
- "line": 737,
4512
+ "line": 748,
4514
4513
  "column": 3
4515
4514
  }
4516
4515
  },
@@ -4528,7 +4527,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4528
4527
  },
4529
4528
  sourceLocation: {
4530
4529
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4531
- "line": 898,
4530
+ "line": 909,
4532
4531
  "column": 9
4533
4532
  }
4534
4533
  },
@@ -4583,7 +4582,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4583
4582
  },
4584
4583
  sourceLocation: {
4585
4584
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4586
- "line": 840,
4585
+ "line": 851,
4587
4586
  "column": 9
4588
4587
  }
4589
4588
  },
@@ -4610,7 +4609,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4610
4609
  },
4611
4610
  sourceLocation: {
4612
4611
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4613
- "line": 958,
4612
+ "line": 977,
4614
4613
  "column": 9
4615
4614
  }
4616
4615
  },
@@ -4628,7 +4627,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4628
4627
  },
4629
4628
  sourceLocation: {
4630
4629
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4631
- "line": 942,
4630
+ "line": 960,
4632
4631
  "column": 9
4633
4632
  }
4634
4633
  }
@@ -4676,7 +4675,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4676
4675
  case "not-in-catalog": return "notInCatalogCode";
4677
4676
  case "version-mismatch": return "versionMismatchCode";
4678
4677
  case "needs-acknowledgement": return "needsAcknowledgementCode";
4679
- case "git-missing": return "gitMissingCode";
4680
4678
  case "tarball-integrity": return "tarballIntegrityCode";
4681
4679
  }
4682
4680
  }
@@ -4967,7 +4965,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4967
4965
  categoryUi: "界面",
4968
4966
  categoryWorkflow: "工作流",
4969
4967
  categoryIntegration: "集成",
4970
- categoryTheme: "主题与外观",
4968
+ categoryTheme: "主题",
4971
4969
  categoryOther: "其他",
4972
4970
  empty: "目录中暂无插件。",
4973
4971
  emptySearch: "没有匹配的插件。",
@@ -5008,7 +5006,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5008
5006
  notInCatalogCode: "不在目录中",
5009
5007
  versionMismatchCode: "版本不匹配",
5010
5008
  needsAcknowledgementCode: "需要确认",
5011
- gitMissingCode: "缺少 git",
5012
5009
  tarballIntegrityCode: "压缩包完整性校验失败",
5013
5010
  npmSource: "npm 包",
5014
5011
  githubSource: "源码在 GitHub",
@@ -5056,7 +5053,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5056
5053
  categoryUi: "UI",
5057
5054
  categoryWorkflow: "Workflow",
5058
5055
  categoryIntegration: "Integration",
5059
- categoryTheme: "Themes & appearance",
5056
+ categoryTheme: "Themes",
5060
5057
  categoryOther: "Other",
5061
5058
  empty: "No plugins in the catalog.",
5062
5059
  emptySearch: "No matching plugins.",
@@ -5097,7 +5094,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5097
5094
  notInCatalogCode: "Not in the catalog",
5098
5095
  versionMismatchCode: "Version mismatch",
5099
5096
  needsAcknowledgementCode: "Acknowledgement required",
5100
- gitMissingCode: "git missing",
5101
5097
  tarballIntegrityCode: "tarball integrity check failed",
5102
5098
  npmSource: "npm package",
5103
5099
  githubSource: "source on GitHub",
@@ -5278,108 +5274,108 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5278
5274
  };
5279
5275
  }
5280
5276
  //#endregion
5281
- //#region \0dsh-plugin-shop-css:e3675a89
5282
- const css = "/* Shop tab styles — a market shelf inside the settings surface. The visual\n * language is the dsh theme's alias tokens ONLY (the four tokens the previous\n * styles referenced that do not exist — bg-layer-3, interactive-bg-hover,\n * state-error, state-success — are corrected to bg-layer-2 and the\n * state-*-primary set). The signature is the category spine: one HUE per\n * category (seven fixed hues, not the brand token — the brand resolves to\n * near-black in the light theme, so seven brand opacities read as seven\n * shades of gray), with the category name as the cover label in the same hue. Class names are mapped to content-derived names at bundle time\n * (tsdown.s8583e3_client.s942a79_config.s5f67aa_ts) and stubbed in tests; only the keys are relied\n * on.\n *\n * One token rule the theme forces: the background LAYERS do not carry\n * contrast. In the light theme bg-base, bg-layer-1, bg-layer-2 and\n * bg-layer-3 all resolve to the same white; only the dark theme spreads them\n * (950/875/850/800). So a layer-2 fill on a layer-1 ground is invisible for\n * half of all users, and anything whose fill is its ONLY affordance — the\n * loading skeleton, the borderless capability chips — derives its fill from\n * label-primary instead, which inverts with the theme by construction.\n * Elements that also carry a border or text may keep a layer fill.\n * `css-tokens.s8583e3_client.sfd9d8a_spec.s5f67aa_ts` pins this. */\n\n.s255e5a_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel. */\n overflow-x: hidden;\n}\n\n.s44a3ec_stateLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* Visually hidden but screen-reader readable (the loading copy while the\n * skeleton stands in visually). */\n.s3a0ece_srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n overflow: hidden;\n white-space: nowrap;\n}\n\n/* The loading shelf: ghost cards with the same geometry as the real grid, so\n * the swap to content is a same-shape handoff instead of a jump. */\n.se0c3b4_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.s520416_skeletonCard {\n position: relative;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n}\n\n/* The shimmer sweep: one gradient band travels across each ghost card while\n * the bars breathe, so the loading state reads as \"the shelf is scanning\". */\n.s520416_skeletonCard::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent) 50%,\n transparent 75%\n );\n transform: translateX(-100%);\n animation: dshShopSkeletonSweep 1.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n@keyframes dshShopSkeletonSweep {\n to { transform: translateX(100%); }\n}\n\n.s8c7d6f_skeletonName {\n width: 55%;\n height: 14px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sf5179e_skeletonSummary {\n width: 92%;\n height: 12px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sbb0d25_skeletonSummaryShort {\n width: 68%;\n height: 12px;\n margin: 6px 12px 10px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n/* The ghost of the action line, right where the real buttons land. */\n.s96e910_skeletonActions {\n display: block;\n width: 84px;\n height: 24px;\n margin: 0 12px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s520416_skeletonCard span {\n animation: dshShopSkeletonPulse 1.6s ease-in-out infinite;\n}\n\n@keyframes dshShopSkeletonPulse {\n 0%, 100% { opacity: 0.5; }\n 50% { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s520416_skeletonCard span { animation: none; opacity: 0.75; }\n .s520416_skeletonCard::after { content: none; }\n}\n\n.s73242a_actionButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s73242a_actionButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s73242a_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s646509_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.s745e3c_toolbarRight {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* The shop's own version, right of the search box: `v0.4.4`, plus the\n * update button when the version check found a newer release. */\n.s4fe61f_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sb9b924_versionText {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa04455_updateSelfButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.sa04455_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.sa04455_updateSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The on-demand re-check next to the version number: a quiet pill; the\n * border and text carry it in the light theme where bg layers are white. */\n.s614a38_checkUpdateButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s614a38_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.s614a38_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.s614a38_checkUpdateButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The project's GitHub mark, right of the version row: a quiet icon link.\n * The octocat carries itself — color shift on hover, no text, no border. */\n.sa987f7_githubLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px;\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa987f7_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.sa987f7_githubLink:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The self-update's expanded states (running log / done + restart /\n * failure detail) sit under the toolbar, above the category bar. */\n.sb81ba5_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.s232ec4_searchInput {\n width: min(280px, 100%);\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n.s232ec4_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s1555aa_staleBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s3946f1_staleBadge {\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n color: var(--dsw-alias-state-warn-primary);\n font-size: 12px;\n}\n\n.sb2c859_categoryBar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s26d58e_categoryButton {\n padding: 3px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s26d58e_categoryButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s5f68c4_categoryButtonOn {\n border-color: var(--dsw-alias-brand-primary);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-weight: 600;\n}\n\n.s26d58e_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s668774_catalogHeading {\n margin: 2px 0 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-primary);\n}\n\n.sccc4d1_catalogStats {\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s6de1ab_emptyLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* The shelf: a responsive grid of cards. */\n/* Single-line rows: one full-width column, one plugin per line. */\n.sf657f5_cards {\n display: grid;\n grid-template-columns: 1fr;\n max-width: 100%;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n animation: dshShopCardsIn 220ms ease;\n}\n\n@keyframes dshShopCardsIn {\n from { opacity: 0; transform: translateY(3px); }\n to { opacity: 1; transform: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sf657f5_cards { animation: none; }\n}\n\n.s65f383_card {\n position: relative;\n display: flex;\n flex-direction: column;\n /* A grid item's min-width is auto by default: its content would widen the\n * 1fr track past the panel and overflow horizontally. */\n min-width: 0;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n transition: border-color 120ms ease, transform 120ms ease, box-shadow 120ms ease;\n /* Off-screen cards skip layout and paint; the placeholder keeps scrollbar\n * estimation sane before the browser has measured the real height. */\n content-visibility: auto;\n contain-intrinsic-size: auto 140px;\n}\n\n/* The sentinel that triggers the next shelf batch: zero visual footprint. */\n.sd7ee01_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s705cc6_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s65f383_card:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l1));\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s65f383_card { transition: none; }\n .s65f383_card:hover { transform: none; }\n}\n\n/* The signature: a spine and cover in the category's own hue. The hues are\n * fixed mid-bright colors that read on both themes; `other` deliberately\n * stays a neutral gray so the fallback category does not compete. */\n.s4ce25d_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--spine-hue, #8B8E96);\n}\n\n.s65f383_card[data-category='tool'] { --spine-hue: #4C8DFF; }\n.s65f383_card[data-category='provider'] { --spine-hue: #A78BFA; }\n.s65f383_card[data-category='ui'] { --spine-hue: #2DD4BF; }\n.s65f383_card[data-category='workflow'] { --spine-hue: #F59E0B; }\n.s65f383_card[data-category='integration'] { --spine-hue: #34D399; }\n.s65f383_card[data-category='theme'] { --spine-hue: #F472B6; }\n.s65f383_card[data-category='other'] { --spine-hue: #8B8E96; }\n\n/* The category sits in the badge row as a quiet chip in the category's own\n * hue — the border carries it where the light theme's white layers cannot\n * (the same lesson as the check button). */\n.s9c8eaa_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--spine-hue, #8B8E96) 45%, transparent);\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--spine-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.sa97234_entryHeader {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding: 8px 12px 2px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.sa97234_entryHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n/* The name fills the row and truncates rather than wraps; the badges stay\n * intact beside it. */\n.sc3f149_name {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n flex: 1 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--dsw-alias-label-primary);\n}\n\n.s513026_badges {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* The action line: buttons side by side; an active install/uninstall flow\n * (gate, log, notices) takes the full width below them. */\n.s9b5048_cardActions {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 10px;\n}\n\n.s9b5048_cardActions > .sc4f2ac_gate,\n.s9b5048_cardActions > .s4d374c_installPanel,\n.s9b5048_cardActions > .sf53ca0_installedActions {\n flex-basis: 100%;\n}\n\n/* The entry's version, always visible on the card (the expanded detail\n * repeats it in the version row) — the same quiet mono as the toolbar. */\n.sc6ec6e_cardVersion {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The octocat marking a github-sourced entry, beside its short commit. */\n.s71f10f_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s5e82cb_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.s5e82cb_tierBadge[data-tier='verified'] {\n color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);\n}\n\n.s5e82cb_tierBadge[data-tier='verified-stale'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.s5e82cb_tierBadge[data-tier='community'] {\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n border: 1px solid var(--dsw-alias-border-l2);\n}\n\n.s4bbe02_incompatibleBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.sff43b4_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s73f7fb_chevron, .s61393c_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s61393c_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .s73f7fb_chevron, .s61393c_chevronOpen { transition: none; }\n}\n\n.s820ebf_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.sb8fbc8_summary {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.se507db_summaryZh {\n margin: -4px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Expanded cards show the full summary: the clamp is lifted, never raised —\n * a higher number would still truncate the author's text, just later. */\n.s10baf0_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.sb9dba9_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s6eca19_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s9d2029_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s3bdbd5_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s441702_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s441702_capabilities li {\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sde3f0c_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.se98179_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.sfb4d2f_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.sfb4d2f_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.sfb4d2f_detailRow dd {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n text-align: right;\n color: var(--dsw-alias-label-primary);\n}\n\n.sfb4d2f_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.sfb4d2f_detailRow a:hover {\n text-decoration: underline;\n}\n\n.sfb4d2f_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The publishing account, beside the npm link. Secondary label colour and a\n * middot separator carry the distinction — never a background fill, which is\n * invisible in the light theme where every bg-layer token is the same white. */\n/* Who published the entry, at the right edge of the action row. `margin-left:\n * auto` is what pushes it there; the row is a wrapping flex, so an active\n * install flow (which claims the full width) drops this to the next line\n * rather than squeezing it. */\n.s1ff66f_author {\n margin-left: auto;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.sd58c6d_reviewedLine {\n margin: 8px 0 0;\n padding: 6px 8px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n font-size: 12px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n/* Install flow. */\n.s4d374c_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.se7aaed_installButton, .sb43a49_confirmButton, .s6e45d1_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.se7aaed_installButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.se7aaed_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.sb43a49_confirmButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.sb43a49_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s6e45d1_cancelButton {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n\n.s6e45d1_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.se7aaed_installButton:focus-visible, .sb43a49_confirmButton:focus-visible, .s6e45d1_cancelButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The shelf card of a plugin that is installed and current carries this\n * non-interactive label instead of an install button. Border + text do the\n * work in the light theme, where every bg-layer token resolves to white. */\n.sb6fc74_installedLabel {\n align-self: flex-start;\n margin: 0;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n/* An installed card's controls: the installed label or the update button,\n * plus the uninstall button. The install panel's running/failed states are\n * column layouts and sit as one item of this row. */\n.sf53ca0_installedActions {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Uninstall revokes privilege; the quiet outline keeps it from competing\n * with the primary action, and the error tint says \"removes\". */\n.s96967f_uninstallButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 55%, transparent);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s96967f_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.s96967f_uninstallButton:focus-visible {\n outline: 2px solid var(--dsw-alias-state-error-primary);\n outline-offset: 1px;\n}\n\n/* The restart dsh button on a done install: quiet outline, same rank as\n * the other secondary actions. */\n.s6ac237_restartButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s6ac237_restartButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s6ac237_restartButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sc4f2ac_gate {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: 8px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n.s559c38_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s3c0ace_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sc323e5_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s4b2373_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.s52b5a5_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s64ab71_log {\n max-height: 160px;\n overflow: auto;\n margin: 0;\n padding: 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n list-style: none;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n\n.s1531a8_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sf20dda_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.seb9b08_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.sfd3021_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.s50ba35_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.se75489_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* Installed section. */\n.sa276cf_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.sceae6e_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s8d2072_outdatedRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.s5c2545_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s5c2545_outdatedInfo strong {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n word-break: break-all;\n color: var(--dsw-alias-label-primary);\n}\n\n.s877c68_outdatedVersions {\n /* Two inline labels with nothing between them in the markup ran together as\n * `installed v1.0.0latest v2.0.0`: JSX drops the whitespace-only line, and\n * the per-label class the markup asked for was never defined (singular\n * against this rule's plural). The container owns the gap, the same idiom\n * as .s513026_badges — the labels need no class of their own. */\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa1f556_outdatedActions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* The enable/disable switch. */\n.s11c019_switch {\n position: relative;\n width: 32px;\n height: 18px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n}\n\n.s7580e8_switchOn {\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 55%, transparent);\n}\n\n.saab2b3_switchKnob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--dsw-alias-label-primary);\n transition: transform 120ms ease, background 120ms ease;\n}\n\n.s7580e8_switchOn .saab2b3_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.s11c019_switch:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s11c019_switch, .saab2b3_switchKnob { transition: none; }\n}\n\n/* The hot enable/disable switch on installed rows: the knob button plus the\n * §8 hot-apply / failure notices rendered beside it. */\n.sd9f9e4_switchWrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n";
5283
- if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"e3675a89\"]")) {
5277
+ //#region \0dsh-plugin-shop-css:26093961
5278
+ const css = "/* Shop tab styles — a market shelf inside the settings surface. The visual\n * language is the dsh theme's alias tokens ONLY (the four tokens the previous\n * styles referenced that do not exist — bg-layer-3, interactive-bg-hover,\n * state-error, state-success — are corrected to bg-layer-2 and the\n * state-*-primary set). The signature is the category spine: one HUE per\n * category (seven fixed hues, not the brand token — the brand resolves to\n * near-black in the light theme, so seven brand opacities read as seven\n * shades of gray), with the category name as the cover label in the same hue. Class names are mapped to content-derived names at bundle time\n * (tsdown.sfae5fa_client.se9da7d_config.se722f1_ts) and stubbed in tests; only the keys are relied\n * on.\n *\n * One token rule the theme forces: the background LAYERS do not carry\n * contrast. In the light theme bg-base, bg-layer-1, bg-layer-2 and\n * bg-layer-3 all resolve to the same white; only the dark theme spreads them\n * (950/875/850/800). So a layer-2 fill on a layer-1 ground is invisible for\n * half of all users, and anything whose fill is its ONLY affordance — the\n * loading skeleton, the borderless capability chips — derives its fill from\n * label-primary instead, which inverts with the theme by construction.\n * Elements that also carry a border or text may keep a layer fill.\n * `css-tokens.sfae5fa_client.s2f7a8b_spec.se722f1_ts` pins this. */\n\n.s99b207_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel.\n *\n * `clip` rather than `hidden`, with a margin, because `.se23a0e_searchInput` sits\n * at exactly (0, 0) of this box — it is the first child of `.s27ad76_toolbar`,\n * itself the first child here, and this rule carries no padding — so its\n * focus ring paints ENTIRELY outside the panel. `hidden` clipped it at the\n * padding edge, and because the spec forbids one axis being `hidden` while\n * the other is `visible`, it silently promoted overflow-y to `auto` and\n * clipped the ring top and bottom as well; all that survived was a stray\n * arc on the right, where the 280px input stops short of the panel. `clip`\n * does not coerce the other axis, so overflow-y stays `visible`, and\n * `overflow-clip-margin` buys back the 3px the ring reaches sideways.\n * `hidden` stays as the first declaration, the fallback for engines\n * without `clip`; there the ring is clipped as before, never worse. */\n overflow-x: hidden;\n overflow-x: clip;\n overflow-clip-margin: 3px;\n}\n\n.s2abe0f_stateLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* Visually hidden but screen-reader readable (the loading copy while the\n * skeleton stands in visually). */\n.sfb85e5_srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n overflow: hidden;\n white-space: nowrap;\n}\n\n/* The loading shelf: ghost cards with the same geometry as the real grid, so\n * the swap to content is a same-shape handoff instead of a jump. */\n.s728a01_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.s33d002_skeletonCard {\n position: relative;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n}\n\n/* The shimmer sweep: one gradient band travels across each ghost card while\n * the bars breathe, so the loading state reads as \"the shelf is scanning\". */\n.s33d002_skeletonCard::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent) 50%,\n transparent 75%\n );\n transform: translateX(-100%);\n animation: dshShopSkeletonSweep 1.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n@keyframes dshShopSkeletonSweep {\n to { transform: translateX(100%); }\n}\n\n.s46e666_skeletonName {\n width: 55%;\n height: 14px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s2a467d_skeletonSummary {\n width: 92%;\n height: 12px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s232601_skeletonSummaryShort {\n width: 68%;\n height: 12px;\n margin: 6px 12px 10px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n/* The ghost of the action line, right where the real buttons land. */\n.sde9b0c_skeletonActions {\n display: block;\n width: 84px;\n height: 24px;\n margin: 0 12px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s33d002_skeletonCard span {\n animation: dshShopSkeletonPulse 1.6s ease-in-out infinite;\n}\n\n@keyframes dshShopSkeletonPulse {\n 0%, 100% { opacity: 0.5; }\n 50% { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s33d002_skeletonCard span { animation: none; opacity: 0.75; }\n .s33d002_skeletonCard::after { content: none; }\n}\n\n.sb632c0_actionButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.sb632c0_actionButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.sb632c0_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s27ad76_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.saba3c3_toolbarRight {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* The shop's own version, right of the search box: `v0.4.4`, plus the\n * update button when the version check found a newer release. */\n.s6736c0_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s2dff04_versionText {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s40b16e_updateSelfButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.s40b16e_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.s40b16e_updateSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The on-demand re-check next to the version number: a quiet pill; the\n * border and text carry it in the light theme where bg layers are white. */\n.secd6a2_checkUpdateButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.secd6a2_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.secd6a2_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.secd6a2_checkUpdateButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The project's GitHub mark, right of the version row: a quiet icon link.\n * The octocat carries itself — color shift on hover, no text, no border. */\n.s5e1ce3_githubLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px;\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s5e1ce3_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.s5e1ce3_githubLink:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The self-update's expanded states (running log / done + restart /\n * failure detail) sit under the toolbar, above the category bar. */\n.s798348_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.se23a0e_searchInput {\n width: min(280px, 100%);\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n.se23a0e_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s82b1d4_staleBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.see2588_staleBadge {\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n color: var(--dsw-alias-state-warn-primary);\n font-size: 12px;\n}\n\n.se67e0b_categoryBar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s8c06a0_categoryButton {\n padding: 3px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s8c06a0_categoryButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s65a55a_categoryButtonOn {\n border-color: var(--dsw-alias-brand-primary);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-weight: 600;\n}\n\n.s8c06a0_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sb6cdd6_catalogHeading {\n margin: 2px 0 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-primary);\n}\n\n.s38a33e_catalogStats {\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.se3ba96_emptyLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* The shelf: a responsive grid of cards. */\n/* Single-line rows: one full-width column, one plugin per line. */\n.sb41fe1_cards {\n display: grid;\n grid-template-columns: 1fr;\n max-width: 100%;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n animation: dshShopCardsIn 220ms ease;\n}\n\n@keyframes dshShopCardsIn {\n from { opacity: 0; transform: translateY(3px); }\n to { opacity: 1; transform: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sb41fe1_cards { animation: none; }\n}\n\n.sfcd584_card {\n position: relative;\n display: flex;\n flex-direction: column;\n /* A grid item's min-width is auto by default: its content would widen the\n * 1fr track past the panel and overflow horizontally. */\n min-width: 0;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n transition: border-color 120ms ease, transform 120ms ease, box-shadow 120ms ease;\n /* Off-screen cards skip layout and paint; the placeholder keeps scrollbar\n * estimation sane before the browser has measured the real height. */\n content-visibility: auto;\n contain-intrinsic-size: auto 140px;\n}\n\n/* The sentinel that triggers the next shelf batch: zero visual footprint. */\n.sf2d932_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s947694_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sfcd584_card:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l1));\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sfcd584_card { transition: none; }\n .sfcd584_card:hover { transform: none; }\n}\n\n/* The signature: a spine and cover in the category's own hue. The hues are\n * fixed mid-bright colors that read on both themes; `other` deliberately\n * stays a neutral gray so the fallback category does not compete. */\n.sfc4028_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--spine-hue, #8B8E96);\n}\n\n.sfcd584_card[data-category='tool'] { --spine-hue: #4C8DFF; }\n.sfcd584_card[data-category='provider'] { --spine-hue: #A78BFA; }\n.sfcd584_card[data-category='ui'] { --spine-hue: #2DD4BF; }\n.sfcd584_card[data-category='workflow'] { --spine-hue: #F59E0B; }\n.sfcd584_card[data-category='integration'] { --spine-hue: #34D399; }\n.sfcd584_card[data-category='theme'] { --spine-hue: #F472B6; }\n.sfcd584_card[data-category='other'] { --spine-hue: #8B8E96; }\n\n/* The category sits in the badge row as a quiet chip in the category's own\n * hue — the border carries it where the light theme's white layers cannot\n * (the same lesson as the check button). */\n.sb94610_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--spine-hue, #8B8E96) 45%, transparent);\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--spine-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.s50a94e_entryHeader {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding: 8px 12px 2px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.s50a94e_entryHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n/* The name fills the row and truncates rather than wraps; the badges stay\n * intact beside it. */\n.sfdbf47_name {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n flex: 1 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--dsw-alias-label-primary);\n}\n\n.s28e55e_badges {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* The action line: buttons side by side; an active install/uninstall flow\n * (gate, log, notices) takes the full width below them. */\n.s9359c0_cardActions {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 10px;\n}\n\n.s9359c0_cardActions > .s549462_gate,\n.s9359c0_cardActions > .s20fbe0_installPanel,\n.s9359c0_cardActions > .s94517f_installedActions {\n flex-basis: 100%;\n}\n\n/* The entry's version, always visible on the card (the expanded detail\n * repeats it in the version row) — the same quiet mono as the toolbar. */\n.sc54e24_cardVersion {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The octocat marking a github-sourced entry, beside its short commit. */\n.s623bee_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sf9a12c_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.sf9a12c_tierBadge[data-tier='verified'] {\n color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);\n}\n\n.sf9a12c_tierBadge[data-tier='verified-stale'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.sf9a12c_tierBadge[data-tier='community'] {\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n border: 1px solid var(--dsw-alias-border-l2);\n}\n\n.s671f97_incompatibleBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.s963e5c_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sbb5739_chevron, .s4e56e8_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s4e56e8_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .sbb5739_chevron, .s4e56e8_chevronOpen { transition: none; }\n}\n\n.sf9a60a_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.sfd2791_summary {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.s69ed84_summaryZh {\n margin: -4px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Expanded cards show the full summary: the clamp is lifted, never raised —\n * a higher number would still truncate the author's text, just later. */\n.s83c8c8_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s20b5b9_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s45793c_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s551fd2_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.sb1f0de_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s9a5379_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s9a5379_capabilities li {\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s9e0e76_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.s41121d_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.s852a05_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.s852a05_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.s852a05_detailRow dd {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n text-align: right;\n color: var(--dsw-alias-label-primary);\n}\n\n.s852a05_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.s852a05_detailRow a:hover {\n text-decoration: underline;\n}\n\n.s852a05_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The publishing account, beside the npm link. Secondary label colour and a\n * middot separator carry the distinction — never a background fill, which is\n * invisible in the light theme where every bg-layer token is the same white. */\n/* Who published the entry, at the right edge of the action row. `margin-left:\n * auto` is what pushes it there; the row is a wrapping flex, so an active\n * install flow (which claims the full width) drops this to the next line\n * rather than squeezing it. */\n.s367f3b_author {\n margin-left: auto;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.s2f9e91_reviewedLine {\n margin: 8px 0 0;\n padding: 6px 8px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n font-size: 12px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n/* Install flow. */\n.s20fbe0_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.s89d599_installButton, .s7b4348_confirmButton, .s20b00b_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.s89d599_installButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.s89d599_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s7b4348_confirmButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.s7b4348_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s20b00b_cancelButton {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n\n.s20b00b_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s89d599_installButton:focus-visible, .s7b4348_confirmButton:focus-visible, .s20b00b_cancelButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The shelf card of a plugin that is installed and current carries this\n * non-interactive label instead of an install button. Border + text do the\n * work in the light theme, where every bg-layer token resolves to white. */\n.s1e55fb_installedLabel {\n align-self: flex-start;\n margin: 0;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n/* An installed card's controls: the installed label or the update button,\n * plus the uninstall button. The install panel's running/failed states are\n * column layouts and sit as one item of this row. */\n.s94517f_installedActions {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Uninstall revokes privilege; the quiet outline keeps it from competing\n * with the primary action, and the error tint says \"removes\". */\n.s432016_uninstallButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 55%, transparent);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s432016_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.s432016_uninstallButton:focus-visible {\n outline: 2px solid var(--dsw-alias-state-error-primary);\n outline-offset: 1px;\n}\n\n/* The restart dsh button on a done install: quiet outline, same rank as\n * the other secondary actions. */\n.s5c0f5a_restartButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s5c0f5a_restartButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s5c0f5a_restartButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s549462_gate {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: 8px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n.sed2c7d_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.sdce129_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sfae869_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.sae8426_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.s260a62_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sba0b9c_log {\n max-height: 160px;\n overflow: auto;\n margin: 0;\n padding: 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n list-style: none;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n\n.s5c7c9d_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sebdc74_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.s2672db_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s3a9748_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sc1144d_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s2209a3_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* Installed section. */\n.sb4abbb_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.sbca39c_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s1abd04_outdatedRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.s10dca9_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s10dca9_outdatedInfo strong {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n word-break: break-all;\n color: var(--dsw-alias-label-primary);\n}\n\n.sb04966_outdatedVersions {\n /* Two inline labels with nothing between them in the markup ran together as\n * `installed v1.0.0latest v2.0.0`: JSX drops the whitespace-only line, and\n * the per-label class the markup asked for was never defined (singular\n * against this rule's plural). The container owns the gap, the same idiom\n * as .s28e55e_badges — the labels need no class of their own. */\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.see54bf_outdatedActions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* The enable/disable switch. */\n.sa65b66_switch {\n position: relative;\n width: 32px;\n height: 18px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n}\n\n.s50b82f_switchOn {\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 55%, transparent);\n}\n\n.sbbb39a_switchKnob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--dsw-alias-label-primary);\n transition: transform 120ms ease, background 120ms ease;\n}\n\n.s50b82f_switchOn .sbbb39a_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.sa65b66_switch:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sa65b66_switch, .sbbb39a_switchKnob { transition: none; }\n}\n\n/* The hot enable/disable switch on installed rows: the knob button plus the\n * §8 hot-apply / failure notices rendered beside it. */\n.s24b48c_switchWrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n";
5279
+ if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"26093961\"]")) {
5284
5280
  const tag = document.createElement("style");
5285
- tag.dataset.pluginCss = "e3675a89";
5281
+ tag.dataset.pluginCss = "26093961";
5286
5282
  tag.textContent = css;
5287
5283
  document.head.appendChild(tag);
5288
5284
  }
5289
- var _dsh_plugin_shop_css_e3675a89_default = {
5290
- "client": "s8583e3_client",
5291
- "config": "s942a79_config",
5292
- "ts": "s5f67aa_ts",
5293
- "spec": "sfd9d8a_spec",
5294
- "panel": "s255e5a_panel",
5295
- "stateLine": "s44a3ec_stateLine",
5296
- "srOnly": "s3a0ece_srOnly",
5297
- "skeletonGrid": "se0c3b4_skeletonGrid",
5298
- "skeletonCard": "s520416_skeletonCard",
5299
- "skeletonName": "s8c7d6f_skeletonName",
5300
- "skeletonSummary": "sf5179e_skeletonSummary",
5301
- "skeletonSummaryShort": "sbb0d25_skeletonSummaryShort",
5302
- "skeletonActions": "s96e910_skeletonActions",
5303
- "actionButton": "s73242a_actionButton",
5304
- "toolbar": "s646509_toolbar",
5305
- "toolbarRight": "s745e3c_toolbarRight",
5306
- "versionBlock": "s4fe61f_versionBlock",
5307
- "versionText": "sb9b924_versionText",
5308
- "updateSelfButton": "sa04455_updateSelfButton",
5309
- "checkUpdateButton": "s614a38_checkUpdateButton",
5310
- "githubLink": "sa987f7_githubLink",
5311
- "selfUpdatePanel": "sb81ba5_selfUpdatePanel",
5312
- "searchInput": "s232ec4_searchInput",
5313
- "staleBlock": "s1555aa_staleBlock",
5314
- "staleBadge": "s3946f1_staleBadge",
5315
- "categoryBar": "sb2c859_categoryBar",
5316
- "categoryButton": "s26d58e_categoryButton",
5317
- "categoryButtonOn": "s5f68c4_categoryButtonOn",
5318
- "catalogHeading": "s668774_catalogHeading",
5319
- "catalogStats": "sccc4d1_catalogStats",
5320
- "emptyLine": "s6de1ab_emptyLine",
5321
- "cards": "sf657f5_cards",
5322
- "card": "s65f383_card",
5323
- "cardsSentry": "sd7ee01_cardsSentry",
5324
- "showingLine": "s705cc6_showingLine",
5325
- "cardSpine": "s4ce25d_cardSpine",
5326
- "categoryBadge": "s9c8eaa_categoryBadge",
5327
- "entryHeader": "sa97234_entryHeader",
5328
- "name": "sc3f149_name",
5329
- "badges": "s513026_badges",
5330
- "cardActions": "s9b5048_cardActions",
5331
- "gate": "sc4f2ac_gate",
5332
- "installPanel": "s4d374c_installPanel",
5333
- "installedActions": "sf53ca0_installedActions",
5334
- "cardVersion": "sc6ec6e_cardVersion",
5335
- "sourceBadge": "s71f10f_sourceBadge",
5336
- "tierBadge": "s5e82cb_tierBadge",
5337
- "incompatibleBadge": "s4bbe02_incompatibleBadge",
5338
- "starsBadge": "sff43b4_starsBadge",
5339
- "chevron": "s73f7fb_chevron",
5340
- "chevronOpen": "s61393c_chevronOpen",
5341
- "body": "s820ebf_body",
5342
- "summary": "sb8fbc8_summary",
5343
- "summaryZh": "se507db_summaryZh",
5344
- "summaryExpanded": "s10baf0_summaryExpanded",
5345
- "summaryZhExpanded": "sb9dba9_summaryZhExpanded",
5346
- "incompatibleDetail": "s6eca19_incompatibleDetail",
5347
- "capabilitiesBlock": "s9d2029_capabilitiesBlock",
5348
- "capabilitiesNote": "s3bdbd5_capabilitiesNote",
5349
- "capabilities": "s441702_capabilities",
5350
- "detail": "sde3f0c_detail",
5351
- "detailRows": "se98179_detailRows",
5352
- "detailRow": "sfb4d2f_detailRow",
5353
- "author": "s1ff66f_author",
5354
- "reviewedLine": "sd58c6d_reviewedLine",
5355
- "installButton": "se7aaed_installButton",
5356
- "confirmButton": "sb43a49_confirmButton",
5357
- "cancelButton": "s6e45d1_cancelButton",
5358
- "installedLabel": "sb6fc74_installedLabel",
5359
- "uninstallButton": "s96967f_uninstallButton",
5360
- "restartButton": "s6ac237_restartButton",
5361
- "gateTitle": "s559c38_gateTitle",
5362
- "gateBody": "s3c0ace_gateBody",
5363
- "gateWarning": "sc323e5_gateWarning",
5364
- "gateActions": "s4b2373_gateActions",
5365
- "installing": "s52b5a5_installing",
5366
- "log": "s64ab71_log",
5367
- "logLine": "s1531a8_logLine",
5368
- "notice": "sf20dda_notice",
5369
- "failedHeading": "seb9b08_failedHeading",
5370
- "failedDetail": "sfd3021_failedDetail",
5371
- "rejectedCode": "s50ba35_rejectedCode",
5372
- "rejectedDetail": "se75489_rejectedDetail",
5373
- "outdatedSection": "sa276cf_outdatedSection",
5374
- "outdatedList": "sceae6e_outdatedList",
5375
- "outdatedRow": "s8d2072_outdatedRow",
5376
- "outdatedInfo": "s5c2545_outdatedInfo",
5377
- "outdatedVersions": "s877c68_outdatedVersions",
5378
- "outdatedActions": "sa1f556_outdatedActions",
5379
- "switch": "s11c019_switch",
5380
- "switchOn": "s7580e8_switchOn",
5381
- "switchKnob": "saab2b3_switchKnob",
5382
- "switchWrap": "sd9f9e4_switchWrap"
5285
+ var _dsh_plugin_shop_css_26093961_default = {
5286
+ "client": "sfae5fa_client",
5287
+ "config": "se9da7d_config",
5288
+ "ts": "se722f1_ts",
5289
+ "spec": "s2f7a8b_spec",
5290
+ "panel": "s99b207_panel",
5291
+ "searchInput": "se23a0e_searchInput",
5292
+ "toolbar": "s27ad76_toolbar",
5293
+ "stateLine": "s2abe0f_stateLine",
5294
+ "srOnly": "sfb85e5_srOnly",
5295
+ "skeletonGrid": "s728a01_skeletonGrid",
5296
+ "skeletonCard": "s33d002_skeletonCard",
5297
+ "skeletonName": "s46e666_skeletonName",
5298
+ "skeletonSummary": "s2a467d_skeletonSummary",
5299
+ "skeletonSummaryShort": "s232601_skeletonSummaryShort",
5300
+ "skeletonActions": "sde9b0c_skeletonActions",
5301
+ "actionButton": "sb632c0_actionButton",
5302
+ "toolbarRight": "saba3c3_toolbarRight",
5303
+ "versionBlock": "s6736c0_versionBlock",
5304
+ "versionText": "s2dff04_versionText",
5305
+ "updateSelfButton": "s40b16e_updateSelfButton",
5306
+ "checkUpdateButton": "secd6a2_checkUpdateButton",
5307
+ "githubLink": "s5e1ce3_githubLink",
5308
+ "selfUpdatePanel": "s798348_selfUpdatePanel",
5309
+ "staleBlock": "s82b1d4_staleBlock",
5310
+ "staleBadge": "see2588_staleBadge",
5311
+ "categoryBar": "se67e0b_categoryBar",
5312
+ "categoryButton": "s8c06a0_categoryButton",
5313
+ "categoryButtonOn": "s65a55a_categoryButtonOn",
5314
+ "catalogHeading": "sb6cdd6_catalogHeading",
5315
+ "catalogStats": "s38a33e_catalogStats",
5316
+ "emptyLine": "se3ba96_emptyLine",
5317
+ "cards": "sb41fe1_cards",
5318
+ "card": "sfcd584_card",
5319
+ "cardsSentry": "sf2d932_cardsSentry",
5320
+ "showingLine": "s947694_showingLine",
5321
+ "cardSpine": "sfc4028_cardSpine",
5322
+ "categoryBadge": "sb94610_categoryBadge",
5323
+ "entryHeader": "s50a94e_entryHeader",
5324
+ "name": "sfdbf47_name",
5325
+ "badges": "s28e55e_badges",
5326
+ "cardActions": "s9359c0_cardActions",
5327
+ "gate": "s549462_gate",
5328
+ "installPanel": "s20fbe0_installPanel",
5329
+ "installedActions": "s94517f_installedActions",
5330
+ "cardVersion": "sc54e24_cardVersion",
5331
+ "sourceBadge": "s623bee_sourceBadge",
5332
+ "tierBadge": "sf9a12c_tierBadge",
5333
+ "incompatibleBadge": "s671f97_incompatibleBadge",
5334
+ "starsBadge": "s963e5c_starsBadge",
5335
+ "chevron": "sbb5739_chevron",
5336
+ "chevronOpen": "s4e56e8_chevronOpen",
5337
+ "body": "sf9a60a_body",
5338
+ "summary": "sfd2791_summary",
5339
+ "summaryZh": "s69ed84_summaryZh",
5340
+ "summaryExpanded": "s83c8c8_summaryExpanded",
5341
+ "summaryZhExpanded": "s20b5b9_summaryZhExpanded",
5342
+ "incompatibleDetail": "s45793c_incompatibleDetail",
5343
+ "capabilitiesBlock": "s551fd2_capabilitiesBlock",
5344
+ "capabilitiesNote": "sb1f0de_capabilitiesNote",
5345
+ "capabilities": "s9a5379_capabilities",
5346
+ "detail": "s9e0e76_detail",
5347
+ "detailRows": "s41121d_detailRows",
5348
+ "detailRow": "s852a05_detailRow",
5349
+ "author": "s367f3b_author",
5350
+ "reviewedLine": "s2f9e91_reviewedLine",
5351
+ "installButton": "s89d599_installButton",
5352
+ "confirmButton": "s7b4348_confirmButton",
5353
+ "cancelButton": "s20b00b_cancelButton",
5354
+ "installedLabel": "s1e55fb_installedLabel",
5355
+ "uninstallButton": "s432016_uninstallButton",
5356
+ "restartButton": "s5c0f5a_restartButton",
5357
+ "gateTitle": "sed2c7d_gateTitle",
5358
+ "gateBody": "sdce129_gateBody",
5359
+ "gateWarning": "sfae869_gateWarning",
5360
+ "gateActions": "sae8426_gateActions",
5361
+ "installing": "s260a62_installing",
5362
+ "log": "sba0b9c_log",
5363
+ "logLine": "s5c7c9d_logLine",
5364
+ "notice": "sebdc74_notice",
5365
+ "failedHeading": "s2672db_failedHeading",
5366
+ "failedDetail": "s3a9748_failedDetail",
5367
+ "rejectedCode": "sc1144d_rejectedCode",
5368
+ "rejectedDetail": "s2209a3_rejectedDetail",
5369
+ "outdatedSection": "sb4abbb_outdatedSection",
5370
+ "outdatedList": "sbca39c_outdatedList",
5371
+ "outdatedRow": "s1abd04_outdatedRow",
5372
+ "outdatedInfo": "s10dca9_outdatedInfo",
5373
+ "outdatedVersions": "sb04966_outdatedVersions",
5374
+ "outdatedActions": "see54bf_outdatedActions",
5375
+ "switch": "sa65b66_switch",
5376
+ "switchOn": "s50b82f_switchOn",
5377
+ "switchKnob": "sbbb39a_switchKnob",
5378
+ "switchWrap": "s24b48c_switchWrap"
5383
5379
  };
5384
5380
  //#endregion
5385
5381
  //#region src/client/ShopTab.tsx
@@ -5396,7 +5392,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5396
5392
  width: "14",
5397
5393
  height: "14",
5398
5394
  "aria-hidden": "true",
5399
- className: open ? _dsh_plugin_shop_css_e3675a89_default.chevronOpen : _dsh_plugin_shop_css_e3675a89_default.chevron,
5395
+ className: open ? _dsh_plugin_shop_css_26093961_default.chevronOpen : _dsh_plugin_shop_css_26093961_default.chevron,
5400
5396
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
5401
5397
  fill: "currentColor",
5402
5398
  d: "M3.5 6 8 10.5 12.5 6l1 1L8 12.5 2.5 7l1-1Z"
@@ -5417,32 +5413,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5417
5413
  const author = authorOf(entry);
5418
5414
  const category = entry.catalog?.category ?? "other";
5419
5415
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5420
- className: _dsh_plugin_shop_css_e3675a89_default.card,
5416
+ className: _dsh_plugin_shop_css_26093961_default.card,
5421
5417
  "data-shop-entry": entry.name,
5422
5418
  "data-category": category,
5423
5419
  children: [
5424
5420
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5425
- className: _dsh_plugin_shop_css_e3675a89_default.cardSpine,
5421
+ className: _dsh_plugin_shop_css_26093961_default.cardSpine,
5426
5422
  "aria-hidden": "true"
5427
5423
  }),
5428
5424
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
5429
5425
  type: "button",
5430
- className: _dsh_plugin_shop_css_e3675a89_default.entryHeader,
5426
+ className: _dsh_plugin_shop_css_26093961_default.entryHeader,
5431
5427
  "aria-expanded": open,
5432
5428
  "aria-controls": detailId,
5433
5429
  onClick: () => setOpen((current) => !current),
5434
5430
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5435
- className: _dsh_plugin_shop_css_e3675a89_default.name,
5431
+ className: _dsh_plugin_shop_css_26093961_default.name,
5436
5432
  children: entry.name
5437
5433
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5438
- className: _dsh_plugin_shop_css_e3675a89_default.badges,
5434
+ className: _dsh_plugin_shop_css_26093961_default.badges,
5439
5435
  children: [
5440
5436
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5441
- className: _dsh_plugin_shop_css_e3675a89_default.categoryBadge,
5437
+ className: _dsh_plugin_shop_css_26093961_default.categoryBadge,
5442
5438
  children: t(categoryKey(entry))
5443
5439
  }),
5444
5440
  entry.source === "npm" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5445
- className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
5441
+ className: _dsh_plugin_shop_css_26093961_default.sourceBadge,
5446
5442
  "data-shop-source-npm": true,
5447
5443
  role: "img",
5448
5444
  "aria-label": t("npmSource"),
@@ -5459,7 +5455,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5459
5455
  })
5460
5456
  }),
5461
5457
  hasGithubHome(entry) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5462
- className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
5458
+ className: _dsh_plugin_shop_css_26093961_default.sourceBadge,
5463
5459
  "data-shop-source-github": true,
5464
5460
  role: "img",
5465
5461
  "aria-label": t("githubSource"),
@@ -5473,23 +5469,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5473
5469
  })
5474
5470
  }),
5475
5471
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5476
- className: _dsh_plugin_shop_css_e3675a89_default.cardVersion,
5472
+ className: _dsh_plugin_shop_css_26093961_default.cardVersion,
5477
5473
  "data-card-version": true,
5478
5474
  children: ["v", displayVersion(entry)]
5479
5475
  }),
5480
5476
  entry.tier !== "community" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5481
- className: _dsh_plugin_shop_css_e3675a89_default.tierBadge,
5477
+ className: _dsh_plugin_shop_css_26093961_default.tierBadge,
5482
5478
  "data-tier": entry.tier,
5483
5479
  children: t(tierKey(entry.tier))
5484
5480
  }),
5485
5481
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5486
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleBadge,
5482
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleBadge,
5487
5483
  "data-shop-incompatible": true,
5488
5484
  title: t("incompatibleDetail", { modules: missing.join(", ") }),
5489
5485
  children: t("incompatibleBadge")
5490
5486
  }),
5491
5487
  stars !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5492
- className: _dsh_plugin_shop_css_e3675a89_default.starsBadge,
5488
+ className: _dsh_plugin_shop_css_26093961_default.starsBadge,
5493
5489
  role: "img",
5494
5490
  "aria-label": t("stars", { count: stars }),
5495
5491
  children: ["★ ", formatStars(stars)]
@@ -5499,38 +5495,38 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5499
5495
  })]
5500
5496
  }),
5501
5497
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5502
- className: _dsh_plugin_shop_css_e3675a89_default.body,
5498
+ className: _dsh_plugin_shop_css_26093961_default.body,
5503
5499
  children: [
5504
5500
  summary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5505
- className: open ? `${_dsh_plugin_shop_css_e3675a89_default.summary} ${_dsh_plugin_shop_css_e3675a89_default.summaryExpanded}` : _dsh_plugin_shop_css_e3675a89_default.summary,
5501
+ className: open ? `${_dsh_plugin_shop_css_26093961_default.summary} ${_dsh_plugin_shop_css_26093961_default.summaryExpanded}` : _dsh_plugin_shop_css_26093961_default.summary,
5506
5502
  children: summary.en
5507
5503
  }),
5508
5504
  summary?.zh !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5509
- className: open ? `${_dsh_plugin_shop_css_e3675a89_default.summaryZh} ${_dsh_plugin_shop_css_e3675a89_default.summaryZhExpanded}` : _dsh_plugin_shop_css_e3675a89_default.summaryZh,
5505
+ className: open ? `${_dsh_plugin_shop_css_26093961_default.summaryZh} ${_dsh_plugin_shop_css_26093961_default.summaryZhExpanded}` : _dsh_plugin_shop_css_26093961_default.summaryZh,
5510
5506
  children: summary.zh
5511
5507
  }),
5512
5508
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5513
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleDetail,
5509
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleDetail,
5514
5510
  children: t("incompatibleDetail", { modules: missing.join(", ") })
5515
5511
  }),
5516
5512
  open && entry.catalog !== void 0 && entry.catalog.capabilities.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5517
- className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesBlock,
5513
+ className: _dsh_plugin_shop_css_26093961_default.capabilitiesBlock,
5518
5514
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5519
- className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesNote,
5515
+ className: _dsh_plugin_shop_css_26093961_default.capabilitiesNote,
5520
5516
  children: t("capabilitiesNote")
5521
5517
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
5522
- className: _dsh_plugin_shop_css_e3675a89_default.capabilities,
5518
+ className: _dsh_plugin_shop_css_26093961_default.capabilities,
5523
5519
  children: entry.catalog.capabilities.map((capability) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: capability }, capability))
5524
5520
  })]
5525
5521
  }),
5526
5522
  open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5527
5523
  id: detailId,
5528
- className: _dsh_plugin_shop_css_e3675a89_default.detail,
5524
+ className: _dsh_plugin_shop_css_26093961_default.detail,
5529
5525
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
5530
- className: _dsh_plugin_shop_css_e3675a89_default.detailRows,
5526
+ className: _dsh_plugin_shop_css_26093961_default.detailRows,
5531
5527
  children: [
5532
5528
  npmUrl !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5533
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5529
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
5534
5530
  "data-shop-npm": true,
5535
5531
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", { children: t("npmPage") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
5536
5532
  href: npmUrl,
@@ -5540,7 +5536,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5540
5536
  }) })]
5541
5537
  }),
5542
5538
  entry.repository !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5543
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5539
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
5544
5540
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", { children: t("repository") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: /^https?:\/\//.test(entry.repository) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
5545
5541
  href: entry.repository,
5546
5542
  target: "_blank",
@@ -5549,12 +5545,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5549
5545
  }) : entry.repository })]
5550
5546
  }),
5551
5547
  entry.license !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5552
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5548
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
5553
5549
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", { children: t("license") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: isCustomLicense(entry.license) ? t("customLicense") : entry.license })]
5554
5550
  })
5555
5551
  ]
5556
5552
  }), entry.tier === "verified-stale" && entry.review !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5557
- className: _dsh_plugin_shop_css_e3675a89_default.reviewedLine,
5553
+ className: _dsh_plugin_shop_css_26093961_default.reviewedLine,
5558
5554
  children: entry.review.reviewedVersion !== void 0 ? t("reviewedVersionLine", {
5559
5555
  reviewed: entry.review.reviewedVersion,
5560
5556
  current: entry.version
@@ -5567,7 +5563,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5567
5563
  ]
5568
5564
  }),
5569
5565
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5570
- className: _dsh_plugin_shop_css_e3675a89_default.cardActions,
5566
+ className: _dsh_plugin_shop_css_26093961_default.cardActions,
5571
5567
  "data-shop-actions": true,
5572
5568
  children: [installed === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InstallPanel, {
5573
5569
  name: entry.name,
@@ -5592,7 +5588,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5592
5588
  restart,
5593
5589
  restartSupported
5594
5590
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5595
- className: _dsh_plugin_shop_css_e3675a89_default.installedLabel,
5591
+ className: _dsh_plugin_shop_css_26093961_default.installedLabel,
5596
5592
  "data-shop-installed": true,
5597
5593
  children: t("installed")
5598
5594
  }),
@@ -5610,7 +5606,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5610
5606
  restartSupported
5611
5607
  })
5612
5608
  ] }), author !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5613
- className: _dsh_plugin_shop_css_e3675a89_default.author,
5609
+ className: _dsh_plugin_shop_css_26093961_default.author,
5614
5610
  "data-shop-author": true,
5615
5611
  children: t("authorLine", { author })
5616
5612
  })]
@@ -5627,23 +5623,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5627
5623
  const [gateOpen, setGateOpen] = (0, react.useState)(false);
5628
5624
  const { view, start } = useInstall(install, installStatus);
5629
5625
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5630
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5626
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5631
5627
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5632
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
5628
+ className: _dsh_plugin_shop_css_26093961_default.installing,
5633
5629
  children: t("installing")
5634
5630
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5635
- className: _dsh_plugin_shop_css_e3675a89_default.log,
5631
+ className: _dsh_plugin_shop_css_26093961_default.log,
5636
5632
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5637
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5633
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
5638
5634
  children: line
5639
5635
  }, index))
5640
5636
  })]
5641
5637
  });
5642
5638
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5643
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
5639
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
5644
5640
  children: [
5645
5641
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5646
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5642
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5647
5643
  "data-shop-restart-notice": true,
5648
5644
  children: view.needsRestart ? t(restartReasonKey(view.restartReason)) : t("installedNoRestartNotice")
5649
5645
  }),
@@ -5652,63 +5648,63 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5652
5648
  restart
5653
5649
  }),
5654
5650
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5655
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5651
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5656
5652
  "data-shop-restart-disabled": true,
5657
5653
  children: t("restartDisabledNotice")
5658
5654
  })
5659
5655
  ]
5660
5656
  });
5661
5657
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5662
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5658
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5663
5659
  children: [
5664
5660
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5665
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
5661
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
5666
5662
  children: t("installFailed")
5667
5663
  }),
5668
5664
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5669
- className: _dsh_plugin_shop_css_e3675a89_default.log,
5665
+ className: _dsh_plugin_shop_css_26093961_default.log,
5670
5666
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5671
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5667
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
5672
5668
  children: line
5673
5669
  }, index))
5674
5670
  }),
5675
5671
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5676
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5672
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
5677
5673
  children: view.detail === "" ? t("installTransportFailed") : view.detail
5678
5674
  })
5679
5675
  ]
5680
5676
  });
5681
5677
  if (view.kind === "rejected") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5682
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5678
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5683
5679
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5684
- className: _dsh_plugin_shop_css_e3675a89_default.rejectedCode,
5680
+ className: _dsh_plugin_shop_css_26093961_default.rejectedCode,
5685
5681
  children: t(rejectionCodeKey(view.code))
5686
5682
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5687
- className: _dsh_plugin_shop_css_e3675a89_default.rejectedDetail,
5683
+ className: _dsh_plugin_shop_css_26093961_default.rejectedDetail,
5688
5684
  children: view.detail
5689
5685
  })]
5690
5686
  });
5691
5687
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5692
- className: _dsh_plugin_shop_css_e3675a89_default.gate,
5688
+ className: _dsh_plugin_shop_css_26093961_default.gate,
5693
5689
  children: [
5694
5690
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5695
- className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
5691
+ className: _dsh_plugin_shop_css_26093961_default.gateTitle,
5696
5692
  children: t("acknowledgementTitle")
5697
5693
  }),
5698
5694
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5699
- className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
5695
+ className: _dsh_plugin_shop_css_26093961_default.gateBody,
5700
5696
  children: t("acknowledgementBody")
5701
5697
  }),
5702
5698
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5703
- className: _dsh_plugin_shop_css_e3675a89_default.gateWarning,
5699
+ className: _dsh_plugin_shop_css_26093961_default.gateWarning,
5704
5700
  "data-shop-incompatible-warning": true,
5705
5701
  children: t("incompatibleInstallWarning", { modules: missing.join(", ") })
5706
5702
  }),
5707
5703
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5708
- className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
5704
+ className: _dsh_plugin_shop_css_26093961_default.gateActions,
5709
5705
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5710
5706
  type: "button",
5711
- className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
5707
+ className: _dsh_plugin_shop_css_26093961_default.confirmButton,
5712
5708
  "data-shop-confirm": true,
5713
5709
  onClick: () => {
5714
5710
  setGateOpen(false);
@@ -5721,7 +5717,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5721
5717
  children: t("confirm")
5722
5718
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5723
5719
  type: "button",
5724
- className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
5720
+ className: _dsh_plugin_shop_css_26093961_default.cancelButton,
5725
5721
  onClick: () => setGateOpen(false),
5726
5722
  children: t("cancel")
5727
5723
  })]
@@ -5731,7 +5727,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5731
5727
  const update = variant === "update";
5732
5728
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5733
5729
  type: "button",
5734
- className: _dsh_plugin_shop_css_e3675a89_default.installButton,
5730
+ className: _dsh_plugin_shop_css_26093961_default.installButton,
5735
5731
  ...update ? { "data-shop-update": true } : { "data-shop-install": true },
5736
5732
  onClick: () => {
5737
5733
  if (tier === "verified") start({
@@ -5753,23 +5749,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5753
5749
  function UninstallPanel({ name, t, uninstall, installStatus, restart, restartSupported }) {
5754
5750
  const { view, start } = useUninstall(uninstall, installStatus);
5755
5751
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5756
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5752
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5757
5753
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5758
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
5754
+ className: _dsh_plugin_shop_css_26093961_default.installing,
5759
5755
  children: t("uninstalling")
5760
5756
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5761
- className: _dsh_plugin_shop_css_e3675a89_default.log,
5757
+ className: _dsh_plugin_shop_css_26093961_default.log,
5762
5758
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5763
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5759
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
5764
5760
  children: line
5765
5761
  }, index))
5766
5762
  })]
5767
5763
  });
5768
5764
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5769
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
5765
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
5770
5766
  children: [
5771
5767
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5772
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5768
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5773
5769
  "data-shop-uninstall-done": true,
5774
5770
  children: view.needsRestart ? t("uninstalledRestartNotice") : t("uninstalledLiveNotice")
5775
5771
  }),
@@ -5778,28 +5774,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5778
5774
  restart
5779
5775
  }),
5780
5776
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5781
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5777
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5782
5778
  "data-shop-restart-disabled": true,
5783
5779
  children: t("restartDisabledNotice")
5784
5780
  })
5785
5781
  ]
5786
5782
  });
5787
5783
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5788
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5784
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5789
5785
  children: [
5790
5786
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5791
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
5787
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
5792
5788
  children: t("uninstallFailed")
5793
5789
  }),
5794
5790
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5795
- className: _dsh_plugin_shop_css_e3675a89_default.log,
5791
+ className: _dsh_plugin_shop_css_26093961_default.log,
5796
5792
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5797
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5793
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
5798
5794
  children: line
5799
5795
  }, index))
5800
5796
  }),
5801
5797
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5802
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5798
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
5803
5799
  children: view.detail === "" ? t("uninstallTransportFailed") : view.detail
5804
5800
  })
5805
5801
  ]
@@ -5807,7 +5803,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5807
5803
  if (view.kind !== "idle") return null;
5808
5804
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5809
5805
  type: "button",
5810
- className: _dsh_plugin_shop_css_e3675a89_default.uninstallButton,
5806
+ className: _dsh_plugin_shop_css_26093961_default.uninstallButton,
5811
5807
  "data-shop-uninstall": true,
5812
5808
  onClick: () => void start({ name }),
5813
5809
  children: t("uninstall")
@@ -5864,37 +5860,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5864
5860
  return () => clearInterval(timer);
5865
5861
  }, [state, t]);
5866
5862
  if (state.kind === "restarting") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5867
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5863
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5868
5864
  "data-shop-restarting": true,
5869
5865
  children: t("restarting")
5870
5866
  });
5871
5867
  if (state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5872
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5868
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
5873
5869
  "data-shop-restart-error": true,
5874
5870
  children: state.detail
5875
5871
  });
5876
5872
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5877
- className: _dsh_plugin_shop_css_e3675a89_default.gate,
5873
+ className: _dsh_plugin_shop_css_26093961_default.gate,
5878
5874
  children: [
5879
5875
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5880
- className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
5876
+ className: _dsh_plugin_shop_css_26093961_default.gateTitle,
5881
5877
  children: t("restartTitle")
5882
5878
  }),
5883
5879
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5884
- className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
5880
+ className: _dsh_plugin_shop_css_26093961_default.gateBody,
5885
5881
  children: t("restartBody")
5886
5882
  }),
5887
5883
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5888
- className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
5884
+ className: _dsh_plugin_shop_css_26093961_default.gateActions,
5889
5885
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5890
5886
  type: "button",
5891
- className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
5887
+ className: _dsh_plugin_shop_css_26093961_default.confirmButton,
5892
5888
  "data-shop-restart-confirm": true,
5893
5889
  onClick: () => void onConfirm(),
5894
5890
  children: t("restartConfirm")
5895
5891
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5896
5892
  type: "button",
5897
- className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
5893
+ className: _dsh_plugin_shop_css_26093961_default.cancelButton,
5898
5894
  onClick: () => setGateOpen(false),
5899
5895
  children: t("cancel")
5900
5896
  })]
@@ -5903,7 +5899,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5903
5899
  });
5904
5900
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5905
5901
  type: "button",
5906
- className: _dsh_plugin_shop_css_e3675a89_default.restartButton,
5902
+ className: _dsh_plugin_shop_css_26093961_default.restartButton,
5907
5903
  "data-shop-restart": true,
5908
5904
  onClick: () => setGateOpen(true),
5909
5905
  children: t("restart")
@@ -5943,7 +5939,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5943
5939
  }
5944
5940
  };
5945
5941
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5946
- className: _dsh_plugin_shop_css_e3675a89_default.switchWrap,
5942
+ className: _dsh_plugin_shop_css_26093961_default.switchWrap,
5947
5943
  "data-shop-enabled-switch": row.name,
5948
5944
  children: [
5949
5945
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -5952,18 +5948,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5952
5948
  "aria-checked": enabled,
5953
5949
  "aria-label": t("enabledSwitch"),
5954
5950
  "data-shop-toggle": true,
5955
- className: `${_dsh_plugin_shop_css_e3675a89_default.switch} ${enabled ? _dsh_plugin_shop_css_e3675a89_default.switchOn : ""}`,
5951
+ className: `${_dsh_plugin_shop_css_26093961_default.switch} ${enabled ? _dsh_plugin_shop_css_26093961_default.switchOn : ""}`,
5956
5952
  onClick: () => void onToggle(),
5957
5953
  disabled: toggle.kind === "saving",
5958
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.switchKnob })
5954
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.switchKnob })
5959
5955
  }),
5960
5956
  toggle.kind === "saved" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5961
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5957
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5962
5958
  "data-shop-hot-apply": true,
5963
5959
  children: t("hotApplyNote")
5964
5960
  }),
5965
5961
  toggle.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5966
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5962
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
5967
5963
  "data-shop-toggle-error": true,
5968
5964
  children: toggle.detail
5969
5965
  })
@@ -5975,27 +5971,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5975
5971
  * install flow for `name@latest`, reusing `InstallPanel`). */
5976
5972
  function OutdatedRow({ row, tier, source, missing, t, setEnabled, install, installStatus, restart, restartSupported }) {
5977
5973
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5978
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedRow,
5974
+ className: _dsh_plugin_shop_css_26093961_default.outdatedRow,
5979
5975
  "data-shop-outdated-entry": row.name,
5980
5976
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5981
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedInfo,
5977
+ className: _dsh_plugin_shop_css_26093961_default.outdatedInfo,
5982
5978
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5983
- className: _dsh_plugin_shop_css_e3675a89_default.badges,
5979
+ className: _dsh_plugin_shop_css_26093961_default.badges,
5984
5980
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5985
- className: _dsh_plugin_shop_css_e3675a89_default.name,
5981
+ className: _dsh_plugin_shop_css_26093961_default.name,
5986
5982
  children: row.name
5987
5983
  }), missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5988
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleBadge,
5984
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleBadge,
5989
5985
  "data-shop-incompatible": true,
5990
5986
  title: t("incompatibleUpdateDetail", { modules: missing.join(", ") }),
5991
5987
  children: t("incompatibleBadge")
5992
5988
  })]
5993
5989
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5994
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedVersions,
5990
+ className: _dsh_plugin_shop_css_26093961_default.outdatedVersions,
5995
5991
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("installedVersion", { version: source === "github" ? row.installed.slice(0, 7) : row.installed }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("latestVersion", { version: row.latest }) })]
5996
5992
  })]
5997
5993
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5998
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedActions,
5994
+ className: _dsh_plugin_shop_css_26093961_default.outdatedActions,
5999
5995
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnabledSwitch, {
6000
5996
  row,
6001
5997
  t,
@@ -6025,20 +6021,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6025
6021
  function OutdatedSection({ state, tiers, sources, missingByName, t, setEnabled, install, installStatus, restart, restartSupported }) {
6026
6022
  if (state.kind === "loading") return null;
6027
6023
  if (state.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6028
- className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
6024
+ className: _dsh_plugin_shop_css_26093961_default.stateLine,
6029
6025
  "data-shop-outdated-error": true,
6030
6026
  children: t("error")
6031
6027
  });
6032
6028
  const outdated = state.entries.filter((entry) => entry.outdated);
6033
6029
  if (outdated.length === 0) return null;
6034
6030
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6035
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedSection,
6031
+ className: _dsh_plugin_shop_css_26093961_default.outdatedSection,
6036
6032
  "data-shop-outdated": true,
6037
6033
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
6038
- className: _dsh_plugin_shop_css_e3675a89_default.catalogHeading,
6034
+ className: _dsh_plugin_shop_css_26093961_default.catalogHeading,
6039
6035
  children: t("installedSection")
6040
6036
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
6041
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedList,
6037
+ className: _dsh_plugin_shop_css_26093961_default.outdatedList,
6042
6038
  children: outdated.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OutdatedRow, {
6043
6039
  row,
6044
6040
  tier: tiers.get(row.name) ?? "community",
@@ -6211,50 +6207,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6211
6207
  return map;
6212
6208
  }, [catalogState]);
6213
6209
  if (catalogState.kind === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6214
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
6210
+ className: _dsh_plugin_shop_css_26093961_default.panel,
6215
6211
  "data-shop-tab": true,
6216
6212
  "aria-busy": "true",
6217
6213
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6218
- className: _dsh_plugin_shop_css_e3675a89_default.srOnly,
6214
+ className: _dsh_plugin_shop_css_26093961_default.srOnly,
6219
6215
  children: t("loading")
6220
6216
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6221
- className: _dsh_plugin_shop_css_e3675a89_default.skeletonGrid,
6217
+ className: _dsh_plugin_shop_css_26093961_default.skeletonGrid,
6222
6218
  "data-shop-skeleton": true,
6223
6219
  "aria-hidden": "true",
6224
6220
  children: Array.from({ length: 8 }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6225
- className: _dsh_plugin_shop_css_e3675a89_default.skeletonCard,
6221
+ className: _dsh_plugin_shop_css_26093961_default.skeletonCard,
6226
6222
  children: [
6227
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonName }),
6228
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummary }),
6229
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummaryShort }),
6230
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonActions })
6223
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonName }),
6224
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonSummary }),
6225
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonSummaryShort }),
6226
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonActions })
6231
6227
  ]
6232
6228
  }, i))
6233
6229
  })]
6234
6230
  });
6235
6231
  if (catalogState.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6236
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
6232
+ className: _dsh_plugin_shop_css_26093961_default.panel,
6237
6233
  "data-shop-tab": true,
6238
6234
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6239
- className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
6235
+ className: _dsh_plugin_shop_css_26093961_default.stateLine,
6240
6236
  children: t("error")
6241
6237
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6242
6238
  type: "button",
6243
- className: _dsh_plugin_shop_css_e3675a89_default.actionButton,
6239
+ className: _dsh_plugin_shop_css_26093961_default.actionButton,
6244
6240
  onClick: () => setRequest({ kind: "retry" }),
6245
6241
  children: t("retry")
6246
6242
  })]
6247
6243
  });
6248
6244
  const { result } = catalogState;
6249
6245
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6250
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
6246
+ className: _dsh_plugin_shop_css_26093961_default.panel,
6251
6247
  "data-shop-tab": true,
6252
6248
  children: [
6253
6249
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6254
- className: _dsh_plugin_shop_css_e3675a89_default.toolbar,
6250
+ className: _dsh_plugin_shop_css_26093961_default.toolbar,
6255
6251
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
6256
6252
  type: "search",
6257
- className: _dsh_plugin_shop_css_e3675a89_default.searchInput,
6253
+ className: _dsh_plugin_shop_css_26093961_default.searchInput,
6258
6254
  "aria-label": t("search"),
6259
6255
  placeholder: t("search"),
6260
6256
  value: query,
@@ -6263,31 +6259,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6263
6259
  setVisibleCount(48);
6264
6260
  }
6265
6261
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6266
- className: _dsh_plugin_shop_css_e3675a89_default.toolbarRight,
6262
+ className: _dsh_plugin_shop_css_26093961_default.toolbarRight,
6267
6263
  children: [
6268
6264
  result.stale && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6269
- className: _dsh_plugin_shop_css_e3675a89_default.staleBlock,
6265
+ className: _dsh_plugin_shop_css_26093961_default.staleBlock,
6270
6266
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6271
- className: _dsh_plugin_shop_css_e3675a89_default.staleBadge,
6267
+ className: _dsh_plugin_shop_css_26093961_default.staleBadge,
6272
6268
  children: t("staleLabel", { date: result.builtAt.slice(0, 10) })
6273
6269
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6274
6270
  type: "button",
6275
- className: _dsh_plugin_shop_css_e3675a89_default.actionButton,
6271
+ className: _dsh_plugin_shop_css_26093961_default.actionButton,
6276
6272
  onClick: () => setRequest({ kind: "refresh" }),
6277
6273
  children: t("refresh")
6278
6274
  })]
6279
6275
  }),
6280
6276
  selfVersion !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6281
- className: _dsh_plugin_shop_css_e3675a89_default.versionBlock,
6277
+ className: _dsh_plugin_shop_css_26093961_default.versionBlock,
6282
6278
  children: [
6283
6279
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6284
- className: _dsh_plugin_shop_css_e3675a89_default.versionText,
6280
+ className: _dsh_plugin_shop_css_26093961_default.versionText,
6285
6281
  "data-shop-version": true,
6286
6282
  children: ["v", selfVersion.installed]
6287
6283
  }),
6288
6284
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6289
6285
  type: "button",
6290
- className: _dsh_plugin_shop_css_e3675a89_default.checkUpdateButton,
6286
+ className: _dsh_plugin_shop_css_26093961_default.checkUpdateButton,
6291
6287
  "data-shop-check-update": true,
6292
6288
  disabled: checkState !== "idle",
6293
6289
  onClick: () => void checkVersion(),
@@ -6295,7 +6291,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6295
6291
  }),
6296
6292
  selfVersion.outdated && selfVersion.latest !== null && selfUpdate.view.kind === "idle" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6297
6293
  type: "button",
6298
- className: _dsh_plugin_shop_css_e3675a89_default.updateSelfButton,
6294
+ className: _dsh_plugin_shop_css_26093961_default.updateSelfButton,
6299
6295
  "data-shop-update-self": true,
6300
6296
  onClick: () => {
6301
6297
  if (selfVersion.latest !== null) selfUpdate.start({ version: selfVersion.latest });
@@ -6305,7 +6301,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6305
6301
  ]
6306
6302
  }),
6307
6303
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
6308
- className: _dsh_plugin_shop_css_e3675a89_default.githubLink,
6304
+ className: _dsh_plugin_shop_css_26093961_default.githubLink,
6309
6305
  href: SHOP_REPO_URL,
6310
6306
  target: "_blank",
6311
6307
  rel: "noopener noreferrer",
@@ -6324,27 +6320,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6324
6320
  })]
6325
6321
  }),
6326
6322
  selfUpdate.view.kind === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6327
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6323
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
6328
6324
  "data-shop-self-updating": true,
6329
6325
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6330
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
6326
+ className: _dsh_plugin_shop_css_26093961_default.installing,
6331
6327
  children: t("installing")
6332
6328
  }), selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6333
- className: _dsh_plugin_shop_css_e3675a89_default.log,
6329
+ className: _dsh_plugin_shop_css_26093961_default.log,
6334
6330
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6335
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
6331
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
6336
6332
  children: line
6337
6333
  }, index))
6338
6334
  })]
6339
6335
  }),
6340
6336
  selfUpdate.view.kind === "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6341
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6337
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
6342
6338
  "data-shop-self-update-done": true,
6343
6339
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6344
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
6340
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
6345
6341
  children: [
6346
6342
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6347
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
6343
+ className: _dsh_plugin_shop_css_26093961_default.notice,
6348
6344
  children: t("installedRestartNotice")
6349
6345
  }),
6350
6346
  restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartPanel, {
@@ -6352,7 +6348,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6352
6348
  restart
6353
6349
  }),
6354
6350
  !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6355
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
6351
+ className: _dsh_plugin_shop_css_26093961_default.notice,
6356
6352
  "data-shop-restart-disabled": true,
6357
6353
  children: t("restartDisabledNotice")
6358
6354
  })
@@ -6360,34 +6356,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6360
6356
  })
6361
6357
  }),
6362
6358
  selfUpdate.view.kind === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6363
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6359
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
6364
6360
  "data-shop-self-update-failed": true,
6365
6361
  children: [
6366
6362
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6367
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
6363
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
6368
6364
  children: t("updateFailed")
6369
6365
  }),
6370
6366
  selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6371
- className: _dsh_plugin_shop_css_e3675a89_default.log,
6367
+ className: _dsh_plugin_shop_css_26093961_default.log,
6372
6368
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6373
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
6369
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
6374
6370
  children: line
6375
6371
  }, index))
6376
6372
  }),
6377
6373
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6378
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
6374
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
6379
6375
  children: selfUpdate.view.detail === "" ? t("updateTransportFailed") : selfUpdate.view.detail
6380
6376
  })
6381
6377
  ]
6382
6378
  }),
6383
6379
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6384
- className: _dsh_plugin_shop_css_e3675a89_default.categoryBar,
6380
+ className: _dsh_plugin_shop_css_26093961_default.categoryBar,
6385
6381
  role: "group",
6386
6382
  "aria-label": t("catalog"),
6387
6383
  children: [
6388
6384
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6389
6385
  type: "button",
6390
- className: category === null ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6386
+ className: category === null ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
6391
6387
  "aria-pressed": category === null,
6392
6388
  onClick: () => {
6393
6389
  setCategory(null);
@@ -6401,7 +6397,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6401
6397
  }),
6402
6398
  CATEGORY_ORDER.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6403
6399
  type: "button",
6404
- className: category === key ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6400
+ className: category === key ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
6405
6401
  "aria-pressed": category === key,
6406
6402
  onClick: () => {
6407
6403
  setCategory(key);
@@ -6415,7 +6411,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6415
6411
  }, key)),
6416
6412
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6417
6413
  type: "button",
6418
- className: category === "installed" ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6414
+ className: category === "installed" ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
6419
6415
  "aria-pressed": category === "installed",
6420
6416
  onClick: () => {
6421
6417
  setCategory("installed");
@@ -6430,20 +6426,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6430
6426
  ]
6431
6427
  }),
6432
6428
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6433
- className: _dsh_plugin_shop_css_e3675a89_default.catalogStats,
6429
+ className: _dsh_plugin_shop_css_26093961_default.catalogStats,
6434
6430
  children: t("catalogStats", {
6435
6431
  count: String(result.plugins.length),
6436
6432
  date: result.builtAt.slice(0, 10)
6437
6433
  })
6438
6434
  }),
6439
6435
  result.plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6440
- className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
6436
+ className: _dsh_plugin_shop_css_26093961_default.emptyLine,
6441
6437
  children: t("empty")
6442
6438
  }) : filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6443
- className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
6439
+ className: _dsh_plugin_shop_css_26093961_default.emptyLine,
6444
6440
  children: t("emptySearch")
6445
6441
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
6446
- className: _dsh_plugin_shop_css_e3675a89_default.cards,
6442
+ className: _dsh_plugin_shop_css_26093961_default.cards,
6447
6443
  children: [visible.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EntryCard, {
6448
6444
  entry,
6449
6445
  stars: starsOf(entry, stars),
@@ -6458,12 +6454,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6458
6454
  setEnabled
6459
6455
  }) }, entryKey(entry))), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
6460
6456
  ref: sentinelRef,
6461
- className: _dsh_plugin_shop_css_e3675a89_default.cardsSentry,
6457
+ className: _dsh_plugin_shop_css_26093961_default.cardsSentry,
6462
6458
  "data-shop-sentry": true,
6463
6459
  "aria-hidden": "true"
6464
6460
  })]
6465
6461
  }), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6466
- className: _dsh_plugin_shop_css_e3675a89_default.showingLine,
6462
+ className: _dsh_plugin_shop_css_26093961_default.showingLine,
6467
6463
  "aria-live": "polite",
6468
6464
  children: t("showing", {
6469
6465
  shown: String(visibleCount),