dsh-plugin-shop 0.7.1-beta.0 → 0.7.1-beta.1

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/lib/client.js CHANGED
@@ -4436,7 +4436,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4436
4436
  },
4437
4437
  sourceLocation: {
4438
4438
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4439
- "line": 562,
4439
+ "line": 574,
4440
4440
  "column": 9
4441
4441
  }
4442
4442
  },
@@ -4454,7 +4454,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4454
4454
  },
4455
4455
  sourceLocation: {
4456
4456
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4457
- "line": 747,
4457
+ "line": 759,
4458
4458
  "column": 9
4459
4459
  }
4460
4460
  },
@@ -4482,7 +4482,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4482
4482
  },
4483
4483
  sourceLocation: {
4484
4484
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4485
- "line": 612,
4485
+ "line": 624,
4486
4486
  "column": 9
4487
4487
  }
4488
4488
  },
@@ -4509,7 +4509,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4509
4509
  },
4510
4510
  sourceLocation: {
4511
4511
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4512
- "line": 736,
4512
+ "line": 748,
4513
4513
  "column": 3
4514
4514
  }
4515
4515
  },
@@ -4527,7 +4527,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4527
4527
  },
4528
4528
  sourceLocation: {
4529
4529
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4530
- "line": 897,
4530
+ "line": 909,
4531
4531
  "column": 9
4532
4532
  }
4533
4533
  },
@@ -4554,7 +4554,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4554
4554
  },
4555
4555
  sourceLocation: {
4556
4556
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4557
- "line": 460,
4557
+ "line": 466,
4558
4558
  "column": 9
4559
4559
  }
4560
4560
  },
@@ -4582,7 +4582,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4582
4582
  },
4583
4583
  sourceLocation: {
4584
4584
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4585
- "line": 839,
4585
+ "line": 851,
4586
4586
  "column": 9
4587
4587
  }
4588
4588
  },
@@ -4609,7 +4609,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4609
4609
  },
4610
4610
  sourceLocation: {
4611
4611
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4612
- "line": 957,
4612
+ "line": 977,
4613
4613
  "column": 9
4614
4614
  }
4615
4615
  },
@@ -4627,7 +4627,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4627
4627
  },
4628
4628
  sourceLocation: {
4629
4629
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4630
- "line": 941,
4630
+ "line": 960,
4631
4631
  "column": 9
4632
4632
  }
4633
4633
  }
@@ -5274,108 +5274,108 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5274
5274
  };
5275
5275
  }
5276
5276
  //#endregion
