dsh-plugin-shop 0.8.0-beta.4 → 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 +239 -239
  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
@@ -6918,111 +6918,111 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6918
6918
  };
6919
6919
  }
6920
6920
  //#endregion
6921
- //#region \0dsh-plugin-shop-css:e3675a89
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.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";
6923
- 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\"]")) {
6924
6924
  const tag = document.createElement("style");
6925
- tag.dataset.pluginCss = "e3675a89";
6925
+ tag.dataset.pluginCss = "26093961";
6926
6926
  tag.textContent = css;
6927
6927
  document.head.appendChild(tag);
6928
6928
  }
6929
- var _dsh_plugin_shop_css_e3675a89_default = {
6930
- "client": "s8583e3_client",
6931
- "config": "s942a79_config",
6932
- "ts": "s5f67aa_ts",
6933
- "spec": "sfd9d8a_spec",
6934
- "panel": "s255e5a_panel",
6935
- "searchInput": "s232ec4_searchInput",
6936
- "toolbar": "s646509_toolbar",
6937
- "stateLine": "s44a3ec_stateLine",
6938
- "srOnly": "s3a0ece_srOnly",
6939
- "skeletonGrid": "se0c3b4_skeletonGrid",
6940
- "skeletonCard": "s520416_skeletonCard",
6941
- "skeletonName": "s8c7d6f_skeletonName",
6942
- "skeletonSummary": "sf5179e_skeletonSummary",
6943
- "skeletonSummaryShort": "sbb0d25_skeletonSummaryShort",
6944
- "skeletonActions": "s96e910_skeletonActions",
6945
- "actionButton": "s73242a_actionButton",
6946
- "toolbarRight": "s745e3c_toolbarRight",
6947
- "versionBlock": "s4fe61f_versionBlock",
6948
- "versionText": "sb9b924_versionText",
6949
- "updateSelfButton": "sa04455_updateSelfButton",
6950
- "checkUpdateButton": "s614a38_checkUpdateButton",
6951
- "githubLink": "sa987f7_githubLink",
6952
- "selfUpdatePanel": "sb81ba5_selfUpdatePanel",
6953
- "staleBadge": "s3946f1_staleBadge",
6954
- "categoryBar": "sb2c859_categoryBar",
6955
- "categoryButton": "s26d58e_categoryButton",
6956
- "categoryButtonOn": "s5f68c4_categoryButtonOn",
6957
- "catalogHeading": "s668774_catalogHeading",
6958
- "catalogStatsRow": "seb0a1e_catalogStatsRow",
6959
- "catalogStats": "sccc4d1_catalogStats",
6960
- "reloadButton": "s64a5ff_reloadButton",
6961
- "reloadFailed": "s4453f3_reloadFailed",
6962
- "emptyLine": "s6de1ab_emptyLine",
6963
- "cards": "sf657f5_cards",
6964
- "card": "s65f383_card",
6965
- "cardsSentry": "sd7ee01_cardsSentry",
6966
- "showingLine": "s705cc6_showingLine",
6967
- "cardSpine": "s4ce25d_cardSpine",
6968
- "categoryBadge": "s9c8eaa_categoryBadge",
6969
- "entryHeader": "sa97234_entryHeader",
6970
- "name": "sc3f149_name",
6971
- "badges": "s513026_badges",
6972
- "cardActions": "s9b5048_cardActions",
6973
- "gate": "sc4f2ac_gate",
6974
- "installPanel": "s4d374c_installPanel",
6975
- "installedActions": "sf53ca0_installedActions",
6976
- "cardVersion": "sc6ec6e_cardVersion",
6977
- "sourceBadge": "s71f10f_sourceBadge",
6978
- "tierBadge": "s5e82cb_tierBadge",
6979
- "incompatibleBadge": "s4bbe02_incompatibleBadge",
6980
- "starsBadge": "sff43b4_starsBadge",
6981
- "chevron": "s73f7fb_chevron",
6982
- "chevronOpen": "s61393c_chevronOpen",
6983
- "body": "s820ebf_body",
6984
- "summary": "sb8fbc8_summary",
6985
- "summaryZh": "se507db_summaryZh",
6986
- "summaryExpanded": "s10baf0_summaryExpanded",
6987
- "summaryZhExpanded": "sb9dba9_summaryZhExpanded",
6988
- "incompatibleDetail": "s6eca19_incompatibleDetail",
6989
- "capabilitiesBlock": "s9d2029_capabilitiesBlock",
6990
- "capabilitiesNote": "s3bdbd5_capabilitiesNote",
6991
- "capabilities": "s441702_capabilities",
6992
- "detail": "sde3f0c_detail",
6993
- "detailRows": "se98179_detailRows",
6994
- "detailRow": "sfb4d2f_detailRow",
6995
- "author": "s1ff66f_author",
6996
- "reviewedLine": "sd58c6d_reviewedLine",
6997
- "installButton": "se7aaed_installButton",
6998
- "confirmButton": "sb43a49_confirmButton",
6999
- "cancelButton": "s6e45d1_cancelButton",
7000
- "installedLabel": "sb6fc74_installedLabel",
7001
- "uninstallButton": "s96967f_uninstallButton",
7002
- "restartSelfButton": "sb00c36_restartSelfButton",
7003
- "restartButton": "s6ac237_restartButton",
7004
- "gateTitle": "s559c38_gateTitle",
7005
- "gateBody": "s3c0ace_gateBody",
7006
- "gateWarning": "sc323e5_gateWarning",
7007
- "gateActions": "s4b2373_gateActions",
7008
- "installing": "s52b5a5_installing",
7009
- "log": "s64ab71_log",
7010
- "logLine": "s1531a8_logLine",
7011
- "notice": "sf20dda_notice",
7012
- "failedHeading": "seb9b08_failedHeading",
7013
- "failedDetail": "sfd3021_failedDetail",
7014
- "rejectedCode": "s50ba35_rejectedCode",
7015
- "rejectedDetail": "se75489_rejectedDetail",
7016
- "outdatedSection": "sa276cf_outdatedSection",
7017
- "outdatedList": "sceae6e_outdatedList",
7018
- "outdatedRow": "s8d2072_outdatedRow",
7019
- "outdatedInfo": "s5c2545_outdatedInfo",
7020
- "outdatedVersions": "s877c68_outdatedVersions",
7021
- "outdatedActions": "sa1f556_outdatedActions",
7022
- "switch": "s11c019_switch",
7023
- "switchOn": "s7580e8_switchOn",
7024
- "switchKnob": "saab2b3_switchKnob",
7025
- "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"
7026
7026
  };
