dsh-plugin-shop 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -4437,7 +4437,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4437
4437
  },
4438
4438
  sourceLocation: {
4439
4439
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4440
- "line": 543,
4440
+ "line": 568,
4441
4441
  "column": 9
4442
4442
  }
4443
4443
  },
@@ -4455,7 +4455,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4455
4455
  },
4456
4456
  sourceLocation: {
4457
4457
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4458
- "line": 723,
4458
+ "line": 748,
4459
4459
  "column": 9
4460
4460
  }
4461
4461
  },
@@ -4483,7 +4483,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4483
4483
  },
4484
4484
  sourceLocation: {
4485
4485
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4486
- "line": 593,
4486
+ "line": 618,
4487
4487
  "column": 9
4488
4488
  }
4489
4489
  },
@@ -4510,7 +4510,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4510
4510
  },
4511
4511
  sourceLocation: {
4512
4512
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4513
- "line": 712,
4513
+ "line": 737,
4514
4514
  "column": 3
4515
4515
  }
4516
4516
  },
@@ -4528,7 +4528,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4528
4528
  },
4529
4529
  sourceLocation: {
4530
4530
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4531
- "line": 873,
4531
+ "line": 898,
4532
4532
  "column": 9
4533
4533
  }
4534
4534
  },
@@ -4555,7 +4555,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4555
4555
  },
4556
4556
  sourceLocation: {
4557
4557
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4558
- "line": 460,
4558
+ "line": 466,
4559
4559
  "column": 9
4560
4560
  }
4561
4561
  },
@@ -4583,7 +4583,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4583
4583
  },
4584
4584
  sourceLocation: {
4585
4585
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4586
- "line": 815,
4586
+ "line": 840,
4587
4587
  "column": 9
4588
4588
  }
4589
4589
  },
@@ -4610,7 +4610,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4610
4610
  },
4611
4611
  sourceLocation: {
4612
4612
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4613
- "line": 933,
4613
+ "line": 958,
4614
4614
  "column": 9
4615
4615
  }
4616
4616
  },
@@ -4628,7 +4628,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4628
4628
  },
4629
4629
  sourceLocation: {
4630
4630
  "file": "packages/dsh-plugin-shop/src/host/index.ts",
4631
- "line": 917,
4631
+ "line": 942,
4632
4632
  "column": 9
4633
4633
  }
4634
4634
  }
@@ -5278,108 +5278,108 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5278
5278
  };
5279
5279
  }
5280
5280
  //#endregion