5277
- //#region \0dsh-plugin-shop-css:e3675a89
5278
- const css = "/* Shop tab styles — a market shelf inside the settings surface. The visual\n * language is the dsh theme's alias tokens ONLY (the four tokens the previous\n * styles referenced that do not exist — bg-layer-3, interactive-bg-hover,\n * state-error, state-success — are corrected to bg-layer-2 and the\n * state-*-primary set). The signature is the category spine: one HUE per\n * category (seven fixed hues, not the brand token — the brand resolves to\n * near-black in the light theme, so seven brand opacities read as seven\n * shades of gray), with the category name as the cover label in the same hue. Class names are mapped to content-derived names at bundle time\n * (tsdown.s8583e3_client.s942a79_config.s5f67aa_ts) and stubbed in tests; only the keys are relied\n * on.\n *\n * One token rule the theme forces: the background LAYERS do not carry\n * contrast. In the light theme bg-base, bg-layer-1, bg-layer-2 and\n * bg-layer-3 all resolve to the same white; only the dark theme spreads them\n * (950/875/850/800). So a layer-2 fill on a layer-1 ground is invisible for\n * half of all users, and anything whose fill is its ONLY affordance — the\n * loading skeleton, the borderless capability chips — derives its fill from\n * label-primary instead, which inverts with the theme by construction.\n * Elements that also carry a border or text may keep a layer fill.\n * `css-tokens.s8583e3_client.sfd9d8a_spec.s5f67aa_ts` pins this. */\n\n.s255e5a_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel.\n *\n * `clip` rather than `hidden`, with a margin, because `.s232ec4_searchInput` sits\n * at exactly (0, 0) of this box — it is the first child of `.s646509_toolbar`,\n * itself the first child here, and this rule carries no padding — so its\n * focus ring paints ENTIRELY outside the panel. `hidden` clipped it at the\n * padding edge, and because the spec forbids one axis being `hidden` while\n * the other is `visible`, it silently promoted overflow-y to `auto` and\n * clipped the ring top and bottom as well; all that survived was a stray\n * arc on the right, where the 280px input stops short of the panel. `clip`\n * does not coerce the other axis, so overflow-y stays `visible`, and\n * `overflow-clip-margin` buys back the 3px the ring reaches sideways.\n * `hidden` stays as the first declaration, the fallback for engines\n * without `clip`; there the ring is clipped as before, never worse. */\n overflow-x: hidden;\n overflow-x: clip;\n overflow-clip-margin: 3px;\n}\n\n.s44a3ec_stateLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* Visually hidden but screen-reader readable (the loading copy while the\n * skeleton stands in visually). */\n.s3a0ece_srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n overflow: hidden;\n white-space: nowrap;\n}\n\n/* The loading shelf: ghost cards with the same geometry as the real grid, so\n * the swap to content is a same-shape handoff instead of a jump. */\n.se0c3b4_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.s520416_skeletonCard {\n position: relative;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n}\n\n/* The shimmer sweep: one gradient band travels across each ghost card while\n * the bars breathe, so the loading state reads as \"the shelf is scanning\". */\n.s520416_skeletonCard::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent) 50%,\n transparent 75%\n );\n transform: translateX(-100%);\n animation: dshShopSkeletonSweep 1.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n@keyframes dshShopSkeletonSweep {\n to { transform: translateX(100%); }\n}\n\n.s8c7d6f_skeletonName {\n width: 55%;\n height: 14px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sf5179e_skeletonSummary {\n width: 92%;\n height: 12px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sbb0d25_skeletonSummaryShort {\n width: 68%;\n height: 12px;\n margin: 6px 12px 10px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n/* The ghost of the action line, right where the real buttons land. */\n.s96e910_skeletonActions {\n display: block;\n width: 84px;\n height: 24px;\n margin: 0 12px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s520416_skeletonCard span {\n animation: dshShopSkeletonPulse 1.6s ease-in-out infinite;\n}\n\n@keyframes dshShopSkeletonPulse {\n 0%, 100% { opacity: 0.5; }\n 50% { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s520416_skeletonCard span { animation: none; opacity: 0.75; }\n .s520416_skeletonCard::after { content: none; }\n}\n\n.s73242a_actionButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s73242a_actionButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s73242a_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s646509_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.s745e3c_toolbarRight {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* The shop's own version, right of the search box: `v0.4.4`, plus the\n * update button when the version check found a newer release. */\n.s4fe61f_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sb9b924_versionText {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa04455_updateSelfButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.sa04455_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.sa04455_updateSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The on-demand re-check next to the version number: a quiet pill; the\n * border and text carry it in the light theme where bg layers are white. */\n.s614a38_checkUpdateButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s614a38_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.s614a38_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.s614a38_checkUpdateButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The project's GitHub mark, right of the version row: a quiet icon link.\n * The octocat carries itself — color shift on hover, no text, no border. */\n.sa987f7_githubLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px;\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa987f7_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.sa987f7_githubLink:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The self-update's expanded states (running log / done + restart /\n * failure detail) sit under the toolbar, above the category bar. */\n.sb81ba5_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.s232ec4_searchInput {\n width: min(280px, 100%);\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n.s232ec4_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s1555aa_staleBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s3946f1_staleBadge {\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n color: var(--dsw-alias-state-warn-primary);\n font-size: 12px;\n}\n\n.sb2c859_categoryBar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s26d58e_categoryButton {\n padding: 3px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s26d58e_categoryButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s5f68c4_categoryButtonOn {\n border-color: var(--dsw-alias-brand-primary);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-weight: 600;\n}\n\n.s26d58e_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s668774_catalogHeading {\n margin: 2px 0 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-primary);\n}\n\n.sccc4d1_catalogStats {\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s6de1ab_emptyLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* The shelf: a responsive grid of cards. */\n/* Single-line rows: one full-width column, one plugin per line. */\n.sf657f5_cards {\n display: grid;\n grid-template-columns: 1fr;\n max-width: 100%;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n animation: dshShopCardsIn 220ms ease;\n}\n\n@keyframes dshShopCardsIn {\n from { opacity: 0; transform: translateY(3px); }\n to { opacity: 1; transform: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sf657f5_cards { animation: none; }\n}\n\n.s65f383_card {\n position: relative;\n display: flex;\n flex-direction: column;\n /* A grid item's min-width is auto by default: its content would widen the\n * 1fr track past the panel and overflow horizontally. */\n min-width: 0;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n transition: border-color 120ms ease, transform 120ms ease, box-shadow 120ms ease;\n /* Off-screen cards skip layout and paint; the placeholder keeps scrollbar\n * estimation sane before the browser has measured the real height. */\n content-visibility: auto;\n contain-intrinsic-size: auto 140px;\n}\n\n/* The sentinel that triggers the next shelf batch: zero visual footprint. */\n.sd7ee01_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s705cc6_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s65f383_card:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l1));\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s65f383_card { transition: none; }\n .s65f383_card:hover { transform: none; }\n}\n\n/* The signature: a spine and cover in the category's own hue. The hues are\n * fixed mid-bright colors that read on both themes; `other` deliberately\n * stays a neutral gray so the fallback category does not compete. */\n.s4ce25d_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--spine-hue, #8B8E96);\n}\n\n.s65f383_card[data-category='tool'] { --spine-hue: #4C8DFF; }\n.s65f383_card[data-category='provider'] { --spine-hue: #A78BFA; }\n.s65f383_card[data-category='ui'] { --spine-hue: #2DD4BF; }\n.s65f383_card[data-category='workflow'] { --spine-hue: #F59E0B; }\n.s65f383_card[data-category='integration'] { --spine-hue: #34D399; }\n.s65f383_card[data-category='theme'] { --spine-hue: #F472B6; }\n.s65f383_card[data-category='other'] { --spine-hue: #8B8E96; }\n\n/* The category sits in the badge row as a quiet chip in the category's own\n * hue — the border carries it where the light theme's white layers cannot\n * (the same lesson as the check button). */\n.s9c8eaa_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--spine-hue, #8B8E96) 45%, transparent);\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--spine-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.sa97234_entryHeader {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding: 8px 12px 2px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.sa97234_entryHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n/* The name fills the row and truncates rather than wraps; the badges stay\n * intact beside it. */\n.sc3f149_name {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n flex: 1 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--dsw-alias-label-primary);\n}\n\n.s513026_badges {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* The action line: buttons side by side; an active install/uninstall flow\n * (gate, log, notices) takes the full width below them. */\n.s9b5048_cardActions {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 10px;\n}\n\n.s9b5048_cardActions > .sc4f2ac_gate,\n.s9b5048_cardActions > .s4d374c_installPanel,\n.s9b5048_cardActions > .sf53ca0_installedActions {\n flex-basis: 100%;\n}\n\n/* The entry's version, always visible on the card (the expanded detail\n * repeats it in the version row) — the same quiet mono as the toolbar. */\n.sc6ec6e_cardVersion {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The octocat marking a github-sourced entry, beside its short commit. */\n.s71f10f_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s5e82cb_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.s5e82cb_tierBadge[data-tier='verified'] {\n color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);\n}\n\n.s5e82cb_tierBadge[data-tier='verified-stale'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.s5e82cb_tierBadge[data-tier='community'] {\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n border: 1px solid var(--dsw-alias-border-l2);\n}\n\n.s4bbe02_incompatibleBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.sff43b4_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s73f7fb_chevron, .s61393c_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s61393c_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .s73f7fb_chevron, .s61393c_chevronOpen { transition: none; }\n}\n\n.s820ebf_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.sb8fbc8_summary {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.se507db_summaryZh {\n margin: -4px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Expanded cards show the full summary: the clamp is lifted, never raised —\n * a higher number would still truncate the author's text, just later. */\n.s10baf0_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.sb9dba9_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s6eca19_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s9d2029_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s3bdbd5_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s441702_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s441702_capabilities li {\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sde3f0c_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.se98179_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.sfb4d2f_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.sfb4d2f_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.sfb4d2f_detailRow dd {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n text-align: right;\n color: var(--dsw-alias-label-primary);\n}\n\n.sfb4d2f_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.sfb4d2f_detailRow a:hover {\n text-decoration: underline;\n}\n\n.sfb4d2f_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The publishing account, beside the npm link. Secondary label colour and a\n * middot separator carry the distinction — never a background fill, which is\n * invisible in the light theme where every bg-layer token is the same white. */\n/* Who published the entry, at the right edge of the action row. `margin-left:\n * auto` is what pushes it there; the row is a wrapping flex, so an active\n * install flow (which claims the full width) drops this to the next line\n * rather than squeezing it. */\n.s1ff66f_author {\n margin-left: auto;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.sd58c6d_reviewedLine {\n margin: 8px 0 0;\n padding: 6px 8px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n font-size: 12px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n/* Install flow. */\n.s4d374c_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.se7aaed_installButton, .sb43a49_confirmButton, .s6e45d1_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.se7aaed_installButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.se7aaed_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.sb43a49_confirmButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.sb43a49_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s6e45d1_cancelButton {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n\n.s6e45d1_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.se7aaed_installButton:focus-visible, .sb43a49_confirmButton:focus-visible, .s6e45d1_cancelButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The shelf card of a plugin that is installed and current carries this\n * non-interactive label instead of an install button. Border + text do the\n * work in the light theme, where every bg-layer token resolves to white. */\n.sb6fc74_installedLabel {\n align-self: flex-start;\n margin: 0;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n/* An installed card's controls: the installed label or the update button,\n * plus the uninstall button. The install panel's running/failed states are\n * column layouts and sit as one item of this row. */\n.sf53ca0_installedActions {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Uninstall revokes privilege; the quiet outline keeps it from competing\n * with the primary action, and the error tint says \"removes\". */\n.s96967f_uninstallButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 55%, transparent);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s96967f_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.s96967f_uninstallButton:focus-visible {\n outline: 2px solid var(--dsw-alias-state-error-primary);\n outline-offset: 1px;\n}\n\n/* The restart dsh button on a done install: quiet outline, same rank as\n * the other secondary actions. */\n.s6ac237_restartButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s6ac237_restartButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s6ac237_restartButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sc4f2ac_gate {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: 8px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n.s559c38_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s3c0ace_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sc323e5_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s4b2373_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.s52b5a5_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s64ab71_log {\n max-height: 160px;\n overflow: auto;\n margin: 0;\n padding: 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n list-style: none;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n\n.s1531a8_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sf20dda_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.seb9b08_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.sfd3021_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.s50ba35_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.se75489_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* Installed section. */\n.sa276cf_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.sceae6e_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s8d2072_outdatedRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.s5c2545_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s5c2545_outdatedInfo strong {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n word-break: break-all;\n color: var(--dsw-alias-label-primary);\n}\n\n.s877c68_outdatedVersions {\n /* Two inline labels with nothing between them in the markup ran together as\n * `installed v1.0.0latest v2.0.0`: JSX drops the whitespace-only line, and\n * the per-label class the markup asked for was never defined (singular\n * against this rule's plural). The container owns the gap, the same idiom\n * as .s513026_badges — the labels need no class of their own. */\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa1f556_outdatedActions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* The enable/disable switch. */\n.s11c019_switch {\n position: relative;\n width: 32px;\n height: 18px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n}\n\n.s7580e8_switchOn {\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 55%, transparent);\n}\n\n.saab2b3_switchKnob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--dsw-alias-label-primary);\n transition: transform 120ms ease, background 120ms ease;\n}\n\n.s7580e8_switchOn .saab2b3_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.s11c019_switch:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s11c019_switch, .saab2b3_switchKnob { transition: none; }\n}\n\n/* The hot enable/disable switch on installed rows: the knob button plus the\n * §8 hot-apply / failure notices rendered beside it. */\n.sd9f9e4_switchWrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n";
5279
- if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"e3675a89\"]")) {
5277
+ //#region \0dsh-plugin-shop-css:26093961
5278
+ const css = "/* Shop tab styles — a market shelf inside the settings surface. The visual\n * language is the dsh theme's alias tokens ONLY (the four tokens the previous\n * styles referenced that do not exist — bg-layer-3, interactive-bg-hover,\n * state-error, state-success — are corrected to bg-layer-2 and the\n * state-*-primary set). The signature is the category spine: one HUE per\n * category (seven fixed hues, not the brand token — the brand resolves to\n * near-black in the light theme, so seven brand opacities read as seven\n * shades of gray), with the category name as the cover label in the same hue. Class names are mapped to content-derived names at bundle time\n * (tsdown.sfae5fa_client.se9da7d_config.se722f1_ts) and stubbed in tests; only the keys are relied\n * on.\n *\n * One token rule the theme forces: the background LAYERS do not carry\n * contrast. In the light theme bg-base, bg-layer-1, bg-layer-2 and\n * bg-layer-3 all resolve to the same white; only the dark theme spreads them\n * (950/875/850/800). So a layer-2 fill on a layer-1 ground is invisible for\n * half of all users, and anything whose fill is its ONLY affordance — the\n * loading skeleton, the borderless capability chips — derives its fill from\n * label-primary instead, which inverts with the theme by construction.\n * Elements that also carry a border or text may keep a layer fill.\n * `css-tokens.sfae5fa_client.s2f7a8b_spec.se722f1_ts` pins this. */\n\n.s99b207_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel.\n *\n * `clip` rather than `hidden`, with a margin, because `.se23a0e_searchInput` sits\n * at exactly (0, 0) of this box — it is the first child of `.s27ad76_toolbar`,\n * itself the first child here, and this rule carries no padding — so its\n * focus ring paints ENTIRELY outside the panel. `hidden` clipped it at the\n * padding edge, and because the spec forbids one axis being `hidden` while\n * the other is `visible`, it silently promoted overflow-y to `auto` and\n * clipped the ring top and bottom as well; all that survived was a stray\n * arc on the right, where the 280px input stops short of the panel. `clip`\n * does not coerce the other axis, so overflow-y stays `visible`, and\n * `overflow-clip-margin` buys back the 3px the ring reaches sideways.\n * `hidden` stays as the first declaration, the fallback for engines\n * without `clip`; there the ring is clipped as before, never worse. */\n overflow-x: hidden;\n overflow-x: clip;\n overflow-clip-margin: 3px;\n}\n\n.s2abe0f_stateLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* Visually hidden but screen-reader readable (the loading copy while the\n * skeleton stands in visually). */\n.sfb85e5_srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n overflow: hidden;\n white-space: nowrap;\n}\n\n/* The loading shelf: ghost cards with the same geometry as the real grid, so\n * the swap to content is a same-shape handoff instead of a jump. */\n.s728a01_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.s33d002_skeletonCard {\n position: relative;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n}\n\n/* The shimmer sweep: one gradient band travels across each ghost card while\n * the bars breathe, so the loading state reads as \"the shelf is scanning\". */\n.s33d002_skeletonCard::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent) 50%,\n transparent 75%\n );\n transform: translateX(-100%);\n animation: dshShopSkeletonSweep 1.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n@keyframes dshShopSkeletonSweep {\n to { transform: translateX(100%); }\n}\n\n.s46e666_skeletonName {\n width: 55%;\n height: 14px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s2a467d_skeletonSummary {\n width: 92%;\n height: 12px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s232601_skeletonSummaryShort {\n width: 68%;\n height: 12px;\n margin: 6px 12px 10px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n/* The ghost of the action line, right where the real buttons land. */\n.sde9b0c_skeletonActions {\n display: block;\n width: 84px;\n height: 24px;\n margin: 0 12px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s33d002_skeletonCard span {\n animation: dshShopSkeletonPulse 1.6s ease-in-out infinite;\n}\n\n@keyframes dshShopSkeletonPulse {\n 0%, 100% { opacity: 0.5; }\n 50% { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s33d002_skeletonCard span { animation: none; opacity: 0.75; }\n .s33d002_skeletonCard::after { content: none; }\n}\n\n.sb632c0_actionButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.sb632c0_actionButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.sb632c0_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s27ad76_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.saba3c3_toolbarRight {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* The shop's own version, right of the search box: `v0.4.4`, plus the\n * update button when the version check found a newer release. */\n.s6736c0_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s2dff04_versionText {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s40b16e_updateSelfButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.s40b16e_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.s40b16e_updateSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The on-demand re-check next to the version number: a quiet pill; the\n * border and text carry it in the light theme where bg layers are white. */\n.secd6a2_checkUpdateButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.secd6a2_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.secd6a2_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.secd6a2_checkUpdateButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The project's GitHub mark, right of the version row: a quiet icon link.\n * The octocat carries itself — color shift on hover, no text, no border. */\n.s5e1ce3_githubLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px;\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s5e1ce3_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.s5e1ce3_githubLink:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The self-update's expanded states (running log / done + restart /\n * failure detail) sit under the toolbar, above the category bar. */\n.s798348_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.se23a0e_searchInput {\n width: min(280px, 100%);\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n.se23a0e_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s82b1d4_staleBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.see2588_staleBadge {\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n color: var(--dsw-alias-state-warn-primary);\n font-size: 12px;\n}\n\n.se67e0b_categoryBar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s8c06a0_categoryButton {\n padding: 3px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s8c06a0_categoryButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s65a55a_categoryButtonOn {\n border-color: var(--dsw-alias-brand-primary);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-weight: 600;\n}\n\n.s8c06a0_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sb6cdd6_catalogHeading {\n margin: 2px 0 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-primary);\n}\n\n.s38a33e_catalogStats {\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.se3ba96_emptyLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* The shelf: a responsive grid of cards. */\n/* Single-line rows: one full-width column, one plugin per line. */\n.sb41fe1_cards {\n display: grid;\n grid-template-columns: 1fr;\n max-width: 100%;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n animation: dshShopCardsIn 220ms ease;\n}\n\n@keyframes dshShopCardsIn {\n from { opacity: 0; transform: translateY(3px); }\n to { opacity: 1; transform: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sb41fe1_cards { animation: none; }\n}\n\n.sfcd584_card {\n position: relative;\n display: flex;\n flex-direction: column;\n /* A grid item's min-width is auto by default: its content would widen the\n * 1fr track past the panel and overflow horizontally. */\n min-width: 0;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n transition: border-color 120ms ease, transform 120ms ease, box-shadow 120ms ease;\n /* Off-screen cards skip layout and paint; the placeholder keeps scrollbar\n * estimation sane before the browser has measured the real height. */\n content-visibility: auto;\n contain-intrinsic-size: auto 140px;\n}\n\n/* The sentinel that triggers the next shelf batch: zero visual footprint. */\n.sf2d932_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s947694_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sfcd584_card:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l1));\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sfcd584_card { transition: none; }\n .sfcd584_card:hover { transform: none; }\n}\n\n/* The signature: a spine and cover in the category's own hue. The hues are\n * fixed mid-bright colors that read on both themes; `other` deliberately\n * stays a neutral gray so the fallback category does not compete. */\n.sfc4028_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--spine-hue, #8B8E96);\n}\n\n.sfcd584_card[data-category='tool'] { --spine-hue: #4C8DFF; }\n.sfcd584_card[data-category='provider'] { --spine-hue: #A78BFA; }\n.sfcd584_card[data-category='ui'] { --spine-hue: #2DD4BF; }\n.sfcd584_card[data-category='workflow'] { --spine-hue: #F59E0B; }\n.sfcd584_card[data-category='integration'] { --spine-hue: #34D399; }\n.sfcd584_card[data-category='theme'] { --spine-hue: #F472B6; }\n.sfcd584_card[data-category='other'] { --spine-hue: #8B8E96; }\n\n/* The category sits in the badge row as a quiet chip in the category's own\n * hue — the border carries it where the light theme's white layers cannot\n * (the same lesson as the check button). */\n.sb94610_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--spine-hue, #8B8E96) 45%, transparent);\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--spine-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.s50a94e_entryHeader {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding: 8px 12px 2px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.s50a94e_entryHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n/* The name fills the row and truncates rather than wraps; the badges stay\n * intact beside it. */\n.sfdbf47_name {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n flex: 1 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--dsw-alias-label-primary);\n}\n\n.s28e55e_badges {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* The action line: buttons side by side; an active install/uninstall flow\n * (gate, log, notices) takes the full width below them. */\n.s9359c0_cardActions {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 10px;\n}\n\n.s9359c0_cardActions > .s549462_gate,\n.s9359c0_cardActions > .s20fbe0_installPanel,\n.s9359c0_cardActions > .s94517f_installedActions {\n flex-basis: 100%;\n}\n\n/* The entry's version, always visible on the card (the expanded detail\n * repeats it in the version row) — the same quiet mono as the toolbar. */\n.sc54e24_cardVersion {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The octocat marking a github-sourced entry, beside its short commit. */\n.s623bee_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sf9a12c_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.sf9a12c_tierBadge[data-tier='verified'] {\n color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);\n}\n\n.sf9a12c_tierBadge[data-tier='verified-stale'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.sf9a12c_tierBadge[data-tier='community'] {\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n border: 1px solid var(--dsw-alias-border-l2);\n}\n\n.s671f97_incompatibleBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.s963e5c_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sbb5739_chevron, .s4e56e8_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s4e56e8_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .sbb5739_chevron, .s4e56e8_chevronOpen { transition: none; }\n}\n\n.sf9a60a_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.sfd2791_summary {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.s69ed84_summaryZh {\n margin: -4px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Expanded cards show the full summary: the clamp is lifted, never raised —\n * a higher number would still truncate the author's text, just later. */\n.s83c8c8_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s20b5b9_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s45793c_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s551fd2_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.sb1f0de_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s9a5379_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s9a5379_capabilities li {\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s9e0e76_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.s41121d_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.s852a05_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.s852a05_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.s852a05_detailRow dd {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n text-align: right;\n color: var(--dsw-alias-label-primary);\n}\n\n.s852a05_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.s852a05_detailRow a:hover {\n text-decoration: underline;\n}\n\n.s852a05_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The publishing account, beside the npm link. Secondary label colour and a\n * middot separator carry the distinction — never a background fill, which is\n * invisible in the light theme where every bg-layer token is the same white. */\n/* Who published the entry, at the right edge of the action row. `margin-left:\n * auto` is what pushes it there; the row is a wrapping flex, so an active\n * install flow (which claims the full width) drops this to the next line\n * rather than squeezing it. */\n.s367f3b_author {\n margin-left: auto;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.s2f9e91_reviewedLine {\n margin: 8px 0 0;\n padding: 6px 8px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n font-size: 12px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n/* Install flow. */\n.s20fbe0_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.s89d599_installButton, .s7b4348_confirmButton, .s20b00b_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.s89d599_installButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.s89d599_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s7b4348_confirmButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.s7b4348_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s20b00b_cancelButton {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n\n.s20b00b_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s89d599_installButton:focus-visible, .s7b4348_confirmButton:focus-visible, .s20b00b_cancelButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The shelf card of a plugin that is installed and current carries this\n * non-interactive label instead of an install button. Border + text do the\n * work in the light theme, where every bg-layer token resolves to white. */\n.s1e55fb_installedLabel {\n align-self: flex-start;\n margin: 0;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n/* An installed card's controls: the installed label or the update button,\n * plus the uninstall button. The install panel's running/failed states are\n * column layouts and sit as one item of this row. */\n.s94517f_installedActions {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Uninstall revokes privilege; the quiet outline keeps it from competing\n * with the primary action, and the error tint says \"removes\". */\n.s432016_uninstallButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 55%, transparent);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s432016_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.s432016_uninstallButton:focus-visible {\n outline: 2px solid var(--dsw-alias-state-error-primary);\n outline-offset: 1px;\n}\n\n/* The restart dsh button on a done install: quiet outline, same rank as\n * the other secondary actions. */\n.s5c0f5a_restartButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s5c0f5a_restartButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s5c0f5a_restartButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s549462_gate {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: 8px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n.sed2c7d_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.sdce129_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sfae869_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.sae8426_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.s260a62_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sba0b9c_log {\n max-height: 160px;\n overflow: auto;\n margin: 0;\n padding: 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n list-style: none;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n\n.s5c7c9d_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sebdc74_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.s2672db_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s3a9748_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sc1144d_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s2209a3_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* Installed section. */\n.sb4abbb_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.sbca39c_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s1abd04_outdatedRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.s10dca9_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s10dca9_outdatedInfo strong {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n word-break: break-all;\n color: var(--dsw-alias-label-primary);\n}\n\n.sb04966_outdatedVersions {\n /* Two inline labels with nothing between them in the markup ran together as\n * `installed v1.0.0latest v2.0.0`: JSX drops the whitespace-only line, and\n * the per-label class the markup asked for was never defined (singular\n * against this rule's plural). The container owns the gap, the same idiom\n * as .s28e55e_badges — the labels need no class of their own. */\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.see54bf_outdatedActions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* The enable/disable switch. */\n.sa65b66_switch {\n position: relative;\n width: 32px;\n height: 18px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n}\n\n.s50b82f_switchOn {\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 55%, transparent);\n}\n\n.sbbb39a_switchKnob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--dsw-alias-label-primary);\n transition: transform 120ms ease, background 120ms ease;\n}\n\n.s50b82f_switchOn .sbbb39a_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.sa65b66_switch:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sa65b66_switch, .sbbb39a_switchKnob { transition: none; }\n}\n\n/* The hot enable/disable switch on installed rows: the knob button plus the\n * §8 hot-apply / failure notices rendered beside it. */\n.s24b48c_switchWrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n";
5279
+ if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"26093961\"]")) {
5280
5280
  const tag = document.createElement("style");
5281
- tag.dataset.pluginCss = "e3675a89";
5281
+ tag.dataset.pluginCss = "26093961";
5282
5282
  tag.textContent = css;
5283
5283
  document.head.appendChild(tag);
5284
5284
  }
