Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions macos/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 1.5.6 — 2026-07-26

### 修复

- 移除覆盖原生标题栏与首页输入区域的绝对定位主题标语,让窗口、导航、分享与设置控件继续使用原生布局和点击区域。
- 宽幅任务背景继续只绘制在底层画布,主阅读平面改用 240–320px 连续羽化遮罩,不再用硬编码 64% 分段形成左右拼接感。
- 输入框恢复完整的一像素边界和独立 surface,并清除会截断其表面的容器裁切、mask 与宽幅模式 `border: 0` 覆盖。

## 1.5.5 — 2026-07-25

### 修复
Expand Down
2 changes: 1 addition & 1 deletion macos/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.5.5
1.5.6
128 changes: 54 additions & 74 deletions macos/assets/dream-skin.css
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,16 @@
--ds-task-immersive-edge: rgb(var(--ds-bg-rgb) / .82);
--ds-task-immersive-mid: rgb(var(--ds-bg-rgb) / .74);
--ds-task-immersive-far: rgb(var(--ds-bg-rgb) / .60);
/* Wide task routes remain one continuous canvas: artwork stays on the body,
while this veil feathers the reading plane into the atmospheric edge. */
--ambient-start: 52%;
--ambient-feather: clamp(240px, 24vw, 320px);
--composer-surface: rgb(var(--ds-panel-rgb) / .94);
--reading-veil: linear-gradient(90deg,
rgb(var(--ds-panel-rgb) / .96) 0%,
rgb(var(--ds-panel-rgb) / .96) var(--ambient-start),
rgb(var(--ds-panel-rgb) / .12) calc(var(--ambient-start) + var(--ambient-feather)),
rgb(var(--ds-panel-rgb) / .06) 100%);
}