7027
7027
  //#endregion
7028
7028
  //#region src/client/ShopTab.tsx
@@ -7039,7 +7039,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7039
7039
  width: "14",
7040
7040
  height: "14",
7041
7041
  "aria-hidden": "true",
7042
- 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,
7043
7043
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7044
7044
  fill: "currentColor",
7045
7045
  d: "M3.5 6 8 10.5 12.5 6l1 1L8 12.5 2.5 7l1-1Z"
@@ -7073,32 +7073,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7073
7073
  onSettled();
7074
7074
  }, [flow, onSettled]);
7075
7075
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7076
- className: _dsh_plugin_shop_css_e3675a89_default.card,
7076
+ className: _dsh_plugin_shop_css_26093961_default.card,
7077
7077
  "data-shop-entry": entry.name,
7078
7078
  "data-category": category,
7079
7079
  children: [
7080
7080
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7081
- className: _dsh_plugin_shop_css_e3675a89_default.cardSpine,
7081
+ className: _dsh_plugin_shop_css_26093961_default.cardSpine,
7082
7082
  "aria-hidden": "true"
7083
7083
  }),
7084
7084
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7085
7085
  type: "button",
7086
- className: _dsh_plugin_shop_css_e3675a89_default.entryHeader,
7086
+ className: _dsh_plugin_shop_css_26093961_default.entryHeader,
7087
7087
  "aria-expanded": open,
7088
7088
  "aria-controls": detailId,
7089
7089
  onClick: () => setOpen((current) => !current),
7090
7090
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7091
- className: _dsh_plugin_shop_css_e3675a89_default.name,
7091
+ className: _dsh_plugin_shop_css_26093961_default.name,
7092
7092
  children: entry.name
7093
7093
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7094
- className: _dsh_plugin_shop_css_e3675a89_default.badges,
7094
+ className: _dsh_plugin_shop_css_26093961_default.badges,
7095
7095
  children: [
7096
7096
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7097
- className: _dsh_plugin_shop_css_e3675a89_default.categoryBadge,
7097
+ className: _dsh_plugin_shop_css_26093961_default.categoryBadge,
7098
7098
  children: t(categoryKey(entry))
7099
7099
  }),
7100
7100
  entry.source === "npm" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7101
- className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
7101
+ className: _dsh_plugin_shop_css_26093961_default.sourceBadge,
7102
7102
  "data-shop-source-npm": true,
7103
7103
  role: "img",
7104
7104
  "aria-label": t("npmSource"),
@@ -7115,7 +7115,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7115
7115
  })
7116
7116
  }),
7117
7117
  hasGithubHome(entry) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7118
- className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
7118
+ className: _dsh_plugin_shop_css_26093961_default.sourceBadge,
7119
7119
  "data-shop-source-github": true,
7120
7120
  role: "img",
7121
7121
  "aria-label": t("githubSource"),
@@ -7129,17 +7129,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7129
7129
  })
7130
7130
  }),
7131
7131
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7132
- className: _dsh_plugin_shop_css_e3675a89_default.cardVersion,
7132
+ className: _dsh_plugin_shop_css_26093961_default.cardVersion,
7133
7133
  "data-card-version": true,
7134
7134
  children: ["v", displayVersion(entry)]
7135
7135
  }),
7136
7136
  entry.tier !== "community" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7137
- className: _dsh_plugin_shop_css_e3675a89_default.tierBadge,
7137
+ className: _dsh_plugin_shop_css_26093961_default.tierBadge,
7138
7138
  "data-tier": entry.tier,
7139
7139
  children: t(tierKey(entry.tier))