5285
- var _dsh_plugin_shop_css_e3675a89_default = {
5286
- "client": "s8583e3_client",
5287
- "config": "s942a79_config",
5288
- "ts": "s5f67aa_ts",
5289
- "spec": "sfd9d8a_spec",
5290
- "panel": "s255e5a_panel",
5291
- "searchInput": "s232ec4_searchInput",
5292
- "toolbar": "s646509_toolbar",
5293
- "stateLine": "s44a3ec_stateLine",
5294
- "srOnly": "s3a0ece_srOnly",
5295
- "skeletonGrid": "se0c3b4_skeletonGrid",
5296
- "skeletonCard": "s520416_skeletonCard",
5297
- "skeletonName": "s8c7d6f_skeletonName",
5298
- "skeletonSummary": "sf5179e_skeletonSummary",
5299
- "skeletonSummaryShort": "sbb0d25_skeletonSummaryShort",
5300
- "skeletonActions": "s96e910_skeletonActions",
5301
- "actionButton": "s73242a_actionButton",
5302
- "toolbarRight": "s745e3c_toolbarRight",
5303
- "versionBlock": "s4fe61f_versionBlock",
5304
- "versionText": "sb9b924_versionText",
5305
- "updateSelfButton": "sa04455_updateSelfButton",
5306
- "checkUpdateButton": "s614a38_checkUpdateButton",
5307
- "githubLink": "sa987f7_githubLink",
5308
- "selfUpdatePanel": "sb81ba5_selfUpdatePanel",
5309
- "staleBlock": "s1555aa_staleBlock",
5310
- "staleBadge": "s3946f1_staleBadge",
5311
- "categoryBar": "sb2c859_categoryBar",
5312
- "categoryButton": "s26d58e_categoryButton",
5313
- "categoryButtonOn": "s5f68c4_categoryButtonOn",
5314
- "catalogHeading": "s668774_catalogHeading",
5315
- "catalogStats": "sccc4d1_catalogStats",
5316
- "emptyLine": "s6de1ab_emptyLine",
5317
- "cards": "sf657f5_cards",
5318
- "card": "s65f383_card",
5319
- "cardsSentry": "sd7ee01_cardsSentry",
5320
- "showingLine": "s705cc6_showingLine",
5321
- "cardSpine": "s4ce25d_cardSpine",
5322
- "categoryBadge": "s9c8eaa_categoryBadge",
5323
- "entryHeader": "sa97234_entryHeader",
5324
- "name": "sc3f149_name",
5325
- "badges": "s513026_badges",
5326
- "cardActions": "s9b5048_cardActions",
5327
- "gate": "sc4f2ac_gate",
5328
- "installPanel": "s4d374c_installPanel",
5329
- "installedActions": "sf53ca0_installedActions",
5330
- "cardVersion": "sc6ec6e_cardVersion",
5331
- "sourceBadge": "s71f10f_sourceBadge",
5332
- "tierBadge": "s5e82cb_tierBadge",
5333
- "incompatibleBadge": "s4bbe02_incompatibleBadge",
5334
- "starsBadge": "sff43b4_starsBadge",
5335
- "chevron": "s73f7fb_chevron",
5336
- "chevronOpen": "s61393c_chevronOpen",
5337
- "body": "s820ebf_body",
5338
- "summary": "sb8fbc8_summary",
5339
- "summaryZh": "se507db_summaryZh",
5340
- "summaryExpanded": "s10baf0_summaryExpanded",
5341
- "summaryZhExpanded": "sb9dba9_summaryZhExpanded",
5342
- "incompatibleDetail": "s6eca19_incompatibleDetail",
5343
- "capabilitiesBlock": "s9d2029_capabilitiesBlock",
5344
- "capabilitiesNote": "s3bdbd5_capabilitiesNote",
5345
- "capabilities": "s441702_capabilities",
5346
- "detail": "sde3f0c_detail",
5347
- "detailRows": "se98179_detailRows",
5348
- "detailRow": "sfb4d2f_detailRow",
5349
- "author": "s1ff66f_author",
5350
- "reviewedLine": "sd58c6d_reviewedLine",
5351
- "installButton": "se7aaed_installButton",
5352
- "confirmButton": "sb43a49_confirmButton",
5353
- "cancelButton": "s6e45d1_cancelButton",
5354
- "installedLabel": "sb6fc74_installedLabel",
5355
- "uninstallButton": "s96967f_uninstallButton",
5356
- "restartButton": "s6ac237_restartButton",
5357
- "gateTitle": "s559c38_gateTitle",
5358
- "gateBody": "s3c0ace_gateBody",
5359
- "gateWarning": "sc323e5_gateWarning",
5360
- "gateActions": "s4b2373_gateActions",
5361
- "installing": "s52b5a5_installing",
5362
- "log": "s64ab71_log",
5363
- "logLine": "s1531a8_logLine",
5364
- "notice": "sf20dda_notice",
5365
- "failedHeading": "seb9b08_failedHeading",
5366
- "failedDetail": "sfd3021_failedDetail",
5367
- "rejectedCode": "s50ba35_rejectedCode",
5368
- "rejectedDetail": "se75489_rejectedDetail",
5369
- "outdatedSection": "sa276cf_outdatedSection",
5370
- "outdatedList": "sceae6e_outdatedList",
5371
- "outdatedRow": "s8d2072_outdatedRow",
5372
- "outdatedInfo": "s5c2545_outdatedInfo",
5373
- "outdatedVersions": "s877c68_outdatedVersions",
5374
- "outdatedActions": "sa1f556_outdatedActions",
5375
- "switch": "s11c019_switch",
5376
- "switchOn": "s7580e8_switchOn",
5377
- "switchKnob": "saab2b3_switchKnob",
5378
- "switchWrap": "sd9f9e4_switchWrap"
5285
+ var _dsh_plugin_shop_css_26093961_default = {
5286
+ "client": "sfae5fa_client",
5287
+ "config": "se9da7d_config",
5288
+ "ts": "se722f1_ts",
5289
+ "spec": "s2f7a8b_spec",
5290
+ "panel": "s99b207_panel",
5291
+ "searchInput": "se23a0e_searchInput",
5292
+ "toolbar": "s27ad76_toolbar",
5293
+ "stateLine": "s2abe0f_stateLine",
5294
+ "srOnly": "sfb85e5_srOnly",
5295
+ "skeletonGrid": "s728a01_skeletonGrid",
5296
+ "skeletonCard": "s33d002_skeletonCard",
5297
+ "skeletonName": "s46e666_skeletonName",
5298
+ "skeletonSummary": "s2a467d_skeletonSummary",
5299
+ "skeletonSummaryShort": "s232601_skeletonSummaryShort",
5300
+ "skeletonActions": "sde9b0c_skeletonActions",
5301
+ "actionButton": "sb632c0_actionButton",
5302
+ "toolbarRight": "saba3c3_toolbarRight",
5303
+ "versionBlock": "s6736c0_versionBlock",
5304
+ "versionText": "s2dff04_versionText",
5305
+ "updateSelfButton": "s40b16e_updateSelfButton",
5306
+ "checkUpdateButton": "secd6a2_checkUpdateButton",
5307
+ "githubLink": "s5e1ce3_githubLink",
5308
+ "selfUpdatePanel": "s798348_selfUpdatePanel",
5309
+ "staleBlock": "s82b1d4_staleBlock",
5310
+ "staleBadge": "see2588_staleBadge",
5311
+ "categoryBar": "se67e0b_categoryBar",
5312
+ "categoryButton": "s8c06a0_categoryButton",
5313
+ "categoryButtonOn": "s65a55a_categoryButtonOn",
5314
+ "catalogHeading": "sb6cdd6_catalogHeading",
5315
+ "catalogStats": "s38a33e_catalogStats",
5316
+ "emptyLine": "se3ba96_emptyLine",
5317
+ "cards": "sb41fe1_cards",
5318
+ "card": "sfcd584_card",
5319
+ "cardsSentry": "sf2d932_cardsSentry",
5320
+ "showingLine": "s947694_showingLine",
5321
+ "cardSpine": "sfc4028_cardSpine",
5322
+ "categoryBadge": "sb94610_categoryBadge",
5323
+ "entryHeader": "s50a94e_entryHeader",
5324
+ "name": "sfdbf47_name",
5325
+ "badges": "s28e55e_badges",
5326
+ "cardActions": "s9359c0_cardActions",
5327
+ "gate": "s549462_gate",
5328
+ "installPanel": "s20fbe0_installPanel",
5329
+ "installedActions": "s94517f_installedActions",
5330
+ "cardVersion": "sc54e24_cardVersion",
5331
+ "sourceBadge": "s623bee_sourceBadge",
5332
+ "tierBadge": "sf9a12c_tierBadge",
5333
+ "incompatibleBadge": "s671f97_incompatibleBadge",
5334
+ "starsBadge": "s963e5c_starsBadge",
5335
+ "chevron": "sbb5739_chevron",
5336
+ "chevronOpen": "s4e56e8_chevronOpen",
5337
+ "body": "sf9a60a_body",
5338
+ "summary": "sfd2791_summary",
5339
+ "summaryZh": "s69ed84_summaryZh",
5340
+ "summaryExpanded": "s83c8c8_summaryExpanded",
5341
+ "summaryZhExpanded": "s20b5b9_summaryZhExpanded",
5342
+ "incompatibleDetail": "s45793c_incompatibleDetail",
5343
+ "capabilitiesBlock": "s551fd2_capabilitiesBlock",
5344
+ "capabilitiesNote": "sb1f0de_capabilitiesNote",
5345
+ "capabilities": "s9a5379_capabilities",
5346
+ "detail": "s9e0e76_detail",
5347
+ "detailRows": "s41121d_detailRows",
5348
+ "detailRow": "s852a05_detailRow",
5349
+ "author": "s367f3b_author",
5350
+ "reviewedLine": "s2f9e91_reviewedLine",
5351
+ "installButton": "s89d599_installButton",
5352
+ "confirmButton": "s7b4348_confirmButton",
5353
+ "cancelButton": "s20b00b_cancelButton",
5354
+ "installedLabel": "s1e55fb_installedLabel",
5355
+ "uninstallButton": "s432016_uninstallButton",
5356
+ "restartButton": "s5c0f5a_restartButton",
5357
+ "gateTitle": "sed2c7d_gateTitle",
5358
+ "gateBody": "sdce129_gateBody",
5359
+ "gateWarning": "sfae869_gateWarning",
5360
+ "gateActions": "sae8426_gateActions",
5361
+ "installing": "s260a62_installing",
5362
+ "log": "sba0b9c_log",
5363
+ "logLine": "s5c7c9d_logLine",
5364
+ "notice": "sebdc74_notice",
5365
+ "failedHeading": "s2672db_failedHeading",
5366
+ "failedDetail": "s3a9748_failedDetail",
5367
+ "rejectedCode": "sc1144d_rejectedCode",
5368
+ "rejectedDetail": "s2209a3_rejectedDetail",
5369
+ "outdatedSection": "sb4abbb_outdatedSection",
5370
+ "outdatedList": "sbca39c_outdatedList",
5371
+ "outdatedRow": "s1abd04_outdatedRow",
5372
+ "outdatedInfo": "s10dca9_outdatedInfo",
5373
+ "outdatedVersions": "sb04966_outdatedVersions",
5374
+ "outdatedActions": "see54bf_outdatedActions",
5375
+ "switch": "sa65b66_switch",
5376
+ "switchOn": "s50b82f_switchOn",
5377
+ "switchKnob": "sbbb39a_switchKnob",
5378
+ "switchWrap": "s24b48c_switchWrap"
5379
5379
  };
5380
5380
  //#endregion
5381
5381
  //#region src/client/ShopTab.tsx
@@ -5392,7 +5392,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5392
5392
  width: "14",
5393
5393
  height: "14",
5394
5394
  "aria-hidden": "true",
5395
- className: open ? _dsh_plugin_shop_css_e3675a89_default.chevronOpen : _dsh_plugin_shop_css_e3675a89_default.chevron,
5395
+ className: open ? _dsh_plugin_shop_css_26093961_default.chevronOpen : _dsh_plugin_shop_css_26093961_default.chevron,
5396
5396
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
5397
5397
  fill: "currentColor",
5398
5398
  d: "M3.5 6 8 10.5 12.5 6l1 1L8 12.5 2.5 7l1-1Z"
@@ -5413,32 +5413,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5413
5413
  const author = authorOf(entry);
5414
5414
  const category = entry.catalog?.category ?? "other";
5415
5415
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5416
- className: _dsh_plugin_shop_css_e3675a89_default.card,
5416
+ className: _dsh_plugin_shop_css_26093961_default.card,
5417
5417
  "data-shop-entry": entry.name,
5418
5418
  "data-category": category,
5419
5419
  children: [
5420
5420
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5421
- className: _dsh_plugin_shop_css_e3675a89_default.cardSpine,
5421
+ className: _dsh_plugin_shop_css_26093961_default.cardSpine,
5422
5422
  "aria-hidden": "true"
5423
5423
  }),
