dsh-any-background 0.3.3 → 0.3.5

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
@@ -56,6 +56,7 @@ window.__ModuleLoader__.load({
56
56
  guideDesc: "管理主题色、壁纸与界面透明度",
57
57
  uiProduced: "产出物/高亮内容",
58
58
  uiHeader: "顶栏选项",
59
+ uiHeaderBar: "标题栏",
59
60
  fontPageTitle: "字体与描边",
60
61
  fontTitle: "自定义字体",
61
62
  fontHint: "支持 ttf/otf/woff/woff2 字体文件(上限 100MB),将应用到整个界面的文字;代码块的等宽字体保持不变。中文字体通常有几十 MB,首次上传与刷新加载需要片刻",
@@ -247,6 +248,7 @@ window.__ModuleLoader__.load({
247
248
  guideDesc: "Theme color, wallpaper and interface opacity in the right sidebar",
248
249
  uiProduced: "Produced / highlights",
249
250
  uiHeader: "Header popovers",
251
+ uiHeaderBar: "Header bar",
250
252
  fontPageTitle: "Font & outline",
251
253
  fontTitle: "Custom font",
252
254
  fontHint: "Accepts ttf/otf/woff/woff2 files (up to 100MB) and applies them to the whole interface; code blocks keep their monospace stack. CJK fonts routinely span tens of MB, so the first upload and each reload take a moment",
@@ -426,7 +428,8 @@ window.__ModuleLoader__.load({
426
428
  input: 30,
427
429
  panel: 30,
428
430
  produced: 30,
429
- header: 30
431
+ header: 30,
432
+ headerBar: 30
430
433
  },
431
434
  strokes: {
432
435
  bg: {
@@ -478,6 +481,11 @@ window.__ModuleLoader__.load({
478
481
  width: 0,
479
482
  color: "auto",
480
483
  customColor: "#808080"
484
+ },
485
+ headerBar: {
486
+ width: 0,
487
+ color: "auto",
488
+ customColor: "#808080"
481
489
  }
482
490
  },
483
491
  settingsOpacity: .5,
@@ -509,6 +517,7 @@ window.__ModuleLoader__.load({
509
517
  panelOpacity: .5,
510
518
  producedOpacity: .5,
511
519
  headerOpacity: .5,
520
+ headerBarOpacity: .5,
512
521
  profiles: [],
513
522
  rotation: {
514
523
  enabled: false,
@@ -649,7 +658,8 @@ window.__ModuleLoader__.load({
649
658
  "input",
650
659
  "panel",
651
660
  "produced",
652
- "header"
661
+ "header",
662
+ "headerBar"
653
663
  ]) {
654
664
  const v = b[k];
655
665
  out[k] = typeof v === "number" ? Math.min(60, Math.max(0, v)) : DEFAULT_CONFIG.blurs[k];
@@ -666,7 +676,8 @@ window.__ModuleLoader__.load({
666
676
  "input",
667
677
  "panel",
668
678
  "produced",
669
- "header"
679
+ "header",
680
+ "headerBar"
670
681
  ];
671
682
  const STROKE_COLOR_KEYS = [
672
683
  "auto",
@@ -718,6 +729,9 @@ window.__ModuleLoader__.load({
718
729
  function rHeaderOpacity() {
719
730
  return clamp01(cfg.headerOpacity, DEFAULT_CONFIG.headerOpacity);
720
731
  }
732
+ function rHeaderBarOpacity() {
733
+ return clamp01(cfg.headerBarOpacity, DEFAULT_CONFIG.headerBarOpacity);
734
+ }
721
735
  function rBgState() {
722
736
  return cfg.bgState;
723
737
  }
@@ -782,7 +796,8 @@ window.__ModuleLoader__.load({
782
796
  trajectoryOpacity: rTrajectoryOpacity(),
783
797
  panelOpacity: rPanelOpacity(),
784
798
  producedOpacity: rProducedOpacity(),
785
- headerOpacity: rHeaderOpacity()
799
+ headerOpacity: rHeaderOpacity(),
800
+ headerBarOpacity: rHeaderBarOpacity()
786
801
  };
787
802
  }
788
803
  /** Apply an appearance snapshot onto cfg (meta fields untouched). */
@@ -805,6 +820,7 @@ window.__ModuleLoader__.load({
805
820
  cfg.panelOpacity = clamp01(ap.panelOpacity, DEFAULT_CONFIG.panelOpacity);
806
821
  cfg.producedOpacity = clamp01(ap.producedOpacity, DEFAULT_CONFIG.producedOpacity);
807
822
  cfg.headerOpacity = clamp01(ap.headerOpacity, DEFAULT_CONFIG.headerOpacity);
823
+ cfg.headerBarOpacity = clamp01(ap.headerBarOpacity, DEFAULT_CONFIG.headerBarOpacity);
808
824
  }
809
825
  const num = (n, def) => typeof n === "number" ? n : def;
810
826
  const cl = (n, lo, hi, def) => typeof n === "number" ? Math.min(hi, Math.max(lo, n)) : def;
@@ -839,7 +855,8 @@ window.__ModuleLoader__.load({
839
855
  trajectoryOpacity: clamp01(ac.trajectoryOpacity, DEFAULT_CONFIG.trajectoryOpacity),
840
856
  panelOpacity: clamp01(ac.panelOpacity, DEFAULT_CONFIG.panelOpacity),
841
857
  producedOpacity: clamp01(ac.producedOpacity, DEFAULT_CONFIG.producedOpacity),
842
- headerOpacity: clamp01(ac.headerOpacity, DEFAULT_CONFIG.headerOpacity)
858
+ headerOpacity: clamp01(ac.headerOpacity, DEFAULT_CONFIG.headerOpacity),
859
+ headerBarOpacity: clamp01(ac.headerBarOpacity, DEFAULT_CONFIG.headerBarOpacity)
843
860
  }
844
861
  });
845
862
  }
@@ -905,7 +922,8 @@ window.__ModuleLoader__.load({
905
922
  "input",
906
923
  "panel",
907
924
  "produced",
908
- "header"
925
+ "header",
926
+ "headerBar"
909
927
  ]) blurs[k] = num(bl[k], DEFAULT_CONFIG.blurs[k]);
910
928
  const bgType = [
911
929
  "video",
@@ -949,6 +967,7 @@ window.__ModuleLoader__.load({
949
967
  panelOpacity: clamp01(c.panelOpacity, DEFAULT_CONFIG.panelOpacity),
950
968
  producedOpacity: clamp01(c.producedOpacity, DEFAULT_CONFIG.producedOpacity),
951
969
  headerOpacity: clamp01(c.headerOpacity, DEFAULT_CONFIG.headerOpacity),
970
+ headerBarOpacity: clamp01(c.headerBarOpacity, DEFAULT_CONFIG.headerBarOpacity),
952
971
  profiles: adoptProfiles(c.profiles),
953
972
  rotation: adoptRotation(c.rotation),
954
973
  schedule: adoptSchedule(c.schedule),
@@ -999,7 +1018,9 @@ window.__ModuleLoader__.load({
999
1018
  * a row then reports `exact` instead of `line`, and no new folder appears.
1000
1019
  * Rows may ALSO share a patch line while carrying different channels, which is
1001
1020
  * 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`).
1021
+ * `0.1.7-rc.1` speak for `0.1.7-alpha`, `0.1.7-rc.2` opens `0.1.7-rc`, and
1022
+ * `0.2.0-rc.2` opens a second answer on a line that had one — see the note on
1023
+ * `HostChannel` for why that row is keyed to the build).
1003
1024
  * Adding an ADAPTER means adding a channel plus a folder in
1004
1025
  * `client/host-compat/versions/`. */
1005
1026
  const SUPPORTED_RELEASES = [
@@ -1026,6 +1047,14 @@ window.__ModuleLoader__.load({
1026
1047
  {
1027
1048
  channel: "0.2.0-rc",
1028
1049
  release: "0.2.0-rc.1"
1050
+ },
1051
+ {
1052
+ channel: "0.2.0-rc.2",
1053
+ release: "0.2.0-rc.2"
1054
+ },
1055
+ {
1056
+ channel: "0.2.1-alpha",
1057
+ release: "0.2.1-alpha.1"
1029
1058
  }
1030
1059
  ];
1031
1060
  const UNKNOWN_HOST_INFO = {
@@ -1148,6 +1177,40 @@ window.__ModuleLoader__.load({
1148
1177
  * PRODUCED slider (0.3.2): a conversation artifact that happens to open in a
1149
1178
  * panel, not a page column — so it fades and frosts with the produced surfaces. */
1150
1179
  const BETTER_SIDEBAR_PANEL = "[data-dsh-bottom-panel]";
1180
+ /** The cards that take the composer seat away from the input bar: approval
1181
+ * (`ui-approval`), plan review and the question composer (`ui-user-questions`).
1182
+ * They are siblings of `[data-composer-card]`, not its children — the seat
1183
+ * renders the elected takeover beside the fallback bar (verified per tag in
1184
+ * `ConversationContent.tsx` and both packages' `slots.inject('conversation.composer')`)
1185
+ * — and each paints the capsule's own `--dsw-specific-input-major`, from
1186
+ * `dsh-v0.1.5-rc.2` through `dsh-v0.2.1-alpha.1`.
1187
+ *
1188
+ * The marker sits on the wrapper, the fill on its child card:
1189
+ * `[data-approval-key] > div`, `[data-plan-review-key] > section`,
1190
+ * `[data-question-key] > section`.
1191
+ *
1192
+ * One more fact these three share, and it is the reason the input-frost
1193
+ * treatment for them lives in a runtime pass instead of a stylesheet rule:
1194
+ * NO release in range declares `position` on any of the three cards (checked
1195
+ * per tag — 0 hits for `position:` in `ApprovalPanel.module.css`,
1196
+ * `PlanReviewPanel.module.css` and `QuestionComposer.module.css`), so unlike
1197
+ * the fallback capsule — whose `.card` is `position:relative` on every tag —
1198
+ * the host does not hand the plugin a containing block to mount a
1199
+ * `z-index:-1` underlay on. Writing that `position` from the plugin's own
1200
+ * stylesheet turns the card's box into a cascade race with anything else that
1201
+ * positions it: a host build that caps the card with a percentage
1202
+ * `max-height` loses its absolute containing block the moment a plugin rule
1203
+ * wins that race, and the whole chain collapses — content outside the card,
1204
+ * buttons off the viewport (dsh-any-background issue #24). The consumer that
1205
+ * needs the containing block (`applyTakeoverFrost`) therefore probes each card
1206
+ * at runtime and only anchors a box whose computed position is `static`; see
1207
+ * `inputBlurRule`. */
1208
+ const COMPOSER_TAKEOVER_CARD = "[data-approval-key]>div,[data-plan-review-key]>section,[data-question-key]>section";
1209
+ /** The takeover cards' free-text answer field — only the question composer has
1210
+ * one (approval and plan review are button rows). Form controls do not inherit
1211
+ * text properties, so the stroke group needs the editor spelled out; appending
1212
+ * a suffix to `COMPOSER_TAKEOVER_CARD` would bind to its LAST arm only. */
1213
+ const COMPOSER_TAKEOVER_EDITOR = "[data-question-key]>section textarea";
1151
1214
  /** Every surface the panel opacity slider owns — the host's own right Sidebar.
1152
1215
  * Layout-neutral token re-scope. (The dsh-better-sidebar workbench used to be
1153
1216
  * listed here; it moved to the produced group, see `PRODUCED_RULE`.) */
@@ -1254,6 +1317,23 @@ window.__ModuleLoader__.load({
1254
1317
  * `ScheduleCatalogAction`, the subagent lineage, `TeamAction`, `CordisPanel`,
1255
1318
  * `MenuSurface` itself) — re-declaring the token reaches the frost whoever ends up
1256
1319
  * applying it, and does not depend on any element being the painting element.
1320
+ *
1321
+ * `dsh-v0.2.0-rc.2` (npm `latest`) and `dsh-v0.2.1-alpha.1`: the layer and the frost
1322
+ * are the same files — `MenuSurface.tsx` and `MenuSurface.module.css` are
1323
+ * byte-identical to rc.1, and every `--dsw-menu-backdrop-filter` consumer is too —
1324
+ * but the sticky GROUP HEADING inside those menus changed owner. Through rc.1 the
1325
+ * only grouped menu was `ModelSelect`, whose own stylesheet painted that heading
1326
+ * from the menu token (`ModelSelect.module.css` `.groupTitle{position:sticky;
1327
+ * background:var(--dsw-specific-menu)}`), so the card slider drove it and a picked
1328
+ * wallpaper color tinted it. At rc.2 the rule is deleted and both grouped popups
1329
+ * (`ModelSelect`, `PopupSelectView`) render the new `ui-primitives/MenuGroup.tsx`,
1330
+ * whose heading stays transparent until `data-stuck` and then paints
1331
+ * `--dsw-alias-menu-group-header-fill` (light `rgba(248,249,250,.94)`, dark
1332
+ * `rgba(48,49,54,.94)`, declared in the `body` blocks of `design-platform.css`).
1333
+ * The surface did not go away — its token was RENAMED, and `ModelSelect.module.css`
1334
+ * is the one `--dsw-specific-menu` consumer that disappears at rc.2. Left alone, it
1335
+ * is the single menu element the fade no longer reaches: an untinted, near-opaque
1336
+ * band sitting on top of every row in the list the moment that list scrolls.
1257
1337
  */
1258
1338
  /** The answer for the releases whose menus paint themselves: `0.1.5-rc`,
1259
1339
  * `0.1.6-alpha`, `0.1.7-alpha`. The unresolved bucket is its own variant below. */
@@ -1272,6 +1352,28 @@ window.__ModuleLoader__.load({
1272
1352
  fillTokens: [MENU_FILL_TOKEN, "--dsw-menu-surface-fill"],
1273
1353
  frostDecl: (value) => `--dsw-menu-backdrop-filter:${value}`
1274
1354
  };
1355
+ /** The fill the sticky group heading of a shared menu paints from — `MenuGroup`'s
1356
+ * own contribution to the menu's look, first emitted at `0.2.0-rc.2`. */
1357
+ const MENU_GROUP_HEADER_FILL_TOKEN = "--dsw-alias-menu-group-header-fill";
1358
+ /** The answer for `0.2.0-rc` from `0.2.0-rc.2` and for `0.2.1-alpha`: everything
1359
+ * `LAYERED_MENU_SURFACE` says, plus the heading `MenuGroup` renamed.
1360
+ *
1361
+ * Riding `fillTokens` rather than being left out is a decision with evidence on
1362
+ * both sides, so state it: the host's README calls this token "independent of the
1363
+ * menu material" and gives it a 94% fill while the surface layer sits at 58%/45%.
1364
+ * That is a choice about an OPAQUE menu. This plugin's whole product is a menu the
1365
+ * wallpaper shows through, and one release earlier the very same heading read the
1366
+ * very same token as the card it sits on — so following it keeps rc.1's contract
1367
+ * ("the card slider owns every layer of a menu, in the picked color") instead of
1368
+ * leaving an untinted stock band inside a tinted, faded card.
1369
+ * Compositing is on its side too: the heading stacks on the surface layer it sticks
1370
+ * to, so a heading and a card at the same alpha still read as a band roughly
1371
+ * twice-as-dense as the card (1-(1-a)²) — occluding, at the slider's level, exactly
1372
+ * as it did when both came from one token. */
1373
+ const LAYERED_MENU_SURFACE_WITH_GROUP_HEADER = {
1374
+ fillTokens: [...LAYERED_MENU_SURFACE.fillTokens, MENU_GROUP_HEADER_FILL_TOKEN],
1375
+ frostDecl: LAYERED_MENU_SURFACE.frostDecl
1376
+ };
1275
1377
  /** The answer when the release could not be resolved, and neither of the two
1276
1378
  * verified shapes can be asserted. Each half is chosen so that being on the
1277
1379
  * wrong line costs an inert declaration rather than a wrong pixel:
@@ -1294,7 +1396,7 @@ window.__ModuleLoader__.load({
1294
1396
  };
1295
1397
  /** Session-header slot anchors present on EVERY release in range. The slot
1296
1398
  * renderer stamps `data-slot="<key>"` unconditionally (`ui-renderer/scoped-slots.tsx`),
1297
- * and all five keys are registered from 0.1.5-rc.2 through 0.2.0-rc.1 —
1399
+ * and all five keys are registered from 0.1.5-rc.2 through 0.2.1-alpha.1 —
1298
1400
  * verified per tag. Adapters append the keys their own release adds. */
1299
1401
  const BASE_HEADER_SLOT_KEYS = [
1300
1402
  "conversation.session.header",
@@ -1337,18 +1439,18 @@ window.__ModuleLoader__.load({
1337
1439
  * @module
1338
1440
  */
1339
1441
  /** The wrapper carries the slide transform on this line, so it carries the blur. */
1340
- function panelFragments$5() {
1442
+ function panelFragments$7() {
1341
1443
  return {
1342
1444
  promotion: `${PANEL_WRAPPER}{position:fixed!important;z-index:26!important}${PANEL_FULLSCREEN}{z-index:40!important}`,
1343
1445
  blur: panelBlurRule(PANEL_WRAPPER)
1344
1446
  };
1345
1447
  }
1346
- function createAdapter$5(host) {
1448
+ function createAdapter$7(host) {
1347
1449
  return {
1348
1450
  id: "0.1.5-rc.2/rc.3",
1349
1451
  channel: "0.1.5-rc",
1350
1452
  host,
1351
- panelFragments: panelFragments$5,
1453
+ panelFragments: panelFragments$7,
1352
1454
  pluginPageRule: "",
1353
1455
  menus: LEGACY_MENU_SURFACE,
1354
1456
  surface: {
@@ -1418,18 +1520,18 @@ window.__ModuleLoader__.load({
1418
1520
  const m = /^alpha\.(\d+)$/.exec(pre);
1419
1521
  return m === null || Number(m[1]) >= 2;
1420
1522
  }
1421
- function panelFragments$4() {
1523
+ function panelFragments$6() {
1422
1524
  return {
1423
1525
  promotion: `${PANEL_WRAPPER}{position:fixed!important;z-index:26!important}${PANEL_FULLSCREEN}{z-index:40!important}`,
1424
1526
  blur: panelBlurRule(PANEL_WRAPPER)
1425
1527
  };
1426
1528
  }
1427
- function createAdapter$4(host) {
1529
+ function createAdapter$6(host) {
1428
1530
  return {
1429
1531
  id: "0.1.6-alpha.1/alpha.2",
1430
1532
  channel: "0.1.6-alpha",
1431
1533
  host,
1432
- panelFragments: panelFragments$4,
1534
+ panelFragments: panelFragments$6,
1433
1535
  pluginPageRule: hasPluginManagerPage(host.version) ? PLUGIN_PAGE_FROST_RULE : "",
1434
1536
  menus: LEGACY_MENU_SURFACE,
1435
1537
  surface: {
@@ -1514,18 +1616,18 @@ window.__ModuleLoader__.load({
1514
1616
  *
1515
1617
  * @module
1516
1618
  */
1517
- function panelFragments$3() {
1619
+ function panelFragments$5() {
1518
1620
  return {
1519
1621
  promotion: "",
1520
1622
  blur: panelBlurRule(DOCKKIT_SLIDERS)
1521
1623
  };
1522
1624
  }
1523
- function createAdapter$3(host) {
1625
+ function createAdapter$5(host) {
1524
1626
  return {
1525
1627
  id: "0.1.7-alpha.1/alpha.2/rc.1",
1526
1628
  channel: "0.1.7-alpha",
1527
1629
  host,
1528
- panelFragments: panelFragments$3,
1630
+ panelFragments: panelFragments$5,
1529
1631
  pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1530
1632
  menus: LEGACY_MENU_SURFACE,
1531
1633
  surface: {
@@ -1584,18 +1686,18 @@ window.__ModuleLoader__.load({
1584
1686
  *
1585
1687
  * @module
1586
1688
  */
1587
- function panelFragments$2() {
1689
+ function panelFragments$4() {
1588
1690
  return {
1589
1691
  promotion: "",
1590
1692
  blur: panelBlurRule(DOCKKIT_SLIDERS)
1591
1693
  };
1592
1694
  }
1593
- function createAdapter$2(host) {
1695
+ function createAdapter$4(host) {
1594
1696
  return {
1595
1697
  id: "0.1.7-rc.2",
1596
1698
  channel: "0.1.7-rc",
1597
1699
  host,
1598
- panelFragments: panelFragments$2,
1700
+ panelFragments: panelFragments$4,
1599
1701
  pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1600
1702
  menus: LAYERED_MENU_SURFACE,
1601
1703
  surface: {
@@ -1658,18 +1760,18 @@ window.__ModuleLoader__.load({
1658
1760
  *
1659
1761
  * @module
1660
1762
  */
1661
- function panelFragments$1() {
1763
+ function panelFragments$3() {
1662
1764
  return {
1663
1765
  promotion: "",
1664
1766
  blur: panelBlurRule(DOCKKIT_SLIDERS)
1665
1767
  };
1666
1768
  }
1667
- function createAdapter$1(host) {
1769
+ function createAdapter$3(host) {
1668
1770
  return {
1669
1771
  id: "0.2.0-rc.1",
1670
1772
  channel: "0.2.0-rc",
1671
1773
  host,
1672
- panelFragments: panelFragments$1,
1774
+ panelFragments: panelFragments$3,
1673
1775
  pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1674
1776
  menus: LAYERED_MENU_SURFACE,
1675
1777
  surface: {
@@ -1679,6 +1781,144 @@ window.__ModuleLoader__.load({
1679
1781
  };
1680
1782
  }
1681
1783
  //#endregion
1784
+ //#region src/client/host-compat/versions/v0-2-0-rc-2/adapter.ts
1785
+ /**
1786
+ * Adapter for the DSH `0.2.0-rc` line from `0.2.0-rc.2` on, verified at `0.2.0-rc.2`.
1787
+ *
1788
+ * The first case where one patch line AND one prerelease channel carry two
1789
+ * answers, so this folder opens a second channel (see the note on `HostChannel`).
1790
+ * What it took was one renamed token, and it is a menu token, which is the class of
1791
+ * fact this table exists for:
1792
+ *
1793
+ * · `ui-primitives/src/MenuGroup.tsx` + `.module.css` are NEW at rc.2 and the
1794
+ * headings of both grouped popups (`ModelSelect`, `PopupSelectView`) now come
1795
+ * from them. `ModelSelect.module.css` loses `.groupTitle{background:var(
1796
+ * --dsw-specific-menu)}` in the same breath — the sticky heading's paint moved
1797
+ * to `--dsw-alias-menu-group-header-fill`, a token that does not exist before
1798
+ * this tag (`git grep` at `0.1.7-rc.2` and `0.2.0-rc.1`: absent). Hence
1799
+ * `LAYERED_MENU_SURFACE_WITH_GROUP_HEADER` rather than the rc.1 constant: the
1800
+ * old claim set stayed true, it just stopped covering one element.
1801
+ * · the rest of the menu layer is the same code — `MenuSurface.tsx` and
1802
+ * `MenuSurface.module.css` are byte-identical to `0.2.0-rc.1`, and so is every
1803
+ * consumer of `--dsw-menu-backdrop-filter`.
1804
+ *
1805
+ * Also verified at this tag, and NOT a reason for a folder of its own:
1806
+ * · `SidebarRight.module.css` and `ui-dockkit/src/components/TabLayout.tsx` are
1807
+ * unchanged, so the panel is still a stationary frame whose dockkit children
1808
+ * slide (`panelBlurRule(DOCKKIT_SLIDERS)`, no promotion).
1809
+ * · the five `conversation.session.header*` slot keys, and still no `…leading`.
1810
+ * · `PluginManagerPage.tsx` still emits `section[data-plugin-panel]` with the card
1811
+ * `ul` under `[data-plugin-scope]` and `[data-plugin-loading]`.
1812
+ * · `TextShimmer` keeps the rc.1 shape (`data-shimmer`), so the stroke exemption
1813
+ * stands as written.
1814
+ *
1815
+ * What moved that reached this plugin WITHOUT a version branch, because the host
1816
+ * wrote it as a chain with a fallback:
1817
+ * · `TurnTriggerNodeView.module.css` now fills from
1818
+ * `var(--dsw-alias-turn-trigger-bg, var(--dsw-alias-markdown-code-block))` and
1819
+ * hovers with `var(--dsw-alias-turn-trigger-bg-hover, var(--dsw-alias-interactive-bg-hover))`,
1820
+ * both aliases declared in `design-platform.css` at this tag. The produced
1821
+ * slider's arm reads the SAME chain (see `PRODUCED_RULE`), so older hosts take
1822
+ * the fallback and this one takes the new alias — without any release test. That
1823
+ * matters here rather than being pedantry: dark mode repoints the alias at
1824
+ * `--dsw-alias-interactive-bg-hover`, so an arm still mixing on the code-block
1825
+ * token would keep overriding the row with the OLD color and the row would stop
1826
+ * tracking its own hover.
1827
+ *
1828
+ * @module
1829
+ */
1830
+ function panelFragments$2() {
1831
+ return {
1832
+ promotion: "",
1833
+ blur: panelBlurRule(DOCKKIT_SLIDERS)
1834
+ };
1835
+ }
1836
+ function createAdapter$2(host) {
1837
+ return {
1838
+ id: "0.2.0-rc.2",
1839
+ channel: "0.2.0-rc.2",
1840
+ host,
1841
+ panelFragments: panelFragments$2,
1842
+ pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1843
+ menus: LAYERED_MENU_SURFACE_WITH_GROUP_HEADER,
1844
+ surface: {
1845
+ ownsSidebarGuideSurface: true,
1846
+ headerSlotKeys: BASE_HEADER_SLOT_KEYS
1847
+ }
1848
+ };
1849
+ }
1850
+ //#endregion
1851
+ //#region src/client/host-compat/versions/v0-2-1-alpha-1/adapter.ts
1852
+ /**
1853
+ * Adapter for the DSH `0.2.1-alpha` line, verified at `0.2.1-alpha.1`.
1854
+ *
1855
+ * A new MINOR line opened with a prerelease, and the answer is the `0.2.0-rc.2`
1856
+ * folder's — which is a statement this file has to earn, because "same as the
1857
+ * release before" is exactly the reasoning that went wrong when `0.1.7-rc.2` moved
1858
+ * the menu paint. Read at the tag instead:
1859
+ * · `ui-theme/src/styles/design-platform.css` is BYTE-IDENTICAL to `0.2.0-rc.2`
1860
+ * (`git diff --numstat` empty), so every token this plugin writes — the menu
1861
+ * pair, the specific-menu alias, the turn-trigger chain — resolves to the same
1862
+ * values.
1863
+ * · `MenuGroup.tsx`, `MenuGroup.module.css`, `MenuSurface.tsx` and
1864
+ * `MenuSurface.module.css` are byte-identical too, and `MenuGroup` is still the
1865
+ * only consumer of `--dsw-alias-menu-group-header-fill`. That is why the menus
1866
+ * here answer with `LAYERED_MENU_SURFACE_WITH_GROUP_HEADER`, the same facts the
1867
+ * rc.2 folder checked, and not by re-typing them.
1868
+ * · `ui-sidebar-right/shell/SidebarRight.module.css` and
1869
+ * `ui-dockkit/src/components/TabLayout.tsx` unchanged (only `.tsx` service
1870
+ * wiring moved), so the panel stays a stationary frame with sliding dockkit
1871
+ * children and no promotion.
1872
+ * · the five `conversation.session.header*` slot keys, still no `…leading`.
1873
+ * · `PluginManagerPage.tsx` still emits the three anchors of the card list.
1874
+ * · `TextShimmer` still marks its root `data-shimmer`, so the stroke exemption
1875
+ * written for rc.1 stands.
1876
+ *
1877
+ * What did move, and why none of it needs a fact from this folder:
1878
+ *
1879
+ * 1. `ui-layout/AppFrame` gains a second grid row, `div.bottomRow[data-shell-bottom]`
1880
+ * holding the new `shell.bottom` slot, and it paints `--dsw-alias-bg-base` —
1881
+ * the main-background token, which `applyCustomTokensNow` already re-emits on
1882
+ * `body`, so the strip follows the main-bg slider with no new binding. The row
1883
+ * is `min-height:0` and empty unless a plugin fills the slot, so an untouched
1884
+ * install shows nothing. It also sits AFTER `RightbarColumn` in the frame's
1885
+ * children, which is the side `discoverParts()` does not count from: it anchors
1886
+ * on `data-rightbar-col` and reads `rightIdx-2` / `rightIdx-1`, so the sidebar
1887
+ * and center column are still the same two children.
1888
+ * 2. `ui-primitives/InlineEditor.module.css` is the new home of the inline editor's
1889
+ * `.editor{background:var(--dsw-alias-bg-base)}`. Same token, so the same slider
1890
+ * reaches it wherever the component moved to.
1891
+ * 3. `modules/system.ts` narrowed `claimStyles` to the tags a factory itself added
1892
+ * (see `ensureUiCss` for what that changed about our own sheet).
1893
+ * 4. `@deepseek-ai/dsh-invariants` is DELETED at this tag — `git ls-tree` shows no
1894
+ * `packages/runtime-diagnostics/invariants`, and the boot/app plugin loader never
1895
+ * looked for a plugin's `invariant` export. This plugin's no-op companion was
1896
+ * therefore already dead weight here, and it goes rather than claiming a peer
1897
+ * version for a package the host no longer ships.
1898
+ *
1899
+ * @module
1900
+ */
1901
+ function panelFragments$1() {
1902
+ return {
1903
+ promotion: "",
1904
+ blur: panelBlurRule(DOCKKIT_SLIDERS)
1905
+ };
1906
+ }
1907
+ function createAdapter$1(host) {
1908
+ return {
1909
+ id: "0.2.1-alpha.1",
1910
+ channel: "0.2.1-alpha",
1911
+ host,
1912
+ panelFragments: panelFragments$1,
1913
+ pluginPageRule: PLUGIN_PAGE_FROST_RULE,
1914
+ menus: LAYERED_MENU_SURFACE_WITH_GROUP_HEADER,
1915
+ surface: {
1916
+ ownsSidebarGuideSurface: true,
1917
+ headerSlotKeys: BASE_HEADER_SLOT_KEYS
1918
+ }
1919
+ };
1920
+ }
1921
+ //#endregion
1682
1922
  //#region src/client/host-compat/versions/unknown/adapter.ts
1683
1923
  /**
1684
1924
  * Stand-in for "we could not resolve the release".
@@ -1723,11 +1963,13 @@ window.__ModuleLoader__.load({
1723
1963
  //#endregion
1724
1964
  //#region src/client/host-compat/versions/registry.ts
1725
1965
  const ADAPTERS = {
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,
1966
+ "0.1.5-rc": createAdapter$7,
1967
+ "0.1.6-alpha": createAdapter$6,
1968
+ "0.1.7-alpha": createAdapter$5,
1969
+ "0.1.7-rc": createAdapter$4,
1970
+ "0.2.0-rc": createAdapter$3,
1971
+ "0.2.0-rc.2": createAdapter$2,
1972
+ "0.2.1-alpha": createAdapter$1,
1731
1973
  unknown: createAdapter
1732
1974
  };
1733
1975
  /** Pick the adapter for a resolved host. `host.channel` is already narrowed to
@@ -3676,6 +3918,8 @@ window.__ModuleLoader__.load({
3676
3918
  for (const name of appliedTokenNames) document.body.style.removeProperty(name);
3677
3919
  appliedTokenNames = Object.keys(tokens);
3678
3920
  }
3921
+ applyHeaderBar(surfaces);
3922
+ applyNativeCaption(surfaces);
3679
3923
  if (surfaces === null) {
3680
3924
  if (!hasColor && override === "auto" && verdict === null) clearThemeTokens();
3681
3925
  return;
@@ -3722,8 +3966,10 @@ window.__ModuleLoader__.load({
3722
3966
  return `${POPOVER_MENU_SEL}{${menuFrost(CARD_BLUR_VAR)}}${POPOVER_OTHER_SEL}{${elementFrostDecl(`var(${CARD_BLUR_VAR},none)`)}}`;
3723
3967
  }
3724
3968
  const INPUT_FROST_CLASS = "dab-input-frost";
3969
+ const TAKEOVER_FROST_CLASS = "dab-takeover-frost";
3970
+ const TAKEOVER_POS_ATTR = "data-dab-pos-patched";
3725
3971
  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")}}`;
3972
+ 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)}.${TAKEOVER_FROST_CLASS}{isolation:isolate}.${TAKEOVER_FROST_CLASS}::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)}.${TAKEOVER_FROST_CLASS}:has([role="dialog"]){isolation:auto}[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
3973
  }
3728
3974
  function applyInputBlur(px) {
3729
3975
  const root = document.documentElement;
@@ -3731,8 +3977,114 @@ window.__ModuleLoader__.load({
3731
3977
  else root.classList.remove(INPUT_FROST_CLASS);
3732
3978
  if (px > 0) root.style.setProperty("--dsh-any-input-blur", `blur(${px}px)`);
3733
3979
  else root.style.removeProperty("--dsh-any-input-blur");
3980
+ applyTakeoverFrost(px);
3981
+ }
3982
+ /** Carry the input frost on the seat's takeover cards (approval / plan review /
3983
+ * question), the capsule's siblings — see `inputBlurRule` for the recipe and
3984
+ * why it is attached here rather than by a stylesheet selector.
3985
+ *
3986
+ * The anchor probe is the `setBlur` guard: `position:relative` is written
3987
+ * inline ONLY where the host left the card `static`, and remembered with
3988
+ * `TAKEOVER_POS_ATTR` so clearing it is this function's job. A card a host or a
3989
+ * desktop shell positions itself is left exactly as it is — its own position
3990
+ * supplies the underlay's containing block — so no host box ever has its
3991
+ * position decided by this plugin's cascade (issue #24).
3992
+ *
3993
+ * Idempotent and cheap in the steady state: cards already carrying the class
3994
+ * (or already clear of it) are skipped without a style read. */
3995
+ function applyTakeoverFrost(px) {
3996
+ const cards = document.querySelectorAll(COMPOSER_TAKEOVER_CARD);
3997
+ if (px > 0) {
3998
+ for (const card of cards) {
3999
+ if (card.classList.contains(TAKEOVER_FROST_CLASS)) continue;
4000
+ if (getComputedStyle(card).position === "static") {
4001
+ card.style.position = "relative";
4002
+ card.setAttribute(TAKEOVER_POS_ATTR, "1");
4003
+ }
4004
+ card.classList.add(TAKEOVER_FROST_CLASS);
4005
+ }
4006
+ return;
4007
+ }
4008
+ for (const card of cards) {
4009
+ if (!card.classList.contains(TAKEOVER_FROST_CLASS)) continue;
4010
+ card.classList.remove(TAKEOVER_FROST_CLASS);
4011
+ if (card.getAttribute(TAKEOVER_POS_ATTR) === "1") {
4012
+ card.style.removeProperty("position");
4013
+ card.removeAttribute(TAKEOVER_POS_ATTR);
4014
+ }
4015
+ }
3734
4016
  }
3735
4017
  const MOBILE_HEADER_RULE = ".dsh-mobile-app-header{background:var(--dsh-any-op-bg,transparent)!important;backdrop-filter:var(--dsh-any-part-blur-global,none);-webkit-backdrop-filter:var(--dsh-any-part-blur-global,none)}";
4018
+ const HEADER_BAR_CLASS = "dab-header-bar";
4019
+ const HEADER_BAR_ANCHOR = "[data-slot^=\"conversation.session.header\"]";
4020
+ /** The session header bar, or null where this host has no such element. */
4021
+ function discoverHeaderBar() {
4022
+ if (centerEl === null || !document.body.contains(centerEl)) return null;
4023
+ const bar = centerEl.querySelector(HEADER_BAR_ANCHOR)?.closest("header");
4024
+ return bar instanceof HTMLElement ? bar : null;
4025
+ }
4026
+ /** The bar's paint. The variables are written by `applyHeaderBar`; the class is
4027
+ * only ever added when they are, so a host the plugin is not theming keeps its
4028
+ * own header untouched. */
4029
+ const HEADER_BAR_RULE = `.${HEADER_BAR_CLASS}{background:var(--dsh-any-op-header-bar,transparent)!important;backdrop-filter:var(--dsh-any-blur-header-bar,none);-webkit-backdrop-filter:var(--dsh-any-blur-header-bar,none)}`;
4030
+ /** Claim the bar and write its material + frost. `surfaces` arrives from the token
4031
+ * funnel, which already has the resolved source list; the settings sliders and the
4032
+ * parts pass call it without one and the sources are re-resolved here. */
4033
+ function applyHeaderBar(surfaces) {
4034
+ const base = (surfaces === void 0 ? paletteTokens() ?? readHostOpacityTokens() : surfaces)?.["--dsw-alias-bg-base"];
4035
+ const root = document.documentElement;
4036
+ discoverParts();
4037
+ const bar = discoverHeaderBar();
4038
+ if (base === void 0) {
4039
+ if (bar !== null) bar.classList.remove(HEADER_BAR_CLASS);
4040
+ root.style.removeProperty("--dsh-any-op-header-bar");
4041
+ root.style.removeProperty("--dsh-any-blur-header-bar");
4042
+ return;
4043
+ }
4044
+ root.style.setProperty("--dsh-any-op-header-bar", toRgba(base, rHeaderBarOpacity()));
4045
+ const px = rBlurs().headerBar;
4046
+ if (px > 0) root.style.setProperty("--dsh-any-blur-header-bar", `blur(${px}px)`);
4047
+ else root.style.removeProperty("--dsh-any-blur-header-bar");
4048
+ if (bar !== null) bar.classList.add(HEADER_BAR_CLASS);
4049
+ }
4050
+ const CAPTION_FRAME_CLASS = "dab-frame-caption";
4051
+ const WCO_PROBE_SEL = "body > span[style*=\"--dsw-specific-sidebar-fill\"]";
4052
+ let wcoStyleEl = null;
4053
+ function ensureWcoStyle() {
4054
+ if (wcoStyleEl?.isConnected) return wcoStyleEl;
4055
+ wcoStyleEl = document.createElement("style");
4056
+ wcoStyleEl.dataset.plugin = "dsh-any-background-wco";
4057
+ document.head.appendChild(wcoStyleEl);
4058
+ return wcoStyleEl;
4059
+ }
4060
+ /** The band's opaque material, or '' when the plugin has no theme to assert. The
4061
+ * sampled sidebar fill is already opaque in both source paths (the plugin's
4062
+ * palette builds `hsl()`, the host's own token is a static colour) — it only
4063
+ * misses on a host that exposes neither, and then the neutral the plugin builds
4064
+ * for the effective scheme stands in so the band still tracks the label ink. */
4065
+ function captionFill(src) {
4066
+ const sampled = src?.["--dsw-specific-sidebar-fill"];
4067
+ if (sampled !== void 0) return sampled;
4068
+ if (paletteTokens() === null && rBgDark() === null) return "";
4069
+ const dark = rScheme() === "dark";
4070
+ return genTokens(220, .04, dark ? .14 : .92, dark ? "dark" : "light").tokens["--dsw-specific-sidebar-fill"] ?? "";
4071
+ }
4072
+ /** Write the caption rule and mark the frame it targets. The frame is the
4073
+ * plugin's own discovery (`discoverParts`), not a guessed hashed class name. The
4074
+ * probe selector is a verified shape: an inline style that mentions the sidebar
4075
+ * token on a body-level span is the desktop preload's caption probe and nothing
4076
+ * else, so no match means no desktop caption and the rule is inert. */
4077
+ function applyNativeCaption(surfaces) {
4078
+ if (!document.documentElement.hasAttribute("data-windows-titlebar")) return;
4079
+ const fill = captionFill(surfaces === void 0 ? paletteTokens() ?? readHostOpacityTokens() : surfaces);
4080
+ const css = fill === "" ? "" : `${WCO_PROBE_SEL}{--dsw-specific-sidebar-fill:${fill}}[data-windows-titlebar] .${CAPTION_FRAME_CLASS}::before{background:${fill}!important}`;
4081
+ const el = ensureWcoStyle();
4082
+ if (el.textContent !== css) el.textContent = css;
4083
+ discoverParts();
4084
+ if (frameEl === null) return;
4085
+ if (css === "") frameEl.classList.remove(CAPTION_FRAME_CLASS);
4086
+ else frameEl.classList.add(CAPTION_FRAME_CLASS);
4087
+ }
3736
4088
  /** Mirror of the bg-part blur on :root. --dsh-any-part-blur is element-scoped
3737
4089
  * to the columns, so surfaces outside their subtree (the mobile header, or
3738
4090
  * third-party styles) can never inherit it. */
@@ -3851,11 +4203,12 @@ window.__ModuleLoader__.load({
3851
4203
  document.head.appendChild(exemptStyleEl);
3852
4204
  return exemptStyleEl;
3853
4205
  }
3854
- const PRODUCED_RULE = `[data-code-block-content] pre,[data-code-block-banner],[data-composer-chip],[data-changed-files],[data-terminal],[data-read],[data-diff],[data-context-injection-body],[data-search],[data-web],[class*="_ioCard"],[data-inspect],[data-turn-trigger],[style*="--dsh-hover-preview-fade"],:not(pre)>code{-webkit-backdrop-filter:var(--dsh-any-blur-prod,none);backdrop-filter:var(--dsh-any-blur-prod,none)}[data-markdown-variant="compact"] :not(pre)>code{-webkit-backdrop-filter:none;backdrop-filter:none}${BETTER_SIDEBAR_PANEL}{-webkit-backdrop-filter:var(--dsh-any-blur-prod,none);backdrop-filter:var(--dsh-any-blur-prod,none)}${BETTER_SIDEBAR_PANEL}{--dsw-alias-bg-base:var(--dsh-any-prod-panel-bg-base);--dsw-alias-bg-layer-1:var(--dsh-any-prod-panel-layer-1);--dsw-alias-bg-layer-2:var(--dsh-any-prod-panel-layer-2);--dsw-alias-bg-layer-3:var(--dsh-any-prod-panel-layer-3)}@supports (background:color-mix(in srgb,red 50%,transparent)){.md-code-block{background:transparent!important}.md-code-block>div{background-color:transparent!important}.md-code-block [data-code-block-content] pre{background-color:color-mix(in srgb,var(--dsl-code-block-background,var(--dsw-alias-markdown-code-block,transparent)) var(--dsh-any-prod-pct,100%),transparent)!important}.md-code-block [data-code-block-banner]{background-color:color-mix(in srgb,var(--dsl-code-block-banner-background-color,var(--dsw-alias-markdown-code-block-banner,transparent)) var(--dsh-any-prod-pct,100%),transparent)!important}[data-code-block-banner]{background-color:color-mix(in srgb,var(--dsl-code-block-banner-background-color,var(--dsl-code-block-background,var(--dsw-alias-markdown-code-block,transparent))) var(--dsh-any-prod-pct,100%),transparent)!important}[data-code-block-content]{--shiki-background:color-mix(in srgb,var(--dsw-alias-markdown-code-block,var(--dsl-code-block-background,transparent)) var(--dsh-any-prod-pct,100%),transparent)}:not(pre)>code{background-color:color-mix(in srgb,var(--dsw-alias-markdown-inline-code,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-composer-chip]>*{background-color:color-mix(in srgb,var(--dsw-alias-interactive-bg-hover,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-terminal]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-terminal] button{background-color:transparent!important}[data-read],[data-diff]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-read]>div:first-child:not([data-code-block-banner]),[data-diff]>div:first-child:not([data-code-block-banner]){background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block-banner,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-context-injection-body]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-inspect],[data-turn-trigger]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-turn-trigger]:hover{background-color:color-mix(in srgb,var(--dsw-alias-interactive-bg-hover,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-changed-files]{background-color:var(--dsh-any-prod-layer-1,var(--dsw-alias-bg-layer-1,transparent))!important}[data-changed-files]>button:first-child{background-color:color-mix(in srgb,var(--changes-fill,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-changed-files]>button:first-child:hover{background-color:color-mix(in srgb,var(--changes-hover,var(--changes-fill,transparent)) var(--dsh-any-prod-pct,100%),transparent)!important}[data-changed-files]>button:first-child>span:first-child{background-color:color-mix(in srgb,var(--changes-fill,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[style*="--dsh-hover-preview-fade"]{background-color:color-mix(in srgb,var(--dsw-hovercard-bg,#2c2c2e) var(--dsh-any-prod-pct,100%),transparent)!important}[style*="--dsh-hover-preview-fade"][class*="_preview"]{background-color:var(--dsh-any-prod-layer-1,var(--dsw-alias-bg-layer-1,transparent))!important}[data-search]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-web]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[class*="_ioCard"]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}}`;
4206
+ const PRODUCED_RULE = `[data-code-block-content] pre,[data-code-block-banner],[data-composer-chip],[data-changed-files],[data-terminal],[data-read],[data-diff],[data-context-injection-body],[data-search],[data-web],[class*="_ioCard"],[data-inspect],[data-turn-trigger],[style*="--dsh-hover-preview-fade"],:not(pre)>code{-webkit-backdrop-filter:var(--dsh-any-blur-prod,none);backdrop-filter:var(--dsh-any-blur-prod,none)}[data-markdown-variant="compact"] :not(pre)>code{-webkit-backdrop-filter:none;backdrop-filter:none}${BETTER_SIDEBAR_PANEL}{-webkit-backdrop-filter:var(--dsh-any-blur-prod,none);backdrop-filter:var(--dsh-any-blur-prod,none)}${BETTER_SIDEBAR_PANEL}{--dsw-alias-bg-base:var(--dsh-any-prod-panel-bg-base);--dsw-alias-bg-layer-1:var(--dsh-any-prod-panel-layer-1);--dsw-alias-bg-layer-2:var(--dsh-any-prod-panel-layer-2);--dsw-alias-bg-layer-3:var(--dsh-any-prod-panel-layer-3)}@supports (background:color-mix(in srgb,red 50%,transparent)){.md-code-block{background:transparent!important}.md-code-block>div{background-color:transparent!important}.md-code-block [data-code-block-content] pre{background-color:color-mix(in srgb,var(--dsl-code-block-background,var(--dsw-alias-markdown-code-block,transparent)) var(--dsh-any-prod-pct,100%),transparent)!important}.md-code-block [data-code-block-banner]{background-color:color-mix(in srgb,var(--dsl-code-block-banner-background-color,var(--dsw-alias-markdown-code-block-banner,transparent)) var(--dsh-any-prod-pct,100%),transparent)!important}[data-code-block-banner]{background-color:color-mix(in srgb,var(--dsl-code-block-banner-background-color,var(--dsl-code-block-background,var(--dsw-alias-markdown-code-block,transparent))) var(--dsh-any-prod-pct,100%),transparent)!important}[data-code-block-content]{--shiki-background:color-mix(in srgb,var(--dsw-alias-markdown-code-block,var(--dsl-code-block-background,transparent)) var(--dsh-any-prod-pct,100%),transparent)}:not(pre)>code{background-color:color-mix(in srgb,var(--dsw-alias-markdown-inline-code,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-composer-chip]>*{background-color:color-mix(in srgb,var(--dsw-alias-interactive-bg-hover,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-terminal]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-terminal] button{background-color:transparent!important}[data-read],[data-diff]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-read]>div:first-child:not([data-code-block-banner]),[data-diff]>div:first-child:not([data-code-block-banner]){background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block-banner,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-context-injection-body]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-inspect]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-turn-trigger]{background-color:color-mix(in srgb,var(--dsw-alias-turn-trigger-bg,var(--dsw-alias-markdown-code-block,transparent)) var(--dsh-any-prod-pct,100%),transparent)!important}[data-turn-trigger]:hover{background-color:color-mix(in srgb,var(--dsw-alias-turn-trigger-bg-hover,var(--dsw-alias-interactive-bg-hover,transparent)) var(--dsh-any-prod-pct,100%),transparent)!important}[data-changed-files]{background-color:var(--dsh-any-prod-layer-1,var(--dsw-alias-bg-layer-1,transparent))!important}[data-changed-files]>button:first-child{background-color:color-mix(in srgb,var(--changes-fill,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-changed-files]>button:first-child:hover{background-color:color-mix(in srgb,var(--changes-hover,var(--changes-fill,transparent)) var(--dsh-any-prod-pct,100%),transparent)!important}[data-changed-files]>button:first-child>span:first-child{background-color:color-mix(in srgb,var(--changes-fill,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[style*="--dsh-hover-preview-fade"]{background-color:color-mix(in srgb,var(--dsw-hovercard-bg,#2c2c2e) var(--dsh-any-prod-pct,100%),transparent)!important}[style*="--dsh-hover-preview-fade"][class*="_preview"]{background-color:var(--dsh-any-prod-layer-1,var(--dsw-alias-bg-layer-1,transparent))!important}[data-search]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[data-web]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}[class*="_ioCard"]{background-color:color-mix(in srgb,var(--dsw-alias-markdown-code-block,transparent) var(--dsh-any-prod-pct,100%),transparent)!important}}`;
3855
4207
  const STROKE_RULE = [
3856
4208
  `${SETTINGS_PANEL_SEL}{-webkit-text-stroke:var(--dsh-any-stroke-settings-w,0px) var(--dsh-any-stroke-settings-c,transparent);paint-order:stroke fill}`,
3857
4209
  "[role=\"menu\"]:not([data-dockkit-tab-menu]),[role=\"listbox\"],body>[role=\"tree\"],body>[role=\"dialog\"]:not([aria-modal=\"true\"]){-webkit-text-stroke:var(--dsh-any-stroke-card-w,0px) var(--dsh-any-stroke-card-c,transparent);paint-order:stroke fill}",
3858
- "[data-composer-card],[data-cordis-panel],[data-composer-card] textarea,[data-composer-card] input,[data-composer-card] [contenteditable],[data-cordis-panel] input,[data-cordis-panel] textarea{-webkit-text-stroke:var(--dsh-any-stroke-input-w,0px) var(--dsh-any-stroke-input-c,transparent);paint-order:stroke fill}",
4210
+ `[data-composer-card],[data-cordis-panel],[data-composer-card] textarea,[data-composer-card] input,[data-composer-card] [contenteditable],[data-cordis-panel] input,[data-cordis-panel] textarea,${COMPOSER_TAKEOVER_CARD},${COMPOSER_TAKEOVER_EDITOR}{-webkit-text-stroke:var(--dsh-any-stroke-input-w,0px) var(--dsh-any-stroke-input-c,transparent);paint-order:stroke fill}`,
4211
+ `.${HEADER_BAR_CLASS}{-webkit-text-stroke:var(--dsh-any-stroke-headerBar-w,0px) var(--dsh-any-stroke-headerBar-c,transparent);paint-order:stroke fill}`,
3859
4212
  `[data-chat-flow]{-webkit-text-stroke:var(--dsh-any-stroke-chat-w,0px) var(--dsh-any-stroke-chat-c,transparent);paint-order:stroke fill}`,
3860
4213
  `[data-conversation-composer-overlay]{-webkit-text-stroke:var(--dsh-any-stroke-trajectory-w,0px) var(--dsh-any-stroke-trajectory-c,transparent);paint-order:stroke fill}`,
3861
4214
  `[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}`,
@@ -3876,7 +4229,8 @@ window.__ModuleLoader__.load({
3876
4229
  "input",
3877
4230
  "panel",
3878
4231
  "produced",
3879
- "header"
4232
+ "header",
4233
+ "headerBar"
3880
4234
  ];
3881
4235
  /** Resolve one group's stroke color key into a concrete CSS color.
3882
4236
  * 'auto' contrasts the FONT direction (white fonts → black stroke and vice
@@ -4078,7 +4432,7 @@ window.__ModuleLoader__.load({
4078
4432
  if (px > 0) document.documentElement.style.setProperty("--dsh-any-blur-panel", `blur(${px}px)`);
4079
4433
  else document.documentElement.style.removeProperty("--dsh-any-blur-panel");
4080
4434
  }
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}";
4435
+ 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,${COMPOSER_TAKEOVER_EDITOR}::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}`;
4082
4436
  /** Re-scope one surface group's layer tokens onto plugin-owned variables so a
4083
4437
  * dedicated slider owns its alpha (the host has no per-surface opacity). The
4084
4438
  * settings group additionally retints its dialog surface variable. Always
@@ -4333,6 +4687,8 @@ window.__ModuleLoader__.load({
4333
4687
  applyPanelBlur(blurs.panel);
4334
4688
  applyProduced();
4335
4689
  applyHeaderPopovers();
4690
+ applyHeaderBar();
4691
+ applyNativeCaption();
4336
4692
  applyViewCards();
4337
4693
  }
4338
4694
  /** Produced/artifact surfaces (conversation code blocks + their banner +
@@ -4383,6 +4739,10 @@ window.__ModuleLoader__.load({
4383
4739
  applyHeaderPopovers();
4384
4740
  return;
4385
4741
  }
4742
+ if (part === "headerBar") {
4743
+ applyHeaderBar();
4744
+ return;
4745
+ }
4386
4746
  if (part === "chat" || part === "trajectory") {
4387
4747
  applyViewCards();
4388
4748
  return;
@@ -4634,6 +4994,17 @@ window.__ModuleLoader__.load({
4634
4994
  function columnsPresent() {
4635
4995
  return frameEl !== null && sidebarEl !== null && centerEl !== null && rightEl !== null && document.body.contains(frameEl) && document.body.contains(centerEl);
4636
4996
  }
4997
+ /** The composer seat's elected takeover card (approval / plan review / question)
4998
+ * when one is mounted. It is not a view, but it shares the view cards' problem:
4999
+ * the host mounts a fresh element when a takeover is elected, and the pass
5000
+ * signature alone would skip that pass — `applyTakeoverFrost` rides
5001
+ * `applyInputBlur` — leaving the new card bare until a slider moves. Scoped to
5002
+ * the center column exactly like the view markers, because this query runs on
5003
+ * every coalesced mutation burst, including token streaming. */
5004
+ function probeTakeoverCard() {
5005
+ if (centerEl === null || !document.body.contains(centerEl)) return null;
5006
+ return centerEl.querySelector(COMPOSER_TAKEOVER_CARD);
5007
+ }
4637
5008
  /** Snapshot of every surface the pass would style, for the identity check. */
4638
5009
  function targetsNow() {
4639
5010
  return [
@@ -4641,7 +5012,8 @@ window.__ModuleLoader__.load({
4641
5012
  sidebarEl,
4642
5013
  centerEl,
4643
5014
  rightEl,
4644
- ...viewTargets
5015
+ ...viewTargets,
5016
+ probeTakeoverCard()
4645
5017
  ];
4646
5018
  }
4647
5019
  /** Watch for the AppFrame mounting so persisted blurs land even when the shell
@@ -5027,6 +5399,13 @@ window.__ModuleLoader__.load({
5027
5399
  if (name) document.documentElement.style.removeProperty(name);
5028
5400
  }
5029
5401
  document.documentElement.classList.remove(INPUT_FROST_CLASS);
5402
+ applyTakeoverFrost(0);
5403
+ document.documentElement.style.removeProperty("--dsh-any-op-header-bar");
5404
+ document.documentElement.style.removeProperty("--dsh-any-blur-header-bar");
5405
+ document.querySelectorAll(`.${HEADER_BAR_CLASS}`).forEach((el) => el.classList.remove(HEADER_BAR_CLASS));
5406
+ frameEl?.classList.remove(CAPTION_FRAME_CLASS);
5407
+ wcoStyleEl?.remove();
5408
+ wcoStyleEl = null;
5030
5409
  document.documentElement.style.removeProperty("--dsh-any-blur-panel");
5031
5410
  document.documentElement.style.removeProperty("--dsh-any-blur-prod");
5032
5411
  document.documentElement.style.removeProperty("--dsh-any-prod-pct");
@@ -5119,7 +5498,7 @@ window.__ModuleLoader__.load({
5119
5498
  function buildStaticStyles() {
5120
5499
  const adapter = rHostAdapter();
5121
5500
  const panel = adapter.panelFragments();
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;
5501
+ return DARK_GRADIENT + FRAME_CLEAR_RULE + SETTINGS_STYLE_RULE + popoverBlurRule() + TRAJECTORY_STYLE_RULE + inputBlurRule() + MOBILE_HEADER_RULE + HEADER_BAR_RULE + PANEL_TOKEN_RULE + panel.promotion + panel.blur + adapter.pluginPageRule + PRODUCED_RULE + STROKE_RULE + headerPopoverRule() + exemptDefaultRule() + PLACEHOLDER_RULE;
5123
5502
  }
5124
5503
  /** Append the plugin's stylesheet and keep it matched to the host.
5125
5504
  * Returns a teardown for the plugin's effect scope. */
@@ -5603,6 +5982,7 @@ window.__ModuleLoader__.load({
5603
5982
  if (!el) {
5604
5983
  el = document.createElement("style");
5605
5984
  el.id = CSS_ID;
5985
+ el.dataset.plugin = "dsh-any-background-ui-css";
5606
5986
  document.head.appendChild(el);
5607
5987
  }
5608
5988
  if (el.textContent !== UI_CSS) el.textContent = UI_CSS;
@@ -5859,6 +6239,18 @@ window.__ModuleLoader__.load({
5859
6239
  rx: "2"
5860
6240
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8 6.6v2M7 8h2" })]
5861
6241
  });
6242
+ /** Session header bar: a window with its title band above the content. */
6243
+ const HeaderBarIcon = ({ size, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(Glyph, {
6244
+ size,
6245
+ className,
6246
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
6247
+ x: "2.2",
6248
+ y: "2.2",
6249
+ width: "11.6",
6250
+ height: "11.6",
6251
+ rx: "2"
6252
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M2.2 5.6h11.6" })]
6253
+ });
5862
6254
  const PlusIcon = ({ size, className }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Glyph, {
5863
6255
  size,
5864
6256
  className,
@@ -6885,6 +7277,11 @@ window.__ModuleLoader__.load({
6885
7277
  labelKey: "uiHeader",
6886
7278
  Icon: PanelIcon
6887
7279
  },
7280
+ {
7281
+ isHeaderBar: true,
7282
+ labelKey: "uiHeaderBar",
7283
+ Icon: HeaderBarIcon
7284
+ },
6888
7285
  {
6889
7286
  isPanel: true,
6890
7287
  labelKey: "uiPanelNative",
@@ -6914,11 +7311,11 @@ window.__ModuleLoader__.load({
6914
7311
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6915
7312
  className: "dab-grid-parts",
6916
7313
  children: PARTS$1.map((part, i) => {
6917
- const { labelKey, Icon, isSettings, isChat, isTrajectory, isPanel, isProduced, isHeader } = part;
7314
+ const { labelKey, Icon, isSettings, isChat, isTrajectory, isPanel, isProduced, isHeader, isHeaderBar } = part;
6918
7315
  const opKey = part.opKey;
6919
7316
  const label = t(labelKey);
6920
- const blurKey = isChat ? "chat" : isTrajectory ? "trajectory" : isSettings ? "settings" : isPanel ? "panel" : isProduced ? "produced" : isHeader ? "header" : opKey;
6921
- const opacity = isChat ? rChatTextOpacity() : isTrajectory ? rTrajectoryOpacity() : isSettings ? rSop() : isPanel ? rPanelOpacity() : isProduced ? rProducedOpacity() : isHeader ? rHeaderOpacity() : rOps()[opKey];
7317
+ const blurKey = isChat ? "chat" : isTrajectory ? "trajectory" : isSettings ? "settings" : isPanel ? "panel" : isProduced ? "produced" : isHeader ? "header" : isHeaderBar ? "headerBar" : opKey;
7318
+ const opacity = isChat ? rChatTextOpacity() : isTrajectory ? rTrajectoryOpacity() : isSettings ? rSop() : isPanel ? rPanelOpacity() : isProduced ? rProducedOpacity() : isHeader ? rHeaderOpacity() : isHeaderBar ? rHeaderBarOpacity() : rOps()[opKey];
6922
7319
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6923
7320
  className: "dab-card dab-card-hover dab-rise",
6924
7321
  style: { "--d": i + 1 },
@@ -6967,6 +7364,9 @@ window.__ModuleLoader__.load({
6967
7364
  } else if (isHeader) {
6968
7365
  cfg.headerOpacity = op;
6969
7366
  applyHeaderPopovers();
7367
+ } else if (isHeaderBar) {
7368
+ cfg.headerBarOpacity = op;
7369
+ applyHeaderBar();
6970
7370
  } else {
6971
7371
  const ops = { ...rOps() };
6972
7372
  ops[opKey] = op;
@@ -6995,6 +7395,10 @@ window.__ModuleLoader__.load({
6995
7395
  cfg.headerOpacity = op;
6996
7396
  applyHeaderPopovers();
6997
7397
  saveConfig();
7398
+ } else if (isHeaderBar) {
7399
+ cfg.headerBarOpacity = op;
7400
+ applyHeaderBar();
7401
+ saveConfig();
6998
7402
  } else {
6999
7403
  const ops = { ...rOps() };
7000
7404
  ops[opKey] = op;
@@ -7075,6 +7479,11 @@ window.__ModuleLoader__.load({
7075
7479
  labelKey: "uiHeader",
7076
7480
  Icon: PanelIcon
7077
7481
  },
7482
+ {
7483
+ key: "headerBar",
7484
+ labelKey: "uiHeaderBar",
7485
+ Icon: HeaderBarIcon
7486
+ },
7078
7487
  {
7079
7488
  key: "panel",
7080
7489
  labelKey: "uiPanelNative",
@@ -8446,7 +8855,8 @@ window.__ModuleLoader__.load({
8446
8855
  input: 0,
8447
8856
  panel: 0,
8448
8857
  produced: 0,
8449
- header: 0
8858
+ header: 0,
8859
+ headerBar: 0
8450
8860
  };
8451
8861
  /** Presets ship with strokes off — text outlines are an opt-in look. Fresh
8452
8862
  * objects per call so a profile restore can never alias another preset's
@@ -8467,7 +8877,8 @@ window.__ModuleLoader__.load({
8467
8877
  input: off(),
8468
8878
  panel: off(),
8469
8879
  produced: off(),
8470
- header: off()
8880
+ header: off(),
8881
+ headerBar: off()
8471
8882
  };
8472
8883
  };
8473
8884
  const BUILTIN_PRESETS = [
@@ -8490,7 +8901,8 @@ window.__ModuleLoader__.load({
8490
8901
  trajectoryOpacity: 1,
8491
8902
  panelOpacity: 1,
8492
8903
  producedOpacity: 1,
8493
- headerOpacity: 1
8904
+ headerOpacity: 1,
8905
+ headerBarOpacity: .85
8494
8906
  }
8495
8907
  },
8496
8908
  {
@@ -8525,7 +8937,8 @@ window.__ModuleLoader__.load({
8525
8937
  trajectoryOpacity: .85,
8526
8938
  panelOpacity: .85,
8527
8939
  producedOpacity: 1,
8528
- headerOpacity: 1
8940
+ headerOpacity: 1,
8941
+ headerBarOpacity: .62
8529
8942
  }
8530
8943
  },
8531
8944
  {
@@ -8547,7 +8960,8 @@ window.__ModuleLoader__.load({
8547
8960
  trajectoryOpacity: 1,
8548
8961
  panelOpacity: 1,
8549
8962
  producedOpacity: 1,
8550
- headerOpacity: 1
8963
+ headerOpacity: 1,
8964
+ headerBarOpacity: .97
8551
8965
  }
8552
8966
  },
8553
8967
  {
@@ -8582,7 +8996,8 @@ window.__ModuleLoader__.load({
8582
8996
  trajectoryOpacity: .8,
8583
8997
  panelOpacity: .8,
8584
8998
  producedOpacity: 1,
8585
- headerOpacity: 1
8999
+ headerOpacity: 1,
9000
+ headerBarOpacity: .5
8586
9001
  }
8587
9002
  },
8588
9003
  {
@@ -8617,7 +9032,8 @@ window.__ModuleLoader__.load({
8617
9032
  trajectoryOpacity: .78,
8618
9033
  panelOpacity: .75,
8619
9034
  producedOpacity: 1,
8620
- headerOpacity: 1
9035
+ headerOpacity: 1,
9036
+ headerBarOpacity: .42
8621
9037
  }
8622
9038
  },
8623
9039
  {
@@ -8643,7 +9059,8 @@ window.__ModuleLoader__.load({
8643
9059
  trajectoryOpacity: 1,
8644
9060
  panelOpacity: 1,
8645
9061
  producedOpacity: 1,
8646
- headerOpacity: 1
9062
+ headerOpacity: 1,
9063
+ headerBarOpacity: .92
8647
9064
  }
8648
9065
  }
8649
9066
  ];