7140
7140
  }),
7141
7141
  stars !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7142
- className: _dsh_plugin_shop_css_e3675a89_default.starsBadge,
7142
+ className: _dsh_plugin_shop_css_26093961_default.starsBadge,
7143
7143
  role: "img",
7144
7144
  "aria-label": t("stars", { count: stars }),
7145
7145
  children: ["★ ", formatStars(stars)]
@@ -7149,39 +7149,39 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7149
7149
  })]
7150
7150
  }),
7151
7151
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7152
- className: _dsh_plugin_shop_css_e3675a89_default.body,
7152
+ className: _dsh_plugin_shop_css_26093961_default.body,
7153
7153
  children: [
7154
7154
  summary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7155
- 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,
7156
7156
  children: summary.en
7157
7157
  }),
7158
7158
  summary?.zh !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7159
- 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,
7160
7160
  children: summary.zh
7161
7161
  }),
7162
7162
  blockers.map((blocker) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7163
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleDetail,
7163
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleDetail,
7164
7164
  "data-shop-incompatible-detail": true,
7165
7165
  children: blocker.text
7166
7166
  }, blocker.kind)),
7167
7167
  open && entry.catalog !== void 0 && entry.catalog.capabilities.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7168
- className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesBlock,
7168
+ className: _dsh_plugin_shop_css_26093961_default.capabilitiesBlock,
7169
7169
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7170
- className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesNote,
7170
+ className: _dsh_plugin_shop_css_26093961_default.capabilitiesNote,
7171
7171
  children: t("capabilitiesNote")
7172
7172
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
7173
- className: _dsh_plugin_shop_css_e3675a89_default.capabilities,
7173
+ className: _dsh_plugin_shop_css_26093961_default.capabilities,
7174
7174
  children: entry.catalog.capabilities.map((capability) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: capability }, capability))
7175
7175
  })]
7176
7176
  }),
7177
7177
  open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
7178
7178
  id: detailId,
7179
- className: _dsh_plugin_shop_css_e3675a89_default.detail,
7179
+ className: _dsh_plugin_shop_css_26093961_default.detail,
7180
7180
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
7181
- className: _dsh_plugin_shop_css_e3675a89_default.detailRows,
7181
+ className: _dsh_plugin_shop_css_26093961_default.detailRows,
7182
7182
  children: [
7183
7183
  npmUrl !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7184
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
7184
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
7185
7185
  "data-shop-npm": true,
7186
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", {
7187
7187
  href: npmUrl,
@@ -7191,7 +7191,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7191
7191
  }) })]
7192
7192
  }),
7193
7193
  entry.repository !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7194
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
7194
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
7195
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", {
7196
7196
  href: entry.repository,
7197
7197
  target: "_blank",
@@ -7200,12 +7200,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7200
7200
  }) : entry.repository })]
7201
7201
  }),
7202
7202
  entry.license !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7203
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
7203
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
7204
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 })]
7205
7205
  })
7206
7206
  ]
7207
7207
  }), entry.tier === "verified-stale" && entry.review !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7208
- className: _dsh_plugin_shop_css_e3675a89_default.reviewedLine,
7208
+ className: _dsh_plugin_shop_css_26093961_default.reviewedLine,
7209
7209
  children: entry.review.reviewedVersion !== void 0 ? t("reviewedVersionLine", {
7210
7210
  reviewed: entry.review.reviewedVersion,
7211
7211
  current: entry.version
@@ -7218,7 +7218,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7218
7218
  ]
7219
7219
  }),
7220
7220
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7221
- className: _dsh_plugin_shop_css_e3675a89_default.cardActions,
7221
+ className: _dsh_plugin_shop_css_26093961_default.cardActions,
7222
7222
  "data-shop-actions": true,
7223
7223
  children: [installed === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InstallPanel, {
7224
7224
  target: installTarget,
@@ -7243,7 +7243,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7243
7243
  restart,
7244
7244
  restartSupported
7245
7245
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7246
- className: _dsh_plugin_shop_css_e3675a89_default.installedLabel,
7246
+ className: _dsh_plugin_shop_css_26093961_default.installedLabel,
7247
7247
  "data-shop-installed": true,
7248
7248
  children: t("installed")
7249
7249
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BlockerBadge, {
@@ -7265,7 +7265,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7265
7265
  onSettled: uninstallSettled
7266
7266
  })
7267
7267
  ] }), author !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7268
- className: _dsh_plugin_shop_css_e3675a89_default.author,
7268
+ className: _dsh_plugin_shop_css_26093961_default.author,
7269
7269
  "data-shop-author": true,
7270
7270
  children: t("authorLine", { author })
7271
7271
  })]
@@ -7303,7 +7303,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7303
7303
  const detail = blockers.map((blocker) => blocker.text).join("\n");
7304
7304
  const taken = blockers.some((blocker) => blocker.kind === "name-taken");
7305
7305
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7306
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleBadge,
7306
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleBadge,
7307
7307
  "data-shop-blocker": taken ? "name-taken" : "missing-peers",
7308
7308
  role: "img",
7309
7309
  "aria-label": detail,