5281
- //#region \0dsh-plugin-shop-css:2f345eaf
5282
- const css = "/* Shop tab styles — a market shelf inside the settings surface. The visual\n * language is the dsh theme's alias tokens ONLY (the four tokens the previous\n * styles referenced that do not exist — bg-layer-3, interactive-bg-hover,\n * state-error, state-success — are corrected to bg-layer-2 and the\n * state-*-primary set). The signature is the category spine: one HUE per\n * category (seven fixed hues, not the brand token — the brand resolves to\n * near-black in the light theme, so seven brand opacities read as seven\n * shades of gray), with the category name as the cover label in the same hue. Class names are mapped to content-derived names at bundle time\n * (tsdown.sfaf2a6_client.s6e981b_config.sbc63d6_ts) and stubbed in tests; only the keys are relied\n * on.\n *\n * One token rule the theme forces: the background LAYERS do not carry\n * contrast. In the light theme bg-base, bg-layer-1, bg-layer-2 and\n * bg-layer-3 all resolve to the same white; only the dark theme spreads them\n * (950/875/850/800). So a layer-2 fill on a layer-1 ground is invisible for\n * half of all users, and anything whose fill is its ONLY affordance — the\n * loading skeleton, the borderless capability chips — derives its fill from\n * label-primary instead, which inverts with the theme by construction.\n * Elements that also carry a border or text may keep a layer fill.\n * `css-tokens.sfaf2a6_client.sa97aae_spec.sbc63d6_ts` pins this. */\n\n.s2a42f7_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel. */\n overflow-x: hidden;\n}\n\n.se2e700_stateLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* Visually hidden but screen-reader readable (the loading copy while the\n * skeleton stands in visually). */\n.s2bfeb4_srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n overflow: hidden;\n white-space: nowrap;\n}\n\n/* The loading shelf: ghost cards with the same geometry as the real grid, so\n * the swap to content is a same-shape handoff instead of a jump. */\n.scc86af_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.sb0fddc_skeletonCard {\n position: relative;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n}\n\n/* The shimmer sweep: one gradient band travels across each ghost card while\n * the bars breathe, so the loading state reads as \"the shelf is scanning\". */\n.sb0fddc_skeletonCard::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent) 50%,\n transparent 75%\n );\n transform: translateX(-100%);\n animation: dshShopSkeletonSweep 1.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n@keyframes dshShopSkeletonSweep {\n to { transform: translateX(100%); }\n}\n\n.sbbf61e_skeletonName {\n width: 55%;\n height: 14px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s7a9fc3_skeletonSummary {\n width: 92%;\n height: 12px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s9e45c7_skeletonSummaryShort {\n width: 68%;\n height: 12px;\n margin: 6px 12px 10px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n/* The ghost of the action line, right where the real buttons land. */\n.s1a1e68_skeletonActions {\n display: block;\n width: 84px;\n height: 24px;\n margin: 0 12px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sb0fddc_skeletonCard span {\n animation: dshShopSkeletonPulse 1.6s ease-in-out infinite;\n}\n\n@keyframes dshShopSkeletonPulse {\n 0%, 100% { opacity: 0.5; }\n 50% { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sb0fddc_skeletonCard span { animation: none; opacity: 0.75; }\n .sb0fddc_skeletonCard::after { content: none; }\n}\n\n.s483f11_actionButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s483f11_actionButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s483f11_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s4044cf_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.s778557_toolbarRight {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* The shop's own version, right of the search box: `v0.4.4`, plus the\n * update button when the version check found a newer release. */\n.s48434d_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s627101_versionText {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s66e420_updateSelfButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.s66e420_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.s66e420_updateSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The on-demand re-check next to the version number: a quiet pill; the\n * border and text carry it in the light theme where bg layers are white. */\n.s818515_checkUpdateButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s818515_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.s818515_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.s818515_checkUpdateButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The project's GitHub mark, right of the version row: a quiet icon link.\n * The octocat carries itself — color shift on hover, no text, no border. */\n.sc445a8_githubLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px;\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sc445a8_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.sc445a8_githubLink:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The self-update's expanded states (running log / done + restart /\n * failure detail) sit under the toolbar, above the category bar. */\n.s90fb4e_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.sf703ef_searchInput {\n width: min(280px, 100%);\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n.sf703ef_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sdf3282_staleBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sa62643_staleBadge {\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n color: var(--dsw-alias-state-warn-primary);\n font-size: 12px;\n}\n\n.s2b0297_categoryBar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s4e4b56_categoryButton {\n padding: 3px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s4e4b56_categoryButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s1e8b51_categoryButtonOn {\n border-color: var(--dsw-alias-brand-primary);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-weight: 600;\n}\n\n.s4e4b56_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s2ab934_catalogHeading {\n margin: 2px 0 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-primary);\n}\n\n.se29170_catalogStats {\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s2762eb_emptyLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* The shelf: a responsive grid of cards. */\n/* Single-line rows: one full-width column, one plugin per line. */\n.s657f94_cards {\n display: grid;\n grid-template-columns: 1fr;\n max-width: 100%;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n animation: dshShopCardsIn 220ms ease;\n}\n\n@keyframes dshShopCardsIn {\n from { opacity: 0; transform: translateY(3px); }\n to { opacity: 1; transform: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s657f94_cards { animation: none; }\n}\n\n.s90b416_card {\n position: relative;\n display: flex;\n flex-direction: column;\n /* A grid item's min-width is auto by default: its content would widen the\n * 1fr track past the panel and overflow horizontally. */\n min-width: 0;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n transition: border-color 120ms ease, transform 120ms ease, box-shadow 120ms ease;\n /* Off-screen cards skip layout and paint; the placeholder keeps scrollbar\n * estimation sane before the browser has measured the real height. */\n content-visibility: auto;\n contain-intrinsic-size: auto 140px;\n}\n\n/* The sentinel that triggers the next shelf batch: zero visual footprint. */\n.se89192_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s78e857_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s90b416_card:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l1));\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s90b416_card { transition: none; }\n .s90b416_card:hover { transform: none; }\n}\n\n/* The signature: a spine and cover in the category's own hue. The hues are\n * fixed mid-bright colors that read on both themes; `other` deliberately\n * stays a neutral gray so the fallback category does not compete. */\n.sc62a66_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--spine-hue, #8B8E96);\n}\n\n.s90b416_card[data-category='tool'] { --spine-hue: #4C8DFF; }\n.s90b416_card[data-category='provider'] { --spine-hue: #A78BFA; }\n.s90b416_card[data-category='ui'] { --spine-hue: #2DD4BF; }\n.s90b416_card[data-category='workflow'] { --spine-hue: #F59E0B; }\n.s90b416_card[data-category='integration'] { --spine-hue: #34D399; }\n.s90b416_card[data-category='theme'] { --spine-hue: #F472B6; }\n.s90b416_card[data-category='other'] { --spine-hue: #8B8E96; }\n\n/* The category sits in the badge row as a quiet chip in the category's own\n * hue — the border carries it where the light theme's white layers cannot\n * (the same lesson as the check button). */\n.s6d41ce_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--spine-hue, #8B8E96) 45%, transparent);\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--spine-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.s11b35b_entryHeader {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding: 8px 12px 2px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.s11b35b_entryHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n/* The name fills the row and truncates rather than wraps; the badges stay\n * intact beside it. */\n.s5a68ca_name {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n flex: 1 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--dsw-alias-label-primary);\n}\n\n.sd0808d_badges {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* The action line: buttons side by side; an active install/uninstall flow\n * (gate, log, notices) takes the full width below them. */\n.s93e122_cardActions {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 10px;\n}\n\n.s93e122_cardActions > .s7b41bd_gate,\n.s93e122_cardActions > .sb3c36f_installPanel,\n.s93e122_cardActions > .s826ed0_installedActions {\n flex-basis: 100%;\n}\n\n/* The entry's version, always visible on the card (the expanded detail\n * repeats it in the version row) — the same quiet mono as the toolbar. */\n.sfd496e_cardVersion {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The octocat marking a github-sourced entry, beside its short commit. */\n.s1d84cb_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.saead86_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.saead86_tierBadge[data-tier='verified'] {\n color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);\n}\n\n.saead86_tierBadge[data-tier='verified-stale'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.saead86_tierBadge[data-tier='community'] {\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n border: 1px solid var(--dsw-alias-border-l2);\n}\n\n.s7714f3_incompatibleBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.sf7500f_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s7f59e9_chevron, .s468d75_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s468d75_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .s7f59e9_chevron, .s468d75_chevronOpen { transition: none; }\n}\n\n.s421708_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.sa22f0c_summary {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.s73820f_summaryZh {\n margin: -4px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Expanded cards show the full summary: the clamp is lifted, never raised —\n * a higher number would still truncate the author's text, just later. */\n.s79db5e_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.sdac2ee_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s8de248_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.sfac6f9_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s762128_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sd41253_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.sd41253_capabilities li {\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s98484e_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.sf12b0f_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.sa0f409_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.sa0f409_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa0f409_detailRow dd {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n text-align: right;\n color: var(--dsw-alias-label-primary);\n}\n\n.sa0f409_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.sa0f409_detailRow a:hover {\n text-decoration: underline;\n}\n\n.sa0f409_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The publishing account, beside the npm link. Secondary label colour and a\n * middot separator carry the distinction — never a background fill, which is\n * invisible in the light theme where every bg-layer token is the same white. */\n/* Who published the entry, at the right edge of the action row. `margin-left:\n * auto` is what pushes it there; the row is a wrapping flex, so an active\n * install flow (which claims the full width) drops this to the next line\n * rather than squeezing it. */\n.s2a53e3_author {\n margin-left: auto;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.s621980_reviewedLine {\n margin: 8px 0 0;\n padding: 6px 8px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n font-size: 12px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n/* Install flow. */\n.sb3c36f_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.se8585b_installButton, .s1cb752_confirmButton, .sec9a89_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.se8585b_installButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.se8585b_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s1cb752_confirmButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.s1cb752_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.sec9a89_cancelButton {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n\n.sec9a89_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.se8585b_installButton:focus-visible, .s1cb752_confirmButton:focus-visible, .sec9a89_cancelButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The shelf card of a plugin that is installed and current carries this\n * non-interactive label instead of an install button. Border + text do the\n * work in the light theme, where every bg-layer token resolves to white. */\n.s551790_installedLabel {\n align-self: flex-start;\n margin: 0;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n/* An installed card's controls: the installed label or the update button,\n * plus the uninstall button. The install panel's running/failed states are\n * column layouts and sit as one item of this row. */\n.s826ed0_installedActions {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Uninstall revokes privilege; the quiet outline keeps it from competing\n * with the primary action, and the error tint says \"removes\". */\n.s50d56f_uninstallButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 55%, transparent);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s50d56f_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.s50d56f_uninstallButton:focus-visible {\n outline: 2px solid var(--dsw-alias-state-error-primary);\n outline-offset: 1px;\n}\n\n/* The restart dsh button on a done install: quiet outline, same rank as\n * the other secondary actions. */\n.s597ec2_restartButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s597ec2_restartButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s597ec2_restartButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s7b41bd_gate {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: 8px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n.s66d918_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.scc2a9a_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.se2a11e_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s79f8b8_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.s119f22_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sabb9a6_log {\n max-height: 160px;\n overflow: auto;\n margin: 0;\n padding: 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n list-style: none;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n\n.sd360d1_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s740729_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.s4ee8f5_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.sc182c7_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.scc9f62_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.s2a0305_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* Installed section. */\n.s4df475_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.s58456c_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s5389ae_outdatedRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.s550645_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s550645_outdatedInfo strong {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n word-break: break-all;\n color: var(--dsw-alias-label-primary);\n}\n\n.s309a96_outdatedVersions {\n /* Two inline labels with nothing between them in the markup ran together as\n * `installed v1.0.0latest v2.0.0`: JSX drops the whitespace-only line, and\n * the per-label class the markup asked for was never defined (singular\n * against this rule's plural). The container owns the gap, the same idiom\n * as .sd0808d_badges — the labels need no class of their own. */\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s19db42_outdatedActions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* The enable/disable switch. */\n.s2d0cb1_switch {\n position: relative;\n width: 32px;\n height: 18px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n}\n\n.s57cc7a_switchOn {\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 55%, transparent);\n}\n\n.s1f52fc_switchKnob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--dsw-alias-label-primary);\n transition: transform 120ms ease, background 120ms ease;\n}\n\n.s57cc7a_switchOn .s1f52fc_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.s2d0cb1_switch:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s2d0cb1_switch, .s1f52fc_switchKnob { transition: none; }\n}\n\n/* The hot enable/disable switch on installed rows: the knob button plus the\n * §8 hot-apply / failure notices rendered beside it. */\n.sa8c0e1_switchWrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n";
5283
- if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"2f345eaf\"]")) {
5281
+ //#region \0dsh-plugin-shop-css:e3675a89
5282
+ const css = "/* Shop tab styles — a market shelf inside the settings surface. The visual\n * language is the dsh theme's alias tokens ONLY (the four tokens the previous\n * styles referenced that do not exist — bg-layer-3, interactive-bg-hover,\n * state-error, state-success — are corrected to bg-layer-2 and the\n * state-*-primary set). The signature is the category spine: one HUE per\n * category (seven fixed hues, not the brand token — the brand resolves to\n * near-black in the light theme, so seven brand opacities read as seven\n * shades of gray), with the category name as the cover label in the same hue. Class names are mapped to content-derived names at bundle time\n * (tsdown.s8583e3_client.s942a79_config.s5f67aa_ts) and stubbed in tests; only the keys are relied\n * on.\n *\n * One token rule the theme forces: the background LAYERS do not carry\n * contrast. In the light theme bg-base, bg-layer-1, bg-layer-2 and\n * bg-layer-3 all resolve to the same white; only the dark theme spreads them\n * (950/875/850/800). So a layer-2 fill on a layer-1 ground is invisible for\n * half of all users, and anything whose fill is its ONLY affordance — the\n * loading skeleton, the borderless capability chips — derives its fill from\n * label-primary instead, which inverts with the theme by construction.\n * Elements that also carry a border or text may keep a layer fill.\n * `css-tokens.s8583e3_client.sfd9d8a_spec.s5f67aa_ts` pins this. */\n\n.s255e5a_panel {\n display: flex;\n flex-direction: column;\n gap: 14px;\n /* The shelf never scrolls sideways: a card too wide for its track wraps\n * its badges rather than widening the panel. */\n overflow-x: hidden;\n}\n\n.s44a3ec_stateLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* Visually hidden but screen-reader readable (the loading copy while the\n * skeleton stands in visually). */\n.s3a0ece_srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n border: 0;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n overflow: hidden;\n white-space: nowrap;\n}\n\n/* The loading shelf: ghost cards with the same geometry as the real grid, so\n * the swap to content is a same-shape handoff instead of a jump. */\n.se0c3b4_skeletonGrid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 8px;\n}\n\n.s520416_skeletonCard {\n position: relative;\n display: flex;\n flex-direction: column;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n}\n\n/* The shimmer sweep: one gradient band travels across each ghost card while\n * the bars breathe, so the loading state reads as \"the shelf is scanning\". */\n.s520416_skeletonCard::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(\n 100deg,\n transparent 25%,\n color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent) 50%,\n transparent 75%\n );\n transform: translateX(-100%);\n animation: dshShopSkeletonSweep 1.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n@keyframes dshShopSkeletonSweep {\n to { transform: translateX(100%); }\n}\n\n.s8c7d6f_skeletonName {\n width: 55%;\n height: 14px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sf5179e_skeletonSummary {\n width: 92%;\n height: 12px;\n margin: 10px 12px 0;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.sbb0d25_skeletonSummaryShort {\n width: 68%;\n height: 12px;\n margin: 6px 12px 10px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n/* The ghost of the action line, right where the real buttons land. */\n.s96e910_skeletonActions {\n display: block;\n width: 84px;\n height: 24px;\n margin: 0 12px 10px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);\n}\n\n.s520416_skeletonCard span {\n animation: dshShopSkeletonPulse 1.6s ease-in-out infinite;\n}\n\n@keyframes dshShopSkeletonPulse {\n 0%, 100% { opacity: 0.5; }\n 50% { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s520416_skeletonCard span { animation: none; opacity: 0.75; }\n .s520416_skeletonCard::after { content: none; }\n}\n\n.s73242a_actionButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s73242a_actionButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s73242a_actionButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s646509_toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.s745e3c_toolbarRight {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n/* The shop's own version, right of the search box: `v0.4.4`, plus the\n * update button when the version check found a newer release. */\n.s4fe61f_versionBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sb9b924_versionText {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa04455_updateSelfButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-brand-primary);\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n}\n\n.sa04455_updateSelfButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 20%, transparent);\n}\n\n.sa04455_updateSelfButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The on-demand re-check next to the version number: a quiet pill; the\n * border and text carry it in the light theme where bg layers are white. */\n.s614a38_checkUpdateButton {\n padding: 2px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s614a38_checkUpdateButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n color: var(--dsw-alias-label-primary);\n}\n\n.s614a38_checkUpdateButton:disabled {\n opacity: 0.6;\n cursor: default;\n}\n\n.s614a38_checkUpdateButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The project's GitHub mark, right of the version row: a quiet icon link.\n * The octocat carries itself — color shift on hover, no text, no border. */\n.sa987f7_githubLink {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 3px;\n border-radius: 6px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa987f7_githubLink:hover {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.sa987f7_githubLink:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The self-update's expanded states (running log / done + restart /\n * failure detail) sit under the toolbar, above the category bar. */\n.sb81ba5_selfUpdatePanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 8px;\n}\n\n.s232ec4_searchInput {\n width: min(280px, 100%);\n padding: 6px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n.s232ec4_searchInput:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s1555aa_staleBlock {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.s3946f1_staleBadge {\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n color: var(--dsw-alias-state-warn-primary);\n font-size: 12px;\n}\n\n.sb2c859_categoryBar {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 6px;\n}\n\n.s26d58e_categoryButton {\n padding: 3px 10px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-1);\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n cursor: pointer;\n}\n\n.s26d58e_categoryButton:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l2));\n color: var(--dsw-alias-brand-primary);\n}\n\n.s5f68c4_categoryButtonOn {\n border-color: var(--dsw-alias-brand-primary);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n color: var(--dsw-alias-brand-primary);\n font-weight: 600;\n}\n\n.s26d58e_categoryButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.s668774_catalogHeading {\n margin: 2px 0 0;\n font-size: 16px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-primary);\n}\n\n.sccc4d1_catalogStats {\n margin: 6px 0 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s6de1ab_emptyLine {\n margin: 0;\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n}\n\n/* The shelf: a responsive grid of cards. */\n/* Single-line rows: one full-width column, one plugin per line. */\n.sf657f5_cards {\n display: grid;\n grid-template-columns: 1fr;\n max-width: 100%;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n animation: dshShopCardsIn 220ms ease;\n}\n\n@keyframes dshShopCardsIn {\n from { opacity: 0; transform: translateY(3px); }\n to { opacity: 1; transform: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .sf657f5_cards { animation: none; }\n}\n\n.s65f383_card {\n position: relative;\n display: flex;\n flex-direction: column;\n /* A grid item's min-width is auto by default: its content would widen the\n * 1fr track past the panel and overflow horizontally. */\n min-width: 0;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 10px;\n background: var(--dsw-alias-bg-layer-1);\n overflow: hidden;\n transition: border-color 120ms ease, transform 120ms ease, box-shadow 120ms ease;\n /* Off-screen cards skip layout and paint; the placeholder keeps scrollbar\n * estimation sane before the browser has measured the real height. */\n content-visibility: auto;\n contain-intrinsic-size: auto 140px;\n}\n\n/* The sentinel that triggers the next shelf batch: zero visual footprint. */\n.sd7ee01_cardsSentry {\n height: 1px;\n margin: 0;\n padding: 0;\n}\n\n.s705cc6_showingLine {\n margin: 0;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s65f383_card:hover {\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary) 45%, var(--dsw-alias-border-l1));\n transform: translateY(-1px);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--dsw-alias-brand-primary) 12%, transparent);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s65f383_card { transition: none; }\n .s65f383_card:hover { transform: none; }\n}\n\n/* The signature: a spine and cover in the category's own hue. The hues are\n * fixed mid-bright colors that read on both themes; `other` deliberately\n * stays a neutral gray so the fallback category does not compete. */\n.s4ce25d_cardSpine {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 3px;\n background: var(--spine-hue, #8B8E96);\n}\n\n.s65f383_card[data-category='tool'] { --spine-hue: #4C8DFF; }\n.s65f383_card[data-category='provider'] { --spine-hue: #A78BFA; }\n.s65f383_card[data-category='ui'] { --spine-hue: #2DD4BF; }\n.s65f383_card[data-category='workflow'] { --spine-hue: #F59E0B; }\n.s65f383_card[data-category='integration'] { --spine-hue: #34D399; }\n.s65f383_card[data-category='theme'] { --spine-hue: #F472B6; }\n.s65f383_card[data-category='other'] { --spine-hue: #8B8E96; }\n\n/* The category sits in the badge row as a quiet chip in the category's own\n * hue — the border carries it where the light theme's white layers cannot\n * (the same lesson as the check button). */\n.s9c8eaa_categoryBadge {\n padding: 1px 7px;\n border: 1px solid color-mix(in srgb, var(--spine-hue, #8B8E96) 45%, transparent);\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--spine-hue, #8B8E96);\n white-space: nowrap;\n}\n\n.sa97234_entryHeader {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n min-width: 0;\n padding: 8px 12px 2px;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n}\n\n.sa97234_entryHeader:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: -2px;\n}\n\n/* The name fills the row and truncates rather than wraps; the badges stay\n * intact beside it. */\n.sc3f149_name {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n font-weight: 600;\n flex: 1 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--dsw-alias-label-primary);\n}\n\n.s513026_badges {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n/* The action line: buttons side by side; an active install/uninstall flow\n * (gate, log, notices) takes the full width below them. */\n.s9b5048_cardActions {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px 10px;\n}\n\n.s9b5048_cardActions > .sc4f2ac_gate,\n.s9b5048_cardActions > .s4d374c_installPanel,\n.s9b5048_cardActions > .sf53ca0_installedActions {\n flex-basis: 100%;\n}\n\n/* The entry's version, always visible on the card (the expanded detail\n * repeats it in the version row) — the same quiet mono as the toolbar. */\n.sc6ec6e_cardVersion {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: var(--dsw-alias-label-secondary);\n}\n\n/* The octocat marking a github-sourced entry, beside its short commit. */\n.s71f10f_sourceBadge {\n display: inline-flex;\n align-items: center;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s5e82cb_tierBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 1.6;\n}\n\n.s5e82cb_tierBadge[data-tier='verified'] {\n color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent);\n}\n\n.s5e82cb_tierBadge[data-tier='verified-stale'] {\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.s5e82cb_tierBadge[data-tier='community'] {\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n border: 1px solid var(--dsw-alias-border-l2);\n}\n\n.s4bbe02_incompatibleBadge {\n padding: 1px 7px;\n border-radius: 999px;\n font-size: 11px;\n color: var(--dsw-alias-state-warn-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary) 40%, transparent);\n}\n\n.sff43b4_starsBadge {\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s73f7fb_chevron, .s61393c_chevronOpen {\n color: var(--dsw-alias-label-secondary);\n transition: transform 120ms ease;\n}\n\n.s61393c_chevronOpen { transform: rotate(180deg); }\n\n@media (prefers-reduced-motion: reduce) {\n .s73f7fb_chevron, .s61393c_chevronOpen { transition: none; }\n}\n\n.s820ebf_body {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 0 12px;\n}\n\n.sb8fbc8_summary {\n margin: 0;\n font-size: 13px;\n line-height: 1.5;\n color: var(--dsw-alias-label-primary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.se507db_summaryZh {\n margin: -4px 0 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-label-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* Expanded cards show the full summary: the clamp is lifted, never raised —\n * a higher number would still truncate the author's text, just later. */\n.s10baf0_summaryExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.sb9dba9_summaryZhExpanded {\n -webkit-line-clamp: unset;\n display: block;\n}\n\n.s6eca19_incompatibleDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.5;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s9d2029_capabilitiesBlock {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.s3bdbd5_capabilitiesNote {\n margin: 0;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s441702_capabilities {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s441702_capabilities li {\n padding: 1px 6px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sde3f0c_detail {\n border-top: 1px solid var(--dsw-alias-border-l1);\n padding-top: 8px;\n}\n\n.se98179_detailRows {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin: 0;\n}\n\n.sfb4d2f_detailRow {\n display: flex;\n justify-content: space-between;\n gap: 12px;\n font-size: 12px;\n}\n\n.sfb4d2f_detailRow dt {\n color: var(--dsw-alias-label-secondary);\n}\n\n.sfb4d2f_detailRow dd {\n margin: 0;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n overflow-wrap: anywhere;\n text-align: right;\n color: var(--dsw-alias-label-primary);\n}\n\n.sfb4d2f_detailRow a {\n color: var(--dsw-alias-brand-primary);\n text-decoration: none;\n}\n\n.sfb4d2f_detailRow a:hover {\n text-decoration: underline;\n}\n\n.sfb4d2f_detailRow a:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The publishing account, beside the npm link. Secondary label colour and a\n * middot separator carry the distinction — never a background fill, which is\n * invisible in the light theme where every bg-layer token is the same white. */\n/* Who published the entry, at the right edge of the action row. `margin-left:\n * auto` is what pushes it there; the row is a wrapping flex, so an active\n * install flow (which claims the full width) drops this to the next line\n * rather than squeezing it. */\n.s1ff66f_author {\n margin-left: auto;\n color: var(--dsw-alias-label-secondary);\n font-size: 12px;\n}\n\n.sd58c6d_reviewedLine {\n margin: 8px 0 0;\n padding: 6px 8px;\n border-radius: 6px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);\n font-size: 12px;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n/* Install flow. */\n.s4d374c_installPanel {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 2px;\n}\n\n.se7aaed_installButton, .sb43a49_confirmButton, .s6e45d1_cancelButton {\n align-self: flex-start;\n padding: 5px 14px;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n}\n\n.se7aaed_installButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.se7aaed_installButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.sb43a49_confirmButton {\n border: 1px solid var(--dsw-alias-brand-primary);\n background: var(--dsw-alias-brand-primary);\n color: var(--dsw-alias-bg-base);\n}\n\n.sb43a49_confirmButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary) 88%, var(--dsw-alias-label-primary));\n}\n\n.s6e45d1_cancelButton {\n border: 1px solid var(--dsw-alias-border-l2);\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n}\n\n.s6e45d1_cancelButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.se7aaed_installButton:focus-visible, .sb43a49_confirmButton:focus-visible, .s6e45d1_cancelButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n/* The shelf card of a plugin that is installed and current carries this\n * non-interactive label instead of an install button. Border + text do the\n * work in the light theme, where every bg-layer token resolves to white. */\n.sb6fc74_installedLabel {\n align-self: flex-start;\n margin: 0;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n font-size: 13px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n/* An installed card's controls: the installed label or the update button,\n * plus the uninstall button. The install panel's running/failed states are\n * column layouts and sit as one item of this row. */\n.sf53ca0_installedActions {\n display: flex;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n/* Uninstall revokes privilege; the quiet outline keeps it from competing\n * with the primary action, and the error tint says \"removes\". */\n.s96967f_uninstallButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 55%, transparent);\n border-radius: 6px;\n background: transparent;\n color: var(--dsw-alias-state-error-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s96967f_uninstallButton:hover {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.s96967f_uninstallButton:focus-visible {\n outline: 2px solid var(--dsw-alias-state-error-primary);\n outline-offset: 1px;\n}\n\n/* The restart dsh button on a done install: quiet outline, same rank as\n * the other secondary actions. */\n.s6ac237_restartButton {\n align-self: flex-start;\n padding: 5px 14px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 6px;\n background: var(--dsw-alias-bg-layer-2);\n color: var(--dsw-alias-label-primary);\n font-size: 13px;\n cursor: pointer;\n}\n\n.s6ac237_restartButton:hover {\n border-color: var(--dsw-alias-label-secondary);\n}\n\n.s6ac237_restartButton:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n.sc4f2ac_gate {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px;\n border: 1px solid var(--dsw-alias-state-warn-primary);\n border-radius: 8px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 8%, transparent);\n}\n\n.s559c38_gateTitle {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s3c0ace_gateBody {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.sc323e5_gateWarning {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-state-warn-primary);\n}\n\n.s4b2373_gateActions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.s52b5a5_installing {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.s64ab71_log {\n max-height: 160px;\n overflow: auto;\n margin: 0;\n padding: 8px;\n border-radius: 6px;\n background: var(--dsw-alias-bg-base);\n border: 1px solid var(--dsw-alias-border-l1);\n list-style: none;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n line-height: 1.5;\n}\n\n.s1531a8_logLine {\n white-space: pre-wrap;\n word-break: break-all;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sf20dda_notice {\n margin: 0;\n font-size: 12px;\n color: var(--dsw-alias-state-success-primary);\n}\n\n.seb9b08_failedHeading {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.sfd3021_failedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n.s50ba35_rejectedCode {\n margin: 0;\n font-size: 12px;\n font-weight: 600;\n color: var(--dsw-alias-state-error-primary);\n}\n\n.se75489_rejectedDetail {\n margin: 0;\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary);\n}\n\n/* Installed section. */\n.sa276cf_outdatedSection {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-top: 6px;\n}\n\n.sceae6e_outdatedList {\n display: flex;\n flex-direction: column;\n gap: 8px;\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.s8d2072_outdatedRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n flex-wrap: wrap;\n padding: 10px 12px;\n border: 1px solid var(--dsw-alias-border-l1);\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.s5c2545_outdatedInfo {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.s5c2545_outdatedInfo strong {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 13px;\n word-break: break-all;\n color: var(--dsw-alias-label-primary);\n}\n\n.s877c68_outdatedVersions {\n /* Two inline labels with nothing between them in the markup ran together as\n * `installed v1.0.0latest v2.0.0`: JSX drops the whitespace-only line, and\n * the per-label class the markup asked for was never defined (singular\n * against this rule's plural). The container owns the gap, the same idiom\n * as .s513026_badges — the labels need no class of their own. */\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: var(--dsw-alias-label-secondary);\n}\n\n.sa1f556_outdatedActions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* The enable/disable switch. */\n.s11c019_switch {\n position: relative;\n width: 32px;\n height: 18px;\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n background: var(--dsw-alias-bg-layer-2);\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n}\n\n.s7580e8_switchOn {\n border-color: var(--dsw-alias-state-success-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary) 55%, transparent);\n}\n\n.saab2b3_switchKnob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 12px;\n height: 12px;\n border-radius: 999px;\n background: var(--dsw-alias-label-primary);\n transition: transform 120ms ease, background 120ms ease;\n}\n\n.s7580e8_switchOn .saab2b3_switchKnob {\n transform: translateX(14px);\n background: var(--dsw-alias-bg-base);\n}\n\n.s11c019_switch:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary);\n outline-offset: 1px;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .s11c019_switch, .saab2b3_switchKnob { transition: none; }\n}\n\n/* The hot enable/disable switch on installed rows: the knob button plus the\n * §8 hot-apply / failure notices rendered beside it. */\n.sd9f9e4_switchWrap {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n";
5283
+ if (typeof document !== "undefined" && !document.querySelector("style[data-plugin-css=\"e3675a89\"]")) {
5284
5284
  const tag = document.createElement("style");
5285
- tag.dataset.pluginCss = "2f345eaf";
5285
+ tag.dataset.pluginCss = "e3675a89";
5286
5286
  tag.textContent = css;
5287
5287
  document.head.appendChild(tag);
5288
5288
  }
5289
- var _dsh_plugin_shop_css_2f345eaf_default = {
5290
- "client": "sfaf2a6_client",
5291
- "config": "s6e981b_config",
5292
- "ts": "sbc63d6_ts",
5293
- "spec": "sa97aae_spec",
5294
- "panel": "s2a42f7_panel",
5295
- "stateLine": "se2e700_stateLine",
5296
- "srOnly": "s2bfeb4_srOnly",
5297
- "skeletonGrid": "scc86af_skeletonGrid",
5298
- "skeletonCard": "sb0fddc_skeletonCard",
5299
- "skeletonName": "sbbf61e_skeletonName",
5300
- "skeletonSummary": "s7a9fc3_skeletonSummary",
5301
- "skeletonSummaryShort": "s9e45c7_skeletonSummaryShort",
5302
- "skeletonActions": "s1a1e68_skeletonActions",
5303
- "actionButton": "s483f11_actionButton",
5304
- "toolbar": "s4044cf_toolbar",
5305
- "toolbarRight": "s778557_toolbarRight",
5306
- "versionBlock": "s48434d_versionBlock",
5307
- "versionText": "s627101_versionText",
5308
- "updateSelfButton": "s66e420_updateSelfButton",
5309
- "checkUpdateButton": "s818515_checkUpdateButton",
5310
- "githubLink": "sc445a8_githubLink",
5311
- "selfUpdatePanel": "s90fb4e_selfUpdatePanel",
5312
- "searchInput": "sf703ef_searchInput",
5313
- "staleBlock": "sdf3282_staleBlock",
5314
- "staleBadge": "sa62643_staleBadge",
5315
- "categoryBar": "s2b0297_categoryBar",
5316
- "categoryButton": "s4e4b56_categoryButton",
5317
- "categoryButtonOn": "s1e8b51_categoryButtonOn",
5318
- "catalogHeading": "s2ab934_catalogHeading",
5319
- "catalogStats": "se29170_catalogStats",
5320
- "emptyLine": "s2762eb_emptyLine",
5321
- "cards": "s657f94_cards",
5322
- "card": "s90b416_card",
5323
- "cardsSentry": "se89192_cardsSentry",
5324
- "showingLine": "s78e857_showingLine",
5325
- "cardSpine": "sc62a66_cardSpine",
5326
- "categoryBadge": "s6d41ce_categoryBadge",
5327
- "entryHeader": "s11b35b_entryHeader",
5328
- "name": "s5a68ca_name",
5329
- "badges": "sd0808d_badges",
5330
- "cardActions": "s93e122_cardActions",
5331
- "gate": "s7b41bd_gate",
5332
- "installPanel": "sb3c36f_installPanel",
5333
- "installedActions": "s826ed0_installedActions",
5334
- "cardVersion": "sfd496e_cardVersion",
5335
- "sourceBadge": "s1d84cb_sourceBadge",
5336
- "tierBadge": "saead86_tierBadge",
5337
- "incompatibleBadge": "s7714f3_incompatibleBadge",
5338
- "starsBadge": "sf7500f_starsBadge",
5339
- "chevron": "s7f59e9_chevron",
5340
- "chevronOpen": "s468d75_chevronOpen",
5341
- "body": "s421708_body",
5342
- "summary": "sa22f0c_summary",
5343
- "summaryZh": "s73820f_summaryZh",
5344
- "summaryExpanded": "s79db5e_summaryExpanded",
5345
- "summaryZhExpanded": "sdac2ee_summaryZhExpanded",
5346
- "incompatibleDetail": "s8de248_incompatibleDetail",
5347
- "capabilitiesBlock": "sfac6f9_capabilitiesBlock",
5348
- "capabilitiesNote": "s762128_capabilitiesNote",
5349
- "capabilities": "sd41253_capabilities",
5350
- "detail": "s98484e_detail",
5351
- "detailRows": "sf12b0f_detailRows",
5352
- "detailRow": "sa0f409_detailRow",
5353
- "author": "s2a53e3_author",
5354
- "reviewedLine": "s621980_reviewedLine",
5355
- "installButton": "se8585b_installButton",
5356
- "confirmButton": "s1cb752_confirmButton",
5357
- "cancelButton": "sec9a89_cancelButton",
5358
- "installedLabel": "s551790_installedLabel",
5359
- "uninstallButton": "s50d56f_uninstallButton",
5360
- "restartButton": "s597ec2_restartButton",
5361
- "gateTitle": "s66d918_gateTitle",
5362
- "gateBody": "scc2a9a_gateBody",
5363
- "gateWarning": "se2a11e_gateWarning",
5364
- "gateActions": "s79f8b8_gateActions",
5365
- "installing": "s119f22_installing",
5366
- "log": "sabb9a6_log",
5367
- "logLine": "sd360d1_logLine",
5368
- "notice": "s740729_notice",
5369
- "failedHeading": "s4ee8f5_failedHeading",
5370
- "failedDetail": "sc182c7_failedDetail",
5371
- "rejectedCode": "scc9f62_rejectedCode",
5372
- "rejectedDetail": "s2a0305_rejectedDetail",
5373
- "outdatedSection": "s4df475_outdatedSection",
5374
- "outdatedList": "s58456c_outdatedList",
5375
- "outdatedRow": "s5389ae_outdatedRow",
5376
- "outdatedInfo": "s550645_outdatedInfo",
5377
- "outdatedVersions": "s309a96_outdatedVersions",
5378
- "outdatedActions": "s19db42_outdatedActions",
5379
- "switch": "s2d0cb1_switch",
5380
- "switchOn": "s57cc7a_switchOn",
5381
- "switchKnob": "s1f52fc_switchKnob",
5382
- "switchWrap": "sa8c0e1_switchWrap"
5289
+ var _dsh_plugin_shop_css_e3675a89_default = {
5290
+ "client": "s8583e3_client",
5291
+ "config": "s942a79_config",
5292
+ "ts": "s5f67aa_ts",
5293
+ "spec": "sfd9d8a_spec",
5294
+ "panel": "s255e5a_panel",
5295
+ "stateLine": "s44a3ec_stateLine",
5296
+ "srOnly": "s3a0ece_srOnly",
5297
+ "skeletonGrid": "se0c3b4_skeletonGrid",
5298
+ "skeletonCard": "s520416_skeletonCard",
5299
+ "skeletonName": "s8c7d6f_skeletonName",
5300
+ "skeletonSummary": "sf5179e_skeletonSummary",
5301
+ "skeletonSummaryShort": "sbb0d25_skeletonSummaryShort",
5302
+ "skeletonActions": "s96e910_skeletonActions",
5303
+ "actionButton": "s73242a_actionButton",
5304
+ "toolbar": "s646509_toolbar",
5305
+ "toolbarRight": "s745e3c_toolbarRight",
5306
+ "versionBlock": "s4fe61f_versionBlock",
5307
+ "versionText": "sb9b924_versionText",
5308
+ "updateSelfButton": "sa04455_updateSelfButton",
5309
+ "checkUpdateButton": "s614a38_checkUpdateButton",
5310
+ "githubLink": "sa987f7_githubLink",
5311
+ "selfUpdatePanel": "sb81ba5_selfUpdatePanel",
5312
+ "searchInput": "s232ec4_searchInput",
5313
+ "staleBlock": "s1555aa_staleBlock",
5314
+ "staleBadge": "s3946f1_staleBadge",
5315
+ "categoryBar": "sb2c859_categoryBar",
5316
+ "categoryButton": "s26d58e_categoryButton",
5317
+ "categoryButtonOn": "s5f68c4_categoryButtonOn",
5318
+ "catalogHeading": "s668774_catalogHeading",
5319
+ "catalogStats": "sccc4d1_catalogStats",
5320
+ "emptyLine": "s6de1ab_emptyLine",
5321
+ "cards": "sf657f5_cards",
5322
+ "card": "s65f383_card",
5323
+ "cardsSentry": "sd7ee01_cardsSentry",
5324
+ "showingLine": "s705cc6_showingLine",
5325
+ "cardSpine": "s4ce25d_cardSpine",
5326
+ "categoryBadge": "s9c8eaa_categoryBadge",
5327
+ "entryHeader": "sa97234_entryHeader",
5328
+ "name": "sc3f149_name",
5329
+ "badges": "s513026_badges",
5330
+ "cardActions": "s9b5048_cardActions",
5331
+ "gate": "sc4f2ac_gate",
5332
+ "installPanel": "s4d374c_installPanel",
5333
+ "installedActions": "sf53ca0_installedActions",
5334
+ "cardVersion": "sc6ec6e_cardVersion",
5335
+ "sourceBadge": "s71f10f_sourceBadge",
5336
+ "tierBadge": "s5e82cb_tierBadge",
5337
+ "incompatibleBadge": "s4bbe02_incompatibleBadge",
5338
+ "starsBadge": "sff43b4_starsBadge",
5339
+ "chevron": "s73f7fb_chevron",
5340
+ "chevronOpen": "s61393c_chevronOpen",
5341
+ "body": "s820ebf_body",
5342
+ "summary": "sb8fbc8_summary",
5343
+ "summaryZh": "se507db_summaryZh",
5344
+ "summaryExpanded": "s10baf0_summaryExpanded",
5345
+ "summaryZhExpanded": "sb9dba9_summaryZhExpanded",
5346
+ "incompatibleDetail": "s6eca19_incompatibleDetail",
5347
+ "capabilitiesBlock": "s9d2029_capabilitiesBlock",
5348
+ "capabilitiesNote": "s3bdbd5_capabilitiesNote",
5349
+ "capabilities": "s441702_capabilities",
5350
+ "detail": "sde3f0c_detail",
5351
+ "detailRows": "se98179_detailRows",
5352
+ "detailRow": "sfb4d2f_detailRow",
5353
+ "author": "s1ff66f_author",
5354
+ "reviewedLine": "sd58c6d_reviewedLine",
5355
+ "installButton": "se7aaed_installButton",
5356
+ "confirmButton": "sb43a49_confirmButton",
5357
+ "cancelButton": "s6e45d1_cancelButton",
5358
+ "installedLabel": "sb6fc74_installedLabel",
5359
+ "uninstallButton": "s96967f_uninstallButton",
5360
+ "restartButton": "s6ac237_restartButton",
5361
+ "gateTitle": "s559c38_gateTitle",
5362
+ "gateBody": "s3c0ace_gateBody",
5363
+ "gateWarning": "sc323e5_gateWarning",
5364
+ "gateActions": "s4b2373_gateActions",
5365
+ "installing": "s52b5a5_installing",
5366
+ "log": "s64ab71_log",
5367
+ "logLine": "s1531a8_logLine",
5368
+ "notice": "sf20dda_notice",
5369
+ "failedHeading": "seb9b08_failedHeading",
5370
+ "failedDetail": "sfd3021_failedDetail",
5371
+ "rejectedCode": "s50ba35_rejectedCode",
5372
+ "rejectedDetail": "se75489_rejectedDetail",
5373
+ "outdatedSection": "sa276cf_outdatedSection",
5374
+ "outdatedList": "sceae6e_outdatedList",
5375
+ "outdatedRow": "s8d2072_outdatedRow",
5376
+ "outdatedInfo": "s5c2545_outdatedInfo",
5377
+ "outdatedVersions": "s877c68_outdatedVersions",
5378
+ "outdatedActions": "sa1f556_outdatedActions",
5379
+ "switch": "s11c019_switch",
5380
+ "switchOn": "s7580e8_switchOn",
5381
+ "switchKnob": "saab2b3_switchKnob",
5382
+ "switchWrap": "sd9f9e4_switchWrap"
5383
5383
  };
5384
5384
  //#endregion
5385
5385
  //#region src/client/ShopTab.tsx
@@ -5396,7 +5396,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5396
5396
  width: "14",
5397
5397
  height: "14",
5398
5398
  "aria-hidden": "true",
5399
- className: open ? _dsh_plugin_shop_css_2f345eaf_default.chevronOpen : _dsh_plugin_shop_css_2f345eaf_default.chevron,
5399
+ className: open ? _dsh_plugin_shop_css_e3675a89_default.chevronOpen : _dsh_plugin_shop_css_e3675a89_default.chevron,
5400
5400
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
5401
5401
  fill: "currentColor",
5402
5402
  d: "M3.5 6 8 10.5 12.5 6l1 1L8 12.5 2.5 7l1-1Z"
@@ -5417,32 +5417,32 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5417
5417
  const author = authorOf(entry);
5418
5418
  const category = entry.catalog?.category ?? "other";
5419
5419
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5420
- className: _dsh_plugin_shop_css_2f345eaf_default.card,
5420
+ className: _dsh_plugin_shop_css_e3675a89_default.card,
5421
5421
  "data-shop-entry": entry.name,
5422
5422
  "data-category": category,
5423
5423
  children: [
5424
5424
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5425
- className: _dsh_plugin_shop_css_2f345eaf_default.cardSpine,
5425
+ className: _dsh_plugin_shop_css_e3675a89_default.cardSpine,
5426
5426
  "aria-hidden": "true"
5427
5427
  }),
5428
5428
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
5429
5429
  type: "button",
5430
- className: _dsh_plugin_shop_css_2f345eaf_default.entryHeader,
5430
+ className: _dsh_plugin_shop_css_e3675a89_default.entryHeader,
5431
5431
  "aria-expanded": open,
5432
5432
  "aria-controls": detailId,
5433
5433
  onClick: () => setOpen((current) => !current),
5434
5434
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5435
- className: _dsh_plugin_shop_css_2f345eaf_default.name,
5435
+ className: _dsh_plugin_shop_css_e3675a89_default.name,
5436
5436
  children: entry.name
5437
5437
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5438
- className: _dsh_plugin_shop_css_2f345eaf_default.badges,
5438
+ className: _dsh_plugin_shop_css_e3675a89_default.badges,
5439
5439
  children: [
5440
5440
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5441
- className: _dsh_plugin_shop_css_2f345eaf_default.categoryBadge,
5441
+ className: _dsh_plugin_shop_css_e3675a89_default.categoryBadge,
5442
5442
  children: t(categoryKey(entry))
5443
5443
  }),
