@nonamelego/dsh-catppuccin 0.6.2 → 0.6.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -60,7 +60,7 @@ remapping the whole interface to the matching palette, with a **Catppuccin** row
60
60
  restored after restarts.
61
61
 
62
62
  It also includes an optional **glassmorphism** skin: the top bar, sidebar, composer,
63
- stats line, trajectory view, chat bubbles and the new-session button become frosted-glass
63
+ trajectory view, chat bubbles and the new-session button become frosted-glass
64
64
  cards, with adjustable blur, frost and backdrop brightness. Glass colours follow the active
65
65
  Catppuccin theme automatically.
66
66
 
@@ -73,14 +73,14 @@ Catppuccin theme automatically.
73
73
  - 🔧 **Custom token overrides**: override individual colour tokens with `--dsw-* var: value` pairs (e.g. turn comments blue); persisted alongside the selected flavour
74
74
  - 🖍️ **Code-block highlight style**: default / italic-comments shiki themes
75
75
  - 🌐 Seven UI languages (Chinese / English / Japanese / Korean / Spanish / French / German, follows the system language)
76
- - 🪟 **Glass skin** (Mica mode): frosted glass for the top bar / sidebar / composer / stats line /
76
+ - 🪟 **Glass skin** (Mica mode): frosted glass for the top bar / sidebar / composer /
77
77
  trajectory view / chat bubbles / new-session button, one-click toggle in Settings;
78
78
  mica & compatibility modes (Compatibility keeps the stock layout and only frosts the composer
79
79
  card and floating layers), adjustable blur, frost and backdrop brightness