@@ -7320,30 +7320,30 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7320
7320
  const [gateOpen, setGateOpen] = (0, react.useState)(false);
7321
7321
  const { view, start } = flow;
7322
7322
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7323
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7323
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7324
7324
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7325
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
7325
+ className: _dsh_plugin_shop_css_26093961_default.installing,
7326
7326
  children: t("installing")
7327
7327
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7328
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7328
+ className: _dsh_plugin_shop_css_26093961_default.log,
7329
7329
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7330
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7330
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7331
7331
  children: line
7332
7332
  }, index))
7333
7333
  })]
7334
7334
  });
7335
7335
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7336
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
7336
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
7337
7337
  children: [
7338
7338
  view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7339
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7339
+ className: _dsh_plugin_shop_css_26093961_default.log,
7340
7340
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7341
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7341
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7342
7342
  children: line
7343
7343
  }, index))
7344
7344
  }),
7345
7345
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7346
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7346
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7347
7347
  "data-shop-restart-notice": true,
7348
7348
  children: view.needsRestart ? t(restartReasonKey(view.restartReason)) : t("installedNoRestartNotice")
7349
7349
  }),
@@ -7352,63 +7352,63 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7352
7352
  restart
7353
7353
  }),
7354
7354
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7355
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7355
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7356
7356
  "data-shop-restart-disabled": true,
7357
7357
  children: t("restartDisabledNotice")
7358
7358
  })
7359
7359
  ]
7360
7360
  });
7361
7361
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7362
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7362
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7363
7363
  children: [
7364
7364
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7365
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
7365
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
7366
7366
  children: t("installFailed")
7367
7367
  }),
7368
7368
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7369
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7369
+ className: _dsh_plugin_shop_css_26093961_default.log,
7370
7370
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7371
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7371
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7372
7372
  children: line
7373
7373
  }, index))
7374
7374
  }),
7375
7375
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7376
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
7376
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
7377
7377
  children: view.detail === "" ? t("installTransportFailed") : view.detail
7378
7378
  })
7379
7379
  ]
7380
7380
  });
7381
7381
  if (view.kind === "rejected") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7382
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7382
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7383
7383
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7384
- className: _dsh_plugin_shop_css_e3675a89_default.rejectedCode,
7384
+ className: _dsh_plugin_shop_css_26093961_default.rejectedCode,
7385
7385
  children: t(rejectionCodeKey(view.code))
7386
7386
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7387
- className: _dsh_plugin_shop_css_e3675a89_default.rejectedDetail,
7387
+ className: _dsh_plugin_shop_css_26093961_default.rejectedDetail,
7388
7388
  children: view.detail
7389
7389
  })]
7390
7390
  });
7391
7391
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7392
- className: _dsh_plugin_shop_css_e3675a89_default.gate,
7392
+ className: _dsh_plugin_shop_css_26093961_default.gate,
7393
7393
  children: [
7394
7394
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7395
- className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
7395
+ className: _dsh_plugin_shop_css_26093961_default.gateTitle,
7396
7396
  children: t("acknowledgementTitle")
7397
7397
  }),
7398
7398
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7399
- className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
7399
+ className: _dsh_plugin_shop_css_26093961_default.gateBody,
7400
7400
  children: t("acknowledgementBody")
7401
7401
  }),
7402
7402
  !missingStated && blockersOf(missing, void 0, t).map((blocker) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7403
- className: _dsh_plugin_shop_css_e3675a89_default.gateWarning,
7403
+ className: _dsh_plugin_shop_css_26093961_default.gateWarning,
7404
7404
  "data-shop-incompatible-warning": true,
7405
7405
  children: blocker.text
7406
7406
  }, blocker.kind)),
7407
7407
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7408
- className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
7408
+ className: _dsh_plugin_shop_css_26093961_default.gateActions,
7409
7409
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7410
7410
  type: "button",
7411
- className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
7411
+ className: _dsh_plugin_shop_css_26093961_default.confirmButton,
7412
7412
  "data-shop-confirm": true,
7413
7413
  onClick: () => {
7414
7414
  setGateOpen(false);
@@ -7420,7 +7420,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7420
7420
  children: t("confirm")
7421
7421
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7422
7422
  type: "button",
7423
- className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
7423
+ className: _dsh_plugin_shop_css_26093961_default.cancelButton,
7424
7424
  onClick: () => setGateOpen(false),
7425
7425
  children: t("cancel")
7426
7426
  })]
@@ -7431,7 +7431,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7431
7431
  const refused = blockers.some((blocker) => blocker.kind === "name-taken");
7432
7432
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7433
7433
  type: "button",
7434
- className: _dsh_plugin_shop_css_e3675a89_default.installButton,
7434
+ className: _dsh_plugin_shop_css_26093961_default.installButton,
7435
7435
  disabled: refused,
7436
7436
  ...refused ? { "data-shop-refused": true } : {},
7437
7437
  ...update ? { "data-shop-update": true } : { "data-shop-install": true },
@@ -7462,23 +7462,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7462
7462
  if (view.kind === "done") settled.current();
7463
7463
  }, [view.kind]);