5424
5424
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
5425
5425
  type: "button",
5426
- className: _dsh_plugin_shop_css_e3675a89_default.entryHeader,
5426
+ className: _dsh_plugin_shop_css_26093961_default.entryHeader,
5427
5427
  "aria-expanded": open,
5428
5428
  "aria-controls": detailId,
5429
5429
  onClick: () => setOpen((current) => !current),
5430
5430
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5431
- className: _dsh_plugin_shop_css_e3675a89_default.name,
5431
+ className: _dsh_plugin_shop_css_26093961_default.name,
5432
5432
  children: entry.name
5433
5433
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5434
- className: _dsh_plugin_shop_css_e3675a89_default.badges,
5434
+ className: _dsh_plugin_shop_css_26093961_default.badges,
5435
5435
  children: [
5436
5436
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5437
- className: _dsh_plugin_shop_css_e3675a89_default.categoryBadge,
5437
+ className: _dsh_plugin_shop_css_26093961_default.categoryBadge,
5438
5438
  children: t(categoryKey(entry))
5439
5439
  }),
5440
5440
  entry.source === "npm" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5441
- className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
5441
+ className: _dsh_plugin_shop_css_26093961_default.sourceBadge,
5442
5442
  "data-shop-source-npm": true,
5443
5443
  role: "img",
