dsh-plugin-shop 0.8.4-beta.1 → 0.8.4
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 +269 -269
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -7784,121 +7784,121 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7784
7784
|
};
|
|
7785
7785
|
}
|
|
7786
7786
|
//#endregion
|
|
7787
|
-
//#region \0dsh-plugin-shop-css:
|
|
7788
|
-
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.se24648_client.s4c8568_config.s64bf36_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.se24648_client.scd01a1_spec.s64bf36_ts` pins this. */\n\n.sa18b47_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel.\n *\n * Clipped on BOTH axes, with a margin, because `.seba6a3_searchInput` sits at\n * exactly (0, 0) of this box — it is the first child of `.s7df13e_toolbar`, itself\n * the first child here, and this rule carries no padding — so its focus\n * ring paints ENTIRELY outside the panel.\n *\n * Both axes is the load-bearing part: `overflow-clip-margin` is inert\n * unless the element clips on both. Clipping x alone left the margin doing\n * nothing — measured against the live app on 0.7.1, the ring reached 0 of\n * its 3px on the left at every device pixel ratio (1, 1.25, 1.5, 2), while\n * keeping the full 3px on the right, where the 280px input stops short of\n * the panel and never meets the clip edge. Raising the margin to 6px\n * changed nothing; clipping both axes with the SAME 3px restored the whole\n * ring. A test that reads declarations cannot see that difference, which is\n * why the first attempt at this shipped broken.\n *\n * `clip` is not a scroll container, so this does not bring back the\n * accidental scrolling `hidden` caused by coercing the other axis to\n * `auto`. Nothing is lost vertically: the panel's scrollHeight equals its\n * height and no descendant paints outside the clip rect (measured).\n * `overflow-x: hidden` stays as the fallback for engines without `clip`,\n * where the ring is clipped as it was before, never worse. */\n overflow-x: hidden;\n overflow: clip;\n overflow-clip-margin: 3px;\n}\n\n.sd85001_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.se60107_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.sba4a38_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.s5aa954_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.s5aa954_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.s7a0318_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.s7a5df4_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.s8d4020_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.sbc0e1a_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.s5aa954_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 .s5aa954_skeletonCard span { animation: none; opacity: 0.75; }\n .s5aa954_skeletonCard::after { content: none; }\n}\n\n.s4a2332_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.s4a2332_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.s4a2332_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s7df13e_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.s20709b_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.s98c547_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s2b9f1d_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.s394a1f_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.s394a1f_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.s394a1f_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.s511e9b_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.s511e9b_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.s511e9b_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.s511e9b_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.se3bcc2_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.se3bcc2_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.se3bcc2_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.s8c6b17_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.seba6a3_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.seba6a3_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sc9d2d3_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.sb4e3b8_categoryBar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s85e01e_categoryButton {\n /* The hue this button carries when selected. `All` and `Installed` select by\n * something other than a category and keep the brand token; the six category\n * buttons override it from the shared hue table below, so a pressed Tool tab\n * turns the same blue as a tool card's spine. */\n --category-hue: var(--dsw-alias-brand-primary);\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/* Blend text with the theme foreground: darker on light backgrounds, lighter\n * on dark ones. The unblended category hue belongs on the border and fill. */\n.s85e01e_categoryButton:hover {\n border-color: color-mix(in srgb, var(--category-hue) 45%, var(--dsw-alias-border-l2));\n color: color-mix(in srgb, var(--category-hue) 45%, var(--dsw-alias-label-primary) 55%);\n}\n\n/* Selected. Written `.s85e01e_categoryButton.s833fec_categoryButtonOn` — TWO classes — so it\n * matches `.s85e01e_categoryButton:hover`'s specificity and, coming after it, wins.\n * As a bare `.s833fec_categoryButtonOn` it lost both `border-color` and `color` to the\n * hover rule for as long as the pointer stayed on the tab that had just been\n * clicked, which is precisely when a reader looks for confirmation.\n *\n * EVERY declaration here is a colour or a shadow: a pressed tab must occupy\n * exactly the same box as an unpressed one, so the bar does not reflow — and\n * with ~9 pills on a wrapping row, one that grows can push the rest onto\n * another line and move the tab out from under the pointer that just clicked\n * it. That is what `font-weight: 600` did (bold metrics are wider than\n * regular), and it is why nothing may be added here that resolves to a length:\n * no padding, no border-width, no font-size, no letter-spacing.\n * `css-tokens.se24648_client.scd01a1_spec.s64bf36_ts` fails the build on one.\n *\n * `box-shadow` is the exception that earns its place: it paints outside the\n * layout box, so an inset ring doubles the border's weight at zero cost to the\n * metrics. It is what `font-weight: 600` used to be — a second, thickness-\n * based signal that hover does not also produce — and the `other` tab needs it\n * most: its hue IS the neutral gray this file uses for \"no category\", so on\n * the light theme hue alone barely separates pressed from unpressed. */\n.s85e01e_categoryButton.s833fec_categoryButtonOn {\n border-color: var(--category-hue);\n background: color-mix(in srgb, var(--category-hue) 14%, transparent);\n color: color-mix(in srgb, var(--category-hue) 45%, var(--dsw-alias-label-primary) 55%);\n box-shadow: inset 0 0 0 1px var(--category-hue);\n}\n\n/* Forced colours replace every colour above with the system palette, which\n * would leave the three colour declarations saying nothing and the pressed tab\n * indistinguishable from its neighbours. `box-shadow` is dropped in this mode\n * too, so the ring has to come back as an outline. */\n@media (forced-colors: active) {\n .s85e01e_categoryButton.s833fec_categoryButtonOn {\n outline: 2px solid ButtonText;\n outline-offset: -4px;\n }\n}\n\n.s85e01e_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The incompatible filter, at the right edge of the category bar: `margin-left:\n * auto` pushes it past the pills, and the bar wraps, so on a narrow panel it\n * drops to its own line rather than squeezing them. It is a MODIFIER, not a\n * ninth category — the categories select what to show and this one subtracts\n * from whatever they selected — so it takes the error hue it filters on rather\n * than joining the hue table.\n *\n * And it is a SWITCH, which is the difference the shape now carries. It used\n * to wear `.s85e01e_categoryButton`: same pill, same row, same size as the eight tabs,\n * differing only in being red. That reads as a ninth tab, and it is not one —\n * the tabs are choose-one and this is on-or-off. So it drops the pill chrome\n * entirely (no border, no fill, nothing to compete with the row it sits\n * beside) and puts the state in a track, the same one every installed card\n * carries. Nothing here restates the switch geometry; `--switch-hue` is the\n * whole of what this control says about it, and it reaches the label too, so\n * one declaration keeps the word and the track the same colour. */\n.sab8b1c_incompatibleFilter {\n --switch-hue: var(--dsw-alias-state-error-primary);\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n /* Matches the pills' vertical padding so the bar keeps one line box whether\n * this control wraps onto a row of its own or shares theirs. */\n padding: 3px 0;\n border: 0;\n background: none;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n/* Hover lifts the word to full contrast and warms the track's border. Scoped\n * to the OFF track: `.sab8b1c_incompatibleFilter:hover .sc4c0fe_switch` outranks `.s383bcc_switchOn`\n * by two classes, so unscoped it would strip the hue from the border at\n * exactly the moment a reader has the pointer on it to check the state. */\n.sab8b1c_incompatibleFilter:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.sab8b1c_incompatibleFilter:hover .sc4c0fe_switch:not(.s383bcc_switchOn) {\n border-color: color-mix(in srgb, var(--switch-hue) 45%, var(--dsw-alias-border-l2));\n}\n\n/* On. Written with both classes for the reason `.s85e01e_categoryButton.s833fec_categoryButtonOn`\n * is: it has to match `:hover`'s specificity and come after it, or the colour\n * reverts under a pointer that has not moved since the click. */\n.sab8b1c_incompatibleFilter.s6dac80_incompatibleFilterOn {\n color: color-mix(in srgb, var(--switch-hue) 45%, var(--dsw-alias-label-primary) 55%);\n}\n\n/* Off here means \"nothing is being taken away\" — the resting state — so the\n * knob steps back to the secondary label. The enable switch keeps the full\n * strength dot, where off means \"this plugin is disabled\" and is worth\n * noticing. In this bar it would be the heaviest mark in a row of hairline\n * pills, and on the light theme it is the WHOLE control: bg-layer-2 is the\n * same white as the panel there, so an off track is a hairline outline with a\n * near-black dot sitting in it. */\n.sab8b1c_incompatibleFilter .sc4c0fe_switch:not(.s383bcc_switchOn) .s43a686_switchKnob {\n background: var(--dsw-alias-label-secondary);\n}\n\n/* The ring has no border to trace, so it takes an offset and the pill radius\n * of the tabs it sits beside rather than hugging the text. */\n.sab8b1c_incompatibleFilter:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n border-radius: 999px;\n}\n\n.sefee3c_updatableHeading {\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.sff4c1e_catalogStatsRow {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 6px 0 0;\n}\n\n.s927a53_catalogStats {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* Sits beside the 12px stats caption, so it is quieter than `.s4a2332_actionButton`:\n * this is an affordance, not a call to action — the catalog reloads on its\n * own at mount and the shelf is already usable without it. Named\n * `catalogRefresh*` (not `reload*`) so it cannot collide with the §4 page\n * reload offer below, which reloads the whole tab rather than refetching\n * the catalog data. */\n.s68cab8_catalogRefreshButton {\n padding: 1px 9px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 17px;\n cursor: pointer;\n}\n\n.s68cab8_catalogRefreshButton:hover:not(:disabled) {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s68cab8_catalogRefreshButton:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n.s68cab8_catalogRefreshButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s6dceed_catalogRefreshFailed {\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s5748b0_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.sb2eae9_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 .sb2eae9_cards { animation: none; }\n}\n\n.sa1c2f7_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.s203f20_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s795be6_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa1c2f7_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 .sa1c2f7_card { transition: none; }\n .sa1c2f7_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.sb00bbe_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--category-hue, #8B8E96);\n}\n\n/* The hue table, keyed by `data-category` and read by BOTH surfaces that\n * speak in category colour: a card's spine and badge, and the category bar's\n * own tab. One table, so a tab can never disagree with the cards it filters to\n * — which is the whole point of colouring the tab. `.s85e01e_categoryButton` sets the\n * brand fallback for `All`/`Installed`; these attribute selectors are one\n * specificity step above it and win wherever the attribute is present. */\n.sa1c2f7_card[data-category='tool'], .s85e01e_categoryButton[data-category='tool'] { --category-hue: #4C8DFF; }\n.sa1c2f7_card[data-category='provider'], .s85e01e_categoryButton[data-category='provider'] { --category-hue: #A78BFA; }\n.sa1c2f7_card[data-category='ui'], .s85e01e_categoryButton[data-category='ui'] { --category-hue: #2DD4BF; }\n.sa1c2f7_card[data-category='workflow'], .s85e01e_categoryButton[data-category='workflow'] { --category-hue: #F59E0B; }\n.sa1c2f7_card[data-category='integration'], .s85e01e_categoryButton[data-category='integration'] { --category-hue: #34D399; }\n.sa1c2f7_card[data-category='theme'], .s85e01e_categoryButton[data-category='theme'] { --category-hue: #F472B6; }\n.sa1c2f7_card[data-category='other'], .s85e01e_categoryButton[data-category='other'] { --category-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.see02fd_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--category-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(--category-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.sd53924_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.sd53924_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.sc2b129_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.scd0548_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.s4f6385_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.s4f6385_cardActions > .sc1afc6_gate,\n.s4f6385_cardActions > .s65b9eb_installPanel,\n.s4f6385_cardActions > .s4fbfe0_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.s4b6469_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.s5a7549_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s23bf0e_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.s23bf0e_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.s23bf0e_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.s23bf0e_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.sadc37f_incompatibleBadge {\n flex-shrink: 0;\n padding: 3px 9px;\n border-radius: 999px;\n font-size: 12px;\n white-space: nowrap;\n color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 40%, transparent);\n}\n\n.s6ba7cc_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s80dda2_chevron, .sde820b_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.sde820b_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .s80dda2_chevron, .sde820b_chevronOpen { transition: none; }\n}\n\n.sa4ad4d_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.s7a8821_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.seab456_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.s5ab512_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.seca366_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n/* `white-space: pre-line` so the newline in the copy is the copy's own: the\n dictionary decides where the line breaks, and a translator changes it\n without touching the component. Collapses runs of spaces like `normal`, so\n only the explicit \\n survives. */\n.sa6eb0b_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n white-space: pre-line;\n color: var(--dsw-alias-state-error-primary);\n}\n\n/* The way out of dsh's own refusal: the lead-in, then the exemption command\n * on its own line. */\n.s92e71f_remedy {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.sb320b4_remedyLead {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n}\n\n/* The exemption command, bound for a terminal unchanged: one click selects\n * all of it, and it wraps anywhere rather than widening the card. A border,\n * not a fill, marks the box: the bg layers are one white in the light theme. */\n.s2c3062_allowCommand {\n display: block;\n padding: 6px 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n white-space: pre-wrap;\n word-break: break-all;\n user-select: all;\n color: var(--dsw-alias-label-primary);\n}\n\n/* A refused install on a surface that does not state its blockers — the\n * outdated row — writes them out on their own full-width line under the\n * disabled button, the command that clears dsh's refusal included. */\n.s5fe511_refusal {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex-basis: 100%;\n}\n\n.scaa43b_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s121391_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s57f233_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s57f233_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.sbcd943_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.s59866d_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.s4662cb_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.s4662cb_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.s4662cb_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.s4662cb_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.s4662cb_detailRow a:hover {\n text-decoration: underline;\n}\n\n.s4662cb_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* What the entry IS rather than what you can do with it — how big it is and\n * who published it — at the right edge of the action row. `margin-left: auto`\n * is what pushes it there, and it lives on this wrapper rather than on either\n * label so the group stays flush right when only one of the two has a value —\n * a packument that named no account has no author, and an entry the registry\n * could not measure honestly has no size. Rarer than it was (every live entry\n * now carries a size, github included), but the wrapper is not what makes it\n * rare: without one, an EMPTY meta group still costs 8px, because\n * `.s4f6385_cardActions` is a flex row with `gap: 8px` and a zero-width item is still\n * an item. The row is a wrapping flex, so an active install flow (which claims\n * the full width) drops the whole group to the next line rather than squeezing\n * it. */\n.s6e38b0_cardMeta {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n min-width: 0;\n}\n\n/* The on-disk size, left of the author. Mono and tabular so the digits of one\n * figure line up with the digits of another WHEREVER the two land: `.s6e38b0_cardMeta`\n * is flush right and the author sits outside the size, so a size's x position\n * moves with the author's width and is different again on the many entries\n * that carry no author at all. There is no column to align to, which is why\n * the reason given here is per-figure legibility rather than the column the\n * first version of this comment claimed. Secondary colour, because it\n * qualifies the entry rather than announcing it.\n *\n * `font-variant-numeric` is safe HERE and would not be on a pill: this element\n * has no state rules, so nothing it does can reflow a wrapping row. */\n.s51bec8_size {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-variant-numeric: tabular-nums;\n font-size: 12px;\n letter-spacing: 0.02em;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The publishing account, at the outer end of `.s6e38b0_cardMeta` on the action row —\n * NOT beside the npm link in the expanded detail, which is where it used to\n * live and what this comment described until the accurate half was deleted\n * with the `margin-left: auto` that moved to `.s6e38b0_cardMeta`. There is no middot:\n * `.s6e38b0_cardMeta`'s 8px gap separates it from the size.\n *\n * Secondary label colour carries the distinction — never a background fill,\n * which is invisible in the light theme where every bg-layer token is the\n * same white. */\n.s7503fc_author {\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.sf73a51_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.s65b9eb_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.sd07a79_installButton, .s1e8df4_confirmButton, .saa2e75_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.sd07a79_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.sd07a79_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s1e8df4_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.s1e8df4_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.saa2e75_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.saa2e75_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.sd07a79_installButton:focus-visible, .s1e8df4_confirmButton:focus-visible, .saa2e75_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.s849adb_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.s4fbfe0_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.sd93778_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.sd93778_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.sd93778_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.s3d7804_restartSelfButton {\n /* The version row's third state. Geometry matches .s511e9b_checkUpdateButton and\n * .s394a1f_updateSelfButton exactly — the row is one evolving control and a\n * different pill would read as a different kind of thing. It takes the\n * emphasised fill rather than the neutral one because at that moment the\n * restart is the only thing left to do, the same reason Update has it. */\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.s3d7804_restartSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The two activation offers share one recipe: a border in an alias token,\n * never a `bg-layer` fill alone — all four bg-layer tokens collapse to the\n * same white under `body` in the light theme, and a fill-only button would\n * vanish there. Grouped rather than copied, because a copy is a rule that\n * can be corrected on one button and left wrong on the other, silently. */\n.s66e9a9_restartButton,\n.s4ca1f6_reloadButton {\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.s66e9a9_restartButton:hover,\n.s4ca1f6_reloadButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s66e9a9_restartButton:focus-visible,\n.s4ca1f6_reloadButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The §4 reload offer: a notice plus its button, one item of\n * `.s4fbfe0_installedActions` the way the restart gate is — a column of its own\n * rather than inline with the row. */\n.s42eadb_reloadPanel {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n}\n\n\n.sc1afc6_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.sbbe486_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s119e47_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sadd68a_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n white-space: pre-line;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s7ac0e2_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.scee95e_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s7bfdc8_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.s4bc9ba_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s8692d7_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.s537eee_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.scdb145_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sdaa6f0_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s1c1027_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* The Updatable section. The class keeps the Host's field name; only the\n heading the reader sees was renamed. */\n.sc8d6dc_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.se27588_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s46601e_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.s54c287_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s54c287_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.sa02632_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 .scd0548_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.s59c2df_outdatedActions {\n display: flex;\n align-items: center;\n /* The reload offer (§4) mounts inside the switch beside the Update button\n * and is a two-line block, not a control: without wrapping, a row reading\n * [switch][notice + Reload][Update] overflows the settings dialog. */\n flex-wrap: wrap;\n gap: 10px;\n}\n\n/* The shop's one switch. It is worn by two controls that mean different\n * things — the enable/disable toggle on an installed card, and the shelf's\n * incompatible filter — so the geometry lives here once and each caller states\n * only its hue.\n *\n * `--switch-hue` is that knob, and it is read from the ANCESTOR rather than\n * declared per state: `.sab8b1c_incompatibleFilter` sets it once and it reaches the\n * track and the label together, which is what keeps a red switch from sitting\n * under a neutral word. A declaration on `.sc4c0fe_switch` itself would shadow the\n * inherited value (an element's own rule beats what it inherits), so the\n * default rides in the `var()` fallback and is resolved once into\n * `--track-hue` instead of being spelled out at each use.\n *\n * `box-sizing` and `padding` are stated because the two callers are different\n * elements — a `<button>`, which the UA gives padding, and a `<span>`, which\n * it does not. Without them the same class renders two sizes, and the knob\n * sits 2px above centre in the taller one. */\n.sc4c0fe_switch {\n --track-hue: var(--switch-hue, var(--dsw-alias-state-success-primary));\n box-sizing: border-box;\n display: inline-block;\n position: relative;\n width: 32px;\n height: 18px;\n padding: 0;\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/* The knob's POSITION is the state, which is the reason this control needs no\n * `forced-colors` fallback the way the category pills do: a system palette\n * replaces every colour below and moves nothing. */\n.s383bcc_switchOn {\n border-color: var(--track-hue);\n background: color-mix(in srgb, var(--track-hue) 55%, transparent);\n}\n\n.s43a686_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.s383bcc_switchOn .s43a686_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.sc4c0fe_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 .sc4c0fe_switch, .s43a686_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.sd9a4e2_switchWrap {\n display: inline-flex;\n align-items: center;\n /* Same reason as `.s59c2df_outdatedActions`: `.s42eadb_reloadPanel`'s own comment calls\n * itself \"a column of its own rather than inline with the row\", which held\n * for `.s4fbfe0_installedActions` and not here until this line. */\n flex-wrap: wrap;\n gap: 8px;\n}\n";
|
|
7789
|
-
if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"
|
|
7787
|
+
//#region \0dsh-plugin-shop-css:58798e8a
|
|
7788
|
+
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.sf53492_client.s9448d6_config.se8518e_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.sf53492_client.s5506db_spec.se8518e_ts` pins this. */\n\n.s606016_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel.\n *\n * Clipped on BOTH axes, with a margin, because `.sdebeb0_searchInput` sits at\n * exactly (0, 0) of this box — it is the first child of `.s308509_toolbar`, itself\n * the first child here, and this rule carries no padding — so its focus\n * ring paints ENTIRELY outside the panel.\n *\n * Both axes is the load-bearing part: `overflow-clip-margin` is inert\n * unless the element clips on both. Clipping x alone left the margin doing\n * nothing — measured against the live app on 0.7.1, the ring reached 0 of\n * its 3px on the left at every device pixel ratio (1, 1.25, 1.5, 2), while\n * keeping the full 3px on the right, where the 280px input stops short of\n * the panel and never meets the clip edge. Raising the margin to 6px\n * changed nothing; clipping both axes with the SAME 3px restored the whole\n * ring. A test that reads declarations cannot see that difference, which is\n * why the first attempt at this shipped broken.\n *\n * `clip` is not a scroll container, so this does not bring back the\n * accidental scrolling `hidden` caused by coercing the other axis to\n * `auto`. Nothing is lost vertically: the panel's scrollHeight equals its\n * height and no descendant paints outside the clip rect (measured).\n * `overflow-x: hidden` stays as the fallback for engines without `clip`,\n * where the ring is clipped as it was before, never worse. */\n overflow-x: hidden;\n overflow: clip;\n overflow-clip-margin: 3px;\n}\n\n.sf8aa3f_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.s445a84_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.saff1f5_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.sf506c5_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.sf506c5_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.sd2356c_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.s79ae29_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.s5fbc74_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.sbac887_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.sf506c5_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 .sf506c5_skeletonCard span { animation: none; opacity: 0.75; }\n .sf506c5_skeletonCard::after { content: none; }\n}\n\n.s6248e9_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.s6248e9_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.s6248e9_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s308509_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.s706abc_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.sf7f7be_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.saaaff3_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.sd80651_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.sd80651_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.sd80651_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.sa20b3d_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.sa20b3d_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.sa20b3d_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.sa20b3d_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.sd10b8d_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.sd10b8d_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.sd10b8d_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.s789529_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.sdebeb0_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.sdebeb0_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s1965b1_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.s170980_categoryBar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s498a11_categoryButton {\n /* The hue this button carries when selected. `All` and `Installed` select by\n * something other than a category and keep the brand token; the six category\n * buttons override it from the shared hue table below, so a pressed Tool tab\n * turns the same blue as a tool card's spine. */\n --category-hue: var(--dsw-alias-brand-primary);\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/* Blend text with the theme foreground: darker on light backgrounds, lighter\n * on dark ones. The unblended category hue belongs on the border and fill. */\n.s498a11_categoryButton:hover {\n border-color: color-mix(in srgb, var(--category-hue) 45%, var(--dsw-alias-border-l2));\n color: color-mix(in srgb, var(--category-hue) 45%, var(--dsw-alias-label-primary) 55%);\n}\n\n/* Selected. Written `.s498a11_categoryButton.s89c60c_categoryButtonOn` — TWO classes — so it\n * matches `.s498a11_categoryButton:hover`'s specificity and, coming after it, wins.\n * As a bare `.s89c60c_categoryButtonOn` it lost both `border-color` and `color` to the\n * hover rule for as long as the pointer stayed on the tab that had just been\n * clicked, which is precisely when a reader looks for confirmation.\n *\n * EVERY declaration here is a colour or a shadow: a pressed tab must occupy\n * exactly the same box as an unpressed one, so the bar does not reflow — and\n * with ~9 pills on a wrapping row, one that grows can push the rest onto\n * another line and move the tab out from under the pointer that just clicked\n * it. That is what `font-weight: 600` did (bold metrics are wider than\n * regular), and it is why nothing may be added here that resolves to a length:\n * no padding, no border-width, no font-size, no letter-spacing.\n * `css-tokens.sf53492_client.s5506db_spec.se8518e_ts` fails the build on one.\n *\n * `box-shadow` is the exception that earns its place: it paints outside the\n * layout box, so an inset ring doubles the border's weight at zero cost to the\n * metrics. It is what `font-weight: 600` used to be — a second, thickness-\n * based signal that hover does not also produce — and the `other` tab needs it\n * most: its hue IS the neutral gray this file uses for \"no category\", so on\n * the light theme hue alone barely separates pressed from unpressed. */\n.s498a11_categoryButton.s89c60c_categoryButtonOn {\n border-color: var(--category-hue);\n background: color-mix(in srgb, var(--category-hue) 14%, transparent);\n color: color-mix(in srgb, var(--category-hue) 45%, var(--dsw-alias-label-primary) 55%);\n box-shadow: inset 0 0 0 1px var(--category-hue);\n}\n\n/* Forced colours replace every colour above with the system palette, which\n * would leave the three colour declarations saying nothing and the pressed tab\n * indistinguishable from its neighbours. `box-shadow` is dropped in this mode\n * too, so the ring has to come back as an outline. */\n@media (forced-colors: active) {\n .s498a11_categoryButton.s89c60c_categoryButtonOn {\n outline: 2px solid ButtonText;\n outline-offset: -4px;\n }\n}\n\n.s498a11_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The incompatible filter, at the right edge of the category bar: `margin-left:\n * auto` pushes it past the pills, and the bar wraps, so on a narrow panel it\n * drops to its own line rather than squeezing them. It is a MODIFIER, not a\n * ninth category — the categories select what to show and this one subtracts\n * from whatever they selected — so it takes the error hue it filters on rather\n * than joining the hue table.\n *\n * And it is a SWITCH, which is the difference the shape now carries. It used\n * to wear `.s498a11_categoryButton`: same pill, same row, same size as the eight tabs,\n * differing only in being red. That reads as a ninth tab, and it is not one —\n * the tabs are choose-one and this is on-or-off. So it drops the pill chrome\n * entirely (no border, no fill, nothing to compete with the row it sits\n * beside) and puts the state in a track, the same one every installed card\n * carries. Nothing here restates the switch geometry; `--switch-hue` is the\n * whole of what this control says about it, and it reaches the label too, so\n * one declaration keeps the word and the track the same colour. */\n.s461978_incompatibleFilter {\n --switch-hue: var(--dsw-alias-state-error-primary);\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n /* Matches the pills' vertical padding so the bar keeps one line box whether\n * this control wraps onto a row of its own or shares theirs. */\n padding: 3px 0;\n border: 0;\n background: none;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n/* Hover lifts the word to full contrast and warms the track's border. Scoped\n * to the OFF track: `.s461978_incompatibleFilter:hover .s8f2d24_switch` outranks `.sf5c955_switchOn`\n * by two classes, so unscoped it would strip the hue from the border at\n * exactly the moment a reader has the pointer on it to check the state. */\n.s461978_incompatibleFilter:hover {\n color: var(--dsw-alias-label-primary);\n}\n\n.s461978_incompatibleFilter:hover .s8f2d24_switch:not(.sf5c955_switchOn) {\n border-color: color-mix(in srgb, var(--switch-hue) 45%, var(--dsw-alias-border-l2));\n}\n\n/* On. Written with both classes for the reason `.s498a11_categoryButton.s89c60c_categoryButtonOn`\n * is: it has to match `:hover`'s specificity and come after it, or the colour\n * reverts under a pointer that has not moved since the click. */\n.s461978_incompatibleFilter.s43ebb1_incompatibleFilterOn {\n color: color-mix(in srgb, var(--switch-hue) 45%, var(--dsw-alias-label-primary) 55%);\n}\n\n/* Off here means \"nothing is being taken away\" — the resting state — so the\n * knob steps back to the secondary label. The enable switch keeps the full\n * strength dot, where off means \"this plugin is disabled\" and is worth\n * noticing. In this bar it would be the heaviest mark in a row of hairline\n * pills, and on the light theme it is the WHOLE control: bg-layer-2 is the\n * same white as the panel there, so an off track is a hairline outline with a\n * near-black dot sitting in it. */\n.s461978_incompatibleFilter .s8f2d24_switch:not(.sf5c955_switchOn) .sba3163_switchKnob {\n background: var(--dsw-alias-label-secondary);\n}\n\n/* The ring has no border to trace, so it takes an offset and the pill radius\n * of the tabs it sits beside rather than hugging the text. */\n.s461978_incompatibleFilter:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 2px;\n border-radius: 999px;\n}\n\n.s27d400_updatableHeading {\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.sf7ebed_catalogStatsRow {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 6px 0 0;\n}\n\n.s43730a_catalogStats {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* Sits beside the 12px stats caption, so it is quieter than `.s6248e9_actionButton`:\n * this is an affordance, not a call to action — the catalog reloads on its\n * own at mount and the shelf is already usable without it. Named\n * `catalogRefresh*` (not `reload*`) so it cannot collide with the §4 page\n * reload offer below, which reloads the whole tab rather than refetching\n * the catalog data. */\n.s1d4e19_catalogRefreshButton {\n padding: 1px 9px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: transparent;\n color: var(--dsw-alias-label-secondary);\n font-size: 11px;\n line-height: 17px;\n cursor: pointer;\n}\n\n.s1d4e19_catalogRefreshButton:hover:not(:disabled) {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s1d4e19_catalogRefreshButton:disabled {\n cursor: default;\n opacity: 0.6;\n}\n\n.s1d4e19_catalogRefreshButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sb2cffb_catalogRefreshFailed {\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s88613c_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.s4cb40b_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 .s4cb40b_cards { animation: none; }\n}\n\n.sf0df6a_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.s509fc6_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s21d1c6_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sf0df6a_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 .sf0df6a_card { transition: none; }\n .sf0df6a_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.s9b6447_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--category-hue, #8B8E96);\n}\n\n/* The hue table, keyed by `data-category` and read by BOTH surfaces that\n * speak in category colour: a card's spine and badge, and the category bar's\n * own tab. One table, so a tab can never disagree with the cards it filters to\n * — which is the whole point of colouring the tab. `.s498a11_categoryButton` sets the\n * brand fallback for `All`/`Installed`; these attribute selectors are one\n * specificity step above it and win wherever the attribute is present. */\n.sf0df6a_card[data-category='tool'], .s498a11_categoryButton[data-category='tool'] { --category-hue: #4C8DFF; }\n.sf0df6a_card[data-category='provider'], .s498a11_categoryButton[data-category='provider'] { --category-hue: #A78BFA; }\n.sf0df6a_card[data-category='ui'], .s498a11_categoryButton[data-category='ui'] { --category-hue: #2DD4BF; }\n.sf0df6a_card[data-category='workflow'], .s498a11_categoryButton[data-category='workflow'] { --category-hue: #F59E0B; }\n.sf0df6a_card[data-category='integration'], .s498a11_categoryButton[data-category='integration'] { --category-hue: #34D399; }\n.sf0df6a_card[data-category='theme'], .s498a11_categoryButton[data-category='theme'] { --category-hue: #F472B6; }\n.sf0df6a_card[data-category='other'], .s498a11_categoryButton[data-category='other'] { --category-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.s3d32c7_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--category-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(--category-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.sed0c53_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.sed0c53_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.s233aa2_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.s407380_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.s75d683_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.s75d683_cardActions > .s628956_gate,\n.s75d683_cardActions > .s158ebe_installPanel,\n.s75d683_cardActions > .sff7a43_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.s5e4251_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.se5a0a2_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s19f5d6_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.s19f5d6_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.s19f5d6_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.s19f5d6_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.s8d11d0_incompatibleBadge {\n flex-shrink: 0;\n padding: 3px 9px;\n border-radius: 999px;\n font-size: 12px;\n white-space: nowrap;\n color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 40%, transparent);\n}\n\n.s583e15_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sc8024b_chevron, .s13c0de_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s13c0de_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .sc8024b_chevron, .s13c0de_chevronOpen { transition: none; }\n}\n\n.s25d65c_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.s2679e5_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.s3f29fa_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.se19379_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s7c8ac8_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n/* `white-space: pre-line` so the newline in the copy is the copy's own: the\n dictionary decides where the line breaks, and a translator changes it\n without touching the component. Collapses runs of spaces like `normal`, so\n only the explicit \\n survives. */\n.s759c19_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n white-space: pre-line;\n color: var(--dsw-alias-state-error-primary);\n}\n\n/* The way out of dsh's own refusal: the lead-in, then the exemption command\n * on its own line. */\n.s51362c_remedy {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s3755f7_remedyLead {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n}\n\n/* The exemption command, bound for a terminal unchanged: one click selects\n * all of it, and it wraps anywhere rather than widening the card. A border,\n * not a fill, marks the box: the bg layers are one white in the light theme. */\n.s1a33b7_allowCommand {\n display: block;\n padding: 6px 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n white-space: pre-wrap;\n word-break: break-all;\n user-select: all;\n color: var(--dsw-alias-label-primary);\n}\n\n/* A refused install on a surface that does not state its blockers — the\n * outdated row — writes them out on their own full-width line under the\n * disabled button, the command that clears dsh's refusal included. */\n.s23346a_refusal {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex-basis: 100%;\n}\n\n.s15b82b_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s20c5f7_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s587cdd_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s587cdd_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.sa970d5_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.s2b23c3_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.s24534d_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.s24534d_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.s24534d_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.s24534d_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.s24534d_detailRow a:hover {\n text-decoration: underline;\n}\n\n.s24534d_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* What the entry IS rather than what you can do with it — how big it is and\n * who published it — at the right edge of the action row. `margin-left: auto`\n * is what pushes it there, and it lives on this wrapper rather than on either\n * label so the group stays flush right when only one of the two has a value —\n * a packument that named no account has no author, and an entry the registry\n * could not measure honestly has no size. Rarer than it was (every live entry\n * now carries a size, github included), but the wrapper is not what makes it\n * rare: without one, an EMPTY meta group still costs 8px, because\n * `.s75d683_cardActions` is a flex row with `gap: 8px` and a zero-width item is still\n * an item. The row is a wrapping flex, so an active install flow (which claims\n * the full width) drops the whole group to the next line rather than squeezing\n * it. */\n.s244d8b_cardMeta {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n min-width: 0;\n}\n\n/* The on-disk size, left of the author. Mono and tabular so the digits of one\n * figure line up with the digits of another WHEREVER the two land: `.s244d8b_cardMeta`\n * is flush right and the author sits outside the size, so a size's x position\n * moves with the author's width and is different again on the many entries\n * that carry no author at all. There is no column to align to, which is why\n * the reason given here is per-figure legibility rather than the column the\n * first version of this comment claimed. Secondary colour, because it\n * qualifies the entry rather than announcing it.\n *\n * `font-variant-numeric` is safe HERE and would not be on a pill: this element\n * has no state rules, so nothing it does can reflow a wrapping row. */\n.s753f0d_size {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-variant-numeric: tabular-nums;\n font-size: 12px;\n letter-spacing: 0.02em;\n white-space: nowrap;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The publishing account, at the outer end of `.s244d8b_cardMeta` on the action row —\n * NOT beside the npm link in the expanded detail, which is where it used to\n * live and what this comment described until the accurate half was deleted\n * with the `margin-left: auto` that moved to `.s244d8b_cardMeta`. There is no middot:\n * `.s244d8b_cardMeta`'s 8px gap separates it from the size.\n *\n * Secondary label colour carries the distinction — never a background fill,\n * which is invisible in the light theme where every bg-layer token is the\n * same white. */\n.sd50776_author {\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.s5ae7ae_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.s158ebe_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.se4286a_installButton, .s5bf7c7_confirmButton, .s13641e_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.se4286a_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.se4286a_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s5bf7c7_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.s5bf7c7_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s13641e_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.s13641e_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.se4286a_installButton:focus-visible, .s5bf7c7_confirmButton:focus-visible, .s13641e_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.s82b33f_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.sff7a43_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.se0c7da_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.se0c7da_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.se0c7da_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.s1fc455_restartSelfButton {\n /* The version row's third state. Geometry matches .sa20b3d_checkUpdateButton and\n * .sd80651_updateSelfButton exactly — the row is one evolving control and a\n * different pill would read as a different kind of thing. It takes the\n * emphasised fill rather than the neutral one because at that moment the\n * restart is the only thing left to do, the same reason Update has it. */\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.s1fc455_restartSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The two activation offers share one recipe: a border in an alias token,\n * never a `bg-layer` fill alone — all four bg-layer tokens collapse to the\n * same white under `body` in the light theme, and a fill-only button would\n * vanish there. Grouped rather than copied, because a copy is a rule that\n * can be corrected on one button and left wrong on the other, silently. */\n.sb62dca_restartButton,\n.sdd9811_reloadButton {\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.sb62dca_restartButton:hover,\n.sdd9811_reloadButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.sb62dca_restartButton:focus-visible,\n.sdd9811_reloadButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The §4 reload offer: a notice plus its button, one item of\n * `.sff7a43_installedActions` the way the restart gate is — a column of its own\n * rather than inline with the row. */\n.s10c127_reloadPanel {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n}\n\n\n.s628956_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.sf3567b_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.sf22ea7_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.s75023b_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n white-space: pre-line;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s6ae9f6_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.sb3806b_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s8923e8_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.sc09af4_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sdb4d54_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.s67b8c9_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.sf1da6c_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.s5b19fe_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s759942_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* The Updatable section. The class keeps the Host's field name; only the\n heading the reader sees was renamed. */\n.sca7cd0_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.s6079f6_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.sd2e99f_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.s5ee082_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s5ee082_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.sb71e84_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 .s407380_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.sd5ce04_outdatedActions {\n display: flex;\n align-items: center;\n /* The reload offer (§4) mounts inside the switch beside the Update button\n * and is a two-line block, not a control: without wrapping, a row reading\n * [switch][notice + Reload][Update] overflows the settings dialog. */\n flex-wrap: wrap;\n gap: 10px;\n}\n\n/* The shop's one switch. It is worn by two controls that mean different\n * things — the enable/disable toggle on an installed card, and the shelf's\n * incompatible filter — so the geometry lives here once and each caller states\n * only its hue.\n *\n * `--switch-hue` is that knob, and it is read from the ANCESTOR rather than\n * declared per state: `.s461978_incompatibleFilter` sets it once and it reaches the\n * track and the label together, which is what keeps a red switch from sitting\n * under a neutral word. A declaration on `.s8f2d24_switch` itself would shadow the\n * inherited value (an element's own rule beats what it inherits), so the\n * default rides in the `var()` fallback and is resolved once into\n * `--track-hue` instead of being spelled out at each use.\n *\n * `box-sizing` and `padding` are stated because the two callers are different\n * elements — a `<button>`, which the UA gives padding, and a `<span>`, which\n * it does not. Without them the same class renders two sizes, and the knob\n * sits 2px above centre in the taller one. */\n.s8f2d24_switch {\n --track-hue: var(--switch-hue, var(--dsw-alias-state-success-primary));\n box-sizing: border-box;\n display: inline-block;\n position: relative;\n width: 32px;\n height: 18px;\n padding: 0;\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/* The knob's POSITION is the state, which is the reason this control needs no\n * `forced-colors` fallback the way the category pills do: a system palette\n * replaces every colour below and moves nothing. */\n.sf5c955_switchOn {\n border-color: var(--track-hue);\n background: color-mix(in srgb, var(--track-hue) 55%, transparent);\n}\n\n.sba3163_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.sf5c955_switchOn .sba3163_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.s8f2d24_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 .s8f2d24_switch, .sba3163_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.s538638_switchWrap {\n display: inline-flex;\n align-items: center;\n /* Same reason as `.sd5ce04_outdatedActions`: `.s10c127_reloadPanel`'s own comment calls\n * itself \"a column of its own rather than inline with the row\", which held\n * for `.sff7a43_installedActions` and not here until this line. */\n flex-wrap: wrap;\n gap: 8px;\n}\n";
|
|
7789
|
+
if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"58798e8a\"]")) {
|
|
7790
7790
|
const tag = document.createElement("style");
|
|
7791
|
-
tag.dataset.pluginCss = "
|
|
7791
|
+
tag.dataset.pluginCss = "58798e8a";
|
|
7792
7792
|
tag.textContent = css;
|
|
7793
7793
|
document.head.appendChild(tag);
|
|
7794
7794
|
}
|
|
7795
|
-
var
|
|
7796
|
-
"client": "
|
|
7797
|
-
"config": "
|
|
7798
|
-
"ts": "
|
|
7799
|
-
"spec": "
|
|
7800
|
-
"panel": "
|
|
7801
|
-
"searchInput": "
|
|
7802
|
-
"toolbar": "
|
|
7803
|
-
"stateLine": "
|
|
7804
|
-
"srOnly": "
|
|
7805
|
-
"skeletonGrid": "
|
|
7806
|
-
"skeletonCard": "
|
|
7807
|
-
"skeletonName": "
|
|
7808
|
-
"skeletonSummary": "
|
|
7809
|
-
"skeletonSummaryShort": "
|
|
7810
|
-
"skeletonActions": "
|
|
7811
|
-
"actionButton": "
|
|
7812
|
-
"toolbarRight": "
|
|
7813
|
-
"versionBlock": "
|
|
7814
|
-
"versionText": "
|
|
7815
|
-
"updateSelfButton": "
|
|
7816
|
-
"checkUpdateButton": "
|
|
7817
|
-
"githubLink": "
|
|
7818
|
-
"selfUpdatePanel": "
|
|
7819
|
-
"staleBadge": "
|
|
7820
|
-
"categoryBar": "
|
|
7821
|
-
"categoryButton": "
|
|
7822
|
-
"categoryButtonOn": "
|
|
7823
|
-
"incompatibleFilter": "
|
|
7824
|
-
"switch": "
|
|
7825
|
-
"switchOn": "
|
|
7826
|
-
"incompatibleFilterOn": "
|
|
7827
|
-
"switchKnob": "
|
|
7828
|
-
"updatableHeading": "
|
|
7829
|
-
"catalogStatsRow": "
|
|
7830
|
-
"catalogStats": "
|
|
7831
|
-
"catalogRefreshButton": "
|
|
7832
|
-
"catalogRefreshFailed": "
|
|
7833
|
-
"emptyLine": "
|
|
7834
|
-
"cards": "
|
|
7835
|
-
"card": "
|
|
7836
|
-
"cardsSentry": "
|
|
7837
|
-
"showingLine": "
|
|
7838
|
-
"cardSpine": "
|
|
7839
|
-
"categoryBadge": "
|
|
7840
|
-
"entryHeader": "
|
|
7841
|
-
"name": "
|
|
7842
|
-
"badges": "
|
|
7843
|
-
"cardActions": "
|
|
7844
|
-
"gate": "
|
|
7845
|
-
"installPanel": "
|
|
7846
|
-
"installedActions": "
|
|
7847
|
-
"cardVersion": "
|
|
7848
|
-
"sourceBadge": "
|
|
7849
|
-
"tierBadge": "
|
|
7850
|
-
"incompatibleBadge": "
|
|
7851
|
-
"starsBadge": "
|
|
7852
|
-
"chevron": "
|
|
7853
|
-
"chevronOpen": "
|
|
7854
|
-
"body": "
|
|
7855
|
-
"summary": "
|
|
7856
|
-
"summaryZh": "
|
|
7857
|
-
"summaryExpanded": "
|
|
7858
|
-
"summaryZhExpanded": "
|
|
7859
|
-
"incompatibleDetail": "
|
|
7860
|
-
"remedy": "
|
|
7861
|
-
"remedyLead": "
|
|
7862
|
-
"allowCommand": "
|
|
7863
|
-
"refusal": "
|
|
7864
|
-
"capabilitiesBlock": "
|
|
7865
|
-
"capabilitiesNote": "
|
|
7866
|
-
"capabilities": "
|
|
7867
|
-
"detail": "
|
|
7868
|
-
"detailRows": "
|
|
7869
|
-
"detailRow": "
|
|
7870
|
-
"cardMeta": "
|
|
7871
|
-
"size": "
|
|
7872
|
-
"author": "
|
|
7873
|
-
"reviewedLine": "
|
|
7874
|
-
"installButton": "
|
|
7875
|
-
"confirmButton": "
|
|
7876
|
-
"cancelButton": "
|
|
7877
|
-
"installedLabel": "
|
|
7878
|
-
"uninstallButton": "
|
|
7879
|
-
"restartSelfButton": "
|
|
7880
|
-
"restartButton": "
|
|
7881
|
-
"reloadButton": "
|
|
7882
|
-
"reloadPanel": "
|
|
7883
|
-
"gateTitle": "
|
|
7884
|
-
"gateBody": "
|
|
7885
|
-
"gateWarning": "
|
|
7886
|
-
"gateActions": "
|
|
7887
|
-
"installing": "
|
|
7888
|
-
"log": "
|
|
7889
|
-
"logLine": "
|
|
7890
|
-
"notice": "
|
|
7891
|
-
"failedHeading": "
|
|
7892
|
-
"failedDetail": "
|
|
7893
|
-
"rejectedCode": "
|
|
7894
|
-
"rejectedDetail": "
|
|
7895
|
-
"outdatedSection": "
|
|
7896
|
-
"outdatedList": "
|
|
7897
|
-
"outdatedRow": "
|
|
7898
|
-
"outdatedInfo": "
|
|
7899
|
-
"outdatedVersions": "
|
|
7900
|
-
"outdatedActions": "
|
|
7901
|
-
"switchWrap": "
|
|
7795
|
+
var _dsh_plugin_shop_css_58798e8a_default = {
|
|
7796
|
+
"client": "sf53492_client",
|
|
7797
|
+
"config": "s9448d6_config",
|
|
7798
|
+
"ts": "se8518e_ts",
|
|
7799
|
+
"spec": "s5506db_spec",
|
|
7800
|
+
"panel": "s606016_panel",
|
|
7801
|
+
"searchInput": "sdebeb0_searchInput",
|
|
7802
|
+
"toolbar": "s308509_toolbar",
|
|
7803
|
+
"stateLine": "sf8aa3f_stateLine",
|
|
7804
|
+
"srOnly": "s445a84_srOnly",
|
|
7805
|
+
"skeletonGrid": "saff1f5_skeletonGrid",
|
|
7806
|
+
"skeletonCard": "sf506c5_skeletonCard",
|
|
7807
|
+
"skeletonName": "sd2356c_skeletonName",
|
|
7808
|
+
"skeletonSummary": "s79ae29_skeletonSummary",
|
|
7809
|
+
"skeletonSummaryShort": "s5fbc74_skeletonSummaryShort",
|
|
7810
|
+
"skeletonActions": "sbac887_skeletonActions",
|
|
7811
|
+
"actionButton": "s6248e9_actionButton",
|
|
7812
|
+
"toolbarRight": "s706abc_toolbarRight",
|
|
7813
|
+
"versionBlock": "sf7f7be_versionBlock",
|
|
7814
|
+
"versionText": "saaaff3_versionText",
|
|
7815
|
+
"updateSelfButton": "sd80651_updateSelfButton",
|
|
7816
|
+
"checkUpdateButton": "sa20b3d_checkUpdateButton",
|
|
7817
|
+
"githubLink": "sd10b8d_githubLink",
|
|
7818
|
+
"selfUpdatePanel": "s789529_selfUpdatePanel",
|
|
7819
|
+
"staleBadge": "s1965b1_staleBadge",
|
|
7820
|
+
"categoryBar": "s170980_categoryBar",
|
|
7821
|
+
"categoryButton": "s498a11_categoryButton",
|
|
7822
|
+
"categoryButtonOn": "s89c60c_categoryButtonOn",
|
|
7823
|
+
"incompatibleFilter": "s461978_incompatibleFilter",
|
|
7824
|
+
"switch": "s8f2d24_switch",
|
|
7825
|
+
"switchOn": "sf5c955_switchOn",
|
|
7826
|
+
"incompatibleFilterOn": "s43ebb1_incompatibleFilterOn",
|
|
7827
|
+
"switchKnob": "sba3163_switchKnob",
|
|
7828
|
+
"updatableHeading": "s27d400_updatableHeading",
|
|
7829
|
+
"catalogStatsRow": "sf7ebed_catalogStatsRow",
|
|
7830
|
+
"catalogStats": "s43730a_catalogStats",
|
|
7831
|
+
"catalogRefreshButton": "s1d4e19_catalogRefreshButton",
|
|
7832
|
+
"catalogRefreshFailed": "sb2cffb_catalogRefreshFailed",
|
|
7833
|
+
"emptyLine": "s88613c_emptyLine",
|
|
7834
|
+
"cards": "s4cb40b_cards",
|
|
7835
|
+
"card": "sf0df6a_card",
|
|
7836
|
+
"cardsSentry": "s509fc6_cardsSentry",
|
|
7837
|
+
"showingLine": "s21d1c6_showingLine",
|
|
7838
|
+
"cardSpine": "s9b6447_cardSpine",
|
|
7839
|
+
"categoryBadge": "s3d32c7_categoryBadge",
|
|
7840
|
+
"entryHeader": "sed0c53_entryHeader",
|
|
7841
|
+
"name": "s233aa2_name",
|
|
7842
|
+
"badges": "s407380_badges",
|
|
7843
|
+
"cardActions": "s75d683_cardActions",
|
|
7844
|
+
"gate": "s628956_gate",
|
|
7845
|
+
"installPanel": "s158ebe_installPanel",
|
|
7846
|
+
"installedActions": "sff7a43_installedActions",
|
|
7847
|
+
"cardVersion": "s5e4251_cardVersion",
|
|
7848
|
+
"sourceBadge": "se5a0a2_sourceBadge",
|
|
7849
|
+
"tierBadge": "s19f5d6_tierBadge",
|
|
7850
|
+
"incompatibleBadge": "s8d11d0_incompatibleBadge",
|
|
7851
|
+
"starsBadge": "s583e15_starsBadge",
|
|
7852
|
+
"chevron": "sc8024b_chevron",
|
|
7853
|
+
"chevronOpen": "s13c0de_chevronOpen",
|
|
7854
|
+
"body": "s25d65c_body",
|
|
7855
|
+
"summary": "s2679e5_summary",
|
|
7856
|
+
"summaryZh": "s3f29fa_summaryZh",
|
|
7857
|
+
"summaryExpanded": "se19379_summaryExpanded",
|
|
7858
|
+
"summaryZhExpanded": "s7c8ac8_summaryZhExpanded",
|
|
7859
|
+
"incompatibleDetail": "s759c19_incompatibleDetail",
|
|
7860
|
+
"remedy": "s51362c_remedy",
|
|
7861
|
+
"remedyLead": "s3755f7_remedyLead",
|
|
7862
|
+
"allowCommand": "s1a33b7_allowCommand",
|
|
7863
|
+
"refusal": "s23346a_refusal",
|
|
7864
|
+
"capabilitiesBlock": "s15b82b_capabilitiesBlock",
|
|
7865
|
+
"capabilitiesNote": "s20c5f7_capabilitiesNote",
|
|
7866
|
+
"capabilities": "s587cdd_capabilities",
|
|
7867
|
+
"detail": "sa970d5_detail",
|
|
7868
|
+
"detailRows": "s2b23c3_detailRows",
|
|
7869
|
+
"detailRow": "s24534d_detailRow",
|
|
7870
|
+
"cardMeta": "s244d8b_cardMeta",
|
|
7871
|
+
"size": "s753f0d_size",
|
|
7872
|
+
"author": "sd50776_author",
|
|
7873
|
+
"reviewedLine": "s5ae7ae_reviewedLine",
|
|
7874
|
+
"installButton": "se4286a_installButton",
|
|
7875
|
+
"confirmButton": "s5bf7c7_confirmButton",
|
|
7876
|
+
"cancelButton": "s13641e_cancelButton",
|
|
7877
|
+
"installedLabel": "s82b33f_installedLabel",
|
|
7878
|
+
"uninstallButton": "se0c7da_uninstallButton",
|
|
7879
|
+
"restartSelfButton": "s1fc455_restartSelfButton",
|
|
7880
|
+
"restartButton": "sb62dca_restartButton",
|
|
7881
|
+
"reloadButton": "sdd9811_reloadButton",
|
|
7882
|
+
"reloadPanel": "s10c127_reloadPanel",
|
|
7883
|
+
"gateTitle": "sf3567b_gateTitle",
|
|
7884
|
+
"gateBody": "sf22ea7_gateBody",
|
|
7885
|
+
"gateWarning": "s75023b_gateWarning",
|
|
7886
|
+
"gateActions": "s6ae9f6_gateActions",
|
|
7887
|
+
"installing": "sb3806b_installing",
|
|
7888
|
+
"log": "s8923e8_log",
|
|
7889
|
+
"logLine": "sc09af4_logLine",
|
|
7890
|
+
"notice": "sdb4d54_notice",
|
|
7891
|
+
"failedHeading": "s67b8c9_failedHeading",
|
|
7892
|
+
"failedDetail": "sf1da6c_failedDetail",
|
|
7893
|
+
"rejectedCode": "s5b19fe_rejectedCode",
|
|
7894
|
+
"rejectedDetail": "s759942_rejectedDetail",
|
|
7895
|
+
"outdatedSection": "sca7cd0_outdatedSection",
|
|
7896
|
+
"outdatedList": "s6079f6_outdatedList",
|
|
7897
|
+
"outdatedRow": "sd2e99f_outdatedRow",
|
|
7898
|
+
"outdatedInfo": "s5ee082_outdatedInfo",
|
|
7899
|
+
"outdatedVersions": "sb71e84_outdatedVersions",
|
|
7900
|
+
"outdatedActions": "sd5ce04_outdatedActions",
|
|
7901
|
+
"switchWrap": "s538638_switchWrap"
|
|
7902
7902
|
};
|
|
7903
7903
|
//#endregion
|
|
7904
7904
|
//#region src/client/ShopTab.tsx
|
|
@@ -7915,14 +7915,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7915
7915
|
* those nodes, and React's next commit throws on the ones it no longer finds
|
|
7916
7916
|
* (design 2026-09-26-market-borrowings §4). The tab renders no portals, so its
|
|
7917
7917
|
* root is its whole surface. */
|
|
7918
|
-
const PANEL_ROOT = `${
|
|
7918
|
+
const PANEL_ROOT = `${_dsh_plugin_shop_css_58798e8a_default.panel} notranslate`;
|
|
7919
7919
|
function ChevronIcon({ open }) {
|
|
7920
7920
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
|
|
7921
7921
|
viewBox: "0 0 16 16",
|
|
7922
7922
|
width: "14",
|
|
7923
7923
|
height: "14",
|
|
7924
7924
|
"aria-hidden": "true",
|
|
7925
|
-
className: open ?
|
|
7925
|
+
className: open ? _dsh_plugin_shop_css_58798e8a_default.chevronOpen : _dsh_plugin_shop_css_58798e8a_default.chevron,
|
|
7926
7926
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
7927
7927
|
fill: "currentColor",
|
|
7928
7928
|
d: "M3.5 6 8 10.5 12.5 6l1 1L8 12.5 2.5 7l1-1Z"
|
|
@@ -7952,32 +7952,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7952
7952
|
subdir: entry.subdir
|
|
7953
7953
|
};
|
|
7954
7954
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
7955
|
-
className:
|
|
7955
|
+
className: _dsh_plugin_shop_css_58798e8a_default.card,
|
|
7956
7956
|
"data-shop-entry": entry.name,
|
|
7957
7957
|
"data-category": category,
|
|
7958
7958
|
children: [
|
|
7959
7959
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
7960
|
-
className:
|
|
7960
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cardSpine,
|
|
7961
7961
|
"aria-hidden": "true"
|
|
7962
7962
|
}),
|
|
7963
7963
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
7964
7964
|
type: "button",
|
|
7965
|
-
className:
|
|
7965
|
+
className: _dsh_plugin_shop_css_58798e8a_default.entryHeader,
|
|
7966
7966
|
"aria-expanded": open,
|
|
7967
7967
|
"aria-controls": detailId,
|
|
7968
7968
|
onClick: () => setOpen((current) => !current),
|
|
7969
7969
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
7970
|
-
className:
|
|
7970
|
+
className: _dsh_plugin_shop_css_58798e8a_default.name,
|
|
7971
7971
|
children: entry.name
|
|
7972
7972
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
7973
|
-
className:
|
|
7973
|
+
className: _dsh_plugin_shop_css_58798e8a_default.badges,
|
|
7974
7974
|
children: [
|
|
7975
7975
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
7976
|
-
className:
|
|
7976
|
+
className: _dsh_plugin_shop_css_58798e8a_default.categoryBadge,
|
|
7977
7977
|
children: t(categoryKey(entry))
|
|
7978
7978
|
}),
|
|
7979
7979
|
entry.source === "npm" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
7980
|
-
className:
|
|
7980
|
+
className: _dsh_plugin_shop_css_58798e8a_default.sourceBadge,
|
|
7981
7981
|
"data-shop-source-npm": true,
|
|
7982
7982
|
role: "img",
|
|
7983
7983
|
"aria-label": t("npmSource"),
|
|
@@ -7994,7 +7994,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
7994
7994
|
})
|
|
7995
7995
|
}),
|
|
7996
7996
|
hasGithubHome(entry) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
7997
|
-
className:
|
|
7997
|
+
className: _dsh_plugin_shop_css_58798e8a_default.sourceBadge,
|
|
7998
7998
|
"data-shop-source-github": true,
|
|
7999
7999
|
role: "img",
|
|
8000
8000
|
"aria-label": t("githubSource"),
|
|
@@ -8008,17 +8008,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8008
8008
|
})
|
|
8009
8009
|
}),
|
|
8010
8010
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
8011
|
-
className:
|
|
8011
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cardVersion,
|
|
8012
8012
|
"data-card-version": true,
|
|
8013
8013
|
children: ["v", displayVersion(entry)]
|
|
8014
8014
|
}),
|
|
8015
8015
|
entry.tier !== "community" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8016
|
-
className:
|
|
8016
|
+
className: _dsh_plugin_shop_css_58798e8a_default.tierBadge,
|
|
8017
8017
|
"data-tier": entry.tier,
|
|
8018
8018
|
children: t(tierKey(entry.tier))
|
|
8019
8019
|
}),
|
|
8020
8020
|
stars !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
8021
|
-
className:
|
|
8021
|
+
className: _dsh_plugin_shop_css_58798e8a_default.starsBadge,
|
|
8022
8022
|
role: "img",
|
|
8023
8023
|
"aria-label": t("stars", { count: stars }),
|
|
8024
8024
|
children: ["★ ", formatStars(stars)]
|
|
@@ -8028,39 +8028,39 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8028
8028
|
})]
|
|
8029
8029
|
}),
|
|
8030
8030
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8031
|
-
className:
|
|
8031
|
+
className: _dsh_plugin_shop_css_58798e8a_default.body,
|
|
8032
8032
|
children: [
|
|
8033
8033
|
summary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8034
|
-
className: open ? `${
|
|
8034
|
+
className: open ? `${_dsh_plugin_shop_css_58798e8a_default.summary} ${_dsh_plugin_shop_css_58798e8a_default.summaryExpanded}` : _dsh_plugin_shop_css_58798e8a_default.summary,
|
|
8035
8035
|
children: summary.en
|
|
8036
8036
|
}),
|
|
8037
8037
|
summary?.zh !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8038
|
-
className: open ? `${
|
|
8038
|
+
className: open ? `${_dsh_plugin_shop_css_58798e8a_default.summaryZh} ${_dsh_plugin_shop_css_58798e8a_default.summaryZhExpanded}` : _dsh_plugin_shop_css_58798e8a_default.summaryZh,
|
|
8039
8039
|
children: summary.zh
|
|
8040
8040
|
}),
|
|
8041
8041
|
blockers.map((blocker) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BlockerLine, {
|
|
8042
8042
|
blocker,
|
|
8043
|
-
className:
|
|
8043
|
+
className: _dsh_plugin_shop_css_58798e8a_default.incompatibleDetail,
|
|
8044
8044
|
surface: "detail"
|
|
8045
8045
|
}, blocker.kind)),
|
|
8046
8046
|
open && entry.catalog !== void 0 && entry.catalog.capabilities.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8047
|
-
className:
|
|
8047
|
+
className: _dsh_plugin_shop_css_58798e8a_default.capabilitiesBlock,
|
|
8048
8048
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8049
|
-
className:
|
|
8049
|
+
className: _dsh_plugin_shop_css_58798e8a_default.capabilitiesNote,
|
|
8050
8050
|
children: t("capabilitiesNote")
|
|
8051
8051
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
8052
|
-
className:
|
|
8052
|
+
className: _dsh_plugin_shop_css_58798e8a_default.capabilities,
|
|
8053
8053
|
children: entry.catalog.capabilities.map((capability) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: capability }, capability))
|
|
8054
8054
|
})]
|
|
8055
8055
|
}),
|
|
8056
8056
|
open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
8057
8057
|
id: detailId,
|
|
8058
|
-
className:
|
|
8058
|
+
className: _dsh_plugin_shop_css_58798e8a_default.detail,
|
|
8059
8059
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
|
|
8060
|
-
className:
|
|
8060
|
+
className: _dsh_plugin_shop_css_58798e8a_default.detailRows,
|
|
8061
8061
|
children: [
|
|
8062
8062
|
npmUrl !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8063
|
-
className:
|
|
8063
|
+
className: _dsh_plugin_shop_css_58798e8a_default.detailRow,
|
|
8064
8064
|
"data-shop-npm": true,
|
|
8065
8065
|
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", {
|
|
8066
8066
|
href: npmUrl,
|
|
@@ -8070,7 +8070,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8070
8070
|
}) })]
|
|
8071
8071
|
}),
|
|
8072
8072
|
entry.repository !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8073
|
-
className:
|
|
8073
|
+
className: _dsh_plugin_shop_css_58798e8a_default.detailRow,
|
|
8074
8074
|
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", {
|
|
8075
8075
|
href: entry.repository,
|
|
8076
8076
|
target: "_blank",
|
|
@@ -8079,12 +8079,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8079
8079
|
}) : entry.repository })]
|
|
8080
8080
|
}),
|
|
8081
8081
|
entry.license !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8082
|
-
className:
|
|
8082
|
+
className: _dsh_plugin_shop_css_58798e8a_default.detailRow,
|
|
8083
8083
|
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 })]
|
|
8084
8084
|
})
|
|
8085
8085
|
]
|
|
8086
8086
|
}), entry.tier === "verified-stale" && entry.review !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8087
|
-
className:
|
|
8087
|
+
className: _dsh_plugin_shop_css_58798e8a_default.reviewedLine,
|
|
8088
8088
|
children: entry.review.reviewedVersion !== void 0 ? t("reviewedVersionLine", {
|
|
8089
8089
|
reviewed: entry.review.reviewedVersion,
|
|
8090
8090
|
current: entry.version
|
|
@@ -8097,7 +8097,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8097
8097
|
]
|
|
8098
8098
|
}),
|
|
8099
8099
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8100
|
-
className:
|
|
8100
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cardActions,
|
|
8101
8101
|
"data-shop-actions": true,
|
|
8102
8102
|
children: [installed === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!inInstalledView && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InstallPanel, {
|
|
8103
8103
|
target: installTarget,
|
|
@@ -8129,7 +8129,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8129
8129
|
restartBlocked,
|
|
8130
8130
|
reload
|
|
8131
8131
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8132
|
-
className:
|
|
8132
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installedLabel,
|
|
8133
8133
|
"data-shop-installed": true,
|
|
8134
8134
|
children: t("installed")
|
|
8135
8135
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BlockerBadge, {
|
|
@@ -8153,16 +8153,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8153
8153
|
flow: uninstallFlow
|
|
8154
8154
|
})
|
|
8155
8155
|
] }), (size !== void 0 || author !== null) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
8156
|
-
className:
|
|
8156
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cardMeta,
|
|
8157
8157
|
children: [size !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8158
|
-
className:
|
|
8158
|
+
className: _dsh_plugin_shop_css_58798e8a_default.size,
|
|
8159
8159
|
"data-shop-size": true,
|
|
8160
8160
|
role: "img",
|
|
8161
8161
|
"aria-label": t("sizeLabel", { size }),
|
|
8162
8162
|
title: t("sizeLabel", { size }),
|
|
8163
8163
|
children: size
|
|
8164
8164
|
}), author !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8165
|
-
className:
|
|
8165
|
+
className: _dsh_plugin_shop_css_58798e8a_default.author,
|
|
8166
8166
|
"data-shop-author": true,
|
|
8167
8167
|
children: t("authorLine", { author })
|
|
8168
8168
|
})]
|
|
@@ -8211,13 +8211,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8211
8211
|
...attribute,
|
|
8212
8212
|
children: blocker.text
|
|
8213
8213
|
}), blocker.remedy !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8214
|
-
className:
|
|
8214
|
+
className: _dsh_plugin_shop_css_58798e8a_default.remedy,
|
|
8215
8215
|
"data-shop-remedy": blocker.kind,
|
|
8216
8216
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8217
|
-
className:
|
|
8217
|
+
className: _dsh_plugin_shop_css_58798e8a_default.remedyLead,
|
|
8218
8218
|
children: blocker.remedy.lead
|
|
8219
8219
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
|
|
8220
|
-
className:
|
|
8220
|
+
className: _dsh_plugin_shop_css_58798e8a_default.allowCommand,
|
|
8221
8221
|
"data-shop-allow-command": true,
|
|
8222
8222
|
children: blocker.remedy.command
|
|
8223
8223
|
})]
|
|
@@ -8255,7 +8255,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8255
8255
|
if (lead === void 0 || word === null) return null;
|
|
8256
8256
|
const detail = blockers.map((blocker) => blocker.text).join("\n");
|
|
8257
8257
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8258
|
-
className:
|
|
8258
|
+
className: _dsh_plugin_shop_css_58798e8a_default.incompatibleBadge,
|
|
8259
8259
|
"data-shop-blocker": lead.kind,
|
|
8260
8260
|
role: "img",
|
|
8261
8261
|
"aria-label": detail,
|
|
@@ -8272,37 +8272,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8272
8272
|
const [gateOpen, setGateOpen] = (0, react.useState)(false);
|
|
8273
8273
|
const { view, start } = flow;
|
|
8274
8274
|
if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8275
|
-
className:
|
|
8275
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installPanel,
|
|
8276
8276
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8277
|
-
className:
|
|
8277
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installing,
|
|
8278
8278
|
children: t(installPhaseKey(view.phase))
|
|
8279
8279
|
}), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8280
|
-
className:
|
|
8280
|
+
className: _dsh_plugin_shop_css_58798e8a_default.log,
|
|
8281
8281
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8282
|
-
className:
|
|
8282
|
+
className: _dsh_plugin_shop_css_58798e8a_default.logLine,
|
|
8283
8283
|
"data-shop-log-line": true,
|
|
8284
8284
|
children: line
|
|
8285
8285
|
}, index))
|
|
8286
8286
|
})]
|
|
8287
8287
|
});
|
|
8288
8288
|
if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8289
|
-
className:
|
|
8289
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installedActions,
|
|
8290
8290
|
children: [
|
|
8291
8291
|
view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8292
|
-
className:
|
|
8292
|
+
className: _dsh_plugin_shop_css_58798e8a_default.log,
|
|
8293
8293
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8294
|
-
className:
|
|
8294
|
+
className: _dsh_plugin_shop_css_58798e8a_default.logLine,
|
|
8295
8295
|
"data-shop-log-line": true,
|
|
8296
8296
|
children: line
|
|
8297
8297
|
}, index))
|
|
8298
8298
|
}),
|
|
8299
8299
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8300
|
-
className:
|
|
8300
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
8301
8301
|
"data-shop-restart-notice": true,
|
|
8302
8302
|
children: t(activationNoticeKey(view.activation, view.restartReason))
|
|
8303
8303
|
}),
|
|
8304
8304
|
view.detail !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8305
|
-
className:
|
|
8305
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
8306
8306
|
"data-shop-done-note": true,
|
|
8307
8307
|
children: view.detail
|
|
8308
8308
|
}),
|
|
@@ -8317,57 +8317,57 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8317
8317
|
]
|
|
8318
8318
|
});
|
|
8319
8319
|
if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8320
|
-
className:
|
|
8320
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installPanel,
|
|
8321
8321
|
children: [
|
|
8322
8322
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8323
|
-
className:
|
|
8323
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedHeading,
|
|
8324
8324
|
children: t("installFailed")
|
|
8325
8325
|
}),
|
|
8326
8326
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8327
|
-
className:
|
|
8327
|
+
className: _dsh_plugin_shop_css_58798e8a_default.log,
|
|
8328
8328
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8329
|
-
className:
|
|
8329
|
+
className: _dsh_plugin_shop_css_58798e8a_default.logLine,
|
|
8330
8330
|
"data-shop-log-line": true,
|
|
8331
8331
|
children: line
|
|
8332
8332
|
}, index))
|
|
8333
8333
|
}),
|
|
8334
8334
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8335
|
-
className:
|
|
8335
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedDetail,
|
|
8336
8336
|
children: view.detail === "" ? t("installTransportFailed") : view.detail
|
|
8337
8337
|
})
|
|
8338
8338
|
]
|
|
8339
8339
|
});
|
|
8340
8340
|
if (view.kind === "rejected") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8341
|
-
className:
|
|
8341
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installPanel,
|
|
8342
8342
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8343
|
-
className:
|
|
8343
|
+
className: _dsh_plugin_shop_css_58798e8a_default.rejectedCode,
|
|
8344
8344
|
children: t(rejectionCodeKey(view.code))
|
|
8345
8345
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8346
|
-
className:
|
|
8346
|
+
className: _dsh_plugin_shop_css_58798e8a_default.rejectedDetail,
|
|
8347
8347
|
children: view.detail
|
|
8348
8348
|
})]
|
|
8349
8349
|
});
|
|
8350
8350
|
if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8351
|
-
className:
|
|
8351
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gate,
|
|
8352
8352
|
children: [
|
|
8353
8353
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8354
|
-
className:
|
|
8354
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gateTitle,
|
|
8355
8355
|
children: t("acknowledgementTitle")
|
|
8356
8356
|
}),
|
|
8357
8357
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8358
|
-
className:
|
|
8358
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gateBody,
|
|
8359
8359
|
children: t("acknowledgementBody")
|
|
8360
8360
|
}),
|
|
8361
8361
|
!blockersStated && blockers.map((blocker) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BlockerLine, {
|
|
8362
8362
|
blocker,
|
|
8363
|
-
className:
|
|
8363
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gateWarning,
|
|
8364
8364
|
surface: "warning"
|
|
8365
8365
|
}, blocker.kind)),
|
|
8366
8366
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8367
|
-
className:
|
|
8367
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gateActions,
|
|
8368
8368
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8369
8369
|
type: "button",
|
|
8370
|
-
className:
|
|
8370
|
+
className: _dsh_plugin_shop_css_58798e8a_default.confirmButton,
|
|
8371
8371
|
"data-shop-confirm": true,
|
|
8372
8372
|
onClick: () => {
|
|
8373
8373
|
setGateOpen(false);
|
|
@@ -8379,7 +8379,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8379
8379
|
children: t("confirm")
|
|
8380
8380
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8381
8381
|
type: "button",
|
|
8382
|
-
className:
|
|
8382
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cancelButton,
|
|
8383
8383
|
onClick: () => setGateOpen(false),
|
|
8384
8384
|
children: t("cancel")
|
|
8385
8385
|
})]
|
|
@@ -8391,7 +8391,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8391
8391
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
8392
8392
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8393
8393
|
type: "button",
|
|
8394
|
-
className:
|
|
8394
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installButton,
|
|
8395
8395
|
disabled: refused,
|
|
8396
8396
|
...refused ? { "data-shop-refused": true } : {},
|
|
8397
8397
|
...update ? { "data-shop-update": true } : { "data-shop-install": true },
|
|
@@ -8409,11 +8409,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8409
8409
|
t
|
|
8410
8410
|
}),
|
|
8411
8411
|
refused && !blockersStated && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8412
|
-
className:
|
|
8412
|
+
className: _dsh_plugin_shop_css_58798e8a_default.refusal,
|
|
8413
8413
|
"data-shop-refusal": true,
|
|
8414
8414
|
children: blockers.map((blocker) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BlockerLine, {
|
|
8415
8415
|
blocker,
|
|
8416
|
-
className:
|
|
8416
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gateWarning,
|
|
8417
8417
|
surface: "warning"
|
|
8418
8418
|
}, blocker.kind))
|
|
8419
8419
|
})
|
|
@@ -8428,32 +8428,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8428
8428
|
function UninstallPanel({ name, t, restart, restartBlocked, reload, flow }) {
|
|
8429
8429
|
const { view, start, reset } = flow;
|
|
8430
8430
|
if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8431
|
-
className:
|
|
8431
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installPanel,
|
|
8432
8432
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8433
|
-
className:
|
|
8433
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installing,
|
|
8434
8434
|
children: t("uninstalling")
|
|
8435
8435
|
}), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8436
|
-
className:
|
|
8436
|
+
className: _dsh_plugin_shop_css_58798e8a_default.log,
|
|
8437
8437
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8438
|
-
className:
|
|
8438
|
+
className: _dsh_plugin_shop_css_58798e8a_default.logLine,
|
|
8439
8439
|
"data-shop-log-line": true,
|
|
8440
8440
|
children: line
|
|
8441
8441
|
}, index))
|
|
8442
8442
|
})]
|
|
8443
8443
|
});
|
|
8444
8444
|
if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8445
|
-
className:
|
|
8445
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installedActions,
|
|
8446
8446
|
children: [
|
|
8447
8447
|
view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8448
|
-
className:
|
|
8448
|
+
className: _dsh_plugin_shop_css_58798e8a_default.log,
|
|
8449
8449
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8450
|
-
className:
|
|
8450
|
+
className: _dsh_plugin_shop_css_58798e8a_default.logLine,
|
|
8451
8451
|
"data-shop-log-line": true,
|
|
8452
8452
|
children: line
|
|
8453
8453
|
}, index))
|
|
8454
8454
|
}),
|
|
8455
8455
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8456
|
-
className:
|
|
8456
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
8457
8457
|
"data-shop-uninstall-done": true,
|
|
8458
8458
|
children: t(uninstallActivationNoticeKey(view.activation))
|
|
8459
8459
|
}),
|
|
@@ -8467,7 +8467,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8467
8467
|
}),
|
|
8468
8468
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8469
8469
|
type: "button",
|
|
8470
|
-
className:
|
|
8470
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cancelButton,
|
|
8471
8471
|
"data-shop-uninstall-dismiss": true,
|
|
8472
8472
|
onClick: reset,
|
|
8473
8473
|
children: t("dismiss")
|
|
@@ -8475,27 +8475,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8475
8475
|
]
|
|
8476
8476
|
});
|
|
8477
8477
|
if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8478
|
-
className:
|
|
8478
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installPanel,
|
|
8479
8479
|
children: [
|
|
8480
8480
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8481
|
-
className:
|
|
8481
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedHeading,
|
|
8482
8482
|
children: t("uninstallFailed")
|
|
8483
8483
|
}),
|
|
8484
8484
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8485
|
-
className:
|
|
8485
|
+
className: _dsh_plugin_shop_css_58798e8a_default.log,
|
|
8486
8486
|
children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
8487
|
-
className:
|
|
8487
|
+
className: _dsh_plugin_shop_css_58798e8a_default.logLine,
|
|
8488
8488
|
"data-shop-log-line": true,
|
|
8489
8489
|
children: line
|
|
8490
8490
|
}, index))
|
|
8491
8491
|
}),
|
|
8492
8492
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8493
|
-
className:
|
|
8493
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedDetail,
|
|
8494
8494
|
children: view.detail === "" ? t("uninstallTransportFailed") : view.detail
|
|
8495
8495
|
}),
|
|
8496
8496
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8497
8497
|
type: "button",
|
|
8498
|
-
className:
|
|
8498
|
+
className: _dsh_plugin_shop_css_58798e8a_default.uninstallButton,
|
|
8499
8499
|
"data-shop-uninstall-retry": true,
|
|
8500
8500
|
onClick: () => void start({ name }),
|
|
8501
8501
|
children: t("retry")
|
|
@@ -8505,7 +8505,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8505
8505
|
if (view.kind !== "idle") return null;
|
|
8506
8506
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8507
8507
|
type: "button",
|
|
8508
|
-
className:
|
|
8508
|
+
className: _dsh_plugin_shop_css_58798e8a_default.uninstallButton,
|
|
8509
8509
|
"data-shop-uninstall": true,
|
|
8510
8510
|
onClick: () => void start({ name }),
|
|
8511
8511
|
children: t("uninstall")
|
|
@@ -8546,37 +8546,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8546
8546
|
else if (outcome.kind === "unreachable") setRefusal(t("restartTransportFailed"));
|
|
8547
8547
|
};
|
|
8548
8548
|
if (monitor?.kind === "requesting" || monitor?.kind === "restarting") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8549
|
-
className:
|
|
8549
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
8550
8550
|
"data-shop-restarting": true,
|
|
8551
8551
|
children: t("restarting")
|
|
8552
8552
|
});
|
|
8553
8553
|
if (monitor?.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8554
|
-
className:
|
|
8554
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedDetail,
|
|
8555
8555
|
"data-shop-restart-error": true,
|
|
8556
8556
|
children: monitor.logFile === void 0 ? t("restartFailedNotice") : t("restartFailedLogNotice", { log: monitor.logFile })
|
|
8557
8557
|
});
|
|
8558
8558
|
if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8559
|
-
className:
|
|
8559
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gate,
|
|
8560
8560
|
children: [
|
|
8561
8561
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8562
|
-
className:
|
|
8562
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gateTitle,
|
|
8563
8563
|
children: t("restartTitle")
|
|
8564
8564
|
}),
|
|
8565
8565
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8566
|
-
className:
|
|
8566
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gateBody,
|
|
8567
8567
|
children: t("restartBody")
|
|
8568
8568
|
}),
|
|
8569
8569
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8570
|
-
className:
|
|
8570
|
+
className: _dsh_plugin_shop_css_58798e8a_default.gateActions,
|
|
8571
8571
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8572
8572
|
type: "button",
|
|
8573
|
-
className:
|
|
8573
|
+
className: _dsh_plugin_shop_css_58798e8a_default.confirmButton,
|
|
8574
8574
|
"data-shop-restart-confirm": true,
|
|
8575
8575
|
onClick: () => void onConfirm(),
|
|
8576
8576
|
children: t("restartConfirm")
|
|
8577
8577
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8578
8578
|
type: "button",
|
|
8579
|
-
className:
|
|
8579
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cancelButton,
|
|
8580
8580
|
onClick: () => setGateOpen(false),
|
|
8581
8581
|
children: t("cancel")
|
|
8582
8582
|
})]
|
|
@@ -8584,14 +8584,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8584
8584
|
]
|
|
8585
8585
|
});
|
|
8586
8586
|
const refused = refusal === null ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8587
|
-
className:
|
|
8587
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedDetail,
|
|
8588
8588
|
"data-shop-restart-error": true,
|
|
8589
8589
|
children: refusal
|
|
8590
8590
|
});
|
|
8591
8591
|
if (gate !== void 0) return refused;
|
|
8592
8592
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [refused, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8593
8593
|
type: "button",
|
|
8594
|
-
className:
|
|
8594
|
+
className: _dsh_plugin_shop_css_58798e8a_default.restartButton,
|
|
8595
8595
|
"data-shop-restart": true,
|
|
8596
8596
|
onClick: () => setGateOpen(true),
|
|
8597
8597
|
children: t("restart")
|
|
@@ -8622,7 +8622,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8622
8622
|
restart,
|
|
8623
8623
|
reload
|
|
8624
8624
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8625
|
-
className:
|
|
8625
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
8626
8626
|
"data-shop-restart-disabled": true,
|
|
8627
8627
|
children: t(restartBlockedNoticeKey(restartBlocked))
|
|
8628
8628
|
});
|
|
@@ -8633,14 +8633,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8633
8633
|
* would help without knowing that now is a good time. */
|
|
8634
8634
|
function ReloadPanel({ t, reload, where }) {
|
|
8635
8635
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8636
|
-
className:
|
|
8636
|
+
className: _dsh_plugin_shop_css_58798e8a_default.reloadPanel,
|
|
8637
8637
|
"data-shop-reload": where,
|
|
8638
8638
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8639
|
-
className:
|
|
8639
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
8640
8640
|
children: t("reloadNote")
|
|
8641
8641
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8642
8642
|
type: "button",
|
|
8643
|
-
className:
|
|
8643
|
+
className: _dsh_plugin_shop_css_58798e8a_default.reloadButton,
|
|
8644
8644
|
onClick: reload,
|
|
8645
8645
|
children: t("reload")
|
|
8646
8646
|
})]
|
|
@@ -8683,7 +8683,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8683
8683
|
}
|
|
8684
8684
|
};
|
|
8685
8685
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8686
|
-
className:
|
|
8686
|
+
className: _dsh_plugin_shop_css_58798e8a_default.switchWrap,
|
|
8687
8687
|
"data-shop-enabled-switch": row.name,
|
|
8688
8688
|
children: [
|
|
8689
8689
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
@@ -8692,18 +8692,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8692
8692
|
"aria-checked": enabled,
|
|
8693
8693
|
"aria-label": t("enabledSwitch"),
|
|
8694
8694
|
"data-shop-toggle": true,
|
|
8695
|
-
className: `${
|
|
8695
|
+
className: `${_dsh_plugin_shop_css_58798e8a_default.switch} ${enabled ? _dsh_plugin_shop_css_58798e8a_default.switchOn : ""}`,
|
|
8696
8696
|
onClick: () => void onToggle(),
|
|
8697
8697
|
disabled: toggle.kind === "saving",
|
|
8698
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
8698
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_58798e8a_default.switchKnob })
|
|
8699
8699
|
}),
|
|
8700
8700
|
toggle.kind === "saved" && owed === "nothing" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8701
|
-
className:
|
|
8701
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
8702
8702
|
"data-shop-hot-apply": true,
|
|
8703
8703
|
children: t("hotApplyNote")
|
|
8704
8704
|
}),
|
|
8705
8705
|
owed === "restart" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8706
|
-
className:
|
|
8706
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
8707
8707
|
"data-shop-toggle-restart": true,
|
|
8708
8708
|
children: t("toggleRestartNote")
|
|
8709
8709
|
}),
|
|
@@ -8716,7 +8716,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8716
8716
|
where: "toggle"
|
|
8717
8717
|
}),
|
|
8718
8718
|
toggle.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8719
|
-
className:
|
|
8719
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedDetail,
|
|
8720
8720
|
"data-shop-toggle-error": true,
|
|
8721
8721
|
children: toggle.detail
|
|
8722
8722
|
})
|
|
@@ -8728,19 +8728,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8728
8728
|
* install flow for `name@latest`, reusing `InstallPanel`). */
|
|
8729
8729
|
function OutdatedRow({ row, tier, missing, harness, t, setEnabled, flowFor, restart, restartBlocked, reload }) {
|
|
8730
8730
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8731
|
-
className:
|
|
8731
|
+
className: _dsh_plugin_shop_css_58798e8a_default.outdatedRow,
|
|
8732
8732
|
"data-shop-outdated-entry": row.name,
|
|
8733
8733
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8734
|
-
className:
|
|
8734
|
+
className: _dsh_plugin_shop_css_58798e8a_default.outdatedInfo,
|
|
8735
8735
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
8736
|
-
className:
|
|
8736
|
+
className: _dsh_plugin_shop_css_58798e8a_default.name,
|
|
8737
8737
|
children: row.name
|
|
8738
8738
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
8739
|
-
className:
|
|
8739
|
+
className: _dsh_plugin_shop_css_58798e8a_default.outdatedVersions,
|
|
8740
8740
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("installedVersion", { version: row.source === "github" ? row.installed.slice(0, 7) : row.installed }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("latestVersion", { version: row.latest }) })]
|
|
8741
8741
|
})]
|
|
8742
8742
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
8743
|
-
className:
|
|
8743
|
+
className: _dsh_plugin_shop_css_58798e8a_default.outdatedActions,
|
|
8744
8744
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnabledSwitch, {
|
|
8745
8745
|
row,
|
|
8746
8746
|
t,
|
|
@@ -8788,22 +8788,22 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8788
8788
|
function OutdatedSection({ state, entriesByKey, missingByKey, harnessVerdicts, t, setEnabled, flowFor, restart, restartBlocked, reload }) {
|
|
8789
8789
|
if (state.kind === "loading") return null;
|
|
8790
8790
|
if (state.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8791
|
-
className:
|
|
8791
|
+
className: _dsh_plugin_shop_css_58798e8a_default.stateLine,
|
|
8792
8792
|
"data-shop-outdated-error": true,
|
|
8793
8793
|
children: t("installedError")
|
|
8794
8794
|
});
|
|
8795
8795
|
const outdated = state.entries.filter((entry) => entry.outdated);
|
|
8796
8796
|
if (outdated.length === 0) return null;
|
|
8797
8797
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
8798
|
-
className:
|
|
8798
|
+
className: _dsh_plugin_shop_css_58798e8a_default.outdatedSection,
|
|
8799
8799
|
"data-shop-outdated": true,
|
|
8800
8800
|
"aria-labelledby": UPDATABLE_HEADING_ID,
|
|
8801
8801
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
|
|
8802
|
-
className:
|
|
8802
|
+
className: _dsh_plugin_shop_css_58798e8a_default.updatableHeading,
|
|
8803
8803
|
id: UPDATABLE_HEADING_ID,
|
|
8804
8804
|
children: t("updatableSection")
|
|
8805
8805
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
|
|
8806
|
-
className:
|
|
8806
|
+
className: _dsh_plugin_shop_css_58798e8a_default.outdatedList,
|
|
8807
8807
|
children: outdated.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OutdatedRow, {
|
|
8808
8808
|
row,
|
|
8809
8809
|
tier: entriesByKey.get(identityKey(row))?.tier ?? "community",
|
|
@@ -8854,16 +8854,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
8854
8854
|
role: "alert",
|
|
8855
8855
|
children: [
|
|
8856
8856
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8857
|
-
className:
|
|
8857
|
+
className: _dsh_plugin_shop_css_58798e8a_default.stateLine,
|
|
8858
8858
|
children: say("tabCrashed", en.tabCrashed)
|
|
8859
8859
|
}),
|
|
8860
8860
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
8861
|
-
className:
|
|
8861
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedDetail,
|
|
8862
8862
|
children: error.message
|
|
8863
8863
|
}),
|
|
8864
8864
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
8865
8865
|
type: "button",
|
|
8866
|
-
className:
|
|
8866
|
+
className: _dsh_plugin_shop_css_58798e8a_default.actionButton,
|
|
8867
8867
|
onClick: () => this.setState({ error: null }),
|
|
8868
8868
|
children: say("retry", en.retry)
|
|
8869
8869
|
})
|
|
@@ -9120,19 +9120,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9120
9120
|
"data-shop-tab": true,
|
|
9121
9121
|
"aria-busy": "true",
|
|
9122
9122
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9123
|
-
className:
|
|
9123
|
+
className: _dsh_plugin_shop_css_58798e8a_default.srOnly,
|
|
9124
9124
|
children: t("loading")
|
|
9125
9125
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9126
|
-
className:
|
|
9126
|
+
className: _dsh_plugin_shop_css_58798e8a_default.skeletonGrid,
|
|
9127
9127
|
"data-shop-skeleton": true,
|
|
9128
9128
|
"aria-hidden": "true",
|
|
9129
9129
|
children: Array.from({ length: 8 }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9130
|
-
className:
|
|
9130
|
+
className: _dsh_plugin_shop_css_58798e8a_default.skeletonCard,
|
|
9131
9131
|
children: [
|
|
9132
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
9133
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
9134
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
9135
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
9132
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_58798e8a_default.skeletonName }),
|
|
9133
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_58798e8a_default.skeletonSummary }),
|
|
9134
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_58798e8a_default.skeletonSummaryShort }),
|
|
9135
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_58798e8a_default.skeletonActions })
|
|
9136
9136
|
]
|
|
9137
9137
|
}, i))
|
|
9138
9138
|
})]
|
|
@@ -9142,11 +9142,11 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9142
9142
|
translate: "no",
|
|
9143
9143
|
"data-shop-tab": true,
|
|
9144
9144
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9145
|
-
className:
|
|
9145
|
+
className: _dsh_plugin_shop_css_58798e8a_default.stateLine,
|
|
9146
9146
|
children: t("error")
|
|
9147
9147
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
9148
9148
|
type: "button",
|
|
9149
|
-
className:
|
|
9149
|
+
className: _dsh_plugin_shop_css_58798e8a_default.actionButton,
|
|
9150
9150
|
onClick: () => {
|
|
9151
9151
|
setRequest({ kind: "retry" });
|
|
9152
9152
|
setVersionReload((current) => current + 1);
|
|
@@ -9161,10 +9161,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9161
9161
|
"data-shop-tab": true,
|
|
9162
9162
|
children: [
|
|
9163
9163
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9164
|
-
className:
|
|
9164
|
+
className: _dsh_plugin_shop_css_58798e8a_default.toolbar,
|
|
9165
9165
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
9166
9166
|
type: "search",
|
|
9167
|
-
className:
|
|
9167
|
+
className: _dsh_plugin_shop_css_58798e8a_default.searchInput,
|
|
9168
9168
|
"aria-label": t("search"),
|
|
9169
9169
|
placeholder: t("search"),
|
|
9170
9170
|
value: query,
|
|
@@ -9173,27 +9173,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9173
9173
|
setVisibleCount(48);
|
|
9174
9174
|
}
|
|
9175
9175
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9176
|
-
className:
|
|
9176
|
+
className: _dsh_plugin_shop_css_58798e8a_default.toolbarRight,
|
|
9177
9177
|
children: [
|
|
9178
9178
|
result.stale && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9179
|
-
className:
|
|
9179
|
+
className: _dsh_plugin_shop_css_58798e8a_default.staleBadge,
|
|
9180
9180
|
children: t("staleLabel", { date: result.builtAt.slice(0, 10) })
|
|
9181
9181
|
}),
|
|
9182
9182
|
selfVersion !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9183
|
-
className:
|
|
9183
|
+
className: _dsh_plugin_shop_css_58798e8a_default.versionBlock,
|
|
9184
9184
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
9185
|
-
className:
|
|
9185
|
+
className: _dsh_plugin_shop_css_58798e8a_default.versionText,
|
|
9186
9186
|
"data-shop-version": true,
|
|
9187
9187
|
children: ["v", selfVersion.installed]
|
|
9188
9188
|
}), restartMonitor !== null ? null : selfPending && restartBlocked === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
9189
9189
|
type: "button",
|
|
9190
|
-
className:
|
|
9190
|
+
className: _dsh_plugin_shop_css_58798e8a_default.restartSelfButton,
|
|
9191
9191
|
"data-shop-restart": true,
|
|
9192
9192
|
onClick: () => setSelfRestartGate(true),
|
|
9193
9193
|
children: t("restart")
|
|
9194
9194
|
}) : !selfPending && selfVersion.outdated && selfVersion.latest !== null && selfUpdate.view.kind === "idle" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
9195
9195
|
type: "button",
|
|
9196
|
-
className:
|
|
9196
|
+
className: _dsh_plugin_shop_css_58798e8a_default.updateSelfButton,
|
|
9197
9197
|
"data-shop-update-self": true,
|
|
9198
9198
|
onClick: () => {
|
|
9199
9199
|
if (selfVersion.latest !== null) selfUpdate.start({ version: selfVersion.latest });
|
|
@@ -9201,7 +9201,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9201
9201
|
children: t("update")
|
|
9202
9202
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
9203
9203
|
type: "button",
|
|
9204
|
-
className:
|
|
9204
|
+
className: _dsh_plugin_shop_css_58798e8a_default.checkUpdateButton,
|
|
9205
9205
|
"data-shop-check-update": true,
|
|
9206
9206
|
title: t("checkUpdateTitle"),
|
|
9207
9207
|
disabled: checkState !== "idle",
|
|
@@ -9210,7 +9210,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9210
9210
|
})]
|
|
9211
9211
|
}),
|
|
9212
9212
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
|
|
9213
|
-
className:
|
|
9213
|
+
className: _dsh_plugin_shop_css_58798e8a_default.githubLink,
|
|
9214
9214
|
href: SHOP_REPO_URL,
|
|
9215
9215
|
target: "_blank",
|
|
9216
9216
|
rel: "noopener noreferrer",
|
|
@@ -9229,28 +9229,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9229
9229
|
})]
|
|
9230
9230
|
}),
|
|
9231
9231
|
selfUpdate.view.kind === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9232
|
-
className:
|
|
9232
|
+
className: _dsh_plugin_shop_css_58798e8a_default.selfUpdatePanel,
|
|
9233
9233
|
"data-shop-self-updating": true,
|
|
9234
9234
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9235
|
-
className:
|
|
9235
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installing,
|
|
9236
9236
|
children: t(installPhaseKey(selfUpdate.view.phase))
|
|
9237
9237
|
}), selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9238
|
-
className:
|
|
9238
|
+
className: _dsh_plugin_shop_css_58798e8a_default.log,
|
|
9239
9239
|
children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9240
|
-
className:
|
|
9240
|
+
className: _dsh_plugin_shop_css_58798e8a_default.logLine,
|
|
9241
9241
|
"data-shop-log-line": true,
|
|
9242
9242
|
children: line
|
|
9243
9243
|
}, index))
|
|
9244
9244
|
})]
|
|
9245
9245
|
}),
|
|
9246
9246
|
selfPending && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9247
|
-
className:
|
|
9247
|
+
className: _dsh_plugin_shop_css_58798e8a_default.selfUpdatePanel,
|
|
9248
9248
|
"data-shop-self-update-done": true,
|
|
9249
9249
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9250
|
-
className:
|
|
9250
|
+
className: _dsh_plugin_shop_css_58798e8a_default.installedActions,
|
|
9251
9251
|
children: [
|
|
9252
9252
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9253
|
-
className:
|
|
9253
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
9254
9254
|
children: t("installedRestartNotice")
|
|
9255
9255
|
}),
|
|
9256
9256
|
restartBlocked === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartPanel, {
|
|
@@ -9263,7 +9263,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9263
9263
|
}
|
|
9264
9264
|
}),
|
|
9265
9265
|
restartBlocked !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9266
|
-
className:
|
|
9266
|
+
className: _dsh_plugin_shop_css_58798e8a_default.notice,
|
|
9267
9267
|
"data-shop-restart-disabled": true,
|
|
9268
9268
|
children: t(restartBlockedNoticeKey(restartBlocked))
|
|
9269
9269
|
})
|
|
@@ -9271,35 +9271,35 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9271
9271
|
})
|
|
9272
9272
|
}),
|
|
9273
9273
|
selfUpdate.view.kind === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9274
|
-
className:
|
|
9274
|
+
className: _dsh_plugin_shop_css_58798e8a_default.selfUpdatePanel,
|
|
9275
9275
|
"data-shop-self-update-failed": true,
|
|
9276
9276
|
children: [
|
|
9277
9277
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9278
|
-
className:
|
|
9278
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedHeading,
|
|
9279
9279
|
children: t("updateFailed")
|
|
9280
9280
|
}),
|
|
9281
9281
|
selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9282
|
-
className:
|
|
9282
|
+
className: _dsh_plugin_shop_css_58798e8a_default.log,
|
|
9283
9283
|
children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9284
|
-
className:
|
|
9284
|
+
className: _dsh_plugin_shop_css_58798e8a_default.logLine,
|
|
9285
9285
|
"data-shop-log-line": true,
|
|
9286
9286
|
children: line
|
|
9287
9287
|
}, index))
|
|
9288
9288
|
}),
|
|
9289
9289
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9290
|
-
className:
|
|
9290
|
+
className: _dsh_plugin_shop_css_58798e8a_default.failedDetail,
|
|
9291
9291
|
children: selfUpdate.view.detail === "" ? t("updateTransportFailed") : selfUpdate.view.detail
|
|
9292
9292
|
})
|
|
9293
9293
|
]
|
|
9294
9294
|
}),
|
|
9295
9295
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9296
|
-
className:
|
|
9296
|
+
className: _dsh_plugin_shop_css_58798e8a_default.categoryBar,
|
|
9297
9297
|
role: "group",
|
|
9298
9298
|
"aria-label": t("catalog"),
|
|
9299
9299
|
children: [
|
|
9300
9300
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
9301
9301
|
type: "button",
|
|
9302
|
-
className: category === null ? `${
|
|
9302
|
+
className: category === null ? `${_dsh_plugin_shop_css_58798e8a_default.categoryButton} ${_dsh_plugin_shop_css_58798e8a_default.categoryButtonOn}` : _dsh_plugin_shop_css_58798e8a_default.categoryButton,
|
|
9303
9303
|
"aria-pressed": category === null,
|
|
9304
9304
|
onClick: () => {
|
|
9305
9305
|
setCategory(null);
|
|
@@ -9314,7 +9314,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9314
9314
|
}),
|
|
9315
9315
|
CATEGORY_ORDER.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
9316
9316
|
type: "button",
|
|
9317
|
-
className: category === key ? `${
|
|
9317
|
+
className: category === key ? `${_dsh_plugin_shop_css_58798e8a_default.categoryButton} ${_dsh_plugin_shop_css_58798e8a_default.categoryButtonOn}` : _dsh_plugin_shop_css_58798e8a_default.categoryButton,
|
|
9318
9318
|
"aria-pressed": category === key,
|
|
9319
9319
|
"data-category": key,
|
|
9320
9320
|
"data-shop-category-tab": key,
|
|
@@ -9330,7 +9330,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9330
9330
|
}, key)),
|
|
9331
9331
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
9332
9332
|
type: "button",
|
|
9333
|
-
className: category === "installed" ? `${
|
|
9333
|
+
className: category === "installed" ? `${_dsh_plugin_shop_css_58798e8a_default.categoryButton} ${_dsh_plugin_shop_css_58798e8a_default.categoryButtonOn}` : _dsh_plugin_shop_css_58798e8a_default.categoryButton,
|
|
9334
9334
|
"aria-pressed": category === "installed",
|
|
9335
9335
|
"data-shop-category-installed": true,
|
|
9336
9336
|
onClick: () => {
|
|
@@ -9347,7 +9347,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9347
9347
|
type: "button",
|
|
9348
9348
|
role: "switch",
|
|
9349
9349
|
"aria-checked": hideIncompatible,
|
|
9350
|
-
className: hideIncompatible ? `${
|
|
9350
|
+
className: hideIncompatible ? `${_dsh_plugin_shop_css_58798e8a_default.incompatibleFilter} ${_dsh_plugin_shop_css_58798e8a_default.incompatibleFilterOn}` : _dsh_plugin_shop_css_58798e8a_default.incompatibleFilter,
|
|
9351
9351
|
title: t(hideIncompatible ? "showIncompatibleTitle" : "incompatibleFilterTitle"),
|
|
9352
9352
|
"data-shop-hide-incompatible": true,
|
|
9353
9353
|
onClick: () => {
|
|
@@ -9355,18 +9355,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9355
9355
|
setVisibleCount(48);
|
|
9356
9356
|
},
|
|
9357
9357
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9358
|
-
className: hideIncompatible ? `${
|
|
9358
|
+
className: hideIncompatible ? `${_dsh_plugin_shop_css_58798e8a_default.switch} ${_dsh_plugin_shop_css_58798e8a_default.switchOn}` : _dsh_plugin_shop_css_58798e8a_default.switch,
|
|
9359
9359
|
"aria-hidden": "true",
|
|
9360
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className:
|
|
9360
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_58798e8a_default.switchKnob })
|
|
9361
9361
|
}), t("hideIncompatible", { count: incompatibleCount })]
|
|
9362
9362
|
})
|
|
9363
9363
|
]
|
|
9364
9364
|
}),
|
|
9365
9365
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9366
|
-
className:
|
|
9366
|
+
className: _dsh_plugin_shop_css_58798e8a_default.catalogStatsRow,
|
|
9367
9367
|
children: [
|
|
9368
9368
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9369
|
-
className:
|
|
9369
|
+
className: _dsh_plugin_shop_css_58798e8a_default.catalogStats,
|
|
9370
9370
|
"data-shop-catalog-stats": true,
|
|
9371
9371
|
children: t("catalogStats", {
|
|
9372
9372
|
count: String(browsable.length),
|
|
@@ -9375,7 +9375,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9375
9375
|
}),
|
|
9376
9376
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
9377
9377
|
type: "button",
|
|
9378
|
-
className:
|
|
9378
|
+
className: _dsh_plugin_shop_css_58798e8a_default.catalogRefreshButton,
|
|
9379
9379
|
"data-shop-catalog-refresh": true,
|
|
9380
9380
|
disabled: reloading,
|
|
9381
9381
|
onClick: () => {
|
|
@@ -9387,21 +9387,21 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9387
9387
|
children: reloading ? t("refreshing") : t("refresh")
|
|
9388
9388
|
}),
|
|
9389
9389
|
reloadFailed && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9390
|
-
className:
|
|
9390
|
+
className: _dsh_plugin_shop_css_58798e8a_default.catalogRefreshFailed,
|
|
9391
9391
|
"data-shop-catalog-refresh-failed": true,
|
|
9392
9392
|
children: t("refreshFailed")
|
|
9393
9393
|
})
|
|
9394
9394
|
]
|
|
9395
9395
|
}),
|
|
9396
9396
|
result.plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9397
|
-
className:
|
|
9397
|
+
className: _dsh_plugin_shop_css_58798e8a_default.emptyLine,
|
|
9398
9398
|
children: t("empty")
|
|
9399
9399
|
}) : filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9400
|
-
className:
|
|
9400
|
+
className: _dsh_plugin_shop_css_58798e8a_default.emptyLine,
|
|
9401
9401
|
"data-shop-empty": true,
|
|
9402
9402
|
children: matched.length > 0 ? t("emptyIncompatibleFiltered") : t("emptySearch")
|
|
9403
9403
|
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
|
|
9404
|
-
className:
|
|
9404
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cards,
|
|
9405
9405
|
children: [visible.map((entry) => {
|
|
9406
9406
|
const key = entryKey(entry);
|
|
9407
9407
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EntryCard, {
|
|
@@ -9422,12 +9422,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
9422
9422
|
}) }, key);
|
|
9423
9423
|
}), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
|
|
9424
9424
|
ref: sentinelRef,
|
|
9425
|
-
className:
|
|
9425
|
+
className: _dsh_plugin_shop_css_58798e8a_default.cardsSentry,
|
|
9426
9426
|
"data-shop-sentry": true,
|
|
9427
9427
|
"aria-hidden": "true"
|
|
9428
9428
|
})]
|
|
9429
9429
|
}), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9430
|
-
className:
|
|
9430
|
+
className: _dsh_plugin_shop_css_58798e8a_default.showingLine,
|
|
9431
9431
|
"aria-live": "polite",
|
|
9432
9432
|
children: t("showing", {
|
|
9433
9433
|
shown: String(visibleCount),
|