7464
7464
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7465
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7465
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7466
7466
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7467
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
7467
+ className: _dsh_plugin_shop_css_26093961_default.installing,
7468
7468
  children: t("uninstalling")
7469
7469
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7470
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7470
+ className: _dsh_plugin_shop_css_26093961_default.log,
7471
7471
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7472
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7472
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7473
7473
  children: line
7474
7474
  }, index))
7475
7475
  })]
7476
7476
  });
7477
7477
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7478
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
7478
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
7479
7479
  children: [
7480
7480
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7481
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7481
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7482
7482
  "data-shop-uninstall-done": true,
7483
7483
  children: view.needsRestart ? t("uninstalledRestartNotice") : t("uninstalledLiveNotice")
7484
7484
  }),
@@ -7487,28 +7487,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7487
7487
  restart
7488
7488
  }),
7489
7489
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7490
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7490
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7491
7491
  "data-shop-restart-disabled": true,
7492
7492
  children: t("restartDisabledNotice")
7493
7493
  })
7494
7494
  ]
7495
7495
  });
7496
7496
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7497
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
7497
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
7498
7498
  children: [
7499
7499
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7500
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
7500
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
7501
7501
  children: t("uninstallFailed")
7502
7502
  }),
7503
7503
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7504
- className: _dsh_plugin_shop_css_e3675a89_default.log,
7504
+ className: _dsh_plugin_shop_css_26093961_default.log,
7505
7505
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7506
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
7506
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
7507
7507
  children: line
7508
7508
  }, index))
7509
7509
  }),
7510
7510
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7511
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
7511
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
7512
7512
  children: view.detail === "" ? t("uninstallTransportFailed") : view.detail
7513
7513
  })
7514
7514
  ]
@@ -7516,7 +7516,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7516
7516
  if (view.kind !== "idle") return null;
7517
7517
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7518
7518
  type: "button",
7519
- className: _dsh_plugin_shop_css_e3675a89_default.uninstallButton,
7519
+ className: _dsh_plugin_shop_css_26093961_default.uninstallButton,
7520
7520
  "data-shop-uninstall": true,
7521
7521
  onClick: () => void start({ name }),
7522
7522
  children: t("uninstall")
@@ -7578,37 +7578,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7578
7578
  return () => clearInterval(timer);
7579
7579
  }, [state, t]);
7580
7580
  if (state.kind === "restarting") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7581
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7581
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7582
7582
  "data-shop-restarting": true,
7583
7583
  children: t("restarting")
7584
7584
  });
7585
7585
  if (state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7586
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
7586
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
7587
7587
  "data-shop-restart-error": true,
7588
7588
  children: state.detail
7589
7589
  });
7590
7590
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7591
- className: _dsh_plugin_shop_css_e3675a89_default.gate,
7591
+ className: _dsh_plugin_shop_css_26093961_default.gate,
7592
7592
  children: [
7593
7593
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7594
- className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
7594
+ className: _dsh_plugin_shop_css_26093961_default.gateTitle,
7595
7595
  children: t("restartTitle")
7596
7596
  }),
7597
7597
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7598
- className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
7598
+ className: _dsh_plugin_shop_css_26093961_default.gateBody,
7599
7599
  children: t("restartBody")
7600
7600
  }),
7601
7601
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7602
- className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
7602
+ className: _dsh_plugin_shop_css_26093961_default.gateActions,
7603
7603
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7604
7604
  type: "button",
7605
- className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
7605
+ className: _dsh_plugin_shop_css_26093961_default.confirmButton,
7606
7606
  "data-shop-restart-confirm": true,
7607
7607
  onClick: () => void onConfirm(),
7608
7608
  children: t("restartConfirm")
7609
7609
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7610
7610
  type: "button",
7611
- className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
7611
+ className: _dsh_plugin_shop_css_26093961_default.cancelButton,
7612
7612
  onClick: () => setGateOpen(false),
7613
7613
  children: t("cancel")
7614
7614
  })]
@@ -7618,7 +7618,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7618
7618
  if (gate !== void 0) return null;
7619
7619
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7620
7620
  type: "button",
7621
- className: _dsh_plugin_shop_css_e3675a89_default.restartButton,
7621
+ className: _dsh_plugin_shop_css_26093961_default.restartButton,
7622
7622
  "data-shop-restart": true,
7623
7623
  onClick: () => setGateOpen(true),
7624
7624
  children: t("restart")
@@ -7658,7 +7658,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7658
7658
  }
7659
7659
  };
7660
7660
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7661
- className: _dsh_plugin_shop_css_e3675a89_default.switchWrap,
7661
+ className: _dsh_plugin_shop_css_26093961_default.switchWrap,
7662
7662
  "data-shop-enabled-switch": row.name,