80
80
  (interaction reference: [DSH-Transparent-UI-Plugin](https://github.com/WYH66666666/DSH-Transparent-UI-Plugin))
81
81
  - 🌫️ **Glass details**: gradient blur bands at the top/bottom page edges, a floating glass
82
- rail when the sidebar is collapsed, a solid background in the theme's own base colour —
83
- content softens as it scrolls under the panes
82
+ rail when the sidebar is collapsed, an ambient theme-following ground (a same-family
83
+ wash + two soft glows) — content softens as it scrolls under the panes
84
84
  - 🎨 Glass colours follow the current Catppuccin theme
85
85
  - 🔄 **Update check**: one-click "Check for updates" in Settings compares the latest npm
86
86
  version and gives you a copyable upgrade command; **auto-check is on by default** (once at
@@ -115,8 +115,8 @@ Actual screenshots from a local GUI (the header image is a diagonal blend of the
115
115
  ### Glass skin (Mica mode)
116
116
 
117
117
  The frosted-glass effect in light (Latte) and dark (Mocha): the top bar, sidebar,
118
- chat bubbles, composer and stats line are all glass cards; messages soften as they scroll
119
- past the page edges; the background is the theme's solid base colour:
118
+ chat bubbles and composer are all glass cards; messages soften as they scroll
119
+ past the page edges (screenshots from the local GUI):
120
120
 
121
121
  <details>
122
122
  <summary>🌻 Latte (light glass)</summary>
@@ -245,7 +245,7 @@ installing, launch `dsh --profile dsh-tui` and pick the theme with `/theme` —
245
245
 
246
246
  Right below the **Catppuccin theme** row in **Settings → General** you'll find the **Glass** row:
247
247
 
248
- - **Master switch**: on — the top bar, sidebar, composer, stats line and trajectory view
248
+ - **Master switch**: on — the top bar, sidebar, composer and trajectory view
249
249
  become frosted glass; off — the UI reverts to stock instantly (no refresh needed).
250
250
  - **Mode**: **Mica** turns the interface into floating frosted cards; **Compatibility** keeps
251
251
  the stock layout and swaps only the material.
@@ -258,7 +258,8 @@ Right below the **Catppuccin theme** row in **Settings → General** you'll find
258
258
  afterwards (a preset lights up when the current knob values match it).
259
259
  - **Blur** (0–40 px) and **Frost** (0–100%): the blur radius and opacity of the glass.
260
260
  - **Backdrop brightness**: dark mode darkens 0–50, light mode brightens 50–100 (50 = as-is),
261
- mixed straight into the solid background.
261
+ mixed straight into the ground; at the extremes the ambience fades out and the ground
262
+ collapses back to pure white / pure black.
262
263
 
263
264
  Glass colours follow the active theme live; all settings persist across restarts.
264
265
 
@@ -291,17 +292,20 @@ soft shadow) — letting the content behind show through, softened.
291
292
 
292
293
  What this plugin does:
293
294
 
294
- - **Seven glass areas**: top bar, sidebar, composer, stats line, trajectory view, chat
295
+ - **Six glass areas**: top bar, sidebar, composer, trajectory view, chat
295
296
  bubbles and the new-session button; in Mica mode they become rounded floating cards and
296
297
  chat content scrolls *under* the glass, blurred; the collapsed sidebar becomes a
297
- floating rail at the edge of the chat area;
298
+ floating rail at the edge of the chat area (the "performance & usage" stats line is
299
+ *not* one of them — it stays stock, outside the glass card; see the `0.6.2`
300
+ "fused band removed" entry in the changelog);
298
301
  - **Page-edge gradient blur**: a blur band at the top and bottom of the viewport so
299
302
  messages are softened as they melt past the edges (borrowed from
300
303
  [DSH-Transparent-UI-Plugin](https://github.com/WYH66666666/DSH-Transparent-UI-Plugin)'s
301
304
  Aqua skin);
302
305
  - **Theme-following colours**: Latte is light glass, Mocha dark glass — switching flavours
303
- recolours instantly. The page ground is the theme's solid colour; the brightness knob
304
- mixes white/black straight into it;
306
+ recolours instantly. The page ground rides the theme's own tokens plus a same-family
307
+ wash and two soft glows (see `docs/issue-25-ambient-ground.md`); the brightness knob
308
+ mixes white/black straight into its base stop;
305
309
  - **One-click toggle**: off restores the stock UI exactly; uninstalling the plugin leaves
306
310
  nothing behind.
307
311
 
@@ -315,7 +319,7 @@ matches are exactly these:
315
319
  | Family | Anchor |
316
320
  |---|---|
317
321
  | Composer card | `[data-composer-card]` (the material is painted on its `::before`, see issue #19) |
318
- | Menus | `[role='menu']` |
322
+ | Menus | `[data-menu-material='translucent']` (the host MenuSurface's own material hook — the recipe overrides the `--dsw-menu-surface-fill` / `--dsw-menu-backdrop-filter` its material plane reads) plus the hand-rolled-menu fallback `[role='menu']:not([data-menu-material]):not([data-menu-material] *)` |
319
323
  | Popovers | `[class*='popover']` / `[class*='dropdown']` (still substrings) |
320
324
  | Modal dialogs | `[role='dialog'][aria-modal='true']` |
321
325
  | Host right sidebar (open state only) | `[data-sidebar-right-panel][data-sidebar-right-open]` |
package/README.md CHANGED
@@ -56,7 +56,7 @@ Web / 桌面端做全界面换色与玻璃质感,TUI 端自动同步四套官
56
56
  下方提供一行 **Catppuccin** 快捷切换,选择会自动保存、重启自动恢复。
57
57
 
58
58
  同时内置一套可开关的**玻璃质感**(Glassmorphism)皮肤:顶栏、侧边栏、
59
- 输入框、统计行、轨迹视图、聊天气泡、新会话按钮都变成磨砂玻璃卡片,
59
+ 输入框、轨迹视图、聊天气泡、新会话按钮都变成磨砂玻璃卡片,
60
60
  模糊度、磨砂度、背景亮度均可自由调节,玻璃颜色自动跟随当前
61
61
  Catppuccin 主题。
62
62
 
@@ -69,12 +69,13 @@ Catppuccin 主题。
69
69
  - 🔧 **自定义 token 覆盖**:按「`--dsw-* 变量: 值`」逐条覆盖单个配色 token(例如把注释色换成蓝色),与所选风味一起持久保存
70
70
  - 🖍️ **代码块高亮风格**:默认 / 注释斜体(italic-comments)两套 shiki 风格可选
71
71
  - 🌐 中 / 英 / 日 / 韩 / 西 / 法 / 德七语文案(跟随系统语言)
72
- - 🪟 **玻璃质感**(云母模式):顶栏 / 侧边栏 / 输入框 / 统计行 / 轨迹视图 / 聊天气泡 /
72
+ - 🪟 **玻璃质感**(云母模式):顶栏 / 侧边栏 / 输入框 / 轨迹视图 / 聊天气泡 /
73
73
  新会话按钮磨砂玻璃效果,设置里一键开关;云母 / 兼容双模式(兼容模式保持原版排版,
74
74
  只给输入框卡片与浮层上玻璃),模糊度、磨砂度、
75
75
  背景亮度自由调节(交互参考 [DSH-Transparent-UI-Plugin](https://github.com/WYH66666666/DSH-Transparent-UI-Plugin))
76
76
  - 🌫️ **玻璃拟态细节**:页面上下边缘渐变模糊、折叠侧边栏悬浮玻璃、
77
- 纯色背景跟随主题底色——内容滚入视口边缘时柔化穿过,层次更立体
77
+ 随主题的氛围地面(同色系渐变 + 两枚柔光斑)——内容滚入视口边缘时柔化穿过,
78
+ 玻璃透着地面的明暗,层次更立体
78
79
  - 🎨 玻璃配色自动跟随当前 Catppuccin 主题
79
80
  - 🔄 **检查 Catppuccin 插件更新**:设置页一键检测本插件(dsh-catppuccin)在 npm 上的最新版本,发现新版直接给出可复制的升级命令;**默认开启自动检查**(启动后一次 + 每 6 小时),更新渠道可选稳定版 / Beta
80
81
  - 💬 **反馈与支持**:设置区底部与插件详情页附 GitHub 链接——遇到问题可提 Issue,喜欢就点个 Star ⭐
@@ -104,8 +105,8 @@ Catppuccin 主题。
104
105
  ### 玻璃质感(Mica 云母模式)
105
106
 
106
107
  同一会话在浅色(Latte)与深色(Mocha)下的磨砂玻璃效果:顶栏、侧边栏、
107
- 聊天气泡、输入框与统计行都是玻璃卡片,消息滚过页面边缘时被柔化,
108
- 背景为主题底色的纯色(截图来自本地 GUI):
108
+ 聊天气泡与输入框都是玻璃卡片,消息滚过页面边缘时被柔化
109
+ (截图来自本地 GUI):
109
110
 
110
111
  <details>
111
112
  <summary>🌻 Latte(浅色玻璃)</summary>
@@ -213,7 +214,7 @@ dsh plugin --profile dsh-tui add https://github.com/NoNameLeGo/dsh-catppuccin-th
213
214
 
214
215
  在 **设置 → 常规** 的 **Catppuccin 主题** 正下方找到 **玻璃质感** 行:
215
216
 
216
- - **总开关**:开启后顶栏、侧边栏、输入框、统计行、轨迹视图变为磨砂玻璃;
217
+ - **总开关**:开启后顶栏、侧边栏、输入框、轨迹视图变为磨砂玻璃;
217
218
  关闭即完全还原原生界面(无需刷新)。
218
219
  - **模式**:**云母效果**把界面改成悬浮磨砂卡片;**兼容模式**保持原版排版,
219
220
  只把材质换成玻璃。
@@ -226,7 +227,7 @@ dsh plugin --profile dsh-tui add https://github.com/NoNameLeGo/dsh-catppuccin-th
226
227
  - **玻璃模糊度**(0–40 px)、**磨砂度**(0–100%):控制玻璃的模糊半径与
227
228
  不透明度。
228
229
  - **背景亮度**:深色模式 0–50 压暗、浅色模式 50–100 提亮(50 为原样),
229
- 直接调和进纯色背景。
230
+ 直接调和进地面底色;拉到两端时氛围层淡出,回到纯白 / 纯黑。
230
231
 
231
232
  玻璃配色自动跟随当前主题,切换 Latte / Frappé / Macchiato / Mocha 时即时
232
233
  变色;所有设置跨重启自动恢复。
@@ -258,15 +259,18 @@ dsh plugin --profile dsh-tui add https://github.com/NoNameLeGo/dsh-catppuccin-th
258
259
 
259
260
  本插件的具体效果:
260
261
 
261
- - **七个区域玻璃化**:顶栏、侧边栏、输入框、统计行、轨迹视图、聊天气泡
262
+ - **六个区域玻璃化**:顶栏、侧边栏、输入框、轨迹视图、聊天气泡
262
263
  和新会话按钮;云母模式下成为带圆角的悬浮卡片,聊天内容滚动时从玻璃
263
- 下方穿过、被模糊;折叠侧边栏时导航条同样悬浮在聊天区边缘;
264
+ 下方穿过、被模糊;折叠侧边栏时导航条同样悬浮在聊天区边缘
265
+ (「性能与用量」统计行不在此列——它保持上游原样,留在玻璃卡之外;见
266
+ CHANGELOG 的 `0.6.2`「拆除融合带」);
264
267
  - **页面边缘渐变模糊**:视口上下各有一条渐变模糊带,消息滚到边缘时被
265
268
  柔化穿过——内容在边界「融化」(借鉴
266
269
  [DSH-Transparent-UI-Plugin](https://github.com/WYH66666666/DSH-Transparent-UI-Plugin)
267
270
  的 Aqua 皮肤);
268
271
  - **配色自动跟随主题**:Latte 是浅色玻璃、Mocha 是深色玻璃,切换主题即时
269
- 变色;页面底色取当前主题纯色,背景亮度旋钮直接往纯色里调和白/黑;
272
+ 变色;页面地面取当前主题色,叠同色系渐变与柔光斑,背景亮度旋钮调和进
273
+ 地面底色(详见 `docs/issue-25-ambient-ground.md`);
270
274
  - **一键开关**:关闭即完全还原原生界面,插件卸载不留任何残留。
271
275
 
272
276
  ### 兼容模式误命中了别的面?
@@ -277,7 +281,7 @@ dsh plugin --profile dsh-tui add https://github.com/NoNameLeGo/dsh-catppuccin-th
277
281
  | 族 | 锚点 |
278
282
  |---|---|
279
283
  | 输入框卡片 | `[data-composer-card]`(材质画在它的 `::before` 上,见 issue #19) |
280
- | 菜单 | `[role='menu']` |
284
+ | 菜单 | `[data-menu-material='translucent']`(宿主 MenuSurface 的材质钩子;配方覆写它自带材质面读的 `--dsw-menu-surface-fill` / `--dsw-menu-backdrop-filter`)+ 手写菜单兜底 `[role='menu']:not([data-menu-material]):not([data-menu-material] *)` |
281
285
  | 弹出层 | `[class*='popover']` / `[class*='dropdown']`(仍是子串) |
282
286
  | 模态框 | `[role='dialog'][aria-modal='true']` |
283
287
  | 宿主右侧栏(仅展开态) | `[data-sidebar-right-panel][data-sidebar-right-open]` |
package/lib/client.js CHANGED
@@ -590,7 +590,7 @@ window.__ModuleLoader__.load({
590
590
  * (item II — lazy CSS), so editing the stylesheet means editing
591
591
  * glass.module.css and rebuilding.
592
592
  */
593
- const GLASS_CSS_TEXT = "[data-dsh-glass] body{--dsh-glass-card:color-mix(in srgb, var(--dsw-alias-bg-layer-1) calc(52% * var(--dsh-glass-frost,1)), transparent);--dsh-glass-card-raised:color-mix(in srgb, var(--dsw-alias-bg-layer-1) calc(64% * var(--dsh-glass-frost,1)), transparent);--dsh-glass-card-hover:color-mix(in srgb, var(--dsw-alias-bg-layer-1) calc(76% * var(--dsh-glass-frost,1)), transparent);--dsh-glass-rim:color-mix(in srgb, var(--dsw-alias-label-primary) 18%, transparent);--dsh-glass-rim-soft:color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent);--dsh-glass-rim-strong:color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent);--dsh-glass-edge:inset 0 1px 0 #ffffff6b;--dsh-glass-drop:0 10px 32px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 38%, transparent);--dsh-glass-input-shadow:0 1px 2px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 65%, transparent), 0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 80%, transparent)}[data-dsh-glass] body[data-ds-dark-theme]{--dsh-glass-rim:color-mix(in srgb, var(--dsw-alias-label-primary) 24%, transparent);--dsh-glass-rim-soft:color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent);--dsh-glass-rim-strong:color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent);--dsh-glass-edge:inset 0 1px 0 #ffffff14;--dsh-glass-drop:0 10px 32px #02060e73;--dsh-glass-input-shadow:0 1px 2px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 65%, transparent), 0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 80%, transparent)}[data-dsh-glass] body{background:color-mix(in srgb, color-mix(in srgb, var(--dsw-alias-bg-base), #fff calc(var(--dsh-glass-brightness-white,0) * 100%)), #000 calc(var(--dsh-glass-brightness-black,0) * 100%))}[data-dsh-glass] [data-dsh-glass-frame],[data-dsh-glass] [data-phase],[data-dsh-glass] [data-dsh-glass-details]{background:0 0}[data-dsh-glass-float] [data-phase=active] header{z-index:8;position:relative}[data-dsh-glass-float] [class*=banner]{position:static}[data-dsh-glass-float] [data-phase=active] [data-conversation-scroll]{margin-top:-95px;padding-top:107px}[data-dsh-glass] [data-phase] [class*=composerSeat][class*=composerSeat]{background:0 0}[data-dsh-glass] [data-dsh-glass-fade]{z-index:7;pointer-events:none;backdrop-filter:blur(5px);background:#ffffff2e;height:13px;position:fixed;left:0;right:0}[data-dsh-glass] body[data-ds-dark-theme] [data-dsh-glass-fade]{background:#00000024}[data-dsh-glass] [data-dsh-glass-fade=top]{top:0;-webkit-mask-image:linear-gradient(#000 0%,#0000 100%);mask-image:linear-gradient(#000 0%,#0000 100%)}[data-dsh-glass][data-windows-titlebar] [data-dsh-glass-fade=top]{display:none}[data-dsh-glass] [data-dsh-glass-fade=bottom]{bottom:0;-webkit-mask-image:linear-gradient(#0000 0%,#000 100%);mask-image:linear-gradient(#0000 0%,#000 100%)}[data-dsh-glass-float] [data-menu-material=translucent],[data-dsh-glass-float] [role=menu]:not([data-menu-material]):not([data-menu-material] *),[data-dsh-glass-float] [role=dialog],[data-dsh-glass-float] [role=alert],[data-dsh-glass-float] [data-trigger-menu],[data-dsh-glass-float] [data-dsh-glass-surface]{border-radius:14px}[data-dsh-glass-float] [role=menuitem],[data-dsh-glass-float] [role=tooltip],[data-dsh-glass-float] [class*=pill]{border-radius:8px}[data-dsh-glass-float] button[class*=button]{border-radius:10px}[data-dsh-glass-float] [class*=iconButton],[data-dsh-glass-float] [class*=searchButton]{border-radius:8px}[data-dsh-glass-float] [class*=block]{--dsl-code-block-border-radius:14px;--dsl-diff-radius:14px;--dsl-read-radius:14px;--dsl-terminal-radius:14px;--dsl-web-radius:14px;--dsl-search-radius:14px;border-radius:14px}[data-dsh-glass-float] [data-dsh-glass-add]{background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim);box-shadow:var(--dsh-glass-edge);backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass-float] [data-dsh-glass-add]:hover:not(:disabled){background:var(--dsh-glass-card-hover)}[data-dsh-glass-float] [data-dsh-glass-surface]{background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim);box-shadow:var(--dsh-glass-edge);backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass-float] [data-dsh-glass-surface]:hover:not(:disabled){background:var(--dsh-glass-card-hover)}[data-dsh-glass-float] [data-conversation-scroll] [class*=bubble]{border:1px solid var(--dsh-glass-rim-soft);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) calc(46% * var(--dsh-glass-frost,1)), transparent);border-radius:14px}[data-dsh-glass-float] [class*=card]{border-radius:14px}[data-dsh-glass] [data-dsh-glass-settings]{--dsh-glass-settings-raised:calc(38% + 38% * var(--dsh-glass-frost,1));--dsh-glass-settings-soft:calc(30% + 30% * var(--dsh-glass-frost,1));--dsw-alias-bg-module-platform:color-mix(in srgb, var(--dsw-static-neutral-bluish-800) var(--dsh-glass-settings-raised), transparent);--dsw-alias-bg-layer-3:color-mix(in srgb, var(--dsw-static-neutral-bluish-800) var(--dsh-glass-settings-soft), transparent);--dsw-alias-bg-layer-2:color-mix(in srgb, var(--dsw-static-neutral-bluish-850) var(--dsh-glass-settings-raised), transparent);--dsw-alias-bg-layer-1:color-mix(in srgb, var(--dsw-static-neutral-bluish-850) var(--dsh-glass-settings-soft), transparent);--dsw-specific-sidebar-nav-item-active:color-mix(in srgb, var(--dsw-static-neutral-bluish-750) var(--dsh-glass-settings-raised), transparent);--dsw-specific-sidebar-nav-item-hover:color-mix(in srgb, var(--dsw-static-neutral-bluish-850) var(--dsh-glass-settings-soft), transparent)}[data-dsh-glass] body:not([data-ds-dark-theme]) [data-dsh-glass-settings]{--dsw-alias-bg-module-platform:color-mix(in srgb, var(--dsw-static-neutral-bluish-60) var(--dsh-glass-settings-raised), transparent);--dsw-alias-bg-layer-3:color-mix(in srgb, var(--dsw-static-neutral-bluish-00) var(--dsh-glass-settings-soft), transparent);--dsw-alias-bg-layer-2:color-mix(in srgb, var(--dsw-static-neutral-bluish-00) var(--dsh-glass-settings-raised), transparent);--dsw-alias-bg-layer-1:color-mix(in srgb, var(--dsw-static-neutral-bluish-00) var(--dsh-glass-settings-soft), transparent);--dsw-specific-sidebar-nav-item-active:color-mix(in srgb, var(--dsw-static-neutral-bluish-100) var(--dsh-glass-settings-raised), transparent);--dsw-specific-sidebar-nav-item-hover:color-mix(in srgb, var(--dsw-static-neutral-bluish-75) var(--dsh-glass-settings-soft), transparent)}[data-dsh-glass-float] [data-phase] header{border:1px solid var(--dsh-glass-rim);background:var(--dsh-glass-card);box-shadow:var(--dsh-glass-edge), var(--dsh-glass-drop);backdrop-filter:blur(var(--dsh-glass-blur,14px));border-radius:20px;margin:12px 16px 0;padding:10px 16px 8px}[data-dsh-glass-float] [data-phase] header:after{display:none}[data-dsh-glass-float] [data-dsh-glass-frame][data-sidebar-collapsed] [data-phase] header{margin-left:28px}[data-dsh-glass-float] [class*=sidebarCol]{--dsw-specific-sidebar-fill:transparent;z-index:9;border:1px solid var(--dsh-glass-rim);box-shadow:var(--dsh-glass-drop);border-radius:20px;margin:12px;padding:10px 12px 14px;position:relative;overflow:hidden}[data-dsh-glass-float] [class*=sidebarCol]:before{content:\"\";border-radius:inherit;background:var(--dsh-glass-card);box-shadow:var(--dsh-glass-edge);z-index:-1;pointer-events:none;transition:border-radius .15s var(--ds-ease-in-out);position:absolute;inset:0}[data-dsh-glass-float] [data-dsh-glass-frame][data-sidebar-collapsed] [class*=sidebarCol]{transition:margin .15s var(--ds-ease-in-out), border-radius .15s var(--ds-ease-in-out);border-radius:16px;margin:12px -12px 12px 12px;padding:0}[data-dsh-glass-float] [data-dsh-glass-frame]:not([data-sidebar-collapsed]) [data-dsh-glass-sidebar-root]{width:100%!important}[data-dsh-glass-float] [data-dsh-glass-trajectory]{border:1px solid var(--dsh-glass-rim);background:var(--dsh-glass-card);width:calc(100% - 32px);height:calc(100% - 20px);box-shadow:var(--dsh-glass-edge), var(--dsh-glass-drop);border-radius:20px;margin:8px 16px 12px;overflow:hidden}[data-dsh-glass-float] [data-dsh-glass-trajectory] [role=toolbar],[data-dsh-glass-float] [data-dsh-glass-trajectory] section[aria-label=Trajectory\\ timeline]{background:0 0}[data-dsh-glass-float] [data-composer-card],[data-dsh-glass-float] [data-composer-card]:after{border-radius:24px}[data-dsh-glass-float] [data-composer-card]{z-index:8;isolation:isolate;border:1px solid var(--dsh-glass-rim-strong);box-shadow:var(--dsh-glass-input-shadow);background:0 0;position:relative}[data-dsh-glass-float] [data-composer-card]:before{content:\"\";z-index:-1;border-radius:inherit;background:var(--dsh-glass-card);box-shadow:var(--dsh-glass-edge);backdrop-filter:blur(var(--dsh-glass-blur,14px));pointer-events:none;position:absolute;inset:0}[data-dsh-glass-float] [data-dsh-glass-inputbar]:not([class*=hero]):not(:has([data-dsh-glass-stats])){padding-bottom:12px}[data-dsh-glass-float] [role=treeitem][aria-selected=true]{background:var(--dsw-alias-interactive-bg-hover)}[data-dsh-glass-float] button[class*=button]:hover:not(:disabled),[data-dsh-glass-float] [role=menuitem]:hover:not(:disabled){box-shadow:0 0 12px color-mix(in srgb, var(--dsw-alias-brand-primary-new-colorprimary-new-color) 20%, transparent)}[data-dsh-glass-float] [data-menu-material=translucent]:not(:focus-visible){--dsw-menu-surface-fill:var(--dsh-glass-card-raised);--dsw-menu-backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass-float] [role=menu]:not([data-menu-material]):not([data-menu-material] *){background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim-soft);backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass-float] [data-menu-material=translucent]:has([role=group]>[role=menuitemradio]){--dsw-menu-surface-fill:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 70%, transparent)}[data-dsh-glass-float] [data-menu-group]:has(>[role=menuitemradio])>[data-menu-group-heading]{background:var(--dsh-glass-card-raised);backdrop-filter:blur(var(--dsh-glass-blur,14px));border-radius:999px;align-items:center;width:fit-content;margin:3px 0 5px 6px;padding:3px 10px;display:inline-flex}[data-dsh-glass-float] [role=dialog][aria-modal=true]{background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim);box-shadow:var(--dsh-glass-edge);backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass] [data-conversation-scroll]{text-shadow:0 0 1px #ffffff80}[data-dsh-glass] body[data-ds-dark-theme] [data-conversation-scroll]{text-shadow:0 0 1px #0006}[data-dsh-glass-float] [data-dsh-glass-inputbar] [data-slot]{color:var(--dsw-alias-label-secondary)}[data-dsh-glass]{--dsh-glass-entry-scale:1}[data-dsh-glass-compat]{--dsh-glass-entry-scale:0}[data-dsh-glass] [data-phase=hero]{animation:dsh-glass-in calc(.32s * var(--dsh-glass-entry-scale,1)) var(--ds-ease-in-out)}[data-dsh-glass] [data-phase=active]{animation:dsh-glass-in calc(.3s * var(--dsh-glass-entry-scale,1)) var(--ds-ease-in-out)}[data-dsh-glass] [data-testid^=view-]{animation:dsh-glass-in calc(.26s * var(--dsh-glass-entry-scale,1)) var(--ds-ease-in-out)}[data-dsh-glass] [data-tool]{animation:dsh-glass-rise calc(.3s * var(--dsh-glass-entry-scale,1)) var(--ds-ease-in-out) both}[data-dsh-glass] [role=dialog]{animation:dsh-glass-dialog-in calc(.24s * var(--dsh-glass-entry-scale,1)) var(--ds-ease-in-out)}@keyframes dsh-glass-in{0%{opacity:0}}@keyframes dsh-glass-rise{0%{opacity:0;transform:translateY(6px)}}@keyframes dsh-glass-dialog-in{0%{opacity:0;transform:translateY(8px)scale(.985)}}[data-dsh-glass] :focus-visible{outline:2px solid color-mix(in srgb, var(--dsw-alias-brand-primary-new-colorprimary-new-color) 85%, transparent);outline-offset:1px}[data-dsh-glass] ::selection{background:color-mix(in srgb, var(--dsw-alias-brand-primary-new-colorprimary-new-color) 35%, transparent)}[data-dsh-glass-compat] [role=menu]:not([data-menu-material]):not([data-menu-material] *),[data-dsh-glass-compat] [class*=popover],[data-dsh-glass-compat] [class*=dropdown]{backdrop-filter:blur(12px)}[data-dsh-glass-compat] [data-menu-material=translucent]:not(:focus-visible){--dsw-menu-surface-fill:var(--dsh-glass-card-raised);--dsw-menu-backdrop-filter:blur(12px)}[data-dsh-glass-compat] [data-sidebar-right-panel][data-sidebar-right-open],[data-dsh-glass-compat] [data-sidebar-right-panel][data-sidebar-right-open] [class*=panel]{backdrop-filter:blur(12px)}[data-dsh-glass-compat] [role=menu]:not([data-menu-material]):not([data-menu-material] *),[data-dsh-glass-compat] [class*=popover],[data-dsh-glass-compat] [class*=dropdown]{background:var(--dsh-glass-card-raised)}[data-dsh-glass-compat] [data-composer-card]{isolation:isolate;backdrop-filter:none;background:0 0;position:relative}[data-dsh-glass-compat] [data-composer-card]:before{content:\"\";z-index:-1;border-radius:inherit;background:var(--dsh-glass-card-raised);backdrop-filter:blur(12px);pointer-events:none;position:absolute;inset:0}[data-dsh-glass-compat] [role=menu]:not([data-menu-material]):not([data-menu-material] *):not(:focus-visible),[data-dsh-glass-compat] [data-composer-card]:not(:focus-visible),[data-dsh-glass-compat] [class*=popover]:not(:focus-visible),[data-dsh-glass-compat] [class*=dropdown]:not(:focus-visible){outline:1px solid var(--dsh-glass-rim);outline-offset:-1px}[data-dsh-glass-compat] [role=dialog][aria-modal=true]{background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim);backdrop-filter:blur(var(--dsh-glass-blur,12px))}@media (prefers-reduced-motion:reduce){[data-dsh-glass] [data-phase=hero],[data-dsh-glass] [data-phase=active],[data-dsh-glass] [data-testid^=view-],[data-dsh-glass] [data-tool],[data-dsh-glass] [role=dialog]{animation:none}}";
593
+ const GLASS_CSS_TEXT = "[data-dsh-glass] body{--dsh-glass-card:color-mix(in srgb, var(--dsw-alias-bg-layer-1) calc(52% * var(--dsh-glass-frost,1)), transparent);--dsh-glass-card-raised:color-mix(in srgb, var(--dsw-alias-bg-layer-1) calc(64% * var(--dsh-glass-frost,1)), transparent);--dsh-glass-card-hover:color-mix(in srgb, var(--dsw-alias-bg-layer-1) calc(76% * var(--dsh-glass-frost,1)), transparent);--dsh-glass-rim:color-mix(in srgb, var(--dsw-alias-label-primary) 18%, transparent);--dsh-glass-rim-soft:color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent);--dsh-glass-rim-strong:color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent);--dsh-glass-edge:inset 0 1px 0 #ffffff6b;--dsh-glass-drop:0 10px 32px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 38%, transparent);--dsh-glass-input-shadow:0 1px 2px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 65%, transparent), 0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 80%, transparent);--dsh-glass-ground:color-mix(in srgb, color-mix(in srgb, var(--dsw-alias-bg-base), #fff calc(var(--dsh-glass-brightness-white,0) * 100%)), #000 calc(var(--dsh-glass-brightness-black,0) * 100%));--dsh-glass-ambience:calc(1 - var(--dsh-glass-brightness-white,0) - var(--dsh-glass-brightness-black,0));--dsh-glass-wash-tint:#fff;--dsh-glass-wash-mix:22%}[data-dsh-glass] body[data-ds-dark-theme]{--dsh-glass-rim:color-mix(in srgb, var(--dsw-alias-label-primary) 24%, transparent);--dsh-glass-rim-soft:color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent);--dsh-glass-rim-strong:color-mix(in srgb, var(--dsw-alias-label-primary) 30%, transparent);--dsh-glass-edge:inset 0 1px 0 #ffffff14;--dsh-glass-drop:0 10px 32px #02060e73;--dsh-glass-input-shadow:0 1px 2px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 65%, transparent), 0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-mask-2) 80%, transparent);--dsh-glass-wash-tint:var(--dsw-alias-bg-layer-1);--dsh-glass-wash-mix:68%}[data-dsh-glass] body{background: radial-gradient(58% 46% at 18% 6%, color-mix(in srgb, var(--dsw-alias-brand-primary-new-colorprimary-new-color) calc(12% * var(--dsh-glass-ambience) * var(--dsh-glass-glow,0)), transparent), transparent 68%), radial-gradient(48% 42% at 86% 14%, color-mix(in srgb, var(--dsw-alias-state-success-tertiary) calc(10% * var(--dsh-glass-ambience) * var(--dsh-glass-glow,0)), transparent), transparent 62%), linear-gradient(165deg, color-mix(in srgb, var(--dsh-glass-ground), var(--dsh-glass-wash-tint) calc(var(--dsh-glass-wash-mix) * var(--dsh-glass-ambience))) 0%, var(--dsh-glass-ground) 55%, color-mix(in srgb, var(--dsh-glass-ground), #000 calc(5% * var(--dsh-glass-ambience))) 100%)}[data-dsh-glass] [data-dsh-glass-frame],[data-dsh-glass] [data-phase],[data-dsh-glass] [data-dsh-glass-details]{background:0 0}[data-dsh-glass-float] [data-phase=active] header{z-index:8;position:relative}[data-dsh-glass-float] [class*=banner]{position:static}[data-dsh-glass-float] [data-phase=active] [data-conversation-scroll]{margin-top:-95px;padding-top:107px}[data-dsh-glass] [data-phase] [class*=composerSeat][class*=composerSeat]{background:0 0}[data-dsh-glass] [data-dsh-glass-fade]{z-index:7;pointer-events:none;backdrop-filter:blur(5px);background:#ffffff2e;height:13px;position:fixed;left:0;right:0}[data-dsh-glass] body[data-ds-dark-theme] [data-dsh-glass-fade]{background:#00000024}[data-dsh-glass] [data-dsh-glass-fade=top]{top:0;-webkit-mask-image:linear-gradient(#000 0%,#0000 100%);mask-image:linear-gradient(#000 0%,#0000 100%)}[data-dsh-glass][data-windows-titlebar] [data-dsh-glass-fade=top]{display:none}[data-dsh-glass] [data-dsh-glass-fade=bottom]{bottom:0;-webkit-mask-image:linear-gradient(#0000 0%,#000 100%);mask-image:linear-gradient(#0000 0%,#000 100%)}[data-dsh-glass-float] [data-menu-material=translucent],[data-dsh-glass-float] [role=menu]:not([data-menu-material]):not([data-menu-material] *),[data-dsh-glass-float] [role=dialog],[data-dsh-glass-float] [role=alert],[data-dsh-glass-float] [data-trigger-menu],[data-dsh-glass-float] [data-dsh-glass-surface]{border-radius:14px}[data-dsh-glass-float] [role=menuitem],[data-dsh-glass-float] [role=tooltip],[data-dsh-glass-float] [class*=pill]{border-radius:8px}[data-dsh-glass-float] button[class*=button]{border-radius:10px}[data-dsh-glass-float] [class*=iconButton],[data-dsh-glass-float] [class*=searchButton]{border-radius:8px}[data-dsh-glass-float] [class*=block]{--dsl-code-block-border-radius:14px;--dsl-diff-radius:14px;--dsl-read-radius:14px;--dsl-terminal-radius:14px;--dsl-web-radius:14px;--dsl-search-radius:14px;border-radius:14px}[data-dsh-glass-float] [data-dsh-glass-add]{background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim);box-shadow:var(--dsh-glass-edge);backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass-float] [data-dsh-glass-add]:hover:not(:disabled){background:var(--dsh-glass-card-hover)}[data-dsh-glass-float] [data-dsh-glass-surface]{background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim);box-shadow:var(--dsh-glass-edge);backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass-float] [data-dsh-glass-surface]:hover:not(:disabled){background:var(--dsh-glass-card-hover)}[data-dsh-glass-float] [data-conversation-scroll] [class*=bubble]{border:1px solid var(--dsh-glass-rim-soft);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) calc(46% * var(--dsh-glass-frost,1)), transparent);border-radius:14px}[data-dsh-glass-float] [class*=card]{border-radius:14px}[data-dsh-glass-float] [data-reader-reasoning-card]:not([data-overflow=false][data-expanded=false]),[data-dsh-glass-compat] [data-reader-reasoning-card]:not([data-overflow=false][data-expanded=false]){background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) calc(52% * var(--dsh-glass-frost,1)), transparent);border-color:var(--dsh-glass-rim-soft);border-radius:14px}body[data-dsh-glass-float] [data-changed-files],body[data-dsh-glass-float] [data-presented-file]{--changes-fill:var(--dsh-glass-card);--deliverable-fill:var(--dsh-glass-card);border-color:var(--dsh-glass-rim-soft);border-radius:14px}body[data-dsh-glass-float] [data-presented-file],body[data-dsh-glass-float] [data-changed-files]{background:var(--dsh-glass-card)}body[data-dsh-glass-float] [data-changed-files]>:first-child,body[data-dsh-glass-float] [data-changed-files] ul>li>:first-child,body[data-dsh-glass-float] [data-changed-files] ul{background:0 0}body[data-dsh-glass-float] [data-changed-files] ul{border-top:.5px solid var(--dsh-glass-rim-soft)}body[data-dsh-glass-float] [data-changed-files]>:first-child>:first-child,body[data-dsh-glass-float] [data-presented-file]>:first-child{background:var(--dsh-glass-card-raised)}[data-dsh-glass] [data-dsh-glass-settings]{--dsh-glass-settings-raised:calc(38% + 38% * var(--dsh-glass-frost,1));--dsh-glass-settings-soft:calc(30% + 30% * var(--dsh-glass-frost,1));--dsw-alias-bg-module-platform:color-mix(in srgb, var(--dsw-static-neutral-bluish-800) var(--dsh-glass-settings-raised), transparent);--dsw-alias-bg-layer-3:color-mix(in srgb, var(--dsw-static-neutral-bluish-800) var(--dsh-glass-settings-soft), transparent);--dsw-alias-bg-layer-2:color-mix(in srgb, var(--dsw-static-neutral-bluish-850) var(--dsh-glass-settings-raised), transparent);--dsw-alias-bg-layer-1:color-mix(in srgb, var(--dsw-static-neutral-bluish-850) var(--dsh-glass-settings-soft), transparent);--dsw-specific-sidebar-nav-item-active:color-mix(in srgb, var(--dsw-static-neutral-bluish-750) var(--dsh-glass-settings-raised), transparent);--dsw-specific-sidebar-nav-item-hover:color-mix(in srgb, var(--dsw-static-neutral-bluish-850) var(--dsh-glass-settings-soft), transparent)}[data-dsh-glass] body:not([data-ds-dark-theme]) [data-dsh-glass-settings]{--dsw-alias-bg-module-platform:color-mix(in srgb, var(--dsw-static-neutral-bluish-60) var(--dsh-glass-settings-raised), transparent);--dsw-alias-bg-layer-3:color-mix(in srgb, var(--dsw-static-neutral-bluish-00) var(--dsh-glass-settings-soft), transparent);--dsw-alias-bg-layer-2:color-mix(in srgb, var(--dsw-static-neutral-bluish-00) var(--dsh-glass-settings-raised), transparent);--dsw-alias-bg-layer-1:color-mix(in srgb, var(--dsw-static-neutral-bluish-00) var(--dsh-glass-settings-soft), transparent);--dsw-specific-sidebar-nav-item-active:color-mix(in srgb, var(--dsw-static-neutral-bluish-100) var(--dsh-glass-settings-raised), transparent);--dsw-specific-sidebar-nav-item-hover:color-mix(in srgb, var(--dsw-static-neutral-bluish-75) var(--dsh-glass-settings-soft), transparent)}[data-dsh-glass-float] [data-phase] header:not([class*=headerBlank]){border:1px solid var(--dsh-glass-rim);background:var(--dsh-glass-card);box-shadow:var(--dsh-glass-edge), var(--dsh-glass-drop);backdrop-filter:blur(var(--dsh-glass-blur,14px));border-radius:20px;margin:12px 16px 0;padding:10px 16px 8px}[data-dsh-glass-float] [data-phase] header:not([class*=headerBlank]):after{display:none}[data-dsh-glass-float] [data-dsh-glass-frame][data-sidebar-collapsed] [data-phase] header:not([class*=headerBlank]){margin-left:28px}[data-dsh-glass-float] [class*=sidebarCol]{--dsw-specific-sidebar-fill:transparent;z-index:9;border:1px solid var(--dsh-glass-rim-soft);box-shadow:var(--dsh-glass-drop);border-radius:20px;margin:12px;padding:10px 12px 14px;position:relative;overflow:hidden}[data-dsh-glass-float] [class*=sidebarCol]:before{content:\"\";border-radius:inherit;background:var(--dsh-glass-card);box-shadow:var(--dsh-glass-edge);z-index:-1;pointer-events:none;transition:border-radius .15s var(--ds-ease-in-out);position:absolute;inset:0}[data-dsh-glass-float] [data-dsh-glass-frame][data-sidebar-collapsed] [class*=sidebarCol]{transition:margin .15s var(--ds-ease-in-out), border-radius .15s var(--ds-ease-in-out);border-radius:16px;margin:12px -12px 12px 12px;padding:0}[data-dsh-glass-float] [data-dsh-glass-frame]:not([data-sidebar-collapsed]) [data-dsh-glass-sidebar-root]{width:100%!important}[data-dsh-glass-float] [data-dsh-glass-trajectory]{border:1px solid var(--dsh-glass-rim);background:var(--dsh-glass-card);width:calc(100% - 32px);height:calc(100% - 20px);box-shadow:var(--dsh-glass-edge), var(--dsh-glass-drop);border-radius:20px;margin:8px 16px 12px;overflow:hidden}[data-dsh-glass-float] [data-dsh-glass-trajectory] [role=toolbar],[data-dsh-glass-float] [data-dsh-glass-trajectory] section[aria-label=Trajectory\\ timeline]{background:0 0}[data-dsh-glass-float] [data-composer-card],[data-dsh-glass-float] [data-composer-card]:after{border-radius:24px}[data-dsh-glass-float] [data-composer-card]{z-index:8;isolation:isolate;border:1px solid var(--dsh-glass-rim-strong);box-shadow:var(--dsh-glass-input-shadow);background:0 0;position:relative}[data-dsh-glass-float] [data-composer-card]:before{content:\"\";z-index:-1;border-radius:inherit;background:var(--dsh-glass-card);box-shadow:var(--dsh-glass-edge);backdrop-filter:blur(var(--dsh-glass-blur,14px));pointer-events:none;position:absolute;inset:0}[data-dsh-glass-float] [data-dsh-glass-inputbar]:not([class*=hero]):not(:has([data-dsh-glass-stats])){padding-bottom:12px}[data-dsh-glass-float] [role=treeitem][aria-selected=true]{background:var(--dsw-alias-interactive-bg-hover)}[data-dsh-glass-float] button[class*=button]:hover:not(:disabled),[data-dsh-glass-float] [role=menuitem]:hover:not(:disabled){box-shadow:0 0 12px color-mix(in srgb, var(--dsw-alias-brand-primary-new-colorprimary-new-color) 20%, transparent)}[data-dsh-glass-float] [data-menu-material=translucent]:not(:focus-visible){--dsw-menu-surface-fill:var(--dsh-glass-card-raised);--dsw-menu-backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass-float] [role=menu]:not([data-menu-material]):not([data-menu-material] *){background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim-soft);backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass-float] [data-menu-material=translucent]:has([role=group]>[role=menuitemradio]){--dsw-menu-surface-fill:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 70%, transparent)}[data-dsh-glass-float] [data-menu-group]:has(>[role=menuitemradio])>[data-menu-group-heading]{background:var(--dsh-glass-card-raised);backdrop-filter:blur(var(--dsh-glass-blur,14px));border-radius:999px;align-items:center;width:fit-content;margin:3px 0 5px 6px;padding:3px 10px;display:inline-flex}[data-dsh-glass-float] [role=dialog][aria-modal=true]{background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim);box-shadow:var(--dsh-glass-edge);backdrop-filter:blur(var(--dsh-glass-blur,14px))}[data-dsh-glass] [data-conversation-scroll]{text-shadow:0 0 1px #ffffff80}[data-dsh-glass] body[data-ds-dark-theme] [data-conversation-scroll]{text-shadow:0 0 1px #0006}[data-dsh-glass-float] [data-dsh-glass-inputbar] [data-slot]{color:var(--dsw-alias-label-secondary)}[data-dsh-glass]{--dsh-glass-entry-scale:1}[data-dsh-glass-compat]{--dsh-glass-entry-scale:0}[data-dsh-glass] [data-testid^=view-]{animation:dsh-glass-in calc(.26s * var(--dsh-glass-entry-scale,1)) var(--ds-ease-in-out)}[data-dsh-glass] [data-tool]{animation:dsh-glass-rise calc(.3s * var(--dsh-glass-entry-scale,1)) var(--ds-ease-in-out) both}[data-dsh-glass] [role=dialog]{animation:dsh-glass-dialog-in calc(.24s * var(--dsh-glass-entry-scale,1)) var(--ds-ease-in-out)}@keyframes dsh-glass-in{0%{opacity:0}}@keyframes dsh-glass-rise{0%{opacity:0;transform:translateY(6px)}}@keyframes dsh-glass-dialog-in{0%{opacity:0;transform:translateY(8px)scale(.985)}}[data-dsh-glass] :focus-visible{outline:2px solid color-mix(in srgb, var(--dsw-alias-brand-primary-new-colorprimary-new-color) 85%, transparent);outline-offset:1px}[data-dsh-glass] ::selection{background:color-mix(in srgb, var(--dsw-alias-brand-primary-new-colorprimary-new-color) 35%, transparent)}[data-dsh-glass-compat] [role=menu]:not([data-menu-material]):not([data-menu-material] *),[data-dsh-glass-compat] [class*=popover],[data-dsh-glass-compat] [class*=dropdown]{backdrop-filter:blur(12px)}[data-dsh-glass-compat] [data-menu-material=translucent]:not(:focus-visible){--dsw-menu-surface-fill:var(--dsh-glass-card-raised);--dsw-menu-backdrop-filter:blur(12px)}[data-dsh-glass-compat] [data-sidebar-right-panel][data-sidebar-right-open],[data-dsh-glass-compat] [data-sidebar-right-panel][data-sidebar-right-open] [class*=panel]{backdrop-filter:blur(12px)}[data-dsh-glass-compat] [role=menu]:not([data-menu-material]):not([data-menu-material] *),[data-dsh-glass-compat] [class*=popover],[data-dsh-glass-compat] [class*=dropdown]{background:var(--dsh-glass-card-raised)}[data-dsh-glass-compat] [data-composer-card]{isolation:isolate;backdrop-filter:none;background:0 0;position:relative}[data-dsh-glass-compat] [data-composer-card]:before{content:\"\";z-index:-1;border-radius:inherit;background:var(--dsh-glass-card-raised);backdrop-filter:blur(12px);pointer-events:none;position:absolute;inset:0}[data-dsh-glass-compat] [role=menu]:not([data-menu-material]):not([data-menu-material] *):not(:focus-visible),[data-dsh-glass-compat] [data-composer-card]:not(:focus-visible),[data-dsh-glass-compat] [class*=popover]:not(:focus-visible),[data-dsh-glass-compat] [class*=dropdown]:not(:focus-visible){outline:1px solid var(--dsh-glass-rim);outline-offset:-1px}[data-dsh-glass-compat] [role=dialog][aria-modal=true]{background:var(--dsh-glass-card-raised);border:1px solid var(--dsh-glass-rim);backdrop-filter:blur(var(--dsh-glass-blur,12px))}@media (prefers-reduced-motion:reduce){[data-dsh-glass] [data-testid^=view-],[data-dsh-glass] [data-tool],[data-dsh-glass] [role=dialog]{animation:none}}";
594
594
  /** Legacy settings namespace (DSH <= 0.1.6-alpha.2): the Host registers it
595
595
  * through `settings.installSection`, the Client binds it through
596
596
  * `ctx.settingsScope` (see `src/settings-catppuccin.ts`). */
@@ -640,7 +640,8 @@ window.__ModuleLoader__.load({
640
640
  mode: "mica",
641
641
  blur: 5,
642
642
  frost: 20,
643
- brightness: 50
643
+ brightness: 50,
644
+ glow: false
644
645
  };
645
646
  /** Shipped update-check channel: chase the stable `latest` tag. */
646
647
  const DEFAULT_UPDATE_CHANNEL = "latest";
@@ -708,6 +709,7 @@ window.__ModuleLoader__.load({
708
709
  state.glass.blur = clampFinite(glass.blur, 0, 40, DEFAULT_GLASS.blur);
709
710
  state.glass.frost = clampFinite(glass.frost, 0, 100, DEFAULT_GLASS.frost);
710
711
  state.glass.brightness = clampFinite(glass.brightness, 0, 100, DEFAULT_GLASS.brightness);
712
+ state.glass.glow = glass.glow === true;
711
713
  state.autoCheck = raw.autoCheck !== false;
712
714
  state.updateChannel = raw.updateChannel === "beta" ? "beta" : "latest";
713
715
  state.overrides = sanitizeOverrides(raw.overrides);
@@ -719,7 +721,7 @@ window.__ModuleLoader__.load({
719
721
  * "no durable state yet" apart from "an explicit default choice". */
720
722
  function isDefaultState(state) {
721
723
  const expected = defaultState();
722
- return state.flavor === expected.flavor && state.glass.enabled === expected.glass.enabled && state.glass.mode === expected.glass.mode && state.glass.blur === expected.glass.blur && state.glass.frost === expected.glass.frost && state.glass.brightness === expected.glass.brightness && state.autoCheck === expected.autoCheck && state.updateChannel === expected.updateChannel && Object.keys(state.overrides).length === 0 && state.shikiStyle === expected.shikiStyle;
724
+ return state.flavor === expected.flavor && state.glass.enabled === expected.glass.enabled && state.glass.mode === expected.glass.mode && state.glass.blur === expected.glass.blur && state.glass.frost === expected.glass.frost && state.glass.brightness === expected.glass.brightness && state.glass.glow === expected.glass.glow && state.autoCheck === expected.autoCheck && state.updateChannel === expected.updateChannel && Object.keys(state.overrides).length === 0 && state.shikiStyle === expected.shikiStyle;
723
725
  }
724
726
  /** Drop the synthetic `version` field: full state → settings-document section. */
725
727
  function settingsSectionFromState(state) {
@@ -740,7 +742,7 @@ window.__ModuleLoader__.load({
740
742
  /** Whether two settings sections are field-for-field equal (used to skip
741
743
  * redundant mirror writes and to recognize the Host echoing our own write). */
742
744
  function settingsSectionsEqual(a, b) {
743
- return a.flavor === b.flavor && a.glass.enabled === b.glass.enabled && a.glass.mode === b.glass.mode && a.glass.blur === b.glass.blur && a.glass.frost === b.glass.frost && a.glass.brightness === b.glass.brightness && a.autoCheck === b.autoCheck && a.updateChannel === b.updateChannel && a.shikiStyle === b.shikiStyle && Object.keys(a.overrides).every((key) => b.overrides[key] === a.overrides[key]) && Object.keys(b.overrides).every((key) => a.overrides[key] === b.overrides[key]);
745
+ return a.flavor === b.flavor && a.glass.enabled === b.glass.enabled && a.glass.mode === b.glass.mode && a.glass.blur === b.glass.blur && a.glass.frost === b.glass.frost && a.glass.brightness === b.glass.brightness && a.glass.glow === b.glass.glow && a.autoCheck === b.autoCheck && a.updateChannel === b.updateChannel && a.shikiStyle === b.shikiStyle && Object.keys(a.overrides).every((key) => b.overrides[key] === a.overrides[key]) && Object.keys(b.overrides).every((key) => a.overrides[key] === b.overrides[key]);
744
746
  }
745
747
  //#endregion
746
748
  //#region src/client/glass/glass-layer.ts
@@ -774,7 +776,8 @@ window.__ModuleLoader__.load({
774
776
  mode: DEFAULT_GLASS.mode,
775
777
  blur: DEFAULT_GLASS.blur,
776
778
  frost: DEFAULT_GLASS.frost,
777
- brightness: DEFAULT_GLASS.brightness
779
+ brightness: DEFAULT_GLASS.brightness,
780
+ glow: DEFAULT_GLASS.glow
778
781
  };
779
782
  /** Numeric knob keys and their localStorage names. */
780
783
  const NUMERIC_KEYS = {
@@ -790,6 +793,8 @@ window.__ModuleLoader__.load({
790
793
  * storage key, which silently killed cross-tab knob sync; audit F1). */
791
794
  const NUMERIC_STORAGE_KEYS = Object.values(NUMERIC_KEYS);
792
795
  const MODE_KEY = "dsh.catppuccin.glass.mode";
796
+ /** localStorage key of the ground-glow switch (issue #26). */
797
+ const GLOW_KEY = "dsh.catppuccin.glass.glow";
793
798
  /** Clamp a numeric knob into its sane range. */
794
799
  function clampSetting(key, value) {
795
800
  const max = key === "blur" ? 40 : 100;
@@ -839,6 +844,21 @@ window.__ModuleLoader__.load({
839
844
  localStorage.setItem(GLASS_ENABLED_KEY, String(value));
840
845
  } catch {}
841
846
  }
847
+ /** Read the ground-glow switch (absent storage means the shipped default: off). */
848
+ function readGlow() {
849
+ try {
850
+ const raw = localStorage.getItem(GLOW_KEY);
851
+ return raw === null ? SETTINGS_DEFAULTS.glow : raw === "true";
852
+ } catch {
853
+ return SETTINGS_DEFAULTS.glow;
854
+ }
855
+ }
856
+ /** Persist the ground-glow switch. */
857
+ function writeGlow(value) {
858
+ try {
859
+ localStorage.setItem(GLOW_KEY, String(value));
860
+ } catch {}
861
+ }
842
862
  /** Resolved scheme from the theme service (falls back to the body attribute). */
843
863
  function resolveDark(ctx) {
844
864
  try {
@@ -888,7 +908,7 @@ window.__ModuleLoader__.load({
888
908
  } else if (event.key === "dsh.catppuccin.glass.enabled") {
889
909
  this.enabled = readEnabled();
890
910
  this.sync();
891
- } else if (event.key === MODE_KEY || NUMERIC_STORAGE_KEYS.includes(event.key)) {
911
+ } else if (event.key === MODE_KEY || event.key === GLOW_KEY || NUMERIC_STORAGE_KEYS.includes(event.key)) {
892
912
  this.reloadSettings();
893
913
  if (this.enabled) this.applySettings();
894
914
  this.publish();
@@ -926,7 +946,8 @@ window.__ModuleLoader__.load({
926
946
  mode: this.settings.mode,
927
947
  blur: this.settings.blur,
928
948
  frost: this.settings.frost,
929
- brightness: this.settings.brightness
949
+ brightness: this.settings.brightness,
950
+ glow: this.settings.glow
930
951
  };
931
952
  }
932
953
  /** Overlay durable state hydrated from the Host file: persist it to
@@ -938,13 +959,15 @@ window.__ModuleLoader__.load({
938
959
  mode: remote.mode === "compat" ? "compat" : "mica",
939
960
  blur: clampSetting("blur", remote.blur),
940
961
  frost: clampSetting("frost", remote.frost),
941
- brightness: clampSetting("brightness", remote.brightness)
962
+ brightness: clampSetting("brightness", remote.brightness),
963
+ glow: remote.glow === true
942
964
  };
943
965
  writeEnabled(this.enabled);
944
966
  writeMode(this.settings.mode);
945
967
  writeSetting("blur", this.settings.blur);
946
968
  writeSetting("frost", this.settings.frost);
947
969
  writeSetting("brightness", this.settings.brightness);
970
+ writeGlow(this.settings.glow);
948
971
  this.sync();
949
972
  }
950
973
  /** Flip the layer: persist, then apply or retract every owned effect. */
@@ -989,6 +1012,14 @@ window.__ModuleLoader__.load({
989
1012
  if (this.enabled) this.applySettings();
990
1013
  this.publish();
991
1014
  }
1015
+ /** Toggle the two static ground glows (issue #26; wash-only is the default). */
1016
+ setGlow(value) {
1017
+ if (value === this.settings.glow) return;
1018
+ this.settings.glow = value;
1019
+ writeGlow(value);
1020
+ if (this.enabled) this.applySettings();
1021
+ this.publish();
1022
+ }
992
1023
  /** Restore every knob to the shipped defaults (persisted immediately). */
993
1024
  resetDefaults() {
994
1025
  this.settings = { ...SETTINGS_DEFAULTS };
@@ -996,6 +1027,7 @@ window.__ModuleLoader__.load({
996
1027
  writeSetting("blur", this.settings.blur);
997
1028
  writeSetting("frost", this.settings.frost);
998
1029
  writeSetting("brightness", this.settings.brightness);
1030
+ writeGlow(this.settings.glow);
999
1031
  if (this.enabled) this.applySettings();
1000
1032
  this.publish();
1001
1033
  }
@@ -1005,7 +1037,8 @@ window.__ModuleLoader__.load({
1005
1037
  mode: readMode(),
1006
1038
  blur: readSetting("blur"),
1007
1039
  frost: readSetting("frost"),
1008
- brightness: readSetting("brightness")
1040
+ brightness: readSetting("brightness"),
1041
+ glow: readGlow()
1009
1042
  };
1010
1043
  }
1011
1044
  buildSnapshot() {
@@ -1032,6 +1065,7 @@ window.__ModuleLoader__.load({
1032
1065
  const dark = this.dark;
1033
1066
  style.setProperty("--dsh-glass-brightness-black", String(dark ? Math.max(0, (50 - this.settings.brightness) / 50) : 0));
1034
1067
  style.setProperty("--dsh-glass-brightness-white", String(dark ? 0 : Math.max(0, (this.settings.brightness - 50) / 50)));
1068
+ style.setProperty("--dsh-glass-glow", this.settings.glow ? "1" : "0");
1035
1069
  const compat = this.settings.mode === "compat";
1036
1070
  document.documentElement.toggleAttribute(GLASS_FLOAT_ATTRIBUTE, !compat);
1037
1071
  document.documentElement.toggleAttribute(GLASS_COMPAT_ATTRIBUTE, compat);
@@ -1273,8 +1307,8 @@ window.__ModuleLoader__.load({
1273
1307
  * @param props - composed slot props.
1274
1308
  * @returns the General section row.
1275
1309
  */
1276
- function GlassRow({ t, getState, subscribe, setEnabled, setMode, setBlur, setFrost, setBrightness, resetDefaults }) {
1277
- const { enabled, mode, blur, frost, brightness, dark } = (0, react.useSyncExternalStore)(subscribe, getState);
1310
+ function GlassRow({ t, getState, subscribe, setEnabled, setMode, setBlur, setFrost, setBrightness, setGlow, resetDefaults }) {
1311
+ const { enabled, mode, blur, frost, brightness, glow, dark } = (0, react.useSyncExternalStore)(subscribe, getState);
1278
1312
  const bgMin = dark ? 0 : 50;
1279
1313
  const bgMax = dark ? 50 : 100;
1280
1314
  const bgDisplay = Math.min(bgMax, Math.max(bgMin, brightness));
@@ -1407,6 +1441,31 @@ window.__ModuleLoader__.load({
1407
1441
  className: GlassRow_module_css_default.knobHint,
1408
1442
  children: t(dark ? "glass.brightnessHintDark" : "glass.brightnessHintLight")
1409
1443
  }),
1444
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1445
+ className: GlassRow_module_css_default.row,
1446
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1447
+ className: GlassRow_module_css_default.rowLabel,
1448
+ children: t("glass.glow")
1449
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1450
+ type: "button",
1451
+ role: "switch",
1452
+ "aria-checked": glow,
1453
+ "aria-label": t("glass.glow"),
1454
+ className: glow ? GlassRow_module_css_default.toggleOn : GlassRow_module_css_default.toggle,
1455
+ onClick: () => {
1456
+ setGlow(!glow);
1457
+ },
1458
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1459
+ className: GlassRow_module_css_default.check,
1460
+ "aria-hidden": "true",
1461
+ children: glow ? "✓" : ""
1462
+ })
1463
+ })]
1464
+ }),
1465
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1466
+ className: GlassRow_module_css_default.rowHint,
1467
+ children: t("glass.glowHint")
1468
+ }),
1410
1469
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1411
1470
  className: GlassRow_module_css_default.row,
1412
1471
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -2089,6 +2148,8 @@ window.__ModuleLoader__.load({
2089
2148
  "glass.brightness": "背景亮度",
2090
2149
  "glass.brightnessHintDark": "深色模式:0 压暗至纯黑,50 原样",
2091
2150
  "glass.brightnessHintLight": "浅色模式:50 原样,100 提亮至纯白",
2151
+ "glass.glow": "地面光斑",
2152
+ "glass.glowHint": "在渐变地面上叠加两枚柔光斑(0.6.3 的观感)。光斑固定在屏幕上,各块玻璃面板会透出它的不同部位,所以默认关闭;打开后左上角会明显偏亮",
2092
2153
  "glass.reset": "还原默认值",
2093
2154
  "update.title": "检查 Catppuccin 插件更新",
2094
2155
  "update.description": "检测本插件(dsh-catppuccin)在 npm 上的最新版本,判断当前安装是否需要升级。",
@@ -2169,6 +2230,8 @@ window.__ModuleLoader__.load({
2169
2230
  "glass.brightness": "Backdrop brightness",
2170
2231
  "glass.brightnessHintDark": "Dark mode: 0 fades to pure black, 50 unchanged",
2171
2232
  "glass.brightnessHintLight": "Light mode: 50 unchanged, 100 brightens to pure white",
2233
+ "glass.glow": "Ground glows",
2234
+ "glass.glowHint": "Adds the two soft radial glows back on top of the gradient ground (the 0.6.3 look). They are pinned to the screen while the glass panes sit elsewhere, so each pane transmits a different slice of them — off by default; turning it on visibly brightens the top-left corner",
2172
2235
  "glass.reset": "Reset to defaults",
2173
2236
  "update.title": "Check for Catppuccin plugin updates",
2174
2237
  "update.description": "Checks npm for the latest dsh-catppuccin release and whether this install is current.",
@@ -2249,6 +2312,8 @@ window.__ModuleLoader__.load({
2249
2312
  "glass.brightness": "背景の輝度",
2250
2313
  "glass.brightnessHintDark": "ダーク: 0 で純黒、50 でそのまま",
2251
2314
  "glass.brightnessHintLight": "ライト: 50 でそのまま、100 で純白",
2315
+ "glass.glow": "地面の光だまり",
2316
+ "glass.glowHint": "グラデーションの地面に 2 つの柔らかな光だまりを重ねます(0.6.3 の見た目)。光だまりは画面に固定され、各ガラス面はその別々の部分を透かすため、既定ではオフ。オンにすると左上が明るくなります",
2252
2317
  "glass.reset": "デフォルトに戻す",
2253
2318
  "update.title": "Catppuccin プラグインの更新を確認",
2254
2319
  "update.description": "npm 上の dsh-catppuccin 最新版を確認し、このインストールが最新かどうかを判断します。",
@@ -2329,6 +2394,8 @@ window.__ModuleLoader__.load({
2329
2394
  "glass.brightness": "배경 밝기",
2330
2395
  "glass.brightnessHintDark": "다크 모드: 0이면 순수 검정, 50이면 그대로",
2331
2396
  "glass.brightnessHintLight": "라이트 모드: 50이면 그대로, 100이면 순수 흰색",
2397
+ "glass.glow": "지면 광점",
2398
+ "glass.glowHint": "그라데이션 지면 위에 부드러운 광점 두 개를 다시 올립니다(0.6.3 모양). 광점은 화면에 고정되어 각 유리 패널이 서로 다른 부분을 비추므로 기본값은 꺼짐이며, 켜면 왼쪽 위가 밝아집니다",
2332
2399
  "glass.reset": "기본값으로 되돌리기",
2333
2400
  "update.title": "Catppuccin 플러그인 업데이트 확인",
2334
2401
  "update.description": "npm의 최신 dsh-catppuccin 버전을 확인하고 현재 설치가 최신인지 판단합니다.",
@@ -2409,6 +2476,8 @@ window.__ModuleLoader__.load({
2409
2476
  "glass.brightness": "Brillo del fondo",
2410
2477
  "glass.brightnessHintDark": "Modo oscuro: 0 atenúa a negro puro, 50 sin cambios",
2411
2478
  "glass.brightnessHintLight": "Modo claro: 50 sin cambios, 100 aclara hasta blanco puro",
2479
+ "glass.glow": "Destellos del fondo",
2480
+ "glass.glowHint": "Vuelve a añadir los dos destellos radiales suaves sobre el fondo degradado (el aspecto de 0.6.3). Están fijados a la pantalla y cada panel de vidrio deja pasar una parte distinta, por eso está desactivado por defecto; al activarlo se aclara la esquina superior izquierda",
2412
2481
  "glass.reset": "Restablecer valores",
2413
2482
  "update.title": "Comprobar actualizaciones del plugin Catppuccin",
2414
2483
  "update.description": "Comprueba en npm la última versión de dsh-catppuccin y si esta instalación está al día.",
@@ -2489,6 +2558,8 @@ window.__ModuleLoader__.load({
2489
2558
  "glass.brightness": "Luminosité du fond",
2490
2559
  "glass.brightnessHintDark": "Mode sombre : 0 atténue vers le noir pur, 50 inchangé",
2491
2560
  "glass.brightnessHintLight": "Mode clair : 50 inchangé, 100 éclaircit vers le blanc pur",
2561
+ "glass.glow": "Halos du fond",
2562
+ "glass.glowHint": "Rajoute les deux halos radiaux doux sur le fond dégradé (l'aspect 0.6.3). Ils sont fixés à l'écran et chaque panneau de verre en laisse passer une partie différente, d'où la valeur par défaut désactivée ; l'activer éclaircit le coin supérieur gauche",
2492
2563
  "glass.reset": "Restaurer les valeurs",
2493
2564
  "update.title": "Vérifier les mises à jour du plugin Catppuccin",
2494
2565
  "update.description": "Interroge npm pour la dernière version de dsh-catppuccin et indique si cette installation est à jour.",
@@ -2569,6 +2640,8 @@ window.__ModuleLoader__.load({
2569
2640
  "glass.brightness": "Hintergrundhelligkeit",
2570
2641
  "glass.brightnessHintDark": "Dunkelmodus: 0 verdunkelt zu reinem Schwarz, 50 unverändert",
2571
2642
  "glass.brightnessHintLight": "Hellmodus: 50 unverändert, 100 hellt zu reinem Weiß auf",
2643
+ "glass.glow": "Hintergrund-Lichtflecken",
2644
+ "glass.glowHint": "Legt die beiden weichen Lichtflecken wieder über den Verlaufs-Hintergrund (das Aussehen von 0.6.3). Sie sind am Bildschirm fixiert und jede Glasscheibe lässt einen anderen Ausschnitt durch, deshalb standardmäßig aus; eingeschaltet hellt sich die linke obere Ecke auf",
2572
2645
  "glass.reset": "Standardwerte wiederherstellen",
2573
2646
  "update.title": "Catppuccin-Plugin-Updates prüfen",
2574
2647
  "update.description": "Prüft die neueste dsh-catppuccin-Version auf npm und ob diese Installation aktuell ist.",
@@ -3723,6 +3796,11 @@ window.__ModuleLoader__.load({
3723
3796
  path: ["glass", "brightness"],
3724
3797
  value: section.glass.brightness
3725
3798
  },
3799
+ {
3800
+ op: "set",
3801
+ path: ["glass", "glow"],
3802
+ value: section.glass.glow
3803
+ },
3726
3804
  {
3727
3805
  op: "set",
3728
3806
  path: ["autoCheck"],
@@ -4416,6 +4494,9 @@ window.__ModuleLoader__.load({
4416
4494
  setBrightness: (brightness) => {
4417
4495
  glass.setBrightness(brightness);
4418
4496
  },
4497
+ setGlow: (glow) => {
4498
+ glass.setGlow(glow);
4499
+ },
4419
4500
  resetDefaults: () => {
4420
4501
  glass.resetDefaults();
4421
4502
  }