dsh-any-background 0.3.1 → 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/README.md +21 -31
- package/README.zh.md +23 -33
- package/lib/client.js +543 -192
- package/lib/client.js.map +1 -1
- package/lib/index.js +11 -0
- package/package.json +13 -11
package/lib/client.js
CHANGED
|
@@ -52,7 +52,6 @@ window.__ModuleLoader__.load({
|
|
|
52
52
|
uiSop: "设置界面",
|
|
53
53
|
uiChatRegion: "对话文本框",
|
|
54
54
|
uiTrajectory: "轨迹页",
|
|
55
|
-
uiPanelRegion: "bettersidebar",
|
|
56
55
|
uiPanelNative: "右方侧边栏",
|
|
57
56
|
guideDesc: "管理主题色、壁纸与界面透明度",
|
|
58
57
|
uiProduced: "产出物/高亮内容",
|
|
@@ -244,7 +243,6 @@ window.__ModuleLoader__.load({
|
|
|
244
243
|
uiSop: "Settings interface",
|
|
245
244
|
uiChatRegion: "Conversation text frame",
|
|
246
245
|
uiTrajectory: "Trajectory view",
|
|
247
|
-
uiPanelRegion: "bettersidebar",
|
|
248
246
|
uiPanelNative: "Right sidebar",
|
|
249
247
|
guideDesc: "Theme color, wallpaper and interface opacity in the right sidebar",
|
|
250
248
|
uiProduced: "Produced / highlights",
|
|
@@ -999,6 +997,9 @@ window.__ModuleLoader__.load({
|
|
|
999
997
|
* were checked; several rows may share a `channel` when a newer build was
|
|
1000
998
|
* verified as needing no change to that folder's adapter (as `0.1.7-rc.1` was) —
|
|
1001
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`).
|
|
1002
1003
|
* Adding an ADAPTER means adding a channel plus a folder in
|
|
1003
1004
|
* `client/host-compat/versions/`. */
|
|
1004
1005
|
const SUPPORTED_RELEASES = [
|
|
@@ -1017,6 +1018,14 @@ window.__ModuleLoader__.load({
|
|
|
1017
1018
|
{
|
|
1018
1019
|
channel: "0.1.7-alpha",
|
|
1019
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"
|
|
1020
1029
|
}
|
|
1021
1030
|
];
|
|
1022
1031
|
const UNKNOWN_HOST_INFO = {
|
|
@@ -1129,47 +1138,20 @@ window.__ModuleLoader__.load({
|
|
|
1129
1138
|
}
|
|
1130
1139
|
//#endregion
|
|
1131
1140
|
//#region src/client/host-compat/versions/shared.ts
|
|
1132
|
-
/**
|
|
1133
|
-
* Selector + declaration vocabulary shared by every per-version adapter.
|
|
1134
|
-
*
|
|
1135
|
-
* These are the ANCHORS, not the decisions. What varies between releases (which
|
|
1136
|
-
* element slides, whether the panel needs promoting, which header slot keys
|
|
1137
|
-
* exist) is answered in the version folders; what is stable across all of them
|
|
1138
|
-
* lives here so no adapter has to re-type a host selector and get it subtly wrong.
|
|
1139
|
-
*
|
|
1140
|
-
* Verified against the harness release tags (dsh-v0.1.5-rc.2 … dsh-v0.1.7-rc.1),
|
|
1141
|
-
* not inferred:
|
|
1142
|
-
* · `[data-sidebar-right-panel]` — emitted by `ui-sidebar-right/shell/SidebarRight.tsx`
|
|
1143
|
-
* on every release in range, with values `push` | `fullscreen`.
|
|
1144
|
-
* · `[data-dockkit-host]` / `[data-dockkit-empty]` — emitted ONLY by
|
|
1145
|
-
* `ui-dockkit/components/TabLayout.tsx`, a file that first appears at
|
|
1146
|
-
* 0.1.7-alpha.1. Dockkit itself EXISTS earlier (its `TabMenu` carries
|
|
1147
|
-
* `[data-dockkit-tab-menu]` on every release), so only these two attributes
|
|
1148
|
-
* are the 0.1.7 marker — never test "is dockkit installed".
|
|
1149
|
-
* · `[data-dsh-bottom-panel]` — the optional dsh-better-sidebar workbench, not
|
|
1150
|
-
* a host element at all. It is a single element on every release, which is
|
|
1151
|
-
* why it needs no version arm.
|
|
1152
|
-
* · `[data-plugin-panel]` / `[data-plugin-scope] > ul` — emitted by
|
|
1153
|
-
* `ui-plugin-manager/src/client/PluginManagerPage.tsx`. That package is NEW AT
|
|
1154
|
-
* 0.1.6-alpha.2: `git ls-tree` shows it absent from 0.1.5-rc.2, 0.1.5-rc.3 and
|
|
1155
|
-
* 0.1.6-alpha.1, where the plugin list lived in `ui-settings-plugin-inventory`
|
|
1156
|
-
* under `[data-plugin-scope]` alone — no `[data-plugin-panel]`, and no card
|
|
1157
|
-
* `ul` in that group either. From alpha.2 on, the group markup (`section` →
|
|
1158
|
-
* `div.groupHead` + `ul.cards`) is byte-identical through 0.1.7-rc.1, so the
|
|
1159
|
-
* ONE rule below serves all four tags that emit the page.
|
|
1160
|
-
*
|
|
1161
|
-
* @module
|
|
1162
|
-
*/
|
|
1163
1141
|
/** The host's own right Sidebar wrapper. */
|
|
1164
1142
|
const PANEL_WRAPPER = "[data-sidebar-right-panel]";
|
|
1165
1143
|
/** The same wrapper in its fullscreen state; the host raises its own z-index to 40. */
|
|
1166
1144
|
const PANEL_FULLSCREEN = "[data-sidebar-right-panel=\"fullscreen\"]";
|
|
1167
1145
|
/** The docked children a 0.1.7+ panel slides — the panel itself stays put. */
|
|
1168
1146
|
const DOCKKIT_SLIDERS = "[data-sidebar-right-panel] [data-dockkit-host=\"dock\"],[data-sidebar-right-panel] [data-dockkit-empty]";
|
|
1169
|
-
/** The third-party workbench panel, one element on every release.
|
|
1147
|
+
/** The third-party workbench panel, one element on every release. Owned by the
|
|
1148
|
+
* PRODUCED slider (0.3.2): a conversation artifact that happens to open in a
|
|
1149
|
+
* panel, not a page column — so it fades and frosts with the produced surfaces. */
|
|
1170
1150
|
const BETTER_SIDEBAR_PANEL = "[data-dsh-bottom-panel]";
|
|
1171
|
-
/** Every surface the panel opacity slider owns
|
|
1172
|
-
|
|
1151
|
+
/** Every surface the panel opacity slider owns — the host's own right Sidebar.
|
|
1152
|
+
* Layout-neutral token re-scope. (The dsh-better-sidebar workbench used to be
|
|
1153
|
+
* listed here; it moved to the produced group, see `PRODUCED_RULE`.) */
|
|
1154
|
+
const PANEL_SURFACES = PANEL_WRAPPER;
|
|
1173
1155
|
/** DOM-shape test for "this is NOT a 0.1.7-style frame". Used ONLY by the
|
|
1174
1156
|
* unresolved adapter, where the DOM is the authority because the release is not. */
|
|
1175
1157
|
const WITHOUT_DOCKKIT_FRAME = ":not(:has([data-dockkit-host],[data-dockkit-empty]))";
|
|
@@ -1190,10 +1172,19 @@ window.__ModuleLoader__.load({
|
|
|
1190
1172
|
* Which releases emit the page decides who gets this string — see `pluginPageRule`
|
|
1191
1173
|
* in each version folder.
|
|
1192
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
|
+
*
|
|
1193
1182
|
* BINDING, and why it is not just "put it in the dialog": the block paints from
|
|
1194
1183
|
* `--dsh-any-bg-settings-surface` and frosts from `--dsh-any-blur-settings`, i.e.
|
|
1195
1184
|
* the settings-opacity / settings-blur pair. On 0.1.7 the page is a child of
|
|
1196
|
-
* `centerCol`, NOT of the settings dialog
|
|
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
|
|
1197
1188
|
* re-scope never reaches it and the list would otherwise follow the homepage card
|
|
1198
1189
|
* alpha; reading the plugin-owned variables off `:root` puts them under the slider
|
|
1199
1190
|
* that owns this page. The `var(--dsw-alias-bg-layer-2)` fallback covers the window
|
|
@@ -1206,10 +1197,104 @@ window.__ModuleLoader__.load({
|
|
|
1206
1197
|
* carries a `plugins.item` slot that third-party plugins fill with their own
|
|
1207
1198
|
* controls, so a dialog can legitimately open inside the list.
|
|
1208
1199
|
*/
|
|
1209
|
-
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
|
+
};
|
|
1210
1295
|
/** Session-header slot anchors present on EVERY release in range. The slot
|
|
1211
1296
|
* renderer stamps `data-slot="<key>"` unconditionally (`ui-renderer/scoped-slots.tsx`),
|
|
1212
|
-
* and all five keys are registered from 0.1.5-rc.2 through 0.
|
|
1297
|
+
* and all five keys are registered from 0.1.5-rc.2 through 0.2.0-rc.1 —
|
|
1213
1298
|
* verified per tag. Adapters append the keys their own release adds. */
|
|
1214
1299
|
const BASE_HEADER_SLOT_KEYS = [
|
|
1215
1300
|
"conversation.session.header",
|
|
@@ -1241,22 +1326,31 @@ window.__ModuleLoader__.load({
|
|
|
1241
1326
|
* an animated track with its own stacking context, it must be promoted out of it
|
|
1242
1327
|
* or the filter has no wallpaper to sample.
|
|
1243
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
|
+
*
|
|
1244
1337
|
* @module
|
|
1245
1338
|
*/
|
|
1246
1339
|
/** The wrapper carries the slide transform on this line, so it carries the blur. */
|
|
1247
|
-
function panelFragments$
|
|
1340
|
+
function panelFragments$5() {
|
|
1248
1341
|
return {
|
|
1249
1342
|
promotion: `${PANEL_WRAPPER}{position:fixed!important;z-index:26!important}${PANEL_FULLSCREEN}{z-index:40!important}`,
|
|
1250
|
-
blur: panelBlurRule(PANEL_WRAPPER)
|
|
1343
|
+
blur: panelBlurRule(PANEL_WRAPPER)
|
|
1251
1344
|
};
|
|
1252
1345
|
}
|
|
1253
|
-
function createAdapter$
|
|
1346
|
+
function createAdapter$5(host) {
|
|
1254
1347
|
return {
|
|
1255
1348
|
id: "0.1.5-rc.2/rc.3",
|
|
1256
1349
|
channel: "0.1.5-rc",
|
|
1257
1350
|
host,
|
|
1258
|
-
panelFragments: panelFragments$
|
|
1351
|
+
panelFragments: panelFragments$5,
|
|
1259
1352
|
pluginPageRule: "",
|
|
1353
|
+
menus: LEGACY_MENU_SURFACE,
|
|
1260
1354
|
surface: {
|
|
1261
1355
|
ownsSidebarGuideSurface: false,
|
|
1262
1356
|
headerSlotKeys: BASE_HEADER_SLOT_KEYS
|
|
@@ -1286,6 +1380,12 @@ window.__ModuleLoader__.load({
|
|
|
1286
1380
|
* So the panel mechanics match 0.1.5: the wrapper slides, the wrapper takes the
|
|
1287
1381
|
* blur, and the wrapper needs promoting.
|
|
1288
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
|
+
*
|
|
1289
1389
|
* @module
|
|
1290
1390
|
*/
|
|
1291
1391
|
/** The extra session-header anchor this line introduces: the macOS titlebar work
|
|
@@ -1318,19 +1418,20 @@ window.__ModuleLoader__.load({
|
|
|
1318
1418
|
const m = /^alpha\.(\d+)$/.exec(pre);
|
|
1319
1419
|
return m === null || Number(m[1]) >= 2;
|
|
1320
1420
|
}
|
|
1321
|
-
function panelFragments$
|
|
1421
|
+
function panelFragments$4() {
|
|
1322
1422
|
return {
|
|
1323
1423
|
promotion: `${PANEL_WRAPPER}{position:fixed!important;z-index:26!important}${PANEL_FULLSCREEN}{z-index:40!important}`,
|
|
1324
|
-
blur: panelBlurRule(PANEL_WRAPPER)
|
|
1424
|
+
blur: panelBlurRule(PANEL_WRAPPER)
|
|
1325
1425
|
};
|
|
1326
1426
|
}
|
|
1327
|
-
function createAdapter$
|
|
1427
|
+
function createAdapter$4(host) {
|
|
1328
1428
|
return {
|
|
1329
1429
|
id: "0.1.6-alpha.1/alpha.2",
|
|
1330
1430
|
channel: "0.1.6-alpha",
|
|
1331
1431
|
host,
|
|
1332
|
-
panelFragments: panelFragments$
|
|
1432
|
+
panelFragments: panelFragments$4,
|
|
1333
1433
|
pluginPageRule: hasPluginManagerPage(host.version) ? PLUGIN_PAGE_FROST_RULE : "",
|
|
1434
|
+
menus: LEGACY_MENU_SURFACE,
|
|
1334
1435
|
surface: {
|
|
1335
1436
|
ownsSidebarGuideSurface: true,
|
|
1336
1437
|
headerSlotKeys: hasLeadingHeaderSlot(host.version) ? [...BASE_HEADER_SLOT_KEYS, "conversation.session.header.leading"] : BASE_HEADER_SLOT_KEYS
|
|
@@ -1400,22 +1501,177 @@ window.__ModuleLoader__.load({
|
|
|
1400
1501
|
* too. Checked against every use in this plugin: the stroke group is inherited
|
|
1401
1502
|
* so a second match changes nothing, and the view-card discovery takes the
|
|
1402
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.
|
|
1403
1514
|
*
|
|
1404
1515
|
* @module
|
|
1405
1516
|
*/
|
|
1406
|
-
function panelFragments$
|
|
1517
|
+
function panelFragments$3() {
|
|
1407
1518
|
return {
|
|
1408
1519
|
promotion: "",
|
|
1409
|
-
blur: panelBlurRule(DOCKKIT_SLIDERS)
|
|
1520
|
+
blur: panelBlurRule(DOCKKIT_SLIDERS)
|
|
1410
1521
|
};
|
|
1411
1522
|
}
|
|
1412
|
-
function createAdapter$
|
|
1523
|
+
function createAdapter$3(host) {
|
|
1413
1524
|
return {
|
|
1414
1525
|
id: "0.1.7-alpha.1/alpha.2/rc.1",
|
|
1415
1526
|
channel: "0.1.7-alpha",
|
|
1416
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,
|
|
1417
1672
|
panelFragments: panelFragments$1,
|
|
1418
1673
|
pluginPageRule: PLUGIN_PAGE_FROST_RULE,
|
|
1674
|
+
menus: LAYERED_MENU_SURFACE,
|
|
1419
1675
|
surface: {
|
|
1420
1676
|
ownsSidebarGuideSurface: true,
|
|
1421
1677
|
headerSlotKeys: BASE_HEADER_SLOT_KEYS
|
|
@@ -1447,7 +1703,7 @@ window.__ModuleLoader__.load({
|
|
|
1447
1703
|
const wrapper = `${PANEL_WRAPPER}${WITHOUT_DOCKKIT_FRAME}`;
|
|
1448
1704
|
return {
|
|
1449
1705
|
promotion: `${wrapper}{position:fixed!important;z-index:26!important}${PANEL_FULLSCREEN}${WITHOUT_DOCKKIT_FRAME}{z-index:40!important}`,
|
|
1450
|
-
blur: panelBlurRule(DOCKKIT_SLIDERS) + panelBlurRule(wrapper)
|
|
1706
|
+
blur: panelBlurRule(DOCKKIT_SLIDERS) + panelBlurRule(wrapper)
|
|
1451
1707
|
};
|
|
1452
1708
|
}
|
|
1453
1709
|
function createAdapter(host) {
|
|
@@ -1457,6 +1713,7 @@ window.__ModuleLoader__.load({
|
|
|
1457
1713
|
host,
|
|
1458
1714
|
panelFragments,
|
|
1459
1715
|
pluginPageRule: PLUGIN_PAGE_FROST_RULE,
|
|
1716
|
+
menus: UNRESOLVED_MENU_SURFACE,
|
|
1460
1717
|
surface: {
|
|
1461
1718
|
ownsSidebarGuideSurface: false,
|
|
1462
1719
|
headerSlotKeys: BASE_HEADER_SLOT_KEYS
|
|
@@ -1466,9 +1723,11 @@ window.__ModuleLoader__.load({
|
|
|
1466
1723
|
//#endregion
|
|
1467
1724
|
//#region src/client/host-compat/versions/registry.ts
|
|
1468
1725
|
const ADAPTERS = {
|
|
1469
|
-
"0.1.5-rc": createAdapter$
|
|
1470
|
-
"0.1.6-alpha": createAdapter$
|
|
1471
|
-
"0.1.7-alpha": createAdapter$
|
|
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,
|
|
1472
1731
|
unknown: createAdapter
|
|
1473
1732
|
};
|
|
1474
1733
|
/** Pick the adapter for a resolved host. `host.channel` is already narrowed to
|
|
@@ -3396,7 +3655,7 @@ window.__ModuleLoader__.load({
|
|
|
3396
3655
|
}
|
|
3397
3656
|
try {
|
|
3398
3657
|
const forceDark = scheme === "dark";
|
|
3399
|
-
const key = `${h}|${s}|${l}|${verdict}|${scheme}|${hasColor}`;
|
|
3658
|
+
const key = `${h}|${s}|${l}|${verdict}|${scheme}|${hasColor}|${hostAdapter().menus.fillTokens.join(",")}`;
|
|
3400
3659
|
if (key !== baseTokenKey) {
|
|
3401
3660
|
baseTokenKey = key;
|
|
3402
3661
|
if (forceDark) document.body.setAttribute("data-ds-dark-theme", "dsh-any-background");
|
|
@@ -3406,6 +3665,13 @@ window.__ModuleLoader__.load({
|
|
|
3406
3665
|
const opVar = OPACITY_VARS[name];
|
|
3407
3666
|
decls.push(`${name}:${opVar !== void 0 ? `var(${opVar})` : value}!important`);
|
|
3408
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
|
+
}
|
|
3409
3675
|
ensureTokenStyle().textContent = `body{${decls.join(";")}}`;
|
|
3410
3676
|
for (const name of appliedTokenNames) document.body.style.removeProperty(name);
|
|
3411
3677
|
appliedTokenNames = Object.keys(tokens);
|
|
@@ -3429,12 +3695,44 @@ window.__ModuleLoader__.load({
|
|
|
3429
3695
|
applyExemptDefaults();
|
|
3430
3696
|
} catch {}
|
|
3431
3697
|
}
|
|
3432
|
-
const SETTINGS_PANEL_SEL = "[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]";
|
|
3698
|
+
const SETTINGS_PANEL_SEL = "[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby][class*=\"_panel\"]";
|
|
3433
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
|
+
}
|
|
3724
|
+
const INPUT_FROST_CLASS = "dab-input-frost";
|
|
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
|
+
}
|
|
3434
3728
|
function applyInputBlur(px) {
|
|
3435
|
-
|
|
3436
|
-
|
|
3729
|
+
const root = document.documentElement;
|
|
3730
|
+
if (px > 0) root.classList.add(INPUT_FROST_CLASS);
|
|
3731
|
+
else root.classList.remove(INPUT_FROST_CLASS);
|
|
3732
|
+
if (px > 0) root.style.setProperty("--dsh-any-input-blur", `blur(${px}px)`);
|
|
3733
|
+
else root.style.removeProperty("--dsh-any-input-blur");
|
|
3437
3734
|
}
|
|
3735
|
+
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)}";
|
|
3438
3736
|
/** Mirror of the bg-part blur on :root. --dsh-any-part-blur is element-scoped
|
|
3439
3737
|
* to the columns, so surfaces outside their subtree (the mobile header, or
|
|
3440
3738
|
* third-party styles) can never inherit it. */
|
|
@@ -3464,9 +3762,22 @@ window.__ModuleLoader__.load({
|
|
|
3464
3762
|
* taking the card blur. `[role]` is a no-op presence test that raises only the
|
|
3465
3763
|
* tagged arm to (0,2,0); the other three already qualify at (0,2,0)+. */
|
|
3466
3764
|
const HEADER_SURFACES_PADDED = [`${HEADER_TAG_SELECTOR}[role]`, ...HEADER_SURFACES.slice(1)];
|
|
3467
|
-
|
|
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
|
+
}
|
|
3468
3779
|
/** Selector the dynamic header token rule targets — the same set as the static
|
|
3469
|
-
*
|
|
3780
|
+
* headerPopoverRule above, so the two can never drift apart. */
|
|
3470
3781
|
const HEADER_TOKEN_SELECTOR = HEADER_SURFACES_PADDED.join(",");
|
|
3471
3782
|
/** Header-popover surfaces: retint the menu token and (re)write the blur.
|
|
3472
3783
|
* Mirrors applyProduced: the static rule above never changes, so a drag only
|
|
@@ -3479,9 +3790,9 @@ window.__ModuleLoader__.load({
|
|
|
3479
3790
|
let opacity = rHeaderOpacity();
|
|
3480
3791
|
if (opacity < 0) opacity = 0;
|
|
3481
3792
|
if (opacity > 1) opacity = 1;
|
|
3482
|
-
const menu = (paletteTokens() ?? readHostOpacityTokens())?.[
|
|
3793
|
+
const menu = (paletteTokens() ?? readHostOpacityTokens())?.[MENU_FILL_TOKEN];
|
|
3483
3794
|
const el = ensureHeaderStyle();
|
|
3484
|
-
const css = menu === void 0 ? "" : `${HEADER_TOKEN_SELECTOR}{
|
|
3795
|
+
const css = menu === void 0 ? "" : `${HEADER_TOKEN_SELECTOR}{${menuFillDecls(toRgba(menu, opacity))}}`;
|
|
3485
3796
|
if (el.textContent !== css) el.textContent = css;
|
|
3486
3797
|
}
|
|
3487
3798
|
let headerStyleEl = null;
|
|
@@ -3521,7 +3832,8 @@ window.__ModuleLoader__.load({
|
|
|
3521
3832
|
add("--dsw-alias-bg-layer-1", source?.["--dsw-alias-bg-layer-1"]);
|
|
3522
3833
|
add("--dsw-alias-bg-layer-2", source?.["--dsw-alias-bg-layer-2"]);
|
|
3523
3834
|
add("--dsw-alias-bg-layer-3", source?.["--dsw-alias-bg-layer-3"]);
|
|
3524
|
-
|
|
3835
|
+
const menuColor = source?.[MENU_FILL_TOKEN];
|
|
3836
|
+
for (const name of hostAdapter().menus.fillTokens) add(name, menuColor);
|
|
3525
3837
|
if (decls.length === 0) {
|
|
3526
3838
|
if (el.textContent !== "") el.textContent = "";
|
|
3527
3839
|
return;
|
|
@@ -3539,17 +3851,17 @@ window.__ModuleLoader__.load({
|
|
|
3539
3851
|
document.head.appendChild(exemptStyleEl);
|
|
3540
3852
|
return exemptStyleEl;
|
|
3541
3853
|
}
|
|
3542
|
-
const PRODUCED_RULE =
|
|
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}}`;
|
|
3543
3855
|
const STROKE_RULE = [
|
|
3544
3856
|
`${SETTINGS_PANEL_SEL}{-webkit-text-stroke:var(--dsh-any-stroke-settings-w,0px) var(--dsh-any-stroke-settings-c,transparent);paint-order:stroke fill}`,
|
|
3545
3857
|
"[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}",
|
|
3546
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}",
|
|
3547
3859
|
`[data-chat-flow]{-webkit-text-stroke:var(--dsh-any-stroke-chat-w,0px) var(--dsh-any-stroke-chat-c,transparent);paint-order:stroke fill}`,
|
|
3548
3860
|
`[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}`,
|
|
3549
|
-
|
|
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}`,
|
|
3550
3862
|
`${PANEL_SURFACES}{-webkit-text-stroke:var(--dsh-any-stroke-panel-w,0px) var(--dsh-any-stroke-panel-c,transparent);paint-order:stroke fill}`,
|
|
3551
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}`,
|
|
3552
|
-
"[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}",
|
|
3553
3865
|
`svg{-webkit-text-stroke-width:0!important;paint-order:normal!important}`,
|
|
3554
3866
|
`::placeholder{-webkit-text-stroke-width:0!important}`
|
|
3555
3867
|
].join("");
|
|
@@ -3686,12 +3998,7 @@ window.__ModuleLoader__.load({
|
|
|
3686
3998
|
fontStyleEl?.remove();
|
|
3687
3999
|
fontStyleEl = null;
|
|
3688
4000
|
}
|
|
3689
|
-
/** The host's own
|
|
3690
|
-
* plugin has no palette (no picked color, no wallpaper verdict, no forced
|
|
3691
|
-
* scheme). Without these the panel's re-scope would resolve to invalid vars
|
|
3692
|
-
* and the panel would have no background — reading the host's resolved value
|
|
3693
|
-
* keeps the panel opaque by default and lets the slider retint it like every
|
|
3694
|
-
* other homepage part. Reads from the live `:root` so a custom host skin or
|
|
4001
|
+
/** The host's own defaults, read from the live `:root` so a custom host skin or
|
|
3695
4002
|
* theme override wins. */
|
|
3696
4003
|
function readHostLayerTokens() {
|
|
3697
4004
|
if (typeof getComputedStyle === "undefined") return null;
|
|
@@ -3709,37 +4016,69 @@ window.__ModuleLoader__.load({
|
|
|
3709
4016
|
layer3
|
|
3710
4017
|
};
|
|
3711
4018
|
}
|
|
3712
|
-
|
|
3713
|
-
|
|
4019
|
+
/** The host's own right Sidebar (`PANEL_TOKEN_RULE`) reads this set. */
|
|
4020
|
+
const PANEL_LAYER_VARS = {
|
|
4021
|
+
base: "--dsh-any-panel-bg-base",
|
|
4022
|
+
layer1: "--dsh-any-panel-layer-1",
|
|
4023
|
+
layer2: "--dsh-any-panel-layer-2",
|
|
4024
|
+
layer3: "--dsh-any-panel-layer-3"
|
|
4025
|
+
};
|
|
4026
|
+
/** The dsh-better-sidebar workbench (see `PRODUCED_RULE`) reads this set, so the
|
|
4027
|
+
* two panels can follow two different sliders. */
|
|
4028
|
+
const PROD_PANEL_LAYER_VARS = {
|
|
4029
|
+
base: "--dsh-any-prod-panel-bg-base",
|
|
4030
|
+
layer1: "--dsh-any-prod-panel-layer-1",
|
|
4031
|
+
layer2: "--dsh-any-prod-panel-layer-2",
|
|
4032
|
+
layer3: "--dsh-any-prod-panel-layer-3"
|
|
4033
|
+
};
|
|
4034
|
+
/** The changed-files card root needs one token only — the RAW `--dsw-alias-bg-layer-1`
|
|
4035
|
+
* at the produced alpha. It cannot mix on the token itself the way the other
|
|
4036
|
+
* produced surfaces do, because that name is what the interface card slider
|
|
4037
|
+
* re-emits globally on `body` (OPACITY_TOKEN_GROUPS), so mixing on it would bind
|
|
4038
|
+
* one artifact card to two sliders. */
|
|
4039
|
+
const PROD_LAYER_VARS = { layer1: "--dsh-any-prod-layer-1" };
|
|
4040
|
+
const LAYER_KEYS = [
|
|
4041
|
+
"base",
|
|
4042
|
+
"layer1",
|
|
4043
|
+
"layer2",
|
|
4044
|
+
"layer3"
|
|
4045
|
+
];
|
|
4046
|
+
/** Re-emit the four layer colors at `op` alpha into `names`. The source is the
|
|
4047
|
+
* plugin palette when a picked color / forced scheme owns the theme, otherwise
|
|
4048
|
+
* the host's own resolved tokens — a slider only ever supplies the alpha, so the
|
|
4049
|
+
* colors keep following whichever theme or host skin is active.
|
|
4050
|
+
*
|
|
4051
|
+
* Every pass writes SOMETHING: the re-scope rules live in the always-emitted
|
|
4052
|
+
* stylesheet, and a `var()` naming an unwritten variable makes the surface
|
|
4053
|
+
* guaranteed-invalid, which drops its background entirely rather than leaving it
|
|
4054
|
+
* on the host default. */
|
|
4055
|
+
function writeLayerVars(names, op) {
|
|
4056
|
+
const palette = paletteTokens();
|
|
4057
|
+
const src = palette !== null ? {
|
|
4058
|
+
base: palette["--dsw-alias-bg-base"],
|
|
4059
|
+
layer1: palette["--dsw-alias-bg-layer-1"],
|
|
4060
|
+
layer2: palette["--dsw-alias-bg-layer-2"],
|
|
4061
|
+
layer3: palette["--dsw-alias-bg-layer-3"]
|
|
4062
|
+
} : readHostLayerTokens() ?? {};
|
|
3714
4063
|
const root = document.documentElement;
|
|
3715
|
-
if (
|
|
3716
|
-
const
|
|
3717
|
-
const layer1 = tokens["--dsw-alias-bg-layer-1"];
|
|
3718
|
-
const layer2 = tokens["--dsw-alias-bg-layer-2"];
|
|
3719
|
-
const layer3 = tokens["--dsw-alias-bg-layer-3"];
|
|
3720
|
-
if (base !== void 0) root.style.setProperty("--dsh-any-panel-bg-base", toRgba(base, op));
|
|
3721
|
-
if (layer1 !== void 0) root.style.setProperty("--dsh-any-panel-layer-1", toRgba(layer1, op));
|
|
3722
|
-
if (layer2 !== void 0) root.style.setProperty("--dsh-any-panel-layer-2", toRgba(layer2, op));
|
|
3723
|
-
if (layer3 !== void 0) root.style.setProperty("--dsh-any-panel-layer-3", toRgba(layer3, op));
|
|
4064
|
+
if (LAYER_KEYS.every((k) => !src[k])) {
|
|
4065
|
+
for (const k of LAYER_KEYS) if (names[k]) root.style.setProperty(names[k], "transparent");
|
|
3724
4066
|
return;
|
|
3725
4067
|
}
|
|
3726
|
-
const
|
|
3727
|
-
|
|
3728
|
-
|
|
3729
|
-
root.style.setProperty(
|
|
3730
|
-
root.style.setProperty("--dsh-any-panel-layer-2", "transparent");
|
|
3731
|
-
root.style.setProperty("--dsh-any-panel-layer-3", "transparent");
|
|
3732
|
-
return;
|
|
4068
|
+
for (const k of LAYER_KEYS) {
|
|
4069
|
+
const name = names[k];
|
|
4070
|
+
const v = src[k];
|
|
4071
|
+
if (name && v) root.style.setProperty(name, toRgba(v, op));
|
|
3733
4072
|
}
|
|
3734
|
-
|
|
3735
|
-
|
|
3736
|
-
|
|
3737
|
-
if (host.layer3) root.style.setProperty("--dsh-any-panel-layer-3", toRgba(host.layer3, op));
|
|
4073
|
+
}
|
|
4074
|
+
function applyPanelOverrides(op) {
|
|
4075
|
+
writeLayerVars(PANEL_LAYER_VARS, op);
|
|
3738
4076
|
}
|
|
3739
4077
|
function applyPanelBlur(px) {
|
|
3740
4078
|
if (px > 0) document.documentElement.style.setProperty("--dsh-any-blur-panel", `blur(${px}px)`);
|
|
3741
4079
|
else document.documentElement.style.removeProperty("--dsh-any-blur-panel");
|
|
3742
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}";
|
|
3743
4082
|
/** Re-scope one surface group's layer tokens onto plugin-owned variables so a
|
|
3744
4083
|
* dedicated slider owns its alpha (the host has no per-surface opacity). The
|
|
3745
4084
|
* settings group additionally retints its dialog surface variable. Always
|
|
@@ -3766,6 +4105,7 @@ window.__ModuleLoader__.load({
|
|
|
3766
4105
|
function applySettingsOverrides(op) {
|
|
3767
4106
|
applyLayerOverrides("--dsh-any-bg-settings", op, true);
|
|
3768
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)}";
|
|
3769
4109
|
function applyTrajectoryOverrides(op) {
|
|
3770
4110
|
applyLayerOverrides("--dsh-any-traj", op, false);
|
|
3771
4111
|
}
|
|
@@ -3996,11 +4336,15 @@ window.__ModuleLoader__.load({
|
|
|
3996
4336
|
applyViewCards();
|
|
3997
4337
|
}
|
|
3998
4338
|
/** Produced/artifact surfaces (conversation code blocks + their banner +
|
|
3999
|
-
*
|
|
4000
|
-
*
|
|
4001
|
-
*
|
|
4002
|
-
*
|
|
4003
|
-
*
|
|
4339
|
+
* inline code chips + composer chips + the dsh-better-sidebar workbench):
|
|
4340
|
+
* re-write the root blur and the alpha percentage consumed by PRODUCED_RULE. The
|
|
4341
|
+
* percentage is an alpha for the surface's OWN host color — 1 (100%) reproduces
|
|
4342
|
+
* the untouched host look and lowering it fades exactly that color out — so no
|
|
4343
|
+
* palette sampling is involved and the surfaces keep following the active
|
|
4344
|
+
* theme/wallpaper color on their own. Two surfaces are the exception: the
|
|
4345
|
+
* workbench reads a whole set of layer tokens rather than one color, and the
|
|
4346
|
+
* changed-files card reads a token the card slider owns globally — both take their
|
|
4347
|
+
* alpha from `writeLayerVars` instead of mixing on the live token. */
|
|
4004
4348
|
function applyProduced() {
|
|
4005
4349
|
const px = rBlurs().produced;
|
|
4006
4350
|
const root = document.documentElement;
|
|
@@ -4010,6 +4354,8 @@ window.__ModuleLoader__.load({
|
|
|
4010
4354
|
if (opacity < 0) opacity = 0;
|
|
4011
4355
|
if (opacity > 1) opacity = 1;
|
|
4012
4356
|
root.style.setProperty("--dsh-any-prod-pct", `${Math.round(opacity * 100)}%`);
|
|
4357
|
+
writeLayerVars(PROD_PANEL_LAYER_VARS, opacity);
|
|
4358
|
+
writeLayerVars(PROD_LAYER_VARS, opacity);
|
|
4013
4359
|
}
|
|
4014
4360
|
/** Live per-part blur update during slider drag (no full re-apply). */
|
|
4015
4361
|
function setPartBlur(part, v) {
|
|
@@ -4165,7 +4511,7 @@ window.__ModuleLoader__.load({
|
|
|
4165
4511
|
if (el.clientHeight < centerEl.clientHeight * .5) continue;
|
|
4166
4512
|
if (el.clientHeight > (best?.clientHeight ?? 0)) best = el;
|
|
4167
4513
|
}
|
|
4168
|
-
if (best !== null && best.closest(
|
|
4514
|
+
if (best !== null && best.closest("[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby][class*=\"_panel\"]") !== null) best = null;
|
|
4169
4515
|
const refined = best !== null ? refineMessageColumn(best) : null;
|
|
4170
4516
|
viewTargets[idx] = refined;
|
|
4171
4517
|
return refined;
|
|
@@ -4672,10 +5018,15 @@ window.__ModuleLoader__.load({
|
|
|
4672
5018
|
document.documentElement.style.removeProperty("--dsh-any-blur-card-panels");
|
|
4673
5019
|
document.documentElement.style.removeProperty("--dsh-any-input-blur");
|
|
4674
5020
|
document.documentElement.style.removeProperty("--dsh-any-part-blur-global");
|
|
4675
|
-
|
|
4676
|
-
|
|
4677
|
-
|
|
4678
|
-
|
|
5021
|
+
for (const set of [
|
|
5022
|
+
PANEL_LAYER_VARS,
|
|
5023
|
+
PROD_PANEL_LAYER_VARS,
|
|
5024
|
+
PROD_LAYER_VARS
|
|
5025
|
+
]) for (const k of LAYER_KEYS) {
|
|
5026
|
+
const name = set[k];
|
|
5027
|
+
if (name) document.documentElement.style.removeProperty(name);
|
|
5028
|
+
}
|
|
5029
|
+
document.documentElement.classList.remove(INPUT_FROST_CLASS);
|
|
4679
5030
|
document.documentElement.style.removeProperty("--dsh-any-blur-panel");
|
|
4680
5031
|
document.documentElement.style.removeProperty("--dsh-any-blur-prod");
|
|
4681
5032
|
document.documentElement.style.removeProperty("--dsh-any-prod-pct");
|
|
@@ -4730,9 +5081,10 @@ window.__ModuleLoader__.load({
|
|
|
4730
5081
|
* `wallpaper.ts` — so it is encoded here instead, in one list, with the reason
|
|
4731
5082
|
* next to each entry.
|
|
4732
5083
|
*
|
|
4733
|
-
* What the release can change lives in
|
|
4734
|
-
* (which element carries the frost)
|
|
4735
|
-
*
|
|
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
|
|
4736
5088
|
* construction — it targets attributes every release in range emits.
|
|
4737
5089
|
*
|
|
4738
5090
|
* The sheet is rebuilt when the release verdict lands. It has to be: `apply` runs
|
|
@@ -4749,19 +5101,25 @@ window.__ModuleLoader__.load({
|
|
|
4749
5101
|
/**
|
|
4750
5102
|
* The order contract. Later entries override earlier ones at equal specificity,
|
|
4751
5103
|
* which several groups rely on:
|
|
4752
|
-
* ·
|
|
5104
|
+
* · headerPopoverRule() after popoverBlurRule() — a surface moving from the card
|
|
4753
5105
|
* group to the header group must win, not merely be listed twice.
|
|
4754
5106
|
* · PRODUCED_RULE / STROKE_RULE after the blur groups — they shield their
|
|
4755
5107
|
* surfaces from an inherited slider.
|
|
4756
|
-
* ·
|
|
5108
|
+
* · exemptDefaultRule() last of the token groups — an exemption has to land
|
|
4757
5109
|
* after whatever it exempts.
|
|
4758
5110
|
* · PLACEHOLDER_RULE genuinely last — `::placeholder` resets must survive every
|
|
4759
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.
|
|
4760
5118
|
*/
|
|
4761
5119
|
function buildStaticStyles() {
|
|
4762
5120
|
const adapter = rHostAdapter();
|
|
4763
5121
|
const panel = adapter.panelFragments();
|
|
4764
|
-
return DARK_GRADIENT + FRAME_CLEAR_RULE + SETTINGS_STYLE_RULE +
|
|
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;
|
|
4765
5123
|
}
|
|
4766
5124
|
/** Append the plugin's stylesheet and keep it matched to the host.
|
|
4767
5125
|
* Returns a teardown for the plugin's effect scope. */
|
|
@@ -6480,78 +6838,6 @@ window.__ModuleLoader__.load({
|
|
|
6480
6838
|
});
|
|
6481
6839
|
}
|
|
6482
6840
|
//#endregion
|
|
6483
|
-
//#region src/client/env.ts
|
|
6484
|
-
/**
|
|
6485
|
-
* Host capability detection — which third-party plugins are actually present.
|
|
6486
|
-
*
|
|
6487
|
-
* The host exposes no plugin registry on the client context, so presence is
|
|
6488
|
-
* inferred from the stable DOM markers those plugins mount. Detection runs
|
|
6489
|
-
* once (plugin boot) and is re-armed by a cheap body-level MutationObserver so
|
|
6490
|
-
* a plugin that mounts after this one still flips the cached verdict. The
|
|
6491
|
-
* verdict is sticky-true for the session: whether a detected plugin's surface
|
|
6492
|
-
* is currently collapsed must not hide the settings that govern it.
|
|
6493
|
-
*/
|
|
6494
|
-
/** Persistent container + surfaces dsh-better-sidebar mounts when loaded.
|
|
6495
|
-
* `[data-dsh-better-sidebar]` is the plugin's host wrapper — always appended
|
|
6496
|
-
* to document.body on mount — so it is the authoritative "plugin is loaded"
|
|
6497
|
-
* signal and the body childList observer fires exactly when it appears. The
|
|
6498
|
-
* panel surfaces we actually style are listed only as reinforcement: they are
|
|
6499
|
-
* conditionally rendered (collapsed panels drop them), so they must never be
|
|
6500
|
-
* the sole signal.
|
|
6501
|
-
*
|
|
6502
|
-
* `[data-sidebar-right-panel]` is deliberately ABSENT: on every host generation
|
|
6503
|
-
* it marks the host's own right Sidebar (always present once a session opens),
|
|
6504
|
-
* so counting it would make the better-sidebar verdict permanently true and the
|
|
6505
|
-
* panel slider could never drop back to its native "右方侧边栏" identity. */
|
|
6506
|
-
const BETTER_SIDEBAR_MARKERS = [
|
|
6507
|
-
"[data-dsh-better-sidebar]",
|
|
6508
|
-
"[data-dsh-panel-host]",
|
|
6509
|
-
"[data-dsh-bottom-panel]"
|
|
6510
|
-
];
|
|
6511
|
-
let betterSidebar = false;
|
|
6512
|
-
const subs = /* @__PURE__ */ new Set();
|
|
6513
|
-
/** Read snapshot of whether the better-sidebar plugin is present. */
|
|
6514
|
-
function rBetterSidebar() {
|
|
6515
|
-
return betterSidebar;
|
|
6516
|
-
}
|
|
6517
|
-
function emit() {
|
|
6518
|
-
subs.forEach((cb) => cb());
|
|
6519
|
-
}
|
|
6520
|
-
function sync() {
|
|
6521
|
-
if (document.querySelector(BETTER_SIDEBAR_MARKERS.join(",")) !== null && !betterSidebar) {
|
|
6522
|
-
betterSidebar = true;
|
|
6523
|
-
emit();
|
|
6524
|
-
}
|
|
6525
|
-
}
|
|
6526
|
-
/** React hook: re-renders the caller when better-sidebar presence changes. */
|
|
6527
|
-
function useBetterSidebar() {
|
|
6528
|
-
return (0, react.useSyncExternalStore)(subscribe, rBetterSidebar);
|
|
6529
|
-
}
|
|
6530
|
-
/** Subscribe to verdict changes. */
|
|
6531
|
-
function subscribe(cb) {
|
|
6532
|
-
subs.add(cb);
|
|
6533
|
-
return () => {
|
|
6534
|
-
subs.delete(cb);
|
|
6535
|
-
};
|
|
6536
|
-
}
|
|
6537
|
-
/** Start detection (probe once, then watch body mounts). Returns an
|
|
6538
|
-
* unsubscribe for plugin teardown. */
|
|
6539
|
-
function startBetterSidebarWatch() {
|
|
6540
|
-
sync();
|
|
6541
|
-
const observer = new MutationObserver(sync);
|
|
6542
|
-
observer.observe(document.body, { childList: true });
|
|
6543
|
-
return () => observer.disconnect();
|
|
6544
|
-
}
|
|
6545
|
-
let nativeTabs = false;
|
|
6546
|
-
const nativeSubs = /* @__PURE__ */ new Set();
|
|
6547
|
-
/** Mark the native right-Sidebar service as confirmed. Sticky — the service
|
|
6548
|
-
* never goes away within a session. */
|
|
6549
|
-
function markNativeSidebarTabs() {
|
|
6550
|
-
if (nativeTabs) return;
|
|
6551
|
-
nativeTabs = true;
|
|
6552
|
-
nativeSubs.forEach((cb) => cb());
|
|
6553
|
-
}
|
|
6554
|
-
//#endregion
|
|
6555
6841
|
//#region src/client/components/pages/InterfacePage.tsx
|
|
6556
6842
|
const PARTS$1 = [
|
|
6557
6843
|
{
|
|
@@ -6601,14 +6887,13 @@ window.__ModuleLoader__.load({
|
|
|
6601
6887
|
},
|
|
6602
6888
|
{
|
|
6603
6889
|
isPanel: true,
|
|
6604
|
-
labelKey: "
|
|
6890
|
+
labelKey: "uiPanelNative",
|
|
6605
6891
|
Icon: PanelIcon
|
|
6606
6892
|
}
|
|
6607
6893
|
];
|
|
6608
6894
|
function InterfacePage({ p }) {
|
|
6609
6895
|
const { t, setOps, setBlurs, setSop, setPanelOp, useStore } = p;
|
|
6610
6896
|
useStore((s) => s.metaRev);
|
|
6611
|
-
const hasBetterSidebar = useBetterSidebar();
|
|
6612
6897
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
|
|
6613
6898
|
className: "dab-head dab-rise",
|
|
6614
6899
|
style: { "--d": 0 },
|
|
@@ -6631,7 +6916,7 @@ window.__ModuleLoader__.load({
|
|
|
6631
6916
|
children: PARTS$1.map((part, i) => {
|
|
6632
6917
|
const { labelKey, Icon, isSettings, isChat, isTrajectory, isPanel, isProduced, isHeader } = part;
|
|
6633
6918
|
const opKey = part.opKey;
|
|
6634
|
-
const label =
|
|
6919
|
+
const label = t(labelKey);
|
|
6635
6920
|
const blurKey = isChat ? "chat" : isTrajectory ? "trajectory" : isSettings ? "settings" : isPanel ? "panel" : isProduced ? "produced" : isHeader ? "header" : opKey;
|
|
6636
6921
|
const opacity = isChat ? rChatTextOpacity() : isTrajectory ? rTrajectoryOpacity() : isSettings ? rSop() : isPanel ? rPanelOpacity() : isProduced ? rProducedOpacity() : isHeader ? rHeaderOpacity() : rOps()[opKey];
|
|
6637
6922
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
@@ -6792,9 +7077,8 @@ window.__ModuleLoader__.load({
|
|
|
6792
7077
|
},
|
|
6793
7078
|
{
|
|
6794
7079
|
key: "panel",
|
|
6795
|
-
labelKey: "
|
|
6796
|
-
Icon: PanelIcon
|
|
6797
|
-
needsSidebar: true
|
|
7080
|
+
labelKey: "uiPanelNative",
|
|
7081
|
+
Icon: PanelIcon
|
|
6798
7082
|
}
|
|
6799
7083
|
];
|
|
6800
7084
|
const COLOR_KEYS = [
|
|
@@ -6827,7 +7111,6 @@ window.__ModuleLoader__.load({
|
|
|
6827
7111
|
}
|
|
6828
7112
|
function FontPage({ p, notify }) {
|
|
6829
7113
|
const { t, setFont, removeFont, setFontEnabled, setStrokes, useStore } = p;
|
|
6830
|
-
const hasBetterSidebar = useBetterSidebar();
|
|
6831
7114
|
const fileRef = (0, react.useRef)(null);
|
|
6832
7115
|
const [strokes, setStrokesState] = (0, react.useState)(() => rStrokes());
|
|
6833
7116
|
const [fontInfo, setFontInfo] = (0, react.useState)(() => ({
|
|
@@ -7002,7 +7285,7 @@ window.__ModuleLoader__.load({
|
|
|
7002
7285
|
}),
|
|
7003
7286
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
7004
7287
|
className: "dab-grid-parts",
|
|
7005
|
-
children: PARTS.
|
|
7288
|
+
children: PARTS.map((part, i) => {
|
|
7006
7289
|
const s = strokes[part.key];
|
|
7007
7290
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
7008
7291
|
className: "dab-card dab-card-hover dab-rise",
|
|
@@ -9049,6 +9332,74 @@ window.__ModuleLoader__.load({
|
|
|
9049
9332
|
});
|
|
9050
9333
|
}
|
|
9051
9334
|
//#endregion
|
|
9335
|
+
//#region src/client/env.ts
|
|
9336
|
+
/**
|
|
9337
|
+
* Host capability detection — which third-party plugins are actually present.
|
|
9338
|
+
*
|
|
9339
|
+
* The host exposes no plugin registry on the client context, so presence is
|
|
9340
|
+
* inferred from the stable DOM markers those plugins mount. Detection runs
|
|
9341
|
+
* once (plugin boot) and is re-armed by a cheap body-level MutationObserver so
|
|
9342
|
+
* a plugin that mounts after this one still flips the cached verdict. The
|
|
9343
|
+
* verdict is sticky-true for the session: whether a detected plugin's surface
|
|
9344
|
+
* is currently collapsed must not hide the settings that govern it.
|
|
9345
|
+
*/
|
|
9346
|
+
/** Persistent container + surfaces dsh-better-sidebar mounts when loaded.
|
|
9347
|
+
* `[data-dsh-better-sidebar]` is the plugin's host wrapper — always appended
|
|
9348
|
+
* to document.body on mount — so it is the authoritative "plugin is loaded"
|
|
9349
|
+
* signal and the body childList observer fires exactly when it appears. The
|
|
9350
|
+
* panel surfaces are listed only as reinforcement: they are conditionally
|
|
9351
|
+
* rendered (collapsed panels drop them), so they must never be the sole
|
|
9352
|
+
* signal.
|
|
9353
|
+
*
|
|
9354
|
+
* `[data-sidebar-right-panel]` is deliberately ABSENT: on every host generation
|
|
9355
|
+
* it marks the host's own right Sidebar (always present once a session opens),
|
|
9356
|
+
* so counting it would make the better-sidebar verdict permanently true on any
|
|
9357
|
+
* host and mis-drive everything gated on it. */
|
|
9358
|
+
const BETTER_SIDEBAR_MARKERS = [
|
|
9359
|
+
"[data-dsh-better-sidebar]",
|
|
9360
|
+
"[data-dsh-panel-host]",
|
|
9361
|
+
"[data-dsh-bottom-panel]"
|
|
9362
|
+
];
|
|
9363
|
+
let betterSidebar = false;
|
|
9364
|
+
const subs = /* @__PURE__ */ new Set();
|
|
9365
|
+
/** Read snapshot of whether the better-sidebar plugin is present. */
|
|
9366
|
+
function rBetterSidebar() {
|
|
9367
|
+
return betterSidebar;
|
|
9368
|
+
}
|
|
9369
|
+
function emit() {
|
|
9370
|
+
subs.forEach((cb) => cb());
|
|
9371
|
+
}
|
|
9372
|
+
function sync() {
|
|
9373
|
+
if (document.querySelector(BETTER_SIDEBAR_MARKERS.join(",")) !== null && !betterSidebar) {
|
|
9374
|
+
betterSidebar = true;
|
|
9375
|
+
emit();
|
|
9376
|
+
}
|
|
9377
|
+
}
|
|
9378
|
+
/** Subscribe to verdict changes. */
|
|
9379
|
+
function subscribe(cb) {
|
|
9380
|
+
subs.add(cb);
|
|
9381
|
+
return () => {
|
|
9382
|
+
subs.delete(cb);
|
|
9383
|
+
};
|
|
9384
|
+
}
|
|
9385
|
+
/** Start detection (probe once, then watch body mounts). Returns an
|
|
9386
|
+
* unsubscribe for plugin teardown. */
|
|
9387
|
+
function startBetterSidebarWatch() {
|
|
9388
|
+
sync();
|
|
9389
|
+
const observer = new MutationObserver(sync);
|
|
9390
|
+
observer.observe(document.body, { childList: true });
|
|
9391
|
+
return () => observer.disconnect();
|
|
9392
|
+
}
|
|
9393
|
+
let nativeTabs = false;
|
|
9394
|
+
const nativeSubs = /* @__PURE__ */ new Set();
|
|
9395
|
+
/** Mark the native right-Sidebar service as confirmed. Sticky — the service
|
|
9396
|
+
* never goes away within a session. */
|
|
9397
|
+
function markNativeSidebarTabs() {
|
|
9398
|
+
if (nativeTabs) return;
|
|
9399
|
+
nativeTabs = true;
|
|
9400
|
+
nativeSubs.forEach((cb) => cb());
|
|
9401
|
+
}
|
|
9402
|
+
//#endregion
|
|
9052
9403
|
//#region src/client/sidebar/native-tab.tsx
|
|
9053
9404
|
/**
|
|
9054
9405
|
* dsh-any-background — native right-Sidebar integration.
|
|
@@ -10029,7 +10380,7 @@ window.__ModuleLoader__.load({
|
|
|
10029
10380
|
});
|
|
10030
10381
|
const navLabel = () => ctx.locale.bind(NS)("nav");
|
|
10031
10382
|
const applyNavIcon = () => {
|
|
10032
|
-
const nav = document.querySelector(
|
|
10383
|
+
const nav = document.querySelector(SETTINGS_PANEL_SEL)?.querySelector("nav");
|
|
10033
10384
|
if (!nav) return;
|
|
10034
10385
|
const target = navLabel();
|
|
10035
10386
|
for (const cell of Array.from(nav.querySelectorAll("button"))) {
|
|
@@ -10059,7 +10410,7 @@ window.__ModuleLoader__.load({
|
|
|
10059
10410
|
for (const n of r.addedNodes) {
|
|
10060
10411
|
if (n.nodeType !== 1) continue;
|
|
10061
10412
|
const el = n;
|
|
10062
|
-
if (el.matches?.("[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]") || el.querySelector?.("[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby]")) return true;
|
|
10413
|
+
if (el.matches?.("[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby][class*=\"_panel\"]") || el.querySelector?.("[role=\"dialog\"][aria-modal=\"true\"][aria-labelledby][class*=\"_panel\"]")) return true;
|
|
10063
10414
|
}
|
|
10064
10415
|
return false;
|
|
10065
10416
|
})) applyNavIcon();
|