5444
5444
  "aria-label": t("npmSource"),
@@ -5455,7 +5455,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5455
5455
  })
5456
5456
  }),
5457
5457
  hasGithubHome(entry) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5458
- className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
5458
+ className: _dsh_plugin_shop_css_26093961_default.sourceBadge,
5459
5459
  "data-shop-source-github": true,
5460
5460
  role: "img",
5461
5461
  "aria-label": t("githubSource"),
@@ -5469,23 +5469,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5469
5469
  })
5470
5470
  }),
5471
5471
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5472
- className: _dsh_plugin_shop_css_e3675a89_default.cardVersion,
5472
+ className: _dsh_plugin_shop_css_26093961_default.cardVersion,
5473
5473
  "data-card-version": true,
5474
5474
  children: ["v", displayVersion(entry)]
5475
5475
  }),
5476
5476
  entry.tier !== "community" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5477
- className: _dsh_plugin_shop_css_e3675a89_default.tierBadge,
5477
+ className: _dsh_plugin_shop_css_26093961_default.tierBadge,
5478
5478
  "data-tier": entry.tier,
5479
5479
  children: t(tierKey(entry.tier))
5480
5480
  }),
5481
5481
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5482
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleBadge,
5482
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleBadge,
5483
5483
  "data-shop-incompatible": true,
5484
5484
  title: t("incompatibleDetail", { modules: missing.join(", ") }),
5485
5485
  children: t("incompatibleBadge")
5486
5486
  }),
5487
5487
  stars !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5488
- className: _dsh_plugin_shop_css_e3675a89_default.starsBadge,
5488
+ className: _dsh_plugin_shop_css_26093961_default.starsBadge,
5489
5489
  role: "img",
5490
5490
  "aria-label": t("stars", { count: stars }),
5491
5491
  children: ["★ ", formatStars(stars)]
@@ -5495,38 +5495,38 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5495
5495
  })]
5496
5496
  }),
5497
5497
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5498
- className: _dsh_plugin_shop_css_e3675a89_default.body,
5498
+ className: _dsh_plugin_shop_css_26093961_default.body,
5499
5499
  children: [
5500
5500
  summary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5501
- className: open ? `${_dsh_plugin_shop_css_e3675a89_default.summary} ${_dsh_plugin_shop_css_e3675a89_default.summaryExpanded}` : _dsh_plugin_shop_css_e3675a89_default.summary,
5501
+ className: open ? `${_dsh_plugin_shop_css_26093961_default.summary} ${_dsh_plugin_shop_css_26093961_default.summaryExpanded}` : _dsh_plugin_shop_css_26093961_default.summary,
5502
5502
  children: summary.en
5503
5503
  }),
5504
5504
  summary?.zh !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5505
- className: open ? `${_dsh_plugin_shop_css_e3675a89_default.summaryZh} ${_dsh_plugin_shop_css_e3675a89_default.summaryZhExpanded}` : _dsh_plugin_shop_css_e3675a89_default.summaryZh,
5505
+ className: open ? `${_dsh_plugin_shop_css_26093961_default.summaryZh} ${_dsh_plugin_shop_css_26093961_default.summaryZhExpanded}` : _dsh_plugin_shop_css_26093961_default.summaryZh,
5506
5506
  children: summary.zh
5507
5507
  }),
5508
5508
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5509
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleDetail,
5509
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleDetail,
5510
5510
  children: t("incompatibleDetail", { modules: missing.join(", ") })
5511
5511
  }),
5512
5512
  open && entry.catalog !== void 0 && entry.catalog.capabilities.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5513
- className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesBlock,
5513
+ className: _dsh_plugin_shop_css_26093961_default.capabilitiesBlock,
5514
5514
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5515
- className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesNote,
5515
+ className: _dsh_plugin_shop_css_26093961_default.capabilitiesNote,
5516
5516
  children: t("capabilitiesNote")
5517
5517
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
5518
- className: _dsh_plugin_shop_css_e3675a89_default.capabilities,
5518
+ className: _dsh_plugin_shop_css_26093961_default.capabilities,
5519
5519
  children: entry.catalog.capabilities.map((capability) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: capability }, capability))
