dsh-any-background 0.3.2 → 0.3.3

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
@@ -997,6 +997,9 @@ window.__ModuleLoader__.load({
997
997
  * were checked; several rows may share a `channel` when a newer build was
998
998
  * verified as needing no change to that folder's adapter (as `0.1.7-rc.1` was) —
999
999
  * a row then reports `exact` instead of `line`, and no new folder appears.
1000
+ * Rows may ALSO share a patch line while carrying different channels, which is
1001
+ * how a line says "the facts changed halfway through it" (`0.1.7-alpha.2` and
1002
+ * `0.1.7-rc.1` speak for `0.1.7-alpha`, `0.1.7-rc.2` opens `0.1.7-rc`).
1000
1003
  * Adding an ADAPTER means adding a channel plus a folder in
1001
1004
  * `client/host-compat/versions/`. */
1002
1005
  const SUPPORTED_RELEASES = [
@@ -1015,6 +1018,14 @@ window.__ModuleLoader__.load({
1015
1018
  {
1016
1019
  channel: "0.1.7-alpha",
1017
1020
  release: "0.1.7-rc.1"
1021
+ },
1022
+ {
1023
+ channel: "0.1.7-rc",
1024
+ release: "0.1.7-rc.2"
1025
+ },
1026
+ {
1027
+ channel: "0.2.0-rc",
1028
+ release: "0.2.0-rc.1"
1018
1029
  }
1019
1030
  ];
1020
1031
  const UNKNOWN_HOST_INFO = {
@@ -1127,37 +1138,6 @@ window.__ModuleLoader__.load({
1127
1138
  }
1128
1139
  //#endregion
1129
1140
  //#region src/client/host-compat/versions/shared.ts
1130
- /**
1131
- * Selector + declaration vocabulary shared by every per-version adapter.
1132
- *
1133
- * These are the ANCHORS, not the decisions. What varies between releases (which
1134
- * element slides, whether the panel needs promoting, which header slot keys
1135
- * exist) is answered in the version folders; what is stable across all of them
1136
- * lives here so no adapter has to re-type a host selector and get it subtly wrong.
1137
- *
1138
- * Verified against the harness release tags (dsh-v0.1.5-rc.2 … dsh-v0.1.7-rc.1),
1139
- * not inferred:
1140
- * · `[data-sidebar-right-panel]` — emitted by `ui-sidebar-right/shell/SidebarRight.tsx`
1141
- * on every release in range, with values `push` | `fullscreen`.
1142
- * · `[data-dockkit-host]` / `[data-dockkit-empty]` — emitted ONLY by
1143
- * `ui-dockkit/components/TabLayout.tsx`, a file that first appears at
1144
- * 0.1.7-alpha.1. Dockkit itself EXISTS earlier (its `TabMenu` carries
1145
- * `[data-dockkit-tab-menu]` on every release), so only these two attributes
1146
- * are the 0.1.7 marker — never test "is dockkit installed".
1147
- * · `[data-dsh-bottom-panel]` — the optional dsh-better-sidebar workbench, not
1148
- * a host element at all. It is a single element on every release, which is
1149
- * why it needs no version arm.
1150
- * · `[data-plugin-panel]` / `[data-plugin-scope] > ul` — emitted by
1151
- * `ui-plugin-manager/src/client/PluginManagerPage.tsx`. That package is NEW AT
1152
- * 0.1.6-alpha.2: `git ls-tree` shows it absent from 0.1.5-rc.2, 0.1.5-rc.3 and
1153
- * 0.1.6-alpha.1, where the plugin list lived in `ui-settings-plugin-inventory`
1154
- * under `[data-plugin-scope]` alone — no `[data-plugin-panel]`, and no card
1155
- * `ul` in that group either. From alpha.2 on, the group markup (`section` →
1156
- * `div.groupHead` + `ul.cards`) is byte-identical through 0.1.7-rc.1, so the
1157
- * ONE rule below serves all four tags that emit the page.
1158
- *
1159
- * @module
1160
- */
1161
1141
  /** The host's own right Sidebar wrapper. */
1162
1142
  const PANEL_WRAPPER = "[data-sidebar-right-panel]";
1163
1143
  /** The same wrapper in its fullscreen state; the host raises its own z-index to 40. */
@@ -1192,10 +1172,19 @@ window.__ModuleLoader__.load({
1192
1172
  * Which releases emit the page decides who gets this string — see `pluginPageRule`
1193
1173
  * in each version folder.
1194
1174
  *
1175
+ * The card `ul` is matched through TWO scopes. `0.2.0-rc.1` added a first-read
1176
+ * `ListSkeleton` that reuses `.cards` under `section[data-plugin-loading]`, so a
1177
+ * rule keyed on `[data-plugin-scope]` alone would show the real list frosted and
1178
+ * the loading list bare, then re-frost the block when the data lands. Hosts before
1179
+ * that never emit the attribute, so the extra selector is inert rather than a
1180
+ * version branch.
1181
+ *
1195
1182
  * BINDING, and why it is not just "put it in the dialog": the block paints from
1196
1183
  * `--dsh-any-bg-settings-surface` and frosts from `--dsh-any-blur-settings`, i.e.
1197
1184
  * the settings-opacity / settings-blur pair. On 0.1.7 the page is a child of
1198
- * `centerCol`, NOT of the settings dialog, so `SETTINGS_STYLE_RULE`'s token
1185
+ * `centerCol`, NOT of the settings dialog (and from `0.1.7-rc.2` the dialog is a
1186
+ * `createPortal` beside `#root`, so it is further away still), therefore
1187
+ * `SETTINGS_STYLE_RULE`'s token
1199
1188
  * re-scope never reaches it and the list would otherwise follow the homepage card
1200
1189
  * alpha; reading the plugin-owned variables off `:root` puts them under the slider
1201
1190
  * that owns this page. The `var(--dsw-alias-bg-layer-2)` fallback covers the window
@@ -1208,10 +1197,104 @@ window.__ModuleLoader__.load({
1208
1197
  * carries a `plugins.item` slot that third-party plugins fill with their own
1209
1198
  * controls, so a dialog can legitimately open inside the list.
1210
1199
  */
1211
- const PLUGIN_PAGE_FROST_RULE = "[data-plugin-panel] [data-plugin-scope]>ul{position:relative;isolation:isolate;padding:8px;border-radius:14px}[data-plugin-panel] [data-plugin-scope]>ul:has([role=\"dialog\"]){isolation:auto}[data-plugin-panel] [data-plugin-scope]>ul::before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));-webkit-backdrop-filter:var(--dsh-any-blur-settings,none);backdrop-filter:var(--dsh-any-blur-settings,none)}";
1200
+ const PLUGIN_PAGE_FROST_RULE = "[data-plugin-panel] [data-plugin-scope]>ul,[data-plugin-panel] [data-plugin-loading]>ul{position:relative;isolation:isolate;padding:8px;border-radius:14px}[data-plugin-panel] [data-plugin-scope]>ul:has([role=\"dialog\"]),[data-plugin-panel] [data-plugin-loading]>ul:has([role=\"dialog\"]){isolation:auto}[data-plugin-panel] [data-plugin-scope]>ul::before,[data-plugin-panel] [data-plugin-loading]>ul::before{content:\"\";position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));-webkit-backdrop-filter:var(--dsh-any-blur-settings,none);backdrop-filter:var(--dsh-any-blur-settings,none)}";
1201
+ /** The host's own `ui-theme` name for "dropdowns, popovers, suggestion lists", and
1202
+ * the token the plugin has always remapped onto the card slider. Whether it still
1203
+ * reaches a menu's paint is the question `MenuSurfaceFacts` below answers — from
1204
+ * `0.1.7-rc.2` the host aliases it AWAY from the menu layer, so declaring it alone
1205
+ * fades the non-`MenuSurface` overlays and nothing else. */
1206
+ const MENU_FILL_TOKEN = "--dsw-specific-menu";
1207
+ /** Frost by filtering the element itself — the only option where the element is the
1208
+ * thing that paints, and the shape every release up to `0.1.7-rc.1` presents. Both
1209
+ * prefixes because Safari needs the `-webkit-` one and the cascade must not let
1210
+ * them disagree. */
1211
+ function elementFrostDecl(value) {
1212
+ return `-webkit-backdrop-filter:${value};backdrop-filter:${value}`;
1213
+ }
1214
+ /**
1215
+ * ── Where a menu's paint lives ────────────────────────────────────────────────
1216
+ * Verified by reading the emitting source at each tag, not inferred from a changelog.
1217
+ *
1218
+ * `dsh-v0.1.5-rc.2` … `dsh-v0.1.7-rc.1`: the menu ELEMENT paints itself. Its own
1219
+ * CSS module declares `background:var(--dsw-specific-menu)` — 11 files at
1220
+ * 0.1.5-rc.2/rc.3 and 0.1.6-alpha.1/alpha.2, 15 at 0.1.7-alpha.1/alpha.2, 16 at
1221
+ * rc.1 (`Menu`, `MenuView`, `PopupSelectView`, `ModelSelect`, `dockkit` TabMenu,
1222
+ * `stat-dialog`, `QueueDock`, `ContextMeter`, `TodoPanel`, `GoalBar`,
1223
+ * `JobListAction`, `HoverCard`, `ScheduleCatalogAction`, `SubagentHeaderLineage`,
1224
+ * `TeamAction`, `CordisPanel`). One token therefore paints every menu, and
1225
+ * filtering the element is the arm that reaches it.
1226
+ * Frost is a separate, later fact, and worth recording because it changes what
1227
+ * the plugin is doing on the older tags: `--dsw-menu-backdrop-filter` has ZERO
1228
+ * consumers before `0.1.7-alpha.1` (15 there, 16 at rc.1). On `0.1.5`/`0.1.6` the
1229
+ * host frosts no menu at all, so the card/header blur sliders are the only reason
1230
+ * a menu has a frost there — which is why the declaration goes on the element
1231
+ * rather than into a host token the host does not read.
1232
+ *
1233
+ * `dsh-v0.1.7-rc.2` (npm `latest`) and `dsh-v0.2.0-rc.1`: `TabMenu`, `MenuView`,
1234
+ * `PopupSelectView`, `ModelSelect` and `Menu` all render through the new
1235
+ * `ui-primitives/src/MenuSurface.tsx` (byte-identical between the two tags),
1236
+ * which leaves the element unpainted and draws on a `z-index:-1` child instead
1237
+ * (`MenuSurface.module.css` `.material`: `background:var(--dsw-menu-surface-fill)`
1238
+ * + `backdrop-filter:var(--dsw-menu-backdrop-filter)`). The four menu stylesheets
1239
+ * that used to paint the old token (Menu/MenuView/PopupSelectView/dockkit TabMenu)
1240
+ * drop it at rc.2, which is why the painter count goes 16 → 14.
1241
+ * Two consequences, both measured from those files:
1242
+ * · the host FLIPPED ITS ALIAS — `design-platform.css` now declares
1243
+ * `--dsw-specific-menu:var(--dsw-menu-surface-fill)` where every earlier
1244
+ * release declared the reverse. So a plugin that retints only the old token
1245
+ * writes a value nothing on a menu any longer reads, and the card / header
1246
+ * opacity sliders go inert on exactly the surfaces they were built for.
1247
+ * · that child layer exists on purpose: its comment says filtering only the
1248
+ * background "keeps nested menus and fixed overlays free of an ancestor
1249
+ * backdrop root", and the surface sets `isolation:isolate`. Filtering the
1250
+ * element anyway installs the backdrop root the layer was written to avoid.
1251
+ * The frost therefore rides `--dsw-menu-backdrop-filter`, whose consumer set is
1252
+ * the same 14 stylesheets at both tags (stat dialog, queue dock, context meter,
1253
+ * todo panel, goal bar, job list, `HoverCard`, `PickerPopover`/`TaskMenu`/
1254
+ * `ScheduleCatalogAction`, the subagent lineage, `TeamAction`, `CordisPanel`,
1255
+ * `MenuSurface` itself) — re-declaring the token reaches the frost whoever ends up
1256
+ * applying it, and does not depend on any element being the painting element.
1257
+ */
1258
+ /** The answer for the releases whose menus paint themselves: `0.1.5-rc`,
1259
+ * `0.1.6-alpha`, `0.1.7-alpha`. The unresolved bucket is its own variant below. */
1260
+ const LEGACY_MENU_SURFACE = {
1261
+ fillTokens: [MENU_FILL_TOKEN],
1262
+ frostDecl: elementFrostDecl
1263
+ };
1264
+ /** The answer for `0.1.7-rc` (`0.1.7-rc.2` onward) and `0.2.0-rc`. The old token
1265
+ * stays in the list on purpose: 14 surfaces in the same claim set still paint their
1266
+ * fill from it — the lineage tree, `CordisPanel`, the stat dialog, `QueueDock`,
1267
+ * `TodoPanel`, `ContextMeter`, `GoalBar`, `JobListAction`, `HoverCard`, `TeamAction`,
1268
+ * `ModelSelect`'s own card and the schedule trio (`PickerPopover`, `TaskMenu`,
1269
+ * `ScheduleCatalogAction`) — while the shared menus moved to
1270
+ * `--dsw-menu-surface-fill`. Dropping either name fades one half of that set. */
1271
+ const LAYERED_MENU_SURFACE = {
1272
+ fillTokens: [MENU_FILL_TOKEN, "--dsw-menu-surface-fill"],
1273
+ frostDecl: (value) => `--dsw-menu-backdrop-filter:${value}`
1274
+ };
1275
+ /** The answer when the release could not be resolved, and neither of the two
1276
+ * verified shapes can be asserted. Each half is chosen so that being on the
1277
+ * wrong line costs an inert declaration rather than a wrong pixel:
1278
+ * · BOTH fill tokens. A custom property nothing reads costs nothing, so this
1279
+ * half always lands: the fade reaches a self-painting menu through the old
1280
+ * token and a `MenuSurface` layer through the new one.
1281
+ * · the ELEMENT's frost, and not the host's blur token, because on `0.1.5` and
1282
+ * `0.1.6` `--dsw-menu-backdrop-filter` has no consumer at all (verified: zero
1283
+ * files before 0.1.7-alpha.1) — the token arm would leave those hosts with no
1284
+ * menu frost whatsoever, while filtering the element frosts every release.
1285
+ * On a `MenuSurface` host it does not stack: the surface root IS the element
1286
+ * that carries `role="menu"`, so our filter makes it a backdrop root, and the
1287
+ * `z-index:-1` layer inside it then has only the (unpainted) surface to sample
1288
+ * and its own default `blur(40px)` becomes inert. One frost — ours — plus a
1289
+ * `position:relative` element that hosts nested menus the way the layer was
1290
+ * written not to. Accepted for a bucket that by definition cannot know. */
1291
+ const UNRESOLVED_MENU_SURFACE = {
1292
+ fillTokens: LAYERED_MENU_SURFACE.fillTokens,
1293
+ frostDecl: elementFrostDecl
1294
+ };
1212
1295
  /** Session-header slot anchors present on EVERY release in range. The slot
1213
1296
  * renderer stamps `data-slot="<key>"` unconditionally (`ui-renderer/scoped-slots.tsx`),
1214
- * and all five keys are registered from 0.1.5-rc.2 through 0.1.7-rc.1 —
1297
+ * and all five keys are registered from 0.1.5-rc.2 through 0.2.0-rc.1 —
1215
1298
  * verified per tag. Adapters append the keys their own release adds. */
1216
1299
  const BASE_HEADER_SLOT_KEYS = [
1217
1300
  "conversation.session.header",
@@ -1243,22 +1326,31 @@ window.__ModuleLoader__.load({
1243
1326
  * an animated track with its own stacking context, it must be promoted out of it
1244
1327
  * or the filter has no wallpaper to sample.
1245
1328
  *
1329
+ * Menus paint themselves here: 11 stylesheets declare
1330
+ * `background:var(--dsw-specific-menu)` on the element (`Menu`, `MenuView`,
1331
+ * `PopupSelectView`, `stat-dialog`, `ModelSelect`, `JobListAction`, `ContextMeter`,
1332
+ * `ScheduleCatalogAction`, `SubagentHeaderLineage`, `TeamAction`, `CordisPanel`),
1333
+ * and `--dsw-menu-backdrop-filter`
1334
+ * has NO consumer on this line at all — the host frosts no menu, so the element is
1335
+ * both the paint and the only place a frost can go. Hence `LEGACY_MENU_SURFACE`.
1336
+ *
1246
1337
  * @module
1247
1338
  */
1248
1339
  /** The wrapper carries the slide transform on this line, so it carries the blur. */
1249
- function panelFragments$3() {
1340
+ function panelFragments$5() {
1250
1341
  return {
1251
1342
  promotion: `${PANEL_WRAPPER}{position:fixed!important;z-index:26!important}${PANEL_FULLSCREEN}{z-index:40!important}`,
1252
1343
  blur: panelBlurRule(PANEL_WRAPPER)
1253
1344
  };
1254
1345
  }
1255
- function createAdapter$3(host) {
1346
+ function createAdapter$5(host) {
1256
1347
  return {
1257
1348
  id: "0.1.5-rc.2/rc.3",
1258
1349
  channel: "0.1.5-rc",
1259
1350
  host,
1260
- panelFragments: panelFragments$3,
1351
+ panelFragments: panelFragments$5,
1261
1352
  pluginPageRule: "",
1353
+ menus: LEGACY_MENU_SURFACE,
1262
1354
  surface: {
1263
1355
  ownsSidebarGuideSurface: false,
1264
1356
  headerSlotKeys: BASE_HEADER_SLOT_KEYS
@@ -1288,6 +1380,12 @@ window.__ModuleLoader__.load({
1288
1380
  * So the panel mechanics match 0.1.5: the wrapper slides, the wrapper takes the
1289
1381
  * blur, and the wrapper needs promoting.
1290
1382
  *
1383
+ * Menus too — checked separately at both tags, because that is what this folder is
1384
+ * for: 11 stylesheets paint the menu element from `--dsw-specific-menu` on alpha.1
1385
+ * and alpha.2 alike, and `--dsw-menu-backdrop-filter` has no consumer on either, so
1386
+ * `LEGACY_MENU_SURFACE` serves the whole line. The element is both the paint and
1387
+ * the frost's only possible home.
1388
+ *
1291
1389
  * @module
1292
1390
  */
1293
1391
  /** The extra session-header anchor this line introduces: the macOS titlebar work
@@ -1320,19 +1418,20 @@ window.__ModuleLoader__.load({
1320
1418
  const m = /^alpha\.(\d+)$/.exec(pre);
1321
1419
  return m === null || Number(m[1]) >= 2;
1322
1420
  }
1323
- function panelFragments$2() {
1421
+ function panelFragments$4() {
1324
1422
  return {
1325
1423
  promotion: `${PANEL_WRAPPER}{position:fixed!important;z-index:26!important}${PANEL_FULLSCREEN}{z-index:40!important}`,
1326
1424
  blur: panelBlurRule(PANEL_WRAPPER)
1327
1425
  };
1328
1426
  }
1329
- function createAdapter$2(host) {
1427
+ function createAdapter$4(host) {
1330
1428
  return {
1331
1429
  id: "0.1.6-alpha.1/alpha.2",
1332
1430
  channel: "0.1.6-alpha",
1333
1431
  host,
1334
- panelFragments: panelFragments$2,
1432
+ panelFragments: panelFragments$4,
1335
1433
  pluginPageRule: hasPluginManagerPage(host.version) ? PLUGIN_PAGE_FROST_RULE : "",
1434
+ menus: LEGACY_MENU_SURFACE,
1336
1435
  surface: {
1337
1436
  ownsSidebarGuideSurface: true,
1338
1437
  headerSlotKeys: hasLeadingHeaderSlot(host.version) ? [...BASE_HEADER_SLOT_KEYS, "conversation.session.header.leading"] : BASE_HEADER_SLOT_KEYS
@@ -1402,22 +1501,177 @@ window.__ModuleLoader__.load({
1402
1501
  * too. Checked against every use in this plugin: the stroke group is inherited
1403
1502
  * so a second match changes nothing, and the view-card discovery takes the
1404
1503
  * first match, which is still the real flow root. No arm needed.
1504
+ * · menus still paint THEMSELVES on this line — 15 stylesheets declare
1505
+ * `background:var(--dsw-specific-menu)` on the element at alpha.1/alpha.2 and 16
1506
+ * at rc.1, so `LEGACY_MENU_SURFACE` is the answer and the `MenuSurface` child
1507
+ * layer does not exist yet. Worth noting what DID arrive here:
1508
+ * `--dsw-menu-backdrop-filter` goes from zero consumers at 0.1.6-alpha.2 to 15 at
1509
+ * alpha.1 (16 at rc.1), i.e. this is the line where the host started frosting
1510
+ * menus on the element itself. The plugin's own filter sits on the same element
1511
+ * and wins the cascade by sheet order, so the element is still the only place a
1512
+ * frost can go — which is exactly why re-declaring the HOST's token instead
1513
+ * would be inert on this line and correct on the next one.
1405
1514
  *
1406
1515
  * @module
1407
1516
  */
1408
- function panelFragments$1() {
1517
+ function panelFragments$3() {
1409
1518
  return {
1410
1519
  promotion: "",
1411
1520
  blur: panelBlurRule(DOCKKIT_SLIDERS)
1412
1521
  };
1413
1522
  }
1414
- function createAdapter$1(host) {
1523
+ function createAdapter$3(host) {
1415
1524
  return {
1416
1525
  id: "0.1.7-alpha.1/alpha.2/rc.1",
1417
1526
  channel: "0.1.7-alpha",
1418
1527
  host,
1528
+ panelFragments: panelFragments$3,
1529
+ pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1530
+ menus: LEGACY_MENU_SURFACE,
1531
+ surface: {
1532
+ ownsSidebarGuideSurface: true,
1533
+ headerSlotKeys: BASE_HEADER_SLOT_KEYS
1534
+ }
1535
+ };
1536
+ }
1537
+ //#endregion
1538
+ //#region src/client/host-compat/versions/v0-1-7-rc-2/adapter.ts
1539
+ /**
1540
+ * Adapter for the DSH `0.1.7-rc` channel, verified at `0.1.7-rc.2` (npm `latest`).
1541
+ *
1542
+ * Same patch line as `v0-1-7-alpha-1-2-rc-1`, DIFFERENT ANSWERS — which is why this
1543
+ * folder exists at all rather than another row on that one. Everything the alpha
1544
+ * folder says about panel mechanics still holds here (checked by diffing the panel
1545
+ * CSS, dockkit, the slot renderer and the plugin-manager page tag to tag: no anchor
1546
+ * line moved, and `TabLayout.tsx` / `SidebarRight.module.css` are unchanged from
1547
+ * rc.1). What moved is where a MENU gets its paint.
1548
+ *
1549
+ * Two host changes reach this plugin:
1550
+ *
1551
+ * 1. `ui-primitives/src/MenuSurface.tsx` is NEW, and `TabMenu`, `MenuView`,
1552
+ * `PopupSelectView`, `ModelSelect` and `Menu` all render through it. The element
1553
+ * that carries `role="menu"` no longer paints anything: a `z-index:-1` child
1554
+ * layer does, reading `--dsw-menu-surface-fill` for the fill and
1555
+ * `--dsw-menu-backdrop-filter` for the frost. And `design-platform.css` flipped
1556
+ * its alias — `--dsw-specific-menu:var(--dsw-menu-surface-fill)`, where every
1557
+ * earlier release declared it the other way round. Consequence, read off those
1558
+ * two files rather than guessed: retinting `--dsw-specific-menu` alone now fades
1559
+ * nothing on a shared menu, so the card and header opacity sliders go inert on
1560
+ * exactly the surfaces they were built for. `LAYERED_MENU_SURFACE` is the answer.
1561
+ * Filtering the menu element would also have kept working, sort of — but the
1562
+ * child layer's own comment says it exists so that no ANCESTOR becomes a
1563
+ * backdrop root, so that arm stops being offered here.
1564
+ *
1565
+ * 2. `ui-settings-general/src/client/SettingsRoot.tsx` now renders the dialog
1566
+ * through `createPortal`, beside `#root`, instead of inline in the column. It
1567
+ * costs this plugin nothing, recorded so nobody re-derives it:
1568
+ * `SETTINGS_PANEL_SEL` tests the dialog's own identity (its hashed `_panel`
1569
+ * class plus `role`/`aria-modal`/`aria-labelledby`, all unchanged), never an
1570
+ * ancestor, so the retint and the blur land the same way one level higher up.
1571
+ * The one rule that DID care — `PART_BLUR_RULE`'s
1572
+ * `:has([role="dialog"]){isolation:auto}` valve, written because a modal mounted
1573
+ * inside a column kept its z-index local to that column — now never matches, and
1574
+ * that is fine: the modal it existed to release is no longer inside a column
1575
+ * either, so the trap and the valve left together.
1576
+ *
1577
+ * Still `0.1.7` facts, restated for the reader who only opens this folder:
1578
+ * · the panel is a stationary frame; the dockkit children slide, so the blur goes
1579
+ * on the children and nothing is promoted.
1580
+ * · `conversation.session.header.leading` is gone; `--dsw-specific-menu` is a
1581
+ * literal translucent rgba, not an alias of a layer token.
1582
+ * · the shimmer primitive is STILL `data-text-shimmer` (checked: `data-shimmer`
1583
+ * does not exist at this tag) — that rename belongs to 0.2.0.
1584
+ *
1585
+ * @module
1586
+ */
1587
+ function panelFragments$2() {
1588
+ return {
1589
+ promotion: "",
1590
+ blur: panelBlurRule(DOCKKIT_SLIDERS)
1591
+ };
1592
+ }
1593
+ function createAdapter$2(host) {
1594
+ return {
1595
+ id: "0.1.7-rc.2",
1596
+ channel: "0.1.7-rc",
1597
+ host,
1598
+ panelFragments: panelFragments$2,
1599
+ pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1600
+ menus: LAYERED_MENU_SURFACE,
1601
+ surface: {
1602
+ ownsSidebarGuideSurface: true,
1603
+ headerSlotKeys: BASE_HEADER_SLOT_KEYS
1604
+ }
1605
+ };
1606
+ }
1607
+ //#endregion
1608
+ //#region src/client/host-compat/versions/v0-2-0-rc-1/adapter.ts
1609
+ /**
1610
+ * Adapter for the DSH `0.2.0-rc` channel, verified at `0.2.0-rc.1`.
1611
+ *
1612
+ * A new MINOR line, and the panel is not what changed. Checked by reading the
1613
+ * emitting source at the tag rather than a changelog:
1614
+ * · `ui-sidebar-right/src/client/shell/SidebarRight.module.css` is BYTE-IDENTICAL
1615
+ * to `0.1.7-rc.2`, and `ui-primitives/src/MenuSurface.tsx` is byte-identical
1616
+ * too. So the slide owner, the layer variable and where a menu gets its paint
1617
+ * all answer the same as the `0.1.7-rc` folder — nothing below re-derives them.
1618
+ * · the five `conversation.session.header*` slot keys are the same five;
1619
+ * `conversation.session.header.leading` is still deleted.
1620
+ * · `ui-settings-general/SettingsRoot.tsx` is byte-identical, so the settings
1621
+ * dialog is still a body-level `createPortal` and `SETTINGS_PANEL_SEL`'s
1622
+ * identity test still reaches it.
1623
+ * · the boot peer gate (`app-boot/src/plugin-compatibility.ts`,
1624
+ * `compatibility-preflight.ts`) is byte-identical, which is what makes the
1625
+ * manifest change below a HARD requirement rather than metadata: an unlisted
1626
+ * peer version disables the plugin at profile composition and its modules are
1627
+ * never imported.
1628
+ *
1629
+ * What did move, and reaches this plugin:
1630
+ *
1631
+ * 1. `ui-dockkit/components/TabLayout.tsx` clamps a FLOATING pane's `top` with
1632
+ * `max(var(--dsh-dockkit-float-top, 0px), Ypx)`. Only floats: the attributes
1633
+ * this plugin matches, `data-dockkit-host="dock"` and `data-dockkit-empty`,
1634
+ * are on unchanged lines (verified by grep at both tags), so the blur arm
1635
+ * stands as the rc.2 folder wrote it.
1636
+ *
1637
+ * 2. `ui-primitives/src/TextShimmer.tsx` is REWRITTEN. The old primitive set
1638
+ * `data-text-shimmer` and painted the element itself with a clipped gradient
1639
+ * (`background-clip:text` + `-webkit-text-fill-color:transparent`) sized by an
1640
+ * inline `--dsh-text-shimmer-spread`, which no longer exists anywhere in the
1641
+ * repo. The new one marks its root `data-shimmer` and moves the highlight onto
1642
+ * an absolutely-positioned overlay (`.decoration` / `.sweep` / `.highlight`)
1643
+ * tinted by `--dsw-alias-label-shimmer`, so the real glyphs keep their own
1644
+ * color. Consequence for the stroke sliders: the old failure mode — a stroke
1645
+ * repainting transparent-filled glyphs as one flat blob — is gone, but
1646
+ * `-webkit-text-stroke` is still inherited, so the chat stroke would now land
1647
+ * on BOTH the real text and the sweeping copy and double every glyph while it
1648
+ * animates. Progress chrome still is not conversation prose, so the exemption
1649
+ * stays and gains the new attribute (`STROKE_RULE`).
1650
+ * More rows use it now: `ReasoningRow` and `GenericCommandCard` join
1651
+ * `ChatGroupSeat` / `MessageItem` / `RunningStatus` / `DisclosureRow`.
1652
+ *
1653
+ * 3. `ui-plugin-manager` gains a first-read `ListSkeleton`. Its card `ul` carries
1654
+ * the same `.cards` class but sits under `section[data-plugin-loading]`
1655
+ * instead of `section[data-plugin-scope]`, so the shared frost rule had to
1656
+ * grow or the plugin page would show an unfrosted list for the length of the
1657
+ * first read and then re-frost it — see `PLUGIN_PAGE_FROST_RULE`.
1658
+ *
1659
+ * @module
1660
+ */
1661
+ function panelFragments$1() {
1662
+ return {
1663
+ promotion: "",
1664
+ blur: panelBlurRule(DOCKKIT_SLIDERS)
1665
+ };
1666
+ }
1667
+ function createAdapter$1(host) {
1668
+ return {
1669
+ id: "0.2.0-rc.1",
1670
+ channel: "0.2.0-rc",
1671
+ host,
1419
1672
  panelFragments: panelFragments$1,
1420
1673
  pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1674
+ menus: LAYERED_MENU_SURFACE,
1421
1675
  surface: {
1422
1676
  ownsSidebarGuideSurface: true,
1423
1677
  headerSlotKeys: BASE_HEADER_SLOT_KEYS
@@ -1459,6 +1713,7 @@ window.__ModuleLoader__.load({
1459
1713
  host,
1460
1714
  panelFragments,
1461
1715
  pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1716
+ menus: UNRESOLVED_MENU_SURFACE,
1462
1717
  surface: {
1463
1718
  ownsSidebarGuideSurface: false,
1464
1719
  headerSlotKeys: BASE_HEADER_SLOT_KEYS
@@ -1468,9 +1723,11 @@ window.__ModuleLoader__.load({
1468
1723
  //#endregion
1469
1724
  //#region src/client/host-compat/versions/registry.ts
1470
1725
  const ADAPTERS = {
1471
- "0.1.5-rc": createAdapter$3,
1472
- "0.1.6-alpha": createAdapter$2,
1473
- "0.1.7-alpha": createAdapter$1,
1726
+ "0.1.5-rc": createAdapter$5,
1727
+ "0.1.6-alpha": createAdapter$4,
1728
+ "0.1.7-alpha": createAdapter$3,
1729
+ "0.1.7-rc": createAdapter$2,
1730
+ "0.2.0-rc": createAdapter$1,
1474
1731
  unknown: createAdapter
1475
1732
  };
1476
1733
  /** Pick the adapter for a resolved host. `host.channel` is already narrowed to
@@ -3398,7 +3655,7 @@ window.__ModuleLoader__.load({
3398
3655
  }
3399
3656
  try {
3400
3657
  const forceDark = scheme === "dark";
3401
- const key = `${h}|${s}|${l}|${verdict}|${scheme}|${hasColor}`;
3658
+ const key = `${h}|${s}|${l}|${verdict}|${scheme}|${hasColor}|${hostAdapter().menus.fillTokens.join(",")}`;
3402
3659
  if (key !== baseTokenKey) {
3403
3660
  baseTokenKey = key;
3404
3661
  if (forceDark) document.body.setAttribute("data-ds-dark-theme", "dsh-any-background");
@@ -3408,6 +3665,13 @@ window.__ModuleLoader__.load({
3408
3665
  const opVar = OPACITY_VARS[name];
3409
3666
  decls.push(`${name}:${opVar !== void 0 ? `var(${opVar})` : value}!important`);
3410
3667
  }
3668
+ if (tokens["--dsw-specific-menu"] !== void 0) {
3669
+ const menuVar = OPACITY_VARS[MENU_FILL_TOKEN];
3670
+ for (const name of hostAdapter().menus.fillTokens) {
3671
+ if (name === "--dsw-specific-menu" || tokens[name] !== void 0) continue;
3672
+ decls.push(`${name}:var(${menuVar})!important`);
3673
+ }
3674
+ }
3411
3675
  ensureTokenStyle().textContent = `body{${decls.join(";")}}`;
3412
3676
  for (const name of appliedTokenNames) document.body.style.removeProperty(name);
3413
3677
  appliedTokenNames = Object.keys(tokens);
@@ -3433,8 +3697,34 @@ window.__ModuleLoader__.load({
3433
3697
  }
3434
3698
  const SETTINGS_PANEL_SEL = "[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby][class*=\"_panel\"]";
3435
3699
  const SETTINGS_STYLE_RULE = `${SETTINGS_PANEL_SEL}{background:var(--dsh-any-bg-settings-surface,var(--dsw-alias-bg-layer-2));backdrop-filter:var(--dsh-any-blur-settings,none);--dsw-alias-bg-layer-1:var(--dsh-any-bg-settings-layer-1);--dsw-alias-bg-layer-2:var(--dsh-any-bg-settings-layer-2);--dsw-alias-bg-layer-3:var(--dsh-any-bg-settings-layer-3)}${SETTINGS_PANEL_SEL} .dab-card{backdrop-filter:var(--dsh-any-blur-card-panels,none);-webkit-backdrop-filter:var(--dsh-any-blur-card-panels,none)}`;
3700
+ const CARD_BLUR_VAR = "--dsh-any-blur-card-panels";
3701
+ const POPOVER_MENU_SEL = `[role="menu"]:not([data-dockkit-tab-menu])`;
3702
+ const POPOVER_OTHER_SEL = "[role=\"listbox\"],body > [role=\"tree\"],body > [role=\"dialog\"]:not([aria-modal=\"true\"])";
3703
+ /** The frost declaration this release's menus want, driven by the named plugin var.
3704
+ * Every menu-shaped surface group asks through here, so the card group, the header
3705
+ * group and the exemptions can never disagree about which layer to paint. */
3706
+ function menuFrost(blurVar) {
3707
+ return hostAdapter().menus.frostDecl(`var(${blurVar},none)`);
3708
+ }
3709
+ /** Declare EVERY token this release's menus can paint their fill from with the same
3710
+ * value. One slider, one value, every layer reached — and a token the host does not
3711
+ * read is inert, so this is safe to emit on a line that only needs one.
3712
+ *
3713
+ * Used for values that are guaranteed to resolve. Where the value is a `var()` the
3714
+ * caller must first confirm the variable it names is actually set: an undefined
3715
+ * custom property inside `background:var(…)` computes to the guaranteed-invalid
3716
+ * value and the surface goes fully transparent (see the notes on
3717
+ * `applyHeaderPopovers` and `applyExemptDefaults`). */
3718
+ function menuFillDecls(value) {
3719
+ return hostAdapter().menus.fillTokens.map((name) => `${name}:${value}`).join(";");
3720
+ }
3721
+ function popoverBlurRule() {
3722
+ return `${POPOVER_MENU_SEL}{${menuFrost(CARD_BLUR_VAR)}}${POPOVER_OTHER_SEL}{${elementFrostDecl(`var(${CARD_BLUR_VAR},none)`)}}`;
3723
+ }
3436
3724
  const INPUT_FROST_CLASS = "dab-input-frost";
3437
- const INPUT_BLUR_RULE = `.${INPUT_FROST_CLASS} [data-composer-card]{position:relative;isolation:isolate}.${INPUT_FROST_CLASS} [data-composer-card]::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;-webkit-backdrop-filter:var(--dsh-any-input-blur,none);backdrop-filter:var(--dsh-any-input-blur,none)}[data-cordis-panel]{-webkit-backdrop-filter:var(--dsh-any-input-blur,none);backdrop-filter:var(--dsh-any-input-blur,none)}[data-cordis-panel]{--dsw-specific-menu:var(--dsh-any-op-menu-cordis)!important}`;
3725
+ function inputBlurRule() {
3726
+ return `.${INPUT_FROST_CLASS} [data-composer-card]{position:relative;isolation:isolate}.${INPUT_FROST_CLASS} [data-composer-card]::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;border-radius:inherit;-webkit-backdrop-filter:var(--dsh-any-input-blur,none);backdrop-filter:var(--dsh-any-input-blur,none)}[data-cordis-panel]{-webkit-backdrop-filter:var(--dsh-any-input-blur,none);backdrop-filter:var(--dsh-any-input-blur,none)}[data-cordis-panel]{${menuFillDecls("var(--dsh-any-op-menu-cordis)!important")}}`;
3727
+ }
3438
3728
  function applyInputBlur(px) {
3439
3729
  const root = document.documentElement;
3440
3730
  if (px > 0) root.classList.add(INPUT_FROST_CLASS);
@@ -3472,9 +3762,22 @@ window.__ModuleLoader__.load({
3472
3762
  * taking the card blur. `[role]` is a no-op presence test that raises only the
3473
3763
  * tagged arm to (0,2,0); the other three already qualify at (0,2,0)+. */
3474
3764
  const HEADER_SURFACES_PADDED = [`${HEADER_TAG_SELECTOR}[role]`, ...HEADER_SURFACES.slice(1)];
3475
- const HEADER_POPOVER_RULE = `${HEADER_SURFACES_PADDED.join(",")}{-webkit-backdrop-filter:var(--dsh-any-blur-header,none);backdrop-filter:var(--dsh-any-blur-header,none)}`;
3765
+ /** The header blur variable, and the rule that frosts the header's dropdown set.
3766
+ * The declaration comes from the same adapter answer as the card group's menu arm:
3767
+ * every surface in this set paints its skin from the host's own menu-blur token
3768
+ * (`SubagentHeaderLineage.module.css:120` uses a pseudo-element, the stat dialog and
3769
+ * goal bar use their own layer), so handing over the token reaches all of them on
3770
+ * both paint shapes, while filtering the element would install the ancestor
3771
+ * backdrop root each of those files documents avoiding. */
3772
+ const HEADER_BLUR_VAR = "--dsh-any-blur-header";
3773
+ function headerPopoverRule() {
3774
+ return `${HEADER_SURFACES_PADDED.join(",")}{${menuFrost(HEADER_BLUR_VAR)}}`;
3775
+ }
3776
+ function exemptDefaultRule() {
3777
+ return `[role="dialog"][aria-modal="true"]:not([aria-labelledby]){backdrop-filter:none;-webkit-backdrop-filter:none}[role="menu"]:has([class*="_danger"]){${hostAdapter().menus.frostDecl("none")};-webkit-text-stroke-width:0}`;
3778
+ }
3476
3779
  /** Selector the dynamic header token rule targets — the same set as the static
3477
- * HEADER_POPOVER_RULE above, so the two can never drift apart. */
3780
+ * headerPopoverRule above, so the two can never drift apart. */
3478
3781
  const HEADER_TOKEN_SELECTOR = HEADER_SURFACES_PADDED.join(",");
3479
3782
  /** Header-popover surfaces: retint the menu token and (re)write the blur.
3480
3783
  * Mirrors applyProduced: the static rule above never changes, so a drag only
@@ -3487,9 +3790,9 @@ window.__ModuleLoader__.load({
3487
3790
  let opacity = rHeaderOpacity();
3488
3791
  if (opacity < 0) opacity = 0;
3489
3792
  if (opacity > 1) opacity = 1;
3490
- const menu = (paletteTokens() ?? readHostOpacityTokens())?.["--dsw-specific-menu"];
3793
+ const menu = (paletteTokens() ?? readHostOpacityTokens())?.[MENU_FILL_TOKEN];
3491
3794
  const el = ensureHeaderStyle();
3492
- const css = menu === void 0 ? "" : `${HEADER_TOKEN_SELECTOR}{--dsw-specific-menu:${toRgba(menu, opacity)}}`;
3795
+ const css = menu === void 0 ? "" : `${HEADER_TOKEN_SELECTOR}{${menuFillDecls(toRgba(menu, opacity))}}`;
3493
3796
  if (el.textContent !== css) el.textContent = css;
3494
3797
  }
3495
3798
  let headerStyleEl = null;
@@ -3529,7 +3832,8 @@ window.__ModuleLoader__.load({
3529
3832
  add("--dsw-alias-bg-layer-1", source?.["--dsw-alias-bg-layer-1"]);
3530
3833
  add("--dsw-alias-bg-layer-2", source?.["--dsw-alias-bg-layer-2"]);
3531
3834
  add("--dsw-alias-bg-layer-3", source?.["--dsw-alias-bg-layer-3"]);
3532
- add("--dsw-specific-menu", source?.["--dsw-specific-menu"]);
3835
+ const menuColor = source?.[MENU_FILL_TOKEN];
3836
+ for (const name of hostAdapter().menus.fillTokens) add(name, menuColor);
3533
3837
  if (decls.length === 0) {
3534
3838
  if (el.textContent !== "") el.textContent = "";
3535
3839
  return;
@@ -3557,7 +3861,7 @@ window.__ModuleLoader__.load({
3557
3861
  `[data-code-block-content] pre,[data-code-block-content],[data-code-block-banner],[data-composer-chip],:not(pre)>code,[data-changed-files],[data-terminal],[data-read],[data-diff],[data-inspect],[data-turn-trigger],[data-context-injection-body],[data-search],[data-web],[class*="_ioCard"],[style*="--dsh-hover-preview-fade"],${BETTER_SIDEBAR_PANEL}{-webkit-text-stroke:var(--dsh-any-stroke-produced-w,0px) var(--dsh-any-stroke-produced-c,transparent);paint-order:stroke fill}`,
3558
3862
  `${PANEL_SURFACES}{-webkit-text-stroke:var(--dsh-any-stroke-panel-w,0px) var(--dsh-any-stroke-panel-c,transparent);paint-order:stroke fill}`,
3559
3863
  `${HEADER_SURFACES.join(",")}{-webkit-text-stroke:var(--dsh-any-stroke-header-w,0px) var(--dsh-any-stroke-header-c,transparent);paint-order:stroke fill}`,
3560
- "[data-chat-flow] [role=\"status\"],[data-chat-flow] [data-turn-process],[data-chat-flow] [data-text-shimmer],[data-chat-flow] [style*=\"--dsh-text-shimmer-spread\"]{-webkit-text-stroke-width:0!important;paint-order:normal!important}",
3864
+ "[data-chat-flow] [role=\"status\"],[data-chat-flow] [data-turn-process],[data-chat-flow] [data-text-shimmer],[data-chat-flow] [data-shimmer],[data-chat-flow] [style*=\"--dsh-text-shimmer-spread\"]{-webkit-text-stroke-width:0!important;paint-order:normal!important}",
3561
3865
  `svg{-webkit-text-stroke-width:0!important;paint-order:normal!important}`,
3562
3866
  `::placeholder{-webkit-text-stroke-width:0!important}`
3563
3867
  ].join("");
@@ -3774,6 +4078,7 @@ window.__ModuleLoader__.load({
3774
4078
  if (px > 0) document.documentElement.style.setProperty("--dsh-any-blur-panel", `blur(${px}px)`);
3775
4079
  else document.documentElement.style.removeProperty("--dsh-any-blur-panel");
3776
4080
  }
4081
+ const PLACEHOLDER_RULE = "[data-composer-card] textarea::placeholder,[data-composer-card] input::placeholder,[data-composer-card] [contenteditable]::placeholder,[data-cordis-panel] input::placeholder,[data-cordis-panel] textarea::placeholder,.dab-input::placeholder,.dab-input textarea::placeholder,.dab-input input::placeholder{color:var(--dsh-any-placeholder,var(--dsw-alias-label-caption,#8a8f98))!important;font-style:italic;opacity:.85}";
3777
4082
  /** Re-scope one surface group's layer tokens onto plugin-owned variables so a
3778
4083
  * dedicated slider owns its alpha (the host has no per-surface opacity). The
3779
4084
  * settings group additionally retints its dialog surface variable. Always
@@ -3800,6 +4105,7 @@ window.__ModuleLoader__.load({
3800
4105
  function applySettingsOverrides(op) {
3801
4106
  applyLayerOverrides("--dsh-any-bg-settings", op, true);
3802
4107
  }
4108
+ const TRAJECTORY_STYLE_RULE = "[data-conversation-composer-overlay]{--dsw-alias-bg-layer-1:var(--dsh-any-traj-layer-1);--dsw-alias-bg-layer-2:var(--dsh-any-traj-layer-2);--dsw-alias-bg-layer-3:var(--dsh-any-traj-layer-3)}";
3803
4109
  function applyTrajectoryOverrides(op) {
3804
4110
  applyLayerOverrides("--dsh-any-traj", op, false);
3805
4111
  }
@@ -4775,9 +5081,10 @@ window.__ModuleLoader__.load({
4775
5081
  * `wallpaper.ts` — so it is encoded here instead, in one list, with the reason
4776
5082
  * next to each entry.
4777
5083
  *
4778
- * What the release can change lives in one contiguous slot: the panel group
4779
- * (which element carries the frost) and the plugin-manager page (whether this
4780
- * release ships that page at all). Everything outside the slot is host-agnostic by
5084
+ * What the release can change lives in the slots marked below: the panel group
5085
+ * (which element carries the frost), the plugin-manager page (whether this release
5086
+ * ships that page at all), and the menu groups (which token a menu's fill comes
5087
+ * from and whose job its frost is). Everything outside a slot is host-agnostic by
4781
5088
  * construction — it targets attributes every release in range emits.
4782
5089
  *
4783
5090
  * The sheet is rebuilt when the release verdict lands. It has to be: `apply` runs
@@ -4794,19 +5101,25 @@ window.__ModuleLoader__.load({
4794
5101
  /**
4795
5102
  * The order contract. Later entries override earlier ones at equal specificity,
4796
5103
  * which several groups rely on:
4797
- * · HEADER_POPOVER_RULE after POPOVER_BLUR_RULE — a surface moving from the card
5104
+ * · headerPopoverRule() after popoverBlurRule() — a surface moving from the card
4798
5105
  * group to the header group must win, not merely be listed twice.
4799
5106
  * · PRODUCED_RULE / STROKE_RULE after the blur groups — they shield their
4800
5107
  * surfaces from an inherited slider.
4801
- * · EXEMPT_DEFAULT_RULE last of the token groups — an exemption has to land
5108
+ * · exemptDefaultRule() last of the token groups — an exemption has to land
4802
5109
  * after whatever it exempts.
4803
5110
  * · PLACEHOLDER_RULE genuinely last — `::placeholder` resets must survive every
4804
5111
  * group above.
5112
+ *
5113
+ * Three of these are FUNCTIONS, not constants, and they are version slots like
5114
+ * `panel.blur`: which declaration frosts a menu, and which token a menu's fill
5115
+ * comes from, is the current adapter's answer (`adapter.menus`). They stay in
5116
+ * place rather than moving next to the other slots because the contract above is
5117
+ * about position — a slot is only safe if it does not have to relocate.
4805
5118
  */
4806
5119
  function buildStaticStyles() {
4807
5120
  const adapter = rHostAdapter();
4808
5121
  const panel = adapter.panelFragments();
4809
- return DARK_GRADIENT + FRAME_CLEAR_RULE + SETTINGS_STYLE_RULE + "[role=\"menu\"]:not([data-dockkit-tab-menu]),[role=\"listbox\"],body > [role=\"tree\"],body > [role=\"dialog\"]:not([aria-modal=\"true\"]){backdrop-filter:var(--dsh-any-blur-card-panels,none);-webkit-backdrop-filter:var(--dsh-any-blur-card-panels,none)}[data-conversation-composer-overlay]{--dsw-alias-bg-layer-1:var(--dsh-any-traj-layer-1);--dsw-alias-bg-layer-2:var(--dsh-any-traj-layer-2);--dsw-alias-bg-layer-3:var(--dsh-any-traj-layer-3)}" + INPUT_BLUR_RULE + MOBILE_HEADER_RULE + PANEL_TOKEN_RULE + panel.promotion + panel.blur + adapter.pluginPageRule + PRODUCED_RULE + STROKE_RULE + HEADER_POPOVER_RULE + "[role=\"dialog\"][aria-modal=\"true\"]:not([aria-labelledby]){backdrop-filter:none;-webkit-backdrop-filter:none}[role=\"menu\"]:has([class*=\"_danger\"]){backdrop-filter:none;-webkit-backdrop-filter:none;-webkit-text-stroke-width:0}[data-composer-card] textarea::placeholder,[data-composer-card] input::placeholder,[data-composer-card] [contenteditable]::placeholder,[data-cordis-panel] input::placeholder,[data-cordis-panel] textarea::placeholder,.dab-input::placeholder,.dab-input textarea::placeholder,.dab-input input::placeholder{color:var(--dsh-any-placeholder,var(--dsw-alias-label-caption,#8a8f98))!important;font-style:italic;opacity:.85}";
5122
+ return DARK_GRADIENT + FRAME_CLEAR_RULE + SETTINGS_STYLE_RULE + popoverBlurRule() + TRAJECTORY_STYLE_RULE + inputBlurRule() + MOBILE_HEADER_RULE + PANEL_TOKEN_RULE + panel.promotion + panel.blur + adapter.pluginPageRule + PRODUCED_RULE + STROKE_RULE + headerPopoverRule() + exemptDefaultRule() + PLACEHOLDER_RULE;
4810
5123
  }
4811
5124
  /** Append the plugin's stylesheet and keep it matched to the host.
4812
5125
  * Returns a teardown for the plugin's effect scope. */