7663
7663
  children: [
7664
7664
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -7667,18 +7667,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7667
7667
  "aria-checked": enabled,
7668
7668
  "aria-label": t("enabledSwitch"),
7669
7669
  "data-shop-toggle": true,
7670
- 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 : ""}`,
7671
7671
  onClick: () => void onToggle(),
7672
7672
  disabled: toggle.kind === "saving",
7673
- 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 })
7674
7674
  }),
7675
7675
  toggle.kind === "saved" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7676
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
7676
+ className: _dsh_plugin_shop_css_26093961_default.notice,
7677
7677
  "data-shop-hot-apply": true,
7678
7678
  children: t("hotApplyNote")
7679
7679
  }),
7680
7680
  toggle.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7681
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
7681
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
7682
7682
  "data-shop-toggle-error": true,
7683
7683
  children: toggle.detail
7684
7684
  })
@@ -7690,19 +7690,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7690
7690
  * install flow for `name@latest`, reusing `InstallPanel`). */
7691
7691
  function OutdatedRow({ row, tier, missing, t, setEnabled, flowFor, restart, restartSupported }) {
7692
7692
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7693
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedRow,
7693
+ className: _dsh_plugin_shop_css_26093961_default.outdatedRow,
7694
7694
  "data-shop-outdated-entry": row.name,
7695
7695
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7696
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedInfo,
7696
+ className: _dsh_plugin_shop_css_26093961_default.outdatedInfo,
7697
7697
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7698
- className: _dsh_plugin_shop_css_e3675a89_default.name,
7698
+ className: _dsh_plugin_shop_css_26093961_default.name,
7699
7699
  children: row.name
7700
7700
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7701
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedVersions,
7701
+ className: _dsh_plugin_shop_css_26093961_default.outdatedVersions,
7702
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 }) })]
7703
7703
  })]
7704
7704
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7705
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedActions,
7705
+ className: _dsh_plugin_shop_css_26093961_default.outdatedActions,
7706
7706
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnabledSwitch, {
7707
7707
  row,
7708
7708
  t,
@@ -7737,20 +7737,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7737
7737
  function OutdatedSection({ state, entriesByKey, missingByKey, t, setEnabled, flowFor, restart, restartSupported }) {
7738
7738
  if (state.kind === "loading") return null;
7739
7739
  if (state.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7740
- className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
7740
+ className: _dsh_plugin_shop_css_26093961_default.stateLine,
7741
7741
  "data-shop-outdated-error": true,
7742
7742
  children: t("error")
7743
7743
  });
7744
7744
  const outdated = state.entries.filter((entry) => entry.outdated);
7745
7745
  if (outdated.length === 0) return null;
7746
7746
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
7747
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedSection,
7747
+ className: _dsh_plugin_shop_css_26093961_default.outdatedSection,
7748
7748
  "data-shop-outdated": true,
7749
7749
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
7750
- className: _dsh_plugin_shop_css_e3675a89_default.catalogHeading,
7750
+ className: _dsh_plugin_shop_css_26093961_default.catalogHeading,
7751
7751
  children: t("installedSection")
7752
7752
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
7753
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedList,
7753
+ className: _dsh_plugin_shop_css_26093961_default.outdatedList,
7754
7754
  children: outdated.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OutdatedRow, {
7755
7755
  row,
7756
7756
  tier: entriesByKey.get(identityKey(row))?.tier ?? "community",
@@ -7953,50 +7953,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
7953
7953
  return map;
7954
7954
  }, [catalogState, specs]);
7955
7955
  if (catalogState.kind === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7956
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
7956
+ className: _dsh_plugin_shop_css_26093961_default.panel,
7957
7957
  "data-shop-tab": true,
7958
7958
  "aria-busy": "true",
7959
7959
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7960
- className: _dsh_plugin_shop_css_e3675a89_default.srOnly,
7960
+ className: _dsh_plugin_shop_css_26093961_default.srOnly,
7961
7961
  children: t("loading")
7962
7962
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7963
- className: _dsh_plugin_shop_css_e3675a89_default.skeletonGrid,
7963
+ className: _dsh_plugin_shop_css_26093961_default.skeletonGrid,
7964
7964
  "data-shop-skeleton": true,
7965
7965
  "aria-hidden": "true",
7966
7966
  children: Array.from({ length: 8 }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7967
- className: _dsh_plugin_shop_css_e3675a89_default.skeletonCard,
7967
+ className: _dsh_plugin_shop_css_26093961_default.skeletonCard,
7968
7968
  children: [
7969
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonName }),
7970
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummary }),
7971
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummaryShort }),
7972
- /* @__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 })
7973
7973
  ]
7974
7974
  }, i))
7975
7975
  })]
7976
7976
  });
7977
7977
  if (catalogState.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7978
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
7978
+ className: _dsh_plugin_shop_css_26093961_default.panel,
7979
7979
  "data-shop-tab": true,
7980
7980
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
7981
- className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
7981
+ className: _dsh_plugin_shop_css_26093961_default.stateLine,
7982
7982
  children: t("error")
7983
7983
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7984
7984
  type: "button",
7985
- className: _dsh_plugin_shop_css_e3675a89_default.actionButton,
7985
+ className: _dsh_plugin_shop_css_26093961_default.actionButton,
7986
7986
  onClick: () => setRequest({ kind: "retry" }),
7987
7987
  children: t("retry")
7988
7988
  })]
7989
7989
  });
7990
7990
  const { result } = catalogState;
7991
7991
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7992
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
7992
+ className: _dsh_plugin_shop_css_26093961_default.panel,
7993
7993
  "data-shop-tab": true,
7994
7994
  children: [
7995
7995
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7996
- className: _dsh_plugin_shop_css_e3675a89_default.toolbar,
7996
+ className: _dsh_plugin_shop_css_26093961_default.toolbar,
7997
7997
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
7998
7998
  type: "search",
7999
- className: _dsh_plugin_shop_css_e3675a89_default.searchInput,
7999
+ className: _dsh_plugin_shop_css_26093961_default.searchInput,
8000
8000
  "aria-label": t("search"),
8001
8001
  placeholder: t("search"),
8002
8002
  value: query,
@@ -8005,27 +8005,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8005
8005
  setVisibleCount(48);
8006
8006
  }
8007
8007
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8008
- className: _dsh_plugin_shop_css_e3675a89_default.toolbarRight,
8008
+ className: _dsh_plugin_shop_css_26093961_default.toolbarRight,
8009
8009
  children: [
8010
8010
  result.stale && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8011
- className: _dsh_plugin_shop_css_e3675a89_default.staleBadge,
8011
+ className: _dsh_plugin_shop_css_26093961_default.staleBadge,
8012
8012
  children: t("staleLabel", { date: result.builtAt.slice(0, 10) })
8013
8013
  }),
8014
8014
  selfVersion !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8015
- className: _dsh_plugin_shop_css_e3675a89_default.versionBlock,
8015
+ className: _dsh_plugin_shop_css_26093961_default.versionBlock,
8016
8016
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
8017
- className: _dsh_plugin_shop_css_e3675a89_default.versionText,
8017
+ className: _dsh_plugin_shop_css_26093961_default.versionText,
8018
8018
  "data-shop-version": true,
8019
8019
  children: ["v", selfVersion.installed]
8020
8020
  }), selfUpdate.view.kind === "done" && restartSupported ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8021
8021
  type: "button",
8022
- className: _dsh_plugin_shop_css_e3675a89_default.restartSelfButton,
8022
+ className: _dsh_plugin_shop_css_26093961_default.restartSelfButton,
8023
8023
  "data-shop-restart": true,
8024
8024
  onClick: () => setSelfRestartGate(true),
8025
8025
  children: t("restart")
8026
8026
  }) : selfVersion.outdated && selfVersion.latest !== null && selfUpdate.view.kind === "idle" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8027
8027
  type: "button",
8028
- className: _dsh_plugin_shop_css_e3675a89_default.updateSelfButton,
8028
+ className: _dsh_plugin_shop_css_26093961_default.updateSelfButton,
8029
8029
  "data-shop-update-self": true,
8030
8030
  onClick: () => {
8031
8031
  if (selfVersion.latest !== null) selfUpdate.start({ version: selfVersion.latest });
@@ -8033,7 +8033,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8033
8033
  children: t("update")
8034
8034
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8035
8035
  type: "button",
8036
- className: _dsh_plugin_shop_css_e3675a89_default.checkUpdateButton,
8036
+ className: _dsh_plugin_shop_css_26093961_default.checkUpdateButton,
8037
8037
  "data-shop-check-update": true,
8038
8038
  title: t("checkUpdateTitle"),
8039
8039
  disabled: checkState !== "idle",
@@ -8042,7 +8042,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8042
8042
  })]
8043
8043
  }),
8044
8044
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
8045
- className: _dsh_plugin_shop_css_e3675a89_default.githubLink,
8045
+ className: _dsh_plugin_shop_css_26093961_default.githubLink,
8046
8046
  href: SHOP_REPO_URL,
8047
8047
  target: "_blank",
8048
8048
  rel: "noopener noreferrer",
@@ -8061,27 +8061,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8061
8061
  })]
8062
8062
  }),
8063
8063
  selfUpdate.view.kind === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8064
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
8064
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
8065
8065
  "data-shop-self-updating": true,
8066
8066
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8067
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
8067
+ className: _dsh_plugin_shop_css_26093961_default.installing,
8068
8068
  children: t("installing")
8069
8069
  }), selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8070
- className: _dsh_plugin_shop_css_e3675a89_default.log,
8070
+ className: _dsh_plugin_shop_css_26093961_default.log,
8071
8071
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8072
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
8072
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
8073
8073
  children: line
8074
8074
  }, index))
8075
8075
  })]
8076
8076
  }),
8077
8077
  selfUpdate.view.kind === "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8078
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
8078
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
8079
8079
  "data-shop-self-update-done": true,
8080
8080
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8081
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
8081
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
8082
8082
  children: [
8083
8083
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8084
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
8084
+ className: _dsh_plugin_shop_css_26093961_default.notice,
8085
8085
  children: t("installedRestartNotice")
8086
8086
  }),
8087
8087
  restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartPanel, {
@@ -8093,7 +8093,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8093
8093
  }
8094
8094
  }),
8095
8095
  !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8096
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
8096
+ className: _dsh_plugin_shop_css_26093961_default.notice,
8097
8097
  "data-shop-restart-disabled": true,
8098
8098
  children: t("restartDisabledNotice")
8099
8099
  })
@@ -8101,34 +8101,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8101
8101
  })
8102
8102
  }),
8103
8103
  selfUpdate.view.kind === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8104
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
8104
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
8105
8105
  "data-shop-self-update-failed": true,
8106
8106
  children: [
8107
8107
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8108
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
8108
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
8109
8109
  children: t("updateFailed")
8110
8110
  }),
8111
8111
  selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8112
- className: _dsh_plugin_shop_css_e3675a89_default.log,
8112
+ className: _dsh_plugin_shop_css_26093961_default.log,
8113
8113
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
8114
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
8114
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
8115
8115
  children: line
8116
8116
  }, index))
8117
8117
  }),
8118
8118
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8119
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
8119
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
8120
8120
  children: selfUpdate.view.detail === "" ? t("updateTransportFailed") : selfUpdate.view.detail
8121
8121
  })
8122
8122
  ]
8123
8123
  }),
8124
8124
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8125
- className: _dsh_plugin_shop_css_e3675a89_default.categoryBar,
8125
+ className: _dsh_plugin_shop_css_26093961_default.categoryBar,
8126
8126
  role: "group",
8127
8127
  "aria-label": t("catalog"),
8128
8128
  children: [
8129
8129
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8130
8130
  type: "button",
8131
- 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,
8132
8132
  "aria-pressed": category === null,
8133
8133
  onClick: () => {
8134
8134
  setCategory(null);
@@ -8143,7 +8143,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8143
8143
  }),
8144
8144
  CATEGORY_ORDER.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8145
8145
  type: "button",
8146
- 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,
8147
8147
  "aria-pressed": category === key,
8148
8148
  onClick: () => {
8149
8149
  setCategory(key);
@@ -8157,7 +8157,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8157
8157
  }, key)),
8158
8158
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
8159
8159
  type: "button",
8160
- 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,
8161
8161
  "aria-pressed": category === "installed",
8162
8162
  onClick: () => {
8163
8163
  setCategory("installed");
@@ -8172,10 +8172,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8172
8172
  ]
8173
8173
  }),
8174
8174
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
8175
- className: _dsh_plugin_shop_css_e3675a89_default.catalogStatsRow,
8175
+ className: _dsh_plugin_shop_css_26093961_default.catalogStatsRow,
8176
8176
  children: [
8177
8177
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8178
- className: _dsh_plugin_shop_css_e3675a89_default.catalogStats,
8178
+ className: _dsh_plugin_shop_css_26093961_default.catalogStats,
8179
8179
  "data-shop-catalog-stats": true,
8180
8180
  children: t("catalogStats", {
8181
8181
  count: String(browsable.length),
@@ -8184,7 +8184,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8184
8184
  }),
8185
8185
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
8186
8186
  type: "button",
8187
- className: _dsh_plugin_shop_css_e3675a89_default.reloadButton,
8187
+ className: _dsh_plugin_shop_css_26093961_default.reloadButton,
8188
8188
  "data-shop-reload": true,
8189
8189
  disabled: reloading,
8190
8190
  onClick: () => {
@@ -8195,20 +8195,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8195
8195
  children: reloading ? t("refreshing") : t("refresh")
8196
8196
  }),
8197
8197
  reloadFailed && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
8198
- className: _dsh_plugin_shop_css_e3675a89_default.reloadFailed,
8198
+ className: _dsh_plugin_shop_css_26093961_default.reloadFailed,
8199
8199
  "data-shop-reload-failed": true,
8200
8200
  children: t("refreshFailed")
8201
8201
  })
8202
8202
  ]
8203
8203
  }),
8204
8204
  result.plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8205
- className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
8205
+ className: _dsh_plugin_shop_css_26093961_default.emptyLine,
8206
8206
  children: t("empty")
8207
8207
  }) : filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8208
- className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
8208
+ className: _dsh_plugin_shop_css_26093961_default.emptyLine,
8209
8209
  children: t("emptySearch")
8210
8210
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
8211
- className: _dsh_plugin_shop_css_e3675a89_default.cards,
8211
+ className: _dsh_plugin_shop_css_26093961_default.cards,
8212
8212
  children: [visible.map((entry) => {
8213
8213
  const key = entryKey(entry);
8214
8214
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EntryCard, {
@@ -8228,12 +8228,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
8228
8228
  }) }, key);
8229
8229
  }), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
8230
8230
  ref: sentinelRef,
8231
- className: _dsh_plugin_shop_css_e3675a89_default.cardsSentry,
8231
+ className: _dsh_plugin_shop_css_26093961_default.cardsSentry,
8232
8232
  "data-shop-sentry": true,
8233
8233
  "aria-hidden": "true"
8234
8234
  })]
8235
8235
  }), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
8236
- className: _dsh_plugin_shop_css_e3675a89_default.showingLine,
8236
+ className: _dsh_plugin_shop_css_26093961_default.showingLine,
8237
8237
  "aria-live": "polite",
8238
8238
  children: t("showing", {
8239
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.4",
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",