5444
5444
  entry.source === "npm" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5445
- className: _dsh_plugin_shop_css_2f345eaf_default.sourceBadge,
5445
+ className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
5446
5446
  "data-shop-source-npm": true,
5447
5447
  role: "img",
5448
5448
  "aria-label": t("npmSource"),
@@ -5459,7 +5459,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5459
5459
  })
5460
5460
  }),
5461
5461
  hasGithubHome(entry) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5462
- className: _dsh_plugin_shop_css_2f345eaf_default.sourceBadge,
5462
+ className: _dsh_plugin_shop_css_e3675a89_default.sourceBadge,
5463
5463
  "data-shop-source-github": true,
5464
5464
  role: "img",
5465
5465
  "aria-label": t("githubSource"),
@@ -5473,23 +5473,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5473
5473
  })
5474
5474
  }),
5475
5475
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5476
- className: _dsh_plugin_shop_css_2f345eaf_default.cardVersion,
5476
+ className: _dsh_plugin_shop_css_e3675a89_default.cardVersion,
5477
5477
  "data-card-version": true,
5478
5478
  children: ["v", displayVersion(entry)]
5479
5479
  }),
5480
5480
  entry.tier !== "community" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5481
- className: _dsh_plugin_shop_css_2f345eaf_default.tierBadge,
5481
+ className: _dsh_plugin_shop_css_e3675a89_default.tierBadge,
5482
5482
  "data-tier": entry.tier,
