dsh-plugin-shop 0.6.0-beta.1 → 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 +302 -238
- package/lib/types/client/locales.d.ts +2 -0
- package/lib/types/client/present.d.ts +33 -0
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -4840,6 +4840,29 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4840
4840
|
* package page.
|
|
4841
4841
|
*/
|
|
4842
4842
|
/**
|
|
4843
|
+
* Whether this entry has a GitHub home the reader could go and inspect.
|
|
4844
|
+
*
|
|
4845
|
+
* True for a github-source entry — a repository IS its identity — and for an
|
|
4846
|
+
* npm entry whose `repository` points at github.com, which is 4892 of the
|
|
4847
|
+
* live catalog's 4915 entries. The mark is therefore ordinary and its
|
|
4848
|
+
* ABSENCE is the signal: a listed package with no public source to read.
|
|
4849
|
+
*
|
|
4850
|
+
* `repository` is untrusted catalog input, so the host is PARSED rather than
|
|
4851
|
+
* pattern-matched — `evil-github.com` and `github.com.evil.test` both end in
|
|
4852
|
+
* the string and neither is GitHub. An unparseable or empty value (two live
|
|
4853
|
+
* entries carry one) is simply not a GitHub home.
|
|
4854
|
+
*/
|
|
4855
|
+
function hasGithubHome(entry) {
|
|
4856
|
+
if (entry.source === "github") return true;
|
|
4857
|
+
if (entry.repository === null) return false;
|
|
4858
|
+
try {
|
|
4859
|
+
const host = new URL(entry.repository).hostname.toLowerCase();
|
|
4860
|
+
return host === "github.com" || host === "www.github.com";
|
|
4861
|
+
} catch {
|
|
4862
|
+
return false;
|
|
4863
|
+
}
|
|
4864
|
+
}
|
|
4865
|
+
/**
|
|
4843
4866
|
* Who put this entry where it is — the fact a reader wants when two listings
|
|
4844
4867
|
* carry the same text from different hands.
|
|
4845
4868
|
*
|
|
@@ -4872,6 +4895,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4872
4895
|
return `https://www.npmjs.com/package/${name}`;
|
|
4873
4896
|
}
|
|
4874
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
|
+
/**
|
|
4875
4919
|
* One entry's star count from the sidecar, or undefined when it has none.
|
|
4876
4920
|
*
|
|
4877
4921
|
* The sidecar keys a github entry by its repo full name and an npm entry by
|
|
@@ -4966,7 +5010,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4966
5010
|
needsAcknowledgementCode: "需要确认",
|
|
4967
5011
|
gitMissingCode: "缺少 git",
|
|
4968
5012
|
tarballIntegrityCode: "压缩包完整性校验失败",
|
|
4969
|
-
|
|
5013
|
+
npmSource: "npm 包",
|
|
5014
|
+
githubSource: "源码在 GitHub",
|
|
4970
5015
|
installedSection: "已安装",
|
|
4971
5016
|
installedVersion: "已安装 v{version}",
|
|
4972
5017
|
latestVersion: "最新 v{version}",
|
|
@@ -5054,7 +5099,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5054
5099
|
needsAcknowledgementCode: "Acknowledgement required",
|
|
5055
5100
|
gitMissingCode: "git missing",
|
|
5056
5101
|
tarballIntegrityCode: "tarball integrity check failed",
|
|
5057
|
-
|
|
5102
|
+
npmSource: "npm package",
|
|
5103
|
+
githubSource: "source on GitHub",
|
|
5058
5104
|
installedSection: "Installed",
|
|
5059
5105
|
installedVersion: "installed v{version}",
|
|
5060
5106
|
latestVersion: "latest v{version}",
|
|
@@ -5232,108 +5278,108 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5232
5278
|
};
|
|
5233
5279
|
}
|
|
5234
5280
|
//#endregion
|
|
5235
|
-
//#region \0dsh-plugin-shop-css:
|
|
5236
|
-
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";
|
|
5237
|
-
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\"]")) {
|
|
5238
5284
|
const tag = document.createElement("style");
|
|
5239
|
-
tag.dataset.pluginCss = "
|
|
5285
|
+
tag.dataset.pluginCss = "2f345eaf";
|
|
5240
5286
|
tag.textContent = css;
|
|
5241
5287
|
document.head.appendChild(tag);
|
|
5242
5288
|
}
|
|
5243
|
-
var
|
|
5244
|
-
"client": "
|
|
5245
|
-
"config": "
|
|
5246
|
-
"ts": "
|
|
5247
|
-
"spec": "
|
|
5248
|
-
"panel": "
|
|
5249
|
-
"stateLine": "
|
|
5250
|
-
"srOnly": "
|
|
5251
|
-
"skeletonGrid": "
|
|
5252
|
-
"skeletonCard": "
|
|
5253
|
-
"skeletonName": "
|
|
5254
|
-
"skeletonSummary": "
|
|
5255
|
-
"skeletonSummaryShort": "
|
|
5256
|
-
"skeletonActions": "
|
|
5257
|
-
"actionButton": "
|
|
5258
|
-
"toolbar": "
|
|
5259
|
-
"toolbarRight": "
|
|
5260
|
-
"versionBlock": "
|
|
5261
|
-
"versionText": "
|
|
5262
|
-
"updateSelfButton": "
|
|
5263
|
-
"checkUpdateButton": "
|
|
5264
|
-
"githubLink": "
|
|
5265
|
-
"selfUpdatePanel": "
|
|
5266
|
-
"searchInput": "
|
|
5267
|
-
"staleBlock": "
|
|
5268
|
-
"staleBadge": "
|
|
5269
|
-
"categoryBar": "
|
|
5270
|
-
"categoryButton": "
|
|
5271
|
-
"categoryButtonOn": "
|
|
5272
|
-
"catalogHeading": "
|
|
5273
|
-
"catalogStats": "
|
|
5274
|
-
"emptyLine": "
|
|
5275
|
-
"cards": "
|
|
5276
|
-
"card": "
|
|
5277
|
-
"cardsSentry": "
|
|
5278
|
-
"showingLine": "
|
|
5279
|
-
"cardSpine": "
|
|
5280
|
-
"categoryBadge": "
|
|
5281
|
-
"entryHeader": "
|
|
5282
|
-
"name": "
|
|
5283
|
-
"badges": "
|
|
5284
|
-
"cardActions": "
|
|
5285
|
-
"gate": "
|
|
5286
|
-
"installPanel": "
|
|
5287
|
-
"installedActions": "
|
|
5288
|
-
"cardVersion": "
|
|
5289
|
-
"sourceBadge": "
|
|
5290
|
-
"tierBadge": "
|
|
5291
|
-
"incompatibleBadge": "
|
|
5292
|
-
"starsBadge": "
|
|
5293
|
-
"chevron": "
|
|
5294
|
-
"chevronOpen": "
|
|
5295
|
-
"body": "
|
|
5296
|
-
"summary": "
|
|
5297
|
-
"summaryZh": "
|
|
5298
|
-
"summaryExpanded": "
|
|
5299
|
-
"summaryZhExpanded": "
|
|
5300
|
-
"incompatibleDetail": "
|
|
5301
|
-
"capabilitiesBlock": "
|
|
5302
|
-
"capabilitiesNote": "
|
|
5303
|
-
"capabilities": "
|
|
5304
|
-
"detail": "
|
|
5305
|
-
"detailRows": "
|
|
5306
|
-
"detailRow": "
|
|
5307
|
-
"author": "
|
|
5308
|
-
"reviewedLine": "
|
|
5309
|
-
"installButton": "
|
|
5310
|
-
"confirmButton": "
|
|
5311
|
-
"cancelButton": "
|
|
5312
|
-
"installedLabel": "
|
|
5313
|
-
"uninstallButton": "
|
|
5314
|
-
"restartButton": "
|
|
5315
|
-
"gateTitle": "
|
|
5316
|
-
"gateBody": "
|
|
5317
|
-
"gateWarning": "
|
|
5318
|
-
"gateActions": "
|
|
5319
|
-
"installing": "
|
|
5320
|
-
"log": "
|
|
5321
|
-
"logLine": "
|
|
5322
|
-
"notice": "
|
|
5323
|
-
"failedHeading": "
|
|
5324
|
-
"failedDetail": "
|
|
5325
|
-
"rejectedCode": "
|
|
5326
|
-
"rejectedDetail": "
|
|
5327
|
-
"outdatedSection": "
|
|
5328
|
-
"outdatedList": "
|
|
5329
|
-
"outdatedRow": "
|
|
5330
|
-
"outdatedInfo": "
|
|
5331
|
-
"outdatedVersions": "
|
|
5332
|
-
"outdatedActions": "
|
|
5333
|
-
"switch": "
|
|
5334
|
-
"switchOn": "
|
|
5335
|
-
"switchKnob": "
|
|
5336
|
-
"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"
|
|
5337
5383
|
};
|
|
5338
5384
|
//#endregion
|
|
5339
5385
|
//#region src/client/ShopTab.tsx
|
|
@@ -5350,7 +5396,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5350
5396
|
width: "14",
|
|
5351
5397
|
height: "14",
|
|
5352
5398
|
"aria-hidden": "true",
|
|
5353
|
-
className: open ?
|
|
5399
|
+
className: open ? _dsh_plugin_shop_css_2f345eaf_default.chevronOpen : _dsh_plugin_shop_css_2f345eaf_default.chevron,
|
|
5354
5400
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
5355
5401
|
fill: "currentColor",
|
|
5356
5402
|
d: "M3.5 6 8 10.5 12.5 6l1 1L8 12.5 2.5 7l1-1Z"
|
|
@@ -5371,32 +5417,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5371
5417
|
const author = authorOf(entry);
|
|
5372
5418
|
const category = entry.catalog?.category ?? "other";
|
|
5373
5419
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5374
|
-
className:
|
|
5420
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.card,
|
|
5375
5421
|
"data-shop-entry": entry.name,
|
|
5376
5422
|
"data-category": category,
|
|
5377
5423
|
children: [
|
|
5378
5424
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5379
|
-
className:
|
|
5425
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cardSpine,
|
|
5380
5426
|
"aria-hidden": "true"
|
|
5381
5427
|
}),
|
|
5382
5428
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
5383
5429
|
type: "button",
|
|
5384
|
-
className:
|
|
5430
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.entryHeader,
|
|
5385
5431
|
"aria-expanded": open,
|
|
5386
5432
|
"aria-controls": detailId,
|
|
5387
5433
|
onClick: () => setOpen((current) => !current),
|
|
5388
5434
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5389
|
-
className:
|
|
5435
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.name,
|
|
5390
5436
|
children: entry.name
|
|
5391
5437
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5392
|
-
className:
|
|
5438
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.badges,
|
|
5393
5439
|
children: [
|
|
5394
5440
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5395
|
-
className:
|
|
5441
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.categoryBadge,
|
|
5396
5442
|
children: t(categoryKey(entry))
|
|
5397
5443
|
}),
|
|
5398
|
-
entry.source === "
|
|
5399
|
-
className:
|
|
5444
|
+
entry.source === "npm" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5445
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.sourceBadge,
|
|
5446
|
+
"data-shop-source-npm": true,
|
|
5447
|
+
role: "img",
|
|
5448
|
+
"aria-label": t("npmSource"),
|
|
5449
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
|
|
5450
|
+
viewBox: "0 0 16 16",
|
|
5451
|
+
width: "12",
|
|
5452
|
+
height: "12",
|
|
5453
|
+
"aria-hidden": "true",
|
|
5454
|
+
fill: "currentColor",
|
|
5455
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
5456
|
+
fillRule: "evenodd",
|
|
5457
|
+
d: "M0 0v16h16V0H0zm13 13h-2V6H8v7H3V3h10v10z"
|
|
5458
|
+
})
|
|
5459
|
+
})
|
|
5460
|
+
}),
|
|
5461
|
+
hasGithubHome(entry) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5462
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.sourceBadge,
|
|
5463
|
+
"data-shop-source-github": true,
|
|
5400
5464
|
role: "img",
|
|
5401
5465
|
"aria-label": t("githubSource"),
|
|
5402
5466
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
|
|
@@ -5409,23 +5473,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5409
5473
|
})
|
|
5410
5474
|
}),
|
|
5411
5475
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5412
|
-
className:
|
|
5476
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cardVersion,
|
|
5413
5477
|
"data-card-version": true,
|
|
5414
5478
|
children: ["v", displayVersion(entry)]
|
|
5415
5479
|
}),
|
|
5416
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5417
|
-
className:
|
|
5480
|
+
entry.tier !== "community" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5481
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.tierBadge,
|
|
5418
5482
|
"data-tier": entry.tier,
|
|
5419
5483
|
children: t(tierKey(entry.tier))
|
|
5420
5484
|
}),
|
|
5421
5485
|
missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5422
|
-
className:
|
|
5486
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleBadge,
|
|
5423
5487
|
"data-shop-incompatible": true,
|
|
5424
5488
|
title: t("incompatibleDetail", { modules: missing.join(", ") }),
|
|
5425
5489
|
children: t("incompatibleBadge")
|
|
5426
5490
|
}),
|
|
5427
5491
|
stars !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5428
|
-
className:
|
|
5492
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.starsBadge,
|
|
5429
5493
|
role: "img",
|
|
5430
5494
|
"aria-label": t("stars", { count: stars }),
|
|
5431
5495
|
children: ["★ ", formatStars(stars)]
|
|
@@ -5435,38 +5499,38 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5435
5499
|
})]
|
|
5436
5500
|
}),
|
|
5437
5501
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5438
|
-
className:
|
|
5502
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.body,
|
|
5439
5503
|
children: [
|
|
5440
5504
|
summary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5441
|
-
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,
|
|
5442
5506
|
children: summary.en
|
|
5443
5507
|
}),
|
|
5444
5508
|
summary?.zh !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5445
|
-
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,
|
|
5446
5510
|
children: summary.zh
|
|
5447
5511
|
}),
|
|
5448
5512
|
missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5449
|
-
className:
|
|
5513
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleDetail,
|
|
5450
5514
|
children: t("incompatibleDetail", { modules: missing.join(", ") })
|
|
5451
5515
|
}),
|
|
5452
5516
|
open && entry.catalog !== void 0 && entry.catalog.capabilities.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5453
|
-
className:
|
|
5517
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.capabilitiesBlock,
|
|
5454
5518
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5455
|
-
className:
|
|
5519
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.capabilitiesNote,
|
|
5456
5520
|
children: t("capabilitiesNote")
|
|
5457
5521
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
5458
|
-
className:
|
|
5522
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.capabilities,
|
|
5459
5523
|
children: entry.catalog.capabilities.map((capability) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: capability }, capability))
|
|
5460
5524
|
})]
|
|
5461
5525
|
}),
|
|
5462
5526
|
open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
5463
5527
|
id: detailId,
|
|
5464
|
-
className:
|
|
5528
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detail,
|
|
5465
5529
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
|
|
5466
|
-
className:
|
|
5530
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detailRows,
|
|
5467
5531
|
children: [
|
|
5468
5532
|
npmUrl !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5469
|
-
className:
|
|
5533
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
|
|
5470
5534
|
"data-shop-npm": true,
|
|
5471
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", {
|
|
5472
5536
|
href: npmUrl,
|
|
@@ -5476,7 +5540,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5476
5540
|
}) })]
|
|
5477
5541
|
}),
|
|
5478
5542
|
entry.repository !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5479
|
-
className:
|
|
5543
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
|
|
5480
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", {
|
|
5481
5545
|
href: entry.repository,
|
|
5482
5546
|
target: "_blank",
|
|
@@ -5485,12 +5549,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5485
5549
|
}) : entry.repository })]
|
|
5486
5550
|
}),
|
|
5487
5551
|
entry.license !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5488
|
-
className:
|
|
5552
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
|
|
5489
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 })]
|
|
5490
5554
|
})
|
|
5491
5555
|
]
|
|
5492
5556
|
}), entry.tier === "verified-stale" && entry.review !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5493
|
-
className:
|
|
5557
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.reviewedLine,
|
|
5494
5558
|
children: entry.review.reviewedVersion !== void 0 ? t("reviewedVersionLine", {
|
|
5495
5559
|
reviewed: entry.review.reviewedVersion,
|
|
5496
5560
|
current: entry.version
|
|
@@ -5503,7 +5567,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5503
5567
|
]
|
|
5504
5568
|
}),
|
|
5505
5569
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5506
|
-
className:
|
|
5570
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cardActions,
|
|
5507
5571
|
"data-shop-actions": true,
|
|
5508
5572
|
children: [installed === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InstallPanel, {
|
|
5509
5573
|
name: entry.name,
|
|
@@ -5528,7 +5592,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5528
5592
|
restart,
|
|
5529
5593
|
restartSupported
|
|
5530
5594
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5531
|
-
className:
|
|
5595
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installedLabel,
|
|
5532
5596
|
"data-shop-installed": true,
|
|
5533
5597
|
children: t("installed")
|
|
5534
5598
|
}),
|
|
@@ -5546,7 +5610,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5546
5610
|
restartSupported
|
|
5547
5611
|
})
|
|
5548
5612
|
] }), author !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5549
|
-
className:
|
|
5613
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.author,
|
|
5550
5614
|
"data-shop-author": true,
|
|
5551
5615
|
children: t("authorLine", { author })
|
|
5552
5616
|
})]
|
|
@@ -5563,23 +5627,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5563
5627
|
const [gateOpen, setGateOpen] = (0, react.useState)(false);
|
|
5564
5628
|
const { view, start } = useInstall(install, installStatus);
|
|
5565
5629
|
if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5566
|
-
className:
|
|
5630
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5567
5631
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5568
|
-
className:
|
|
5632
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installing,
|
|
5569
5633
|
children: t("installing")
|
|
5570
5634
|
}), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5571
|
-
className:
|
|
5635
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
5572
5636
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5573
|
-
className:
|
|
5637
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
5574
5638
|
children: line
|
|
5575
5639
|
}, index))
|
|
5576
5640
|
})]
|
|
5577
5641
|
});
|
|
5578
5642
|
if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5579
|
-
className:
|
|
5643
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
|
|
5580
5644
|
children: [
|
|
5581
5645
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5582
|
-
className:
|
|
5646
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5583
5647
|
"data-shop-restart-notice": true,
|
|
5584
5648
|
children: view.needsRestart ? t(restartReasonKey(view.restartReason)) : t("installedNoRestartNotice")
|
|
5585
5649
|
}),
|
|
@@ -5588,63 +5652,63 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5588
5652
|
restart
|
|
5589
5653
|
}),
|
|
5590
5654
|
view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5591
|
-
className:
|
|
5655
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5592
5656
|
"data-shop-restart-disabled": true,
|
|
5593
5657
|
children: t("restartDisabledNotice")
|
|
5594
5658
|
})
|
|
5595
5659
|
]
|
|
5596
5660
|
});
|
|
5597
5661
|
if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5598
|
-
className:
|
|
5662
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5599
5663
|
children: [
|
|
5600
5664
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5601
|
-
className:
|
|
5665
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
|
|
5602
5666
|
children: t("installFailed")
|
|
5603
5667
|
}),
|
|
5604
5668
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5605
|
-
className:
|
|
5669
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
5606
5670
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5607
|
-
className:
|
|
5671
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
5608
5672
|
children: line
|
|
5609
5673
|
}, index))
|
|
5610
5674
|
}),
|
|
5611
5675
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5612
|
-
className:
|
|
5676
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
5613
5677
|
children: view.detail === "" ? t("installTransportFailed") : view.detail
|
|
5614
5678
|
})
|
|
5615
5679
|
]
|
|
5616
5680
|
});
|
|
5617
5681
|
if (view.kind === "rejected") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5618
|
-
className:
|
|
5682
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5619
5683
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5620
|
-
className:
|
|
5684
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.rejectedCode,
|
|
5621
5685
|
children: t(rejectionCodeKey(view.code))
|
|
5622
5686
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5623
|
-
className:
|
|
5687
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.rejectedDetail,
|
|
5624
5688
|
children: view.detail
|
|
5625
5689
|
})]
|
|
5626
5690
|
});
|
|
5627
5691
|
if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5628
|
-
className:
|
|
5692
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gate,
|
|
5629
5693
|
children: [
|
|
5630
5694
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5631
|
-
className:
|
|
5695
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateTitle,
|
|
5632
5696
|
children: t("acknowledgementTitle")
|
|
5633
5697
|
}),
|
|
5634
5698
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5635
|
-
className:
|
|
5699
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateBody,
|
|
5636
5700
|
children: t("acknowledgementBody")
|
|
5637
5701
|
}),
|
|
5638
5702
|
missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5639
|
-
className:
|
|
5703
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateWarning,
|
|
5640
5704
|
"data-shop-incompatible-warning": true,
|
|
5641
5705
|
children: t("incompatibleInstallWarning", { modules: missing.join(", ") })
|
|
5642
5706
|
}),
|
|
5643
5707
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5644
|
-
className:
|
|
5708
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateActions,
|
|
5645
5709
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5646
5710
|
type: "button",
|
|
5647
|
-
className:
|
|
5711
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.confirmButton,
|
|
5648
5712
|
"data-shop-confirm": true,
|
|
5649
5713
|
onClick: () => {
|
|
5650
5714
|
setGateOpen(false);
|
|
@@ -5657,7 +5721,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5657
5721
|
children: t("confirm")
|
|
5658
5722
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5659
5723
|
type: "button",
|
|
5660
|
-
className:
|
|
5724
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cancelButton,
|
|
5661
5725
|
onClick: () => setGateOpen(false),
|
|
5662
5726
|
children: t("cancel")
|
|
5663
5727
|
})]
|
|
@@ -5667,7 +5731,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5667
5731
|
const update = variant === "update";
|
|
5668
5732
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5669
5733
|
type: "button",
|
|
5670
|
-
className:
|
|
5734
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installButton,
|
|
5671
5735
|
...update ? { "data-shop-update": true } : { "data-shop-install": true },
|
|
5672
5736
|
onClick: () => {
|
|
5673
5737
|
if (tier === "verified") start({
|
|
@@ -5689,23 +5753,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5689
5753
|
function UninstallPanel({ name, t, uninstall, installStatus, restart, restartSupported }) {
|
|
5690
5754
|
const { view, start } = useUninstall(uninstall, installStatus);
|
|
5691
5755
|
if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5692
|
-
className:
|
|
5756
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5693
5757
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5694
|
-
className:
|
|
5758
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installing,
|
|
5695
5759
|
children: t("uninstalling")
|
|
5696
5760
|
}), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5697
|
-
className:
|
|
5761
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
5698
5762
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5699
|
-
className:
|
|
5763
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
5700
5764
|
children: line
|
|
5701
5765
|
}, index))
|
|
5702
5766
|
})]
|
|
5703
5767
|
});
|
|
5704
5768
|
if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5705
|
-
className:
|
|
5769
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
|
|
5706
5770
|
children: [
|
|
5707
5771
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5708
|
-
className:
|
|
5772
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5709
5773
|
"data-shop-uninstall-done": true,
|
|
5710
5774
|
children: view.needsRestart ? t("uninstalledRestartNotice") : t("uninstalledLiveNotice")
|
|
5711
5775
|
}),
|
|
@@ -5714,28 +5778,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5714
5778
|
restart
|
|
5715
5779
|
}),
|
|
5716
5780
|
view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5717
|
-
className:
|
|
5781
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5718
5782
|
"data-shop-restart-disabled": true,
|
|
5719
5783
|
children: t("restartDisabledNotice")
|
|
5720
5784
|
})
|
|
5721
5785
|
]
|
|
5722
5786
|
});
|
|
5723
5787
|
if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5724
|
-
className:
|
|
5788
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
|
|
5725
5789
|
children: [
|
|
5726
5790
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5727
|
-
className:
|
|
5791
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
|
|
5728
5792
|
children: t("uninstallFailed")
|
|
5729
5793
|
}),
|
|
5730
5794
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5731
|
-
className:
|
|
5795
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
5732
5796
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
5733
|
-
className:
|
|
5797
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
5734
5798
|
children: line
|
|
5735
5799
|
}, index))
|
|
5736
5800
|
}),
|
|
5737
5801
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5738
|
-
className:
|
|
5802
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
5739
5803
|
children: view.detail === "" ? t("uninstallTransportFailed") : view.detail
|
|
5740
5804
|
})
|
|
5741
5805
|
]
|
|
@@ -5743,7 +5807,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5743
5807
|
if (view.kind !== "idle") return null;
|
|
5744
5808
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5745
5809
|
type: "button",
|
|
5746
|
-
className:
|
|
5810
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.uninstallButton,
|
|
5747
5811
|
"data-shop-uninstall": true,
|
|
5748
5812
|
onClick: () => void start({ name }),
|
|
5749
5813
|
children: t("uninstall")
|
|
@@ -5800,37 +5864,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5800
5864
|
return () => clearInterval(timer);
|
|
5801
5865
|
}, [state, t]);
|
|
5802
5866
|
if (state.kind === "restarting") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5803
|
-
className:
|
|
5867
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5804
5868
|
"data-shop-restarting": true,
|
|
5805
5869
|
children: t("restarting")
|
|
5806
5870
|
});
|
|
5807
5871
|
if (state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5808
|
-
className:
|
|
5872
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
5809
5873
|
"data-shop-restart-error": true,
|
|
5810
5874
|
children: state.detail
|
|
5811
5875
|
});
|
|
5812
5876
|
if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5813
|
-
className:
|
|
5877
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gate,
|
|
5814
5878
|
children: [
|
|
5815
5879
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5816
|
-
className:
|
|
5880
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateTitle,
|
|
5817
5881
|
children: t("restartTitle")
|
|
5818
5882
|
}),
|
|
5819
5883
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5820
|
-
className:
|
|
5884
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateBody,
|
|
5821
5885
|
children: t("restartBody")
|
|
5822
5886
|
}),
|
|
5823
5887
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5824
|
-
className:
|
|
5888
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.gateActions,
|
|
5825
5889
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5826
5890
|
type: "button",
|
|
5827
|
-
className:
|
|
5891
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.confirmButton,
|
|
5828
5892
|
"data-shop-restart-confirm": true,
|
|
5829
5893
|
onClick: () => void onConfirm(),
|
|
5830
5894
|
children: t("restartConfirm")
|
|
5831
5895
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5832
5896
|
type: "button",
|
|
5833
|
-
className:
|
|
5897
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cancelButton,
|
|
5834
5898
|
onClick: () => setGateOpen(false),
|
|
5835
5899
|
children: t("cancel")
|
|
5836
5900
|
})]
|
|
@@ -5839,7 +5903,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5839
5903
|
});
|
|
5840
5904
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
5841
5905
|
type: "button",
|
|
5842
|
-
className:
|
|
5906
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.restartButton,
|
|
5843
5907
|
"data-shop-restart": true,
|
|
5844
5908
|
onClick: () => setGateOpen(true),
|
|
5845
5909
|
children: t("restart")
|
|
@@ -5879,7 +5943,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5879
5943
|
}
|
|
5880
5944
|
};
|
|
5881
5945
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5882
|
-
className:
|
|
5946
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.switchWrap,
|
|
5883
5947
|
"data-shop-enabled-switch": row.name,
|
|
5884
5948
|
children: [
|
|
5885
5949
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
@@ -5888,18 +5952,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5888
5952
|
"aria-checked": enabled,
|
|
5889
5953
|
"aria-label": t("enabledSwitch"),
|
|
5890
5954
|
"data-shop-toggle": true,
|
|
5891
|
-
className: `${
|
|
5955
|
+
className: `${_dsh_plugin_shop_css_2f345eaf_default.switch} ${enabled ? _dsh_plugin_shop_css_2f345eaf_default.switchOn : ""}`,
|
|
5892
5956
|
onClick: () => void onToggle(),
|
|
5893
5957
|
disabled: toggle.kind === "saving",
|
|
5894
|
-
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 })
|
|
5895
5959
|
}),
|
|
5896
5960
|
toggle.kind === "saved" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5897
|
-
className:
|
|
5961
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
5898
5962
|
"data-shop-hot-apply": true,
|
|
5899
5963
|
children: t("hotApplyNote")
|
|
5900
5964
|
}),
|
|
5901
5965
|
toggle.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5902
|
-
className:
|
|
5966
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
5903
5967
|
"data-shop-toggle-error": true,
|
|
5904
5968
|
children: toggle.detail
|
|
5905
5969
|
})
|
|
@@ -5911,27 +5975,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5911
5975
|
* install flow for `name@latest`, reusing `InstallPanel`). */
|
|
5912
5976
|
function OutdatedRow({ row, tier, source, missing, t, setEnabled, install, installStatus, restart, restartSupported }) {
|
|
5913
5977
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5914
|
-
className:
|
|
5978
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedRow,
|
|
5915
5979
|
"data-shop-outdated-entry": row.name,
|
|
5916
5980
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5917
|
-
className:
|
|
5981
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedInfo,
|
|
5918
5982
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5919
|
-
className:
|
|
5983
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.badges,
|
|
5920
5984
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5921
|
-
className:
|
|
5985
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.name,
|
|
5922
5986
|
children: row.name
|
|
5923
5987
|
}), missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
5924
|
-
className:
|
|
5988
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleBadge,
|
|
5925
5989
|
"data-shop-incompatible": true,
|
|
5926
5990
|
title: t("incompatibleUpdateDetail", { modules: missing.join(", ") }),
|
|
5927
5991
|
children: t("incompatibleBadge")
|
|
5928
5992
|
})]
|
|
5929
5993
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
5930
|
-
className:
|
|
5994
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedVersions,
|
|
5931
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 }) })]
|
|
5932
5996
|
})]
|
|
5933
5997
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
5934
|
-
className:
|
|
5998
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedActions,
|
|
5935
5999
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnabledSwitch, {
|
|
5936
6000
|
row,
|
|
5937
6001
|
t,
|
|
@@ -5961,20 +6025,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
5961
6025
|
function OutdatedSection({ state, tiers, sources, missingByName, t, setEnabled, install, installStatus, restart, restartSupported }) {
|
|
5962
6026
|
if (state.kind === "loading") return null;
|
|
5963
6027
|
if (state.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
5964
|
-
className:
|
|
6028
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.stateLine,
|
|
5965
6029
|
"data-shop-outdated-error": true,
|
|
5966
6030
|
children: t("error")
|
|
5967
6031
|
});
|
|
5968
6032
|
const outdated = state.entries.filter((entry) => entry.outdated);
|
|
5969
6033
|
if (outdated.length === 0) return null;
|
|
5970
6034
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
5971
|
-
className:
|
|
6035
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedSection,
|
|
5972
6036
|
"data-shop-outdated": true,
|
|
5973
6037
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
|
|
5974
|
-
className:
|
|
6038
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.catalogHeading,
|
|
5975
6039
|
children: t("installedSection")
|
|
5976
6040
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
5977
|
-
className:
|
|
6041
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.outdatedList,
|
|
5978
6042
|
children: outdated.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OutdatedRow, {
|
|
5979
6043
|
row,
|
|
5980
6044
|
tier: tiers.get(row.name) ?? "community",
|
|
@@ -6147,50 +6211,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6147
6211
|
return map;
|
|
6148
6212
|
}, [catalogState]);
|
|
6149
6213
|
if (catalogState.kind === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6150
|
-
className:
|
|
6214
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.panel,
|
|
6151
6215
|
"data-shop-tab": true,
|
|
6152
6216
|
"aria-busy": "true",
|
|
6153
6217
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6154
|
-
className:
|
|
6218
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.srOnly,
|
|
6155
6219
|
children: t("loading")
|
|
6156
6220
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6157
|
-
className:
|
|
6221
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.skeletonGrid,
|
|
6158
6222
|
"data-shop-skeleton": true,
|
|
6159
6223
|
"aria-hidden": "true",
|
|
6160
6224
|
children: Array.from({ length: 8 }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6161
|
-
className:
|
|
6225
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.skeletonCard,
|
|
6162
6226
|
children: [
|
|
6163
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
6164
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
6165
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
6166
|
-
/* @__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 })
|
|
6167
6231
|
]
|
|
6168
6232
|
}, i))
|
|
6169
6233
|
})]
|
|
6170
6234
|
});
|
|
6171
6235
|
if (catalogState.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6172
|
-
className:
|
|
6236
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.panel,
|
|
6173
6237
|
"data-shop-tab": true,
|
|
6174
6238
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6175
|
-
className:
|
|
6239
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.stateLine,
|
|
6176
6240
|
children: t("error")
|
|
6177
6241
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
6178
6242
|
type: "button",
|
|
6179
|
-
className:
|
|
6243
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.actionButton,
|
|
6180
6244
|
onClick: () => setRequest({ kind: "retry" }),
|
|
6181
6245
|
children: t("retry")
|
|
6182
6246
|
})]
|
|
6183
6247
|
});
|
|
6184
6248
|
const { result } = catalogState;
|
|
6185
6249
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6186
|
-
className:
|
|
6250
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.panel,
|
|
6187
6251
|
"data-shop-tab": true,
|
|
6188
6252
|
children: [
|
|
6189
6253
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6190
|
-
className:
|
|
6254
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.toolbar,
|
|
6191
6255
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
6192
6256
|
type: "search",
|
|
6193
|
-
className:
|
|
6257
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.searchInput,
|
|
6194
6258
|
"aria-label": t("search"),
|
|
6195
6259
|
placeholder: t("search"),
|
|
6196
6260
|
value: query,
|
|
@@ -6199,31 +6263,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6199
6263
|
setVisibleCount(48);
|
|
6200
6264
|
}
|
|
6201
6265
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6202
|
-
className:
|
|
6266
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.toolbarRight,
|
|
6203
6267
|
children: [
|
|
6204
6268
|
result.stale && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6205
|
-
className:
|
|
6269
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.staleBlock,
|
|
6206
6270
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
6207
|
-
className:
|
|
6271
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.staleBadge,
|
|
6208
6272
|
children: t("staleLabel", { date: result.builtAt.slice(0, 10) })
|
|
6209
6273
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
6210
6274
|
type: "button",
|
|
6211
|
-
className:
|
|
6275
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.actionButton,
|
|
6212
6276
|
onClick: () => setRequest({ kind: "refresh" }),
|
|
6213
6277
|
children: t("refresh")
|
|
6214
6278
|
})]
|
|
6215
6279
|
}),
|
|
6216
6280
|
selfVersion !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6217
|
-
className:
|
|
6281
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.versionBlock,
|
|
6218
6282
|
children: [
|
|
6219
6283
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
6220
|
-
className:
|
|
6284
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.versionText,
|
|
6221
6285
|
"data-shop-version": true,
|
|
6222
6286
|
children: ["v", selfVersion.installed]
|
|
6223
6287
|
}),
|
|
6224
6288
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
6225
6289
|
type: "button",
|
|
6226
|
-
className:
|
|
6290
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.checkUpdateButton,
|
|
6227
6291
|
"data-shop-check-update": true,
|
|
6228
6292
|
disabled: checkState !== "idle",
|
|
6229
6293
|
onClick: () => void checkVersion(),
|
|
@@ -6231,7 +6295,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6231
6295
|
}),
|
|
6232
6296
|
selfVersion.outdated && selfVersion.latest !== null && selfUpdate.view.kind === "idle" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
6233
6297
|
type: "button",
|
|
6234
|
-
className:
|
|
6298
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.updateSelfButton,
|
|
6235
6299
|
"data-shop-update-self": true,
|
|
6236
6300
|
onClick: () => {
|
|
6237
6301
|
if (selfVersion.latest !== null) selfUpdate.start({ version: selfVersion.latest });
|
|
@@ -6241,7 +6305,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6241
6305
|
]
|
|
6242
6306
|
}),
|
|
6243
6307
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
|
|
6244
|
-
className:
|
|
6308
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.githubLink,
|
|
6245
6309
|
href: SHOP_REPO_URL,
|
|
6246
6310
|
target: "_blank",
|
|
6247
6311
|
rel: "noopener noreferrer",
|
|
@@ -6260,27 +6324,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6260
6324
|
})]
|
|
6261
6325
|
}),
|
|
6262
6326
|
selfUpdate.view.kind === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6263
|
-
className:
|
|
6327
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
|
|
6264
6328
|
"data-shop-self-updating": true,
|
|
6265
6329
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6266
|
-
className:
|
|
6330
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installing,
|
|
6267
6331
|
children: t("installing")
|
|
6268
6332
|
}), selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6269
|
-
className:
|
|
6333
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
6270
6334
|
children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6271
|
-
className:
|
|
6335
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
6272
6336
|
children: line
|
|
6273
6337
|
}, index))
|
|
6274
6338
|
})]
|
|
6275
6339
|
}),
|
|
6276
6340
|
selfUpdate.view.kind === "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6277
|
-
className:
|
|
6341
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
|
|
6278
6342
|
"data-shop-self-update-done": true,
|
|
6279
6343
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6280
|
-
className:
|
|
6344
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
|
|
6281
6345
|
children: [
|
|
6282
6346
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6283
|
-
className:
|
|
6347
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
6284
6348
|
children: t("installedRestartNotice")
|
|
6285
6349
|
}),
|
|
6286
6350
|
restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartPanel, {
|
|
@@ -6288,7 +6352,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6288
6352
|
restart
|
|
6289
6353
|
}),
|
|
6290
6354
|
!restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6291
|
-
className:
|
|
6355
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.notice,
|
|
6292
6356
|
"data-shop-restart-disabled": true,
|
|
6293
6357
|
children: t("restartDisabledNotice")
|
|
6294
6358
|
})
|
|
@@ -6296,34 +6360,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6296
6360
|
})
|
|
6297
6361
|
}),
|
|
6298
6362
|
selfUpdate.view.kind === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6299
|
-
className:
|
|
6363
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
|
|
6300
6364
|
"data-shop-self-update-failed": true,
|
|
6301
6365
|
children: [
|
|
6302
6366
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6303
|
-
className:
|
|
6367
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
|
|
6304
6368
|
children: t("updateFailed")
|
|
6305
6369
|
}),
|
|
6306
6370
|
selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6307
|
-
className:
|
|
6371
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.log,
|
|
6308
6372
|
children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
6309
|
-
className:
|
|
6373
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
|
|
6310
6374
|
children: line
|
|
6311
6375
|
}, index))
|
|
6312
6376
|
}),
|
|
6313
6377
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6314
|
-
className:
|
|
6378
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
|
|
6315
6379
|
children: selfUpdate.view.detail === "" ? t("updateTransportFailed") : selfUpdate.view.detail
|
|
6316
6380
|
})
|
|
6317
6381
|
]
|
|
6318
6382
|
}),
|
|
6319
6383
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
6320
|
-
className:
|
|
6384
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.categoryBar,
|
|
6321
6385
|
role: "group",
|
|
6322
6386
|
"aria-label": t("catalog"),
|
|
6323
6387
|
children: [
|
|
6324
6388
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
6325
6389
|
type: "button",
|
|
6326
|
-
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,
|
|
6327
6391
|
"aria-pressed": category === null,
|
|
6328
6392
|
onClick: () => {
|
|
6329
6393
|
setCategory(null);
|
|
@@ -6337,7 +6401,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6337
6401
|
}),
|
|
6338
6402
|
CATEGORY_ORDER.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
6339
6403
|
type: "button",
|
|
6340
|
-
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,
|
|
6341
6405
|
"aria-pressed": category === key,
|
|
6342
6406
|
onClick: () => {
|
|
6343
6407
|
setCategory(key);
|
|
@@ -6351,7 +6415,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6351
6415
|
}, key)),
|
|
6352
6416
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
6353
6417
|
type: "button",
|
|
6354
|
-
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,
|
|
6355
6419
|
"aria-pressed": category === "installed",
|
|
6356
6420
|
onClick: () => {
|
|
6357
6421
|
setCategory("installed");
|
|
@@ -6366,20 +6430,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6366
6430
|
]
|
|
6367
6431
|
}),
|
|
6368
6432
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6369
|
-
className:
|
|
6433
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.catalogStats,
|
|
6370
6434
|
children: t("catalogStats", {
|
|
6371
6435
|
count: String(result.plugins.length),
|
|
6372
6436
|
date: result.builtAt.slice(0, 10)
|
|
6373
6437
|
})
|
|
6374
6438
|
}),
|
|
6375
6439
|
result.plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6376
|
-
className:
|
|
6440
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.emptyLine,
|
|
6377
6441
|
children: t("empty")
|
|
6378
6442
|
}) : filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6379
|
-
className:
|
|
6443
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.emptyLine,
|
|
6380
6444
|
children: t("emptySearch")
|
|
6381
6445
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
|
|
6382
|
-
className:
|
|
6446
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cards,
|
|
6383
6447
|
children: [visible.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EntryCard, {
|
|
6384
6448
|
entry,
|
|
6385
6449
|
stars: starsOf(entry, stars),
|
|
@@ -6392,14 +6456,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
6392
6456
|
restart,
|
|
6393
6457
|
restartSupported,
|
|
6394
6458
|
setEnabled
|
|
6395
|
-
}) }, entry
|
|
6459
|
+
}) }, entryKey(entry))), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
|
|
6396
6460
|
ref: sentinelRef,
|
|
6397
|
-
className:
|
|
6461
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.cardsSentry,
|
|
6398
6462
|
"data-shop-sentry": true,
|
|
6399
6463
|
"aria-hidden": "true"
|
|
6400
6464
|
})]
|
|
6401
6465
|
}), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
6402
|
-
className:
|
|
6466
|
+
className: _dsh_plugin_shop_css_2f345eaf_default.showingLine,
|
|
6403
6467
|
"aria-live": "polite",
|
|
6404
6468
|
children: t("showing", {
|
|
6405
6469
|
shown: String(visibleCount),
|