5520
5520
  })]
5521
5521
  }),
5522
5522
  open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5523
5523
  id: detailId,
5524
- className: _dsh_plugin_shop_css_e3675a89_default.detail,
5524
+ className: _dsh_plugin_shop_css_26093961_default.detail,
5525
5525
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
5526
- className: _dsh_plugin_shop_css_e3675a89_default.detailRows,
5526
+ className: _dsh_plugin_shop_css_26093961_default.detailRows,
5527
5527
  children: [
5528
5528
  npmUrl !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5529
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5529
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
5530
5530
  "data-shop-npm": true,
5531
5531
  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", {
5532
5532
  href: npmUrl,
@@ -5536,7 +5536,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5536
5536
  }) })]
5537
5537
  }),
5538
5538
  entry.repository !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5539
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5539
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
5540
5540
  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", {
5541
5541
  href: entry.repository,
5542
5542
  target: "_blank",
@@ -5545,12 +5545,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5545
5545
  }) : entry.repository })]
5546
5546
  }),
5547
5547
  entry.license !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5548
- className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5548
+ className: _dsh_plugin_shop_css_26093961_default.detailRow,
5549
5549
  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 })]
5550
5550
  })
5551
5551
  ]
5552
5552
  }), entry.tier === "verified-stale" && entry.review !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5553
- className: _dsh_plugin_shop_css_e3675a89_default.reviewedLine,
5553
+ className: _dsh_plugin_shop_css_26093961_default.reviewedLine,
5554
5554
  children: entry.review.reviewedVersion !== void 0 ? t("reviewedVersionLine", {
5555
5555
  reviewed: entry.review.reviewedVersion,
5556
5556
  current: entry.version
@@ -5563,7 +5563,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5563
5563
  ]
5564
5564
  }),
5565
5565
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5566
- className: _dsh_plugin_shop_css_e3675a89_default.cardActions,
5566
+ className: _dsh_plugin_shop_css_26093961_default.cardActions,
5567
5567
  "data-shop-actions": true,
5568
5568
  children: [installed === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InstallPanel, {
5569
5569
  name: entry.name,
@@ -5588,7 +5588,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5588
5588
  restart,
5589
5589
  restartSupported
5590
5590
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5591
- className: _dsh_plugin_shop_css_e3675a89_default.installedLabel,
5591
+ className: _dsh_plugin_shop_css_26093961_default.installedLabel,
5592
5592
  "data-shop-installed": true,
5593
5593
  children: t("installed")
5594
5594
  }),
@@ -5606,7 +5606,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5606
5606
  restartSupported
5607
5607
  })
5608
5608
  ] }), author !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5609
- className: _dsh_plugin_shop_css_e3675a89_default.author,
5609
+ className: _dsh_plugin_shop_css_26093961_default.author,
5610
5610
  "data-shop-author": true,
5611
5611
  children: t("authorLine", { author })
5612
5612
  })]
@@ -5623,23 +5623,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5623
5623
  const [gateOpen, setGateOpen] = (0, react.useState)(false);
5624
5624
  const { view, start } = useInstall(install, installStatus);
5625
5625
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5626
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5626
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5627
5627
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5628
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
5628
+ className: _dsh_plugin_shop_css_26093961_default.installing,
5629
5629
  children: t("installing")
5630
5630
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5631
- className: _dsh_plugin_shop_css_e3675a89_default.log,
5631
+ className: _dsh_plugin_shop_css_26093961_default.log,
5632
5632
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5633
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5633
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
5634
5634
  children: line
5635
5635
  }, index))
5636
5636
  })]
5637
5637
  });
5638
5638
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5639
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
5639
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
5640
5640
  children: [
5641
5641
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5642
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5642
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5643
5643
  "data-shop-restart-notice": true,
5644
5644
  children: view.needsRestart ? t(restartReasonKey(view.restartReason)) : t("installedNoRestartNotice")
5645
5645
  }),
@@ -5648,63 +5648,63 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5648
5648
  restart
5649
5649
  }),
5650
5650
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5651
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5651
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5652
5652
  "data-shop-restart-disabled": true,
5653
5653
  children: t("restartDisabledNotice")
5654
5654
  })
5655
5655
  ]
5656
5656
  });
5657
5657
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5658
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5658
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5659
5659
  children: [
5660
5660
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5661
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
5661
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
5662
5662
  children: t("installFailed")
5663
5663
  }),
5664
5664
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5665
- className: _dsh_plugin_shop_css_e3675a89_default.log,
5665
+ className: _dsh_plugin_shop_css_26093961_default.log,
5666
5666
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5667
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5667
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
5668
5668
  children: line
5669
5669
  }, index))
5670
5670
  }),
5671
5671
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5672
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5672
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
5673
5673
  children: view.detail === "" ? t("installTransportFailed") : view.detail
5674
5674
  })
5675
5675
  ]
5676
5676
  });
5677
5677
  if (view.kind === "rejected") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5678
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5678
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5679
5679
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5680
- className: _dsh_plugin_shop_css_e3675a89_default.rejectedCode,
5680
+ className: _dsh_plugin_shop_css_26093961_default.rejectedCode,
5681
5681
  children: t(rejectionCodeKey(view.code))
5682
5682
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5683
- className: _dsh_plugin_shop_css_e3675a89_default.rejectedDetail,
5683
+ className: _dsh_plugin_shop_css_26093961_default.rejectedDetail,
5684
5684
  children: view.detail
5685
5685
  })]
5686
5686
  });
5687
5687
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5688
- className: _dsh_plugin_shop_css_e3675a89_default.gate,
5688
+ className: _dsh_plugin_shop_css_26093961_default.gate,
5689
5689
  children: [
5690
5690
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5691
- className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
5691
+ className: _dsh_plugin_shop_css_26093961_default.gateTitle,
5692
5692
  children: t("acknowledgementTitle")
5693
5693
  }),
5694
5694
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5695
- className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
5695
+ className: _dsh_plugin_shop_css_26093961_default.gateBody,
5696
5696
  children: t("acknowledgementBody")
5697
5697
  }),
5698
5698
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5699
- className: _dsh_plugin_shop_css_e3675a89_default.gateWarning,
5699
+ className: _dsh_plugin_shop_css_26093961_default.gateWarning,
5700
5700
  "data-shop-incompatible-warning": true,
5701
5701
  children: t("incompatibleInstallWarning", { modules: missing.join(", ") })
5702
5702
  }),
5703
5703
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5704
- className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
5704
+ className: _dsh_plugin_shop_css_26093961_default.gateActions,
5705
5705
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5706
5706
  type: "button",
5707
- className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
5707
+ className: _dsh_plugin_shop_css_26093961_default.confirmButton,
5708
5708
  "data-shop-confirm": true,
5709
5709
  onClick: () => {
5710
5710
  setGateOpen(false);
@@ -5717,7 +5717,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5717
5717
  children: t("confirm")
5718
5718
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5719
5719
  type: "button",
5720
- className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
5720
+ className: _dsh_plugin_shop_css_26093961_default.cancelButton,
5721
5721
  onClick: () => setGateOpen(false),
5722
5722
  children: t("cancel")
5723
5723
  })]
@@ -5727,7 +5727,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5727
5727
  const update = variant === "update";
5728
5728
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5729
5729
  type: "button",
5730
- className: _dsh_plugin_shop_css_e3675a89_default.installButton,
5730
+ className: _dsh_plugin_shop_css_26093961_default.installButton,
5731
5731
  ...update ? { "data-shop-update": true } : { "data-shop-install": true },
5732
5732
  onClick: () => {
5733
5733
  if (tier === "verified") start({
@@ -5749,23 +5749,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5749
5749
  function UninstallPanel({ name, t, uninstall, installStatus, restart, restartSupported }) {
5750
5750
  const { view, start } = useUninstall(uninstall, installStatus);
5751
5751
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5752
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5752
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5753
5753
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5754
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
5754
+ className: _dsh_plugin_shop_css_26093961_default.installing,
5755
5755
  children: t("uninstalling")
5756
5756
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5757
- className: _dsh_plugin_shop_css_e3675a89_default.log,
5757
+ className: _dsh_plugin_shop_css_26093961_default.log,
5758
5758
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5759
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5759
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
5760
5760
  children: line
5761
5761
  }, index))
5762
5762
  })]
5763
5763
  });
5764
5764
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5765
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
5765
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
5766
5766
  children: [
5767
5767
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5768
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5768
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5769
5769
  "data-shop-uninstall-done": true,
5770
5770
  children: view.needsRestart ? t("uninstalledRestartNotice") : t("uninstalledLiveNotice")
5771
5771
  }),
@@ -5774,28 +5774,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5774
5774
  restart
5775
5775
  }),
5776
5776
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5777
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5777
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5778
5778
  "data-shop-restart-disabled": true,
5779
5779
  children: t("restartDisabledNotice")
5780
5780
  })
5781
5781
  ]
5782
5782
  });
5783
5783
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5784
- className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5784
+ className: _dsh_plugin_shop_css_26093961_default.installPanel,
5785
5785
  children: [
5786
5786
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5787
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
5787
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
5788
5788
  children: t("uninstallFailed")
5789
5789
  }),
5790
5790
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5791
- className: _dsh_plugin_shop_css_e3675a89_default.log,
5791
+ className: _dsh_plugin_shop_css_26093961_default.log,
5792
5792
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5793
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5793
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
5794
5794
  children: line
5795
5795
  }, index))
5796
5796
  }),
5797
5797
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5798
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5798
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
5799
5799
  children: view.detail === "" ? t("uninstallTransportFailed") : view.detail
5800
5800
  })
5801
5801
  ]
@@ -5803,7 +5803,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5803
5803
  if (view.kind !== "idle") return null;