5483
5483
  children: t(tierKey(entry.tier))
5484
5484
  }),
5485
5485
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5486
- className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleBadge,
5486
+ className: _dsh_plugin_shop_css_e3675a89_default.incompatibleBadge,
5487
5487
  "data-shop-incompatible": true,
5488
5488
  title: t("incompatibleDetail", { modules: missing.join(", ") }),
5489
5489
  children: t("incompatibleBadge")
5490
5490
  }),
5491
5491
  stars !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5492
- className: _dsh_plugin_shop_css_2f345eaf_default.starsBadge,
5492
+ className: _dsh_plugin_shop_css_e3675a89_default.starsBadge,
5493
5493
  role: "img",
5494
5494
  "aria-label": t("stars", { count: stars }),
5495
5495
  children: ["★ ", formatStars(stars)]
@@ -5499,38 +5499,38 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5499
5499
  })]
5500
5500
  }),
5501
5501
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5502
- className: _dsh_plugin_shop_css_2f345eaf_default.body,
5502
+ className: _dsh_plugin_shop_css_e3675a89_default.body,
5503
5503
  children: [
5504
5504
  summary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5505
- className: open ? `${_dsh_plugin_shop_css_2f345eaf_default.summary} ${_dsh_plugin_shop_css_2f345eaf_default.summaryExpanded}` : _dsh_plugin_shop_css_2f345eaf_default.summary,
5505
+ className: open ? `${_dsh_plugin_shop_css_e3675a89_default.summary} ${_dsh_plugin_shop_css_e3675a89_default.summaryExpanded}` : _dsh_plugin_shop_css_e3675a89_default.summary,
5506
5506
  children: summary.en
5507
5507
  }),
