diff --git a/README.md b/README.md index b0552712..517a6eda 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,34 @@ -# Codex Dream Skin +# Codex Dream Skin · 泽音 Melody 主题版
中文 · English
+## 🌙 泽音 Melody · 樽前月下 + +这是为 Codex 桌面端制作的「泽音 Melody · 樽前月下」主题美化包。主题以月夜、虹彩与粉蓝色调为核心: +新建任务首页展示泽音 Melody 插画,普通任务对话页切换为安静的深紫纯色背景,在保留原生交互的同时, +加入粉色细描边、柔和外光晕、透明标题栏和白色装饰题字。 + +
+ 
+ Windows Codex 桌面端实机效果 · 新建任务首页
+
给 Codex 桌面端换一张会呼吸的脸。
外部主题 / 换肤工具 · 本机 CDP 注入 · 不改官方安装包
diff --git a/custom-themes/zeyin-melody/background.jpg b/custom-themes/zeyin-melody/background.jpg
new file mode 100644
index 00000000..9627d2e7
Binary files /dev/null and b/custom-themes/zeyin-melody/background.jpg differ
diff --git a/custom-themes/zeyin-melody/theme.css b/custom-themes/zeyin-melody/theme.css
new file mode 100644
index 00000000..84db1b05
--- /dev/null
+++ b/custom-themes/zeyin-melody/theme.css
@@ -0,0 +1,30 @@
+[data-ds-part="root"] {
+ color: var(--ds-theme-color-text);
+}
+
+[data-ds-part="sidebar"] {
+ background-color: rgba(23, 24, 43, .76);
+ border-right-color: rgba(241, 127, 159, .24);
+}
+
+[data-ds-part="header"] {
+ background-color: rgba(23, 24, 43, .56);
+ border-bottom-color: rgba(124, 226, 232, .18);
+}
+
+[data-ds-part="message"] {
+ border-color: rgba(255, 212, 223, .16);
+ border-radius: 18px;
+}
+
+[data-ds-part="composer"] {
+ background-color: rgba(36, 33, 58, .82);
+ border-color: rgba(241, 127, 159, .34);
+ border-radius: 20px;
+}
+
+[data-ds-part="dialog"] {
+ background-color: rgba(23, 24, 43, .90);
+ border-color: rgba(124, 226, 232, .26);
+ border-radius: 18px;
+}
diff --git a/custom-themes/zeyin-melody/theme.json b/custom-themes/zeyin-melody/theme.json
new file mode 100644
index 00000000..bbe94dc5
--- /dev/null
+++ b/custom-themes/zeyin-melody/theme.json
@@ -0,0 +1,34 @@
+{
+ "schemaVersion": 1,
+ "id": "local-zeyin-melody-rainbow-ibis",
+ "name": "泽音 Melody",
+ "brandSubtitle": "SCARLET IBIS · CODEX",
+ "tagline": "飞过阴霾,让虹光与歌声落在今天的工作台。",
+ "projectPrefix": "选择项目 · ",
+ "projectLabel": "◉ 选择项目",
+ "statusText": "MELODY SIGNAL ONLINE",
+ "quote": "SING THROUGH THE STORM",
+ "image": "background.jpg",
+ "appearance": "dark",
+ "art": {
+ "focusX": 0.78,
+ "focusY": 0.44,
+ "safeArea": "left",
+ "taskMode": "off"
+ },
+ "colors": {
+ "background": "#17182b",
+ "panel": "#24213a",
+ "panelAlt": "#302a49",
+ "accent": "#f17f9f",
+ "accentAlt": "#7ce2e8",
+ "secondary": "#b85a79",
+ "highlight": "#ffd4df",
+ "text": "#fff7fb",
+ "muted": "#d8c9da",
+ "line": "rgba(241, 127, 159, .30)"
+ },
+ "promoTitle": "Codex Dream Skin",
+ "promoSub": "泽音 Melody · 虹羽之声",
+ "promoUrl": "https://space.bilibili.com/1203217682"
+}
diff --git a/macos/assets/dream-skin.css b/macos/assets/dream-skin.css
index bd112ec0..8c8094ae 100644
--- a/macos/assets/dream-skin.css
+++ b/macos/assets/dream-skin.css
@@ -480,6 +480,15 @@ html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-
content: none;
}
+/* 无任务插画时保持界面安静:保留 Codex 原生标题栏控件,
+ 仅移除 Dream Skin 的任务页装饰文字。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"])) > header.app-header-tint::before,
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"])) > header.app-header-tint::after {
+ content: none;
+}
+
html[data-dream-skin="active"] main.main-surface:not(:has([role="main"])) > :not(header.app-header-tint) {
position: relative;
z-index: 1;
@@ -521,6 +530,13 @@ html[data-dream-skin="active"] main.main-surface:not(:has([role="main"])) articl
backdrop-filter: blur(7px) saturate(105%);
}
+/* 纯色任务页使用居中的粉色柔光,不保留带位移的深色圆角投影。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"])) article {
+ border-color: rgb(var(--ds-accent-rgb) / .36);
+ box-shadow: 0 0 14px rgb(var(--ds-accent-rgb) / .12);
+}
+
html[data-dream-skin="active"][data-dream-shell="light"] main.main-surface:not(:has([role="main"])) article {
background: rgb(var(--ds-panel-rgb) / .72);
}
@@ -670,6 +686,49 @@ html[data-dream-skin="active"]
content: none !important;
}
+/* Codex 26.721+ 已不再保留可用的紧凑 hero 插画卡片。宽图会在下方规则中铺满窗口;
+ 方图和竖图则在首页主表面只绘制一次。用 banner 锚点限定新版 DOM,
+ 避免旧版首页同时在主表面和原生 hero 卡片重复绘图。 */
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ main.main-surface:has([role="main"] .home-banners) {
+ background-color: var(--ds-bg) !important;
+ background-image:
+ linear-gradient(90deg,
+ rgb(var(--ds-bg-rgb) / .62) 0%,
+ rgb(var(--ds-bg-rgb) / .28) 56%,
+ rgb(var(--ds-bg-rgb) / .10) 100%),
+ var(--dream-skin-art) !important;
+ background-position: center, var(--ds-art-position) !important;
+ background-size: 100% 100%, cover !important;
+ background-repeat: no-repeat !important;
+}
+
+/* 新版首页的固定标题栏覆盖在主表面插画之上。方图回退模式下将其透明化,
+ 让背景从窗口内容区顶部连续显示,避免形成深色横带。 */
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ main.main-surface:has([role="main"] .home-banners)
+ > header.app-header-tint {
+ background: transparent !important;
+ border-bottom: 0 !important;
+ box-shadow: none !important;
+ backdrop-filter: none !important;
+}
+
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ main.main-surface:has([role="main"] .home-banners)
+ [class~="app-shell-main-content-top-fade"] {
+ background: transparent !important;
+ opacity: 0 !important;
+}
+
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ main.main-surface:has([role="main"] .home-banners)::after {
+ color: rgb(255 255 255 / .96) !important;
+ text-shadow:
+ 0 1px 3px rgb(var(--ds-bg-rgb) / .90),
+ 0 0 12px rgb(var(--ds-bg-rgb) / .58) !important;
+}
+
/* Codex 26.721+: this chain (3-6 first-child levels deep) targets the old
compact hero-art card that used to live inside div:first-child's second
level. That level is now the empty .home-banners slot (see #244), so on
@@ -1059,6 +1118,44 @@ html[data-dream-skin="active"][data-dream-shell="light"][data-dream-art-wide="tr
backdrop-filter: blur(8px) saturate(102%) !important;
}
+/* Codex 原生在 Tailwind utilities 层中用 !important 把输入框边框宽度归零。
+ 同层覆写后,主题规则的更高特异性才能真正恢复粉色细描边。 */
+@layer utilities {
+ html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"])) .composer-surface-chrome {
+ border-width: 1px !important;
+ border-style: solid !important;
+ border-color: rgb(var(--ds-accent-rgb) / .72) !important;
+ border-radius: 22px !important;
+ background: rgb(var(--ds-panel-2-rgb)) !important;
+ box-shadow: 0 0 18px rgb(var(--ds-accent-rgb) / .26) !important;
+ backdrop-filter: none !important;
+ }
+}
+
+/* Codex 在输入框后方另设一个深灰色滚动遮罩。保留遮挡滚动文字的渐变,
+ 但让它使用任务页主题底色,避免形成独立的深色圆角底板。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"]))
+ div.sticky.bottom-0 [class*="bg-gradient-to-t"][class*="via-token-main-surface-primary"] {
+ background-image: linear-gradient(
+ to top,
+ rgb(var(--ds-bg-rgb)) 0%,
+ rgb(var(--ds-bg-rgb)) 50%,
+ rgb(var(--ds-bg-rgb) / 0) 100%
+ ) !important;
+}
+
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"]))
+ div.sticky.bottom-0 [class*="pointer-events-none"][class*="bg-gradient-to-t"][class*="from-token-main-surface-primary"] {
+ background-image: linear-gradient(
+ to top,
+ rgb(var(--ds-bg-rgb)) 0%,
+ rgb(var(--ds-bg-rgb) / 0) 100%
+ ) !important;
+}
+
html[data-dream-skin="active"] [class*="_homeUtilityBar_"] button,
html[data-dream-skin="active"] .composer-surface-chrome button:not([class~="bg-token-foreground"]) {
color: var(--ds-muted) !important;
diff --git a/output/theme-packs/zeyin-melody-home-only-v2.zip b/output/theme-packs/zeyin-melody-home-only-v2.zip
new file mode 100644
index 00000000..25777e29
Binary files /dev/null and b/output/theme-packs/zeyin-melody-home-only-v2.zip differ
diff --git a/output/verification/zeyin-melody-home-white-quote-v15.png b/output/verification/zeyin-melody-home-white-quote-v15.png
new file mode 100644
index 00000000..4a718e42
Binary files /dev/null and b/output/verification/zeyin-melody-home-white-quote-v15.png differ
diff --git a/runtime/dream-skin.css b/runtime/dream-skin.css
index b2559ffc..1b6c6423 100644
--- a/runtime/dream-skin.css
+++ b/runtime/dream-skin.css
@@ -480,6 +480,15 @@ html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-
content: none;
}
+/* 无任务插画时保持界面安静:保留 Codex 原生标题栏控件,
+ 仅移除 Dream Skin 的任务页装饰文字。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__)) > __DREAM_SELECTOR_HEADER_TINT__::before,
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__)) > __DREAM_SELECTOR_HEADER_TINT__::after {
+ content: none;
+}
+
html[data-dream-skin="active"] __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__)) > :not(__DREAM_SELECTOR_HEADER_TINT__) {
position: relative;
z-index: 1;
@@ -521,6 +530,13 @@ html[data-dream-skin="active"] __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SE
backdrop-filter: blur(7px) saturate(105%);
}
+/* 纯色任务页使用居中的粉色柔光,不保留带位移的深色圆角投影。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__)) article {
+ border-color: rgb(var(--ds-accent-rgb) / .36);
+ box-shadow: 0 0 14px rgb(var(--ds-accent-rgb) / .12);
+}
+
html[data-dream-skin="active"][data-dream-shell="light"] __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__)) article {
background: rgb(var(--ds-panel-rgb) / .72);
}
@@ -670,6 +686,49 @@ html[data-dream-skin="active"]
content: none !important;
}
+/* Codex 26.721+ 已不再保留可用的紧凑 hero 插画卡片。宽图会在下方规则中铺满窗口;
+ 方图和竖图则在首页主表面只绘制一次。用 banner 锚点限定新版 DOM,
+ 避免旧版首页同时在主表面和原生 hero 卡片重复绘图。 */
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ __DREAM_SELECTOR_SHELL_MAIN__:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__ __DREAM_SELECTOR_HOME_BANNERS__) {
+ background-color: var(--ds-bg) !important;
+ background-image:
+ linear-gradient(90deg,
+ rgb(var(--ds-bg-rgb) / .62) 0%,
+ rgb(var(--ds-bg-rgb) / .28) 56%,
+ rgb(var(--ds-bg-rgb) / .10) 100%),
+ var(--dream-skin-art) !important;
+ background-position: center, var(--ds-art-position) !important;
+ background-size: 100% 100%, cover !important;
+ background-repeat: no-repeat !important;
+}
+
+/* 新版首页的固定标题栏覆盖在主表面插画之上。方图回退模式下将其透明化,
+ 让背景从窗口内容区顶部连续显示,避免形成深色横带。 */
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ __DREAM_SELECTOR_SHELL_MAIN__:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__ __DREAM_SELECTOR_HOME_BANNERS__)
+ > __DREAM_SELECTOR_HEADER_TINT__ {
+ background: transparent !important;
+ border-bottom: 0 !important;
+ box-shadow: none !important;
+ backdrop-filter: none !important;
+}
+
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ __DREAM_SELECTOR_SHELL_MAIN__:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__ __DREAM_SELECTOR_HOME_BANNERS__)
+ [class~="app-shell-main-content-top-fade"] {
+ background: transparent !important;
+ opacity: 0 !important;
+}
+
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ __DREAM_SELECTOR_SHELL_MAIN__:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__ __DREAM_SELECTOR_HOME_BANNERS__)::after {
+ color: rgb(255 255 255 / .96) !important;
+ text-shadow:
+ 0 1px 3px rgb(var(--ds-bg-rgb) / .90),
+ 0 0 12px rgb(var(--ds-bg-rgb) / .58) !important;
+}
+
/* Codex 26.721+: this chain (3-6 first-child levels deep) targets the old
compact hero-art card that used to live inside div:first-child's second
level. That level is now the empty .home-banners slot (see #244), so on
@@ -1059,6 +1118,44 @@ html[data-dream-skin="active"][data-dream-shell="light"][data-dream-art-wide="tr
backdrop-filter: blur(8px) saturate(102%) !important;
}
+/* Codex 原生在 Tailwind utilities 层中用 !important 把输入框边框宽度归零。
+ 同层覆写后,主题规则的更高特异性才能真正恢复粉色细描边。 */
+@layer utilities {
+ html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__)) __DREAM_SELECTOR_COMPOSER_CHROME__ {
+ border-width: 1px !important;
+ border-style: solid !important;
+ border-color: rgb(var(--ds-accent-rgb) / .72) !important;
+ border-radius: 22px !important;
+ background: rgb(var(--ds-panel-2-rgb)) !important;
+ box-shadow: 0 0 18px rgb(var(--ds-accent-rgb) / .26) !important;
+ backdrop-filter: none !important;
+ }
+}
+
+/* Codex 在输入框后方另设一个深灰色滚动遮罩。保留遮挡滚动文字的渐变,
+ 但让它使用任务页主题底色,避免形成独立的深色圆角底板。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__))
+ div.sticky.bottom-0 [class*="bg-gradient-to-t"][class*="via-token-main-surface-primary"] {
+ background-image: linear-gradient(
+ to top,
+ rgb(var(--ds-bg-rgb)) 0%,
+ rgb(var(--ds-bg-rgb)) 50%,
+ rgb(var(--ds-bg-rgb) / 0) 100%
+ ) !important;
+}
+
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ __DREAM_SELECTOR_SHELL_MAIN__:not(:has(__DREAM_SELECTOR_HOME_ROUTE_CSS__))
+ div.sticky.bottom-0 [class*="pointer-events-none"][class*="bg-gradient-to-t"][class*="from-token-main-surface-primary"] {
+ background-image: linear-gradient(
+ to top,
+ rgb(var(--ds-bg-rgb)) 0%,
+ rgb(var(--ds-bg-rgb) / 0) 100%
+ ) !important;
+}
+
html[data-dream-skin="active"] __DREAM_SELECTOR_HOME_UTILITY__ button,
html[data-dream-skin="active"] __DREAM_SELECTOR_COMPOSER_CHROME__ button:not([class~="bg-token-foreground"]) {
color: var(--ds-muted) !important;
diff --git a/windows/assets/dream-skin.css b/windows/assets/dream-skin.css
index bd112ec0..8c8094ae 100644
--- a/windows/assets/dream-skin.css
+++ b/windows/assets/dream-skin.css
@@ -480,6 +480,15 @@ html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-
content: none;
}
+/* 无任务插画时保持界面安静:保留 Codex 原生标题栏控件,
+ 仅移除 Dream Skin 的任务页装饰文字。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"])) > header.app-header-tint::before,
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"])) > header.app-header-tint::after {
+ content: none;
+}
+
html[data-dream-skin="active"] main.main-surface:not(:has([role="main"])) > :not(header.app-header-tint) {
position: relative;
z-index: 1;
@@ -521,6 +530,13 @@ html[data-dream-skin="active"] main.main-surface:not(:has([role="main"])) articl
backdrop-filter: blur(7px) saturate(105%);
}
+/* 纯色任务页使用居中的粉色柔光,不保留带位移的深色圆角投影。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"])) article {
+ border-color: rgb(var(--ds-accent-rgb) / .36);
+ box-shadow: 0 0 14px rgb(var(--ds-accent-rgb) / .12);
+}
+
html[data-dream-skin="active"][data-dream-shell="light"] main.main-surface:not(:has([role="main"])) article {
background: rgb(var(--ds-panel-rgb) / .72);
}
@@ -670,6 +686,49 @@ html[data-dream-skin="active"]
content: none !important;
}
+/* Codex 26.721+ 已不再保留可用的紧凑 hero 插画卡片。宽图会在下方规则中铺满窗口;
+ 方图和竖图则在首页主表面只绘制一次。用 banner 锚点限定新版 DOM,
+ 避免旧版首页同时在主表面和原生 hero 卡片重复绘图。 */
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ main.main-surface:has([role="main"] .home-banners) {
+ background-color: var(--ds-bg) !important;
+ background-image:
+ linear-gradient(90deg,
+ rgb(var(--ds-bg-rgb) / .62) 0%,
+ rgb(var(--ds-bg-rgb) / .28) 56%,
+ rgb(var(--ds-bg-rgb) / .10) 100%),
+ var(--dream-skin-art) !important;
+ background-position: center, var(--ds-art-position) !important;
+ background-size: 100% 100%, cover !important;
+ background-repeat: no-repeat !important;
+}
+
+/* 新版首页的固定标题栏覆盖在主表面插画之上。方图回退模式下将其透明化,
+ 让背景从窗口内容区顶部连续显示,避免形成深色横带。 */
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ main.main-surface:has([role="main"] .home-banners)
+ > header.app-header-tint {
+ background: transparent !important;
+ border-bottom: 0 !important;
+ box-shadow: none !important;
+ backdrop-filter: none !important;
+}
+
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ main.main-surface:has([role="main"] .home-banners)
+ [class~="app-shell-main-content-top-fade"] {
+ background: transparent !important;
+ opacity: 0 !important;
+}
+
+html[data-dream-skin="active"][data-dream-art-wide="false"]
+ main.main-surface:has([role="main"] .home-banners)::after {
+ color: rgb(255 255 255 / .96) !important;
+ text-shadow:
+ 0 1px 3px rgb(var(--ds-bg-rgb) / .90),
+ 0 0 12px rgb(var(--ds-bg-rgb) / .58) !important;
+}
+
/* Codex 26.721+: this chain (3-6 first-child levels deep) targets the old
compact hero-art card that used to live inside div:first-child's second
level. That level is now the empty .home-banners slot (see #244), so on
@@ -1059,6 +1118,44 @@ html[data-dream-skin="active"][data-dream-shell="light"][data-dream-art-wide="tr
backdrop-filter: blur(8px) saturate(102%) !important;
}
+/* Codex 原生在 Tailwind utilities 层中用 !important 把输入框边框宽度归零。
+ 同层覆写后,主题规则的更高特异性才能真正恢复粉色细描边。 */
+@layer utilities {
+ html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"])) .composer-surface-chrome {
+ border-width: 1px !important;
+ border-style: solid !important;
+ border-color: rgb(var(--ds-accent-rgb) / .72) !important;
+ border-radius: 22px !important;
+ background: rgb(var(--ds-panel-2-rgb)) !important;
+ box-shadow: 0 0 18px rgb(var(--ds-accent-rgb) / .26) !important;
+ backdrop-filter: none !important;
+ }
+}
+
+/* Codex 在输入框后方另设一个深灰色滚动遮罩。保留遮挡滚动文字的渐变,
+ 但让它使用任务页主题底色,避免形成独立的深色圆角底板。 */
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"]))
+ div.sticky.bottom-0 [class*="bg-gradient-to-t"][class*="via-token-main-surface-primary"] {
+ background-image: linear-gradient(
+ to top,
+ rgb(var(--ds-bg-rgb)) 0%,
+ rgb(var(--ds-bg-rgb)) 50%,
+ rgb(var(--ds-bg-rgb) / 0) 100%
+ ) !important;
+}
+
+html[data-dream-skin="active"]:is([data-dream-task-mode="off"], [data-dream-art-task-mode="off"])
+ main.main-surface:not(:has([role="main"]))
+ div.sticky.bottom-0 [class*="pointer-events-none"][class*="bg-gradient-to-t"][class*="from-token-main-surface-primary"] {
+ background-image: linear-gradient(
+ to top,
+ rgb(var(--ds-bg-rgb)) 0%,
+ rgb(var(--ds-bg-rgb) / 0) 100%
+ ) !important;
+}
+
html[data-dream-skin="active"] [class*="_homeUtilityBar_"] button,
html[data-dream-skin="active"] .composer-surface-chrome button:not([class~="bg-token-foreground"]) {
color: var(--ds-muted) !important;
diff --git a/windows/tests/run-tests.ps1 b/windows/tests/run-tests.ps1
index e25cf5b1..56eca7c9 100644
--- a/windows/tests/run-tests.ps1
+++ b/windows/tests/run-tests.ps1
@@ -1141,10 +1141,75 @@ try {
'background-position: var(--ds-art-position)',
'html[data-dream-skin="active"]',
'main.main-surface:has([role="main"])',
+ 'main.main-surface:has([role="main"] .home-banners)',
'main.main-surface:not(:has([role="main"]))'
)) {
if (-not $css.Contains($requiredCss)) { throw "Windows immersive CSS is missing: $requiredCss" }
}
+ $quietTaskChromePattern =
+ '(?s)\[data-dream-task-mode="off"\].*?header\.app-header-tint::before,.*?' +
+ '\[data-dream-task-mode="off"\].*?header\.app-header-tint::after\s*\{\s*content:\s*none;'
+ if (-not [regex]::IsMatch($css, $quietTaskChromePattern)) {
+ throw 'Task mode off no longer removes Dream Skin decorative header labels.'
+ }
+ $quietTaskMessagePattern =
+ '(?s)\[data-dream-task-mode="off"\].*?main\.main-surface:not\(:has\(\[role="main"\]\)\) article\s*\{' +
+ '[^}]*border-color:\s*rgb\(var\(--ds-accent-rgb\) / \.36\);' +
+ '[^}]*box-shadow:\s*0 0 14px rgb\(var\(--ds-accent-rgb\) / \.12\);'
+ if (-not [regex]::IsMatch($css, $quietTaskMessagePattern)) {
+ throw 'Task mode off no longer replaces dark message-card edges with theme colors.'
+ }
+ $quietTaskComposerPattern =
+ '(?s)\[data-dream-task-mode="off"\].*?main\.main-surface:not\(:has\(\[role="main"\]\)\) ' +
+ '\.composer-surface-chrome\s*\{[^}]*border-width:\s*1px !important;' +
+ '[^}]*border-style:\s*solid !important;' +
+ '[^}]*border-color:\s*rgb\(var\(--ds-accent-rgb\) / \.72\) !important;' +
+ '[^}]*border-radius:\s*22px !important;' +
+ '[^}]*background:\s*rgb\(var\(--ds-panel-2-rgb\)\) !important;' +
+ '[^}]*box-shadow:\s*0 0 18px rgb\(var\(--ds-accent-rgb\) / \.26\) !important;' +
+ '[^}]*backdrop-filter:\s*none !important;'
+ if (-not [regex]::IsMatch($css, $quietTaskComposerPattern)) {
+ throw 'Task mode off no longer replaces the dark composer edge with theme colors.'
+ }
+ $quietTaskComposerBackdropPattern =
+ '(?s)\[data-dream-task-mode="off"\].*?div\.sticky\.bottom-0 \[class\*="bg-gradient-to-t"\]' +
+ '\[class\*="via-token-main-surface-primary"\]\s*\{[^}]*' +
+ 'rgb\(var\(--ds-bg-rgb\)\) 0%,[^}]*rgb\(var\(--ds-bg-rgb\)\) 50%,[^}]*' +
+ 'rgb\(var\(--ds-bg-rgb\) / 0\) 100%[^}]*!important;.*?' +
+ 'div\.sticky\.bottom-0 \[class\*="pointer-events-none"\]\[class\*="bg-gradient-to-t"\]' +
+ '\[class\*="from-token-main-surface-primary"\]\s*\{[^}]*' +
+ 'rgb\(var\(--ds-bg-rgb\)\) 0%,[^}]*rgb\(var\(--ds-bg-rgb\) / 0\) 100%[^}]*!important;'
+ if (-not [regex]::IsMatch($css, $quietTaskComposerBackdropPattern)) {
+ throw 'Task mode off no longer recolors the native composer backdrop gradient.'
+ }
+ $squareHomeHeaderPattern =
+ '(?s)\[data-dream-art-wide="false"\].*?' +
+ 'main\.main-surface:has\(\[role="main"\] \.home-banners\)\s*>\s*header\.app-header-tint\s*\{' +
+ '[^}]*background:\s*transparent !important;' +
+ '[^}]*border-bottom:\s*0 !important;' +
+ '[^}]*box-shadow:\s*none !important;' +
+ '[^}]*backdrop-filter:\s*none !important;'
+ if (-not [regex]::IsMatch($css, $squareHomeHeaderPattern)) {
+ throw 'Square-art home mode no longer reveals artwork behind the fixed header.'
+ }
+ $squareHomeTopFadePattern =
+ '(?s)\[data-dream-art-wide="false"\].*?' +
+ 'main\.main-surface:has\(\[role="main"\] \.home-banners\).*?' +
+ '\[class~="app-shell-main-content-top-fade"\]\s*\{' +
+ '[^}]*background:\s*transparent !important;' +
+ '[^}]*opacity:\s*0 !important;'
+ if (-not [regex]::IsMatch($css, $squareHomeTopFadePattern)) {
+ throw 'Square-art home mode no longer suppresses the native dark top-fade band.'
+ }
+ $squareHomeQuotePattern =
+ '(?s)\[data-dream-art-wide="false"\].*?' +
+ 'main\.main-surface:has\(\[role="main"\] \.home-banners\)::after\s*\{' +
+ '[^}]*color:\s*rgb\(255 255 255 / \.96\) !important;' +
+ '[^}]*0 1px 3px rgb\(var\(--ds-bg-rgb\) / \.90\),' +
+ '[^}]*0 0 12px rgb\(var\(--ds-bg-rgb\) / \.58\) !important;'
+ if (-not [regex]::IsMatch($css, $squareHomeQuotePattern)) {
+ throw 'Square-art home mode no longer keeps the decorative quote white and legible.'
+ }
if ($css.Contains('home-suggestion-list-item') -or
$css.Contains('.dream-skin-home') -or $css.Contains('.dream-home') -or
$css.Contains('.dream-task') -or $css.Contains('codex-dream-skin-chrome')) {