html[data-dream-skin="active"][data-dream-shell="light"] {
Expand Down Expand Up @@ -411,10 +421,11 @@ html[data-dream-skin="active"]:is([data-dream-task-mode="ambient"], [data-dream-

html[data-dream-skin="active"]:is([data-dream-task-mode="ambient"], [data-dream-art-task-mode="ambient"], [data-dream-task-mode="banner"], [data-dream-art-task-mode="banner"])[data-dream-art-wide="true"]:has(main.main-surface):not(:has(main.main-surface [role="main"]))
main.main-surface:not(:has([role="main"])) {
background: linear-gradient(90deg,
var(--ds-task-immersive-edge),
var(--ds-task-immersive-mid) 64%,
var(--ds-task-immersive-far)) !important;
overflow: visible !important;
clip-path: none !important;
-webkit-mask-image: none !important;
mask-image: none !important;
background: var(--reading-veil) !important;
border: 0 !important;
border-radius: 0 !important;
box-shadow: none !important;
Expand All @@ -427,13 +438,12 @@ html[data-dream-skin="active"]:is([data-dream-task-mode="ambient"], [data-dream-

html[data-dream-skin="active"]:is([data-dream-task-mode="ambient"], [data-dream-art-task-mode="ambient"], [data-dream-task-mode="banner"], [data-dream-art-task-mode="banner"])[data-dream-art-wide="true"]:has(main.main-surface):not(:has(main.main-surface [role="main"]))
.composer-surface-chrome {
background: var(--ds-immersive-composer-solid) !important;
border: 0 !important;
background: var(--composer-surface) !important;
border: 1px solid var(--ds-line) !important;
box-shadow:
0 10px 30px rgb(var(--ds-bg-rgb) / .20),
inset 0 0 0 1px var(--ds-immersive-line),
inset 0 1px rgb(var(--ds-text-rgb) / .12) !important;
backdrop-filter: none !important;
backdrop-filter: blur(18px) saturate(108%) !important;
}

html[data-dream-skin="active"]:is([data-dream-task-mode="ambient"], [data-dream-art-task-mode="ambient"], [data-dream-task-mode="banner"], [data-dream-art-task-mode="banner"])[data-dream-art-wide="true"]:has(main.main-surface):not(:has(main.main-surface [role="main"]))
Expand Down Expand Up @@ -532,70 +542,24 @@ html[data-dream-skin="active"][data-dream-shell="light"] [role="main"]:has([data
}

html[data-dream-skin="active"] main.main-surface > header.app-header-tint {
/* Preserve Codex's native fixed header geometry and side-panel controls. */
background: rgb(var(--ds-panel-rgb) / .90) !important;
border-bottom: 1px solid var(--ds-line) !important;
backdrop-filter: blur(14px) saturate(108%) !important;
/* Preserve the native flex layout, baselines and hit targets without
drawing a theme divider across the titlebar. */
background: var(--composer-surface) !important;
border: 0 !important;
box-shadow: none !important;
backdrop-filter: none !important;
}

/* Decorative chrome lives on the native shell; no injected positioning host is needed. */
/* Native titlebar controls own the complete toolbar grid and hit targets.
Theme identity stays in the artwork and palette, never positioned labels. */
html[data-dream-skin="active"]
main.main-surface:not(:has([role="main"])) > header.app-header-tint::before {
content: var(--dream-skin-name, "Codex Dream Skin") " · "
var(--dream-skin-brand-subtitle, "CODEX DREAM SKIN");
position: absolute;
left: 22px;
top: 4px;
z-index: 2;
max-width: min(42%, 360px);
overflow: hidden;
color: var(--ds-accent);
font: 800 11px/1.3 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
letter-spacing: .03em;
text-overflow: ellipsis;
text-shadow: 0 1px 12px rgb(var(--ds-bg-rgb) / .32);
white-space: nowrap;
pointer-events: none;
}

main.main-surface:not(:has([role="main"])) > header.app-header-tint::before,
html[data-dream-skin="active"]
main.main-surface:not(:has([role="main"])) > header.app-header-tint::after {
content: var(--dream-skin-status, "DREAM SKIN ONLINE");
position: absolute;
right: 84px;
top: 13px;
z-index: 2;
max-width: 28%;
overflow: hidden;
color: var(--ds-muted);
font: 700 9px/1.2 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
letter-spacing: .08em;
text-overflow: ellipsis;
text-shadow: 0 1px 10px rgb(var(--ds-bg-rgb) / .32);
white-space: nowrap;
pointer-events: none;
}

main.main-surface:not(:has([role="main"])) > header.app-header-tint::after,
html[data-dream-skin="active"]
main.main-surface:has([role="main"])::after {
content: var(--dream-skin-quote, "MAKE SOMETHING WONDERFUL");
position: absolute;
right: 28px;
bottom: 72px;
z-index: 2;
pointer-events: none;
color: rgb(var(--ds-accent-rgb) / .74);
font: italic 14px/1.2 "Segoe Print", "Comic Sans MS", cursive;
letter-spacing: 0;
text-shadow: 0 0 13px rgb(var(--ds-accent-rgb) / .30);
transform: rotate(-3deg);
}

html[data-dream-skin="active"][data-dream-shell="light"]
main.main-surface:not(:has([role="main"])) > header.app-header-tint::before,
html[data-dream-skin="active"][data-dream-shell="light"]
main.main-surface:not(:has([role="main"])) > header.app-header-tint::after {
text-shadow: none;
content: none !important;
display: none !important;
}

/* Windows keeps this native bar outside main; macOS simply has no match. */
Expand Down Expand Up @@ -889,15 +853,32 @@ html[data-dream-skin="active"] [role="main"]:has([data-testid="home-icon"]) .gro
html[data-dream-skin="active"] [role="main"]:has([data-testid="home-icon"]) .group\/home-suggestions button > span:last-child { align-items: center !important; text-align: center !important; }

html[data-dream-skin="active"] .composer-surface-chrome {
position: relative !important;
isolation: isolate !important;
z-index: 4 !important;
overflow: visible !important;
border: 1px solid rgb(var(--ds-muted-rgb) / .18) !important;
clip-path: none !important;
-webkit-mask-image: none !important;
mask-image: none !important;
background-clip: padding-box !important;
border: 1px solid var(--ds-line) !important;
border-radius: 22px !important;
background: rgb(var(--ds-panel-rgb) / .94) !important;
background: var(--composer-surface) !important;
box-shadow: 0 10px 28px rgb(var(--ds-bg-rgb) / .24) !important;
backdrop-filter: blur(16px) saturate(108%) !important;
backdrop-filter: blur(18px) saturate(108%) !important;
}

html[data-dream-skin="active"] .composer-surface-chrome::before { content: none !important; }
/* Keep a complete one-pixel boundary even when the native cascade zeroes the
composer's own border width. This layer never participates in input. */
html[data-dream-skin="active"] .composer-surface-chrome::before {
content: "" !important;
position: absolute !important;
inset: 0 !important;
z-index: 2 !important;
border: 1px solid var(--ds-line) !important;
border-radius: inherit !important;
pointer-events: none !important;
}

/* A wide image can carry the home screen too. The native hero remains live,
but the artwork is painted once on the window instead of repeated in a card. */
Expand Down Expand Up @@ -980,13 +961,12 @@ html[data-dream-skin="active"][data-dream-art-wide="true"] main.main-surface:has
}

html[data-dream-skin="active"][data-dream-art-wide="true"] .composer-surface-chrome {
background: var(--ds-immersive-composer-solid) !important;
border: 0 !important;
background: var(--composer-surface) !important;
border: 1px solid var(--ds-line) !important;
box-shadow:
0 10px 30px rgb(var(--ds-bg-rgb) / .20),
inset 0 0 0 1px var(--ds-immersive-line),
inset 0 1px rgb(var(--ds-text-rgb) / .12) !important;
backdrop-filter: none !important;
backdrop-filter: blur(18px) saturate(108%) !important;
}

html[data-dream-skin="active"][data-dream-shell="light"][data-dream-art-wide="true"]
Expand Down
8 changes: 3 additions & 5 deletions macos/assets/renderer-inject.js
Original file line number Diff line number Diff line change
Expand Up @@ -311,11 +311,9 @@
}
setStyleProperty(root, "--dream-skin-name", cssString(THEME.name || "Codex Dream Skin"));
setStyleProperty(root, "--dream-skin-tagline", cssString(THEME.tagline || "Make something wonderful."));
setStyleProperty(root, "--dream-skin-quote", cssString(THEME.quote || "MAKE SOMETHING WONDERFUL"));
setStyleProperty(root, "--dream-skin-brand-subtitle", cssString(
THEME.brandSubtitle || "CODEX DREAM SKIN",
));
setStyleProperty(root, "--dream-skin-status", cssString(THEME.statusText || "DREAM SKIN ONLINE"));
// Header and lower-chrome slogans were retired because they compete with
// native toolbar controls and the composer. Their old variable names stay
// in THEME_VARIABLES so reinjection removes values from earlier versions.
setStyleProperty(root, "--dream-skin-project-prefix", cssString(THEME.projectPrefix || "选择项目 · "));
setStyleProperty(root, "--dream-skin-project-label", cssString(THEME.projectLabel || "◉ 选择项目"));
};
Expand Down
2 changes: 1 addition & 1 deletion macos/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "codex-dream-skin-studio",
"version": "1.5.5",
"version": "1.5.6",
"private": true,
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion macos/scripts/common-macos.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ CODEX_APP_JOB_LABEL="com.openai.codex-dream-skin-studio.app"
INJECTOR_JOB_LABEL="com.openai.codex-dream-skin-studio.injector"
EXPECTED_CODEX_TEAM_ID="2DC432GLL2"
EXPECTED_CODEX_REQUIREMENT="anchor apple generic and certificate leaf[subject.OU] = \"$EXPECTED_CODEX_TEAM_ID\""
SKIN_VERSION="1.5.5"
SKIN_VERSION="1.5.6"
DREAM_SKIN_VALIDATED_RUNTIME_PID=""
DREAM_SKIN_VALIDATED_RUNTIME_BUNDLE=""
DREAM_SKIN_VALIDATED_RUNTIME_EXE=""
Expand Down
2 changes: 1 addition & 1 deletion macos/scripts/injector.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ const stableTestidLiteral = (testid) => {
}
return JSON.stringify(`[data-testid="${testid}"]`);
};
const SKIN_VERSION = "1.5.5";
const SKIN_VERSION = "1.5.6";
const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "[::1]"]);
const CDP_ID_PATTERN = /^[A-Za-z0-9._-]{1,200}$/;
const MAX_ART_BYTES = 10 * 1024 * 1024;
Expand Down
4 changes: 2 additions & 2 deletions macos/tests/run-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ UPDATE_JSON="$({
})"
"$NODE" -e '
const value = JSON.parse(process.argv[1]);
if (value.currentVersion !== "v1.5.5" || value.latestVersion !== "v9.8.7") process.exit(1);
if (value.currentVersion !== "v1.5.6" || value.latestVersion !== "v9.8.7") process.exit(1);
if (!value.updateAvailable) process.exit(1);
if (value.releaseUrl !== "https://github.com/Fei-Away/Codex-Dream-Skin/releases/latest") process.exit(1);
' "$UPDATE_JSON"
Expand Down Expand Up @@ -1063,7 +1063,7 @@ CRLF_BACKUP="$TMP/config-crlf-backup.json"
"$NODE" "$ROOT/scripts/theme-config.mjs" restore "$CRLF_CONFIG" "$CRLF_BACKUP" >/dev/null
/usr/bin/cmp -s "$CRLF_CONFIG" "$TMP/original-crlf.toml"

/usr/bin/env -u HOME /bin/bash -c '. "$1/scripts/common-macos.sh"; [ -n "$HOME" ] && [ "$SKIN_VERSION" = "1.5.5" ]' _ "$ROOT"
/usr/bin/env -u HOME /bin/bash -c '. "$1/scripts/common-macos.sh"; [ -n "$HOME" ] && [ "$SKIN_VERSION" = "1.5.6" ]' _ "$ROOT"
if [ "${CODEX_DREAM_SKIN_SKIP_DOCTOR:-0}" = "1" ]; then
printf 'SKIP: Doctor requires an installed, signed Codex app.\n'
DOCTOR_RESULT="skipped"
Expand Down
Loading