5508
5508
  summary?.zh !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5509
- className: open ? `${_dsh_plugin_shop_css_2f345eaf_default.summaryZh} ${_dsh_plugin_shop_css_2f345eaf_default.summaryZhExpanded}` : _dsh_plugin_shop_css_2f345eaf_default.summaryZh,
5509
+ className: open ? `${_dsh_plugin_shop_css_e3675a89_default.summaryZh} ${_dsh_plugin_shop_css_e3675a89_default.summaryZhExpanded}` : _dsh_plugin_shop_css_e3675a89_default.summaryZh,
5510
5510
  children: summary.zh
5511
5511
  }),
5512
5512
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5513
- className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleDetail,
5513
+ className: _dsh_plugin_shop_css_e3675a89_default.incompatibleDetail,
5514
5514
  children: t("incompatibleDetail", { modules: missing.join(", ") })
5515
5515
  }),
5516
5516
  open && entry.catalog !== void 0 && entry.catalog.capabilities.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5517
- className: _dsh_plugin_shop_css_2f345eaf_default.capabilitiesBlock,
5517
+ className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesBlock,
5518
5518
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5519
- className: _dsh_plugin_shop_css_2f345eaf_default.capabilitiesNote,
5519
+ className: _dsh_plugin_shop_css_e3675a89_default.capabilitiesNote,
5520
5520
  children: t("capabilitiesNote")
5521
5521
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
5522
- className: _dsh_plugin_shop_css_2f345eaf_default.capabilities,
5522
+ className: _dsh_plugin_shop_css_e3675a89_default.capabilities,
5523
5523
  children: entry.catalog.capabilities.map((capability) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: capability }, capability))
5524
5524
  })]
5525
5525
  }),
5526
5526
  open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5527
5527
  id: detailId,
5528
- className: _dsh_plugin_shop_css_2f345eaf_default.detail,
5528
+ className: _dsh_plugin_shop_css_e3675a89_default.detail,
5529
5529
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("dl", {
5530
- className: _dsh_plugin_shop_css_2f345eaf_default.detailRows,
5530
+ className: _dsh_plugin_shop_css_e3675a89_default.detailRows,
5531
5531
  children: [
5532
5532
  npmUrl !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5533
- className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
5533
+ className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5534
5534
  "data-shop-npm": true,
5535
5535
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", { children: t("npmPage") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
5536
5536
  href: npmUrl,
@@ -5540,7 +5540,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5540
5540
  }) })]
5541
5541
  }),
5542
5542
  entry.repository !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5543
- className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
5543
+ className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5544
5544
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", { children: t("repository") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: /^https?:\/\//.test(entry.repository) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
5545
5545
  href: entry.repository,
5546
5546
  target: "_blank",
@@ -5549,12 +5549,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5549
5549
  }) : entry.repository })]
5550
5550
  }),
5551
5551
  entry.license !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5552
