为 @bachi/pi-coder 定制的五套暗色 PI 主题:调色板分别取自
catppuccin mocha、ayu dark、Codex CLI 内置的 1337,以及在 1337 灰底上重定主色的
coffee(暖调奶金)与 nightfox(Nordfox 雾蓝)。面向 mac retina 屏微调。
色值逐字取自 clients/pi/themes/ 下五个 pi-coder-*.json(colors 里的变量引用已解析成实际 hex),
点任意色块复制其十六进制值。下面点一套皮肤看它的完整色板,再往下是 着色演示。
在官方 Catppuccin Mocha 基础上面向 retina 屏做了大量微调,三档深底(crust #11111B / mantle #181825 / selected #1E1E29)撑起层次。唯一一处"越界"是强调色:用的是 Macchiato 的 lavender #B7BDF8(重命名为 macchiatoLavender),而不是 Mocha 自己的 mauve —— mauve 被降级去当工具标题与关键字。
// pi-coder-catppuccin · syntax sampler import { Skin } from "./theme.js"; const palette = await load("pi-coder-catppuccin"); export default class Theme extends Skin { levels = [0, 25, 50, 75, 100]; // 思考强度阶梯 mix(a, b) { return a.map((v, i) => (v + b[i]) / 2); } }
文件 themes/pi-coder-catppuccin.json · error 用 maroon 而非 red;syntaxFunction 用 sky 而非 blue;text 与 syntaxVariable 是空串(终端默认色),取样里用调色板的 text 近似显示。
Ayu Dark 的暖金 + 橙 + 青三原色,底色压到 #0D1017(比官方 ayu dark 更沉一档)。强调色取 #E6B450 的琥珀金,函数名单独取更亮的 function #FFB454,字符串不用官方 green 而用降饱和的 stringGreen #67A567 —— 大面积代码里不刺眼。
// pi-coder-ayu · syntax sampler import { Skin } from "./theme.js"; const palette = await load("pi-coder-ayu"); export default class Theme extends Skin { levels = [0, 25, 50, 75, 100]; // 思考强度阶梯 mix(a, b) { return a.map((v, i) => (v + b[i]) / 2); } }
文件 themes/pi-coder-ayu.json · 五个槽位(text / toolOutput / mdCodeBlock / syntaxVariable / customMessageText)都指向同一个 fg #BFBDB6,而用户消息字单独取更亮的 textColor #DBDBDD。
Codex CLI 内置的 1337 主题:纯中性灰底 #191919,主色是 funcBlue #8CDAFF 的冰蓝,关键字用 #FF5E5E 的珊瑚红。它是另外两套(coffee / nightfox)的**结构基准** —— 那两套的次要槽位逐字节照搬这里。
// pi-coder-1337 · syntax sampler import { Skin } from "./theme.js"; const palette = await load("pi-coder-1337"); export default class Theme extends Skin { levels = [0, 25, 50, 75, 100]; // 思考强度阶梯 mix(a, b) { return a.map((v, i) => (v + b[i]) / 2); } }
文件 themes/pi-coder-1337.json · syntaxPunctuation 用纯白 #FFFFFF(全页最亮的一格);accent / toolTitle / syntaxFunction / syntaxType 四者同值但各取独立变量,便于日后单独调。
1337 的灰底上换了一整套**暖调**主色(cf* 前缀变量):强调色是 cfGold #FAD07A 的奶金,字符串用 cfOlive #99AD6A 的橄榄绿,标点用 cfSalmon #CF6A4C 的鲑红,运算符是 cfOperator #FFFA96 的柠檬黄。边框也换了 —— cfPanelTeal #395956 的墨绿,不再是中性灰。
// pi-coder-coffee · syntax sampler import { Skin } from "./theme.js"; const palette = await load("pi-coder-coffee"); export default class Theme extends Skin { levels = [0, 25, 50, 75, 100]; // 思考强度阶梯 mix(a, b) { return a.map((v, i) => (v + b[i]) / 2); } }
文件 themes/pi-coder-coffee.json · 语法九格全部走 cf* 新变量(一个都没沿用 1337 的),但 diff / 思考档 / 消息块底色仍照搬 1337 —— 符合「主色重定、次要 follow 1337」的规则。
取自 Nightfox 系的 Nordfox 配色(nf* 前缀变量):强调色 nfAccent #86ABDC 的雾蓝,成功 #81B29A、错误 #C94F6D、警告 #DBC074,关键字是 #9D79D6 的紫。同样挂在 1337 的灰底上,所以三套灰底皮肤可以直接对比主色差异。
// pi-coder-nightfox · syntax sampler import { Skin } from "./theme.js"; const palette = await load("pi-coder-nightfox"); export default class Theme extends Skin { levels = [0, 25, 50, 75, 100]; // 思考强度阶梯 mix(a, b) { return a.map((v, i) => (v + b[i]) / 2); } }
文件 themes/pi-coder-nightfox.json · border 单独取 nfBorder #39506D(比 1337 的中性灰偏蓝),selectedBg 取 nfSelectedBg #3C5372 —— 选中行是全套里唯一明显偏蓝的底色。
取自一次真实会话:上半是聊天区(用户消息 / 思考 / 工具调用 / diff / Markdown 回复),下半是 pi 的任务清单、输入框与 statusline 两行。
点下面的按钮换皮肤 —— 所有颜色都由当前皮肤的槽位驱动(终端底色取该皮肤的 export.pageBg 与主底色)。
输入框右上那一格是 working-indicator 的提示词摘要(✦ 用 accent、正文用 muted),
这里演示的正是「延续短语」形态:上一轮任务是「把 server.js 切到 HTTPS」,这一轮只敲了「继续」,摘要于是融合成一句完整语义。
server.js 已从 HTTP 切到 HTTPS,其余逻辑(/api/ 反代、MIME、目录穿越防护)未动。
server.js:新增 TLS_OPTIONS 加载 cert/abc.com+5.pem / cert/abc.com+5-key.pem,入口改为 https.createServer(TLS_OPTIONS, handleRequest)。CLAUDE.md:更新启动命令注释、协议说明和文件表里 server.js / cert/ 两行。其他三份实现(Go / Rust / Python)仍是 HTTP,未改 —— 详见 README。
输入框上方那行是 simple-task 的任务清单(已完成的 ✔ 用 success、正文用 dim 加删除线),下面依次是
pi 的输入框(边框与 ❯ 取当前思考档的颜色,这里是 max → 本主题的 thinkingMax;左上一段是工作指示器嵌在边框里的样子,
行尾 ✦ 后是提示词摘要)与 statusline 两行:⚡️ 模型/档位 | Ctx 百分比 | 分支 | (+增,-删) | 状态,
第二行是所有扩展 setStatus 的文本(任务计数、cwd)。分支图标用的是 ⎇(U+2387,通用符号区,没装 Nerd Font 的机器也能正常显示)。