dsh-plugin-shop 0.6.0-beta.2 → 0.6.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 +256 -235
- package/lib/types/client/present.d.ts +19 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -52,9 +52,9 @@ install them once with `npm install -g @deepseek-ai/dsh pnpm` and verify with
|
|
|
52
52
|
# holds back very recent releases, so a bare `add dsh-plugin-shop` can hand
|
|
53
53
|
# you an older version for a while. Pin the current release — refresh it
|
|
54
54
|
# with `npm view dsh-plugin-shop version`.
|
|
55
|
-
dsh plugin --profile web add dsh-plugin-shop@0.
|
|
55
|
+
dsh plugin --profile web add dsh-plugin-shop@0.6.0
|
|
56
56
|
# or straight through npx, nothing installed:
|
|
57
|
-
npx -y @deepseek-ai/dsh plugin --profile web add dsh-plugin-shop@0.
|
|
57
|
+
npx -y @deepseek-ai/dsh plugin --profile web add dsh-plugin-shop@0.6.0
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
Replace `web` with your profile if you use another one. Then restart `dsh` once — a
|
|
@@ -84,7 +84,7 @@ ls -1 "${DSH_HOME:-$HOME/.dsh}/profiles" | grep -v '^node_modules$'
|
|
|
84
84
|
cooldown, and deterministic installs are the point of the agent path.
|
|
85
85
|
|
|
86
86
|
```sh
|
|
87
|
-
dsh plugin --profile <profile> add dsh-plugin-shop@0.
|
|
87
|
+
dsh plugin --profile <profile> add dsh-plugin-shop@0.6.0
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
**3. Verify — do not skip this.** A zero exit from step 2 means pnpm resolved the
|
package/lib/client.js
CHANGED
|
@@ -4895,6 +4895,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4895
4895
|
return `https://www.npmjs.com/package/${name}`;
|
|
4896
4896
|
}
|
|
4897
4897
|
/**
|
|
4898
|
+
* One entry's install identity — the value the catalog guarantees unique, and
|
|
4899
|
+
* therefore the only safe React key for a shelf card.
|
|
4900
|
+
*
|
|
4901
|
+
* `name` is NOT unique. The catalog's uniqueness invariant is the install
|
|
4902
|
+
* identity (registry `emit.ts` assertCatalogInvariants): `npm:<name>` for an
|
|
4903
|
+
* npm entry, `github:<repo>#<subdir>` for a repo one — so two GitHub
|
|
4904
|
+
* repositories publishing the same `package.json` name are two legitimate
|
|
4905
|
+
* entries under one name, as are two subpackages of one monorepo. The live
|
|
4906
|
+
* catalog holds 151 such names over 243 entries, five of them cookiecutter
|
|
4907
|
+
* templates that all name themselves `{{PKG_NAME}}`.
|
|
4908
|
+
*
|
|
4909
|
+
* Keying the shelf by name handed React duplicate keys, and React could then
|
|
4910
|
+
* no longer match a card to its DOM node: changing the filter left every
|
|
4911
|
+
* duplicate orphaned on the page — hundreds of stale cards from the previous
|
|
4912
|
+
* category, accumulating with each switch until the tab stopped responding.
|
|
4913
|
+
* This mirrors the registry's identity verbatim; the two must not drift.
|
|
4914
|
+
*/
|
|
4915
|
+
function entryKey(entry) {
|
|
4916
|
+
return entry.source === "npm" ? `npm:${entry.name}` : `github:${entry.repo ?? entry.name}#${entry.subdir ?? ""}`;
|
|
4917
|
+
}
|
|
4918
|
+
/**
|
|
4898
4919
|
* One entry's star count from the sidecar, or undefined when it has none.
|
|
4899
4920
|
*
|
|
4900
4921
|
* The sidecar keys a github entry by its repo full name and an npm entry by
|
|
@@ -5257,108 +5278,108 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5257
5278
|
};
|
|
5258
5279
|
}
|
|
5259
5280
|
//#endregion
|
|
5260
|
-
//#region \0dsh-plugin-shop-css:
|
|
5261
|
-
const css = "/* Shop tab styles — a market shelf inside the settings surface. The visual\n * language is the dsh theme's alias tokens ONLY (the four tokens the previous\n * styles referenced that do not exist — bg-layer-3, interactive-bg-hover,\n * state-error, state-success — are corrected to bg-layer-2 and the\n * state-*-primary set). The signature is the category spine: one HUE per\n * category (seven fixed hues, not the brand token — the brand resolves to\n * near-black in the light theme, so seven brand opacities read as seven\n * shades of gray), with the category name as the cover label in the same hue. Class names are mapped to content-derived names at bundle time\n * (tsdown.s8583e3_client.s942a79_config.s5f67aa_ts) and stubbed in tests; only the keys are relied\n * on.\n *\n * One token rule the theme forces: the background LAYERS do not carry\n * contrast. In the light theme bg-base, bg-layer-1, bg-layer-2 and\n * bg-layer-3 all resolve to the same white; only the dark theme spreads them\n * (950/875/850/800). So a layer-2 fill on a layer-1 ground is invisible for\n * half of all users, and anything whose fill is its ONLY affordance — the\n * loading skeleton, the borderless capability chips — derives its fill from\n * label-primary instead, which inverts with the theme by construction.\n * Elements that also carry a border or text may keep a layer fill.\n * `css-tokens.s8583e3_client.sfd9d8a_spec.s5f67aa_ts` pins this. */\n\n.s255e5a_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel. */\n overflow-x: hidden;\n}\n\n.s44a3ec_stateLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* Visually hidden but screen-reader readable (the loading copy while the\n * skeleton stands in visually). */\n.s3a0ece_srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n overflow: hidden;\n white-space: nowrap;\n}\n\n/* The loading shelf: ghost cards with the same geometry as the real grid, so\n * the swap to content is a same-shape handoff instead of a jump. */\n.se0c3b4_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.s520416_skeletonCard {\n position: relative;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n}\n\n/* The shimmer sweep: one gradient band travels across each ghost card while\n * the bars breathe, so the loading state reads as \"the shelf is scanning\". */\n.s520416_skeletonCard::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent) 50%,\n transparent 75%\n );\n transform: translateX(-100%);\n animation: dshShopSkeletonSweep 1.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n@keyframes dshShopSkeletonSweep {\n to { transform: translateX(100%); }\n}\n\n.s8c7d6f_skeletonName {\n width: 55%;\n height: 14px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sf5179e_skeletonSummary {\n width: 92%;\n height: 12px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sbb0d25_skeletonSummaryShort {\n width: 68%;\n height: 12px;\n margin: 6px 12px 10px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n/* The ghost of the action line, right where the real buttons land. */\n.s96e910_skeletonActions {\n display: block;\n width: 84px;\n height: 24px;\n margin: 0 12px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s520416_skeletonCard span {\n animation: dshShopSkeletonPulse 1.6s ease-in-out infinite;\n}\n\n@keyframes dshShopSkeletonPulse {\n 0%, 100% { opacity: 0.5; }\n 50% { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s520416_skeletonCard span { animation: none; opacity: 0.75; }\n .s520416_skeletonCard::after { content: none; }\n}\n\n.s73242a_actionButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s73242a_actionButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s73242a_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s646509_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.s745e3c_toolbarRight {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* The shop's own version, right of the search box: `v0.4.4`, plus the\n * update button when the version check found a newer release. */\n.s4fe61f_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sb9b924_versionText {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa04455_updateSelfButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.sa04455_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.sa04455_updateSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The on-demand re-check next to the version number: a quiet pill; the\n * border and text carry it in the light theme where bg layers are white. */\n.s614a38_checkUpdateButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s614a38_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.s614a38_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.s614a38_checkUpdateButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The project's GitHub mark, right of the version row: a quiet icon link.\n * The octocat carries itself — color shift on hover, no text, no border. */\n.sa987f7_githubLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px;\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa987f7_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.sa987f7_githubLink:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The self-update's expanded states (running log / done + restart /\n * failure detail) sit under the toolbar, above the category bar. */\n.sb81ba5_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.s232ec4_searchInput {\n width: min(280px, 100%);\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n.s232ec4_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s1555aa_staleBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s3946f1_staleBadge {\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n color: var(--dsw-alias-state-warn-primary);\n font-size: 12px;\n}\n\n.sb2c859_categoryBar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s26d58e_categoryButton {\n padding: 3px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s26d58e_categoryButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s5f68c4_categoryButtonOn {\n border-color: var(--dsw-alias-brand-primary);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-weight: 600;\n}\n\n.s26d58e_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s668774_catalogHeading {\n margin: 2px 0 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-primary);\n}\n\n.sccc4d1_catalogStats {\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s6de1ab_emptyLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* The shelf: a responsive grid of cards. */\n/* Single-line rows: one full-width column, one plugin per line. */\n.sf657f5_cards {\n display: grid;\n grid-template-columns: 1fr;\n max-width: 100%;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n animation: dshShopCardsIn 220ms ease;\n}\n\n@keyframes dshShopCardsIn {\n from { opacity: 0; transform: translateY(3px); }\n to { opacity: 1; transform: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sf657f5_cards { animation: none; }\n}\n\n.s65f383_card {\n position: relative;\n display: flex;\n flex-direction: column;\n /* A grid item's min-width is auto by default: its content would widen the\n * 1fr track past the panel and overflow horizontally. */\n min-width: 0;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n transition: border-color 120ms ease, transform 120ms ease, box-shadow 120ms ease;\n /* Off-screen cards skip layout and paint; the placeholder keeps scrollbar\n * estimation sane before the browser has measured the real height. */\n content-visibility: auto;\n contain-intrinsic-size: auto 140px;\n}\n\n/* The sentinel that triggers the next shelf batch: zero visual footprint. */\n.sd7ee01_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s705cc6_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s65f383_card:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l1));\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s65f383_card { transition: none; }\n .s65f383_card:hover { transform: none; }\n}\n\n/* The signature: a spine and cover in the category's own hue. The hues are\n * fixed mid-bright colors that read on both themes; `other` deliberately\n * stays a neutral gray so the fallback category does not compete. */\n.s4ce25d_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--spine-hue, #8B8E96);\n}\n\n.s65f383_card[data-category='tool'] { --spine-hue: #4C8DFF; }\n.s65f383_card[data-category='provider'] { --spine-hue: #A78BFA; }\n.s65f383_card[data-category='ui'] { --spine-hue: #2DD4BF; }\n.s65f383_card[data-category='workflow'] { --spine-hue: #F59E0B; }\n.s65f383_card[data-category='integration'] { --spine-hue: #34D399; }\n.s65f383_card[data-category='theme'] { --spine-hue: #F472B6; }\n.s65f383_card[data-category='other'] { --spine-hue: #8B8E96; }\n\n/* The category sits in the badge row as a quiet chip in the category's own\n * hue — the border carries it where the light theme's white layers cannot\n * (the same lesson as the check button). */\n.s9c8eaa_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--spine-hue, #8B8E96) 45%, transparent);\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--spine-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.sa97234_entryHeader {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding: 8px 12px 2px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.sa97234_entryHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n/* The name fills the row and truncates rather than wraps; the badges stay\n * intact beside it. */\n.sc3f149_name {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n flex: 1 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--dsw-alias-label-primary);\n}\n\n.s513026_badges {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* The action line: buttons side by side; an active install/uninstall flow\n * (gate, log, notices) takes the full width below them. */\n.s9b5048_cardActions {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 10px;\n}\n\n.s9b5048_cardActions > .sc4f2ac_gate,\n.s9b5048_cardActions > .s4d374c_installPanel,\n.s9b5048_cardActions > .sf53ca0_installedActions {\n flex-basis: 100%;\n}\n\n/* The entry's version, always visible on the card (the expanded detail\n * repeats it in the version row) — the same quiet mono as the toolbar. */\n.sc6ec6e_cardVersion {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The octocat marking a github-sourced entry, beside its short commit. */\n.s71f10f_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s5e82cb_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.s5e82cb_tierBadge[data-tier='verified'] {\n color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);\n}\n\n.s5e82cb_tierBadge[data-tier='verified-stale'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.s5e82cb_tierBadge[data-tier='community'] {\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n border: 1px solid var(--dsw-alias-border-l2);\n}\n\n.s4bbe02_incompatibleBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.sff43b4_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s73f7fb_chevron, .s61393c_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s61393c_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .s73f7fb_chevron, .s61393c_chevronOpen { transition: none; }\n}\n\n.s820ebf_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.sb8fbc8_summary {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.se507db_summaryZh {\n margin: -4px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Expanded cards show the full summary: the clamp is lifted, never raised —\n * a higher number would still truncate the author's text, just later. */\n.s10baf0_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.sb9dba9_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s6eca19_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s9d2029_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s3bdbd5_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s441702_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s441702_capabilities li {\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sde3f0c_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.se98179_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.sfb4d2f_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.sfb4d2f_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.sfb4d2f_detailRow dd {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n text-align: right;\n color: var(--dsw-alias-label-primary);\n}\n\n.sfb4d2f_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.sfb4d2f_detailRow a:hover {\n text-decoration: underline;\n}\n\n.sfb4d2f_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The publishing account, beside the npm link. Secondary label colour and a\n * middot separator carry the distinction — never a background fill, which is\n * invisible in the light theme where every bg-layer token is the same white. */\n/* Who published the entry, at the right edge of the action row. `margin-left:\n * auto` is what pushes it there; the row is a wrapping flex, so an active\n * install flow (which claims the full width) drops this to the next line\n * rather than squeezing it. */\n.s1ff66f_author {\n margin-left: auto;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.sd58c6d_reviewedLine {\n margin: 8px 0 0;\n padding: 6px 8px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n font-size: 12px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n/* Install flow. */\n.s4d374c_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.se7aaed_installButton, .sb43a49_confirmButton, .s6e45d1_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.se7aaed_installButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.se7aaed_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.sb43a49_confirmButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.sb43a49_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s6e45d1_cancelButton {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n\n.s6e45d1_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.se7aaed_installButton:focus-visible, .sb43a49_confirmButton:focus-visible, .s6e45d1_cancelButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The shelf card of a plugin that is installed and current carries this\n * non-interactive label instead of an install button. Border + text do the\n * work in the light theme, where every bg-layer token resolves to white. */\n.sb6fc74_installedLabel {\n align-self: flex-start;\n margin: 0;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n/* An installed card's controls: the installed label or the update button,\n * plus the uninstall button. The install panel's running/failed states are\n * column layouts and sit as one item of this row. */\n.sf53ca0_installedActions {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Uninstall revokes privilege; the quiet outline keeps it from competing\n * with the primary action, and the error tint says \"removes\". */\n.s96967f_uninstallButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 55%, transparent);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s96967f_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.s96967f_uninstallButton:focus-visible {\n outline: 2px solid var(--dsw-alias-state-error-primary);\n outline-offset: 1px;\n}\n\n/* The restart dsh button on a done install: quiet outline, same rank as\n * the other secondary actions. */\n.s6ac237_restartButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s6ac237_restartButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s6ac237_restartButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sc4f2ac_gate {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: 8px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n.s559c38_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s3c0ace_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sc323e5_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s4b2373_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.s52b5a5_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s64ab71_log {\n max-height: 160px;\n overflow: auto;\n margin: 0;\n padding: 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n list-style: none;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n\n.s1531a8_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sf20dda_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.seb9b08_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.sfd3021_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.s50ba35_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.se75489_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* Installed section. */\n.sa276cf_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.sceae6e_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s8d2072_outdatedRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.s5c2545_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s5c2545_outdatedInfo strong {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n word-break: break-all;\n color: var(--dsw-alias-label-primary);\n}\n\n.s877c68_outdatedVersions {\n /* Two inline labels with nothing between them in the markup ran together as\n * `installed v1.0.0latest v2.0.0`: JSX drops the whitespace-only line, and\n * the per-label class the markup asked for was never defined (singular\n * against this rule's plural). The container owns the gap, the same idiom\n * as .s513026_badges — the labels need no class of their own. */\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa1f556_outdatedActions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* The enable/disable switch. */\n.s11c019_switch {\n position: relative;\n width: 32px;\n height: 18px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n}\n\n.s7580e8_switchOn {\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 55%, transparent);\n}\n\n.saab2b3_switchKnob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--dsw-alias-label-primary);\n transition: transform 120ms ease, background 120ms ease;\n}\n\n.s7580e8_switchOn .saab2b3_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.s11c019_switch:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s11c019_switch, .saab2b3_switchKnob { transition: none; }\n}\n\n/* The hot enable/disable switch on installed rows: the knob button plus the\n * §8 hot-apply / failure notices rendered beside it. */\n.sd9f9e4_switchWrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n";
|
|
5262
|
-
if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"
|
|
5281
|
+
//#region \0dsh-plugin-shop-css:2f345eaf
|
|
5282
|
+
const css = "/* Shop tab styles — a market shelf inside the settings surface. The visual\n * language is the dsh theme's alias tokens ONLY (the four tokens the previous\n * styles referenced that do not exist — bg-layer-3, interactive-bg-hover,\n * state-error, state-success — are corrected to bg-layer-2 and the\n * state-*-primary set). The signature is the category spine: one HUE per\n * category (seven fixed hues, not the brand token — the brand resolves to\n * near-black in the light theme, so seven brand opacities read as seven\n * shades of gray), with the category name as the cover label in the same hue. Class names are mapped to content-derived names at bundle time\n * (tsdown.sfaf2a6_client.s6e981b_config.sbc63d6_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.sfaf2a6_client.sa97aae_spec.sbc63d6_ts` pins this. */\n\n.s2a42f7_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel. */\n overflow-x: hidden;\n}\n\n.se2e700_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.s2bfeb4_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.scc86af_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.sb0fddc_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.sb0fddc_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.sbbf61e_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.s7a9fc3_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.s9e45c7_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.s1a1e68_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.sb0fddc_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 .sb0fddc_skeletonCard span { animation: none; opacity: 0.75; }\n .sb0fddc_skeletonCard::after { content: none; }\n}\n\n.s483f11_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.s483f11_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.s483f11_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s4044cf_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.s778557_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.s48434d_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s627101_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.s66e420_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.s66e420_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.s66e420_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.s818515_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.s818515_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.s818515_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.s818515_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.sc445a8_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.sc445a8_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.sc445a8_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.s90fb4e_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.sf703ef_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.sf703ef_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sdf3282_staleBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sa62643_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.s2b0297_categoryBar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s4e4b56_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.s4e4b56_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.s1e8b51_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.s4e4b56_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s2ab934_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.se29170_catalogStats {\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s2762eb_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.s657f94_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 .s657f94_cards { animation: none; }\n}\n\n.s90b416_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.se89192_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s78e857_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s90b416_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 .s90b416_card { transition: none; }\n .s90b416_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.sc62a66_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.s90b416_card[data-category='tool'] { --spine-hue: #4C8DFF; }\n.s90b416_card[data-category='provider'] { --spine-hue: #A78BFA; }\n.s90b416_card[data-category='ui'] { --spine-hue: #2DD4BF; }\n.s90b416_card[data-category='workflow'] { --spine-hue: #F59E0B; }\n.s90b416_card[data-category='integration'] { --spine-hue: #34D399; }\n.s90b416_card[data-category='theme'] { --spine-hue: #F472B6; }\n.s90b416_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.s6d41ce_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.s11b35b_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.s11b35b_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.s5a68ca_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.sd0808d_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.s93e122_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.s93e122_cardActions > .s7b41bd_gate,\n.s93e122_cardActions > .sb3c36f_installPanel,\n.s93e122_cardActions > .s826ed0_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.sfd496e_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.s1d84cb_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.saead86_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.saead86_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.saead86_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.saead86_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.s7714f3_incompatibleBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.sf7500f_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s7f59e9_chevron, .s468d75_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s468d75_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .s7f59e9_chevron, .s468d75_chevronOpen { transition: none; }\n}\n\n.s421708_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.sa22f0c_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.s73820f_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.s79db5e_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.sdac2ee_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s8de248_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.sfac6f9_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s762128_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sd41253_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.sd41253_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.s98484e_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.sf12b0f_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.sa0f409_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.sa0f409_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa0f409_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.sa0f409_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.sa0f409_detailRow a:hover {\n text-decoration: underline;\n}\n\n.sa0f409_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.s2a53e3_author {\n margin-left: auto;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.s621980_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.sb3c36f_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.se8585b_installButton, .s1cb752_confirmButton, .sec9a89_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.se8585b_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.se8585b_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s1cb752_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.s1cb752_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.sec9a89_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.sec9a89_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.se8585b_installButton:focus-visible, .s1cb752_confirmButton:focus-visible, .sec9a89_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.s551790_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.s826ed0_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.s50d56f_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.s50d56f_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.s50d56f_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.s597ec2_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.s597ec2_restartButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s597ec2_restartButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s7b41bd_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.s66d918_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.scc2a9a_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.se2a11e_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s79f8b8_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.s119f22_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sabb9a6_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.sd360d1_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s740729_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.s4ee8f5_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.sc182c7_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.scc9f62_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s2a0305_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.s4df475_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.s58456c_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s5389ae_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.s550645_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s550645_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.s309a96_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 .sd0808d_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.s19db42_outdatedActions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* The enable/disable switch. */\n.s2d0cb1_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.s57cc7a_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.s1f52fc_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.s57cc7a_switchOn .s1f52fc_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.s2d0cb1_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 .s2d0cb1_switch, .s1f52fc_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.sa8c0e1_switchWrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n";
|
|
5283
|
+
if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"2f345eaf\"]")) {
|
|
5263
5284
|
const tag = document.createElement("style");
|
|
5264
|
-
tag.dataset.pluginCss = "
|
|
5285
|
+
tag.dataset.pluginCss = "2f345eaf";
|
|
5265
5286
|
tag.textContent = css;
|
|
5266
5287
|
document.head.appendChild(tag);
|
|
5267
5288
|
}
|
|
5268
|
-
var
|
|
5269
|
-
"client": "
|
|
5270
|
-
"config": "
|
|
5271
|
-
"ts": "
|
|
5272
|
-
"spec": "
|
|
5273
|
-
"panel": "
|
|
5274
|
-
"stateLine": "
|
|
5275
|
-
"srOnly": "
|
|
5276
|
-
"skeletonGrid": "
|
|
5277
|
-
"skeletonCard": "
|
|
5278
|
-
"skeletonName": "
|
|
5279
|
-
"skeletonSummary": "
|
|
5280
|
-
"skeletonSummaryShort": "
|
|
5281
|
-
"skeletonActions": "
|
|
5282
|
-
"actionButton": "
|
|
5283
|
-
"toolbar": "
|
|
5284
|
-
"toolbarRight": "
|
|
5285
|
-
"versionBlock": "
|
|
5286
|
-
"versionText": "
|
|
5287
|
-
"updateSelfButton": "
|
|
5288
|
-
"checkUpdateButton": "
|
|
5289
|
-
"githubLink": "
|
|
5290
|
-
"selfUpdatePanel": "
|
|
5291
|
-
"searchInput": "
|
|
5292
|
-
"staleBlock": "
|
|
5293
|
-
"staleBadge": "
|
|
5294
|
-
"categoryBar": "
|
|
5295
|
-
"categoryButton": "
|
|
5296
|
-
"categoryButtonOn": "
|
|
5297
|
-
"catalogHeading": "
|
|
5298
|
-
"catalogStats": "
|
|
5299
|
-
"emptyLine": "
|
|
5300
|
-
"cards": "
|
|
5301
|
-
"card": "
|
|
5302
|
-
"cardsSentry": "
|
|
5303
|
-
"showingLine": "
|
|
5304
|
-
"cardSpine": "
|
|
5305
|
-
"categoryBadge": "
|
|
5306
|
-
"entryHeader": "
|
|
5307
|
-
"name": "
|
|
5308
|
-
"badges": "
|
|
5309
|
-
"cardActions": "
|
|
5310
|
-
"gate": "
|
|
5311
|
-
"installPanel": "
|
|
5312
|
-
"installedActions": "
|
|
5313
|
-
"cardVersion": "
|
|
5314
|
-
"sourceBadge": "
|
|
5315
|
-
"tierBadge": "
|
|
5316
|
-
"incompatibleBadge": "
|
|
5317
|
-
"starsBadge": "
|
|
5318
|
-
"chevron": "
|
|
5319
|
-
"chevronOpen": "
|
|
5320
|
-
"body": "
|
|
5321
|
-
"summary": "
|
|
5322
|
-
"summaryZh": "
|
|
5323
|
-
"summaryExpanded": "
|
|
5324
|
-
"summaryZhExpanded": "
|
|
5325
|
-
"incompatibleDetail": "
|
|
5326
|
-
"capabilitiesBlock": "
|
|
5327
|
-
"capabilitiesNote": "
|
|
5328
|
-
"capabilities": "
|
|
5329
|
-
"detail": "
|
|
5330
|
-
"detailRows": "
|
|
5331
|
-
"detailRow": "
|
|
5332
|
-
"author": "
|
|
5333
|
-
"reviewedLine": "
|
|
5334
|
-
"installButton": "
|
|
5335
|
-
"confirmButton": "
|
|
5336
|
-
"cancelButton": "
|
|
5337
|
-
"installedLabel": "
|
|
5338
|
-
"uninstallButton": "
|
|
5339
|
-
"restartButton": "
|
|
5340
|
-
"gateTitle": "
|
|
5341
|
-
"gateBody": "
|
|
5342
|
-
"gateWarning": "
|
|
5343
|
-
"gateActions": "
|
|
5344
|
-
"installing": "
|
|
5345
|
-
"log": "
|
|
5346
|
-
"logLine": "
|
|
5347
|
-
"notice": "
|
|
5348
|
-
"failedHeading": "
|
|
5349
|
-
"failedDetail": "
|
|
5350
|
-
"rejectedCode": "
|
|
5351
|
-
"rejectedDetail": "
|
|
5352
|
-
"outdatedSection": "
|
|
5353
|
-
"outdatedList": "
|
|
5354
|
-
"outdatedRow": "
|
|
5355
|
-
"outdatedInfo": "
|
|
5356
|
-
"outdatedVersions": "
|
|
5357
|
-
"outdatedActions": "
|
|
5358
|
-
"switch": "
|
|
5359
|
-
"switchOn": "
|
|
5360
|
-
"switchKnob": "
|
|
5361
|
-
"switchWrap": "
|
|
5289
|
+
var _dsh_plugin_shop_css_2f345eaf_default = {
|
|
5290
|
+
"client": "sfaf2a6_client",
|
|
5291
|
+
"config": "s6e981b_config",
|
|
5292
|
+
"ts": "sbc63d6_ts",
|
|
5293
|
+
"spec": "sa97aae_spec",
|
|
5294
|
+
"panel": "s2a42f7_panel",
|
|
5295
|
+
"stateLine": "se2e700_stateLine",
|
|
5296
|
+
"srOnly": "s2bfeb4_srOnly",
|
|
5297
|
+
"skeletonGrid": "scc86af_skeletonGrid",
|
|
5298
|
+
"skeletonCard": "sb0fddc_skeletonCard",
|
|
5299
|
+
"skeletonName": "sbbf61e_skeletonName",
|
|
5300
|
+
"skeletonSummary": "s7a9fc3_skeletonSummary",
|
|
5301
|
+
"skeletonSummaryShort": "s9e45c7_skeletonSummaryShort",
|
|
5302
|
+
"skeletonActions": "s1a1e68_skeletonActions",
|
|
5303
|
+
"actionButton": "s483f11_actionButton",
|
|
5304
|
+
"toolbar": "s4044cf_toolbar",
|
|
5305
|
+
"toolbarRight": "s778557_toolbarRight",
|
|
5306
|
+
"versionBlock": "s48434d_versionBlock",
|
|
5307
|
+
"versionText": "s627101_versionText",
|
|
5308
|
+
"updateSelfButton": "s66e420_updateSelfButton",
|
|
5309
|
+
"checkUpdateButton": "s818515_checkUpdateButton",
|
|
5310
|
+
"githubLink": "sc445a8_githubLink",
|
|
5311
|
+
"selfUpdatePanel": "s90fb4e_selfUpdatePanel",
|
|
5312
|
+
"searchInput": "sf703ef_searchInput",
|
|
5313
|
+
"staleBlock": "sdf3282_staleBlock",
|
|
5314
|
+
"staleBadge": "sa62643_staleBadge",
|
|
5315
|
+
"categoryBar": "s2b0297_categoryBar",
|
|
5316
|
+
"categoryButton": "s4e4b56_categoryButton",
|
|
5317
|
+
"categoryButtonOn": "s1e8b51_categoryButtonOn",
|
|
5318
|
+
"catalogHeading": "s2ab934_catalogHeading",
|
|
5319
|
+
"catalogStats": "se29170_catalogStats",
|
|
5320
|
+
"emptyLine": "s2762eb_emptyLine",
|
|
5321
|
+
"cards": "s657f94_cards",
|
|
5322
|
+
"card": "s90b416_card",
|
|
5323
|
+
"cardsSentry": "se89192_cardsSentry",
|
|
5324
|
+
"showingLine": "s78e857_showingLine",
|
|
5325
|
+
"cardSpine": "sc62a66_cardSpine",
|
|
5326
|
+
"categoryBadge": "s6d41ce_categoryBadge",
|
|
5327
|
+
"entryHeader": "s11b35b_entryHeader",
|
|
5328
|
+
"name": "s5a68ca_name",
|
|
5329
|
+
"badges": "sd0808d_badges",
|
|
5330
|
+
"cardActions": "s93e122_cardActions",
|
|
5331
|
+
"gate": "s7b41bd_gate",
|
|
5332
|
+
"installPanel": "sb3c36f_installPanel",
|
|
5333
|
+
"installedActions": "s826ed0_installedActions",
|
|
5334
|
+
"cardVersion": "sfd496e_cardVersion",
|
|
5335
|
+
"sourceBadge": "s1d84cb_sourceBadge",
|
|
5336
|
+
"tierBadge": "saead86_tierBadge",
|
|
5337
|
+
"incompatibleBadge": "s7714f3_incompatibleBadge",
|
|
5338
|
+
"starsBadge": "sf7500f_starsBadge",
|
|
5339
|
+
"chevron": "s7f59e9_chevron",
|
|
5340
|
+
"chevronOpen": "s468d75_chevronOpen",
|
|
5341
|
+
"body": "s421708_body",
|
|
5342
|
+
"summary": "sa22f0c_summary",
|
|
5343
|
+
"summaryZh": "s73820f_summaryZh",
|
|
5344
|
+
"summaryExpanded": "s79db5e_summaryExpanded",
|
|
5345
|
+
"summaryZhExpanded": "sdac2ee_summaryZhExpanded",
|
|
5346
|
+
"incompatibleDetail": "s8de248_incompatibleDetail",
|
|
5347
|
+
"capabilitiesBlock": "sfac6f9_capabilitiesBlock",
|
|
5348
|
+
"capabilitiesNote": "s762128_capabilitiesNote",
|
|
5349
|
+
"capabilities": "sd41253_capabilities",
|
|
5350
|
+
"detail": "s98484e_detail",
|
|
5351
|
+
"detailRows": "sf12b0f_detailRows",
|
|
5352
|
+
"detailRow": "sa0f409_detailRow",
|
|
5353
|
+
"author": "s2a53e3_author",
|
|
5354
|
+
"reviewedLine": "s621980_reviewedLine",
|
|
5355
|
+
"installButton": "se8585b_installButton",
|
|
5356
|
+
"confirmButton": "s1cb752_confirmButton",
|
|
5357
|
+
"cancelButton": "sec9a89_cancelButton",
|
|
5358
|
+
"installedLabel": "s551790_installedLabel",
|
|
5359
|
+
"uninstallButton": "s50d56f_uninstallButton",
|
|
5360
|
+
"restartButton": "s597ec2_restartButton",
|
|
5361
|
+
"gateTitle": "s66d918_gateTitle",
|
|
5362
|
+
"gateBody": "scc2a9a_gateBody",
|
|
5363
|
+
"gateWarning": "se2a11e_gateWarning",
|
|
5364
|
+
"gateActions": "s79f8b8_gateActions",
|
|
5365
|
+
"installing": "s119f22_installing",
|
|
5366
|
+
"log": "sabb9a6_log",
|
|
5367
|
+
"logLine": "sd360d1_logLine",
|
|
5368
|
+
"notice": "s740729_notice",
|
|
5369
|
+
"failedHeading": "s4ee8f5_failedHeading",
|
|
5370
|
+
"failedDetail": "sc182c7_failedDetail",
|
|
5371
|
+
"rejectedCode": "scc9f62_rejectedCode",
|
|
5372
|
+
"rejectedDetail": "s2a0305_rejectedDetail",
|
|
5373
|
+
"outdatedSection": "s4df475_outdatedSection",
|
|
5374
|
+
"outdatedList": "s58456c_outdatedList",
|
|
5375
|
+
"outdatedRow": "s5389ae_outdatedRow",
|
|
5376
|
+
"outdatedInfo": "s550645_outdatedInfo",
|
|
5377
|
+
"outdatedVersions": "s309a96_outdatedVersions",
|
|
5378
|
+
"outdatedActions": "s19db42_outdatedActions",
|
|
5379
|
+
"switch": "s2d0cb1_switch",
|
|
5380
|
+
"switchOn": "s57cc7a_switchOn",
|
|
5381
|
+
"switchKnob": "s1f52fc_switchKnob",
|
|
5382
|
+
"switchWrap": "sa8c0e1_switchWrap"
|
|
5362
5383
|
};
|
|
5363
5384
|
//#endregion
|
|
5364
5385
|
//#region src/client/ShopTab.tsx
|
|
@@ -5375,7 +5396,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5375
5396
|
width: "14",
|
|
5376
5397
|
height: "14",
|
|
5377
5398
|
"aria-hidden": "true",
|
|
5378
|
-
className: open ?
|
|
5399
|
+
className: open ? _dsh_plugin_shop_css_2f345eaf_default.chevronOpen : _dsh_plugin_shop_css_2f345eaf_default.chevron,
|
|
5379
5400
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
5380
5401
|
fill: "currentColor",
|
|
5381
5402
|
d: "M3.5 6 8 10.5 12.5 6l1 1L8 12.5 2.5 7l1-1Z"
|
|
@@ -5396,32 +5417,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5396
5417
|
const author = authorOf(entry);
|
|
5397
5418
|
const category = entry.catalog?.category ?? "other";
|
|
5398
5419
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5399
|
-
className:
|
|
5420
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.card,
|
|
5400
5421
|
"data-shop-entry": entry.name,
|
|
5401
5422
|
"data-category": category,
|
|
5402
5423
|
children: [
|
|
5403
5424
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5404
|
-
className:
|
|
5425
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cardSpine,
|
|
5405
5426
|
"aria-hidden": "true"
|
|
5406
5427
|
}),
|
|
5407
5428
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
5408
5429
|
type: "button",
|
|
5409
|
-
className:
|
|
5430
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.entryHeader,
|
|
5410
5431
|
"aria-expanded": open,
|
|
5411
5432
|
"aria-controls": detailId,
|
|
5412
5433
|
onClick: () => setOpen((current) => !current),
|
|
5413
5434
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5414
|
-
className:
|
|
5435
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.name,
|
|
5415
5436
|
children: entry.name
|
|
5416
5437
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5417
|
-
className:
|
|
5438
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.badges,
|
|
5418
5439
|
children: [
|
|
5419
5440
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5420
|
-
className:
|
|
5441
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.categoryBadge,
|
|
5421
5442
|
children: t(categoryKey(entry))
|
|
5422
5443
|
}),
|
|
5423
5444
|
entry.source === "npm" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5424
|
-
className:
|
|
5445
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.sourceBadge,
|
|
5425
5446
|
"data-shop-source-npm": true,
|
|
5426
5447
|
role: "img",
|
|
5427
5448
|
"aria-label": t("npmSource"),
|
|
@@ -5438,7 +5459,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5438
5459
|
})
|
|
5439
5460
|
}),
|
|
5440
5461
|
hasGithubHome(entry) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5441
|
-
className:
|
|
5462
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.sourceBadge,
|
|
5442
5463
|
"data-shop-source-github": true,
|
|
5443
5464
|
role: "img",
|
|
5444
5465
|
"aria-label": t("githubSource"),
|
|
@@ -5452,23 +5473,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5452
5473
|
})
|
|
5453
5474
|
}),
|
|
5454
5475
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5455
|
-
className:
|
|
5476
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cardVersion,
|
|
5456
5477
|
"data-card-version": true,
|
|
5457
5478
|
children: ["v", displayVersion(entry)]
|
|
5458
5479
|
}),
|
|
5459
5480
|
entry.tier !== "community" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5460
|
-
className:
|
|
5481
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.tierBadge,
|
|
5461
5482
|
"data-tier": entry.tier,
|
|
5462
5483
|
children: t(tierKey(entry.tier))
|
|
5463
5484
|
}),
|
|
5464
5485
|
missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5465
|
-
className:
|
|
5486
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleBadge,
|
|
5466
5487
|
"data-shop-incompatible": true,
|
|
5467
5488
|
title: t("incompatibleDetail", { modules: missing.join(", ") }),
|
|
5468
5489
|
children: t("incompatibleBadge")
|
|
5469
5490
|
}),
|
|
5470
5491
|
stars !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5471
|
-
className:
|
|
5492
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.starsBadge,
|
|
5472
5493
|
role: "img",
|
|
5473
5494
|
"aria-label": t("stars", { count: stars }),
|
|
5474
5495
|
children: ["★ ", formatStars(stars)]
|
|
@@ -5478,38 +5499,38 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5478
5499
|
})]
|
|
5479
5500
|
}),
|
|
5480
5501
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5481
|
-
className:
|
|
5502
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.body,
|
|
5482
5503
|
children: [
|
|
5483
5504
|
summary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5484
|
-
className: open ? `${
|
|
5505
|
+
className: open ? `${_dsh_plugin_shop_css_2f345eaf_default.summary} ${_dsh_plugin_shop_css_2f345eaf_default.summaryExpanded}` : _dsh_plugin_shop_css_2f345eaf_default.summary,
|
|
5485
5506
|
children: summary.en
|
|
5486
5507
|
}),
|
|
5487
5508
|
summary?.zh !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5488
|
-
className: open ? `${
|
|
5509
|
+
className: open ? `${_dsh_plugin_shop_css_2f345eaf_default.summaryZh} ${_dsh_plugin_shop_css_2f345eaf_default.summaryZhExpanded}` : _dsh_plugin_shop_css_2f345eaf_default.summaryZh,
|
|
5489
5510
|
children: summary.zh
|
|
5490
5511
|
}),
|
|
5491
5512
|
missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5492
|
-
className:
|
|
5513
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleDetail,
|
|
5493
5514
|
children: t("incompatibleDetail", { modules: missing.join(", ") })
|
|
5494
5515
|
}),
|
|
5495
5516
|
open && entry.catalog !== void 0 && entry.catalog.capabilities.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5496
|
-
className:
|
|
5517
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.capabilitiesBlock,
|
|
5497
5518
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5498
|
-
className:
|
|
5519
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.capabilitiesNote,
|
|
5499
5520
|
children: t("capabilitiesNote")
|
|
5500
5521
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
5501
|
-
className:
|
|
5522
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.capabilities,
|
|
5502
5523
|
children: entry.catalog.capabilities.map((capability) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: capability }, capability))
|
|
5503
5524
|
})]
|
|
5504
5525
|
}),
|
|
5505
5526
|
open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
5506
5527
|
id: detailId,
|
|
5507
|
-
className:
|
|
5528
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detail,
|
|
5508
5529
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
|
|
5509
|
-
className:
|
|
5530
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detailRows,
|
|
5510
5531
|
children: [
|
|
5511
5532
|
npmUrl !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5512
|
-
className:
|
|
5533
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
|
|
5513
5534
|
"data-shop-npm": true,
|
|
5514
5535
|
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", {
|
|
5515
5536
|
href: npmUrl,
|
|
@@ -5519,7 +5540,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5519
5540
|
}) })]
|
|
5520
5541
|
}),
|
|
5521
5542
|
entry.repository !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5522
|
-
className:
|
|
5543
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
|
|
5523
5544
|
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", {
|
|
5524
5545
|
href: entry.repository,
|
|
5525
5546
|
target: "_blank",
|
|
@@ -5528,12 +5549,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5528
5549
|
}) : entry.repository })]
|
|
5529
5550
|
}),
|
|
5530
5551
|
entry.license !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5531
|
-
className:
|
|
5552
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
|
|
5532
5553
|
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 })]
|
|
5533
5554
|
})
|
|
5534
5555
|
]
|
|
5535
5556
|
}), entry.tier === "verified-stale" && entry.review !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5536
|
-
className:
|
|
5557
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.reviewedLine,
|
|
5537
5558
|
children: entry.review.reviewedVersion !== void 0 ? t("reviewedVersionLine", {
|
|
5538
5559
|
reviewed: entry.review.reviewedVersion,
|
|
5539
5560
|
current: entry.version
|
|
@@ -5546,7 +5567,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5546
5567
|
]
|
|
5547
5568
|
}),
|
|
5548
5569
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5549
|
-
className:
|
|
5570
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cardActions,
|
|
5550
5571
|
"data-shop-actions": true,
|
|
5551
5572
|
children: [installed === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InstallPanel, {
|
|
5552
5573
|
name: entry.name,
|
|
@@ -5571,7 +5592,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5571
5592
|
restart,
|
|
5572
5593
|
restartSupported
|
|
5573
5594
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5574
|
-
className:
|
|
5595
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installedLabel,
|
|
5575
5596
|
"data-shop-installed": true,
|
|
5576
5597
|
children: t("installed")
|
|
5577
5598
|
}),
|
|
@@ -5589,7 +5610,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5589
5610
|
restartSupported
|
|
5590
5611
|
})
|
|
5591
5612
|
] }), author !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5592
|
-
className:
|
|
5613
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.author,
|
|
5593
5614
|
"data-shop-author": true,
|
|
5594
5615
|
children: t("authorLine", { author })
|
|
5595
5616
|
})]
|
|
@@ -5606,23 +5627,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5606
5627
|
const [gateOpen, setGateOpen] = (0, react.useState)(false);
|
|
5607
5628
|
const { view, start } = useInstall(install, installStatus);
|
|
5608
5629
|
if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5609
|
-
className:
|
|
5630
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5610
5631
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5611
|
-
className:
|
|
5632
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installing,
|
|
5612
5633
|
children: t("installing")
|
|
5613
5634
|
}), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5614
|
-
className:
|
|
5635
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
5615
5636
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5616
|
-
className:
|
|
5637
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
5617
5638
|
children: line
|
|
5618
5639
|
}, index))
|
|
5619
5640
|
})]
|
|
5620
5641
|
});
|
|
5621
5642
|
if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5622
|
-
className:
|
|
5643
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
|
|
5623
5644
|
children: [
|
|
5624
5645
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5625
|
-
className:
|
|
5646
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5626
5647
|
"data-shop-restart-notice": true,
|
|
5627
5648
|
children: view.needsRestart ? t(restartReasonKey(view.restartReason)) : t("installedNoRestartNotice")
|
|
5628
5649
|
}),
|
|
@@ -5631,63 +5652,63 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5631
5652
|
restart
|
|
5632
5653
|
}),
|
|
5633
5654
|
view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5634
|
-
className:
|
|
5655
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5635
5656
|
"data-shop-restart-disabled": true,
|
|
5636
5657
|
children: t("restartDisabledNotice")
|
|
5637
5658
|
})
|
|
5638
5659
|
]
|
|
5639
5660
|
});
|
|
5640
5661
|
if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5641
|
-
className:
|
|
5662
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5642
5663
|
children: [
|
|
5643
5664
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5644
|
-
className:
|
|
5665
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
|
|
5645
5666
|
children: t("installFailed")
|
|
5646
5667
|
}),
|
|
5647
5668
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5648
|
-
className:
|
|
5669
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
5649
5670
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5650
|
-
className:
|
|
5671
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
5651
5672
|
children: line
|
|
5652
5673
|
}, index))
|
|
5653
5674
|
}),
|
|
5654
5675
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5655
|
-
className:
|
|
5676
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
5656
5677
|
children: view.detail === "" ? t("installTransportFailed") : view.detail
|
|
5657
5678
|
})
|
|
5658
5679
|
]
|
|
5659
5680
|
});
|
|
5660
5681
|
if (view.kind === "rejected") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5661
|
-
className:
|
|
5682
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5662
5683
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5663
|
-
className:
|
|
5684
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.rejectedCode,
|
|
5664
5685
|
children: t(rejectionCodeKey(view.code))
|
|
5665
5686
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5666
|
-
className:
|
|
5687
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.rejectedDetail,
|
|
5667
5688
|
children: view.detail
|
|
5668
5689
|
})]
|
|
5669
5690
|
});
|
|
5670
5691
|
if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5671
|
-
className:
|
|
5692
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gate,
|
|
5672
5693
|
children: [
|
|
5673
5694
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5674
|
-
className:
|
|
5695
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateTitle,
|
|
5675
5696
|
children: t("acknowledgementTitle")
|
|
5676
5697
|
}),
|
|
5677
5698
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5678
|
-
className:
|
|
5699
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateBody,
|
|
5679
5700
|
children: t("acknowledgementBody")
|
|
5680
5701
|
}),
|
|
5681
5702
|
missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5682
|
-
className:
|
|
5703
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateWarning,
|
|
5683
5704
|
"data-shop-incompatible-warning": true,
|
|
5684
5705
|
children: t("incompatibleInstallWarning", { modules: missing.join(", ") })
|
|
5685
5706
|
}),
|
|
5686
5707
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5687
|
-
className:
|
|
5708
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateActions,
|
|
5688
5709
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5689
5710
|
type: "button",
|
|
5690
|
-
className:
|
|
5711
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.confirmButton,
|
|
5691
5712
|
"data-shop-confirm": true,
|
|
5692
5713
|
onClick: () => {
|
|
5693
5714
|
setGateOpen(false);
|
|
@@ -5700,7 +5721,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5700
5721
|
children: t("confirm")
|
|
5701
5722
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5702
5723
|
type: "button",
|
|
5703
|
-
className:
|
|
5724
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cancelButton,
|
|
5704
5725
|
onClick: () => setGateOpen(false),
|
|
5705
5726
|
children: t("cancel")
|
|
5706
5727
|
})]
|
|
@@ -5710,7 +5731,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5710
5731
|
const update = variant === "update";
|
|
5711
5732
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5712
5733
|
type: "button",
|
|
5713
|
-
className:
|
|
5734
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installButton,
|
|
5714
5735
|
...update ? { "data-shop-update": true } : { "data-shop-install": true },
|
|
5715
5736
|
onClick: () => {
|
|
5716
5737
|
if (tier === "verified") start({
|
|
@@ -5732,23 +5753,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5732
5753
|
function UninstallPanel({ name, t, uninstall, installStatus, restart, restartSupported }) {
|
|
5733
5754
|
const { view, start } = useUninstall(uninstall, installStatus);
|
|
5734
5755
|
if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5735
|
-
className:
|
|
5756
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5736
5757
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5737
|
-
className:
|
|
5758
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installing,
|
|
5738
5759
|
children: t("uninstalling")
|
|
5739
5760
|
}), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5740
|
-
className:
|
|
5761
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
5741
5762
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5742
|
-
className:
|
|
5763
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
5743
5764
|
children: line
|
|
5744
5765
|
}, index))
|
|
5745
5766
|
})]
|
|
5746
5767
|
});
|
|
5747
5768
|
if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5748
|
-
className:
|
|
5769
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
|
|
5749
5770
|
children: [
|
|
5750
5771
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5751
|
-
className:
|
|
5772
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5752
5773
|
"data-shop-uninstall-done": true,
|
|
5753
5774
|
children: view.needsRestart ? t("uninstalledRestartNotice") : t("uninstalledLiveNotice")
|
|
5754
5775
|
}),
|
|
@@ -5757,28 +5778,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5757
5778
|
restart
|
|
5758
5779
|
}),
|
|
5759
5780
|
view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5760
|
-
className:
|
|
5781
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5761
5782
|
"data-shop-restart-disabled": true,
|
|
5762
5783
|
children: t("restartDisabledNotice")
|
|
5763
5784
|
})
|
|
5764
5785
|
]
|
|
5765
5786
|
});
|
|
5766
5787
|
if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5767
|
-
className:
|
|
5788
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5768
5789
|
children: [
|
|
5769
5790
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5770
|
-
className:
|
|
5791
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
|
|
5771
5792
|
children: t("uninstallFailed")
|
|
5772
5793
|
}),
|
|
5773
5794
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5774
|
-
className:
|
|
5795
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
5775
5796
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5776
|
-
className:
|
|
5797
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
5777
5798
|
children: line
|
|
5778
5799
|
}, index))
|
|
5779
5800
|
}),
|
|
5780
5801
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5781
|
-
className:
|
|
5802
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
5782
5803
|
children: view.detail === "" ? t("uninstallTransportFailed") : view.detail
|
|
5783
5804
|
})
|
|
5784
5805
|
]
|
|
@@ -5786,7 +5807,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5786
5807
|
if (view.kind !== "idle") return null;
|
|
5787
5808
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5788
5809
|
type: "button",
|
|
5789
|
-
className:
|
|
5810
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.uninstallButton,
|
|
5790
5811
|
"data-shop-uninstall": true,
|
|
5791
5812
|
onClick: () => void start({ name }),
|
|
5792
5813
|
children: t("uninstall")
|
|
@@ -5843,37 +5864,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5843
5864
|
return () => clearInterval(timer);
|
|
5844
5865
|
}, [state, t]);
|
|
5845
5866
|
if (state.kind === "restarting") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5846
|
-
className:
|
|
5867
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5847
5868
|
"data-shop-restarting": true,
|
|
5848
5869
|
children: t("restarting")
|
|
5849
5870
|
});
|
|
5850
5871
|
if (state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5851
|
-
className:
|
|
5872
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
5852
5873
|
"data-shop-restart-error": true,
|
|
5853
5874
|
children: state.detail
|
|
5854
5875
|
});
|
|
5855
5876
|
if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5856
|
-
className:
|
|
5877
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gate,
|
|
5857
5878
|
children: [
|
|
5858
5879
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5859
|
-
className:
|
|
5880
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateTitle,
|
|
5860
5881
|
children: t("restartTitle")
|
|
5861
5882
|
}),
|
|
5862
5883
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5863
|
-
className:
|
|
5884
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateBody,
|
|
5864
5885
|
children: t("restartBody")
|
|
5865
5886
|
}),
|
|
5866
5887
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5867
|
-
className:
|
|
5888
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateActions,
|
|
5868
5889
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5869
5890
|
type: "button",
|
|
5870
|
-
className:
|
|
5891
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.confirmButton,
|
|
5871
5892
|
"data-shop-restart-confirm": true,
|
|
5872
5893
|
onClick: () => void onConfirm(),
|
|
5873
5894
|
children: t("restartConfirm")
|
|
5874
5895
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5875
5896
|
type: "button",
|
|
5876
|
-
className:
|
|
5897
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cancelButton,
|
|
5877
5898
|
onClick: () => setGateOpen(false),
|
|
5878
5899
|
children: t("cancel")
|
|
5879
5900
|
})]
|
|
@@ -5882,7 +5903,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5882
5903
|
});
|
|
5883
5904
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5884
5905
|
type: "button",
|
|
5885
|
-
className:
|
|
5906
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.restartButton,
|
|
5886
5907
|
"data-shop-restart": true,
|
|
5887
5908
|
onClick: () => setGateOpen(true),
|
|
5888
5909
|
children: t("restart")
|
|
@@ -5922,7 +5943,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5922
5943
|
}
|
|
5923
5944
|
};
|
|
5924
5945
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5925
|
-
className:
|
|
5946
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.switchWrap,
|
|
5926
5947
|
"data-shop-enabled-switch": row.name,
|
|
5927
5948
|
children: [
|
|
5928
5949
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
@@ -5931,18 +5952,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5931
5952
|
"aria-checked": enabled,
|
|
5932
5953
|
"aria-label": t("enabledSwitch"),
|
|
5933
5954
|
"data-shop-toggle": true,
|
|
5934
|
-
className: `${
|
|
5955
|
+
className: `${_dsh_plugin_shop_css_2f345eaf_default.switch} ${enabled ? _dsh_plugin_shop_css_2f345eaf_default.switchOn : ""}`,
|
|
5935
5956
|
onClick: () => void onToggle(),
|
|
5936
5957
|
disabled: toggle.kind === "saving",
|
|
5937
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
5958
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.switchKnob })
|
|
5938
5959
|
}),
|
|
5939
5960
|
toggle.kind === "saved" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5940
|
-
className:
|
|
5961
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5941
5962
|
"data-shop-hot-apply": true,
|
|
5942
5963
|
children: t("hotApplyNote")
|
|
5943
5964
|
}),
|
|
5944
5965
|
toggle.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5945
|
-
className:
|
|
5966
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
5946
5967
|
"data-shop-toggle-error": true,
|
|
5947
5968
|
children: toggle.detail
|
|
5948
5969
|
})
|
|
@@ -5954,27 +5975,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5954
5975
|
* install flow for `name@latest`, reusing `InstallPanel`). */
|
|
5955
5976
|
function OutdatedRow({ row, tier, source, missing, t, setEnabled, install, installStatus, restart, restartSupported }) {
|
|
5956
5977
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5957
|
-
className:
|
|
5978
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedRow,
|
|
5958
5979
|
"data-shop-outdated-entry": row.name,
|
|
5959
5980
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5960
|
-
className:
|
|
5981
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedInfo,
|
|
5961
5982
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5962
|
-
className:
|
|
5983
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.badges,
|
|
5963
5984
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5964
|
-
className:
|
|
5985
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.name,
|
|
5965
5986
|
children: row.name
|
|
5966
5987
|
}), missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5967
|
-
className:
|
|
5988
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleBadge,
|
|
5968
5989
|
"data-shop-incompatible": true,
|
|
5969
5990
|
title: t("incompatibleUpdateDetail", { modules: missing.join(", ") }),
|
|
5970
5991
|
children: t("incompatibleBadge")
|
|
5971
5992
|
})]
|
|
5972
5993
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5973
|
-
className:
|
|
5994
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedVersions,
|
|
5974
5995
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("installedVersion", { version: source === "github" ? row.installed.slice(0, 7) : row.installed }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("latestVersion", { version: row.latest }) })]
|
|
5975
5996
|
})]
|
|
5976
5997
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5977
|
-
className:
|
|
5998
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedActions,
|
|
5978
5999
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnabledSwitch, {
|
|
5979
6000
|
row,
|
|
5980
6001
|
t,
|
|
@@ -6004,20 +6025,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6004
6025
|
function OutdatedSection({ state, tiers, sources, missingByName, t, setEnabled, install, installStatus, restart, restartSupported }) {
|
|
6005
6026
|
if (state.kind === "loading") return null;
|
|
6006
6027
|
if (state.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6007
|
-
className:
|
|
6028
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.stateLine,
|
|
6008
6029
|
"data-shop-outdated-error": true,
|
|
6009
6030
|
children: t("error")
|
|
6010
6031
|
});
|
|
6011
6032
|
const outdated = state.entries.filter((entry) => entry.outdated);
|
|
6012
6033
|
if (outdated.length === 0) return null;
|
|
6013
6034
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
6014
|
-
className:
|
|
6035
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedSection,
|
|
6015
6036
|
"data-shop-outdated": true,
|
|
6016
6037
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
|
|
6017
|
-
className:
|
|
6038
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.catalogHeading,
|
|
6018
6039
|
children: t("installedSection")
|
|
6019
6040
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
6020
|
-
className:
|
|
6041
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedList,
|
|
6021
6042
|
children: outdated.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OutdatedRow, {
|
|
6022
6043
|
row,
|
|
6023
6044
|
tier: tiers.get(row.name) ?? "community",
|
|
@@ -6190,50 +6211,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6190
6211
|
return map;
|
|
6191
6212
|
}, [catalogState]);
|
|
6192
6213
|
if (catalogState.kind === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6193
|
-
className:
|
|
6214
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.panel,
|
|
6194
6215
|
"data-shop-tab": true,
|
|
6195
6216
|
"aria-busy": "true",
|
|
6196
6217
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6197
|
-
className:
|
|
6218
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.srOnly,
|
|
6198
6219
|
children: t("loading")
|
|
6199
6220
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6200
|
-
className:
|
|
6221
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.skeletonGrid,
|
|
6201
6222
|
"data-shop-skeleton": true,
|
|
6202
6223
|
"aria-hidden": "true",
|
|
6203
6224
|
children: Array.from({ length: 8 }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6204
|
-
className:
|
|
6225
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.skeletonCard,
|
|
6205
6226
|
children: [
|
|
6206
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
6207
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
6208
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
6209
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
6227
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.skeletonName }),
|
|
6228
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.skeletonSummary }),
|
|
6229
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.skeletonSummaryShort }),
|
|
6230
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.skeletonActions })
|
|
6210
6231
|
]
|
|
6211
6232
|
}, i))
|
|
6212
6233
|
})]
|
|
6213
6234
|
});
|
|
6214
6235
|
if (catalogState.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6215
|
-
className:
|
|
6236
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.panel,
|
|
6216
6237
|
"data-shop-tab": true,
|
|
6217
6238
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6218
|
-
className:
|
|
6239
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.stateLine,
|
|
6219
6240
|
children: t("error")
|
|
6220
6241
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
6221
6242
|
type: "button",
|
|
6222
|
-
className:
|
|
6243
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.actionButton,
|
|
6223
6244
|
onClick: () => setRequest({ kind: "retry" }),
|
|
6224
6245
|
children: t("retry")
|
|
6225
6246
|
})]
|
|
6226
6247
|
});
|
|
6227
6248
|
const { result } = catalogState;
|
|
6228
6249
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6229
|
-
className:
|
|
6250
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.panel,
|
|
6230
6251
|
"data-shop-tab": true,
|
|
6231
6252
|
children: [
|
|
6232
6253
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6233
|
-
className:
|
|
6254
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.toolbar,
|
|
6234
6255
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
6235
6256
|
type: "search",
|
|
6236
|
-
className:
|
|
6257
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.searchInput,
|
|
6237
6258
|
"aria-label": t("search"),
|
|
6238
6259
|
placeholder: t("search"),
|
|
6239
6260
|
value: query,
|
|
@@ -6242,31 +6263,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6242
6263
|
setVisibleCount(48);
|
|
6243
6264
|
}
|
|
6244
6265
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6245
|
-
className:
|
|
6266
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.toolbarRight,
|
|
6246
6267
|
children: [
|
|
6247
6268
|
result.stale && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6248
|
-
className:
|
|
6269
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.staleBlock,
|
|
6249
6270
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
6250
|
-
className:
|
|
6271
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.staleBadge,
|
|
6251
6272
|
children: t("staleLabel", { date: result.builtAt.slice(0, 10) })
|
|
6252
6273
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
6253
6274
|
type: "button",
|
|
6254
|
-
className:
|
|
6275
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.actionButton,
|
|
6255
6276
|
onClick: () => setRequest({ kind: "refresh" }),
|
|
6256
6277
|
children: t("refresh")
|
|
6257
6278
|
})]
|
|
6258
6279
|
}),
|
|
6259
6280
|
selfVersion !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6260
|
-
className:
|
|
6281
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.versionBlock,
|
|
6261
6282
|
children: [
|
|
6262
6283
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
6263
|
-
className:
|
|
6284
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.versionText,
|
|
6264
6285
|
"data-shop-version": true,
|
|
6265
6286
|
children: ["v", selfVersion.installed]
|
|
6266
6287
|
}),
|
|
6267
6288
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
6268
6289
|
type: "button",
|
|
6269
|
-
className:
|
|
6290
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.checkUpdateButton,
|
|
6270
6291
|
"data-shop-check-update": true,
|
|
6271
6292
|
disabled: checkState !== "idle",
|
|
6272
6293
|
onClick: () => void checkVersion(),
|
|
@@ -6274,7 +6295,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6274
6295
|
}),
|
|
6275
6296
|
selfVersion.outdated && selfVersion.latest !== null && selfUpdate.view.kind === "idle" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
6276
6297
|
type: "button",
|
|
6277
|
-
className:
|
|
6298
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.updateSelfButton,
|
|
6278
6299
|
"data-shop-update-self": true,
|
|
6279
6300
|
onClick: () => {
|
|
6280
6301
|
if (selfVersion.latest !== null) selfUpdate.start({ version: selfVersion.latest });
|
|
@@ -6284,7 +6305,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6284
6305
|
]
|
|
6285
6306
|
}),
|
|
6286
6307
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
|
|
6287
|
-
className:
|
|
6308
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.githubLink,
|
|
6288
6309
|
href: SHOP_REPO_URL,
|
|
6289
6310
|
target: "_blank",
|
|
6290
6311
|
rel: "noopener noreferrer",
|
|
@@ -6303,27 +6324,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6303
6324
|
})]
|
|
6304
6325
|
}),
|
|
6305
6326
|
selfUpdate.view.kind === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6306
|
-
className:
|
|
6327
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
|
|
6307
6328
|
"data-shop-self-updating": true,
|
|
6308
6329
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6309
|
-
className:
|
|
6330
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installing,
|
|
6310
6331
|
children: t("installing")
|
|
6311
6332
|
}), selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6312
|
-
className:
|
|
6333
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
6313
6334
|
children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6314
|
-
className:
|
|
6335
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
6315
6336
|
children: line
|
|
6316
6337
|
}, index))
|
|
6317
6338
|
})]
|
|
6318
6339
|
}),
|
|
6319
6340
|
selfUpdate.view.kind === "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6320
|
-
className:
|
|
6341
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
|
|
6321
6342
|
"data-shop-self-update-done": true,
|
|
6322
6343
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6323
|
-
className:
|
|
6344
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
|
|
6324
6345
|
children: [
|
|
6325
6346
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6326
|
-
className:
|
|
6347
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
6327
6348
|
children: t("installedRestartNotice")
|
|
6328
6349
|
}),
|
|
6329
6350
|
restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartPanel, {
|
|
@@ -6331,7 +6352,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6331
6352
|
restart
|
|
6332
6353
|
}),
|
|
6333
6354
|
!restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6334
|
-
className:
|
|
6355
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
6335
6356
|
"data-shop-restart-disabled": true,
|
|
6336
6357
|
children: t("restartDisabledNotice")
|
|
6337
6358
|
})
|
|
@@ -6339,34 +6360,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6339
6360
|
})
|
|
6340
6361
|
}),
|
|
6341
6362
|
selfUpdate.view.kind === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6342
|
-
className:
|
|
6363
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
|
|
6343
6364
|
"data-shop-self-update-failed": true,
|
|
6344
6365
|
children: [
|
|
6345
6366
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6346
|
-
className:
|
|
6367
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
|
|
6347
6368
|
children: t("updateFailed")
|
|
6348
6369
|
}),
|
|
6349
6370
|
selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6350
|
-
className:
|
|
6371
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
6351
6372
|
children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6352
|
-
className:
|
|
6373
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
6353
6374
|
children: line
|
|
6354
6375
|
}, index))
|
|
6355
6376
|
}),
|
|
6356
6377
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6357
|
-
className:
|
|
6378
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
6358
6379
|
children: selfUpdate.view.detail === "" ? t("updateTransportFailed") : selfUpdate.view.detail
|
|
6359
6380
|
})
|
|
6360
6381
|
]
|
|
6361
6382
|
}),
|
|
6362
6383
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6363
|
-
className:
|
|
6384
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.categoryBar,
|
|
6364
6385
|
role: "group",
|
|
6365
6386
|
"aria-label": t("catalog"),
|
|
6366
6387
|
children: [
|
|
6367
6388
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
6368
6389
|
type: "button",
|
|
6369
|
-
className: category === null ? `${
|
|
6390
|
+
className: category === null ? `${_dsh_plugin_shop_css_2f345eaf_default.categoryButton} ${_dsh_plugin_shop_css_2f345eaf_default.categoryButtonOn}` : _dsh_plugin_shop_css_2f345eaf_default.categoryButton,
|
|
6370
6391
|
"aria-pressed": category === null,
|
|
6371
6392
|
onClick: () => {
|
|
6372
6393
|
setCategory(null);
|
|
@@ -6380,7 +6401,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6380
6401
|
}),
|
|
6381
6402
|
CATEGORY_ORDER.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
6382
6403
|
type: "button",
|
|
6383
|
-
className: category === key ? `${
|
|
6404
|
+
className: category === key ? `${_dsh_plugin_shop_css_2f345eaf_default.categoryButton} ${_dsh_plugin_shop_css_2f345eaf_default.categoryButtonOn}` : _dsh_plugin_shop_css_2f345eaf_default.categoryButton,
|
|
6384
6405
|
"aria-pressed": category === key,
|
|
6385
6406
|
onClick: () => {
|
|
6386
6407
|
setCategory(key);
|
|
@@ -6394,7 +6415,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6394
6415
|
}, key)),
|
|
6395
6416
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
6396
6417
|
type: "button",
|
|
6397
|
-
className: category === "installed" ? `${
|
|
6418
|
+
className: category === "installed" ? `${_dsh_plugin_shop_css_2f345eaf_default.categoryButton} ${_dsh_plugin_shop_css_2f345eaf_default.categoryButtonOn}` : _dsh_plugin_shop_css_2f345eaf_default.categoryButton,
|
|
6398
6419
|
"aria-pressed": category === "installed",
|
|
6399
6420
|
onClick: () => {
|
|
6400
6421
|
setCategory("installed");
|
|
@@ -6409,20 +6430,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6409
6430
|
]
|
|
6410
6431
|
}),
|
|
6411
6432
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6412
|
-
className:
|
|
6433
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.catalogStats,
|
|
6413
6434
|
children: t("catalogStats", {
|
|
6414
6435
|
count: String(result.plugins.length),
|
|
6415
6436
|
date: result.builtAt.slice(0, 10)
|
|
6416
6437
|
})
|
|
6417
6438
|
}),
|
|
6418
6439
|
result.plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6419
|
-
className:
|
|
6440
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.emptyLine,
|
|
6420
6441
|
children: t("empty")
|
|
6421
6442
|
}) : filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6422
|
-
className:
|
|
6443
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.emptyLine,
|
|
6423
6444
|
children: t("emptySearch")
|
|
6424
6445
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
|
|
6425
|
-
className:
|
|
6446
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cards,
|
|
6426
6447
|
children: [visible.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EntryCard, {
|
|
6427
6448
|
entry,
|
|
6428
6449
|
stars: starsOf(entry, stars),
|
|
@@ -6435,14 +6456,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6435
6456
|
restart,
|
|
6436
6457
|
restartSupported,
|
|
6437
6458
|
setEnabled
|
|
6438
|
-
}) }, entry
|
|
6459
|
+
}) }, entryKey(entry))), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
|
|
6439
6460
|
ref: sentinelRef,
|
|
6440
|
-
className:
|
|
6461
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cardsSentry,
|
|
6441
6462
|
"data-shop-sentry": true,
|
|
6442
6463
|
"aria-hidden": "true"
|
|
6443
6464
|
})]
|
|
6444
6465
|
}), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6445
|
-
className:
|
|
6466
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.showingLine,
|
|
6446
6467
|
"aria-live": "polite",
|
|
6447
6468
|
children: t("showing", {
|
|
6448
6469
|
shown: String(visibleCount),
|
|
@@ -182,6 +182,25 @@ export declare function hasGithubHome(entry: CatalogEntry): boolean;
|
|
|
182
182
|
*/
|
|
183
183
|
export declare function authorOf(entry: CatalogEntry): string | null;
|
|
184
184
|
export declare function npmPageUrl(entry: CatalogEntry): string | null;
|
|
185
|
+
/**
|
|
186
|
+
* One entry's install identity — the value the catalog guarantees unique, and
|
|
187
|
+
* therefore the only safe React key for a shelf card.
|
|
188
|
+
*
|
|
189
|
+
* `name` is NOT unique. The catalog's uniqueness invariant is the install
|
|
190
|
+
* identity (registry `emit.ts` assertCatalogInvariants): `npm:<name>` for an
|
|
191
|
+
* npm entry, `github:<repo>#<subdir>` for a repo one — so two GitHub
|
|
192
|
+
* repositories publishing the same `package.json` name are two legitimate
|
|
193
|
+
* entries under one name, as are two subpackages of one monorepo. The live
|
|
194
|
+
* catalog holds 151 such names over 243 entries, five of them cookiecutter
|
|
195
|
+
* templates that all name themselves `{{PKG_NAME}}`.
|
|
196
|
+
*
|
|
197
|
+
* Keying the shelf by name handed React duplicate keys, and React could then
|
|
198
|
+
* no longer match a card to its DOM node: changing the filter left every
|
|
199
|
+
* duplicate orphaned on the page — hundreds of stale cards from the previous
|
|
200
|
+
* category, accumulating with each switch until the tab stopped responding.
|
|
201
|
+
* This mirrors the registry's identity verbatim; the two must not drift.
|
|
202
|
+
*/
|
|
203
|
+
export declare function entryKey(entry: CatalogEntry): string;
|
|
185
204
|
/**
|
|
186
205
|
* One entry's star count from the sidecar, or undefined when it has none.
|
|
187
206
|
*
|
package/package.json
CHANGED