- className: _dsh_plugin_shop_css_2f345eaf_default.detailRow,
5552
+ className: _dsh_plugin_shop_css_e3675a89_default.detailRow,
5553
5553
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("dt", { children: t("license") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("dd", { children: isCustomLicense(entry.license) ? t("customLicense") : entry.license })]
5554
5554
  })
5555
5555
  ]
5556
5556
  }), entry.tier === "verified-stale" && entry.review !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5557
- className: _dsh_plugin_shop_css_2f345eaf_default.reviewedLine,
5557
+ className: _dsh_plugin_shop_css_e3675a89_default.reviewedLine,
5558
5558
  children: entry.review.reviewedVersion !== void 0 ? t("reviewedVersionLine", {
5559
5559
  reviewed: entry.review.reviewedVersion,
5560
5560
  current: entry.version
@@ -5567,7 +5567,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5567
5567
  ]
5568
5568
  }),
5569
5569
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5570
- className: _dsh_plugin_shop_css_2f345eaf_default.cardActions,
5570
+ className: _dsh_plugin_shop_css_e3675a89_default.cardActions,
5571
5571
  "data-shop-actions": true,
5572
5572
  children: [installed === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(InstallPanel, {
5573
5573
  name: entry.name,
@@ -5592,7 +5592,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5592
5592
  restart,
5593
5593
  restartSupported
5594
5594
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5595
- className: _dsh_plugin_shop_css_2f345eaf_default.installedLabel,
5595
+ className: _dsh_plugin_shop_css_e3675a89_default.installedLabel,
5596
5596
  "data-shop-installed": true,
5597
5597
  children: t("installed")
5598
5598
  }),
@@ -5610,7 +5610,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5610
5610
  restartSupported
5611
5611
  })
5612
5612
  ] }), author !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5613
- className: _dsh_plugin_shop_css_2f345eaf_default.author,
5613
+ className: _dsh_plugin_shop_css_e3675a89_default.author,
5614
5614
  "data-shop-author": true,
5615
5615
  children: t("authorLine", { author })
5616
5616
  })]
@@ -5627,23 +5627,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5627
5627
  const [gateOpen, setGateOpen] = (0, react.useState)(false);
5628
5628
  const { view, start } = useInstall(install, installStatus);
5629
5629
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5630
- className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
5630
+ className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5631
5631
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5632
- className: _dsh_plugin_shop_css_2f345eaf_default.installing,
5632
+ className: _dsh_plugin_shop_css_e3675a89_default.installing,
5633
5633
  children: t("installing")
5634
5634
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5635
- className: _dsh_plugin_shop_css_2f345eaf_default.log,
5635
+ className: _dsh_plugin_shop_css_e3675a89_default.log,
5636
5636
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5637
- className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
5637
+ className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5638
5638
  children: line
5639
5639
  }, index))
5640
5640
  })]
5641
5641
  });
5642
5642
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5643
- className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
5643
+ className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
5644
5644
  children: [
5645
5645
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5646
- className: _dsh_plugin_shop_css_2f345eaf_default.notice,
5646
+ className: _dsh_plugin_shop_css_e3675a89_default.notice,
5647
5647
  "data-shop-restart-notice": true,
5648
5648
  children: view.needsRestart ? t(restartReasonKey(view.restartReason)) : t("installedNoRestartNotice")
5649
5649
  }),
@@ -5652,63 +5652,63 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5652
5652
  restart
5653
5653
  }),
5654
5654
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5655
- className: _dsh_plugin_shop_css_2f345eaf_default.notice,
5655
+ className: _dsh_plugin_shop_css_e3675a89_default.notice,
5656
5656
  "data-shop-restart-disabled": true,
5657
5657
  children: t("restartDisabledNotice")
5658
5658
  })
5659
5659
  ]
5660
5660
  });
5661
5661
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5662
- className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
5662
+ className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5663
5663
  children: [
5664
5664
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5665
- className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
5665
+ className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
5666
5666
  children: t("installFailed")
5667
5667
  }),
5668
5668
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5669
- className: _dsh_plugin_shop_css_2f345eaf_default.log,
5669
+ className: _dsh_plugin_shop_css_e3675a89_default.log,
5670
5670
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5671
- className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
5671
+ className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5672
5672
  children: line
5673
5673
  }, index))
5674
5674
  }),
5675
5675
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5676
- className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
5676
+ className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5677
5677
  children: view.detail === "" ? t("installTransportFailed") : view.detail
5678
5678
  })
5679
5679
  ]
5680
5680
  });
5681
5681
  if (view.kind === "rejected") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5682
- className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
5682
+ className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5683
5683
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5684
- className: _dsh_plugin_shop_css_2f345eaf_default.rejectedCode,
5684
+ className: _dsh_plugin_shop_css_e3675a89_default.rejectedCode,
5685
5685
  children: t(rejectionCodeKey(view.code))
5686
5686
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5687
- className: _dsh_plugin_shop_css_2f345eaf_default.rejectedDetail,
5687
+ className: _dsh_plugin_shop_css_e3675a89_default.rejectedDetail,
5688
5688
  children: view.detail
5689
5689
  })]
5690
5690
  });
5691
5691
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5692
- className: _dsh_plugin_shop_css_2f345eaf_default.gate,
5692
+ className: _dsh_plugin_shop_css_e3675a89_default.gate,
5693
5693
  children: [
5694
5694
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5695
- className: _dsh_plugin_shop_css_2f345eaf_default.gateTitle,
5695
+ className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
5696
5696
  children: t("acknowledgementTitle")
5697
5697
  }),
5698
5698
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5699
- className: _dsh_plugin_shop_css_2f345eaf_default.gateBody,
5699
+ className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
5700
5700
  children: t("acknowledgementBody")
5701
5701
  }),
5702
5702
  missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5703
- className: _dsh_plugin_shop_css_2f345eaf_default.gateWarning,
5703
+ className: _dsh_plugin_shop_css_e3675a89_default.gateWarning,
5704
5704
  "data-shop-incompatible-warning": true,
5705
5705
  children: t("incompatibleInstallWarning", { modules: missing.join(", ") })
5706
5706
  }),
5707
5707
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5708
- className: _dsh_plugin_shop_css_2f345eaf_default.gateActions,
5708
+ className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
5709
5709
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5710
5710
  type: "button",
5711
- className: _dsh_plugin_shop_css_2f345eaf_default.confirmButton,
5711
+ className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
5712
5712
  "data-shop-confirm": true,
5713
5713
  onClick: () => {
5714
5714
  setGateOpen(false);
@@ -5721,7 +5721,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5721
5721
  children: t("confirm")
5722
5722
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5723
5723
  type: "button",
5724
- className: _dsh_plugin_shop_css_2f345eaf_default.cancelButton,
5724
+ className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
5725
5725
  onClick: () => setGateOpen(false),
5726
5726
  children: t("cancel")
5727
5727
  })]
@@ -5731,7 +5731,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5731
5731
  const update = variant === "update";
5732
5732
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5733
5733
  type: "button",
5734
- className: _dsh_plugin_shop_css_2f345eaf_default.installButton,
5734
+ className: _dsh_plugin_shop_css_e3675a89_default.installButton,
5735
5735
  ...update ? { "data-shop-update": true } : { "data-shop-install": true },
5736
5736
  onClick: () => {
5737
5737
  if (tier === "verified") start({
@@ -5753,23 +5753,23 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5753
5753
  function UninstallPanel({ name, t, uninstall, installStatus, restart, restartSupported }) {
5754
5754
  const { view, start } = useUninstall(uninstall, installStatus);
5755
5755
  if (view.kind === "running") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5756
- className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
5756
+ className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5757
5757
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5758
- className: _dsh_plugin_shop_css_2f345eaf_default.installing,
5758
+ className: _dsh_plugin_shop_css_e3675a89_default.installing,
5759
5759
  children: t("uninstalling")
5760
5760
  }), view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5761
- className: _dsh_plugin_shop_css_2f345eaf_default.log,
5761
+ className: _dsh_plugin_shop_css_e3675a89_default.log,
5762
5762
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5763
- className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
5763
+ className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5764
5764
  children: line
5765
5765
  }, index))
5766
5766
  })]
5767
5767
  });
5768
5768
  if (view.kind === "done") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5769
- className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
5769
+ className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
5770
5770
  children: [
5771
5771
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5772
- className: _dsh_plugin_shop_css_2f345eaf_default.notice,
5772
+ className: _dsh_plugin_shop_css_e3675a89_default.notice,
5773
5773
  "data-shop-uninstall-done": true,
5774
5774
  children: view.needsRestart ? t("uninstalledRestartNotice") : t("uninstalledLiveNotice")
5775
5775
  }),
@@ -5778,28 +5778,28 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5778
5778
  restart
5779
5779
  }),
5780
5780
  view.needsRestart && !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5781
- className: _dsh_plugin_shop_css_2f345eaf_default.notice,
5781
+ className: _dsh_plugin_shop_css_e3675a89_default.notice,
5782
5782
  "data-shop-restart-disabled": true,
5783
5783
  children: t("restartDisabledNotice")
5784
5784
  })
5785
5785
  ]
5786
5786
  });
5787
5787
  if (view.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5788
- className: _dsh_plugin_shop_css_2f345eaf_default.installPanel,
5788
+ className: _dsh_plugin_shop_css_e3675a89_default.installPanel,
5789
5789
  children: [
5790
5790
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5791
- className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
5791
+ className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
5792
5792
  children: t("uninstallFailed")
5793
5793
  }),
5794
5794
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5795
- className: _dsh_plugin_shop_css_2f345eaf_default.log,
5795
+ className: _dsh_plugin_shop_css_e3675a89_default.log,
5796
5796
  children: view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5797
- className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
5797
+ className: _dsh_plugin_shop_css_e3675a89_default.logLine,
5798
5798
  children: line
5799
5799
  }, index))
5800
5800
  }),
5801
5801
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5802
- className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
5802
+ className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5803
5803
  children: view.detail === "" ? t("uninstallTransportFailed") : view.detail
5804
5804
  })
5805
5805
  ]
@@ -5807,7 +5807,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5807
5807
  if (view.kind !== "idle") return null;
5808
5808
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5809
5809
  type: "button",
5810
- className: _dsh_plugin_shop_css_2f345eaf_default.uninstallButton,
5810
+ className: _dsh_plugin_shop_css_e3675a89_default.uninstallButton,
5811
5811
  "data-shop-uninstall": true,
5812
5812
  onClick: () => void start({ name }),
5813
5813
  children: t("uninstall")
@@ -5864,37 +5864,37 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5864
5864
  return () => clearInterval(timer);
5865
5865
  }, [state, t]);
5866
5866
  if (state.kind === "restarting") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5867
- className: _dsh_plugin_shop_css_2f345eaf_default.notice,
5867
+ className: _dsh_plugin_shop_css_e3675a89_default.notice,
5868
5868
  "data-shop-restarting": true,
5869
5869
  children: t("restarting")
5870
5870
  });
