dsh-client-ui-seaglass 1.6.3 → 1.6.4
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 +94 -95
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -1877,88 +1877,6 @@ function fluidToneColors(dark, hue, depth) {
|
|
|
1877
1877
|
};
|
|
1878
1878
|
}
|
|
1879
1879
|
|
|
1880
|
-
//#endregion
|
|
1881
|
-
//#region src/client/fluid-interactions.ts
|
|
1882
|
-
/** Normalized shader-space coordinates for one canvas. */
|
|
1883
|
-
function uv(canvas, clientX, clientY) {
|
|
1884
|
-
const rect = canvas.getBoundingClientRect();
|
|
1885
|
-
return {
|
|
1886
|
-
x: rect.width <= 0 ? .5 : (clientX - rect.left) / rect.width,
|
|
1887
|
-
y: rect.height <= 0 ? .5 : 1 - (clientY - rect.top) / rect.height
|
|
1888
|
-
};
|
|
1889
|
-
}
|
|
1890
|
-
/**
|
|
1891
|
-
* Attach the button ripple listeners.
|
|
1892
|
-
* @param targets - the fluid handle and its canvas.
|
|
1893
|
-
* @returns disposer removing every listener.
|
|
1894
|
-
*/
|
|
1895
|
-
function attachFluidInteractions(targets) {
|
|
1896
|
-
const { main, mainCanvas } = targets;
|
|
1897
|
-
const lastStir = new WeakMap();
|
|
1898
|
-
const ripples = new Set();
|
|
1899
|
-
const stirButton = (button, strength) => {
|
|
1900
|
-
const now = performance.now();
|
|
1901
|
-
const previous = lastStir.get(button) ?? 0;
|
|
1902
|
-
if (now - previous < 160) return;
|
|
1903
|
-
lastStir.set(button, now);
|
|
1904
|
-
const rect = button.getBoundingClientRect();
|
|
1905
|
-
const point = uv(mainCanvas, rect.left + rect.width / 2, rect.top + rect.height / 2);
|
|
1906
|
-
main.stir(point.x, point.y, 0, -strength);
|
|
1907
|
-
};
|
|
1908
|
-
/** Slow radial ripple: a ring of gentle outward stirs expanding from the
|
|
1909
|
-
* click point. Radius eases from zero so the influence creeps outward. */
|
|
1910
|
-
const ripple = (cx, cy) => {
|
|
1911
|
-
const rect = mainCanvas.getBoundingClientRect();
|
|
1912
|
-
if (rect.width <= 0 || rect.height <= 0) return;
|
|
1913
|
-
const ux = (cx - rect.left) / rect.width;
|
|
1914
|
-
const uy = 1 - (cy - rect.top) / rect.height;
|
|
1915
|
-
const start = performance.now();
|
|
1916
|
-
const duration = 1500;
|
|
1917
|
-
const maxRadius = 120;
|
|
1918
|
-
const count = 8;
|
|
1919
|
-
const step = () => {
|
|
1920
|
-
const t = performance.now() - start;
|
|
1921
|
-
if (t > duration) return;
|
|
1922
|
-
const k = t / duration;
|
|
1923
|
-
const radius = maxRadius * k * k;
|
|
1924
|
-
const strength = .05 * (1 - k);
|
|
1925
|
-
const spin = .4 * k;
|
|
1926
|
-
for (let i = 0; i < count; i += 1) {
|
|
1927
|
-
const angle = i / count * Math.PI * 2 + spin;
|
|
1928
|
-
const px = ux + radius * Math.cos(angle) / rect.width;
|
|
1929
|
-
const py = uy + radius * Math.sin(angle) / rect.height;
|
|
1930
|
-
main.stir(px, py, Math.cos(angle) * strength, -Math.sin(angle) * strength);
|
|
1931
|
-
}
|
|
1932
|
-
const id = requestAnimationFrame(step);
|
|
1933
|
-
ripples.add(id);
|
|
1934
|
-
};
|
|
1935
|
-
const id = requestAnimationFrame(step);
|
|
1936
|
-
ripples.add(id);
|
|
1937
|
-
};
|
|
1938
|
-
const onPointerOver = (event) => {
|
|
1939
|
-
const button = event.target?.closest?.("button");
|
|
1940
|
-
if (button !== undefined && button !== null) stirButton(button, .04);
|
|
1941
|
-
};
|
|
1942
|
-
const onClick = (event) => {
|
|
1943
|
-
const button = event.target?.closest?.("button");
|
|
1944
|
-
if (button === undefined || button === null) return;
|
|
1945
|
-
const now = performance.now();
|
|
1946
|
-
const previous = lastStir.get(button) ?? 0;
|
|
1947
|
-
if (now - previous < 500) return;
|
|
1948
|
-
lastStir.set(button, now);
|
|
1949
|
-
const rect = button.getBoundingClientRect();
|
|
1950
|
-
ripple(rect.left + rect.width / 2, rect.top + rect.height / 2);
|
|
1951
|
-
};
|
|
1952
|
-
document.addEventListener("pointerover", onPointerOver, { capture: true });
|
|
1953
|
-
document.addEventListener("click", onClick, { capture: true });
|
|
1954
|
-
return () => {
|
|
1955
|
-
for (const id of ripples) cancelAnimationFrame(id);
|
|
1956
|
-
ripples.clear();
|
|
1957
|
-
document.removeEventListener("pointerover", onPointerOver, { capture: true });
|
|
1958
|
-
document.removeEventListener("click", onClick, { capture: true });
|
|
1959
|
-
};
|
|
1960
|
-
}
|
|
1961
|
-
|
|
1962
1880
|
//#endregion
|
|
1963
1881
|
//#region src/client/spot-core.ts
|
|
1964
1882
|
/**
|
|
@@ -2271,7 +2189,16 @@ function startBubbleAnchor() {
|
|
|
2271
2189
|
const side = bubble.getAttribute("data-side") ?? "top";
|
|
2272
2190
|
let dx = 0;
|
|
2273
2191
|
let dy = 0;
|
|
2274
|
-
|
|
2192
|
+
const bubbleCol = bubble.closest("[class*='sidebarCol']");
|
|
2193
|
+
const bubbleFrame = bubble.closest("[data-dsh-frame]");
|
|
2194
|
+
const sidebarExpanded = bubbleCol !== null && bubbleFrame !== null && !bubbleFrame.hasAttribute("data-sidebar-collapsed");
|
|
2195
|
+
if (sidebarExpanded) {
|
|
2196
|
+
dx = ar.left + ar.width / 2 - (br.left + br.width / 2);
|
|
2197
|
+
dy = ar.bottom + EDGE_GAP - br.top;
|
|
2198
|
+
const cr = bubbleCol.getBoundingClientRect();
|
|
2199
|
+
if (br.right + dx > cr.right - 8) dx = cr.right - 8 - br.right;
|
|
2200
|
+
if (br.left + dx < cr.left + 8) dx = cr.left + 8 - br.left;
|
|
2201
|
+
} else if (side === "right") {
|
|
2275
2202
|
dx = ar.right + RIGHT_GAP - br.left;
|
|
2276
2203
|
dy = ar.top + ar.height / 2 - (br.top + br.height / 2);
|
|
2277
2204
|
} else if (side === "bottom") {
|
|
@@ -2514,7 +2441,7 @@ function stampAll(added = null) {
|
|
|
2514
2441
|
for (const el of document.querySelectorAll("[role=\"menu\"], [role=\"dialog\"], [role=\"listbox\"]")) {
|
|
2515
2442
|
const cs = getComputedStyle(el);
|
|
2516
2443
|
if (cs.display === "none" || cs.visibility === "hidden") continue;
|
|
2517
|
-
popoverLive = true;
|
|
2444
|
+
if (el.closest("[" + "data-dsh-aqua-spot" + "]") !== null) popoverLive = true;
|
|
2518
2445
|
stampPopoverShell(el, cs);
|
|
2519
2446
|
}
|
|
2520
2447
|
document.documentElement.toggleAttribute("data-dsh-popover-live", popoverLive);
|
|
@@ -3522,8 +3449,10 @@ function startSpotlight() {
|
|
|
3522
3449
|
settle.delete(spot);
|
|
3523
3450
|
spot.style.removeProperty("transition");
|
|
3524
3451
|
}
|
|
3452
|
+
const isInputbar = spot.hasAttribute("data-dsh-inputbar");
|
|
3453
|
+
const lift = isInputbar ? local.height / 2 * .01 + local.height / 2 * (visual.width / 2) * tiltMax / TILT_PERSPECTIVE + .4 : 0;
|
|
3525
3454
|
spot.style.transformOrigin = `${local.left + local.width / 2}px ${local.top + local.height / 2}px`;
|
|
3526
|
-
spot.style.transform = `perspective(${TILT_PERSPECTIVE}px) rotateX(${tiltMax * -2 * dy}rad) rotateY(${tiltMax * 2 * dx}rad) scale(1.01)
|
|
3455
|
+
spot.style.transform = `perspective(${TILT_PERSPECTIVE}px) rotateX(${tiltMax * -2 * dy}rad) rotateY(${tiltMax * 2 * dx}rad) scale(1.01)` + (lift > 0 ? ` translateY(${-lift.toFixed(2)}px)` : "");
|
|
3527
3456
|
tilted.add(spot);
|
|
3528
3457
|
repinPanelBubbles();
|
|
3529
3458
|
} else if (tilted.has(spot)) {
|
|
@@ -3660,6 +3589,76 @@ function startSpotlight() {
|
|
|
3660
3589
|
};
|
|
3661
3590
|
}
|
|
3662
3591
|
|
|
3592
|
+
//#endregion
|
|
3593
|
+
//#region src/client/scroll-guard.ts
|
|
3594
|
+
/**
|
|
3595
|
+
* Popover scroll guard: wheel / trackpad scrolls over the input bar's anchored
|
|
3596
|
+
* lists (指令 command list, model menu, usage panels) must never scroll the
|
|
3597
|
+
* chat messages BEHIND the popover. Two failure modes, one guard:
|
|
3598
|
+
*
|
|
3599
|
+
* - a list that IS a scroller (the command listbox) reaches its boundary and
|
|
3600
|
+
* chains the remaining delta into the chat scroll container — the messages
|
|
3601
|
+
* behind the list keep scrolling after the list bottomed out;
|
|
3602
|
+
* - a popover that NEVER scrolls (the model menu is overflow:hidden with
|
|
3603
|
+
* fitting content) is skipped by the browser's scroll chain entirely, so the
|
|
3604
|
+
* wheel lands on the chat scroll container directly — CSS
|
|
3605
|
+
* `overscroll-behavior` cannot help there, because an element that never
|
|
3606
|
+
* scrolls is never consulted as a scroller.
|
|
3607
|
+
*
|
|
3608
|
+
* The guard listens on `wheel` (non-passive, document-level like every other
|
|
3609
|
+
* feed here) and lets the popover's own scrollers consume the delta natively;
|
|
3610
|
+
* only when NOTHING between the event target and the popover surface can
|
|
3611
|
+
* scroll in the delta's direction does it `preventDefault()` — the chain into
|
|
3612
|
+
* the page behind dies there. Scoped to popover surfaces ([role=menu],
|
|
3613
|
+
* [role=listbox], [role=dialog] and the stamped popover shell), so scrolling
|
|
3614
|
+
* everywhere else — the messages, the sidebar, the composer card — keeps the
|
|
3615
|
+
* stock behavior untouched.
|
|
3616
|
+
*/
|
|
3617
|
+
/** Popover surfaces whose scroll must not leak into the page behind them. */
|
|
3618
|
+
const SURFACE_SELECTOR = "[role=\"menu\"], [role=\"listbox\"], [role=\"dialog\"], [data-dsh-popover-shell]";
|
|
3619
|
+
/** Whether `node` is a user-scrollable box that can consume `delta` along the
|
|
3620
|
+
* Y (or X) axis right now. Only auto/scroll count: overflow:hidden boxes are
|
|
3621
|
+
* script-scrollable but the user wheel can never move them. */
|
|
3622
|
+
function canConsume(node, axis, delta) {
|
|
3623
|
+
const cs = getComputedStyle(node);
|
|
3624
|
+
const overflow = axis === "Y" ? cs.overflowY : cs.overflowX;
|
|
3625
|
+
if (overflow !== "auto" && overflow !== "scroll") return false;
|
|
3626
|
+
const max = axis === "Y" ? node.scrollHeight - node.clientHeight : node.scrollWidth - node.clientWidth;
|
|
3627
|
+
if (max <= 0) return false;
|
|
3628
|
+
const pos = axis === "Y" ? node.scrollTop : node.scrollLeft;
|
|
3629
|
+
if (delta < 0) return pos > .5;
|
|
3630
|
+
return pos < max - .5;
|
|
3631
|
+
}
|
|
3632
|
+
const onWheel = (event) => {
|
|
3633
|
+
if (event.defaultPrevented) return;
|
|
3634
|
+
const target = event.target;
|
|
3635
|
+
if (!(target instanceof Element)) return;
|
|
3636
|
+
const surface = target.closest(SURFACE_SELECTOR);
|
|
3637
|
+
if (surface === null) return;
|
|
3638
|
+
const deltaY = event.deltaY;
|
|
3639
|
+
const deltaX = event.deltaX;
|
|
3640
|
+
if (deltaY === 0 && deltaX === 0) return;
|
|
3641
|
+
let node = target;
|
|
3642
|
+
while (node !== null && node !== surface.parentElement) {
|
|
3643
|
+
if (node instanceof HTMLElement) {
|
|
3644
|
+
if (deltaY !== 0 && canConsume(node, "Y", deltaY)) return;
|
|
3645
|
+
if (deltaX !== 0 && canConsume(node, "X", deltaX)) return;
|
|
3646
|
+
}
|
|
3647
|
+
node = node.parentElement;
|
|
3648
|
+
}
|
|
3649
|
+
event.preventDefault();
|
|
3650
|
+
};
|
|
3651
|
+
/**
|
|
3652
|
+
* Attach the popover scroll guard.
|
|
3653
|
+
* @returns a disposer that drops the listener.
|
|
3654
|
+
*/
|
|
3655
|
+
function startScrollGuard() {
|
|
3656
|
+
document.addEventListener("wheel", onWheel, { passive: false });
|
|
3657
|
+
return () => {
|
|
3658
|
+
document.removeEventListener("wheel", onWheel);
|
|
3659
|
+
};
|
|
3660
|
+
}
|
|
3661
|
+
|
|
3663
3662
|
//#endregion
|
|
3664
3663
|
//#region src/client/theme-layer.ts
|
|
3665
3664
|
/** html attribute selecting the Aqua layer: CSS hooks and ambient effects. */
|
|
@@ -4362,11 +4361,11 @@ var AquaLayer = class {
|
|
|
4362
4361
|
dark = false;
|
|
4363
4362
|
tokenDisposer;
|
|
4364
4363
|
mainFluid;
|
|
4365
|
-
interactionDisposer;
|
|
4366
4364
|
themeListener;
|
|
4367
4365
|
seamDisposer;
|
|
4368
4366
|
spotlightDisposer;
|
|
4369
4367
|
bubbleDisposer;
|
|
4368
|
+
scrollGuardDisposer;
|
|
4370
4369
|
whaleHandle;
|
|
4371
4370
|
meshHandle;
|
|
4372
4371
|
/** Object URL of the current large-video wallpaper (revoked on replace). */
|
|
@@ -4782,6 +4781,7 @@ var AquaLayer = class {
|
|
|
4782
4781
|
this.startSeamStamper();
|
|
4783
4782
|
this.startSpotlightFeed();
|
|
4784
4783
|
this.startBubbleFeed();
|
|
4784
|
+
this.startScrollGuardFeed();
|
|
4785
4785
|
this.syncWhale();
|
|
4786
4786
|
this.syncMesh();
|
|
4787
4787
|
}
|
|
@@ -4821,6 +4821,8 @@ var AquaLayer = class {
|
|
|
4821
4821
|
this.spotlightDisposer = undefined;
|
|
4822
4822
|
this.bubbleDisposer?.();
|
|
4823
4823
|
this.bubbleDisposer = undefined;
|
|
4824
|
+
this.scrollGuardDisposer?.();
|
|
4825
|
+
this.scrollGuardDisposer = undefined;
|
|
4824
4826
|
this.whaleHandle?.dispose();
|
|
4825
4827
|
this.whaleHandle = undefined;
|
|
4826
4828
|
this.meshHandle?.dispose();
|
|
@@ -4844,19 +4846,11 @@ var AquaLayer = class {
|
|
|
4844
4846
|
try {
|
|
4845
4847
|
if (mainCanvas !== null) this.mainFluid = attachFluidShader(mainCanvas, this.fluidParams());
|
|
4846
4848
|
this.applyFluidPalettes();
|
|
4847
|
-
if (this.mainFluid !== undefined && mainCanvas !== null) {
|
|
4848
|
-
this.interactionDisposer = attachFluidInteractions({
|
|
4849
|
-
main: this.mainFluid,
|
|
4850
|
-
mainCanvas
|
|
4851
|
-
});
|
|
4852
|
-
}
|
|
4853
4849
|
} catch {
|
|
4854
4850
|
this.mainFluid = undefined;
|
|
4855
4851
|
}
|
|
4856
4852
|
}
|
|
4857
4853
|
teardownFluid() {
|
|
4858
|
-
this.interactionDisposer?.();
|
|
4859
|
-
this.interactionDisposer = undefined;
|
|
4860
4854
|
this.mainFluid?.dispose();
|
|
4861
4855
|
this.mainFluid = undefined;
|
|
4862
4856
|
}
|
|
@@ -4884,11 +4878,16 @@ var AquaLayer = class {
|
|
|
4884
4878
|
if (this.bubbleDisposer !== undefined) return;
|
|
4885
4879
|
this.bubbleDisposer = startBubbleAnchor();
|
|
4886
4880
|
}
|
|
4881
|
+
/** Attach the popover scroll guard (idempotent per mount). */
|
|
4882
|
+
startScrollGuardFeed() {
|
|
4883
|
+
if (this.scrollGuardDisposer !== undefined) return;
|
|
4884
|
+
this.scrollGuardDisposer = startScrollGuard();
|
|
4885
|
+
}
|
|
4887
4886
|
};
|
|
4888
4887
|
|
|
4889
4888
|
//#endregion
|
|
4890
4889
|
//#region \0dsh-css:C:\Users\Administrator\Desktop\dsh_workspace\dsh-client-ui-seaglass\src\client\aqua.module.aqcss
|
|
4891
|
-
const css$1 = "/* ============================================================================\r\n * Aqua theme layer —the deep-sea skin for the whole Web surface.\r\n * Every rule is gated on the `data-dsh-aqua` attribute the plugin puts on\r\n * <html> while enabled (removed on disable, and the stylesheet itself is\r\n * unloaded with the plugin bundle), so off == the stock UI, exactly.\r\n * Selectors deliberately use attribute/element hooks and stable data-* seams\r\n * (never hashed module classes) so the layer survives recompiles.\r\n * ========================================================================== */\r\n\r\n/* ---------- Canvas: body paints the base color; the frame goes transparent\r\n so the ambient glow (::after) shows through the main column. The\r\n conversation and details surfaces paint their own opaque base fill over\r\n the frame —lift them too, or the glow never reaches the eye. ---------- */\r\n[data-dsh-aqua] body {\r\n background: var(--dsw-alias-bg-base);\r\n}\r\n\r\n/* ---------- Knobs: the settings row writes --dsh-aqua-blur (px),\r\n --dsh-aqua-frost (a 0-2 alpha multiplier) and --dsh-aqua-fluid-hue (deg)\r\n onto <html>. The glass surfaces below consume them, so the sliders move\r\n the whole skin live. Shared card recipes keep the four main panes in lock\r\n step; the smaller surfaces (stats / bubble / menu / + button) keep their\r\n own base alphas and only scale by the same frost multiplier. ---------- */\r\n[data-dsh-aqua] {\r\n /* FLAT glass: one even tone per scheme (no vertical gradient — a darker\r\n bottom stop read as a black fade inside the composer). */\r\n --dsh-aqua-glass-card-light: color-mix(in srgb, rgb(255 255 255) calc(42% * var(--dsh-aqua-frost, 1)), transparent);\r\n /* Dark glass is a NEUTRAL cool gray, not blue: raising frost to max would\r\n otherwise reveal the blue base and read as a blue slab in dark mode. */\r\n --dsh-aqua-glass-card-dark: color-mix(in srgb, rgb(34 38 47) calc(50% * var(--dsh-aqua-frost, 1)), transparent);\r\n /* Per-script font stacks (the settings page writes the user's picks; the\r\n fallbacks here cover the pre-apply frame). */\r\n --dsh-aqua-font-latin: 'Space Grotesk Variable';\r\n --dsh-aqua-font-cjk: 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei';\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-frame] {\r\n background: transparent;\r\n}\r\n\r\n[data-dsh-aqua] [data-phase],\r\n[data-dsh-aqua] [data-dsh-details] {\r\n background: transparent;\r\n}\r\n\r\n/* The header card floats ABOVE the transcript: the scroll body slides up\r\n behind the frosted glass (negative margin) and its padding starts content\r\n below the card, so scrolling text passes under the header and stays\r\n visible through the blur instead of hard-clipping at the card edge.\r\n z-index 8 (not 6) keeps it above the markdown CodeBlock sticky banner,\r\n which the stock UI stacks at z-index 6 —otherwise a code block's copy\r\n button row slides OVER the header and drifts as it scrolls past. */\r\n[data-dsh-float] [data-phase='active'] header {\r\n position: relative;\r\n z-index: 8;\r\n}\r\n\r\n/* The floating header breaks the code block banner's sticky anchoring, so\r\n disable stickiness —the banner stays on its code block and scrolls with\r\n it instead of sliding over the header and drifting. */\r\n[data-dsh-float] [class*='banner'] {\r\n position: static;\r\n}\r\n\r\n[data-dsh-float] [data-phase='active'] [data-conversation-scroll] {\r\n margin-top: -95px;\r\n padding-top: 107px;\r\n}\r\n\r\n/* ---------- Conversation scrollport hardening: the chat column must never\r\n grow a horizontal scrollbar of its own by accident. overflow-x: clip\r\n (NOT hidden — clip creates no scroll container, so a stray wide child can\r\n never expose a horizontal scrollbar here; wide content keeps scrolling\r\n inside its own block / diff / table panes).\r\n scrollbar-gutter: auto OVERRIDES the Host's own stable reservation on the\r\n scroll body: with the gutter permanently reserved, the Host's custom\r\n webkit scrollbar styling painted that empty track as a PERMANENT phantom\r\n bar along the chat's right edge whenever the content did not overflow —\r\n the whole first-response wait read as \"an unexpected vertical scrollbar\".\r\n auto restores the on-demand scrollbar: absent while waiting, real once\r\n the conversation actually outgrows the viewport (the one-time 8px column\r\n shift when it first appears is stock-standard and far less wrong than a\r\n scrollbar that never goes away). ---------- */\r\n[data-dsh-aqua] [data-conversation-scroll] {\r\n overflow-x: clip;\r\n scrollbar-gutter: auto;\r\n}\r\n\r\n/* No scrim: the transcript and details sit directly on the (now slightly\r\n darker) fluid —the fluid itself provides the ground, so no dark veil\r\n covers either phase. */\r\n\r\n/* NOTE: the scrollport must NOT carry a mask-image. A mask turns the scroll\r\n container into a backdrop root for its sticky composer child, which breaks\r\n the composer card's `backdrop-filter` (the \"send bar won't blur what's\r\n behind it\" bug) —content scrolls behind it sharp instead of frosted. */\r\n\r\n/* Active phase: drop the composer seat's opaque bottom slab and its 36px\r\n fade band entirely —the base rule (`.root[data-phase='active']\r\n .composerSeat`) is (0,3,0), so the doubled attribute selector below must\r\n out-rank it or the fluid stays hidden behind a solid navy slab. */\r\n[data-dsh-aqua] [data-phase] [class*='composerSeat'][class*='composerSeat'] {\r\n background: none;\r\n}\r\n\r\n/* ---------- Ambient scene: the living deep-sea layer (injected by the\r\n plugin). A deepseek.com-style fluid board —top light wash plus three\r\n slowly drifting blurred fluid masses —with marine life riding over it. ---------- */\r\n[data-dsh-aqua] [data-dsh-aqua-ambient] {\r\n position: fixed;\r\n inset: 0;\r\n z-index: -1;\r\n pointer-events: none;\r\n overflow: hidden;\r\n background:\r\n radial-gradient(760px 420px at 50% -8%, rgba(160, 200, 255, 0.26), transparent 70%),\r\n linear-gradient(180deg, rgba(156, 193, 231, 0.22) 0%, rgba(156, 193, 231, 0) 38%),\r\n radial-gradient(900px 420px at 50% 108%, rgba(156, 193, 231, 0.14), transparent 70%);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-dsh-aqua-ambient] {\r\n background:\r\n radial-gradient(760px 420px at 50% -8%, rgba(110, 165, 255, 0.13), transparent 70%),\r\n linear-gradient(180deg, rgba(94, 143, 224, 0.13) 0%, rgba(94, 143, 224, 0) 46%),\r\n radial-gradient(900px 420px at 50% 108%, rgba(94, 143, 224, 0.09), transparent 70%);\r\n}\r\n\r\n/* Background brightness knob: dark mode darkens (0 = pure black, 50 = off),\r\n light mode brightens (50 = off, 100 = pure white) — the layer writes only\r\n the overlay of the resolved scheme, so at most one layer is ever opaque.\r\n Both layers live in ::after (painted ABOVE the fluid canvas / wallpaper\r\n children); ::before would sit behind them and be invisible. */\r\n[data-dsh-aqua] [data-dsh-aqua-ambient]::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background-image:\r\n linear-gradient(rgba(255, 255, 255, var(--dsh-aqua-brightness-white, 0)), rgba(255, 255, 255, var(--dsh-aqua-brightness-white, 0))),\r\n linear-gradient(rgba(0, 0, 0, var(--dsh-aqua-brightness-black, 0)), rgba(0, 0, 0, var(--dsh-aqua-brightness-black, 0)));\r\n}\r\n\r\n@media (prefers-reduced-motion: no-preference) {\r\n [data-dsh-aqua] [data-dsh-aqua-ambient] {\r\n animation: dsh-aqua-breathe 9s var(--ds-ease-in-out) infinite alternate;\r\n }\r\n}\r\n\r\n@keyframes dsh-aqua-breathe {\r\n from { opacity: 0.86; }\r\n to { opacity: 1; }\r\n}\r\n\r\n/* Fluid board canvas: the ported deepseek.com shader fills the whole\r\n backdrop —one unified water under every column. The tone picker supplies\r\n the palette (depth baked into the colors), so no global filter here. */\r\n[data-dsh-aqua] [data-dsh-aqua-fluid-canvas] {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n/* Custom wallpaper: the backdrop-source knob swaps the fluid board for an\r\n image or video. `object-fit: cover` fills the page while preserving\r\n aspect ratio; the blur and frost knobs ride --dsh-aqua-wallpaper-blur /\r\n -frost. The layer is a STANDALONE fixed element (not inside the ambient):\r\n videos fail to composite under the ambient's animated opacity group. */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper] {\r\n position: fixed;\r\n inset: 0;\r\n z-index: -1;\r\n overflow: hidden;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper-img] {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n}\r\n\r\n/* Video wallpaper: a plain <video> element (the browser's own decoder, no\r\n player chrome) filling the layer with cover crop at any window size. A\r\n direct element — not an iframe — keeps backdrop-filter sampling it, so\r\n the glass panels stay frosted above the video. */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper-video] {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n border: 0;\r\n pointer-events: none;\r\n /* The 视频模糊度 knob drives the film's own blur. */\r\n filter: blur(var(--dsh-aqua-video-blur, 0px));\r\n}\r\n\r\n/* Wallpaper blur applies to images only — videos play sharp. */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper-img] {\r\n filter: blur(var(--dsh-aqua-wallpaper-blur, 0px));\r\n}\r\n\r\n/* Frost veil over the wallpaper (white in light, near-black in dark). */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper]::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background: rgb(255 255 255 / var(--dsh-aqua-wallpaper-frost, 0));\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-dsh-aqua-wallpaper]::after {\r\n background: rgb(12 18 27 / var(--dsh-aqua-wallpaper-frost, 0));\r\n}\r\n\r\n/* Video wallpaper: a dim acrylic scrim keeps the chat text readable — the\r\n video stays alive behind it but calm. The 视频亮度 knob drives the veil's\r\n alpha (--dsh-aqua-video-dim); the 视频模糊度 knob blurs the film itself. */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper][data-media='video']::after {\r\n display: block;\r\n background: rgb(255 255 255 / calc(var(--dsh-aqua-video-dim, 0.36) * 1.3));\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-dsh-aqua-wallpaper][data-media='video']::after {\r\n background: rgb(8 12 20 / var(--dsh-aqua-video-dim, 0.36));\r\n}\r\n\r\n/* Particle whale: centered on the main column (position/size arrive inline\r\n from the engine — the [data-phase] area right of the sidebar), screen\r\n blended over the dark backdrop, multiply blended (gray particles) over\r\n the light one. */\r\n[data-dsh-aqua] [data-dsh-aqua-whale] {\r\n position: absolute;\r\n transform: translate(-50%, -50%);\r\n pointer-events: none;\r\n mix-blend-mode: screen;\r\n opacity: 0.92;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-whale][data-scheme='light'] {\r\n mix-blend-mode: multiply;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-whale] canvas {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n/* Backdrop source: hide whichever board is not the active one. */\r\n[data-dsh-aqua] [data-dsh-aqua-ambient][data-background='wallpaper'] [data-dsh-aqua-fluid-canvas] {\r\n display: none;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper][data-background='fluid'] {\r\n display: none;\r\n}\r\n\r\n/* Interactive mesh: the site's dot-grid decoration, full-viewport inside the\r\n ambient scene; the pointer interacts through the window listener. */\r\n[data-dsh-aqua] [data-dsh-aqua-mesh] {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n}\r\n\r\n/* Ambient marine life: brand-fish silhouettes, shrimp, bubbles, plankton.\r\n Positions, sizes, and per-critter timing arrive inline from the plugin\r\n markup. The critters toggle hides the whole group. */\r\n[data-dsh-aqua] [data-dsh-aqua-ambient][data-critters='off'] [data-aqua-critter] {\r\n display: none;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter] {\r\n position: absolute;\r\n color: #7ea4df;\r\n opacity: 0.22;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter='fish'] {\r\n animation: dsh-aqua-fish-swim 12s var(--ds-ease-in-out) infinite;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter='fish-left'] {\r\n animation: dsh-aqua-fish-swim-left 16s var(--ds-ease-in-out) infinite;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter='bubble'] {\r\n color: #a9c6ef;\r\n opacity: 0;\r\n animation: dsh-aqua-bubble-rise 9s ease-in infinite;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter='plankton'] {\r\n color: #7ea4df;\r\n animation: dsh-aqua-plankton 5s ease-in-out infinite;\r\n}\r\n\r\n/* Uneven timing percentages make the swim read as living tempo: a quick\r\n dart, a long glide, then a short settle. Per-fish durations arrive\r\n inline (9s / 14s / 19s), so every whale swims at its own pace. */\r\n@keyframes dsh-aqua-fish-swim {\r\n 0% { transform: translate3d(0, 0, 0) rotate(-5deg); }\r\n 30% { transform: translate3d(40px, -15px, 0) rotate(4deg); }\r\n 70% { transform: translate3d(52px, -18px, 0) rotate(3deg); }\r\n 100% { transform: translate3d(0, 0, 0) rotate(-5deg); }\r\n}\r\n\r\n@keyframes dsh-aqua-fish-swim-left {\r\n 0% { transform: translate3d(0, 0, 0) scaleX(-1) rotate(-5deg); }\r\n 30% { transform: translate3d(-34px, -12px, 0) scaleX(-1) rotate(4deg); }\r\n 70% { transform: translate3d(-44px, -15px, 0) scaleX(-1) rotate(3deg); }\r\n 100% { transform: translate3d(0, 0, 0) scaleX(-1) rotate(-5deg); }\r\n}\r\n\r\n@keyframes dsh-aqua-bubble-rise {\r\n 0% { transform: translate3d(0, 0, 0); opacity: 0; }\r\n 10% { opacity: 0.5; }\r\n 100% { transform: translate3d(8px, -150px, 0); opacity: 0; }\r\n}\r\n\r\n@keyframes dsh-aqua-plankton {\r\n 0%, 100% { opacity: 0.1; }\r\n 50% { opacity: 0.38; }\r\n}\r\n\r\n/* ---------- Corner language: 14px surfaces, 10px controls, 8px atoms.\r\n Roles and stable data-* seams only (never hashed module classes). ---------- */\r\n\r\n/* Raised surfaces: menus, dialogs, toasts, hover cards, and hooked owners. */\r\n[data-dsh-float] [role='menu'],\r\n[data-dsh-float] [role='dialog'],\r\n[data-dsh-float] [role='alert'],\r\n[data-dsh-float] [data-dsh-surface] {\r\n border-radius: 14px;\r\n}\r\n\r\n/* The new-session button is glass too: translucent fill + backdrop blur,\r\n like the composer attach \"+\" bead. Its frost rides --dsh-aqua-surface-frost\r\n (the frost knob + 20 points, written by the layer), so it always reads\r\n noticeably frosted relative to the cards around it. */\r\n[data-dsh-float] [data-dsh-surface] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(62% * var(--dsh-aqua-surface-frost, 1)), transparent);\r\n border: 1px solid rgba(19, 45, 83, 0.16);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-float] [data-dsh-surface]:hover:not(:disabled) {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(74% * var(--dsh-aqua-surface-frost, 1)), transparent);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-surface] {\r\n background: color-mix(in srgb, rgb(42 46 56) calc(62% * var(--dsh-aqua-surface-frost, 1)), transparent);\r\n border-color: rgba(148, 180, 220, 0.2);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-surface]:hover:not(:disabled) {\r\n background: color-mix(in srgb, rgb(54 58 70) calc(70% * var(--dsh-aqua-surface-frost, 1)), transparent);\r\n}\r\n\r\n/* Small atoms: menu cells, tooltips, pills. */\r\n[data-dsh-float] [role='menuitem'],\r\n[data-dsh-float] [role='tooltip'],\r\n[data-dsh-float] [class*='pill'] {\r\n border-radius: 8px;\r\n}\r\n\r\n/* Buttons (component roots carry the `button`-named class; icon circles\r\n carry `iconButton`; the sidebar search circle is its own family). */\r\n[data-dsh-float] button[class*='button'] {\r\n border-radius: 10px;\r\n}\r\n\r\n[data-dsh-float] [class*='iconButton'],\r\n[data-dsh-float] [class*='searchButton'] {\r\n border-radius: 8px;\r\n}\r\n\r\n/* Composer attach \"+\": frosted circle over the card's own glass, so the\r\n control reads as a brighter bead on the glass rather than a solid token. */\r\n[data-dsh-float] [data-dsh-add] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(40% * var(--dsh-aqua-frost, 1)), transparent);\r\n border: 1px solid rgba(19, 45, 83, 0.18);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n/* Composer attach \"+\" hover: the bead answers with an aqua-glass highlight\r\n (blue-tinted fill + ring + soft halo) instead of a plain brighter white. */\r\n[data-dsh-float] [data-dsh-add]:hover:not(:disabled) {\r\n background: color-mix(in srgb, #6e9be8 18%, transparent);\r\n border-color: rgba(110, 155, 232, 0.4);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 0 10px rgba(110, 155, 232, 0.28);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-add] {\r\n background: color-mix(in srgb, rgb(42 46 56) calc(40% * var(--dsh-aqua-frost, 1)), transparent);\r\n border-color: rgba(148, 180, 220, 0.25);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-add]:hover:not(:disabled) {\r\n background: rgba(148, 180, 220, 0.2);\r\n border-color: rgba(148, 180, 220, 0.5);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.08),\r\n 0 0 10px rgba(110, 155, 232, 0.28);\r\n}\r\n\r\n/* Chat bubbles become glass: dark mode = black glass, light = frosted\r\n white, both with a backdrop blur so the fluid shimmers behind the text. */\r\n[data-dsh-float] [class*='bubble'] {\r\n border-radius: 14px;\r\n border: 1px solid rgba(19, 45, 83, 0.14);\r\n background: color-mix(in srgb, rgb(255 255 255) calc(42% * var(--dsh-aqua-frost, 1)), transparent);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [class*='bubble'] {\r\n border-color: rgba(148, 180, 220, 0.14);\r\n background: color-mix(in srgb, rgb(0 0 0) calc(40% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n/* Video wallpaper: bubbles carry a REAL plate (frost-independent) so the\r\n text never fights the film; the backdrop blur still frosts the video. */\r\nhtml[data-dsh-float][data-dsh-aqua-wallpaper][data-dsh-aqua-media='video'] [class*='bubble'] {\r\n background: color-mix(in srgb, rgb(255 255 255) 70%, transparent);\r\n border-color: rgba(19, 45, 83, 0.2);\r\n}\r\n\r\nhtml[data-dsh-float][data-dsh-aqua-wallpaper][data-dsh-aqua-media='video'] body[data-ds-dark-theme] [class*='bubble'] {\r\n background: color-mix(in srgb, rgb(0 0 0) 50%, transparent);\r\n border-color: rgba(148, 180, 220, 0.22);\r\n}\r\n\r\n/* Card family (hover cards, panels, plugin cards, tool cards, the composer). */\r\n[data-dsh-float] [class*='card'] {\r\n border-radius: 14px;\r\n}\r\n\r\n/* Composer card: the site's start-chat glass recipe —24px corners,\r\n frosted translucent fill, backdrop blur, and a soft drop shadow.\r\n (Standard `backdrop-filter` only: the prefixed alias is ignored by this\r\n Chromium and lightningcss drops the standard property when both appear.\r\n Declared after the card-family rule so the 24px corner wins the tie.) */\r\n[data-dsh-float] [data-composer-card],\r\n[data-dsh-float] [data-composer-card]::after {\r\n border-radius: 24px;\r\n}\r\n\r\n[data-dsh-float] [data-composer-card] {\r\n position: relative;\r\n z-index: 8;\r\n background: var(--dsh-aqua-glass-card-light);\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 36px rgba(19, 45, 83, 0.16);\r\n}\r\n\r\n/* The blur rides a ::before so the card itself never becomes a containing\r\n block for fixed descendants (send/stop tooltip, plugin modals). */\r\n[data-dsh-float] [data-composer-card]::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-composer-card] {\r\n background: var(--dsh-aqua-glass-card-dark);\r\n border: 1px solid rgba(148, 180, 220, 0.32);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 10px 36px rgba(2, 6, 14, 0.5);\r\n}\r\n\r\n/* Fused state: once the stats line is docked underneath, the WHOLE inputbar\r\n becomes ONE glass slab — a single background, blur, border and shadow on\r\n the wrapper. The card and stats turn transparent inside it (their blur\r\n and tone can never drift apart again); only the hairline divider at the\r\n seam stays. The slab shrinks to its content width (max-content) so the\r\n glass hugs the composer exactly. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) {\r\n width: calc(var(--dsh-chat-content-width) + 32px);\r\n max-width: none;\r\n margin: 0 auto 12px;\r\n padding: 0;\r\n position: relative;\r\n isolation: isolate;\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-radius: 24px;\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 36px rgba(19, 45, 83, 0.16);\r\n}\r\n\r\n/* Same treatment as the composer card: blur on ::before, not the slab itself. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats])::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-inputbar]:has([data-dsh-stats]) {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 10px 36px rgba(2, 6, 14, 0.5);\r\n}\r\n\r\n[data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) [data-composer-card] {\r\n border: none;\r\n border-radius: 0;\r\n background: transparent;\r\n box-shadow: none;\r\n backdrop-filter: none;\r\n}\r\n\r\n/* In the fused slab the inputbar's ::before owns the blur; the card's own\r\n ::before would double-blur, so drop it there. */\r\n[data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) [data-composer-card]::before {\r\n display: none;\r\n}\r\n\r\n[data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) [data-composer-card]::after {\r\n display: none;\r\n}\r\n\r\n[data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) [data-dsh-stats] {\r\n width: 100%;\r\n max-width: none;\r\n /* Dock at the very bottom of the slab: the band's MIN height equals the\r\n 24px corner radius, so the divider lands exactly where the left/right\r\n bottom corners start to curve. Block layout (not flex) keeps the stock\r\n single-line ellipsis, so long stats never spill past the right edge. */\r\n margin: auto 0 0;\r\n min-height: 24px;\r\n box-sizing: border-box;\r\n display: block;\r\n padding: 2px 16px;\r\n border: none;\r\n border-top: 1px solid rgba(19, 45, 83, 0.18);\r\n border-radius: 0;\r\n background: transparent;\r\n box-shadow: none;\r\n backdrop-filter: none;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-inputbar]:has([data-dsh-stats]) [data-dsh-stats] {\r\n border-top-color: rgba(148, 180, 220, 0.24);\r\n}\r\n\r\n/* Hero 未选工作区时,stock 给输入卡加 cardWorkspaceTrigger 变体,用 SVG mask\r\n (stroke-dasharray 4 4)的 ::after 叠层画一圈虚线环提示\"点击选择工作区\",\r\n 悬停转为 accent 蓝——玻璃面板上读作一圈凭空的蓝色虚线矩形(此前主题还在\r\n 把 mask 圆角重画成 24px 来保留它)。占位文案与 pointer 光标已表达可点性,\r\n 整体停掉该叠层;stock 仅在触发器变体下渲染 ::after,常规态是空操作。 */\r\n[data-dsh-float] [data-composer-card]::after {\r\n display: none;\r\n}\r\n\r\n/* Block family (code / terminal / diff / read / web / search): the corner\r\n variables ride the same elements, so banners and footers follow. */\r\n[data-dsh-float] [class*='block'] {\r\n border-radius: 14px;\r\n --dsl-code-block-border-radius: 14px;\r\n --dsl-diff-radius: 14px;\r\n --dsl-read-radius: 14px;\r\n --dsl-terminal-radius: 14px;\r\n --dsl-web-radius: 14px;\r\n --dsl-search-radius: 14px;\r\n /* The block shell is the ONE glass layer: translucent code-block tokens\r\n + a backdrop blur turn the dark slabs into frosted panes. */\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n/* The DSL paints its own translucent layers UNDER the shell (the pre and\r\n the banner wrap reuse the code-block token / bg-base) — stacking them\r\n over the shell's glass squares the alpha and kills the blur. Flatten\r\n them so the shell is the only glass surface. */\r\n[data-dsh-aqua] [class*='block'] pre,\r\n[data-dsh-aqua] [class*='block'] [class*='bannerWrap'] {\r\n background: transparent;\r\n}\r\n\r\n/* ---------- Session header: a detached glass card, same recipe as the\r\n composer. The bottom edge opens into the chat —no bottom border and a\r\n shallow shadow, so the original header/chat divider line is gone. ---------- */\r\n[data-dsh-float] header {\r\n margin: 12px 16px 0;\r\n padding: 10px 16px 8px;\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-bottom-color: transparent;\r\n border-radius: 20px;\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 34px rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-float] header::after {\r\n display: none;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] header {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n border-bottom-color: transparent;\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 8px 30px rgba(2, 6, 14, 0.32);\r\n}\r\n\r\n/* Collapsed: the floating rail reaches 12px into the chat gutter, so the\r\n header card steps right (28px inset = 16px clear of the rail's edge) —\r\n the sidebar keeps its geometry, the top bar does the adjusting. */\r\n[data-dsh-float] [data-dsh-frame][data-sidebar-collapsed] header {\r\n margin-left: 28px;\r\n}\r\n\r\n/* ---------- Sidebar: header-style glass card. Light = neutral cool white\r\n (no green cast) with a luminous right edge; dark keeps its green-teal\r\n tint. The blur rides a ::before so the sidebar itself never becomes a\r\n containing block — the settings/plugin dialog mounts INSIDE the column and\r\n must stay viewport-anchored; keeping the blur on the pane itself would\r\n re-anchor it (and force the dialog-open backdrop-filter kill that made the\r\n glass abruptly lose its frost). ---------- */\r\n[data-dsh-float] [class*='sidebarCol']::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-float] [class*='sidebarCol'] {\r\n position: relative;\r\n /* Above the header card (8): the settings panel is a fixed overlay\r\n trapped in this stacking context, so the sidebar itself must outrank\r\n the header or the panel's top edge sits under the top bar. */\r\n z-index: 9;\r\n margin: 12px;\r\n padding: 10px 12px 14px;\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-right: 1px solid rgba(150, 190, 245, 0.65);\r\n border-radius: 20px;\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 34px rgba(19, 45, 83, 0.16);\r\n overflow: hidden;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [class*='sidebarCol'] {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n border-right: 1px solid rgba(148, 180, 220, 0.2);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 8px 30px rgba(2, 6, 14, 0.32);\r\n}\r\n\r\n/* Collapsed rail: floats too (mica mode). The rail keeps the app's own\r\n geometry: the frame's grid track slides 256→56 (300ms) while the app\r\n fades the frozen wide content out (150ms) — pinning a width here would\r\n clip the outgoing content instantly and hide that fade. The floating gap\r\n comes from a 12px left margin plus a matching negative right margin\r\n (outer size unchanged — the main column does not move; the rail just\r\n reaches 12px into the chat gutter). Top/bottom margins are 12px too,\r\n aligning the rail with the header card's top and the composer's bottom.\r\n Padding must be zeroed explicitly: the expanded rule's 12px horizontal\r\n padding would otherwise shove the rail buttons out of the narrow column.\r\n Compat mode has no data-dsh-float, so it keeps the stock rail untouched. */\r\n[data-dsh-float] [data-dsh-frame][data-sidebar-collapsed] [class*='sidebarCol'] {\r\n margin: 12px -12px 12px 12px;\r\n padding: 0;\r\n border-radius: 16px;\r\n /* The right margin rides the same clock as the fade, so the rail eases\r\n into its floating spot as the wide content dissolves. The transform\r\n entry keeps the hover press smooth while collapsed (the collapsed rule\r\n out-ranks the press transition, so it must carry transform too). */\r\n transition: margin 150ms var(--ds-ease-in-out), border-radius 150ms var(--ds-ease-in-out), transform 0.1s ease-out;\r\n}\r\n\r\n/* The sidebar root freezes at the expanded column width via an inline\r\n style (the collapse crossfade needs it) —release it so the content\r\n follows the glass panel's width instead of overflowing its right edge.\r\n Scoped to the dedicated seam: a broad `[class*='root']` selector would\r\n also hit the settings panel (which renders inside the sidebar column)\r\n and collapse its rows into vertical text. */\r\n[data-dsh-float] [data-dsh-frame]:not([data-sidebar-collapsed]) [data-dsh-sidebar-root] {\r\n width: 100% !important;\r\n}\r\n\r\n/* ---------- Trajectory view: a glass panel aligned with the header card's\r\n left/right edges (16px insets), frosted like the other surfaces. ---------- */\r\n[data-dsh-float] [data-dsh-trajectory] {\r\n margin: 8px 16px 12px;\r\n width: calc(100% - 32px);\r\n height: calc(100% - 20px);\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-radius: 20px;\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 34px rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n overflow: hidden;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-trajectory] {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 8px 30px rgba(2, 6, 14, 0.32);\r\n}\r\n\r\n/* The toolbar and timeline surfaces go transparent so the glass shows through. */\r\n[data-dsh-float] [data-dsh-trajectory] [role='toolbar'],\r\n[data-dsh-float] [data-dsh-trajectory] section[aria-label='Trajectory timeline'] {\r\n background: transparent;\r\n}\r\n\r\n/* ---------- Stats line: the composer card's docked footer (original\r\n styling). It shares the card's glass blur/width/border; the distinction\r\n is a hairline divider at the seam plus a slightly more transparent\r\n (recessed) fill. The seam itself is glued by the spotlight layer's fuse\r\n strip (see below), so the two still read as one piece on screen. ---------- */\r\n[data-dsh-float] [data-dsh-inputbar]:not([class*='hero']) {\r\n padding-bottom: 12px;\r\n}\r\n\r\n[data-dsh-float] [data-dsh-stats] {\r\n position: relative;\r\n z-index: 8;\r\n width: calc(var(--dsh-chat-content-width) + 32px);\r\n max-width: none;\r\n margin: 0 auto;\r\n padding: 2px 16px;\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n /* The ONLY seam cue: one hairline between the two pieces of the same\r\n glass slab (the composer card drops its bottom border when fused). */\r\n border-top: 1px solid rgba(19, 45, 83, 0.18);\r\n border-radius: 0 0 24px 24px;\r\n /* Continues the card's FLAT tone exactly, so the two read as one piece\r\n of glass with no tonal step at the seam. */\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow: 0 10px 36px rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n /* Stats text: neutral slate (dark on light glass, near-white on dark\r\n glass) — kills the stock blue-gray cast. */\r\n color: rgb(38 46 62 / 0.9);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-stats] {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n border-top-color: rgba(148, 180, 220, 0.24);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow: 0 10px 36px rgba(2, 6, 14, 0.5);\r\n color: rgb(228 236 248 / 0.92);\r\n}\r\n\r\n/* Composer placeholder: neutral, scheme-adaptive — no blue hint. */\r\n[data-dsh-float] [data-composer-card] textarea::placeholder {\r\n color: rgb(55 64 84 / 0.5);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-composer-card] textarea::placeholder {\r\n color: rgb(205 216 234 / 0.52);\r\n}\r\n\r\n/* ---------- Cursor spotlight glow: the official feature-card glow on the\r\n glass panes. The overlay div (data-dsh-aqua-glow) is appended inside every\r\n data-dsh-aqua-spot pane by the controller, which writes the cursor\r\n position into the inline background per pointermove and lights the pane\r\n with the data-spot-on marker. The glow sits BEHIND the glass (z-index -1)\r\n so the light diffuses through the translucent surface and never covers\r\n the content or the outline. ---------- */\r\n[data-dsh-aqua][data-dsh-aqua-spotlight] [data-dsh-aqua-spot] {\r\n position: relative;\r\n /* A stacking context per pane: the glow sits at z-index -1 INSIDE it. */\r\n isolation: isolate;\r\n}\r\n\r\n/* The injected glow div must never affect layout: inert by default (compat\r\n mode / toggle off), absolute-positioned only while the glow is on. */\r\n[data-dsh-aqua] [data-dsh-aqua-glow] {\r\n display: none;\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-aqua-spotlight] [data-dsh-aqua-glow] {\r\n display: block;\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 0.3s ease;\r\n z-index: -1;\r\n /* The glow color follows the fluid tone: the layer writes\r\n --dsh-aqua-spot-color on <html> from the 色调 slider. */\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-aqua-spotlight] [data-dsh-aqua-spot][data-spot-on] [data-dsh-aqua-glow] {\r\n opacity: 1;\r\n}\r\n\r\n/* The fused composer + stats spot is an invisible wrapper (no radius of its\r\n own) — give its glow the fused card's 24px corners. */\r\n[data-dsh-aqua][data-dsh-aqua-spotlight] [data-dsh-inputbar][data-dsh-aqua-spot] [data-dsh-aqua-glow] {\r\n border-radius: 24px;\r\n}\r\n\r\n/* The settings/plugin dialog mounts INSIDE the sidebar column as a fixed\r\n overlay. Its viewport anchoring was previously preserved by killing the\r\n sidebar's own backdrop-filter while open — which made the glass abruptly\r\n lose its frost (a dark → bright jump). The blur now lives on the\r\n sidebar's ::before (see above), so the pane itself is never a containing\r\n block and no dialog-open kill is needed: the glass keeps its look and the\r\n dialog still escapes. The compat rule below still releases the frame's\r\n clipping/transform for the dialog's fixed overlay. */\r\n[data-dsh-aqua] [class*='sidebarCol']:has([role='dialog']),\r\n[data-dsh-aqua] [data-dsh-frame]:has([role='dialog']) {\r\n overflow: visible !important;\r\n transform: none !important;\r\n}\r\n\r\n/* ---------- Hover tilt: the geometric press is JS-driven (spotlight.ts\r\n writes `perspective(800px) rotateX/rotateY` inline, tracking the cursor —\r\n cursor right ⇒ right edge sinks, left edge lifts). A short transform\r\n transition smooths both the press-in and the eased return, so the pane\r\n glides into the press instead of flashing. */\r\n[data-dsh-float][data-dsh-aqua-press] [data-dsh-aqua-spot] {\r\n transition: transform 0.1s ease-out;\r\n}\r\n\r\n/* ---------- Phantom-overflow kill switch: while a pane carries ANY\r\n transform (tilt, glide-hold), its position:fixed descendants re-anchor\r\n into the pane's coordinate space — a box written in viewport coordinates\r\n (the app's popovers/tooltips) lands hundreds of px below the viewport and\r\n inflates every ancestor scroll region: the scrollbar thumb jumps up and\r\n stays while the pane is hovered. overflow:clip caps the pane's scrollable\r\n overflow at 64px outside its own box — pinned bubbles (≤36px outside)\r\n stay visible, poisoned boxes (hundreds of px outside) stop contributing.\r\n Flat panes are unaffected: their fixed descendants keep the viewport as\r\n containing block and escape the clip entirely. Menus/dialogs/listboxes\r\n are exempted via data-dsh-popover-live (stamped by the seam stamper only\r\n while one is VISIBLE — the keeper glides the tilt home for them anyway).\r\n ---------- */\r\n[data-dsh-aqua][data-dsh-float]:not([data-dsh-popover-live]) [data-dsh-aqua-spot] {\r\n overflow: clip;\r\n overflow-clip-margin: 64px;\r\n}\r\n\r\n/* 侧栏例外:64px 容忍区为钉住气泡而设,但侧栏收/展动画中冻结的宽内容与图标\r\n 都落在窄轨边缘 64px 以内,会整片\"飞出\"列外(\"新会话\"按钮探出 29px、图标\r\n 贴着 64px 线可见)。侧栏按盒缘裁剪;气泡逃逸交给 5f 的溢出释放(仅收起\r\n 稳态 + tooltip 在场,且动画窗口 [data-dsh-sidebar-anim] 内抑制)。 */\r\n[data-dsh-aqua][data-dsh-float]:not([data-dsh-popover-live]) [data-dsh-aqua-spot][class*='sidebarCol'] {\r\n overflow-clip-margin: 0px;\r\n}\r\n\r\n/* ---------- Inputbar popovers vs the tilt: tooltips no longer hide during a tilt session: the bubble-anchor loop\r\n (bubble-anchor.ts) re-pins every panel bubble to its trigger every frame,\r\n so the hover text shows immediately at the right spot and the glass keeps\r\n its tilt. Only dialogs/menus/listboxes (which clamp by measuring their\r\n rendered box and cannot be re-pinned) still glide the tilt home — their\r\n reveal flow lives in spotlight.ts. */\r\n\r\n[data-dsh-aqua] [data-dsh-inputbar]:has([role='tooltip'], [role='menu'], [role='dialog'], [role='listbox']) {\r\n z-index: 10;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-frame]:has([role='dialog']) [data-dsh-inputbar]:has([role='tooltip'], [role='menu'], [role='dialog'], [role='listbox']) {\r\n z-index: auto;\r\n}\r\n\r\n/* ---------- Settings panel glass: material-only — a scheme-differentiated\r\n translucent fill, applied in BOTH modes (the gate is data-dsh-aqua, not\r\n the float attribute). The panel keeps its stock layout, tokens and radius;\r\n only the surface turns glass. isolation:isolate keeps fixed descendants\r\n (tooltips/menus inside the panel) anchored to the viewport, and the\r\n backdrop blur moved to a ::before layer (see the dialog glass block\r\n below) so it can never re-anchor them. The `body` hop out-ranks the\r\n compat generic glass (blur 12px on `panel` classes). ---------- */\r\n[data-dsh-aqua] body [role='dialog'] {\r\n isolation: isolate;\r\n background: rgba(255, 255, 255, 0.45);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] {\r\n background: rgba(17, 26, 39, 0.55);\r\n}\r\n\r\n/* ---------- Sidebar: the selected session gets an accent bar and a soft halo. ---------- */\r\n[data-dsh-float] [role='treeitem'][aria-selected='true'] {\r\n box-shadow:\r\n inset 2px 0 0 var(--dsw-specific-sidebar-nav-item-active-accent),\r\n 0 0 16px rgba(110, 155, 232, 0.14);\r\n}\r\n\r\n/* ---------- Hover light: buttons and menu cells answer with a soft blue ring. ---------- */\r\n[data-dsh-float] button[class*='button']:hover:not(:disabled),\r\n[data-dsh-float] [role='menuitem']:hover:not(:disabled) {\r\n box-shadow:\r\n 0 0 12px rgba(110, 155, 232, 0.16),\r\n inset 0 0 0 1px rgba(148, 180, 220, 0.22);\r\n}\r\n\r\n/* Glass surfaces: menus and dialogs follow the site's frosted recipe\r\n (standard `backdrop-filter` only —see the composer card note). */\r\n[data-dsh-float] [role='menu'] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(62% * var(--dsh-aqua-frost, 1)), transparent);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n/* Dialogs keep their native token surface (bg-layer-2) and radius; no\r\n translucent override and no backdrop blur —the override made the panel\r\n muddy and the blur scrambled its fixed-position layout. */\r\n[data-dsh-float] body[data-ds-dark-theme] [role='menu'] {\r\n background: color-mix(in srgb, rgb(28 32 42) calc(68% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n/* ---------- Page edge fades: 5px gradient blur bands pinned to the top and\r\n bottom of the viewport. They sit BELOW the floating glass (the header\r\n card, composer card, and sidebar card hold z-index 8) but ABOVE the\r\n scrolling chat content (z 7 > the code banner's 6) — content melting\r\n into an edge passes under the blur, the glass itself stays sharp. A\r\n faint scheme veil rides along: a touch of white on light, a touch of\r\n black on dark. Click-transparent, so nothing is blocked. ---------- */\r\n[data-dsh-aqua] [data-dsh-aqua-fade] {\r\n position: fixed;\r\n left: 0;\r\n right: 0;\r\n height: 13px;\r\n z-index: 7;\r\n pointer-events: none;\r\n backdrop-filter: blur(5px);\r\n /* Whisper-thin veil: at the clear-frost defaults the fade shows through\r\n the glass panes, so it must stay barely there (a 0.45 black read as a\r\n film under the trajectory/stats glass). */\r\n background: rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-dsh-aqua-fade] {\r\n background: rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-fade='top'] {\r\n top: 0;\r\n -webkit-mask-image: linear-gradient(180deg, black 0%, transparent 100%);\r\n mask-image: linear-gradient(180deg, black 0%, transparent 100%);\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-fade='bottom'] {\r\n bottom: 0;\r\n -webkit-mask-image: linear-gradient(0deg, black 0%, transparent 100%);\r\n mask-image: linear-gradient(0deg, black 0%, transparent 100%);\r\n}\r\n\r\n/* ---------- Keyboard focus and text selection (both schemes). ---------- */\r\n[data-dsh-aqua] :focus-visible {\r\n outline: 2px solid rgba(110, 155, 232, 0.85);\r\n outline-offset: 1px;\r\n}\r\n\r\n/* 文本录入区(输入框 / 文本域 / 可编辑区):焦点由光标与控件自身的边框\r\n 状态表达,全局焦点环在这里只会读作凭空出现的蓝色矩形。文本录入元素按\r\n 规范无论以何种方式聚焦都命中 :focus-visible——实测三处全部命中:侧栏\r\n 搜索框(聚焦即多出蓝色矩形)、composer 输入区(F5 后 Chrome 带键盘模态\r\n 恢复焦点)、dsh 提问面板的答案输入框(面板挂载即自动聚焦,textarea\r\n 落上 2px 主题蓝环)。按元素类别整体豁免;按钮/菜单项保留焦点环,\r\n 键盘可达性不变。 */\r\n[data-dsh-aqua] :is(input, textarea, [contenteditable='true']):focus-visible {\r\n outline: none;\r\n}\r\n\r\n[data-dsh-aqua] ::selection {\r\n background: rgba(110, 155, 232, 0.35);\r\n}\r\n\r\n/* ---------- Display typography: the serif face marks headings and the\r\n session tree, so the page reads in two voices —serif headings over the\r\n sans body. Space Grotesk keeps Latin/digits in the same stack. ---------- */\r\n\r\n/* Chat text: a 1px halo blurs the backdrop right at the glyph edges (the\r\n closest CSS can get to \"frost the background near the text\"), plus a\r\n whisper of drop shadow in light mode. */\r\n[data-dsh-aqua] [data-conversation-scroll] {\r\n text-shadow: 0 0 1px rgba(0, 0, 0, 0.4);\r\n}\r\n\r\n[data-dsh-aqua] body:not([data-ds-dark-theme]) [data-conversation-scroll] {\r\n text-shadow: 0 0 1px rgba(255, 255, 255, 0.55), 0 1px 2px rgba(19, 45, 83, 0.08);\r\n}\r\n\r\n[data-dsh-float] [role='dialog'] h2 {\r\n font-family: 'Space Grotesk Variable', 'Noto Serif SC', 'Songti SC', 'STSong', 'SimSun', serif;\r\n font-weight: 600;\r\n letter-spacing: 0.02em;\r\n}\r\n\r\n[data-dsh-float] [role='treeitem'] {\r\n font-family: 'Space Grotesk Variable', 'Noto Serif SC', 'Songti SC', 'STSong', 'SimSun', serif;\r\n font-weight: 500;\r\n}\r\n\r\n/* ---------- Page-level transitions: phase flips, view tabs, entrances.\r\n Container-level animations are opacity-only —a running transform would\r\n re-anchor position:fixed descendants (menus/modals) mid-flight. ---------- */\r\n[data-dsh-float] [data-phase='hero'] {\r\n animation: dsh-aqua-hero-in 0.32s var(--ds-ease-in-out);\r\n}\r\n\r\n[data-dsh-float] [data-phase='active'] {\r\n animation: dsh-aqua-active-in 0.3s var(--ds-ease-in-out);\r\n}\r\n\r\n[data-dsh-float] [data-testid^='view-'] {\r\n animation: dsh-aqua-view-in 0.26s var(--ds-ease-in-out);\r\n}\r\n\r\n/* The user message fades in WITHOUT the translateY rise: a transform makes\r\n the mounting row contribute to the scroll container's scrollable overflow\r\n for as long as the animation runs — on a tall first message (its bottom\r\n edge close to the composer seat) that exposed a vertical scrollbar flash\r\n exactly in the \"sent, waiting for the first token\" state, when the token\r\n stats line below the composer does not exist yet. Tool rows keep the\r\n rise: they mount while the response is already streaming, when a\r\n scrollbar is expected and never reads as accidental. */\r\n[data-dsh-float] [class*='userRow'] {\r\n animation: dsh-aqua-fade 0.28s var(--ds-ease-in-out) both;\r\n}\r\n\r\n[data-dsh-float] [data-tool] {\r\n animation: dsh-aqua-rise 0.3s var(--ds-ease-in-out) both;\r\n}\r\n\r\n/* No entrance animation on dialogs: an opacity fade makes the panel a\r\n temporary backdrop root (opacity < 1) while it runs, so a frosted ::before\r\n would pop in the moment the fade ends — a visible flash. Panels appear\r\n instantly, matching the Host's own modals. */\r\n\r\n@keyframes dsh-aqua-hero-in {\r\n from { opacity: 0; }\r\n}\r\n\r\n@keyframes dsh-aqua-active-in {\r\n from { opacity: 0; }\r\n}\r\n\r\n@keyframes dsh-aqua-view-in {\r\n from { opacity: 0; }\r\n}\r\n\r\n@keyframes dsh-aqua-rise {\r\n from { opacity: 0; transform: translateY(6px); }\r\n}\r\n\r\n@keyframes dsh-aqua-fade {\r\n from { opacity: 0; }\r\n}\r\n\r\n/* No entrance animation on dialogs at all (keyframes removed): an opacity\r\n fade makes the panel a temporary backdrop root (opacity < 1) while it runs,\r\n so a frosted ::before pops in the moment the fade ends — a visible flash.\r\n Panels appear instantly, matching the Host's own modals. */\r\n\r\n/* ---------- Compatibility mode: stock layout, generic glass material.\r\n The layout rules above are gated on data-dsh-float, so in compat mode the\r\n stock layout stays byte-for-byte. The translucent surface fill comes from\r\n the compat token layer (every surface consuming the shared design tokens\r\n turns glass automatically); these rules add the frosted blur on the\r\n conservative surface families — menus, cards, bubbles, dropdowns,\r\n tooltips, panels — so OTHER plugins' UI gets the same glass with zero\r\n coordination. Dialogs keep their stock surface (no blur: a backdrop-filter\r\n on [role='dialog'] scrambles its fixed-position layout). ---------- */\r\n[data-dsh-compat] [role='menu'],\r\n[data-dsh-compat] [role='tooltip'],\r\n[data-dsh-compat] [class*='card'],\r\n[data-dsh-compat] [class*='bubble'],\r\n[data-dsh-compat] [class*='panel'],\r\n[data-dsh-compat] [class*='popover'],\r\n[data-dsh-compat] [class*='dropdown'] {\r\n backdrop-filter: blur(12px);\r\n}\r\n\r\n/* ---------- Reduced motion: keep the static look, drop every effect. ---------- */\r\n@media (prefers-reduced-motion: reduce) {\r\n [data-dsh-float] [data-phase='hero'],\r\n [data-dsh-float] [data-phase='active'],\r\n [data-dsh-float] [data-testid^='view-'],\r\n [data-dsh-float] [class*='userRow'],\r\n [data-dsh-float] [data-tool],\r\n [data-dsh-float] [role='dialog'],\r\n [data-dsh-aqua] [data-dsh-aqua-ambient],\r\n [data-dsh-aqua] [data-aqua-critter] {\r\n animation: none;\r\n }\r\n\r\n /* The tilt is skipped in JS under reduced motion (spotlight.ts checks the\r\n media query); the glow stays as a plain hover wash. */\r\n\r\n [data-dsh-aqua] [data-aqua-critter='bubble'] {\r\n opacity: 0;\r\n }\r\n}\r\n\r\n/* ============ Aqua compatibility patch (tokenledger + future plugins) ============\r\n Fixes integration with third-party plugins (e.g. dsh-tokenledger). */\r\n\r\n/* 1) Menus / pickers / tooltips: translucent glass (the listbox/tooltip\r\n carry their own backdrop blur now) so foreground text stays readable\r\n without going near-opaque. */\r\n[data-dsh-aqua] [role='menu'],\r\n[data-dsh-aqua] [role='listbox'],\r\n[data-dsh-aqua] [role='tooltip'] {\r\n background: #f6f8fcb3;\r\n}\r\n\r\n[data-dsh-aqua] [role='listbox'],\r\n[data-dsh-aqua] [role='tooltip'] {\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='menu'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='listbox'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='tooltip'] {\r\n background: #151a24a6;\r\n}\r\n\r\n/* 2) Floating panels must escape the sidebar/frame instead of being clipped. */\r\n[data-dsh-aqua] [class*='sidebarCol']:has([role='dialog']),\r\n[data-dsh-aqua] [data-dsh-frame]:has([role='dialog']) {\r\n overflow: visible !important;\r\n transform: none !important;\r\n}\r\n\r\n/* 3) Dialog glass: translucent fill + inner highlight only — NO backdrop blur.\r\n The dialog mounts inside the sidebar with `isolation: isolate`, which\r\n makes the dialog its own backdrop root: a ::before blur can only sample\r\n the dialog's own translucent fill, never the page behind it. That bogus\r\n layer captured an inconsistent backdrop on its first frame after mount —\r\n the panel-area brightness jump when settings / usage-ledger open. The\r\n frosted look behind dialogs comes from the Host's own modal mask (e.g.\r\n VOzbGW_mask: 55% fill + blur(2px)), so the theme only tints. Fills sit\r\n slightly denser than the original 60/65% to compensate for the removed\r\n double-paint layer. isolation:isolate stays: it keeps the dialog's\r\n paint order self-contained. */\r\n[data-dsh-aqua] body [role='dialog'] {\r\n isolation: isolate;\r\n background: rgba(246, 248, 252, 0.75);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] {\r\n background: rgba(17, 26, 39, 0.72);\r\n}\r\n\r\n/* 4) Tokenledger badge: transparent by default, soft slate hover/active. */\r\n[data-dsh-aqua] .tkl_badge {\r\n background: transparent;\r\n}\r\n\r\n[data-dsh-aqua] .tkl_badge:hover,\r\n[data-dsh-aqua] .tkl_badge[data-active] {\r\n background: rgba(126, 164, 223, 0.1);\r\n}\r\n\r\n/* 5) Controls inside ANY dialog (settings page + third-party plugin windows)\r\n turn glass: raised translucent chips, NO backdrop blur. Inside the\r\n isolated dialog a blur can only sample the dialog's own fill anyway,\r\n and it re-captures on every plugin data refresh — the ledger's\r\n 账户/今日/本月/累计 boxes flashed on each reload. Fills are fixed\r\n rgba (not the frost variables): the frost slider bottoms out near 7%\r\n alpha, which made these small controls nearly invisible. */\r\n[data-dsh-aqua] [role='dialog'] button[class*='stat'],\r\n[data-dsh-aqua] [role='dialog'] button[class*='selector'],\r\n[data-dsh-aqua] [role='dialog'] button[class*='select'],\r\n[data-dsh-aqua] [role='dialog'] button[class*='Select'],\r\n[data-dsh-aqua] [role='dialog'] select,\r\n[data-dsh-aqua] [role='dialog'] [class*='badge'],\r\n[data-dsh-aqua] [role='dialog'] [class*='chip'],\r\n[data-dsh-aqua] [role='dialog'] [class*='pill'],\r\n[data-dsh-aqua] [role='dialog'] [class*='tag'] {\r\n background: rgba(255, 255, 255, 0.62);\r\n border: 1px solid rgba(19, 45, 83, 0.22);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='stat'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='selector'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='select'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='Select'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] select,\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='badge'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='chip'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='pill'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='tag'] {\r\n background: rgba(30, 44, 64, 0.62);\r\n border-color: rgba(148, 180, 220, 0.28);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n/* State-kept variants: the settings nav's active cell and the selected\r\n appearance cube keep their accent as a glass wash instead of the stock\r\n opaque near-black slabs. */\r\n[data-dsh-aqua] [role='dialog'] button[class*='navCell'][class*='active'] {\r\n background: rgba(110, 155, 232, 0.16);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='navCell'][class*='active'] {\r\n background: rgba(110, 155, 232, 0.2);\r\n}\r\n\r\n[data-dsh-aqua] [role='dialog'] button[class*='themeCube'][class*='selected'] {\r\n background: rgba(110, 155, 232, 0.14);\r\n border-color: rgba(110, 155, 232, 0.55);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='themeCube'][class*='selected'] {\r\n background: rgba(110, 155, 232, 0.16);\r\n}\r\n\r\n/* 5b) Frosted panel glass for plugin dialogs. The Host renders its dialogs\r\n (VOzbGW_ prefix) over its own full-viewport mask (55% fill + blur 2px),\r\n so their panels read blurred+dark. Plugin windows (tokenledger 等) ship\r\n without any mask, so the SAME 72% fill sat on the raw page — visibly\r\n lighter and sharp. Reproduce the exact settings-panel backdrop ON the\r\n panel only: `isolation: auto` (isolate would cage the ::before into\r\n self-sampling — the dialog must NOT be a backdrop root) and a ::before\r\n carrying blur(2px) plus the two host layers flattened into one fill.\r\n Flattened alpha: 1-(1-.55)(1-.72)=.874 dark / 1-(1-.55)(1-.75)=.888 light;\r\n color = mask over fill premultiplied. Everything OUTSIDE the panel stays\r\n untouched — no whole-page blur. position:fixed panels already form a\r\n stacking context, so the z-index:-1 layer stays put without isolation. */\r\n[data-dsh-aqua] body [role='dialog']:not([class*='VOzbGW_']) {\r\n isolation: auto;\r\n background: transparent;\r\n}\r\n\r\n[data-dsh-aqua] body [role='dialog']:not([class*='VOzbGW_'])::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n background: rgba(185, 187, 191, 0.888);\r\n backdrop-filter: blur(2px);\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog']:not([class*='VOzbGW_'])::before {\r\n background: rgba(13, 20, 30, 0.874);\r\n}\r\n\r\n/* 5c) Cards inside any dialog: plugin cards, marketplace cards — glass slabs\r\n instead of opaque #1C2A3D. Both 'card' and 'Card' spellings are matched\r\n (attribute selectors are case-sensitive), so newly installed plugins get\r\n the same treatment for free. Fill ONLY — no border: the blanket match\r\n also reaches card internals and dropdown option cards, and painted\r\n borders there read as stray lines (stock surfaces are borderless).\r\n List CONTAINERS (*cards* ULs) are excluded: tinting them filled the\r\n gaps between cards with the glass color instead of leaving them\r\n transparent. */\r\n[data-dsh-aqua] [role='dialog'] [class*='card']:not(ul):not([class*='cards']),\r\n[data-dsh-aqua] [role='dialog'] [class*='Card']:not(ul):not([class*='cards']) {\r\n background: rgba(255, 255, 255, 0.5);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='card']:not(ul):not([class*='cards']),\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='Card']:not(ul):not([class*='cards']) {\r\n background: rgba(30, 44, 64, 0.45);\r\n}\r\n\r\n/* 5d) Aqua-section form controls: the on-toggle keeps its state as an accent\r\n glass wash; range tracks turn translucent instead of stock gray. */\r\n[data-dsh-aqua] [role='dialog'] [class*='toggleOn'] {\r\n background: rgba(110, 155, 232, 0.35);\r\n}\r\n\r\n[data-dsh-aqua] [role='dialog'] input[class*='slider'] {\r\n background: rgba(19, 45, 83, 0.18);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='toggleOn'] {\r\n background: rgba(110, 155, 232, 0.4);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] input[class*='slider'] {\r\n background: rgba(148, 180, 220, 0.18);\r\n}\r\n\r\n/* 5e) Remaining state/field surfaces: active segments of segmented toggles,\r\n numeric inputs, and any element a plugin styles INLINE with the host's\r\n opaque bg-layer tokens (inline styles beat any stylesheet rule, so the\r\n override needs !important — e.g. the ModLens provider info box). */\r\n[data-dsh-aqua] [role='dialog'] [class*='segActive'] {\r\n background: rgba(110, 155, 232, 0.28);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='segActive'] {\r\n background: rgba(110, 155, 232, 0.32);\r\n}\r\n\r\n[data-dsh-aqua] [role='dialog'] input[class*='number'] {\r\n background: rgba(255, 255, 255, 0.62);\r\n border: 1px solid rgba(19, 45, 83, 0.22);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] input[class*='number'] {\r\n background: rgba(30, 44, 64, 0.62);\r\n border-color: rgba(148, 180, 220, 0.28);\r\n}\r\n\r\n[data-dsh-aqua] [role='dialog'] [style*='--dsw-alias-bg-layer-'] {\r\n background: rgba(255, 255, 255, 0.5) !important;\r\n border-color: rgba(19, 45, 83, 0.14) !important;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [style*='--dsw-alias-bg-layer-'] {\r\n background: rgba(30, 44, 64, 0.45) !important;\r\n border-color: rgba(148, 180, 220, 0.16) !important;\r\n}\r\n\r\n/* 5f) Sidebar button bubbles: while a [role=tooltip] bubble is up inside the\r\n sidebar, EVERY wrapper between it and the sidebar col must release\r\n overflow clipping — the bubble is viewport-anchored and pokes out of\r\n those boxes. Generic `:has` forms so future buttons and wrappers are\r\n covered automatically.\r\n BOTH html-attribute gates are load-bearing and both are stamped by the\r\n seam stamper (data-dsh-dialog-open / data-dsh-sidebar-bubble):\r\n - `not([data-dsh-dialog-open])`: while a settings / plugin dialog is\r\n mounted inside the column, these same wrappers are the dialog's own\r\n scroll containers (the marketplace list clips at its panel).\r\n Releasing their overflow on every tooltip mount — the plugin cards'\r\n download/star counts carry exact-number tooltips — turned the list\r\n into unclipped spill: the panel toggled visible↔hidden as tooltips\r\n came and went, the scroll position jumped, and hovering the counts\r\n fed a mount/unmount loop (the \"marketplace jitter\", worse while\r\n scrolling). Inside a dialog no release is needed anyway: the pane is\r\n transform-free while a dialog exists, so the host's viewport-anchored\r\n tooltips escape clipping on their own — exactly the stock behavior.\r\n - `[data-dsh-sidebar-bubble]`: the release may only run while a\r\n sidebar tooltip actually exists. Evaluating the `:has` forms costs\r\n real time on every sidebar mutation (the session tree alone is\r\n hundreds of nodes; settings dialogs mount thousands), which showed\r\n up as jank when collapsing the sidebar or opening settings. With the\r\n gate the selector fails at the cheap html-attribute check and the\r\n `:has` machinery is only paid on the rare frames a bubble is up.\r\n 释放本身只在窄轨状态下进行:轨道滑动的收/展动画里,展开序列会先在\r\n 56px 窄轨上停 ~450ms(冻结内容交叉淡入),此刻点击\"打开/收起侧边栏\"\r\n 的 tooltip 仍挂在栏内(指针就在按钮上),无条件释放会把紧凑版\"新会话\"\r\n 按钮(34px,超出窄列右缘 ~29px)和冻结的宽内容一并放出列外——\r\n \"新会话一栏先突出来一块再展开\"。tooltip 需要逃逸裁剪的恰是窄轨稳定态,\r\n 因此把释放限定在 [data-sidebar-collapsed] 下;stamper 还会在收/展翻转后\r\n 的 ~1s 动画窗口内给 <html> 盖 [data-dsh-sidebar-anim],窗口内释放整体\r\n 抑制——收起方向的冻结宽内容同样不再外溢,气泡逃逸只服务稳定窄轨态。 */\r\n[data-dsh-aqua][data-dsh-sidebar-bubble]:not([data-dsh-dialog-open]):not([data-dsh-sidebar-anim]) [data-dsh-frame][data-sidebar-collapsed] [class*='sidebarCol']:has([role='tooltip']),\r\n[data-dsh-aqua][data-dsh-sidebar-bubble]:not([data-dsh-dialog-open]):not([data-dsh-sidebar-anim]) [data-dsh-frame][data-sidebar-collapsed] [class*='sidebarCol'] :has([role='tooltip']) {\r\n overflow: visible !important;\r\n}\r\n\r\n[data-dsh-aqua] [role='tooltip'] {\r\n color: #1a2438;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='tooltip'] {\r\n color: #eaf2fc;\r\n}\r\n\r\n/* 5g) Session hover card (full title + status, fixed, mounted at root):\r\n stock is an opaque gray slab — glass it, text per mode. The class is a\r\n CSS-module hash of the current Host build. */\r\n[data-dsh-aqua] [class*='_card_1b2ny'] {\r\n background: rgba(246, 248, 252, 0.82);\r\n border: 1px solid rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(14px);\r\n color: #1a2438;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [class*='_card_1b2ny'] {\r\n background: rgba(21, 26, 36, 0.78);\r\n border-color: rgba(148, 180, 220, 0.2);\r\n color: #eaf2fc;\r\n}\r\n\r\n/* 6) Native <select> fallback for third-party plugin dialogs: theme the\r\n control itself and give the OS popup list scheme-locked, opaque\r\n theme colors (the native popup ignores glass but must not flash\r\n bright white in dark mode). */\r\n[data-dsh-aqua] select {\r\n color-scheme: light;\r\n background: var(--dsh-aqua-glass-card-light);\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-radius: 8px;\r\n font-size: 12px;\r\n color: var(--dsw-alias-label-primary);\r\n cursor: pointer;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] select {\r\n color-scheme: dark;\r\n background: var(--dsh-aqua-glass-card-dark);\r\n border-color: rgba(148, 180, 220, 0.32);\r\n}\r\n\r\n[data-dsh-aqua] select option,\r\n[data-dsh-aqua] select optgroup {\r\n background: #f6f8fc;\r\n color: #13243e;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] select option,\r\n[data-dsh-aqua] body[data-ds-dark-theme] select optgroup {\r\n background: #151a24;\r\n color: #eaf2fc;\r\n}\r\n\r\n/* ============ Agent todo-list glass adaptation ============\r\n The agent's task-list tool (\"todo_write\" write capsule) and the todo\r\n panel (\"todo-panel\") pick up the theme's glass recipe: translucent\r\n scheme fill + adjustable backdrop blur + inner highlight, dark mode\r\n through the paired --dsh-aqua-glass-card-* variables. */\r\n\r\n/* The tool capsule: a small frosted pill that reads as part of the glass\r\n scene instead of a solid token. */\r\n[data-dsh-aqua] [data-tool='todo_write'] {\r\n background: var(--dsh-aqua-glass-card-light);\r\n border: 1px solid rgba(19, 45, 83, 0.2);\r\n border-radius: 10px;\r\n padding: 3px 8px;\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-tool='todo_write'] {\r\n background: var(--dsh-aqua-glass-card-dark);\r\n border-color: rgba(148, 180, 220, 0.2);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07);\r\n}\r\n\r\n/* The task-list panel: full glass card (fill + blur + inner highlight +\r\n soft drop shadow), same recipe as the other floating panes. */\r\n[data-dsh-aqua] [data-testid='todo-panel'] {\r\n background: var(--dsh-aqua-glass-card-light);\r\n border-color: rgba(19, 45, 83, 0.26);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 36px rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-testid='todo-panel'] {\r\n background: var(--dsh-aqua-glass-card-dark);\r\n border-color: rgba(148, 180, 220, 0.32);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 10px 36px rgba(2, 6, 14, 0.5);\r\n}\r\n\r\n/* ============ View pages & anchored popover shells (v1.4.7) ============ */\r\n\r\n/* Plugin view pages: the conversation.view slot hosts whichever tab view is\r\n active — dsh-context's 上下文 today, any future plugin's page tomorrow\r\n (the stamper marks those roots data-dsh-view and skips the 对话 chat).\r\n The shared layer tokens turn translucent inside a view, so EVERY surface\r\n the plugin paints with the design tokens becomes glass with zero\r\n coordination. The trajectory overlay rides the same override: its\r\n timeline split / table / plot / search paint the same tokens and used to\r\n read as opaque dark slabs inside the glass board. Frost rides the frost\r\n knob like every other glass surface. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-view],\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-trajectory] {\r\n --dsw-alias-bg-layer-1: color-mix(in srgb, rgb(255 255 255) calc(42% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-layer-2: color-mix(in srgb, rgb(236 242 250) calc(30% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-layer-3: color-mix(in srgb, rgb(226 235 247) calc(24% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-overlay: color-mix(in srgb, rgb(255 255 255) calc(48% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] [data-dsh-view],\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] [data-dsh-trajectory] {\r\n --dsw-alias-bg-layer-1: color-mix(in srgb, rgb(34 38 47) calc(50% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-layer-2: color-mix(in srgb, rgb(30 36 46) calc(40% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-layer-3: color-mix(in srgb, rgb(28 42 61) calc(32% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-overlay: color-mix(in srgb, rgb(34 51 74) calc(45% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n/* Card-family surfaces inside a view get the frosted blur (the fill comes\r\n from the token override above; the stock hairline and radius stay).\r\n The stamper turns these same surfaces into tilt spots, so the\r\n rectangular panes of a view press and glow like the rest of the glass. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-view] [class*='card']:not(ul):not([class*='cards']),\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-view] [class*='Card']:not(ul):not([class*='cards']) {\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n/* Inline token paints inside a view flatten to the glass fill too — inline\r\n styles beat any class rule, so the override needs !important (same\r\n pattern as the dialog rule 5e; plugins that style surfaces inline with\r\n the layer tokens would otherwise stay opaque islands). */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-view] [style*='--dsw-alias-bg-layer-'] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(42% * var(--dsh-aqua-frost, 1)), transparent) !important;\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] [data-dsh-view] [style*='--dsw-alias-bg-layer-'] {\r\n background: color-mix(in srgb, rgb(34 38 47) calc(50% * var(--dsh-aqua-frost, 1)), transparent) !important;\r\n}\r\n\r\n/* 嵌套内容面板:视图里\"卡中卡\"的面板坐在玻璃上而非应用底色上——它的填充\r\n 叠在父级的淡层上,低磨砂度下整叠几乎透明,壁纸亮区一冲就成了突兀的灰板\r\n (dsh-context 的系统提示词阅读卡、分类块,轨迹页的嵌套板,以及任何未来\r\n 插件页的同类层级)。嵌套面板因此带下限地重声明 layer token:磨砂度低时\r\n 面板自持对比度(不透底色),磨砂度高时仍由旋钮驱动。token 重声明保留\r\n 插件选择用哪层 token 的意图(layer-1/2/3/overlay 各有映射),只抬高整体\r\n 不透明度;backdrop blur 由上方 card 家族规则继续提供。 */\r\n[data-dsh-aqua][data-dsh-float] :is([data-dsh-view], [data-dsh-trajectory]) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) {\r\n --dsw-alias-bg-layer-1: color-mix(in srgb, rgb(255 255 255) max(calc(70% * var(--dsh-aqua-frost, 1)), 58%), transparent);\r\n --dsw-alias-bg-layer-2: color-mix(in srgb, rgb(236 242 250) max(calc(60% * var(--dsh-aqua-frost, 1)), 50%), transparent);\r\n --dsw-alias-bg-layer-3: color-mix(in srgb, rgb(226 235 247) max(calc(55% * var(--dsh-aqua-frost, 1)), 45%), transparent);\r\n --dsw-alias-bg-overlay: color-mix(in srgb, rgb(255 255 255) max(calc(75% * var(--dsh-aqua-frost, 1)), 62%), transparent);\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] :is([data-dsh-view], [data-dsh-trajectory]) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) {\r\n --dsw-alias-bg-layer-1: color-mix(in srgb, rgb(30 36 46) max(calc(60% * var(--dsh-aqua-frost, 1)), 48%), transparent);\r\n --dsw-alias-bg-layer-2: color-mix(in srgb, rgb(28 34 44) max(calc(55% * var(--dsh-aqua-frost, 1)), 42%), transparent);\r\n --dsw-alias-bg-layer-3: color-mix(in srgb, rgb(26 32 44) max(calc(50% * var(--dsh-aqua-frost, 1)), 38%), transparent);\r\n --dsw-alias-bg-overlay: color-mix(in srgb, rgb(32 46 66) max(calc(55% * var(--dsh-aqua-frost, 1)), 42%), transparent);\r\n}\r\n\r\n/* 内联 token 涂色的嵌套面板走同一下限(内联规则压的是固定值,token 重声明\r\n 够不到它)。 */\r\n[data-dsh-aqua][data-dsh-float] :is([data-dsh-view], [data-dsh-trajectory]) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards'])[style*='--dsw-alias-bg-layer-'] {\r\n background: color-mix(in srgb, rgb(255 255 255) max(calc(70% * var(--dsh-aqua-frost, 1)), 58%), transparent) !important;\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] :is([data-dsh-view], [data-dsh-trajectory]) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards'])[style*='--dsw-alias-bg-layer-'] {\r\n background: color-mix(in srgb, rgb(28 34 44) max(calc(55% * var(--dsh-aqua-frost, 1)), 42%), transparent) !important;\r\n}\r\n\r\n/* Anchored popover shells: the positioned wrapper the app paints an opaque\r\n layer token on (the composer command list's menu shell around its\r\n role=listbox viewport). The shell turns glass and the role'd surface\r\n inside stops double-painting its own translucent fill against what used\r\n to be an opaque parent — the command list reads as one frosted pane over\r\n the page instead of a solid slab. The seam is stamped by the stamper only\r\n around ANCHORED (static/absolute) popovers whose shell actually paints:\r\n fixed dialogs keep the Host's own mask, transparent positioner wrappers\r\n are skipped, and a shell inside a tilt pane never gets stamped (it rides\r\n the pane's tilt instead). Radius, border and shadow stay stock. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-popover-shell] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(62% * var(--dsh-aqua-frost, 1)), transparent);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] [data-dsh-popover-shell] {\r\n background: color-mix(in srgb, rgb(28 32 42) calc(68% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-popover-shell] > [role='listbox'],\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-popover-shell] > [role='menu'],\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-popover-shell] > [role='dialog'] {\r\n background: transparent;\r\n backdrop-filter: none;\r\n}\r\n\r\n/* ---------- Code-surface expand strip (the 查看 / 展开 button under\r\n truncated read / search / terminal blocks) ---------- */\r\n/* The strip is part of the code block's material, so it rides the DEDICATED\r\n code frost knob (--dsh-aqua-code-frost, the 代码块磨砂度 slider) — not the\r\n global frost: it sits on the block's own glass and reads as a recessed\r\n footer separated by the stock hairline. */\r\n[data-dsh-float] [class*='block'] button[class*='expand'] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(30% * var(--dsh-aqua-code-frost, 1)), transparent);\r\n border-top: 1px solid rgba(19, 45, 83, 0.14);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-float] [class*='block'] button[class*='expand']:hover {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(50% * var(--dsh-aqua-code-frost, 1)), transparent);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [class*='block'] button[class*='expand'] {\r\n background: color-mix(in srgb, rgb(23 35 52) calc(40% * var(--dsh-aqua-code-frost, 1)), transparent);\r\n border-top-color: rgba(148, 180, 220, 0.14);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [class*='block'] button[class*='expand']:hover {\r\n background: color-mix(in srgb, rgb(30 44 64) calc(55% * var(--dsh-aqua-code-frost, 1)), transparent);\r\n}\r\n\r\n\r\n\r\n";
|
|
4890
|
+
const css$1 = "/* ============================================================================\r\n * Aqua theme layer —the deep-sea skin for the whole Web surface.\r\n * Every rule is gated on the `data-dsh-aqua` attribute the plugin puts on\r\n * <html> while enabled (removed on disable, and the stylesheet itself is\r\n * unloaded with the plugin bundle), so off == the stock UI, exactly.\r\n * Selectors deliberately use attribute/element hooks and stable data-* seams\r\n * (never hashed module classes) so the layer survives recompiles.\r\n * ========================================================================== */\r\n\r\n/* ---------- Canvas: body paints the base color; the frame goes transparent\r\n so the ambient glow (::after) shows through the main column. The\r\n conversation and details surfaces paint their own opaque base fill over\r\n the frame —lift them too, or the glow never reaches the eye. ---------- */\r\n[data-dsh-aqua] body {\r\n background: var(--dsw-alias-bg-base);\r\n}\r\n\r\n/* ---------- Knobs: the settings row writes --dsh-aqua-blur (px),\r\n --dsh-aqua-frost (a 0-2 alpha multiplier) and --dsh-aqua-fluid-hue (deg)\r\n onto <html>. The glass surfaces below consume them, so the sliders move\r\n the whole skin live. Shared card recipes keep the four main panes in lock\r\n step; the smaller surfaces (stats / bubble / menu / + button) keep their\r\n own base alphas and only scale by the same frost multiplier. ---------- */\r\n[data-dsh-aqua] {\r\n /* FLAT glass: one even tone per scheme (no vertical gradient — a darker\r\n bottom stop read as a black fade inside the composer). */\r\n --dsh-aqua-glass-card-light: color-mix(in srgb, rgb(255 255 255) calc(42% * var(--dsh-aqua-frost, 1)), transparent);\r\n /* Dark glass is a NEUTRAL cool gray, not blue: raising frost to max would\r\n otherwise reveal the blue base and read as a blue slab in dark mode. */\r\n --dsh-aqua-glass-card-dark: color-mix(in srgb, rgb(34 38 47) calc(50% * var(--dsh-aqua-frost, 1)), transparent);\r\n /* Per-script font stacks (the settings page writes the user's picks; the\r\n fallbacks here cover the pre-apply frame). */\r\n --dsh-aqua-font-latin: 'Space Grotesk Variable';\r\n --dsh-aqua-font-cjk: 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei';\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-frame] {\r\n background: transparent;\r\n}\r\n\r\n[data-dsh-aqua] [data-phase],\r\n[data-dsh-aqua] [data-dsh-details] {\r\n background: transparent;\r\n}\r\n\r\n/* The header card floats ABOVE the transcript: the scroll body slides up\r\n behind the frosted glass (negative margin) and its padding starts content\r\n below the card, so scrolling text passes under the header and stays\r\n visible through the blur instead of hard-clipping at the card edge.\r\n z-index 8 (not 6) keeps it above the markdown CodeBlock sticky banner,\r\n which the stock UI stacks at z-index 6 —otherwise a code block's copy\r\n button row slides OVER the header and drifts as it scrolls past. */\r\n[data-dsh-float] [data-phase='active'] header {\r\n position: relative;\r\n z-index: 8;\r\n}\r\n\r\n/* The floating header breaks the code block banner's sticky anchoring, so\r\n disable stickiness —the banner stays on its code block and scrolls with\r\n it instead of sliding over the header and drifting. */\r\n[data-dsh-float] [class*='banner'] {\r\n position: static;\r\n}\r\n\r\n[data-dsh-float] [data-phase='active'] [data-conversation-scroll] {\r\n margin-top: -95px;\r\n padding-top: 107px;\r\n}\r\n\r\n/* ---------- Conversation scrollport hardening: the chat column must never\r\n grow a horizontal scrollbar of its own by accident. overflow-x: clip\r\n (NOT hidden — clip creates no scroll container, so a stray wide child can\r\n never expose a horizontal scrollbar here; wide content keeps scrolling\r\n inside its own block / diff / table panes).\r\n scrollbar-gutter: auto OVERRIDES the Host's own stable reservation on the\r\n scroll body: with the gutter permanently reserved, the Host's custom\r\n webkit scrollbar styling painted that empty track as a PERMANENT phantom\r\n bar along the chat's right edge whenever the content did not overflow —\r\n the whole first-response wait read as \"an unexpected vertical scrollbar\".\r\n auto restores the on-demand scrollbar: absent while waiting, real once\r\n the conversation actually outgrows the viewport (the one-time 8px column\r\n shift when it first appears is stock-standard and far less wrong than a\r\n scrollbar that never goes away). ---------- */\r\n[data-dsh-aqua] [data-conversation-scroll] {\r\n overflow-x: clip;\r\n scrollbar-gutter: auto;\r\n}\r\n\r\n/* No scrim: the transcript and details sit directly on the (now slightly\r\n darker) fluid —the fluid itself provides the ground, so no dark veil\r\n covers either phase. */\r\n\r\n/* NOTE: the scrollport must NOT carry a mask-image. A mask turns the scroll\r\n container into a backdrop root for its sticky composer child, which breaks\r\n the composer card's `backdrop-filter` (the \"send bar won't blur what's\r\n behind it\" bug) —content scrolls behind it sharp instead of frosted. */\r\n\r\n/* Active phase: drop the composer seat's opaque bottom slab and its 36px\r\n fade band entirely —the base rule (`.root[data-phase='active']\r\n .composerSeat`) is (0,3,0), so the doubled attribute selector below must\r\n out-rank it or the fluid stays hidden behind a solid navy slab. */\r\n[data-dsh-aqua] [data-phase] [class*='composerSeat'][class*='composerSeat'] {\r\n background: none;\r\n}\r\n\r\n/* ---------- Ambient scene: the living deep-sea layer (injected by the\r\n plugin). A deepseek.com-style fluid board —top light wash plus three\r\n slowly drifting blurred fluid masses —with marine life riding over it. ---------- */\r\n[data-dsh-aqua] [data-dsh-aqua-ambient] {\r\n position: fixed;\r\n inset: 0;\r\n z-index: -1;\r\n pointer-events: none;\r\n overflow: hidden;\r\n background:\r\n radial-gradient(760px 420px at 50% -8%, rgba(160, 200, 255, 0.26), transparent 70%),\r\n linear-gradient(180deg, rgba(156, 193, 231, 0.22) 0%, rgba(156, 193, 231, 0) 38%),\r\n radial-gradient(900px 420px at 50% 108%, rgba(156, 193, 231, 0.14), transparent 70%);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-dsh-aqua-ambient] {\r\n background:\r\n radial-gradient(760px 420px at 50% -8%, rgba(110, 165, 255, 0.13), transparent 70%),\r\n linear-gradient(180deg, rgba(94, 143, 224, 0.13) 0%, rgba(94, 143, 224, 0) 46%),\r\n radial-gradient(900px 420px at 50% 108%, rgba(94, 143, 224, 0.09), transparent 70%);\r\n}\r\n\r\n/* Background brightness knob: dark mode darkens (0 = pure black, 50 = off),\r\n light mode brightens (50 = off, 100 = pure white) — the layer writes only\r\n the overlay of the resolved scheme, so at most one layer is ever opaque.\r\n Both layers live in ::after (painted ABOVE the fluid canvas / wallpaper\r\n children); ::before would sit behind them and be invisible. */\r\n[data-dsh-aqua] [data-dsh-aqua-ambient]::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background-image:\r\n linear-gradient(rgba(255, 255, 255, var(--dsh-aqua-brightness-white, 0)), rgba(255, 255, 255, var(--dsh-aqua-brightness-white, 0))),\r\n linear-gradient(rgba(0, 0, 0, var(--dsh-aqua-brightness-black, 0)), rgba(0, 0, 0, var(--dsh-aqua-brightness-black, 0)));\r\n}\r\n\r\n@media (prefers-reduced-motion: no-preference) {\r\n [data-dsh-aqua] [data-dsh-aqua-ambient] {\r\n animation: dsh-aqua-breathe 9s var(--ds-ease-in-out) infinite alternate;\r\n }\r\n}\r\n\r\n@keyframes dsh-aqua-breathe {\r\n from { opacity: 0.86; }\r\n to { opacity: 1; }\r\n}\r\n\r\n/* Fluid board canvas: the ported deepseek.com shader fills the whole\r\n backdrop —one unified water under every column. The tone picker supplies\r\n the palette (depth baked into the colors), so no global filter here. */\r\n[data-dsh-aqua] [data-dsh-aqua-fluid-canvas] {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n/* Custom wallpaper: the backdrop-source knob swaps the fluid board for an\r\n image or video. `object-fit: cover` fills the page while preserving\r\n aspect ratio; the blur and frost knobs ride --dsh-aqua-wallpaper-blur /\r\n -frost. The layer is a STANDALONE fixed element (not inside the ambient):\r\n videos fail to composite under the ambient's animated opacity group. */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper] {\r\n position: fixed;\r\n inset: 0;\r\n z-index: -1;\r\n overflow: hidden;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper-img] {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n}\r\n\r\n/* Video wallpaper: a plain <video> element (the browser's own decoder, no\r\n player chrome) filling the layer with cover crop at any window size. A\r\n direct element — not an iframe — keeps backdrop-filter sampling it, so\r\n the glass panels stay frosted above the video. */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper-video] {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n border: 0;\r\n pointer-events: none;\r\n /* The 视频模糊度 knob drives the film's own blur. */\r\n filter: blur(var(--dsh-aqua-video-blur, 0px));\r\n}\r\n\r\n/* Wallpaper blur applies to images only — videos play sharp. */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper-img] {\r\n filter: blur(var(--dsh-aqua-wallpaper-blur, 0px));\r\n}\r\n\r\n/* Frost veil over the wallpaper (white in light, near-black in dark). */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper]::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n background: rgb(255 255 255 / var(--dsh-aqua-wallpaper-frost, 0));\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-dsh-aqua-wallpaper]::after {\r\n background: rgb(12 18 27 / var(--dsh-aqua-wallpaper-frost, 0));\r\n}\r\n\r\n/* Video wallpaper: a dim acrylic scrim keeps the chat text readable — the\r\n video stays alive behind it but calm. The 视频亮度 knob drives the veil's\r\n alpha (--dsh-aqua-video-dim); the 视频模糊度 knob blurs the film itself. */\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper][data-media='video']::after {\r\n display: block;\r\n background: rgb(255 255 255 / calc(var(--dsh-aqua-video-dim, 0.36) * 1.3));\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-dsh-aqua-wallpaper][data-media='video']::after {\r\n background: rgb(8 12 20 / var(--dsh-aqua-video-dim, 0.36));\r\n}\r\n\r\n/* Particle whale: centered on the main column (position/size arrive inline\r\n from the engine — the [data-phase] area right of the sidebar), screen\r\n blended over the dark backdrop, multiply blended (gray particles) over\r\n the light one. */\r\n[data-dsh-aqua] [data-dsh-aqua-whale] {\r\n position: absolute;\r\n transform: translate(-50%, -50%);\r\n pointer-events: none;\r\n mix-blend-mode: screen;\r\n opacity: 0.92;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-whale][data-scheme='light'] {\r\n mix-blend-mode: multiply;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-whale] canvas {\r\n display: block;\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n/* Backdrop source: hide whichever board is not the active one. */\r\n[data-dsh-aqua] [data-dsh-aqua-ambient][data-background='wallpaper'] [data-dsh-aqua-fluid-canvas] {\r\n display: none;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-wallpaper][data-background='fluid'] {\r\n display: none;\r\n}\r\n\r\n/* Interactive mesh: the site's dot-grid decoration, full-viewport inside the\r\n ambient scene; the pointer interacts through the window listener. */\r\n[data-dsh-aqua] [data-dsh-aqua-mesh] {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n}\r\n\r\n/* Ambient marine life: brand-fish silhouettes, shrimp, bubbles, plankton.\r\n Positions, sizes, and per-critter timing arrive inline from the plugin\r\n markup. The critters toggle hides the whole group. */\r\n[data-dsh-aqua] [data-dsh-aqua-ambient][data-critters='off'] [data-aqua-critter] {\r\n display: none;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter] {\r\n position: absolute;\r\n color: #7ea4df;\r\n opacity: 0.22;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter='fish'] {\r\n animation: dsh-aqua-fish-swim 12s var(--ds-ease-in-out) infinite;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter='fish-left'] {\r\n animation: dsh-aqua-fish-swim-left 16s var(--ds-ease-in-out) infinite;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter='bubble'] {\r\n color: #a9c6ef;\r\n opacity: 0;\r\n animation: dsh-aqua-bubble-rise 9s ease-in infinite;\r\n}\r\n\r\n[data-dsh-aqua] [data-aqua-critter='plankton'] {\r\n color: #7ea4df;\r\n animation: dsh-aqua-plankton 5s ease-in-out infinite;\r\n}\r\n\r\n/* Uneven timing percentages make the swim read as living tempo: a quick\r\n dart, a long glide, then a short settle. Per-fish durations arrive\r\n inline (9s / 14s / 19s), so every whale swims at its own pace. */\r\n@keyframes dsh-aqua-fish-swim {\r\n 0% { transform: translate3d(0, 0, 0) rotate(-5deg); }\r\n 30% { transform: translate3d(40px, -15px, 0) rotate(4deg); }\r\n 70% { transform: translate3d(52px, -18px, 0) rotate(3deg); }\r\n 100% { transform: translate3d(0, 0, 0) rotate(-5deg); }\r\n}\r\n\r\n@keyframes dsh-aqua-fish-swim-left {\r\n 0% { transform: translate3d(0, 0, 0) scaleX(-1) rotate(-5deg); }\r\n 30% { transform: translate3d(-34px, -12px, 0) scaleX(-1) rotate(4deg); }\r\n 70% { transform: translate3d(-44px, -15px, 0) scaleX(-1) rotate(3deg); }\r\n 100% { transform: translate3d(0, 0, 0) scaleX(-1) rotate(-5deg); }\r\n}\r\n\r\n@keyframes dsh-aqua-bubble-rise {\r\n 0% { transform: translate3d(0, 0, 0); opacity: 0; }\r\n 10% { opacity: 0.5; }\r\n 100% { transform: translate3d(8px, -150px, 0); opacity: 0; }\r\n}\r\n\r\n@keyframes dsh-aqua-plankton {\r\n 0%, 100% { opacity: 0.1; }\r\n 50% { opacity: 0.38; }\r\n}\r\n\r\n/* ---------- Corner language: 14px surfaces, 10px controls, 8px atoms.\r\n Roles and stable data-* seams only (never hashed module classes). ---------- */\r\n\r\n/* Raised surfaces: menus, dialogs, toasts, hover cards, and hooked owners. */\r\n[data-dsh-float] [role='menu'],\r\n[data-dsh-float] [role='dialog'],\r\n[data-dsh-float] [role='alert'],\r\n[data-dsh-float] [data-dsh-surface] {\r\n border-radius: 14px;\r\n}\r\n\r\n/* The new-session button is glass too: translucent fill + backdrop blur,\r\n like the composer attach \"+\" bead. Its frost rides --dsh-aqua-surface-frost\r\n (the frost knob + 20 points, written by the layer), so it always reads\r\n noticeably frosted relative to the cards around it. */\r\n[data-dsh-float] [data-dsh-surface] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(62% * var(--dsh-aqua-surface-frost, 1)), transparent);\r\n border: 1px solid rgba(19, 45, 83, 0.16);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-float] [data-dsh-surface]:hover:not(:disabled) {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(74% * var(--dsh-aqua-surface-frost, 1)), transparent);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-surface] {\r\n background: color-mix(in srgb, rgb(42 46 56) calc(62% * var(--dsh-aqua-surface-frost, 1)), transparent);\r\n border-color: rgba(148, 180, 220, 0.2);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-surface]:hover:not(:disabled) {\r\n background: color-mix(in srgb, rgb(54 58 70) calc(70% * var(--dsh-aqua-surface-frost, 1)), transparent);\r\n}\r\n\r\n/* Small atoms: menu cells, tooltips, pills. */\r\n[data-dsh-float] [role='menuitem'],\r\n[data-dsh-float] [role='tooltip'],\r\n[data-dsh-float] [class*='pill'] {\r\n border-radius: 8px;\r\n}\r\n\r\n/* Buttons (component roots carry the `button`-named class; icon circles\r\n carry `iconButton`; the sidebar search circle is its own family). */\r\n[data-dsh-float] button[class*='button'] {\r\n border-radius: 10px;\r\n}\r\n\r\n[data-dsh-float] [class*='iconButton'],\r\n[data-dsh-float] [class*='searchButton'] {\r\n border-radius: 8px;\r\n}\r\n\r\n/* Composer attach \"+\": frosted circle over the card's own glass, so the\r\n control reads as a brighter bead on the glass rather than a solid token. */\r\n[data-dsh-float] [data-dsh-add] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(40% * var(--dsh-aqua-frost, 1)), transparent);\r\n border: 1px solid rgba(19, 45, 83, 0.18);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n/* Composer attach \"+\" hover: the bead answers with an aqua-glass highlight\r\n (blue-tinted fill + ring + soft halo) instead of a plain brighter white. */\r\n[data-dsh-float] [data-dsh-add]:hover:not(:disabled) {\r\n background: color-mix(in srgb, #6e9be8 18%, transparent);\r\n border-color: rgba(110, 155, 232, 0.4);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 0 10px rgba(110, 155, 232, 0.28);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-add] {\r\n background: color-mix(in srgb, rgb(42 46 56) calc(40% * var(--dsh-aqua-frost, 1)), transparent);\r\n border-color: rgba(148, 180, 220, 0.25);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-add]:hover:not(:disabled) {\r\n background: rgba(148, 180, 220, 0.2);\r\n border-color: rgba(148, 180, 220, 0.5);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.08),\r\n 0 0 10px rgba(110, 155, 232, 0.28);\r\n}\r\n\r\n/* Chat bubbles become glass: dark mode = black glass, light = frosted\r\n white, both with a backdrop blur so the fluid shimmers behind the text. */\r\n[data-dsh-float] [class*='bubble'] {\r\n border-radius: 14px;\r\n border: 1px solid rgba(19, 45, 83, 0.14);\r\n background: color-mix(in srgb, rgb(255 255 255) calc(42% * var(--dsh-aqua-frost, 1)), transparent);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [class*='bubble'] {\r\n border-color: rgba(148, 180, 220, 0.14);\r\n background: color-mix(in srgb, rgb(0 0 0) calc(40% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n/* Video wallpaper: bubbles carry a REAL plate (frost-independent) so the\r\n text never fights the film; the backdrop blur still frosts the video. */\r\nhtml[data-dsh-float][data-dsh-aqua-wallpaper][data-dsh-aqua-media='video'] [class*='bubble'] {\r\n background: color-mix(in srgb, rgb(255 255 255) 70%, transparent);\r\n border-color: rgba(19, 45, 83, 0.2);\r\n}\r\n\r\nhtml[data-dsh-float][data-dsh-aqua-wallpaper][data-dsh-aqua-media='video'] body[data-ds-dark-theme] [class*='bubble'] {\r\n background: color-mix(in srgb, rgb(0 0 0) 50%, transparent);\r\n border-color: rgba(148, 180, 220, 0.22);\r\n}\r\n\r\n/* Card family (hover cards, panels, plugin cards, tool cards, the composer). */\r\n[data-dsh-float] [class*='card'] {\r\n border-radius: 14px;\r\n}\r\n\r\n/* Composer card: the site's start-chat glass recipe —24px corners,\r\n frosted translucent fill, backdrop blur, and a soft drop shadow.\r\n (Standard `backdrop-filter` only: the prefixed alias is ignored by this\r\n Chromium and lightningcss drops the standard property when both appear.\r\n Declared after the card-family rule so the 24px corner wins the tie.) */\r\n[data-dsh-float] [data-composer-card],\r\n[data-dsh-float] [data-composer-card]::after {\r\n border-radius: 24px;\r\n}\r\n\r\n[data-dsh-float] [data-composer-card] {\r\n position: relative;\r\n z-index: 8;\r\n background: var(--dsh-aqua-glass-card-light);\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 36px rgba(19, 45, 83, 0.16);\r\n}\r\n\r\n/* The blur rides a ::before so the card itself never becomes a containing\r\n block for fixed descendants (send/stop tooltip, plugin modals). */\r\n[data-dsh-float] [data-composer-card]::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-composer-card] {\r\n background: var(--dsh-aqua-glass-card-dark);\r\n border: 1px solid rgba(148, 180, 220, 0.32);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 10px 36px rgba(2, 6, 14, 0.5);\r\n}\r\n\r\n/* Fused state: once the stats line is docked underneath, the WHOLE inputbar\r\n becomes ONE glass slab — a single background, blur, border and shadow on\r\n the wrapper. The card and stats turn transparent inside it (their blur\r\n and tone can never drift apart again); only the hairline divider at the\r\n seam stays. The slab shrinks to its content width (max-content) so the\r\n glass hugs the composer exactly. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) {\r\n width: calc(var(--dsh-chat-content-width) + 32px);\r\n max-width: none;\r\n margin: 0 auto 12px;\r\n padding: 0;\r\n position: relative;\r\n isolation: isolate;\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-radius: 24px;\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 36px rgba(19, 45, 83, 0.16);\r\n}\r\n\r\n/* Same treatment as the composer card: blur on ::before, not the slab itself. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats])::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-inputbar]:has([data-dsh-stats]) {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 10px 36px rgba(2, 6, 14, 0.5);\r\n}\r\n\r\n[data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) [data-composer-card] {\r\n border: none;\r\n border-radius: 0;\r\n background: transparent;\r\n box-shadow: none;\r\n backdrop-filter: none;\r\n}\r\n\r\n/* In the fused slab the inputbar's ::before owns the blur; the card's own\r\n ::before would double-blur, so drop it there. */\r\n[data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) [data-composer-card]::before {\r\n display: none;\r\n}\r\n\r\n[data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) [data-composer-card]::after {\r\n display: none;\r\n}\r\n\r\n[data-dsh-float] [data-dsh-inputbar]:has([data-dsh-stats]) [data-dsh-stats] {\r\n width: 100%;\r\n max-width: none;\r\n /* Dock at the very bottom of the slab: the band's MIN height equals the\r\n 24px corner radius, so the divider lands exactly where the left/right\r\n bottom corners start to curve. Block layout (not flex) keeps the stock\r\n single-line ellipsis, so long stats never spill past the right edge. */\r\n margin: auto 0 0;\r\n min-height: 24px;\r\n box-sizing: border-box;\r\n display: block;\r\n padding: 2px 16px;\r\n border: none;\r\n border-top: 1px solid rgba(19, 45, 83, 0.18);\r\n border-radius: 0;\r\n background: transparent;\r\n box-shadow: none;\r\n backdrop-filter: none;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-inputbar]:has([data-dsh-stats]) [data-dsh-stats] {\r\n border-top-color: rgba(148, 180, 220, 0.24);\r\n}\r\n\r\n/* Hero 未选工作区时,stock 给输入卡加 cardWorkspaceTrigger 变体,用 SVG mask\r\n (stroke-dasharray 4 4)的 ::after 叠层画一圈虚线环提示\"点击选择工作区\",\r\n 悬停转为 accent 蓝——玻璃面板上读作一圈凭空的蓝色虚线矩形(此前主题还在\r\n 把 mask 圆角重画成 24px 来保留它)。占位文案与 pointer 光标已表达可点性,\r\n 整体停掉该叠层;stock 仅在触发器变体下渲染 ::after,常规态是空操作。 */\r\n[data-dsh-float] [data-composer-card]::after {\r\n display: none;\r\n}\r\n\r\n/* Block family (code / terminal / diff / read / web / search): the corner\r\n variables ride the same elements, so banners and footers follow. */\r\n[data-dsh-float] [class*='block'] {\r\n border-radius: 14px;\r\n --dsl-code-block-border-radius: 14px;\r\n --dsl-diff-radius: 14px;\r\n --dsl-read-radius: 14px;\r\n --dsl-terminal-radius: 14px;\r\n --dsl-web-radius: 14px;\r\n --dsl-search-radius: 14px;\r\n /* The block shell is the ONE glass layer: translucent code-block tokens\r\n + a backdrop blur turn the dark slabs into frosted panes. */\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n/* The DSL paints its own translucent layers UNDER the shell (the pre and\r\n the banner wrap reuse the code-block token / bg-base) — stacking them\r\n over the shell's glass squares the alpha and kills the blur. Flatten\r\n them so the shell is the only glass surface. */\r\n[data-dsh-aqua] [class*='block'] pre,\r\n[data-dsh-aqua] [class*='block'] [class*='bannerWrap'] {\r\n background: transparent;\r\n}\r\n\r\n/* ---------- Session header: a detached glass card, same recipe as the\r\n composer. The bottom edge opens into the chat —no bottom border and a\r\n shallow shadow, so the original header/chat divider line is gone. ---------- */\r\n[data-dsh-float] header {\r\n margin: 12px 16px 0;\r\n padding: 10px 16px 8px;\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-bottom-color: transparent;\r\n border-radius: 20px;\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 34px rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-float] header::after {\r\n display: none;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] header {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n border-bottom-color: transparent;\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 8px 30px rgba(2, 6, 14, 0.32);\r\n}\r\n\r\n/* Collapsed: the floating rail reaches 12px into the chat gutter, so the\r\n header card steps right (28px inset = 16px clear of the rail's edge) —\r\n the sidebar keeps its geometry, the top bar does the adjusting. */\r\n[data-dsh-float] [data-dsh-frame][data-sidebar-collapsed] header {\r\n margin-left: 28px;\r\n}\r\n\r\n/* ---------- Sidebar: header-style glass card. Light = neutral cool white\r\n (no green cast) with a luminous right edge; dark keeps its green-teal\r\n tint. The blur rides a ::before so the sidebar itself never becomes a\r\n containing block — the settings/plugin dialog mounts INSIDE the column and\r\n must stay viewport-anchored; keeping the blur on the pane itself would\r\n re-anchor it (and force the dialog-open backdrop-filter kill that made the\r\n glass abruptly lose its frost). ---------- */\r\n[data-dsh-float] [class*='sidebarCol']::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n\r\n/* 打开设置/插件页面时,背景模糊加深一档(旋钮值 ×1.4):设置面板是半透明\r\n 的,面板后那层磨砂玻璃就是侧栏的 ::before——加深它,面板后的页面读作\r\n 更平滑的虚化背景,面板内容更突出。:has() 门控,关掉面板即恢复。 */\r\n[data-dsh-aqua] [class*='sidebarCol']:has([role='dialog'])::before {\r\n backdrop-filter: blur(calc(var(--dsh-aqua-blur, 14px) * 1.4));\r\n}\r\n\r\n[data-dsh-float] [class*='sidebarCol'] {\r\n position: relative;\r\n /* Above the header card (8): the settings panel is a fixed overlay\r\n trapped in this stacking context, so the sidebar itself must outrank\r\n the header or the panel's top edge sits under the top bar. */\r\n z-index: 9;\r\n margin: 12px;\r\n padding: 10px 12px 14px;\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-right: 1px solid rgba(150, 190, 245, 0.65);\r\n border-radius: 20px;\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 34px rgba(19, 45, 83, 0.16);\r\n overflow: hidden;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [class*='sidebarCol'] {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n border-right: 1px solid rgba(148, 180, 220, 0.2);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 8px 30px rgba(2, 6, 14, 0.32);\r\n}\r\n\r\n/* Collapsed rail: floats too (mica mode). The rail keeps the app's own\r\n geometry: the frame's grid track slides 256→56 (300ms) while the app\r\n fades the frozen wide content out (150ms) — pinning a width here would\r\n clip the outgoing content instantly and hide that fade. The floating gap\r\n comes from a 12px left margin plus a matching negative right margin\r\n (outer size unchanged — the main column does not move; the rail just\r\n reaches 12px into the chat gutter). Top/bottom margins are 12px too,\r\n aligning the rail with the header card's top and the composer's bottom.\r\n Padding must be zeroed explicitly: the expanded rule's 12px horizontal\r\n padding would otherwise shove the rail buttons out of the narrow column.\r\n Compat mode has no data-dsh-float, so it keeps the stock rail untouched. */\r\n[data-dsh-float] [data-dsh-frame][data-sidebar-collapsed] [class*='sidebarCol'] {\r\n margin: 12px -12px 12px 12px;\r\n padding: 0;\r\n border-radius: 16px;\r\n /* The right margin rides the same clock as the fade, so the rail eases\r\n into its floating spot as the wide content dissolves. The transform\r\n entry keeps the hover press smooth while collapsed (the collapsed rule\r\n out-ranks the press transition, so it must carry transform too). */\r\n transition: margin 150ms var(--ds-ease-in-out), border-radius 150ms var(--ds-ease-in-out), transform 0.1s ease-out;\r\n}\r\n\r\n/* The sidebar root freezes at the expanded column width via an inline\r\n style (the collapse crossfade needs it) —release it so the content\r\n follows the glass panel's width instead of overflowing its right edge.\r\n Scoped to the dedicated seam: a broad `[class*='root']` selector would\r\n also hit the settings panel (which renders inside the sidebar column)\r\n and collapse its rows into vertical text. */\r\n[data-dsh-float] [data-dsh-frame]:not([data-sidebar-collapsed]) [data-dsh-sidebar-root] {\r\n width: 100% !important;\r\n}\r\n\r\n/* ---------- Trajectory view: a glass panel aligned with the header card's\r\n left/right edges (16px insets), frosted like the other surfaces. ---------- */\r\n[data-dsh-float] [data-dsh-trajectory] {\r\n margin: 8px 16px 12px;\r\n width: calc(100% - 32px);\r\n height: calc(100% - 20px);\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-radius: 20px;\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 34px rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n overflow: hidden;\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-trajectory] {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 8px 30px rgba(2, 6, 14, 0.32);\r\n}\r\n\r\n/* The toolbar and timeline surfaces go transparent so the glass shows through. */\r\n[data-dsh-float] [data-dsh-trajectory] [role='toolbar'],\r\n[data-dsh-float] [data-dsh-trajectory] section[aria-label='Trajectory timeline'] {\r\n background: transparent;\r\n}\r\n\r\n/* ---------- Stats line: the composer card's docked footer (original\r\n styling). It shares the card's glass blur/width/border; the distinction\r\n is a hairline divider at the seam plus a slightly more transparent\r\n (recessed) fill. The seam itself is glued by the spotlight layer's fuse\r\n strip (see below), so the two still read as one piece on screen. ---------- */\r\n[data-dsh-float] [data-dsh-inputbar]:not([class*='hero']) {\r\n padding-bottom: 12px;\r\n}\r\n\r\n[data-dsh-float] [data-dsh-stats] {\r\n position: relative;\r\n z-index: 8;\r\n width: calc(var(--dsh-chat-content-width) + 32px);\r\n max-width: none;\r\n margin: 0 auto;\r\n padding: 2px 16px;\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n /* The ONLY seam cue: one hairline between the two pieces of the same\r\n glass slab (the composer card drops its bottom border when fused). */\r\n border-top: 1px solid rgba(19, 45, 83, 0.18);\r\n border-radius: 0 0 24px 24px;\r\n /* Continues the card's FLAT tone exactly, so the two read as one piece\r\n of glass with no tonal step at the seam. */\r\n background: var(--dsh-aqua-glass-card-light);\r\n box-shadow: 0 10px 36px rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n /* Stats text: neutral slate (dark on light glass, near-white on dark\r\n glass) — kills the stock blue-gray cast. */\r\n color: rgb(38 46 62 / 0.9);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-dsh-stats] {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n border-top-color: rgba(148, 180, 220, 0.24);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow: 0 10px 36px rgba(2, 6, 14, 0.5);\r\n color: rgb(228 236 248 / 0.92);\r\n}\r\n\r\n/* ---------- 回到底部药丸(向上滚动后浮在主输入栏右上角的一键回底按钮):\r\n 与主输入栏同一块玻璃——同一个 glass-card token 填充(随 frost 旋钮)+\r\n 同一个模糊旋钮 + 同款发丝边与内高光;radius 保留 stock 的 100px 药丸形。\r\n 填充在 hover 上保持不变:玻璃卡不随悬停变色(stock 的 hover 变色被\r\n 覆盖,按钮的可点性由玻璃与图标自己表达)。 ---------- */\r\n[data-dsh-float] button[class*='toBottom'] {\r\n background: var(--dsh-aqua-glass-card-light);\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 8px 28px rgba(19, 45, 83, 0.16);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] button[class*='toBottom'] {\r\n border-color: rgba(148, 180, 220, 0.32);\r\n background: var(--dsh-aqua-glass-card-dark);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 8px 26px rgba(2, 6, 14, 0.32);\r\n}\r\n\r\n/* 悬浮反馈:填充沿玻璃配方提亮一档(同一 frost 旋钮),并按主题的悬停\r\n 光语言补一圈柔和的蓝晕;0.15s 过渡让它像同一块玻璃被轻轻点亮。 */\r\n[data-dsh-float] button[class*='toBottom']:hover:not(:disabled) {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(58% * var(--dsh-aqua-frost, 1)), transparent);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 0 12px rgba(110, 155, 232, 0.16),\r\n inset 0 0 0 1px rgba(148, 180, 220, 0.22),\r\n 0 8px 28px rgba(19, 45, 83, 0.16);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] button[class*='toBottom']:hover:not(:disabled) {\r\n background: color-mix(in srgb, rgb(54 58 70) calc(68% * var(--dsh-aqua-frost, 1)), transparent);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 0 12px rgba(110, 155, 232, 0.18),\r\n inset 0 0 0 1px rgba(148, 180, 220, 0.26),\r\n 0 8px 26px rgba(2, 6, 14, 0.32);\r\n}\r\n\r\n[data-dsh-float] button[class*='toBottom'] {\r\n transition: background 0.15s ease-out, box-shadow 0.15s ease-out;\r\n}\r\n\r\n/* Composer placeholder: neutral, scheme-adaptive — no blue hint. */\r\n[data-dsh-float] [data-composer-card] textarea::placeholder {\r\n color: rgb(55 64 84 / 0.5);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [data-composer-card] textarea::placeholder {\r\n color: rgb(205 216 234 / 0.52);\r\n}\r\n\r\n/* ---------- Cursor spotlight glow: the official feature-card glow on the\r\n glass panes. The overlay div (data-dsh-aqua-glow) is appended inside every\r\n data-dsh-aqua-spot pane by the controller, which writes the cursor\r\n position into the inline background per pointermove and lights the pane\r\n with the data-spot-on marker. The glow sits BEHIND the glass (z-index -1)\r\n so the light diffuses through the translucent surface and never covers\r\n the content or the outline. ---------- */\r\n[data-dsh-aqua][data-dsh-aqua-spotlight] [data-dsh-aqua-spot] {\r\n position: relative;\r\n /* A stacking context per pane: the glow sits at z-index -1 INSIDE it. */\r\n isolation: isolate;\r\n}\r\n\r\n/* The injected glow div must never affect layout: inert by default (compat\r\n mode / toggle off), absolute-positioned only while the glow is on. */\r\n[data-dsh-aqua] [data-dsh-aqua-glow] {\r\n display: none;\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-aqua-spotlight] [data-dsh-aqua-glow] {\r\n display: block;\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n pointer-events: none;\r\n opacity: 0;\r\n transition: opacity 0.3s ease;\r\n z-index: -1;\r\n /* The glow color follows the fluid tone: the layer writes\r\n --dsh-aqua-spot-color on <html> from the 色调 slider. */\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-aqua-spotlight] [data-dsh-aqua-spot][data-spot-on] [data-dsh-aqua-glow] {\r\n opacity: 1;\r\n}\r\n\r\n/* The fused composer + stats spot is an invisible wrapper (no radius of its\r\n own) — give its glow the fused card's 24px corners. */\r\n[data-dsh-aqua][data-dsh-aqua-spotlight] [data-dsh-inputbar][data-dsh-aqua-spot] [data-dsh-aqua-glow] {\r\n border-radius: 24px;\r\n}\r\n\r\n/* The settings/plugin dialog mounts INSIDE the sidebar column as a fixed\r\n overlay. Its viewport anchoring was previously preserved by killing the\r\n sidebar's own backdrop-filter while open — which made the glass abruptly\r\n lose its frost (a dark → bright jump). The blur now lives on the\r\n sidebar's ::before (see above), so the pane itself is never a containing\r\n block and no dialog-open kill is needed: the glass keeps its look and the\r\n dialog still escapes. The compat rule below still releases the frame's\r\n clipping/transform for the dialog's fixed overlay. */\r\n[data-dsh-aqua] [class*='sidebarCol']:has([role='dialog']),\r\n[data-dsh-aqua] [data-dsh-frame]:has([role='dialog']) {\r\n overflow: visible !important;\r\n transform: none !important;\r\n}\r\n\r\n/* ---------- Hover tilt: the geometric press is JS-driven (spotlight.ts\r\n writes `perspective(800px) rotateX/rotateY` inline, tracking the cursor —\r\n cursor right ⇒ right edge sinks, left edge lifts). A short transform\r\n transition smooths both the press-in and the eased return, so the pane\r\n glides into the press instead of flashing. */\r\n[data-dsh-float][data-dsh-aqua-press] [data-dsh-aqua-spot] {\r\n transition: transform 0.1s ease-out;\r\n}\r\n\r\n/* ---------- Phantom-overflow kill switch: while a pane carries ANY\r\n transform (tilt, glide-hold), its position:fixed descendants re-anchor\r\n into the pane's coordinate space — a box written in viewport coordinates\r\n (the app's popovers/tooltips) lands hundreds of px below the viewport and\r\n inflates every ancestor scroll region: the scrollbar thumb jumps up and\r\n stays while the pane is hovered. overflow:clip caps the pane's scrollable\r\n overflow at 64px outside its own box — pinned bubbles (≤36px outside)\r\n stay visible, poisoned boxes (hundreds of px outside) stop contributing.\r\n Flat panes are unaffected: their fixed descendants keep the viewport as\r\n containing block and escape the clip entirely. Menus/dialogs/listboxes\r\n are exempted via data-dsh-popover-live (stamped by the seam stamper only\r\n while one is VISIBLE — the keeper glides the tilt home for them anyway).\r\n ---------- */\r\n[data-dsh-aqua][data-dsh-float]:not([data-dsh-popover-live]) [data-dsh-aqua-spot] {\r\n overflow: clip;\r\n overflow-clip-margin: 64px;\r\n}\r\n\r\n/* 侧栏例外:64px 容忍区为钉住气泡而设,但侧栏收/展动画中冻结的宽内容与图标\r\n 都落在窄轨边缘 64px 以内,会整片\"飞出\"列外(\"新会话\"按钮探出 29px、图标\r\n 贴着 64px 线可见)。侧栏按盒缘裁剪;气泡逃逸交给 5f 的溢出释放(仅收起\r\n 稳态 + tooltip 在场,且动画窗口 [data-dsh-sidebar-anim] 内抑制)。 */\r\n[data-dsh-aqua][data-dsh-float]:not([data-dsh-popover-live]) [data-dsh-aqua-spot][class*='sidebarCol'] {\r\n overflow-clip-margin: 0px;\r\n}\r\n\r\n/* ---------- Inputbar popovers vs the tilt: tooltips no longer hide during a tilt session: the bubble-anchor loop\r\n (bubble-anchor.ts) re-pins every panel bubble to its trigger every frame,\r\n so the hover text shows immediately at the right spot and the glass keeps\r\n its tilt. Only dialogs/menus/listboxes (which clamp by measuring their\r\n rendered box and cannot be re-pinned) still glide the tilt home — their\r\n reveal flow lives in spotlight.ts. */\r\n\r\n[data-dsh-aqua] [data-dsh-inputbar]:has([role='tooltip'], [role='menu'], [role='dialog'], [role='listbox']) {\r\n z-index: 10;\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-frame]:has([role='dialog']) [data-dsh-inputbar]:has([role='tooltip'], [role='menu'], [role='dialog'], [role='listbox']) {\r\n z-index: auto;\r\n}\r\n\r\n/* ---------- Settings panel glass: material-only — a scheme-differentiated\r\n translucent fill, applied in BOTH modes (the gate is data-dsh-aqua, not\r\n the float attribute). The panel keeps its stock layout, tokens and radius;\r\n only the surface turns glass. isolation:isolate keeps fixed descendants\r\n (tooltips/menus inside the panel) anchored to the viewport, and the\r\n backdrop blur moved to a ::before layer (see the dialog glass block\r\n below) so it can never re-anchor them. The `body` hop out-ranks the\r\n compat generic glass (blur 12px on `panel` classes). ---------- */\r\n[data-dsh-aqua] body [role='dialog'] {\r\n isolation: isolate;\r\n background: rgba(255, 255, 255, 0.45);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] {\r\n background: rgba(17, 26, 39, 0.55);\r\n}\r\n\r\n/* Agent 预设卡片(设置 → Agent 预设):stock 用强调色淡染标记选中卡,但卡面\r\n 是 stock 自己的深色涂装(浅色模式下同样是深板),主题与 stock 的选中线索\r\n 都只剩一条几乎读不出的边框色差——浅色模式下选中卡与未选中卡读作同一块板。\r\n 给选中卡一圈强调色光环(1px ring + 18px glow,画在卡外圈,不被卡内子元素\r\n 的填充遮挡);暗色保留其原有边框线索。 */\r\n[data-dsh-aqua] body:not([data-ds-dark-theme]) [role='dialog'] [class*='cardActive'] {\r\n border-color: rgba(110, 155, 232, 0.95) !important;\r\n box-shadow:\r\n 0 0 0 1px rgba(110, 155, 232, 0.5),\r\n 0 0 18px rgba(110, 155, 232, 0.35) !important;\r\n}\r\n\r\n/* ---------- Sidebar: the selected session gets an accent bar and a soft halo. ---------- */\r\n[data-dsh-float] [role='treeitem'][aria-selected='true'] {\r\n box-shadow:\r\n inset 2px 0 0 var(--dsw-specific-sidebar-nav-item-active-accent),\r\n 0 0 16px rgba(110, 155, 232, 0.14);\r\n}\r\n\r\n/* ---------- Hover light: buttons and menu cells answer with a soft blue ring. ---------- */\r\n[data-dsh-float] button[class*='button']:hover:not(:disabled),\r\n[data-dsh-float] [role='menuitem']:hover:not(:disabled) {\r\n box-shadow:\r\n 0 0 12px rgba(110, 155, 232, 0.16),\r\n inset 0 0 0 1px rgba(148, 180, 220, 0.22);\r\n}\r\n\r\n/* Glass surfaces: menus and dialogs follow the site's frosted recipe\r\n (standard `backdrop-filter` only —see the composer card note). */\r\n[data-dsh-float] [role='menu'] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(62% * var(--dsh-aqua-frost, 1)), transparent);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n/* Dialogs keep their native token surface (bg-layer-2) and radius; no\r\n translucent override and no backdrop blur —the override made the panel\r\n muddy and the blur scrambled its fixed-position layout. */\r\n[data-dsh-float] body[data-ds-dark-theme] [role='menu'] {\r\n background: color-mix(in srgb, rgb(28 32 42) calc(68% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n/* ---------- Page edge fades: 5px gradient blur bands pinned to the top and\r\n bottom of the viewport. They sit BELOW the floating glass (the header\r\n card, composer card, and sidebar card hold z-index 8) but ABOVE the\r\n scrolling chat content (z 7 > the code banner's 6) — content melting\r\n into an edge passes under the blur, the glass itself stays sharp. A\r\n faint scheme veil rides along: a touch of white on light, a touch of\r\n black on dark. Click-transparent, so nothing is blocked. ---------- */\r\n[data-dsh-aqua] [data-dsh-aqua-fade] {\r\n position: fixed;\r\n left: 0;\r\n right: 0;\r\n height: 13px;\r\n z-index: 7;\r\n pointer-events: none;\r\n backdrop-filter: blur(5px);\r\n /* Whisper-thin veil: at the clear-frost defaults the fade shows through\r\n the glass panes, so it must stay barely there (a 0.45 black read as a\r\n film under the trajectory/stats glass). */\r\n background: rgba(255, 255, 255, 0.2);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-dsh-aqua-fade] {\r\n background: rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-fade='top'] {\r\n top: 0;\r\n -webkit-mask-image: linear-gradient(180deg, black 0%, transparent 100%);\r\n mask-image: linear-gradient(180deg, black 0%, transparent 100%);\r\n}\r\n\r\n[data-dsh-aqua] [data-dsh-aqua-fade='bottom'] {\r\n bottom: 0;\r\n -webkit-mask-image: linear-gradient(0deg, black 0%, transparent 100%);\r\n mask-image: linear-gradient(0deg, black 0%, transparent 100%);\r\n}\r\n\r\n/* ---------- Keyboard focus and text selection (both schemes). ---------- */\r\n[data-dsh-aqua] :focus-visible {\r\n outline: 2px solid rgba(110, 155, 232, 0.85);\r\n outline-offset: 1px;\r\n}\r\n\r\n/* 文本录入区(输入框 / 文本域 / 可编辑区):焦点由光标与控件自身的边框\r\n 状态表达,全局焦点环在这里只会读作凭空出现的蓝色矩形。文本录入元素按\r\n 规范无论以何种方式聚焦都命中 :focus-visible——实测三处全部命中:侧栏\r\n 搜索框(聚焦即多出蓝色矩形)、composer 输入区(F5 后 Chrome 带键盘模态\r\n 恢复焦点)、dsh 提问面板的答案输入框(面板挂载即自动聚焦,textarea\r\n 落上 2px 主题蓝环)。按元素类别整体豁免;按钮/菜单项保留焦点环,\r\n 键盘可达性不变。 */\r\n[data-dsh-aqua] :is(input, textarea, [contenteditable='true']):focus-visible {\r\n outline: none;\r\n}\r\n\r\n[data-dsh-aqua] ::selection {\r\n background: rgba(110, 155, 232, 0.35);\r\n}\r\n\r\n/* ---------- Display typography: the serif face marks headings and the\r\n session tree, so the page reads in two voices —serif headings over the\r\n sans body. Space Grotesk keeps Latin/digits in the same stack. ---------- */\r\n\r\n/* Chat text: a 1px halo blurs the backdrop right at the glyph edges (the\r\n closest CSS can get to \"frost the background near the text\"), plus a\r\n whisper of drop shadow in light mode. */\r\n[data-dsh-aqua] [data-conversation-scroll] {\r\n text-shadow: 0 0 1px rgba(0, 0, 0, 0.4);\r\n}\r\n\r\n[data-dsh-aqua] body:not([data-ds-dark-theme]) [data-conversation-scroll] {\r\n text-shadow: 0 0 1px rgba(255, 255, 255, 0.55), 0 1px 2px rgba(19, 45, 83, 0.08);\r\n}\r\n\r\n[data-dsh-float] [role='dialog'] h2 {\r\n font-family: 'Space Grotesk Variable', 'Noto Serif SC', 'Songti SC', 'STSong', 'SimSun', serif;\r\n font-weight: 600;\r\n letter-spacing: 0.02em;\r\n}\r\n\r\n[data-dsh-float] [role='treeitem'] {\r\n font-family: 'Space Grotesk Variable', 'Noto Serif SC', 'Songti SC', 'STSong', 'SimSun', serif;\r\n font-weight: 500;\r\n}\r\n\r\n/* ---------- Page-level transitions: phase flips, view tabs, entrances.\r\n Container-level animations are opacity-only —a running transform would\r\n re-anchor position:fixed descendants (menus/modals) mid-flight. ---------- */\r\n[data-dsh-float] [data-phase='hero'] {\r\n animation: dsh-aqua-hero-in 0.32s var(--ds-ease-in-out);\r\n}\r\n\r\n[data-dsh-float] [data-phase='active'] {\r\n animation: dsh-aqua-active-in 0.3s var(--ds-ease-in-out);\r\n}\r\n\r\n[data-dsh-float] [data-testid^='view-'] {\r\n animation: dsh-aqua-view-in 0.26s var(--ds-ease-in-out);\r\n}\r\n\r\n/* The user message fades in WITHOUT the translateY rise: a transform makes\r\n the mounting row contribute to the scroll container's scrollable overflow\r\n for as long as the animation runs — on a tall first message (its bottom\r\n edge close to the composer seat) that exposed a vertical scrollbar flash\r\n exactly in the \"sent, waiting for the first token\" state, when the token\r\n stats line below the composer does not exist yet. Tool rows keep the\r\n rise: they mount while the response is already streaming, when a\r\n scrollbar is expected and never reads as accidental. */\r\n[data-dsh-float] [class*='userRow'] {\r\n animation: dsh-aqua-fade 0.28s var(--ds-ease-in-out) both;\r\n}\r\n\r\n[data-dsh-float] [data-tool] {\r\n animation: dsh-aqua-rise 0.3s var(--ds-ease-in-out) both;\r\n}\r\n\r\n/* No entrance animation on dialogs: an opacity fade makes the panel a\r\n temporary backdrop root (opacity < 1) while it runs, so a frosted ::before\r\n would pop in the moment the fade ends — a visible flash. Panels appear\r\n instantly, matching the Host's own modals. */\r\n\r\n@keyframes dsh-aqua-hero-in {\r\n from { opacity: 0; }\r\n}\r\n\r\n@keyframes dsh-aqua-active-in {\r\n from { opacity: 0; }\r\n}\r\n\r\n@keyframes dsh-aqua-view-in {\r\n from { opacity: 0; }\r\n}\r\n\r\n@keyframes dsh-aqua-rise {\r\n from { opacity: 0; transform: translateY(6px); }\r\n}\r\n\r\n@keyframes dsh-aqua-fade {\r\n from { opacity: 0; }\r\n}\r\n\r\n/* No entrance animation on dialogs at all (keyframes removed): an opacity\r\n fade makes the panel a temporary backdrop root (opacity < 1) while it runs,\r\n so a frosted ::before pops in the moment the fade ends — a visible flash.\r\n Panels appear instantly, matching the Host's own modals. */\r\n\r\n/* ---------- Compatibility mode: stock layout, generic glass material.\r\n The layout rules above are gated on data-dsh-float, so in compat mode the\r\n stock layout stays byte-for-byte. The translucent surface fill comes from\r\n the compat token layer (every surface consuming the shared design tokens\r\n turns glass automatically); these rules add the frosted blur on the\r\n conservative surface families — menus, cards, bubbles, dropdowns,\r\n tooltips, panels — so OTHER plugins' UI gets the same glass with zero\r\n coordination. Dialogs keep their stock surface (no blur: a backdrop-filter\r\n on [role='dialog'] scrambles its fixed-position layout). ---------- */\r\n[data-dsh-compat] [role='menu'],\r\n[data-dsh-compat] [role='tooltip'],\r\n[data-dsh-compat] [class*='card'],\r\n[data-dsh-compat] [class*='bubble'],\r\n[data-dsh-compat] [class*='panel'],\r\n[data-dsh-compat] [class*='popover'],\r\n[data-dsh-compat] [class*='dropdown'] {\r\n backdrop-filter: blur(12px);\r\n}\r\n\r\n/* ---------- Reduced motion: keep the static look, drop every effect. ---------- */\r\n@media (prefers-reduced-motion: reduce) {\r\n [data-dsh-float] [data-phase='hero'],\r\n [data-dsh-float] [data-phase='active'],\r\n [data-dsh-float] [data-testid^='view-'],\r\n [data-dsh-float] [class*='userRow'],\r\n [data-dsh-float] [data-tool],\r\n [data-dsh-float] [role='dialog'],\r\n [data-dsh-aqua] [data-dsh-aqua-ambient],\r\n [data-dsh-aqua] [data-aqua-critter] {\r\n animation: none;\r\n }\r\n\r\n /* The tilt is skipped in JS under reduced motion (spotlight.ts checks the\r\n media query); the glow stays as a plain hover wash. */\r\n\r\n [data-dsh-aqua] [data-aqua-critter='bubble'] {\r\n opacity: 0;\r\n }\r\n}\r\n\r\n/* ============ Aqua compatibility patch (tokenledger + future plugins) ============\r\n Fixes integration with third-party plugins (e.g. dsh-tokenledger). */\r\n\r\n/* 1) Menus / pickers / tooltips: translucent glass (the listbox/tooltip\r\n carry their own backdrop blur now) so foreground text stays readable\r\n without going near-opaque. */\r\n[data-dsh-aqua] [role='menu'],\r\n[data-dsh-aqua] [role='listbox'],\r\n[data-dsh-aqua] [role='tooltip'] {\r\n background: #f6f8fcb3;\r\n}\r\n\r\n/* 弹层把自己的滚轮滚动留在自己身上:真实滚动的列表(指令列表的视口)到\r\n 边界后不得把剩余滚动链给背后的聊天滚动容器(列表滚到底,背景消息跟着\r\n 动)。从不滚动的弹层(模型菜单,overflow:hidden 且内容不溢出)由\r\n scroll-guard 的 wheel 守卫兜底——CSS 在这里拦不住它。 */\r\n[data-dsh-aqua] [role='menu'],\r\n[data-dsh-aqua] [role='listbox'],\r\n[data-dsh-aqua] [data-dsh-popover-shell] {\r\n overscroll-behavior: contain;\r\n}\r\n\r\n[data-dsh-aqua] [role='listbox'],\r\n[data-dsh-aqua] [role='tooltip'] {\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='menu'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='listbox'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='tooltip'] {\r\n background: #151a24a6;\r\n}\r\n\r\n/* 2) Floating panels must escape the sidebar/frame instead of being clipped. */\r\n[data-dsh-aqua] [class*='sidebarCol']:has([role='dialog']),\r\n[data-dsh-aqua] [data-dsh-frame]:has([role='dialog']) {\r\n overflow: visible !important;\r\n transform: none !important;\r\n}\r\n\r\n/* 3) Dialog glass: translucent fill + inner highlight only — NO backdrop blur.\r\n The dialog mounts inside the sidebar with `isolation: isolate`, which\r\n makes the dialog its own backdrop root: a ::before blur can only sample\r\n the dialog's own translucent fill, never the page behind it. That bogus\r\n layer captured an inconsistent backdrop on its first frame after mount —\r\n the panel-area brightness jump when settings / usage-ledger open. The\r\n frosted look behind dialogs comes from the Host's own modal mask (e.g.\r\n VOzbGW_mask: 55% fill + blur(2px)), so the theme only tints. Fills sit\r\n slightly denser than the original 60/65% to compensate for the removed\r\n double-paint layer. isolation:isolate stays: it keeps the dialog's\r\n paint order self-contained. */\r\n[data-dsh-aqua] body [role='dialog'] {\r\n isolation: isolate;\r\n background: rgba(246, 248, 252, 0.75);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] {\r\n background: rgba(17, 26, 39, 0.72);\r\n}\r\n\r\n/* 4) Tokenledger badge: transparent by default, soft slate hover/active. */\r\n[data-dsh-aqua] .tkl_badge {\r\n background: transparent;\r\n}\r\n\r\n[data-dsh-aqua] .tkl_badge:hover,\r\n[data-dsh-aqua] .tkl_badge[data-active] {\r\n background: rgba(126, 164, 223, 0.1);\r\n}\r\n\r\n/* 5) Controls inside ANY dialog (settings page + third-party plugin windows)\r\n turn glass: raised translucent chips, NO backdrop blur. Inside the\r\n isolated dialog a blur can only sample the dialog's own fill anyway,\r\n and it re-captures on every plugin data refresh — the ledger's\r\n 账户/今日/本月/累计 boxes flashed on each reload. Fills are fixed\r\n rgba (not the frost variables): the frost slider bottoms out near 7%\r\n alpha, which made these small controls nearly invisible. */\r\n[data-dsh-aqua] [role='dialog'] button[class*='stat'],\r\n[data-dsh-aqua] [role='dialog'] button[class*='selector'],\r\n[data-dsh-aqua] [role='dialog'] button[class*='select'],\r\n[data-dsh-aqua] [role='dialog'] button[class*='Select'],\r\n[data-dsh-aqua] [role='dialog'] select,\r\n[data-dsh-aqua] [role='dialog'] [class*='badge'],\r\n[data-dsh-aqua] [role='dialog'] [class*='chip'],\r\n[data-dsh-aqua] [role='dialog'] [class*='pill'],\r\n[data-dsh-aqua] [role='dialog'] [class*='tag'] {\r\n background: rgba(255, 255, 255, 0.62);\r\n border: 1px solid rgba(19, 45, 83, 0.22);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='stat'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='selector'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='select'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='Select'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] select,\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='badge'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='chip'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='pill'],\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='tag'] {\r\n background: rgba(30, 44, 64, 0.62);\r\n border-color: rgba(148, 180, 220, 0.28);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n/* State-kept variants: the settings nav's active cell and the selected\r\n appearance cube keep their accent as a glass wash instead of the stock\r\n opaque near-black slabs. */\r\n[data-dsh-aqua] [role='dialog'] button[class*='navCell'][class*='active'] {\r\n background: rgba(110, 155, 232, 0.16);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='navCell'][class*='active'] {\r\n background: rgba(110, 155, 232, 0.2);\r\n}\r\n\r\n[data-dsh-aqua] [role='dialog'] button[class*='themeCube'][class*='selected'] {\r\n background: rgba(110, 155, 232, 0.14);\r\n border-color: rgba(110, 155, 232, 0.55);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] button[class*='themeCube'][class*='selected'] {\r\n background: rgba(110, 155, 232, 0.16);\r\n}\r\n\r\n/* 5b) Panel glass for every dialog the Host does NOT paint itself (the\r\n VOzbGW_ prefix keeps its stock mask): plugin pages (用量账本), the\r\n anchored composer panels (用量/用时/上下文). Measured in LIGHT mode\r\n these read too dark: the old fill baked a mid-gray mask imitation\r\n (185,187,191 @ .888) that sat on the raw dark ambient and read as a\r\n dark slab next to the near-white settings panel. The panels now\r\n carry the settings panel's own white at an alpha that stays white\r\n over the dark ambient (0.955), with a whisper of backdrop left so\r\n they keep depth — one generic rule, so any future same-level page\r\n gets the same white for free. `isolation: auto` (isolate would cage\r\n the ::before into self-sampling — the dialog must NOT be a backdrop\r\n root); blur(2px) keeps a faint frost at the fill's edge.\r\n position:fixed panels already form a stacking context, so the\r\n z-index:-1 layer stays put without isolation. */\r\n[data-dsh-aqua] body [role='dialog']:not([class*='VOzbGW_']) {\r\n isolation: auto;\r\n background: transparent;\r\n}\r\n\r\n[data-dsh-aqua] body [role='dialog']:not([class*='VOzbGW_'])::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n border-radius: inherit;\r\n background: rgba(246, 248, 252, 0.955);\r\n backdrop-filter: blur(2px);\r\n z-index: -1;\r\n pointer-events: none;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog']:not([class*='VOzbGW_'])::before {\r\n background: rgba(13, 20, 30, 0.874);\r\n}\r\n\r\n/* 5c) Cards inside any dialog: plugin cards, marketplace cards — glass slabs\r\n instead of opaque #1C2A3D. Both 'card' and 'Card' spellings are matched\r\n (attribute selectors are case-sensitive), so newly installed plugins get\r\n the same treatment for free. Fill ONLY — no border: the blanket match\r\n also reaches card internals and dropdown option cards, and painted\r\n borders there read as stray lines (stock surfaces are borderless).\r\n List CONTAINERS (*cards* ULs) are excluded: tinting them filled the\r\n gaps between cards with the glass color instead of leaving them\r\n transparent. */\r\n[data-dsh-aqua] [role='dialog'] [class*='card']:not(ul):not([class*='cards']),\r\n[data-dsh-aqua] [role='dialog'] [class*='Card']:not(ul):not([class*='cards']) {\r\n background: rgba(255, 255, 255, 0.5);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='card']:not(ul):not([class*='cards']),\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='Card']:not(ul):not([class*='cards']) {\r\n background: rgba(30, 44, 64, 0.45);\r\n}\r\n\r\n/* 5d) Aqua-section form controls: the on-toggle keeps its state as an accent\r\n glass wash; range tracks turn translucent instead of stock gray. */\r\n[data-dsh-aqua] [role='dialog'] [class*='toggleOn'] {\r\n background: rgba(110, 155, 232, 0.35);\r\n}\r\n\r\n[data-dsh-aqua] [role='dialog'] input[class*='slider'] {\r\n background: rgba(19, 45, 83, 0.18);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='toggleOn'] {\r\n background: rgba(110, 155, 232, 0.4);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] input[class*='slider'] {\r\n background: rgba(148, 180, 220, 0.18);\r\n}\r\n\r\n/* 5e) Remaining state/field surfaces: active segments of segmented toggles,\r\n numeric inputs, and any element a plugin styles INLINE with the host's\r\n opaque bg-layer tokens (inline styles beat any stylesheet rule, so the\r\n override needs !important — e.g. the ModLens provider info box). */\r\n[data-dsh-aqua] [role='dialog'] [class*='segActive'] {\r\n background: rgba(110, 155, 232, 0.28);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [class*='segActive'] {\r\n background: rgba(110, 155, 232, 0.32);\r\n}\r\n\r\n[data-dsh-aqua] [role='dialog'] input[class*='number'] {\r\n background: rgba(255, 255, 255, 0.62);\r\n border: 1px solid rgba(19, 45, 83, 0.22);\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] input[class*='number'] {\r\n background: rgba(30, 44, 64, 0.62);\r\n border-color: rgba(148, 180, 220, 0.28);\r\n}\r\n\r\n[data-dsh-aqua] [role='dialog'] [style*='--dsw-alias-bg-layer-'] {\r\n background: rgba(255, 255, 255, 0.5) !important;\r\n border-color: rgba(19, 45, 83, 0.14) !important;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='dialog'] [style*='--dsw-alias-bg-layer-'] {\r\n background: rgba(30, 44, 64, 0.45) !important;\r\n border-color: rgba(148, 180, 220, 0.16) !important;\r\n}\r\n\r\n/* 5f) Sidebar button bubbles: while a [role=tooltip] bubble is up inside the\r\n sidebar, EVERY wrapper between it and the sidebar col must release\r\n overflow clipping — the bubble is viewport-anchored and pokes out of\r\n those boxes. Generic `:has` forms so future buttons and wrappers are\r\n covered automatically.\r\n BOTH html-attribute gates are load-bearing and both are stamped by the\r\n seam stamper (data-dsh-dialog-open / data-dsh-sidebar-bubble):\r\n - `not([data-dsh-dialog-open])`: while a settings / plugin dialog is\r\n mounted inside the column, these same wrappers are the dialog's own\r\n scroll containers (the marketplace list clips at its panel).\r\n Releasing their overflow on every tooltip mount — the plugin cards'\r\n download/star counts carry exact-number tooltips — turned the list\r\n into unclipped spill: the panel toggled visible↔hidden as tooltips\r\n came and went, the scroll position jumped, and hovering the counts\r\n fed a mount/unmount loop (the \"marketplace jitter\", worse while\r\n scrolling). Inside a dialog no release is needed anyway: the pane is\r\n transform-free while a dialog exists, so the host's viewport-anchored\r\n tooltips escape clipping on their own — exactly the stock behavior.\r\n - `[data-dsh-sidebar-bubble]`: the release may only run while a\r\n sidebar tooltip actually exists. Evaluating the `:has` forms costs\r\n real time on every sidebar mutation (the session tree alone is\r\n hundreds of nodes; settings dialogs mount thousands), which showed\r\n up as jank when collapsing the sidebar or opening settings. With the\r\n gate the selector fails at the cheap html-attribute check and the\r\n `:has` machinery is only paid on the rare frames a bubble is up.\r\n 释放本身只在窄轨状态下进行:轨道滑动的收/展动画里,展开序列会先在\r\n 56px 窄轨上停 ~450ms(冻结内容交叉淡入),此刻点击\"打开/收起侧边栏\"\r\n 的 tooltip 仍挂在栏内(指针就在按钮上),无条件释放会把紧凑版\"新会话\"\r\n 按钮(34px,超出窄列右缘 ~29px)和冻结的宽内容一并放出列外——\r\n \"新会话一栏先突出来一块再展开\"。tooltip 需要逃逸裁剪的恰是窄轨稳定态,\r\n 因此把释放限定在 [data-sidebar-collapsed] 下;stamper 还会在收/展翻转后\r\n 的 ~1s 动画窗口内给 <html> 盖 [data-dsh-sidebar-anim],窗口内释放整体\r\n 抑制——收起方向的冻结宽内容同样不再外溢,气泡逃逸只服务稳定窄轨态。 */\r\n[data-dsh-aqua][data-dsh-sidebar-bubble]:not([data-dsh-dialog-open]):not([data-dsh-sidebar-anim]) [data-dsh-frame][data-sidebar-collapsed] [class*='sidebarCol']:has([role='tooltip']),\r\n[data-dsh-aqua][data-dsh-sidebar-bubble]:not([data-dsh-dialog-open]):not([data-dsh-sidebar-anim]) [data-dsh-frame][data-sidebar-collapsed] [class*='sidebarCol'] :has([role='tooltip']) {\r\n overflow: visible !important;\r\n}\r\n\r\n[data-dsh-aqua] [role='tooltip'] {\r\n color: #1a2438;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [role='tooltip'] {\r\n color: #eaf2fc;\r\n}\r\n\r\n/* 5g) Session hover card (full title + status, fixed, mounted at root):\r\n stock is an opaque gray slab — glass it, text per mode. The class is a\r\n CSS-module hash of the current Host build. */\r\n[data-dsh-aqua] [class*='_card_1b2ny'] {\r\n background: rgba(246, 248, 252, 0.82);\r\n border: 1px solid rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(14px);\r\n color: #1a2438;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [class*='_card_1b2ny'] {\r\n background: rgba(21, 26, 36, 0.78);\r\n border-color: rgba(148, 180, 220, 0.2);\r\n color: #eaf2fc;\r\n}\r\n\r\n/* 6) Native <select> fallback for third-party plugin dialogs: theme the\r\n control itself and give the OS popup list scheme-locked, opaque\r\n theme colors (the native popup ignores glass but must not flash\r\n bright white in dark mode). */\r\n[data-dsh-aqua] select {\r\n color-scheme: light;\r\n background: var(--dsh-aqua-glass-card-light);\r\n border: 1px solid rgba(19, 45, 83, 0.26);\r\n border-radius: 8px;\r\n font-size: 12px;\r\n color: var(--dsw-alias-label-primary);\r\n cursor: pointer;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] select {\r\n color-scheme: dark;\r\n background: var(--dsh-aqua-glass-card-dark);\r\n border-color: rgba(148, 180, 220, 0.32);\r\n}\r\n\r\n[data-dsh-aqua] select option,\r\n[data-dsh-aqua] select optgroup {\r\n background: #f6f8fc;\r\n color: #13243e;\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] select option,\r\n[data-dsh-aqua] body[data-ds-dark-theme] select optgroup {\r\n background: #151a24;\r\n color: #eaf2fc;\r\n}\r\n\r\n/* ============ Agent todo-list glass adaptation ============\r\n The agent's task-list tool (\"todo_write\" write capsule) and the todo\r\n panel (\"todo-panel\") pick up the theme's glass recipe: translucent\r\n scheme fill + adjustable backdrop blur + inner highlight, dark mode\r\n through the paired --dsh-aqua-glass-card-* variables. */\r\n\r\n/* The tool capsule: a small frosted pill that reads as part of the glass\r\n scene instead of a solid token. */\r\n[data-dsh-aqua] [data-tool='todo_write'] {\r\n background: var(--dsh-aqua-glass-card-light);\r\n border: 1px solid rgba(19, 45, 83, 0.2);\r\n border-radius: 10px;\r\n padding: 3px 8px;\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-tool='todo_write'] {\r\n background: var(--dsh-aqua-glass-card-dark);\r\n border-color: rgba(148, 180, 220, 0.2);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07);\r\n}\r\n\r\n/* The task-list panel: full glass card (fill + blur + inner highlight +\r\n soft drop shadow), same recipe as the other floating panes. */\r\n[data-dsh-aqua] [data-testid='todo-panel'] {\r\n background: var(--dsh-aqua-glass-card-light);\r\n border-color: rgba(19, 45, 83, 0.26);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.5),\r\n 0 10px 36px rgba(19, 45, 83, 0.16);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-aqua] body[data-ds-dark-theme] [data-testid='todo-panel'] {\r\n background: var(--dsh-aqua-glass-card-dark);\r\n border-color: rgba(148, 180, 220, 0.32);\r\n box-shadow:\r\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\r\n 0 10px 36px rgba(2, 6, 14, 0.5);\r\n}\r\n\r\n/* ============ View pages & anchored popover shells (v1.4.7) ============ */\r\n\r\n/* Plugin view pages: the conversation.view slot hosts whichever tab view is\r\n active — dsh-context's 上下文 today, any future plugin's page tomorrow\r\n (the stamper marks those roots data-dsh-view and skips the 对话 chat).\r\n The shared layer tokens turn translucent inside a view, so EVERY surface\r\n the plugin paints with the design tokens becomes glass with zero\r\n coordination. The trajectory overlay rides the same override: its\r\n timeline split / table / plot / search paint the same tokens and used to\r\n read as opaque dark slabs inside the glass board. Frost rides the frost\r\n knob like every other glass surface. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-view],\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-trajectory] {\r\n --dsw-alias-bg-layer-1: color-mix(in srgb, rgb(255 255 255) calc(42% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-layer-2: color-mix(in srgb, rgb(236 242 250) calc(30% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-layer-3: color-mix(in srgb, rgb(226 235 247) calc(24% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-overlay: color-mix(in srgb, rgb(255 255 255) calc(48% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] [data-dsh-view],\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] [data-dsh-trajectory] {\r\n --dsw-alias-bg-layer-1: color-mix(in srgb, rgb(34 38 47) calc(50% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-layer-2: color-mix(in srgb, rgb(30 36 46) calc(40% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-layer-3: color-mix(in srgb, rgb(28 42 61) calc(32% * var(--dsh-aqua-frost, 1)), transparent);\r\n --dsw-alias-bg-overlay: color-mix(in srgb, rgb(34 51 74) calc(45% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n/* Card-family surfaces inside a view get the frosted blur (the fill comes\r\n from the token override above; the stock hairline and radius stay).\r\n The stamper turns these same surfaces into tilt spots, so the\r\n rectangular panes of a view press and glow like the rest of the glass. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-view] [class*='card']:not(ul):not([class*='cards']),\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-view] [class*='Card']:not(ul):not([class*='cards']) {\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n/* Inline token paints inside a view flatten to the glass fill too — inline\r\n styles beat any class rule, so the override needs !important (same\r\n pattern as the dialog rule 5e; plugins that style surfaces inline with\r\n the layer tokens would otherwise stay opaque islands). */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-view] [style*='--dsw-alias-bg-layer-'] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(42% * var(--dsh-aqua-frost, 1)), transparent) !important;\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] [data-dsh-view] [style*='--dsw-alias-bg-layer-'] {\r\n background: color-mix(in srgb, rgb(34 38 47) calc(50% * var(--dsh-aqua-frost, 1)), transparent) !important;\r\n}\r\n\r\n/* 嵌套内容面板:视图里\"卡中卡\"的面板坐在玻璃上而非应用底色上——它的填充\r\n 叠在父级的淡层上,低磨砂度下整叠几乎透明,壁纸亮区一冲就成了突兀的灰板\r\n (dsh-context 的系统提示词阅读卡、分类块,轨迹页的嵌套板,以及任何未来\r\n 插件页的同类层级)。嵌套面板因此带下限地重声明 layer token:磨砂度低时\r\n 面板自持对比度(不透底色),磨砂度高时仍由旋钮驱动。token 重声明保留\r\n 插件选择用哪层 token 的意图(layer-1/2/3/overlay 各有映射),只抬高整体\r\n 不透明度;backdrop blur 由上方 card 家族规则继续提供。 */\r\n[data-dsh-aqua][data-dsh-float] :is([data-dsh-view], [data-dsh-trajectory]) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) {\r\n --dsw-alias-bg-layer-1: color-mix(in srgb, rgb(255 255 255) max(calc(70% * var(--dsh-aqua-frost, 1)), 58%), transparent);\r\n --dsw-alias-bg-layer-2: color-mix(in srgb, rgb(236 242 250) max(calc(60% * var(--dsh-aqua-frost, 1)), 50%), transparent);\r\n --dsw-alias-bg-layer-3: color-mix(in srgb, rgb(226 235 247) max(calc(55% * var(--dsh-aqua-frost, 1)), 45%), transparent);\r\n --dsw-alias-bg-overlay: color-mix(in srgb, rgb(255 255 255) max(calc(75% * var(--dsh-aqua-frost, 1)), 62%), transparent);\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] :is([data-dsh-view], [data-dsh-trajectory]) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) {\r\n --dsw-alias-bg-layer-1: color-mix(in srgb, rgb(30 36 46) max(calc(60% * var(--dsh-aqua-frost, 1)), 48%), transparent);\r\n --dsw-alias-bg-layer-2: color-mix(in srgb, rgb(28 34 44) max(calc(55% * var(--dsh-aqua-frost, 1)), 42%), transparent);\r\n --dsw-alias-bg-layer-3: color-mix(in srgb, rgb(26 32 44) max(calc(50% * var(--dsh-aqua-frost, 1)), 38%), transparent);\r\n --dsw-alias-bg-overlay: color-mix(in srgb, rgb(32 46 66) max(calc(55% * var(--dsh-aqua-frost, 1)), 42%), transparent);\r\n}\r\n\r\n/* 内联 token 涂色的嵌套面板走同一下限(内联规则压的是固定值,token 重声明\r\n 够不到它)。 */\r\n[data-dsh-aqua][data-dsh-float] :is([data-dsh-view], [data-dsh-trajectory]) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards'])[style*='--dsw-alias-bg-layer-'] {\r\n background: color-mix(in srgb, rgb(255 255 255) max(calc(70% * var(--dsh-aqua-frost, 1)), 58%), transparent) !important;\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] :is([data-dsh-view], [data-dsh-trajectory]) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards']) :is([class*='card'], [class*='Card']):not(ul):not([class*='cards'])[style*='--dsw-alias-bg-layer-'] {\r\n background: color-mix(in srgb, rgb(28 34 44) max(calc(55% * var(--dsh-aqua-frost, 1)), 42%), transparent) !important;\r\n}\r\n\r\n/* Anchored popover shells: the positioned wrapper the app paints an opaque\r\n layer token on (the composer command list's menu shell around its\r\n role=listbox viewport). The shell turns glass and the role'd surface\r\n inside stops double-painting its own translucent fill against what used\r\n to be an opaque parent — the command list reads as one frosted pane over\r\n the page instead of a solid slab. The seam is stamped by the stamper only\r\n around ANCHORED (static/absolute) popovers whose shell actually paints:\r\n fixed dialogs keep the Host's own mask, transparent positioner wrappers\r\n are skipped, and a shell inside a tilt pane never gets stamped (it rides\r\n the pane's tilt instead). Radius, border and shadow stay stock. */\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-popover-shell] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(62% * var(--dsh-aqua-frost, 1)), transparent);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] body[data-ds-dark-theme] [data-dsh-popover-shell] {\r\n background: color-mix(in srgb, rgb(28 32 42) calc(68% * var(--dsh-aqua-frost, 1)), transparent);\r\n}\r\n\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-popover-shell] > [role='listbox'],\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-popover-shell] > [role='menu'],\r\n[data-dsh-aqua][data-dsh-float] [data-dsh-popover-shell] > [role='dialog'] {\r\n background: transparent;\r\n backdrop-filter: none;\r\n}\r\n\r\n/* ---------- Code-surface expand strip (the 查看 / 展开 button under\r\n truncated read / search / terminal blocks) ---------- */\r\n/* The strip is part of the code block's material, so it rides the DEDICATED\r\n code frost knob (--dsh-aqua-code-frost, the 代码块磨砂度 slider) — not the\r\n global frost: it sits on the block's own glass and reads as a recessed\r\n footer separated by the stock hairline. */\r\n[data-dsh-float] [class*='block'] button[class*='expand'] {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(30% * var(--dsh-aqua-code-frost, 1)), transparent);\r\n border-top: 1px solid rgba(19, 45, 83, 0.14);\r\n backdrop-filter: blur(var(--dsh-aqua-blur, 14px));\r\n}\r\n\r\n[data-dsh-float] [class*='block'] button[class*='expand']:hover {\r\n background: color-mix(in srgb, rgb(255 255 255) calc(50% * var(--dsh-aqua-code-frost, 1)), transparent);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [class*='block'] button[class*='expand'] {\r\n background: color-mix(in srgb, rgb(23 35 52) calc(40% * var(--dsh-aqua-code-frost, 1)), transparent);\r\n border-top-color: rgba(148, 180, 220, 0.14);\r\n}\r\n\r\n[data-dsh-float] body[data-ds-dark-theme] [class*='block'] button[class*='expand']:hover {\r\n background: color-mix(in srgb, rgb(30 44 64) calc(55% * var(--dsh-aqua-code-frost, 1)), transparent);\r\n}\r\n\r\n\r\n\r\n";
|
|
4892
4891
|
const tagId$1 = "dsh-client-ui-seaglass/aqua.module.css";
|
|
4893
4892
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
|
|
4894
4893
|
const tag = document.createElement("style");
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-client-ui-seaglass",
|
|
3
3
|
"description": "Seaglass: a highly customizable glassmorphism theme for the Web surface — adjustable blur, frost, fluid or wallpaper backdrop, unified corners, and motion",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.4",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|