dsh-plugin-shop 0.8.0-beta.3 → 0.8.0

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.
Files changed (3) hide show
  1. package/README.md +3 -3
  2. package/lib/client.js +251 -242
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -35,9 +35,9 @@ install them once with `npm install -g @deepseek-ai/dsh pnpm` and verify with
35
35
  # holds back very recent releases, so a bare `add dsh-plugin-shop` can hand
36
36
  # you an older version for a while. Pin the current release — refresh it
37
37
  # with `npm view dsh-plugin-shop version`.
38
- dsh plugin --profile web add dsh-plugin-shop@0.7.4
38
+ dsh plugin --profile web add dsh-plugin-shop@0.8.0
39
39
  # or straight through npx, nothing installed:
40
- npx -y @deepseek-ai/dsh plugin --profile web add dsh-plugin-shop@0.7.4
40
+ npx -y @deepseek-ai/dsh plugin --profile web add dsh-plugin-shop@0.8.0
41
41
  ```
42
42
 
43
43
  Replace `web` with your profile if you use another one. Then restart `dsh` once — a
@@ -67,7 +67,7 @@ ls -1 "${DSH_HOME:-$HOME/.dsh}/profiles" | grep -v '^node_modules$'
67
67
  cooldown, and deterministic installs are the point of the agent path.
68
68
 
69
69
  ```sh