5871
5871
  if (state.kind === "failed") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5872
- className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
5872
+ className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5873
5873
  "data-shop-restart-error": true,
5874
5874
  children: state.detail
5875
5875
  });
5876
5876
  if (gateOpen) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5877
- className: _dsh_plugin_shop_css_2f345eaf_default.gate,
5877
+ className: _dsh_plugin_shop_css_e3675a89_default.gate,
5878
5878
  children: [
5879
5879
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5880
- className: _dsh_plugin_shop_css_2f345eaf_default.gateTitle,
5880
+ className: _dsh_plugin_shop_css_e3675a89_default.gateTitle,
5881
5881
  children: t("restartTitle")
5882
5882
  }),
5883
5883
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5884
- className: _dsh_plugin_shop_css_2f345eaf_default.gateBody,
5884
+ className: _dsh_plugin_shop_css_e3675a89_default.gateBody,
5885
5885
  children: t("restartBody")
5886
5886
  }),
5887
5887
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5888
- className: _dsh_plugin_shop_css_2f345eaf_default.gateActions,
5888
+ className: _dsh_plugin_shop_css_e3675a89_default.gateActions,
5889
5889
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5890
5890
  type: "button",
5891
- className: _dsh_plugin_shop_css_2f345eaf_default.confirmButton,
5891
+ className: _dsh_plugin_shop_css_e3675a89_default.confirmButton,
5892
5892
  "data-shop-restart-confirm": true,
5893
5893
  onClick: () => void onConfirm(),
5894
5894
  children: t("restartConfirm")
5895
5895
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5896
5896
  type: "button",
5897
- className: _dsh_plugin_shop_css_2f345eaf_default.cancelButton,
5897
+ className: _dsh_plugin_shop_css_e3675a89_default.cancelButton,
5898
5898
  onClick: () => setGateOpen(false),
5899
5899
  children: t("cancel")
5900
5900
  })]
@@ -5903,7 +5903,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5903
5903
  });
5904
5904
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5905
5905
  type: "button",
5906
- className: _dsh_plugin_shop_css_2f345eaf_default.restartButton,
5906
+ className: _dsh_plugin_shop_css_e3675a89_default.restartButton,
5907
5907
  "data-shop-restart": true,
5908
5908
  onClick: () => setGateOpen(true),
5909
5909
  children: t("restart")
@@ -5943,7 +5943,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5943
5943
  }
5944
5944
  };
5945
5945
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5946
- className: _dsh_plugin_shop_css_2f345eaf_default.switchWrap,
5946
+ className: _dsh_plugin_shop_css_e3675a89_default.switchWrap,
5947
5947
  "data-shop-enabled-switch": row.name,
5948
5948
  children: [
5949
5949
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -5952,18 +5952,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5952
5952
  "aria-checked": enabled,
5953
5953
  "aria-label": t("enabledSwitch"),
5954
5954
  "data-shop-toggle": true,
5955
- className: `${_dsh_plugin_shop_css_2f345eaf_default.switch} ${enabled ? _dsh_plugin_shop_css_2f345eaf_default.switchOn : ""}`,
5955
+ className: `${_dsh_plugin_shop_css_e3675a89_default.switch} ${enabled ? _dsh_plugin_shop_css_e3675a89_default.switchOn : ""}`,
5956
5956
  onClick: () => void onToggle(),
5957
5957
  disabled: toggle.kind === "saving",
5958
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.switchKnob })
5958
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.switchKnob })
5959
5959
  }),
5960
5960
  toggle.kind === "saved" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5961
- className: _dsh_plugin_shop_css_2f345eaf_default.notice,
5961
+ className: _dsh_plugin_shop_css_e3675a89_default.notice,
5962
5962
  "data-shop-hot-apply": true,
5963
5963
  children: t("hotApplyNote")
5964
5964
  }),
5965
5965
  toggle.kind === "error" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5966
- className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
5966
+ className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
5967
5967
  "data-shop-toggle-error": true,
5968
5968
  children: toggle.detail
5969
5969
  })
@@ -5975,27 +5975,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
5975
5975
  * install flow for `name@latest`, reusing `InstallPanel`). */
5976
5976
  function OutdatedRow({ row, tier, source, missing, t, setEnabled, install, installStatus, restart, restartSupported }) {
5977
5977
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5978
- className: _dsh_plugin_shop_css_2f345eaf_default.outdatedRow,
5978
+ className: _dsh_plugin_shop_css_e3675a89_default.outdatedRow,
5979
5979
  "data-shop-outdated-entry": row.name,
5980
5980
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5981
- className: _dsh_plugin_shop_css_2f345eaf_default.outdatedInfo,
5981
+ className: _dsh_plugin_shop_css_e3675a89_default.outdatedInfo,
5982
5982
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5983
- className: _dsh_plugin_shop_css_2f345eaf_default.badges,
5983
+ className: _dsh_plugin_shop_css_e3675a89_default.badges,
5984
5984
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5985
- className: _dsh_plugin_shop_css_2f345eaf_default.name,
5985
+ className: _dsh_plugin_shop_css_e3675a89_default.name,
5986
5986
  children: row.name
5987
5987
  }), missing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5988
- className: _dsh_plugin_shop_css_2f345eaf_default.incompatibleBadge,
5988
+ className: _dsh_plugin_shop_css_e3675a89_default.incompatibleBadge,
5989
5989
  "data-shop-incompatible": true,
5990
5990
  title: t("incompatibleUpdateDetail", { modules: missing.join(", ") }),
5991
5991
  children: t("incompatibleBadge")
5992
5992
  })]
5993
5993
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5994
- className: _dsh_plugin_shop_css_2f345eaf_default.outdatedVersions,
5994
+ className: _dsh_plugin_shop_css_e3675a89_default.outdatedVersions,
5995
5995
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("installedVersion", { version: source === "github" ? row.installed.slice(0, 7) : row.installed }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("latestVersion", { version: row.latest }) })]
5996
5996
  })]
5997
5997
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5998
- className: _dsh_plugin_shop_css_2f345eaf_default.outdatedActions,
5998
+ className: _dsh_plugin_shop_css_e3675a89_default.outdatedActions,
5999
5999
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(EnabledSwitch, {
6000
6000
  row,
6001
6001
  t,
@@ -6025,20 +6025,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6025
6025
  function OutdatedSection({ state, tiers, sources, missingByName, t, setEnabled, install, installStatus, restart, restartSupported }) {
6026
6026
  if (state.kind === "loading") return null;
6027
6027
  if (state.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6028
- className: _dsh_plugin_shop_css_2f345eaf_default.stateLine,
6028
+ className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
6029
6029
  "data-shop-outdated-error": true,
6030
6030
  children: t("error")
6031
6031
  });
6032
6032
  const outdated = state.entries.filter((entry) => entry.outdated);
6033
6033
  if (outdated.length === 0) return null;
6034
6034
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6035
- className: _dsh_plugin_shop_css_2f345eaf_default.outdatedSection,
6035
+ className: _dsh_plugin_shop_css_e3675a89_default.outdatedSection,
6036
6036
  "data-shop-outdated": true,
6037
6037
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
6038
- className: _dsh_plugin_shop_css_2f345eaf_default.catalogHeading,
6038
+ className: _dsh_plugin_shop_css_e3675a89_default.catalogHeading,
6039
6039
  children: t("installedSection")
6040
6040
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
6041
- className: _dsh_plugin_shop_css_2f345eaf_default.outdatedList,
6041
+ className: _dsh_plugin_shop_css_e3675a89_default.outdatedList,
6042
6042
  children: outdated.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OutdatedRow, {
6043
6043
  row,
6044
6044
  tier: tiers.get(row.name) ?? "community",
@@ -6211,50 +6211,50 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6211
6211
  return map;
6212
6212
  }, [catalogState]);
6213
6213
  if (catalogState.kind === "loading") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6214
- className: _dsh_plugin_shop_css_2f345eaf_default.panel,
6214
+ className: _dsh_plugin_shop_css_e3675a89_default.panel,
6215
6215
  "data-shop-tab": true,
6216
6216
  "aria-busy": "true",
6217
6217
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6218
- className: _dsh_plugin_shop_css_2f345eaf_default.srOnly,
6218
+ className: _dsh_plugin_shop_css_e3675a89_default.srOnly,
6219
6219
  children: t("loading")
6220
6220
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6221
- className: _dsh_plugin_shop_css_2f345eaf_default.skeletonGrid,
6221
+ className: _dsh_plugin_shop_css_e3675a89_default.skeletonGrid,
6222
6222
  "data-shop-skeleton": true,
6223
6223
  "aria-hidden": "true",
6224
6224
  children: Array.from({ length: 8 }, (_, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6225
- className: _dsh_plugin_shop_css_2f345eaf_default.skeletonCard,
6225
+ className: _dsh_plugin_shop_css_e3675a89_default.skeletonCard,
6226
6226
  children: [
6227
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.skeletonName }),
6228
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.skeletonSummary }),
6229
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.skeletonSummaryShort }),
6230
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_2f345eaf_default.skeletonActions })
6227
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonName }),
6228
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummary }),
6229
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonSummaryShort }),
6230
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: _dsh_plugin_shop_css_e3675a89_default.skeletonActions })
6231
6231
  ]
6232
6232
  }, i))
6233
6233
  })]
6234
6234
  });
6235
6235
  if (catalogState.kind === "error") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6236
- className: _dsh_plugin_shop_css_2f345eaf_default.panel,
6236
+ className: _dsh_plugin_shop_css_e3675a89_default.panel,
6237
6237
  "data-shop-tab": true,
6238
6238
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6239
- className: _dsh_plugin_shop_css_2f345eaf_default.stateLine,
6239
+ className: _dsh_plugin_shop_css_e3675a89_default.stateLine,
6240
6240
  children: t("error")
6241
6241
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6242
6242
  type: "button",
6243
- className: _dsh_plugin_shop_css_2f345eaf_default.actionButton,
6243
+ className: _dsh_plugin_shop_css_e3675a89_default.actionButton,
6244
6244
  onClick: () => setRequest({ kind: "retry" }),
6245
6245
  children: t("retry")
6246
6246
  })]
6247
6247
  });
6248
6248
  const { result } = catalogState;
6249
6249
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6250
- className: _dsh_plugin_shop_css_2f345eaf_default.panel,
6250
+ className: _dsh_plugin_shop_css_e3675a89_default.panel,
6251
6251
  "data-shop-tab": true,
6252
6252
  children: [
6253
6253
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6254
- className: _dsh_plugin_shop_css_2f345eaf_default.toolbar,
6254
+ className: _dsh_plugin_shop_css_e3675a89_default.toolbar,
6255
6255
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
6256
6256
  type: "search",
6257
- className: _dsh_plugin_shop_css_2f345eaf_default.searchInput,
6257
+ className: _dsh_plugin_shop_css_e3675a89_default.searchInput,
6258
6258
  "aria-label": t("search"),
6259
6259
  placeholder: t("search"),
6260
6260
  value: query,
@@ -6263,31 +6263,31 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6263
6263
  setVisibleCount(48);
6264
6264
  }
