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