diff --git a/ASSET_LICENSES.md b/ASSET_LICENSES.md index ef7b9ad..99c34de 100644 --- a/ASSET_LICENSES.md +++ b/ASSET_LICENSES.md @@ -9,6 +9,7 @@ under Creative Commons Attribution 4.0 International (CC BY 4.0). | Nocturne Studio background | Generated specifically for this project, 2026-07-16 | 1600×1000 | CC BY 4.0 | | Quiet Garden background | Generated specifically for this project, 2026-07-16 | 1600×1000 | CC BY 4.0 | | Gilded Grandeur background | Generated specifically for this project with the built-in image generation workflow, 2026-07-17 | 1586×992 | CC BY 4.0 | +| Caishen Readable background | Public-safe original Caishen Readable artwork from ChannelerH/codex-skin-packs; no private Codex screenshot or workspace data, 2026-07-22 | 1915×821 | CC BY 4.0 | | Merry Big Top background | Generated specifically for this project with the built-in image generation workflow, 2026-07-17 | 1586×992 | CC BY 4.0 | | Moss chameleon calibrated direction atlas | Generated specifically for this project; non-linear direction calibration, shared cropping, chroma-key removal, and exact-alpha WebP encoding, 2026-07-16 | 181 frames across 4 pages | CC BY 4.0 | | Pico parrot calibrated direction atlas | Generated specifically for this project; natural pose frames retained, background and watermark excluded, 2026-07-17 | 189 frames across 4 pages | CC BY 4.0 | diff --git a/apps/desktop/public/themes/caishen-readable/assets/caishen-readable.png b/apps/desktop/public/themes/caishen-readable/assets/caishen-readable.png new file mode 100644 index 0000000..5d4b78a Binary files /dev/null and b/apps/desktop/public/themes/caishen-readable/assets/caishen-readable.png differ diff --git a/apps/desktop/public/themes/caishen-readable/previews/caishen-readable.png b/apps/desktop/public/themes/caishen-readable/previews/caishen-readable.png new file mode 100644 index 0000000..5d4b78a Binary files /dev/null and b/apps/desktop/public/themes/caishen-readable/previews/caishen-readable.png differ diff --git a/packages/theme-core/src/builtins.ts b/packages/theme-core/src/builtins.ts index 295ac1a..fb6d3fd 100644 --- a/packages/theme-core/src/builtins.ts +++ b/packages/theme-core/src/builtins.ts @@ -881,9 +881,185 @@ export const merryBigTop: ThemeDefinition = { }, }; +export const caishenReadable: ThemeDefinition = { + format: THEME_FORMAT, + id: "codex-styler.caishen-readable", + version: "1.0.0", + metadata: { + name: "Caishen Readable", + description: + "A bright fortune-desk workspace tuned for readable Codex surfaces.", + author: "ChannelerH", + license: "CC-BY-4.0", + tags: ["fortune", "light", "image", "warm", "readable"], + homepage: + "https://codex-theme-gallery.howardhua.chatgpt.site/themes/caishen-readable?utm_source=xuhuanstudio-codex-styler&utm_medium=github-pr&utm_campaign=caishen-readable", + preview: "previews/caishen-readable.png", + }, + compatibility: { + styler: { minimumVersion: "0.1.0" }, + codex: { + mode: "semantic", + testedVersions: ["26.707.72221", "26.707.91948"], + }, + }, + variants: { + light: { + ...detailedVariant( + variant( + "#f7eadc", + "#fff9ef", + "#241d17", + "#6d5a4b", + "#ddc8af", + "#c15a2a", + "#fff1dc", + 0.2, + 0.86, + { + layout: "immersive", + iconStyle: "themed", + decorations: "subtle", + }, + ), + { + canvas: "#f7eadc", + surfaceRaised: "#fffaf1", + surfaceOverlay: "#f6e4cc", + surfaceSunken: "#efd5ba", + control: "#f5dfc6", + controlHover: "#edcfaf", + controlActive: "#e2bd99", + textTertiary: "#826b58", + onAccent: "#fff8ee", + borderSubtle: "#e4cbb1", + borderStrong: "#a97651", + focus: "#c15a2a", + success: "#2f7047", + warning: "#8b5a0d", + danger: "#a33f34", + info: "#2d6689", + added: "#2f7047", + modified: "#8b5a0d", + deleted: "#a33f34", + }, + { intensity: 0.34, parallax: 6, targetFps: 30 }, + 16, + ), + background: { + color: "#f7eadc", + image: "assets/caishen-readable.png", + position: { x: 74, y: 50 }, + brightness: 1.08, + blur: 0, + overlay: "#fff1dc", + overlayOpacity: 0.2, + }, + }, + dark: { + ...detailedVariant( + variant( + "#1a120d", + "#251b15", + "#fff0dc", + "#d2bda8", + "#5f4535", + "#f0a24f", + "#120c08", + 0.48, + 0.76, + { + layout: "immersive", + iconStyle: "themed", + decorations: "subtle", + }, + ), + { + canvas: "#1a120d", + surfaceRaised: "#302219", + surfaceOverlay: "#39291e", + surfaceSunken: "#160f0b", + control: "#34261d", + controlHover: "#443126", + controlActive: "#553d2d", + textTertiary: "#b99b82", + onAccent: "#2b1608", + borderSubtle: "#4c382b", + borderStrong: "#93684b", + focus: "#f0a24f", + success: "#78c991", + warning: "#e4b661", + danger: "#e77c73", + info: "#83b9df", + added: "#78c991", + modified: "#e4b661", + deleted: "#e77c73", + }, + { intensity: 0.38, parallax: 7, targetFps: 30 }, + 16, + ), + background: { + color: "#1a120d", + image: "assets/caishen-readable.png", + position: { x: 74, y: 50 }, + brightness: 0.78, + blur: 0, + overlay: "#120c08", + overlayOpacity: 0.48, + }, + }, + }, + scene: { + layers: [ + { + id: "caishen-readable-background", + type: "image", + asset: "assets/caishen-readable.png", + opacity: 1, + blendMode: "normal", + parallax: 7, + }, + { + id: "caishen-readable-vignette", + type: "vignette", + opacity: 0.2, + blendMode: "multiply", + parallax: 0, + }, + ], + entities: [], + }, + assets: [ + { + id: "caishen-readable-background", + path: "assets/caishen-readable.png", + type: "background", + license: "CC-BY-4.0", + }, + { + id: "caishen-readable-preview", + path: "previews/caishen-readable.png", + type: "preview", + license: "CC-BY-4.0", + }, + ], + locales: { + en: { + name: "Caishen Readable", + description: + "A warm Caishen desk scene with light surfaces kept readable for work.", + }, + "zh-CN": { + name: "财神清爽可读", + description: "暖色财神桌面场景,保留浅色高可读工作区表面。", + }, + }, +}; + export const builtinThemes = [ nativeRefined, gildedGrandeur, + caishenReadable, merryBigTop, nocturneStudio, quietGarden, diff --git a/packages/theme-core/src/companions.ts b/packages/theme-core/src/companions.ts index d33fe60..e09c645 100644 --- a/packages/theme-core/src/companions.ts +++ b/packages/theme-core/src/companions.ts @@ -173,6 +173,7 @@ export const mossCompanion = calibratedCompanion({ size: 136, defaultThemeIds: [ "codex-styler.native-refined", + "codex-styler.caishen-readable", "codex-styler.nocturne-studio", "codex-styler.quiet-garden", ], diff --git a/packages/theme-core/tests/validation.test.ts b/packages/theme-core/tests/validation.test.ts index 1e5819d..bef77ce 100644 --- a/packages/theme-core/tests/validation.test.ts +++ b/packages/theme-core/tests/validation.test.ts @@ -31,7 +31,14 @@ describe("built-in themes", () => { it("declares replaceable shell treatments instead of hard-coded theme ids", () => { expect( builtinThemes.map((theme) => theme.variants.dark.appearance.layout), - ).toEqual(["native", "editorial", "immersive", "editorial", "immersive"]); + ).toEqual([ + "native", + "editorial", + "immersive", + "immersive", + "editorial", + "immersive", + ]); expect( builtinThemes.every( (theme) => theme.variants.dark.appearance.iconStyle !== undefined, @@ -126,6 +133,7 @@ describe("built-in themes", () => { ).toEqual([ "moss-gecko", "reset-god", + "moss-gecko", "token-thief", "moss-gecko", "moss-gecko",