6265
6265
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6266
- className: _dsh_plugin_shop_css_2f345eaf_default.toolbarRight,
6266
+ className: _dsh_plugin_shop_css_e3675a89_default.toolbarRight,
6267
6267
  children: [
6268
6268
  result.stale && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6269
- className: _dsh_plugin_shop_css_2f345eaf_default.staleBlock,
6269
+ className: _dsh_plugin_shop_css_e3675a89_default.staleBlock,
6270
6270
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6271
- className: _dsh_plugin_shop_css_2f345eaf_default.staleBadge,
6271
+ className: _dsh_plugin_shop_css_e3675a89_default.staleBadge,
6272
6272
  children: t("staleLabel", { date: result.builtAt.slice(0, 10) })
6273
6273
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6274
6274
  type: "button",
6275
- className: _dsh_plugin_shop_css_2f345eaf_default.actionButton,
6275
+ className: _dsh_plugin_shop_css_e3675a89_default.actionButton,
6276
6276
  onClick: () => setRequest({ kind: "refresh" }),
6277
6277
  children: t("refresh")
6278
6278
  })]
6279
6279
  }),
6280
6280
  selfVersion !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6281
- className: _dsh_plugin_shop_css_2f345eaf_default.versionBlock,
6281
+ className: _dsh_plugin_shop_css_e3675a89_default.versionBlock,
6282
6282
  children: [
6283
6283
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6284
- className: _dsh_plugin_shop_css_2f345eaf_default.versionText,
6284
+ className: _dsh_plugin_shop_css_e3675a89_default.versionText,
6285
6285
  "data-shop-version": true,
6286
6286
  children: ["v", selfVersion.installed]
6287
6287
  }),
6288
6288
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6289
6289
  type: "button",
6290
- className: _dsh_plugin_shop_css_2f345eaf_default.checkUpdateButton,
6290
+ className: _dsh_plugin_shop_css_e3675a89_default.checkUpdateButton,
6291
6291
  "data-shop-check-update": true,
6292
6292
  disabled: checkState !== "idle",
6293
6293
  onClick: () => void checkVersion(),
@@ -6295,7 +6295,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6295
6295
  }),
6296
6296
  selfVersion.outdated && selfVersion.latest !== null && selfUpdate.view.kind === "idle" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6297
6297
  type: "button",
6298
- className: _dsh_plugin_shop_css_2f345eaf_default.updateSelfButton,
6298
+ className: _dsh_plugin_shop_css_e3675a89_default.updateSelfButton,
6299
6299
  "data-shop-update-self": true,
6300
6300
  onClick: () => {
6301
6301
  if (selfVersion.latest !== null) selfUpdate.start({ version: selfVersion.latest });
@@ -6305,7 +6305,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6305
6305
  ]
6306
6306
  }),
6307
6307
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
6308
- className: _dsh_plugin_shop_css_2f345eaf_default.githubLink,
6308
+ className: _dsh_plugin_shop_css_e3675a89_default.githubLink,
6309
6309
  href: SHOP_REPO_URL,
6310
6310
  target: "_blank",
6311
6311
  rel: "noopener noreferrer",
@@ -6324,27 +6324,27 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6324
6324
  })]
6325
6325
  }),
6326
6326
  selfUpdate.view.kind === "running" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6327
- className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
6327
+ className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6328
6328
  "data-shop-self-updating": true,
6329
6329
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6330
- className: _dsh_plugin_shop_css_2f345eaf_default.installing,
6330
+ className: _dsh_plugin_shop_css_e3675a89_default.installing,
6331
6331
  children: t("installing")
6332
6332
  }), selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6333
- className: _dsh_plugin_shop_css_2f345eaf_default.log,
6333
+ className: _dsh_plugin_shop_css_e3675a89_default.log,
6334
6334
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6335
- className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
6335
+ className: _dsh_plugin_shop_css_e3675a89_default.logLine,
6336
6336
  children: line
6337
6337
  }, index))
6338
6338
  })]
6339
6339
  }),
6340
6340
  selfUpdate.view.kind === "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6341
- className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
6341
+ className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6342
6342
  "data-shop-self-update-done": true,
6343
6343
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6344
- className: _dsh_plugin_shop_css_2f345eaf_default.installedActions,
6344
+ className: _dsh_plugin_shop_css_e3675a89_default.installedActions,
6345
6345
  children: [
6346
6346
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6347
- className: _dsh_plugin_shop_css_2f345eaf_default.notice,
6347
+ className: _dsh_plugin_shop_css_e3675a89_default.notice,
6348
6348
  children: t("installedRestartNotice")
6349
6349
  }),
6350
6350
  restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RestartPanel, {
@@ -6352,7 +6352,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6352
6352
  restart
6353
6353
  }),
6354
6354
  !restartSupported && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6355
- className: _dsh_plugin_shop_css_2f345eaf_default.notice,
6355
+ className: _dsh_plugin_shop_css_e3675a89_default.notice,
6356
6356
  "data-shop-restart-disabled": true,
6357
6357
  children: t("restartDisabledNotice")
6358
6358
  })
@@ -6360,34 +6360,34 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6360
6360
  })
6361
6361
  }),
6362
6362
  selfUpdate.view.kind === "failed" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6363
- className: _dsh_plugin_shop_css_2f345eaf_default.selfUpdatePanel,
6363
+ className: _dsh_plugin_shop_css_e3675a89_default.selfUpdatePanel,
6364
6364
  "data-shop-self-update-failed": true,
6365
6365
  children: [
6366
6366
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6367
- className: _dsh_plugin_shop_css_2f345eaf_default.failedHeading,
6367
+ className: _dsh_plugin_shop_css_e3675a89_default.failedHeading,
6368
6368
  children: t("updateFailed")
6369
6369
  }),
6370
6370
  selfUpdate.view.log.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6371
- className: _dsh_plugin_shop_css_2f345eaf_default.log,
6371
+ className: _dsh_plugin_shop_css_e3675a89_default.log,
6372
6372
  children: selfUpdate.view.log.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6373
- className: _dsh_plugin_shop_css_2f345eaf_default.logLine,
6373
+ className: _dsh_plugin_shop_css_e3675a89_default.logLine,
6374
6374
  children: line
6375
6375
  }, index))
6376
6376
  }),
6377
6377
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6378
- className: _dsh_plugin_shop_css_2f345eaf_default.failedDetail,
6378
+ className: _dsh_plugin_shop_css_e3675a89_default.failedDetail,
6379
6379
  children: selfUpdate.view.detail === "" ? t("updateTransportFailed") : selfUpdate.view.detail
6380
6380
  })
6381
6381
  ]
6382
6382
  }),
6383
6383
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6384
- className: _dsh_plugin_shop_css_2f345eaf_default.categoryBar,
6384
+ className: _dsh_plugin_shop_css_e3675a89_default.categoryBar,
6385
6385
  role: "group",
6386
6386
  "aria-label": t("catalog"),
6387
6387
  children: [
6388
6388
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6389
6389
  type: "button",
6390
- className: category === null ? `${_dsh_plugin_shop_css_2f345eaf_default.categoryButton} ${_dsh_plugin_shop_css_2f345eaf_default.categoryButtonOn}` : _dsh_plugin_shop_css_2f345eaf_default.categoryButton,
6390
+ className: category === null ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6391
6391
  "aria-pressed": category === null,
6392
6392
  onClick: () => {
6393
6393
  setCategory(null);
@@ -6401,7 +6401,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6401
6401
  }),
6402
6402
  CATEGORY_ORDER.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6403
6403
  type: "button",
6404
- className: category === key ? `${_dsh_plugin_shop_css_2f345eaf_default.categoryButton} ${_dsh_plugin_shop_css_2f345eaf_default.categoryButtonOn}` : _dsh_plugin_shop_css_2f345eaf_default.categoryButton,
6404
+ className: category === key ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6405
6405
  "aria-pressed": category === key,
6406
6406
  onClick: () => {
6407
6407
  setCategory(key);
@@ -6415,7 +6415,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6415
6415
  }, key)),
6416
6416
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6417
6417
  type: "button",
6418
- className: category === "installed" ? `${_dsh_plugin_shop_css_2f345eaf_default.categoryButton} ${_dsh_plugin_shop_css_2f345eaf_default.categoryButtonOn}` : _dsh_plugin_shop_css_2f345eaf_default.categoryButton,
6418
+ className: category === "installed" ? `${_dsh_plugin_shop_css_e3675a89_default.categoryButton} ${_dsh_plugin_shop_css_e3675a89_default.categoryButtonOn}` : _dsh_plugin_shop_css_e3675a89_default.categoryButton,
6419
6419
  "aria-pressed": category === "installed",
6420
6420
  onClick: () => {
6421
6421
  setCategory("installed");
@@ -6430,20 +6430,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6430
6430
  ]
6431
6431
  }),
6432
6432
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6433
- className: _dsh_plugin_shop_css_2f345eaf_default.catalogStats,
6433
+ className: _dsh_plugin_shop_css_e3675a89_default.catalogStats,
6434
6434
  children: t("catalogStats", {
6435
6435
  count: String(result.plugins.length),
6436
6436
  date: result.builtAt.slice(0, 10)
6437
6437
  })
6438
6438
  }),
6439
6439
  result.plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6440
- className: _dsh_plugin_shop_css_2f345eaf_default.emptyLine,
6440
+ className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
6441
6441
  children: t("empty")
6442
6442
  }) : filtered.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6443
- className: _dsh_plugin_shop_css_2f345eaf_default.emptyLine,
6443
+ className: _dsh_plugin_shop_css_e3675a89_default.emptyLine,
6444
6444
  children: t("emptySearch")
6445
6445
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
6446
- className: _dsh_plugin_shop_css_2f345eaf_default.cards,
6446
+ className: _dsh_plugin_shop_css_e3675a89_default.cards,
6447
6447
  children: [visible.map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(EntryCard, {
6448
6448
  entry,
6449
6449
  stars: starsOf(entry, stars),
@@ -6458,12 +6458,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
6458
6458
  setEnabled
6459
6459
  }) }, entryKey(entry))), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
6460
6460
  ref: sentinelRef,
6461
- className: _dsh_plugin_shop_css_2f345eaf_default.cardsSentry,
6461
+ className: _dsh_plugin_shop_css_e3675a89_default.cardsSentry,
6462
6462
  "data-shop-sentry": true,
6463
6463
  "aria-hidden": "true"
6464
6464
  })]
6465
6465
  }), incremental && visibleCount < filtered.length && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6466
- className: _dsh_plugin_shop_css_2f345eaf_default.showingLine,
6466
+ className: _dsh_plugin_shop_css_e3675a89_default.showingLine,
6467
6467
  "aria-live": "polite",
6468
6468
  children: t("showing", {
6469
6469
  shown: String(visibleCount),