5804
5804
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5805
5805
  type: "button",
5806
- className: _dsh_plugin_shop_css_e3675a89_default.uninstallButton,
5806
+ className: _dsh_plugin_shop_css_26093961_default.uninstallButton,
5807
5807
  "data-shop-uninstall": true,
5808
5808
  onClick: () => void start({ name }),
5809
5809
  children: t("uninstall")
@@ -5860,37 +5860,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5860
5860
  return () => clearInterval(timer);
5861
5861
  }, [state, t]);
5862
5862
  if (state.kind === "restarting") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5863
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5863
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5864
5864
  "data-shop-restarting": true,
5865
5865
  children: t("restarting")
5866
5866
  });
5867
5867
  if (state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5868
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5868
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
5869
5869
  "data-shop-restart-error": true,
5870
5870
  children: state.detail
5871
5871
  });
5872
5872
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5873
- className: _dsh_plugin_shop_css_e3675a89_default.gate,
5873
+ className: _dsh_plugin_shop_css_26093961_default.gate,
5874
5874
  children: [
5875
5875
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5876
- className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
5876
+ className: _dsh_plugin_shop_css_26093961_default.gateTitle,
5877
5877
  children: t("restartTitle")
5878
5878
  }),
5879
5879
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5880
- className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
5880
+ className: _dsh_plugin_shop_css_26093961_default.gateBody,
5881
5881
  children: t("restartBody")
5882
5882
  }),
5883
5883
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5884
- className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
5884
+ className: _dsh_plugin_shop_css_26093961_default.gateActions,
5885
5885
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5886
5886
  type: "button",
5887
- className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
5887
+ className: _dsh_plugin_shop_css_26093961_default.confirmButton,
5888
5888
  "data-shop-restart-confirm": true,
5889
5889
  onClick: () => void onConfirm(),
5890
5890
  children: t("restartConfirm")
5891
5891
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5892
5892
  type: "button",
5893
- className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
5893
+ className: _dsh_plugin_shop_css_26093961_default.cancelButton,
5894
5894
  onClick: () => setGateOpen(false),
5895
5895
  children: t("cancel")
5896
5896
  })]
@@ -5899,7 +5899,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5899
5899
  });
5900
5900
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5901
5901
  type: "button",
5902
- className: _dsh_plugin_shop_css_e3675a89_default.restartButton,
5902
+ className: _dsh_plugin_shop_css_26093961_default.restartButton,
5903
5903
  "data-shop-restart": true,
5904
5904
  onClick: () => setGateOpen(true),
5905
5905
  children: t("restart")
@@ -5939,7 +5939,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5939
5939
  }
5940
5940
  };
5941
5941
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5942
- className: _dsh_plugin_shop_css_e3675a89_default.switchWrap,
5942
+ className: _dsh_plugin_shop_css_26093961_default.switchWrap,
5943
5943
  "data-shop-enabled-switch": row.name,
5944
5944
  children: [
5945
5945
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -5948,18 +5948,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5948
5948
  "aria-checked": enabled,
5949
5949
  "aria-label": t("enabledSwitch"),
5950
5950
  "data-shop-toggle": true,
5951
- className: `${_dsh_plugin_shop_css_e3675a89_default.switch} ${enabled ? _dsh_plugin_shop_css_e3675a89_default.switchOn : ""}`,
5951
+ className: `${_dsh_plugin_shop_css_26093961_default.switch} ${enabled ? _dsh_plugin_shop_css_26093961_default.switchOn : ""}`,
5952
5952
  onClick: () => void onToggle(),
5953
5953
  disabled: toggle.kind === "saving",
5954
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.switchKnob })
5954
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.switchKnob })
5955
5955
  }),
5956
5956
  toggle.kind === "saved" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5957
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
5957
+ className: _dsh_plugin_shop_css_26093961_default.notice,
5958
5958
  "data-shop-hot-apply": true,
5959
5959
  children: t("hotApplyNote")
5960
5960
  }),
5961
5961
  toggle.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5962
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5962
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
5963
5963
  "data-shop-toggle-error": true,
5964
5964
  children: toggle.detail
5965
5965
  })
@@ -5971,27 +5971,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5971
5971
  * install flow for `name@latest`, reusing `InstallPanel`). */
5972
5972
  function OutdatedRow({ row, tier, source, missing, t, setEnabled, install, installStatus, restart, restartSupported }) {
5973
5973
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5974
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedRow,
5974
+ className: _dsh_plugin_shop_css_26093961_default.outdatedRow,
5975
5975
  "data-shop-outdated-entry": row.name,
5976
5976
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5977
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedInfo,
5977
+ className: _dsh_plugin_shop_css_26093961_default.outdatedInfo,
5978
5978
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5979
- className: _dsh_plugin_shop_css_e3675a89_default.badges,
5979
+ className: _dsh_plugin_shop_css_26093961_default.badges,
5980
5980
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5981
- className: _dsh_plugin_shop_css_e3675a89_default.name,
5981
+ className: _dsh_plugin_shop_css_26093961_default.name,
5982
5982
  children: row.name
5983
5983
  }), missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5984
- className: _dsh_plugin_shop_css_e3675a89_default.incompatibleBadge,
5984
+ className: _dsh_plugin_shop_css_26093961_default.incompatibleBadge,
5985
5985
  "data-shop-incompatible": true,
5986
5986
  title: t("incompatibleUpdateDetail", { modules: missing.join(", ") }),
5987
5987
  children: t("incompatibleBadge")
5988
5988
  })]
5989
5989
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5990
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedVersions,
5990
+ className: _dsh_plugin_shop_css_26093961_default.outdatedVersions,
5991
5991
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("installedVersion", { version: source === "github" ? row.installed.slice(0, 7) : row.installed }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("latestVersion", { version: row.latest }) })]
5992
5992
  })]
5993
5993
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5994
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedActions,
5994
+ className: _dsh_plugin_shop_css_26093961_default.outdatedActions,
5995
5995
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnabledSwitch, {
5996
5996
  row,
5997
5997
  t,
@@ -6021,20 +6021,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6021
6021
  function OutdatedSection({ state, tiers, sources, missingByName, t, setEnabled, install, installStatus, restart, restartSupported }) {
6022
6022
  if (state.kind === "loading") return null;
6023
6023
  if (state.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6024
- className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
6024
+ className: _dsh_plugin_shop_css_26093961_default.stateLine,
6025
6025
  "data-shop-outdated-error": true,
6026
6026
  children: t("error")
6027
6027
  });
6028
6028
  const outdated = state.entries.filter((entry) => entry.outdated);
6029
6029
  if (outdated.length === 0) return null;
6030
6030
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6031
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedSection,
6031
+ className: _dsh_plugin_shop_css_26093961_default.outdatedSection,
6032
6032
  "data-shop-outdated": true,
6033
6033
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
6034
- className: _dsh_plugin_shop_css_e3675a89_default.catalogHeading,
6034
+ className: _dsh_plugin_shop_css_26093961_default.catalogHeading,
6035
6035
  children: t("installedSection")
6036
6036
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
6037
- className: _dsh_plugin_shop_css_e3675a89_default.outdatedList,
6037
+ className: _dsh_plugin_shop_css_26093961_default.outdatedList,
6038
6038
  children: outdated.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OutdatedRow, {
6039
6039
  row,
6040
6040
  tier: tiers.get(row.name) ?? "community",
@@ -6207,50 +6207,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6207
6207
  return map;
6208
6208
  }, [catalogState]);
6209
6209
  if (catalogState.kind === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6210
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
6210
+ className: _dsh_plugin_shop_css_26093961_default.panel,
6211
6211
  "data-shop-tab": true,
6212
6212
  "aria-busy": "true",
6213
6213
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6214
- className: _dsh_plugin_shop_css_e3675a89_default.srOnly,
6214
+ className: _dsh_plugin_shop_css_26093961_default.srOnly,
6215
6215
  children: t("loading")
6216
6216
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6217
- className: _dsh_plugin_shop_css_e3675a89_default.skeletonGrid,
6217
+ className: _dsh_plugin_shop_css_26093961_default.skeletonGrid,
6218
6218
  "data-shop-skeleton": true,
6219
6219
  "aria-hidden": "true",
6220
6220
  children: Array.from({ length: 8 }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6221
- className: _dsh_plugin_shop_css_e3675a89_default.skeletonCard,
6221
+ className: _dsh_plugin_shop_css_26093961_default.skeletonCard,
6222
6222
  children: [
6223
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonName }),
6224
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummary }),
6225
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummaryShort }),
6226
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonActions })
6223
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonName }),
6224
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonSummary }),
6225
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonSummaryShort }),
6226
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_26093961_default.skeletonActions })
6227
6227
  ]
6228
6228
  }, i))
6229
6229
  })]
6230
6230
  });
6231
6231
  if (catalogState.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6232
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
6232
+ className: _dsh_plugin_shop_css_26093961_default.panel,
6233
6233
  "data-shop-tab": true,
6234
6234
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6235
- className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
6235
+ className: _dsh_plugin_shop_css_26093961_default.stateLine,
6236
6236
  children: t("error")
6237
6237
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6238
6238
  type: "button",
6239
- className: _dsh_plugin_shop_css_e3675a89_default.actionButton,
6239
+ className: _dsh_plugin_shop_css_26093961_default.actionButton,
6240
6240
  onClick: () => setRequest({ kind: "retry" }),
6241
6241
  children: t("retry")
6242
6242
  })]
6243
6243
  });
6244
6244
  const { result } = catalogState;
6245
6245
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6246
- className: _dsh_plugin_shop_css_e3675a89_default.panel,
6246
+ className: _dsh_plugin_shop_css_26093961_default.panel,
6247
6247
  "data-shop-tab": true,