70
- dsh plugin --profile <profile> add dsh-plugin-shop@0.7.4
70
+ dsh plugin --profile <profile> add dsh-plugin-shop@0.8.0
71
71
  ```
72
72
 
73
73
  **3. Verify — do not skip this.** A zero exit from step 2 means pnpm resolved the
package/lib/client.js CHANGED
@@ -4703,14 +4703,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4703
4703
  * package that presents its own catalog of dsh plugins inside the Harness:
4704
4704
  * `dsh-plugin` is the npm package of github.com/dshplugin/dsh-plugin-hub,
4705
4705
  * `dsh-plugin-hub` and `@lanbaolu/dsh-plugin-hub` are app-store packages,
4706
- * and `@mutocenew/dsh-plugin-catalog` ships a plugin directory with agent
4707
- * query tools. Exact names only — nothing here is a pattern.
4706
+ * `@mutocenew/dsh-plugin-catalog` ships a plugin directory with agent
4707
+ * query tools, and `@dsheval/dsh-top100-plugin` is dsheval.ai's rankings
4708
+ * market: "Discover, install and manage DSH-Eval Top100 plugins and Skills
4709
+ * in DeepSeek Harness", a Settings panel its own README heads "plugin
4710
+ * market" and which installs, updates and uninstalls from that index.
4711
+ *
4712
+ * A market can be named after anything, so this list only ever grows by
4713
+ * someone reading a package: a ranking, a leaderboard, a digest and an
4714
+ * index are all shopfronts, and none of those words is a store keyword.
4715
+ * Exact names only — nothing here is a pattern.
4708
4716
  */
4709
4717
  const SHOP_LIKE_NAMES = [
4710
4718
  "dsh-plugin",
4711
4719
  "dsh-plugin-hub",
4712
4720
  "@lanbaolu/dsh-plugin-hub",
4713
- "@mutocenew/dsh-plugin-catalog"
4721
+ "@mutocenew/dsh-plugin-catalog",
4722
+ "@dsheval/dsh-top100-plugin"
4714
4723
  ];
4715
4724
  /**
4716
4725
  * Whether a package name reads as a plugin shop (a marketplace for dsh
@@ -6909,111 +6918,111 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6909
6918
  };
6910
6919
  }
6911
6920
  //#endregion
6912
- //#region \0dsh-plugin-shop-css:e3675a89
6913
- 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 *\n * Clipped on BOTH axes, with a margin, because `.s232ec4_searchInput` sits at\n * exactly (0, 0) of this box — it is the first child of `.s646509_toolbar`, itself\n * the first child here, and this rule carries no padding — so its focus\n * ring paints ENTIRELY outside the panel.\n *\n * Both axes is the load-bearing part: `overflow-clip-margin` is inert\n * unless the element clips on both. Clipping x alone left the margin doing\n * nothing — measured against the live app on 0.7.1, the ring reached 0 of\n * its 3px on the left at every device pixel ratio (1, 1.25, 1.5, 2), while\n * keeping the full 3px on the right, where the 280px input stops short of\n * the panel and never meets the clip edge. Raising the margin to 6px\n * changed nothing; clipping both axes with the SAME 3px restored the whole\n * ring. A test that reads declarations cannot see that difference, which is\n * why the first attempt at this shipped broken.\n *\n * `clip` is not a scroll container, so this does not bring back the\n * accidental scrolling `hidden` caused by coercing the other axis to\n * `auto`. Nothing is lost vertically: the panel's scrollHeight equals its\n * height and no descendant paints outside the clip rect (measured).\n * `overflow-x: hidden` stays as the fallback for engines without `clip`,\n * where the ring is clipped as it was before, never worse. */\n overflow-x: hidden;\n overflow: clip;\n overflow-clip-margin: 3px;\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.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.seb0a1e_catalogStatsRow {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 6px 0 0;\n}\n\n.sccc4d1_catalogStats {\n margin: 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/* Sits beside the 12px stats caption, so it is quieter than `.s73242a_actionButton`:\n * this is an affordance, not a call to action — the catalog reloads on its\n * own at mount and the shelf is already usable without it. */\n.s64a5ff_reloadButton {\n padding: 1px 9px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 17px;\n cursor: pointer;\n}\n\n.s64a5ff_reloadButton:hover:not(:disabled) {\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.s64a5ff_reloadButton:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n.s64a5ff_reloadButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s4453f3_reloadFailed {\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\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 flex-shrink: 0;\n padding: 3px 9px;\n border-radius: 999px;\n font-size: 12px;\n white-space: nowrap;\n color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-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/* `white-space: pre-line` so the newline in the copy is the copy's own: the\n dictionary decides where the line breaks, and a translator changes it\n without touching the component. Collapses runs of spaces like `normal`, so\n only the explicit \\n survives. */\n.s6eca19_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n white-space: pre-line;\n color: var(--dsw-alias-state-error-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.sb00c36_restartSelfButton {\n /* The version row's third state. Geometry matches .s614a38_checkUpdateButton and\n * .sa04455_updateSelfButton exactly — the row is one evolving control and a\n * different pill would read as a different kind of thing. It takes the\n * emphasised fill rather than the neutral one because at that moment the\n * restart is the only thing left to do, the same reason Update has it. */\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.sb00c36_restartSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\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 white-space: pre-line;\n color: var(--dsw-alias-state-error-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";
6914
- if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"e3675a89\"]")) {
6921
+ //#region \0dsh-plugin-shop-css:26093961
6922
+ 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 * Clipped on BOTH axes, with a margin, because `.se23a0e_searchInput` sits at\n * exactly (0, 0) of this box — it is the first child of `.s27ad76_toolbar`, itself\n * the first child here, and this rule carries no padding — so its focus\n * ring paints ENTIRELY outside the panel.\n *\n * Both axes is the load-bearing part: `overflow-clip-margin` is inert\n * unless the element clips on both. Clipping x alone left the margin doing\n * nothing — measured against the live app on 0.7.1, the ring reached 0 of\n * its 3px on the left at every device pixel ratio (1, 1.25, 1.5, 2), while\n * keeping the full 3px on the right, where the 280px input stops short of\n * the panel and never meets the clip edge. Raising the margin to 6px\n * changed nothing; clipping both axes with the SAME 3px restored the whole\n * ring. A test that reads declarations cannot see that difference, which is\n * why the first attempt at this shipped broken.\n *\n * `clip` is not a scroll container, so this does not bring back the\n * accidental scrolling `hidden` caused by coercing the other axis to\n * `auto`. Nothing is lost vertically: the panel's scrollHeight equals its\n * height and no descendant paints outside the clip rect (measured).\n * `overflow-x: hidden` stays as the fallback for engines without `clip`,\n * where the ring is clipped as it was before, never worse. */\n overflow-x: hidden;\n overflow: 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.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.sf2305c_catalogStatsRow {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 6px 0 0;\n}\n\n.s38a33e_catalogStats {\n margin: 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/* Sits beside the 12px stats caption, so it is quieter than `.sb632c0_actionButton`:\n * this is an affordance, not a call to action — the catalog reloads on its\n * own at mount and the shelf is already usable without it. */\n.s71d105_reloadButton {\n padding: 1px 9px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 17px;\n cursor: pointer;\n}\n\n.s71d105_reloadButton:hover:not(:disabled) {\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.s71d105_reloadButton:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n.s71d105_reloadButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sa079ea_reloadFailed {\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\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 flex-shrink: 0;\n padding: 3px 9px;\n border-radius: 999px;\n font-size: 12px;\n white-space: nowrap;\n color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-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/* `white-space: pre-line` so the newline in the copy is the copy's own: the\n dictionary decides where the line breaks, and a translator changes it\n without touching the component. Collapses runs of spaces like `normal`, so\n only the explicit \\n survives. */\n.s45793c_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n white-space: pre-line;\n color: var(--dsw-alias-state-error-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.sdc8ac4_restartSelfButton {\n /* The version row's third state. Geometry matches .secd6a2_checkUpdateButton and\n * .s40b16e_updateSelfButton exactly — the row is one evolving control and a\n * different pill would read as a different kind of thing. It takes the\n * emphasised fill rather than the neutral one because at that moment the\n * restart is the only thing left to do, the same reason Update has it. */\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.sdc8ac4_restartSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\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 white-space: pre-line;\n color: var(--dsw-alias-state-error-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";
6923
+ if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"26093961\"]")) {
6915
6924
  const tag = document.createElement("style");
6916
- tag.dataset.pluginCss = "e3675a89";
6925
+ tag.dataset.pluginCss = "26093961";
6917
6926
  tag.textContent = css;
6918
6927
  document.head.appendChild(tag);
6919
6928
  }
6920
- var _dsh_plugin_shop_css_e3675a89_default = {
6921
- "client": "s8583e3_client",
6922
- "config": "s942a79_config",
6923
- "ts": "s5f67aa_ts",
6924
- "spec": "sfd9d8a_spec",
6925
- "panel": "s255e5a_panel",
6926
- "searchInput": "s232ec4_searchInput",
6927
- "toolbar": "s646509_toolbar",
6928
- "stateLine": "s44a3ec_stateLine",
6929
- "srOnly": "s3a0ece_srOnly",
6930
- "skeletonGrid": "se0c3b4_skeletonGrid",
6931
- "skeletonCard": "s520416_skeletonCard",
6932
- "skeletonName": "s8c7d6f_skeletonName",
6933
- "skeletonSummary": "sf5179e_skeletonSummary",
6934
- "skeletonSummaryShort": "sbb0d25_skeletonSummaryShort",
6935
- "skeletonActions": "s96e910_skeletonActions",
6936
- "actionButton": "s73242a_actionButton",
6937
- "toolbarRight": "s745e3c_toolbarRight",
6938
- "versionBlock": "s4fe61f_versionBlock",
6939
- "versionText": "sb9b924_versionText",
6940
- "updateSelfButton": "sa04455_updateSelfButton",
6941
- "checkUpdateButton": "s614a38_checkUpdateButton",
6942
- "githubLink": "sa987f7_githubLink",
6943
- "selfUpdatePanel": "sb81ba5_selfUpdatePanel",
6944
- "staleBadge": "s3946f1_staleBadge",
6945
- "categoryBar": "sb2c859_categoryBar",
6946
- "categoryButton": "s26d58e_categoryButton",
6947
- "categoryButtonOn": "s5f68c4_categoryButtonOn",
6948
- "catalogHeading": "s668774_catalogHeading",
6949
- "catalogStatsRow": "seb0a1e_catalogStatsRow",
6950
- "catalogStats": "sccc4d1_catalogStats",
6951
- "reloadButton": "s64a5ff_reloadButton",
6952
- "reloadFailed": "s4453f3_reloadFailed",
6953
- "emptyLine": "s6de1ab_emptyLine",
6954
- "cards": "sf657f5_cards",
6955
- "card": "s65f383_card",
6956
- "cardsSentry": "sd7ee01_cardsSentry",
6957
- "showingLine": "s705cc6_showingLine",
6958
- "cardSpine": "s4ce25d_cardSpine",
6959
- "categoryBadge": "s9c8eaa_categoryBadge",
6960
- "entryHeader": "sa97234_entryHeader",
6961
- "name": "sc3f149_name",
6962
- "badges": "s513026_badges",
6963
- "cardActions": "s9b5048_cardActions",
6964
- "gate": "sc4f2ac_gate",
6965
- "installPanel": "s4d374c_installPanel",
6966
- "installedActions": "sf53ca0_installedActions",
6967
- "cardVersion": "sc6ec6e_cardVersion",
6968
- "sourceBadge": "s71f10f_sourceBadge",
6969
- "tierBadge": "s5e82cb_tierBadge",
6970
- "incompatibleBadge": "s4bbe02_incompatibleBadge",
6971
- "starsBadge": "sff43b4_starsBadge",
6972
- "chevron": "s73f7fb_chevron",
6973
- "chevronOpen": "s61393c_chevronOpen",
6974
- "body": "s820ebf_body",
6975
- "summary": "sb8fbc8_summary",
6976
- "summaryZh": "se507db_summaryZh",
6977
- "summaryExpanded": "s10baf0_summaryExpanded",
6978
- "summaryZhExpanded": "sb9dba9_summaryZhExpanded",
6979
- "incompatibleDetail": "s6eca19_incompatibleDetail",
6980
- "capabilitiesBlock": "s9d2029_capabilitiesBlock",
6981
- "capabilitiesNote": "s3bdbd5_capabilitiesNote",
6982
- "capabilities": "s441702_capabilities",
6983
- "detail": "sde3f0c_detail",
6984
- "detailRows": "se98179_detailRows",
6985
- "detailRow": "sfb4d2f_detailRow",
6986
- "author": "s1ff66f_author",
6987
- "reviewedLine": "sd58c6d_reviewedLine",
6988
- "installButton": "se7aaed_installButton",
6989
- "confirmButton": "sb43a49_confirmButton",
6990
- "cancelButton": "s6e45d1_cancelButton",
6991
- "installedLabel": "sb6fc74_installedLabel",
6992
- "uninstallButton": "s96967f_uninstallButton",
6993
- "restartSelfButton": "sb00c36_restartSelfButton",
6994
- "restartButton": "s6ac237_restartButton",
6995
- "gateTitle": "s559c38_gateTitle",
6996
- "gateBody": "s3c0ace_gateBody",
6997
- "gateWarning": "sc323e5_gateWarning",
6998
- "gateActions": "s4b2373_gateActions",
6999
- "installing": "s52b5a5_installing",
7000
- "log": "s64ab71_log",
7001
- "logLine": "s1531a8_logLine",
7002
- "notice": "sf20dda_notice",
7003
- "failedHeading": "seb9b08_failedHeading",
7004
- "failedDetail": "sfd3021_failedDetail",
7005
- "rejectedCode": "s50ba35_rejectedCode",
7006
- "rejectedDetail": "se75489_rejectedDetail",
7007
- "outdatedSection": "sa276cf_outdatedSection",
7008
- "outdatedList": "sceae6e_outdatedList",
7009
- "outdatedRow": "s8d2072_outdatedRow",
7010
- "outdatedInfo": "s5c2545_outdatedInfo",
7011
- "outdatedVersions": "s877c68_outdatedVersions",
7012
- "outdatedActions": "sa1f556_outdatedActions",
7013
- "switch": "s11c019_switch",
7014
- "switchOn": "s7580e8_switchOn",
7015
- "switchKnob": "saab2b3_switchKnob",
7016
- "switchWrap": "sd9f9e4_switchWrap"
6929
+ var _dsh_plugin_shop_css_26093961_default = {
6930
+ "client": "sfae5fa_client",
6931
+ "config": "se9da7d_config",
6932
+ "ts": "se722f1_ts",
6933
+ "spec": "s2f7a8b_spec",
6934
+ "panel": "s99b207_panel",
6935
+ "searchInput": "se23a0e_searchInput",
6936
+ "toolbar": "s27ad76_toolbar",
6937
+ "stateLine": "s2abe0f_stateLine",
6938
+ "srOnly": "sfb85e5_srOnly",
6939
+ "skeletonGrid": "s728a01_skeletonGrid",
6940
+ "skeletonCard": "s33d002_skeletonCard",
6941
+ "skeletonName": "s46e666_skeletonName",
6942
+ "skeletonSummary": "s2a467d_skeletonSummary",
6943
+ "skeletonSummaryShort": "s232601_skeletonSummaryShort",
6944
+ "skeletonActions": "sde9b0c_skeletonActions",
6945
+ "actionButton": "sb632c0_actionButton",
6946
+ "toolbarRight": "saba3c3_toolbarRight",
6947
+ "versionBlock": "s6736c0_versionBlock",
6948
+ "versionText": "s2dff04_versionText",
6949
+ "updateSelfButton": "s40b16e_updateSelfButton",
6950
+ "checkUpdateButton": "secd6a2_checkUpdateButton",
6951
+ "githubLink": "s5e1ce3_githubLink",
6952
+ "selfUpdatePanel": "s798348_selfUpdatePanel",
6953
+ "staleBadge": "see2588_staleBadge",
6954
+ "categoryBar": "se67e0b_categoryBar",
6955
+ "categoryButton": "s8c06a0_categoryButton",
6956
+ "categoryButtonOn": "s65a55a_categoryButtonOn",
6957
+ "catalogHeading": "sb6cdd6_catalogHeading",
6958
+ "catalogStatsRow": "sf2305c_catalogStatsRow",
6959
+ "catalogStats": "s38a33e_catalogStats",
6960
+ "reloadButton": "s71d105_reloadButton",
6961
+ "reloadFailed": "sa079ea_reloadFailed",
6962
+ "emptyLine": "se3ba96_emptyLine",
6963
+ "cards": "sb41fe1_cards",
6964
+ "card": "sfcd584_card",
6965
+ "cardsSentry": "sf2d932_cardsSentry",
6966
+ "showingLine": "s947694_showingLine",
6967
+ "cardSpine": "sfc4028_cardSpine",
6968
+ "categoryBadge": "sb94610_categoryBadge",
6969
+ "entryHeader": "s50a94e_entryHeader",
6970
+ "name": "sfdbf47_name",
6971
+ "badges": "s28e55e_badges",
6972
+ "cardActions": "s9359c0_cardActions",
6973
+ "gate": "s549462_gate",
6974
+ "installPanel": "s20fbe0_installPanel",
6975
+ "installedActions": "s94517f_installedActions",
6976
+ "cardVersion": "sc54e24_cardVersion",
6977
+ "sourceBadge": "s623bee_sourceBadge",
6978
+ "tierBadge": "sf9a12c_tierBadge",
6979
+ "incompatibleBadge": "s671f97_incompatibleBadge",
6980
+ "starsBadge": "s963e5c_starsBadge",
6981
+ "chevron": "sbb5739_chevron",
6982
+ "chevronOpen": "s4e56e8_chevronOpen",
6983
+ "body": "sf9a60a_body",
6984
+ "summary": "sfd2791_summary",
6985
+ "summaryZh": "s69ed84_summaryZh",
6986
+ "summaryExpanded": "s83c8c8_summaryExpanded",
6987
+ "summaryZhExpanded": "s20b5b9_summaryZhExpanded",
6988
+ "incompatibleDetail": "s45793c_incompatibleDetail",
6989
+ "capabilitiesBlock": "s551fd2_capabilitiesBlock",
6990
+ "capabilitiesNote": "sb1f0de_capabilitiesNote",
6991
+ "capabilities": "s9a5379_capabilities",
6992
+ "detail": "s9e0e76_detail",
6993
+ "detailRows": "s41121d_detailRows",
6994
+ "detailRow": "s852a05_detailRow",
6995
+ "author": "s367f3b_author",
6996
+ "reviewedLine": "s2f9e91_reviewedLine",
6997
+ "installButton": "s89d599_installButton",
6998
+ "confirmButton": "s7b4348_confirmButton",
6999
+ "cancelButton": "s20b00b_cancelButton",
7000
+ "installedLabel": "s1e55fb_installedLabel",
7001
+ "uninstallButton": "s432016_uninstallButton",
7002
+ "restartSelfButton": "sdc8ac4_restartSelfButton",
7003
+ "restartButton": "s5c0f5a_restartButton",
7004
+ "gateTitle": "sed2c7d_gateTitle",
7005
+ "gateBody": "sdce129_gateBody",
7006
+ "gateWarning": "sfae869_gateWarning",
7007
+ "gateActions": "sae8426_gateActions",
7008
+ "installing": "s260a62_installing",
7009
+ "log": "sba0b9c_log",
7010
+ "logLine": "s5c7c9d_logLine",
7011
+ "notice": "sebdc74_notice",
7012
+ "failedHeading": "s2672db_failedHeading",
7013
+ "failedDetail": "s3a9748_failedDetail",
7014
+ "rejectedCode": "sc1144d_rejectedCode",
7015
+ "rejectedDetail": "s2209a3_rejectedDetail",
7016
+ "outdatedSection": "sb4abbb_outdatedSection",
7017
+ "outdatedList": "sbca39c_outdatedList",
7018
+ "outdatedRow": "s1abd04_outdatedRow",
7019
+ "outdatedInfo": "s10dca9_outdatedInfo",
7020
+ "outdatedVersions": "sb04966_outdatedVersions",
7021
+ "outdatedActions": "see54bf_outdatedActions",
7022
+ "switch": "sa65b66_switch",
7023
+ "switchOn": "s50b82f_switchOn",
7024
+ "switchKnob": "sbbb39a_switchKnob",
7025
+ "switchWrap": "s24b48c_switchWrap"
7017
7026
  };
7018
7027
  //#endregion
7019
7028
  //#region src/client/ShopTab.tsx
@@ -7030,7 +7039,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7030
7039
  width: "14",
7031
7040
  height: "14",
7032
7041
  "aria-hidden": "true",
7033
- className: open ? _dsh_plugin_shop_css_e3675a89_default.chevronOpen : _dsh_plugin_shop_css_e3675a89_default.chevron,
7042
+ className: open ? _dsh_plugin_shop_css_26093961_default.chevronOpen : _dsh_plugin_shop_css_26093961_default.chevron,
7034
7043
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7035
7044
  fill: "currentColor",
7036
7045
  d: "M3.5 6 8 10.5 12.5 6l1 1L8 12.5 2.5 7l1-1Z"
@@ -7064,32 +7073,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7064
7073
  onSettled();
7065
7074
  }, [flow, onSettled]);
7066
7075
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7067
- className: _dsh_plugin_shop_css_e3675a89_default.card,
7076
+ className: _dsh_plugin_shop_css_26093961_default.card,
7068
7077
  "data-shop-entry": entry.name,
7069
7078
  "data-category": category,
7070
7079
  children: [
7071
7080
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7072
- className: _dsh_plugin_shop_css_e3675a89_default.cardSpine,
7081
+ className: _dsh_plugin_shop_css_26093961_default.cardSpine,
7073
7082
  "aria-hidden": "true"
7074
7083
  }),
7075
7084
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7076
7085
  type: "button",
7077
- className: _dsh_plugin_shop_css_e3675a89_default.entryHeader,
7086
+ className: _dsh_plugin_shop_css_26093961_default.entryHeader,
7078
7087
  "aria-expanded": open,
7079
7088
  "aria-controls": detailId,
7080
7089
  onClick: () => setOpen((current) => !current),
7081
7090
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7082
- className: _dsh_plugin_shop_css_e3675a89_default.name,
7091
+ className: _dsh_plugin_shop_css_26093961_default.name,
7083
7092
  children: entry.name
7084
7093
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7085
- className: _dsh_plugin_shop_css_e3675a89_default.badges,
7094
+ className: _dsh_plugin_shop_css_26093961_default.badges,
7086
7095
  children: [
7087
7096
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7088
- className: _dsh_plugin_shop_css_e3675a89_default.categoryBadge,
7097
+ className: _dsh_plugin_shop_css_26093961_default.categoryBadge,
7089
7098
  children: t(categoryKey(entry))
7090
7099
  }),
7091
7100
  entry.source === "npm" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7092
- className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
7101
+ className: _dsh_plugin_shop_css_26093961_default.sourceBadge,
7093
7102
  "data-shop-source-npm": true,
7094
7103
  role: "img",
7095
7104
  "aria-label": t("npmSource"),
@@ -7106,7 +7115,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7106
7115
  })
7107
7116
  }),
7108
7117
  hasGithubHome(entry) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7109
- className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
7118
+ className: _dsh_plugin_shop_css_26093961_default.sourceBadge,
7110
7119
  "data-shop-source-github": true,
7111
7120
  role: "img",
7112
7121
  "aria-label": t("githubSource"),
@@ -7120,17 +7129,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7120
7129
  })
7121
7130
  }),
7122
7131
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7123
- className: _dsh_plugin_shop_css_e3675a89_default.cardVersion,
7132
+ className: _dsh_plugin_shop_css_26093961_default.cardVersion,
7124
7133
  "data-card-version": true,
7125
7134
  children: ["v", displayVersion(entry)]
7126
7135
  }),
7127
7136
  entry.tier !== "community" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7128
- className: _dsh_plugin_shop_css_e3675a89_default.tierBadge,
7137
+ className: _dsh_plugin_shop_css_26093961_default.tierBadge,
7129
7138
  "data-tier": entry.tier,
7130
7139
  children: t(tierKey(entry.tier))
7131
7140
  }),
7132
7141
  stars !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7133
- className: _dsh_plugin_shop_css_e3675a89_default.starsBadge,
7142
+ className: _dsh_plugin_shop_css_26093961_default.starsBadge,
7134
7143
  role: "img",
7135
7144
  "aria-label": t("stars", { count: stars }),
7136
7145
  children: ["★ ", formatStars(stars)]
@@ -7140,39 +7149,39 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7140
7149
  })]
7141
7150
  }),
7142
7151
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7143
- className: _dsh_plugin_shop_css_e3675a89_default.body,
7152
+ className: _dsh_plugin_shop_css_26093961_default.body,
7144
7153
  children: [
7145
7154
  summary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7146
- className: open ? `${_dsh_plugin_shop_css_e3675a89_default.summary} ${_dsh_plugin_shop_css_e3675a89_default.summaryExpanded}` : _dsh_plugin_shop_css_e3675a89_default.summary,
7155
+ className: open ? `${_dsh_plugin_shop_css_26093961_default.summary} ${_dsh_plugin_shop_css_26093961_default.summaryExpanded}` : _dsh_plugin_shop_css_26093961_default.summary,
7147
7156
  children: summary.en
7148
7157
  }),
7149
7158
  summary?.zh !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7150
- className: open ? `${_dsh_plugin_shop_css_e3675a89_default.summaryZh} ${_dsh_plugin_shop_css_e3675a89_default.summaryZhExpanded}` : _dsh_plugin_shop_css_e3675a89_default.summaryZh,
7159
+ className: open ? `${_dsh_plugin_shop_css_26093961_default.summaryZh} ${_dsh_plugin_shop_css_26093961_default.summaryZhExpanded}` : _dsh_plugin_shop_css_26093961_default.summaryZh,
7151
7160
  children: summary.zh
7152
7161
  }),
7153
7162
  blockers.map((blocker) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7154
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleDetail,
7163
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleDetail,
7155
7164
  "data-shop-incompatible-detail": true,
7156
7165
  children: blocker.text
7157
7166
  }, blocker.kind)),
7158
7167
  open && entry.catalog !== void 0 && entry.catalog.capabilities.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7159
- className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesBlock,
7168
+ className: _dsh_plugin_shop_css_26093961_default.capabilitiesBlock,
7160
7169
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7161
- className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesNote,
7170
+ className: _dsh_plugin_shop_css_26093961_default.capabilitiesNote,
7162
7171
  children: t("capabilitiesNote")
7163
7172
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
7164
- className: _dsh_plugin_shop_css_e3675a89_default.capabilities,
7173
+ className: _dsh_plugin_shop_css_26093961_default.capabilities,
7165
7174
  children: entry.catalog.capabilities.map((capability) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: capability }, capability))
7166
7175
  })]
7167
7176
  }),
7168
7177
  open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
7169
7178
  id: detailId,
7170
- className: _dsh_plugin_shop_css_e3675a89_default.detail,
7179
+ className: _dsh_plugin_shop_css_26093961_default.detail,
7171
7180
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
7172
- className: _dsh_plugin_shop_css_e3675a89_default.detailRows,
7181
+ className: _dsh_plugin_shop_css_26093961_default.detailRows,
7173
7182
  children: [
7174
7183
  npmUrl !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7175
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
7184
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
7176
7185
  "data-shop-npm": true,
7177
7186
  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", {
7178
7187
  href: npmUrl,
@@ -7182,7 +7191,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7182
7191
  }) })]
7183
7192
  }),
7184
7193
  entry.repository !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7185
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
7194
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
7186
7195
  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", {
7187
7196
  href: entry.repository,
7188
7197
  target: "_blank",
@@ -7191,12 +7200,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7191
7200
  }) : entry.repository })]
7192
7201
  }),
7193
7202
  entry.license !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7194
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
7203
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
7195
7204
  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 })]
7196
7205
  })
7197
7206
  ]
7198
7207
  }), entry.tier === "verified-stale" && entry.review !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7199
- className: _dsh_plugin_shop_css_e3675a89_default.reviewedLine,
7208
+ className: _dsh_plugin_shop_css_26093961_default.reviewedLine,
7200
7209
  children: entry.review.reviewedVersion !== void 0 ? t("reviewedVersionLine", {
7201
7210
  reviewed: entry.review.reviewedVersion,
7202
7211
  current: entry.version
@@ -7209,7 +7218,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7209
7218
  ]
7210
7219
  }),
7211
7220
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7212
- className: _dsh_plugin_shop_css_e3675a89_default.cardActions,
7221
+ className: _dsh_plugin_shop_css_26093961_default.cardActions,
7213
7222
  "data-shop-actions": true,
7214
7223
  children: [installed === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InstallPanel, {
7215
7224
  target: installTarget,
@@ -7234,7 +7243,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7234
7243
  restart,
7235
7244
  restartSupported
7236
7245
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7237
- className: _dsh_plugin_shop_css_e3675a89_default.installedLabel,
7246
+ className: _dsh_plugin_shop_css_26093961_default.installedLabel,
7238
7247
  "data-shop-installed": true,
7239
7248
  children: t("installed")
7240
7249
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BlockerBadge, {
@@ -7256,7 +7265,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7256
7265
  onSettled: uninstallSettled
7257
7266
  })
7258
7267
  ] }), author !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7259
- className: _dsh_plugin_shop_css_e3675a89_default.author,
7268
+ className: _dsh_plugin_shop_css_26093961_default.author,
7260
7269
  "data-shop-author": true,
7261
7270
  children: t("authorLine", { author })
7262
7271
  })]
@@ -7294,7 +7303,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7294
7303
  const detail = blockers.map((blocker) => blocker.text).join("\n");
7295
7304
  const taken = blockers.some((blocker) => blocker.kind === "name-taken");
7296
7305
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7297
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleBadge,
7306
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleBadge,
7298
7307
  "data-shop-blocker": taken ? "name-taken" : "missing-peers",
7299
7308
  role: "img",
7300
7309
  "aria-label": detail,
@@ -7311,30 +7320,30 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7311
7320
  const [gateOpen, setGateOpen] = (0, react.useState)(false);
7312
7321
  const { view, start } = flow;
7313
7322
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7314
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7323
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7315
7324
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7316
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
7325
+ className: _dsh_plugin_shop_css_26093961_default.installing,
7317
7326
  children: t("installing")
7318
7327
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7319
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7328
+ className: _dsh_plugin_shop_css_26093961_default.log,
7320
7329
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7321
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7330
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7322
7331
  children: line
7323
7332
  }, index))
7324
7333
  })]
7325
7334
  });
7326
7335
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7327
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
7336
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
7328
7337
  children: [
7329
7338
  view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7330
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7339
+ className: _dsh_plugin_shop_css_26093961_default.log,
7331
7340
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7332
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7341
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7333
7342
  children: line
7334
7343
  }, index))
7335
7344
  }),
7336
7345
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7337
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7346
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7338
7347
  "data-shop-restart-notice": true,
7339
7348
  children: view.needsRestart ? t(restartReasonKey(view.restartReason)) : t("installedNoRestartNotice")
7340
7349
  }),
@@ -7343,63 +7352,63 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7343
7352
  restart
7344
7353
  }),
7345
7354
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7346
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7355
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7347
7356
  "data-shop-restart-disabled": true,
7348
7357
  children: t("restartDisabledNotice")
7349
7358
  })
7350
7359
  ]
7351
7360
  });
7352
7361
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7353
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7362
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7354
7363
  children: [
7355
7364
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7356
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
7365
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
7357
7366
  children: t("installFailed")
7358
7367
  }),
7359
7368
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7360
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7369
+ className: _dsh_plugin_shop_css_26093961_default.log,
7361
7370
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7362
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7371
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7363
7372
  children: line
7364
7373
  }, index))
7365
7374
  }),
7366
7375
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7367
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
7376
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
7368
7377
  children: view.detail === "" ? t("installTransportFailed") : view.detail
7369
7378
  })
7370
7379
  ]
7371
7380
  });
7372
7381
  if (view.kind === "rejected") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7373
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7382
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7374
7383
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7375
- className: _dsh_plugin_shop_css_e3675a89_default.rejectedCode,
7384
+ className: _dsh_plugin_shop_css_26093961_default.rejectedCode,
7376
7385
  children: t(rejectionCodeKey(view.code))
7377
7386
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7378
- className: _dsh_plugin_shop_css_e3675a89_default.rejectedDetail,
7387
+ className: _dsh_plugin_shop_css_26093961_default.rejectedDetail,
7379
7388
  children: view.detail
7380
7389
  })]
7381
7390
  });
7382
7391
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7383
- className: _dsh_plugin_shop_css_e3675a89_default.gate,
7392
+ className: _dsh_plugin_shop_css_26093961_default.gate,
7384
7393
  children: [
7385
7394
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7386
- className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
7395
+ className: _dsh_plugin_shop_css_26093961_default.gateTitle,
7387
7396
  children: t("acknowledgementTitle")
7388
7397
  }),
7389
7398
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7390
- className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
7399
+ className: _dsh_plugin_shop_css_26093961_default.gateBody,
7391
7400
  children: t("acknowledgementBody")
7392
7401
  }),
7393
7402
  !missingStated && blockersOf(missing, void 0, t).map((blocker) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7394
- className: _dsh_plugin_shop_css_e3675a89_default.gateWarning,
7403
+ className: _dsh_plugin_shop_css_26093961_default.gateWarning,
7395
7404
  "data-shop-incompatible-warning": true,
7396
7405
  children: blocker.text
7397
7406
  }, blocker.kind)),
7398
7407
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7399
- className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
7408
+ className: _dsh_plugin_shop_css_26093961_default.gateActions,
7400
7409
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7401
7410
  type: "button",
7402
- className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
7411
+ className: _dsh_plugin_shop_css_26093961_default.confirmButton,
7403
7412
  "data-shop-confirm": true,
7404
7413
  onClick: () => {
7405
7414
  setGateOpen(false);
@@ -7411,7 +7420,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7411
7420
  children: t("confirm")
7412
7421
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7413
7422
  type: "button",
7414
- className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
7423
+ className: _dsh_plugin_shop_css_26093961_default.cancelButton,
7415
7424
  onClick: () => setGateOpen(false),
7416
7425
  children: t("cancel")
7417
7426
  })]
@@ -7422,7 +7431,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7422
7431
  const refused = blockers.some((blocker) => blocker.kind === "name-taken");
7423
7432
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7424
7433
  type: "button",
7425
- className: _dsh_plugin_shop_css_e3675a89_default.installButton,
7434
+ className: _dsh_plugin_shop_css_26093961_default.installButton,
7426
7435
  disabled: refused,
7427
7436
  ...refused ? { "data-shop-refused": true } : {},
7428
7437
  ...update ? { "data-shop-update": true } : { "data-shop-install": true },
@@ -7453,23 +7462,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7453
7462
  if (view.kind === "done") settled.current();
7454
7463
  }, [view.kind]);
7455
7464
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7456
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7465
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7457
7466
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7458
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
7467
+ className: _dsh_plugin_shop_css_26093961_default.installing,
7459
7468
  children: t("uninstalling")
7460
7469
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7461
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7470
+ className: _dsh_plugin_shop_css_26093961_default.log,
7462
7471
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7463
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7472
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7464
7473
  children: line
7465
7474
  }, index))
7466
7475
  })]
7467
7476
  });
7468
7477
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7469
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
7478
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
7470
7479
  children: [
7471
7480
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7472
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7481
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7473
7482
  "data-shop-uninstall-done": true,
7474
7483
  children: view.needsRestart ? t("uninstalledRestartNotice") : t("uninstalledLiveNotice")
7475
7484
  }),
@@ -7478,28 +7487,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7478
7487
  restart
7479
7488
  }),
7480
7489
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7481
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7490
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7482
7491
  "data-shop-restart-disabled": true,
7483
7492
  children: t("restartDisabledNotice")
7484
7493
  })
7485
7494
  ]
7486
7495
  });
7487
7496
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7488
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7497
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7489
7498
  children: [
7490
7499
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7491
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
7500
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
7492
7501
  children: t("uninstallFailed")
7493
7502
  }),
7494
7503
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7495
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7504
+ className: _dsh_plugin_shop_css_26093961_default.log,
7496
7505
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7497
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7506
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7498
7507
  children: line
7499
7508
  }, index))
7500
7509
  }),
7501
7510
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7502
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
7511
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
7503
7512
  children: view.detail === "" ? t("uninstallTransportFailed") : view.detail
7504
7513
  })
7505
7514
  ]
@@ -7507,7 +7516,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7507
7516
  if (view.kind !== "idle") return null;
7508
7517
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7509
7518
  type: "button",
7510
- className: _dsh_plugin_shop_css_e3675a89_default.uninstallButton,
7519
+ className: _dsh_plugin_shop_css_26093961_default.uninstallButton,
7511
7520
  "data-shop-uninstall": true,
7512
7521
  onClick: () => void start({ name }),
7513
7522
  children: t("uninstall")
@@ -7569,37 +7578,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7569
7578
  return () => clearInterval(timer);
7570
7579
  }, [state, t]);
7571
7580
  if (state.kind === "restarting") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7572
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7581
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7573
7582
  "data-shop-restarting": true,
7574
7583
  children: t("restarting")
7575
7584
  });
7576
7585
  if (state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7577
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
7586
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
7578
7587
  "data-shop-restart-error": true,
7579
7588
  children: state.detail
7580
7589
  });
7581
7590
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7582
- className: _dsh_plugin_shop_css_e3675a89_default.gate,
7591
+ className: _dsh_plugin_shop_css_26093961_default.gate,
7583
7592
  children: [
7584
7593
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7585
- className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
7594
+ className: _dsh_plugin_shop_css_26093961_default.gateTitle,
7586
7595
  children: t("restartTitle")
7587
7596
  }),
7588
7597
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7589
- className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
7598
+ className: _dsh_plugin_shop_css_26093961_default.gateBody,
7590
7599
  children: t("restartBody")
7591
7600
  }),
7592
7601
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7593
- className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
7602
+ className: _dsh_plugin_shop_css_26093961_default.gateActions,
7594
7603
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7595
7604
  type: "button",
7596
- className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
7605
+ className: _dsh_plugin_shop_css_26093961_default.confirmButton,
7597
7606
  "data-shop-restart-confirm": true,
7598
7607
  onClick: () => void onConfirm(),
7599
7608
  children: t("restartConfirm")
7600
7609
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7601
7610
  type: "button",
7602
- className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
7611
+ className: _dsh_plugin_shop_css_26093961_default.cancelButton,
7603
7612
  onClick: () => setGateOpen(false),
7604
7613
  children: t("cancel")
7605
7614
  })]
@@ -7609,7 +7618,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7609
7618
  if (gate !== void 0) return null;
7610
7619
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7611
7620
  type: "button",
7612
- className: _dsh_plugin_shop_css_e3675a89_default.restartButton,
7621
+ className: _dsh_plugin_shop_css_26093961_default.restartButton,
7613
7622
  "data-shop-restart": true,
7614
7623
  onClick: () => setGateOpen(true),
7615
7624
  children: t("restart")
@@ -7649,7 +7658,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7649
7658
  }
7650
7659
  };
7651
7660
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7652
- className: _dsh_plugin_shop_css_e3675a89_default.switchWrap,
7661
+ className: _dsh_plugin_shop_css_26093961_default.switchWrap,
7653
7662
  "data-shop-enabled-switch": row.name,
7654
7663
  children: [
7655
7664
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -7658,18 +7667,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7658
7667
  "aria-checked": enabled,
7659
7668
  "aria-label": t("enabledSwitch"),
7660
7669
  "data-shop-toggle": true,
7661
- className: `${_dsh_plugin_shop_css_e3675a89_default.switch} ${enabled ? _dsh_plugin_shop_css_e3675a89_default.switchOn : ""}`,
7670
+ className: `${_dsh_plugin_shop_css_26093961_default.switch} ${enabled ? _dsh_plugin_shop_css_26093961_default.switchOn : ""}`,
7662
7671
  onClick: () => void onToggle(),
7663
7672
  disabled: toggle.kind === "saving",
7664
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.switchKnob })
7673
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.switchKnob })
7665
7674
  }),
7666
7675
  toggle.kind === "saved" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7667
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7676
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7668
7677
  "data-shop-hot-apply": true,
7669
7678
  children: t("hotApplyNote")
7670
7679
  }),
7671
7680
  toggle.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7672
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
7681
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
7673
7682
  "data-shop-toggle-error": true,
7674
7683
  children: toggle.detail
7675
7684
  })
@@ -7681,19 +7690,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7681
7690
  * install flow for `name@latest`, reusing `InstallPanel`). */
7682
7691
  function OutdatedRow({ row, tier, missing, t, setEnabled, flowFor, restart, restartSupported }) {
7683
7692
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7684
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedRow,
7693
+ className: _dsh_plugin_shop_css_26093961_default.outdatedRow,
7685
7694
  "data-shop-outdated-entry": row.name,
7686
7695
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7687
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedInfo,
7696
+ className: _dsh_plugin_shop_css_26093961_default.outdatedInfo,
7688
7697
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7689
- className: _dsh_plugin_shop_css_e3675a89_default.name,
7698
+ className: _dsh_plugin_shop_css_26093961_default.name,
7690
7699
  children: row.name
7691
7700
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7692
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedVersions,
7701
+ className: _dsh_plugin_shop_css_26093961_default.outdatedVersions,
7693
7702
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("installedVersion", { version: row.source === "github" ? row.installed.slice(0, 7) : row.installed }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("latestVersion", { version: row.latest }) })]
7694
7703
  })]
7695
7704
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7696
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedActions,
7705
+ className: _dsh_plugin_shop_css_26093961_default.outdatedActions,
7697
7706
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnabledSwitch, {
7698
7707
  row,
7699
7708
  t,
@@ -7728,20 +7737,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7728
7737
  function OutdatedSection({ state, entriesByKey, missingByKey, t, setEnabled, flowFor, restart, restartSupported }) {
7729
7738
  if (state.kind === "loading") return null;
7730
7739
  if (state.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7731
- className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
7740
+ className: _dsh_plugin_shop_css_26093961_default.stateLine,
7732
7741
  "data-shop-outdated-error": true,
7733
7742
  children: t("error")
7734
7743
  });
7735
7744
  const outdated = state.entries.filter((entry) => entry.outdated);
7736
7745
  if (outdated.length === 0) return null;
7737
7746
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
7738
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedSection,
7747
+ className: _dsh_plugin_shop_css_26093961_default.outdatedSection,
7739
7748
  "data-shop-outdated": true,
7740
7749
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
7741
- className: _dsh_plugin_shop_css_e3675a89_default.catalogHeading,
7750
+ className: _dsh_plugin_shop_css_26093961_default.catalogHeading,
7742
7751
  children: t("installedSection")
7743
7752
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
7744
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedList,
7753
+ className: _dsh_plugin_shop_css_26093961_default.outdatedList,
7745
7754
  children: outdated.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OutdatedRow, {
7746
7755
  row,
7747
7756
  tier: entriesByKey.get(identityKey(row))?.tier ?? "community",
@@ -7944,50 +7953,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7944
7953
  return map;
7945
7954
  }, [catalogState, specs]);
7946
7955
  if (catalogState.kind === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7947
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
7956
+ className: _dsh_plugin_shop_css_26093961_default.panel,
7948
7957
  "data-shop-tab": true,
7949
7958
  "aria-busy": "true",
7950
7959
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7951
- className: _dsh_plugin_shop_css_e3675a89_default.srOnly,
7960
+ className: _dsh_plugin_shop_css_26093961_default.srOnly,
7952
7961
  children: t("loading")
7953
7962
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7954
- className: _dsh_plugin_shop_css_e3675a89_default.skeletonGrid,
7963
+ className: _dsh_plugin_shop_css_26093961_default.skeletonGrid,
7955
7964
  "data-shop-skeleton": true,
7956
7965
  "aria-hidden": "true",
7957
7966
  children: Array.from({ length: 8 }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7958
- className: _dsh_plugin_shop_css_e3675a89_default.skeletonCard,
7967
+ className: _dsh_plugin_shop_css_26093961_default.skeletonCard,
7959
7968
  children: [
7960
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonName }),
7961
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummary }),
7962
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummaryShort }),
7963
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonActions })
7969
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonName }),
7970
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonSummary }),
7971
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonSummaryShort }),
7972
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonActions })
7964
7973
  ]
7965
7974
  }, i))
7966
7975
  })]
7967
7976
  });
7968
7977
  if (catalogState.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7969
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
7978
+ className: _dsh_plugin_shop_css_26093961_default.panel,
7970
7979
  "data-shop-tab": true,
7971
7980
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7972
- className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
7981
+ className: _dsh_plugin_shop_css_26093961_default.stateLine,
7973
7982
  children: t("error")
7974
7983
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7975
7984
  type: "button",
7976
- className: _dsh_plugin_shop_css_e3675a89_default.actionButton,
7985
+ className: _dsh_plugin_shop_css_26093961_default.actionButton,
7977
7986
  onClick: () => setRequest({ kind: "retry" }),
7978
7987
  children: t("retry")
7979
7988
  })]
7980
7989
  });
7981
7990
  const { result } = catalogState;
7982
7991
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7983
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
7992
+ className: _dsh_plugin_shop_css_26093961_default.panel,
7984
7993
  "data-shop-tab": true,
7985
7994
  children: [
7986
7995
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7987
- className: _dsh_plugin_shop_css_e3675a89_default.toolbar,
7996
+ className: _dsh_plugin_shop_css_26093961_default.toolbar,
7988
7997
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7989
7998
  type: "search",
7990
- className: _dsh_plugin_shop_css_e3675a89_default.searchInput,
7999
+ className: _dsh_plugin_shop_css_26093961_default.searchInput,
7991
8000
  "aria-label": t("search"),
7992
8001
  placeholder: t("search"),
7993
8002
  value: query,
@@ -7996,27 +8005,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7996
8005
  setVisibleCount(48);
7997
8006
  }
7998
8007
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7999
- className: _dsh_plugin_shop_css_e3675a89_default.toolbarRight,
8008
+ className: _dsh_plugin_shop_css_26093961_default.toolbarRight,
8000
8009
  children: [
8001
8010
  result.stale && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8002
- className: _dsh_plugin_shop_css_e3675a89_default.staleBadge,
8011
+ className: _dsh_plugin_shop_css_26093961_default.staleBadge,
8003
8012
  children: t("staleLabel", { date: result.builtAt.slice(0, 10) })
8004
8013
  }),
8005
8014
  selfVersion !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8006
- className: _dsh_plugin_shop_css_e3675a89_default.versionBlock,
8015
+ className: _dsh_plugin_shop_css_26093961_default.versionBlock,
8007
8016
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
8008
- className: _dsh_plugin_shop_css_e3675a89_default.versionText,
8017
+ className: _dsh_plugin_shop_css_26093961_default.versionText,
8009
8018
  "data-shop-version": true,
8010
8019
  children: ["v", selfVersion.installed]
8011
8020
  }), selfUpdate.view.kind === "done" && restartSupported ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8012
8021
  type: "button",
8013
- className: _dsh_plugin_shop_css_e3675a89_default.restartSelfButton,
8022
+ className: _dsh_plugin_shop_css_26093961_default.restartSelfButton,
8014
8023
  "data-shop-restart": true,
8015
8024
  onClick: () => setSelfRestartGate(true),
8016
8025
  children: t("restart")
8017
8026
  }) : selfVersion.outdated && selfVersion.latest !== null && selfUpdate.view.kind === "idle" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8018
8027
  type: "button",
8019
- className: _dsh_plugin_shop_css_e3675a89_default.updateSelfButton,
8028
+ className: _dsh_plugin_shop_css_26093961_default.updateSelfButton,
8020
8029
  "data-shop-update-self": true,
8021
8030
  onClick: () => {
8022
8031
  if (selfVersion.latest !== null) selfUpdate.start({ version: selfVersion.latest });
@@ -8024,7 +8033,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8024
8033
  children: t("update")
8025
8034
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8026
8035
  type: "button",
8027
- className: _dsh_plugin_shop_css_e3675a89_default.checkUpdateButton,
8036
+ className: _dsh_plugin_shop_css_26093961_default.checkUpdateButton,
8028
8037
  "data-shop-check-update": true,
8029
8038
  title: t("checkUpdateTitle"),
8030
8039
  disabled: checkState !== "idle",
@@ -8033,7 +8042,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8033
8042
  })]
8034
8043
  }),
8035
8044
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
8036
- className: _dsh_plugin_shop_css_e3675a89_default.githubLink,
8045
+ className: _dsh_plugin_shop_css_26093961_default.githubLink,
8037
8046
  href: SHOP_REPO_URL,
8038
8047
  target: "_blank",
8039
8048
  rel: "noopener noreferrer",
@@ -8052,27 +8061,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8052
8061
  })]
8053
8062
  }),
8054
8063
  selfUpdate.view.kind === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8055
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
8064
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
8056
8065
  "data-shop-self-updating": true,
8057
8066
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8058
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
8067
+ className: _dsh_plugin_shop_css_26093961_default.installing,
8059
8068
  children: t("installing")
8060
8069
  }), selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8061
- className: _dsh_plugin_shop_css_e3675a89_default.log,
8070
+ className: _dsh_plugin_shop_css_26093961_default.log,
8062
8071
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8063
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
8072
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
8064
8073
  children: line
8065
8074
  }, index))
8066
8075
  })]
8067
8076
  }),
8068
8077
  selfUpdate.view.kind === "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8069
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
8078
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
8070
8079
  "data-shop-self-update-done": true,
8071
8080
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8072
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
8081
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
8073
8082
  children: [
8074
8083
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8075
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
8084
+ className: _dsh_plugin_shop_css_26093961_default.notice,
8076
8085
  children: t("installedRestartNotice")
8077
8086
  }),
8078
8087
  restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartPanel, {
@@ -8084,7 +8093,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8084
8093
  }
8085
8094
  }),
8086
8095
  !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8087
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
8096
+ className: _dsh_plugin_shop_css_26093961_default.notice,
8088
8097
  "data-shop-restart-disabled": true,
8089
8098
  children: t("restartDisabledNotice")
8090
8099
  })
@@ -8092,34 +8101,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8092
8101
  })
8093
8102
  }),
8094
8103
  selfUpdate.view.kind === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8095
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
8104
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
8096
8105
  "data-shop-self-update-failed": true,
8097
8106
  children: [
8098
8107
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8099
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
8108
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
8100
8109
  children: t("updateFailed")
8101
8110
  }),
8102
8111
  selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8103
- className: _dsh_plugin_shop_css_e3675a89_default.log,
8112
+ className: _dsh_plugin_shop_css_26093961_default.log,
8104
8113
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8105
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
8114
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
8106
8115
  children: line
8107
8116
  }, index))
8108
8117
  }),
8109
8118
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8110
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
8119
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
8111
8120
  children: selfUpdate.view.detail === "" ? t("updateTransportFailed") : selfUpdate.view.detail
8112
8121
  })
8113
8122
  ]
8114
8123
  }),
8115
8124
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8116
- className: _dsh_plugin_shop_css_e3675a89_default.categoryBar,
8125
+ className: _dsh_plugin_shop_css_26093961_default.categoryBar,
8117
8126
  role: "group",
8118
8127
  "aria-label": t("catalog"),
8119
8128
  children: [
8120
8129
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8121
8130
  type: "button",
8122
- className: category === null ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
8131
+ className: category === null ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
8123
8132
  "aria-pressed": category === null,
8124
8133
  onClick: () => {
8125
8134
  setCategory(null);
@@ -8134,7 +8143,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8134
8143
  }),
8135
8144
  CATEGORY_ORDER.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8136
8145
  type: "button",
8137
- className: category === key ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
8146
+ className: category === key ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
8138
8147
  "aria-pressed": category === key,
8139
8148
  onClick: () => {
8140
8149
  setCategory(key);
@@ -8148,7 +8157,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8148
8157
  }, key)),
8149
8158
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8150
8159
  type: "button",
8151
- className: category === "installed" ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
8160
+ className: category === "installed" ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
8152
8161
  "aria-pressed": category === "installed",
8153
8162
  onClick: () => {
8154
8163
  setCategory("installed");
@@ -8163,10 +8172,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8163
8172
  ]
8164
8173
  }),
8165
8174
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8166
- className: _dsh_plugin_shop_css_e3675a89_default.catalogStatsRow,
8175
+ className: _dsh_plugin_shop_css_26093961_default.catalogStatsRow,
8167
8176
  children: [
8168
8177
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8169
- className: _dsh_plugin_shop_css_e3675a89_default.catalogStats,
8178
+ className: _dsh_plugin_shop_css_26093961_default.catalogStats,
8170
8179
  "data-shop-catalog-stats": true,
8171
8180
  children: t("catalogStats", {
8172
8181
  count: String(browsable.length),
@@ -8175,7 +8184,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8175
8184
  }),
8176
8185
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8177
8186
  type: "button",
8178
- className: _dsh_plugin_shop_css_e3675a89_default.reloadButton,
8187
+ className: _dsh_plugin_shop_css_26093961_default.reloadButton,
8179
8188
  "data-shop-reload": true,
8180
8189
  disabled: reloading,
8181
8190
  onClick: () => {
@@ -8186,20 +8195,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8186
8195
  children: reloading ? t("refreshing") : t("refresh")
8187
8196
  }),
8188
8197
  reloadFailed && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8189
- className: _dsh_plugin_shop_css_e3675a89_default.reloadFailed,
8198
+ className: _dsh_plugin_shop_css_26093961_default.reloadFailed,
8190
8199
  "data-shop-reload-failed": true,
8191
8200
  children: t("refreshFailed")
8192
8201
  })
8193
8202
  ]
8194
8203
  }),
8195
8204
  result.plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8196
- className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
8205
+ className: _dsh_plugin_shop_css_26093961_default.emptyLine,
8197
8206
  children: t("empty")
8198
8207
  }) : filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8199
- className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
8208
+ className: _dsh_plugin_shop_css_26093961_default.emptyLine,
8200
8209
  children: t("emptySearch")
8201
8210
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
8202
- className: _dsh_plugin_shop_css_e3675a89_default.cards,
8211
+ className: _dsh_plugin_shop_css_26093961_default.cards,
8203
8212
  children: [visible.map((entry) => {
8204
8213
  const key = entryKey(entry);
8205
8214
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EntryCard, {
@@ -8219,12 +8228,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8219
8228
  }) }, key);
8220
8229
  }), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
8221
8230
  ref: sentinelRef,
8222
- className: _dsh_plugin_shop_css_e3675a89_default.cardsSentry,
8231
+ className: _dsh_plugin_shop_css_26093961_default.cardsSentry,
8223
8232
  "data-shop-sentry": true,
8224
8233
  "aria-hidden": "true"
8225
8234
  })]
8226
8235
  }), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8227
- className: _dsh_plugin_shop_css_e3675a89_default.showingLine,
8236
+ className: _dsh_plugin_shop_css_26093961_default.showingLine,
8228
8237
  "aria-live": "polite",
8229
8238
  children: t("showing", {
8230
8239
  shown: String(visibleCount),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-shop",
3
- "version": "0.8.0-beta.3",
3
+ "version": "0.8.0",
4
4
  "description": "The DeepSeek Harness plugin shop: browse, install, enable, and update dsh plugins from a git-auditable catalog.",
5
5
  "keywords": [
6
6
  "dsh-plugin",