6248
6248
  children: [
6249
6249
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6250
- className: _dsh_plugin_shop_css_e3675a89_default.toolbar,
6250
+ className: _dsh_plugin_shop_css_26093961_default.toolbar,
6251
6251
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
6252
6252
  type: "search",
6253
- className: _dsh_plugin_shop_css_e3675a89_default.searchInput,
6253
+ className: _dsh_plugin_shop_css_26093961_default.searchInput,
6254
6254
  "aria-label": t("search"),
6255
6255
  placeholder: t("search"),
6256
6256
  value: query,
@@ -6259,31 +6259,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6259
6259
  setVisibleCount(48);
6260
6260
  }
6261
6261
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6262
- className: _dsh_plugin_shop_css_e3675a89_default.toolbarRight,
6262
+ className: _dsh_plugin_shop_css_26093961_default.toolbarRight,
6263
6263
  children: [
6264
6264
  result.stale && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6265
- className: _dsh_plugin_shop_css_e3675a89_default.staleBlock,
6265
+ className: _dsh_plugin_shop_css_26093961_default.staleBlock,
6266
6266
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6267
- className: _dsh_plugin_shop_css_e3675a89_default.staleBadge,
6267
+ className: _dsh_plugin_shop_css_26093961_default.staleBadge,
6268
6268
  children: t("staleLabel", { date: result.builtAt.slice(0, 10) })
6269
6269
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6270
6270
  type: "button",
6271
- className: _dsh_plugin_shop_css_e3675a89_default.actionButton,
6271
+ className: _dsh_plugin_shop_css_26093961_default.actionButton,
6272
6272
  onClick: () => setRequest({ kind: "refresh" }),
6273
6273
  children: t("refresh")
6274
6274
  })]
6275
6275
  }),
6276
6276
  selfVersion !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6277
- className: _dsh_plugin_shop_css_e3675a89_default.versionBlock,
6277
+ className: _dsh_plugin_shop_css_26093961_default.versionBlock,
6278
6278
  children: [
6279
6279
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6280
- className: _dsh_plugin_shop_css_e3675a89_default.versionText,
6280
+ className: _dsh_plugin_shop_css_26093961_default.versionText,
6281
6281
  "data-shop-version": true,
6282
6282
  children: ["v", selfVersion.installed]
6283
6283
  }),
6284
6284
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6285
6285
  type: "button",
6286
- className: _dsh_plugin_shop_css_e3675a89_default.checkUpdateButton,
6286
+ className: _dsh_plugin_shop_css_26093961_default.checkUpdateButton,
6287
6287
  "data-shop-check-update": true,
6288
6288
  disabled: checkState !== "idle",
6289
6289
  onClick: () => void checkVersion(),
@@ -6291,7 +6291,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6291
6291
  }),
6292
6292
  selfVersion.outdated && selfVersion.latest !== null && selfUpdate.view.kind === "idle" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6293
6293
  type: "button",
6294
- className: _dsh_plugin_shop_css_e3675a89_default.updateSelfButton,
6294
+ className: _dsh_plugin_shop_css_26093961_default.updateSelfButton,
6295
6295
  "data-shop-update-self": true,
6296
6296
  onClick: () => {
6297
6297
  if (selfVersion.latest !== null) selfUpdate.start({ version: selfVersion.latest });
@@ -6301,7 +6301,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6301
6301
  ]
6302
6302
  }),
6303
6303
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
6304
- className: _dsh_plugin_shop_css_e3675a89_default.githubLink,
6304
+ className: _dsh_plugin_shop_css_26093961_default.githubLink,
6305
6305
  href: SHOP_REPO_URL,
6306
6306
  target: "_blank",
6307
6307
  rel: "noopener noreferrer",
@@ -6320,27 +6320,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6320
6320
  })]
6321
6321
  }),
6322
6322
  selfUpdate.view.kind === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6323
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6323
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
6324
6324
  "data-shop-self-updating": true,
6325
6325
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6326
- className: _dsh_plugin_shop_css_e3675a89_default.installing,
6326
+ className: _dsh_plugin_shop_css_26093961_default.installing,
6327
6327
  children: t("installing")
6328
6328
  }), selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6329
- className: _dsh_plugin_shop_css_e3675a89_default.log,
6329
+ className: _dsh_plugin_shop_css_26093961_default.log,
6330
6330
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6331
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
6331
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
6332
6332
  children: line
6333
6333
  }, index))
6334
6334
  })]
6335
6335
  }),
6336
6336
  selfUpdate.view.kind === "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6337
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6337
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
6338
6338
  "data-shop-self-update-done": true,
6339
6339
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6340
- className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
6340
+ className: _dsh_plugin_shop_css_26093961_default.installedActions,
6341
6341
  children: [
6342
6342
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6343
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
6343
+ className: _dsh_plugin_shop_css_26093961_default.notice,
6344
6344
  children: t("installedRestartNotice")
6345
6345
  }),
6346
6346
  restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartPanel, {
@@ -6348,7 +6348,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6348
6348
  restart
6349
6349
  }),
6350
6350
  !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6351
- className: _dsh_plugin_shop_css_e3675a89_default.notice,
6351
+ className: _dsh_plugin_shop_css_26093961_default.notice,
6352
6352
  "data-shop-restart-disabled": true,
6353
6353
  children: t("restartDisabledNotice")
6354
6354
  })
@@ -6356,34 +6356,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6356
6356
  })
6357
6357
  }),
6358
6358
  selfUpdate.view.kind === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6359
- className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6359
+ className: _dsh_plugin_shop_css_26093961_default.selfUpdatePanel,
6360
6360
  "data-shop-self-update-failed": true,
6361
6361
  children: [
6362
6362
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6363
- className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
6363
+ className: _dsh_plugin_shop_css_26093961_default.failedHeading,
6364
6364
  children: t("updateFailed")
6365
6365
  }),
6366
6366
  selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6367
- className: _dsh_plugin_shop_css_e3675a89_default.log,
6367
+ className: _dsh_plugin_shop_css_26093961_default.log,
6368
6368
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6369
- className: _dsh_plugin_shop_css_e3675a89_default.logLine,
6369
+ className: _dsh_plugin_shop_css_26093961_default.logLine,
6370
6370
  children: line
6371
6371
  }, index))
6372
6372
  }),
6373
6373
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6374
- className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
6374
+ className: _dsh_plugin_shop_css_26093961_default.failedDetail,
6375
6375
  children: selfUpdate.view.detail === "" ? t("updateTransportFailed") : selfUpdate.view.detail
6376
6376
  })
6377
6377
  ]
6378
6378
  }),
6379
6379
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6380
- className: _dsh_plugin_shop_css_e3675a89_default.categoryBar,
6380
+ className: _dsh_plugin_shop_css_26093961_default.categoryBar,
6381
6381
  role: "group",
6382
6382
  "aria-label": t("catalog"),
6383
6383
  children: [
6384
6384
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6385
6385
  type: "button",
6386
- className: category === null ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6386
+ className: category === null ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
6387
6387
  "aria-pressed": category === null,
6388
6388
  onClick: () => {
6389
6389
  setCategory(null);
@@ -6397,7 +6397,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6397
6397
  }),
6398
6398
  CATEGORY_ORDER.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6399
6399
  type: "button",
6400
- className: category === key ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6400
+ className: category === key ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
6401
6401
  "aria-pressed": category === key,
6402
6402
  onClick: () => {
6403
6403
  setCategory(key);
@@ -6411,7 +6411,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6411
6411
  }, key)),
6412
6412
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6413
6413
  type: "button",
6414
- className: category === "installed" ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6414
+ className: category === "installed" ? `${_dsh_plugin_shop_css_26093961_default.categoryButton} ${_dsh_plugin_shop_css_26093961_default.categoryButtonOn}` : _dsh_plugin_shop_css_26093961_default.categoryButton,
6415
6415
  "aria-pressed": category === "installed",
6416
6416
  onClick: () => {
6417
6417
  setCategory("installed");
@@ -6426,20 +6426,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6426
6426
  ]
6427
6427
  }),
6428
6428
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6429
- className: _dsh_plugin_shop_css_e3675a89_default.catalogStats,
6429
+ className: _dsh_plugin_shop_css_26093961_default.catalogStats,
6430
6430
  children: t("catalogStats", {
6431
6431
  count: String(result.plugins.length),
6432
6432
  date: result.builtAt.slice(0, 10)
6433
6433
  })
6434
6434
  }),
6435
6435
  result.plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6436
- className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
6436
+ className: _dsh_plugin_shop_css_26093961_default.emptyLine,
6437
6437
  children: t("empty")
6438
6438
  }) : filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6439
- className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
6439
+ className: _dsh_plugin_shop_css_26093961_default.emptyLine,
6440
6440
  children: t("emptySearch")
6441
6441
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
6442
- className: _dsh_plugin_shop_css_e3675a89_default.cards,
6442
+ className: _dsh_plugin_shop_css_26093961_default.cards,
6443
6443
  children: [visible.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EntryCard, {
6444
6444
  entry,
6445
6445
  stars: starsOf(entry, stars),
@@ -6454,12 +6454,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6454
6454
  setEnabled
6455
6455
  }) }, entryKey(entry))), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
6456
6456
  ref: sentinelRef,
6457
- className: _dsh_plugin_shop_css_e3675a89_default.cardsSentry,
6457
+ className: _dsh_plugin_shop_css_26093961_default.cardsSentry,
6458
6458
  "data-shop-sentry": true,
6459
6459
  "aria-hidden": "true"
6460
6460
  })]
6461
6461
  }), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6462
- className: _dsh_plugin_shop_css_e3675a89_default.showingLine,
6462
+ className: _dsh_plugin_shop_css_26093961_default.showingLine,
6463
6463
  "aria-live": "polite",
6464
6464
  children: t("showing", {
6465
6465
  shown: String(visibleCount),