墨观Inkstone

墨观 Inkstone

A code palette grown from 526 traditional Chinese colors. Six variants share one hue skeleton, so switching feels like the same painting under a different light.

  • VS Code
  • Cursor
  • Windsurf
  • VSCodium
  • Ghostty
  • Kaku / WezTerm
  • OpenCode
inkstone · theme.ts
◫ ⌕ ⑂ ▷ ◈
theme.ts ×
palette.ts
kaku.lua
1// 墨观 Inkstone · 把传统色写进代码
2import { named } from "./palette";
3
4interface Ink {
5 name: string;
6 hex: `#${string}`;
7}
8
9const 墨色: Ink = {
10 name: "玄墨", hex: "#14131a",
11};
12
13/** 计算 WCAG 对比度 */
14export function contrast(a: Ink, b: Ink): number {
15 const lum = (c: Ink) => {
16 const [r, g, b] = [0, 1, 2].map((i) => channel(c.hex, i));
17 return 0.2126 * r + 0.7152 * g + 0.0722 * b;
18 };
19 const [hi, lo] = [lum(a), lum(b)].sort((x, y) => y - x);
20 return (hi + 0.05) / (lo + 0.05);
21}
22
main*|0 errors|1 warning TypeScript|墨观 · 玄墨|UTF-8
inkstone · theme.ts
◫ ⌕ ⑂ ▷ ◈
theme.ts ×
palette.ts
kaku.lua
1// 墨观 Inkstone · 把传统色写进代码
2import { named } from "./palette";
3
4interface Ink {
5 name: string;
6 hex: `#${string}`;
7}
8
9const 墨色: Ink = {
10 name: "玄墨", hex: "#19181e",
11};
12
13/** 计算 WCAG 对比度 */
14export function contrast(a: Ink, b: Ink): number {
15 const lum = (c: Ink) => {
16 const [r, g, b] = [0, 1, 2].map((i) => channel(c.hex, i));
17 return 0.2126 * r + 0.7152 * g + 0.0722 * b;
18 };
19 const [hi, lo] = [lum(a), lum(b)].sort((x, y) => y - x);
20 return (hi + 0.05) / (lo + 0.05);
21}
22
main*|0 errors|1 warning TypeScript|墨观 · 玄墨|UTF-8
inkstone · theme.ts
◫ ⌕ ⑂ ▷ ◈
theme.ts ×
palette.ts
kaku.lua
1// 墨观 Inkstone · 把传统色写进代码
2import { named } from "./palette";
3
4interface Ink {
5 name: string;
6 hex: `#${string}`;
7}
8
9const 墨色: Ink = {
10 name: "宣纸", hex: "#f7f4ed",
11};
12
13/** 计算 WCAG 对比度 */
14export function contrast(a: Ink, b: Ink): number {
15 const lum = (c: Ink) => {
16 const [r, g, b] = [0, 1, 2].map((i) => channel(c.hex, i));
17 return 0.2126 * r + 0.7152 * g + 0.0722 * b;
18 };
19 const [hi, lo] = [lum(a), lum(b)].sort((x, y) => y - x);
20 return (hi + 0.05) / (lo + 0.05);
21}
22
main*|0 errors|1 warning TypeScript|墨观 · 宣纸|UTF-8
inkstone · theme.ts
◫ ⌕ ⑂ ▷ ◈
theme.ts ×
palette.ts
kaku.lua
1// 墨观 Inkstone · 把传统色写进代码
2import { named } from "./palette";
3
4interface Ink {
5 name: string;
6 hex: `#${string}`;
7}
8
9const 墨色: Ink = {
10 name: "宣纸", hex: "#e9e2d4",
11};
12
13/** 计算 WCAG 对比度 */
14export function contrast(a: Ink, b: Ink): number {
15 const lum = (c: Ink) => {
16 const [r, g, b] = [0, 1, 2].map((i) => channel(c.hex, i));
17 return 0.2126 * r + 0.7152 * g + 0.0722 * b;
18 };
19 const [hi, lo] = [lum(a), lum(b)].sort((x, y) => y - x);
20 return (hi + 0.05) / (lo + 0.05);
21}
22
main*|0 errors|1 warning TypeScript|墨观 · 宣纸|UTF-8
inkstone · theme.ts
◫ ⌕ ⑂ ▷ ◈
theme.ts ×
palette.ts
kaku.lua
1// 墨观 Inkstone · 把传统色写进代码
2import { named } from "./palette";
3
4interface Ink {
5 name: string;
6 hex: `#${string}`;
7}
8
9const 墨色: Ink = {
10 name: "沧海", hex: "#0d1822",
11};
12
13/** 计算 WCAG 对比度 */
14export function contrast(a: Ink, b: Ink): number {
15 const lum = (c: Ink) => {
16 const [r, g, b] = [0, 1, 2].map((i) => channel(c.hex, i));
17 return 0.2126 * r + 0.7152 * g + 0.0722 * b;
18 };
19 const [hi, lo] = [lum(a), lum(b)].sort((x, y) => y - x);
20 return (hi + 0.05) / (lo + 0.05);
21}
22
main*|0 errors|1 warning TypeScript|墨观 · 沧海|UTF-8
inkstone · theme.ts
◫ ⌕ ⑂ ▷ ◈
theme.ts ×
palette.ts
kaku.lua
1// 墨观 Inkstone · 把传统色写进代码
2import { named } from "./palette";
3
4interface Ink {
5 name: string;
6 hex: `#${string}`;
7}
8
9const 墨色: Ink = {
10 name: "青瓷", hex: "#e8f0ec",
11};
12
13/** 计算 WCAG 对比度 */
14export function contrast(a: Ink, b: Ink): number {
15 const lum = (c: Ink) => {
16 const [r, g, b] = [0, 1, 2].map((i) => channel(c.hex, i));
17 return 0.2126 * r + 0.7152 * g + 0.0722 * b;
18 };
19 const [hi, lo] = [lum(a), lum(b)].sort((x, y) => y - x);
20 return (hi + 0.05) / (lo + 0.05);
21}
22
main*|0 errors|1 warning TypeScript|墨观 · 青瓷|UTF-8

All six palettes draw from the same traditional Chinese chart. Ink & paper sit on paper and soot; sea & celadon sit on deep water and glaze. Dimmed turns the lights down — it never puts a gray filter over the ink.

Xuanmo

Color idea

Pine-soot ink underfoot, cinnabar for annotations. The dark canvas gives the brightness back to your code, and red is kept for what needs to be seen — built for long nights.

Aa
画布派生色
#14131acanvas
Aa
面板派生色
#1a1922panel
Aa
浮起派生色
#22212craised
Aa
浮层派生色
#2b2a36overlay
Aa
边框派生色
#343240border
Aa
正文派生色
#d4cec411.80:1
Aa
次要文字派生色
#ada5997.57:1
Aa
弱化文字派生色
#8b85975.19:1
Aa
光标羽扇豆蓝
#619ac36.08:1
Aa
关键字海棠红 · 降彩
#da57614.85:1
Aa
函数羽扇豆蓝
#619ac36.08:1
Aa
字符串铜绿
#2bae856.59:1
Aa
数字杏黄
#f28e167.61:1
Aa
类型土黄
#d6a01d7.83:1
Aa
常量杏黄
#f28e167.61:1
Aa
注释派生色
#85809e4.90:1
Aa
装饰器萝兰紫
#c08eaf6.79:1
Aa
标签山茶红 · 降彩
#e45f6f5.42:1
Aa
错误银朱 · 降彩
#e257374.97:1

Xuanmo Dimmed

Color idea

The same ink with the lights turned down. A deeper canvas, ink that never turns gray, and pigments that give up half a step of saturation — for softer rooms.

Aa
画布派生色
#19181ecanvas
Aa
面板派生色
#1e1d24panel
Aa
浮起派生色
#24222braised
Aa
浮层派生色
#2b2933overlay
Aa
边框派生色
#393643border
Aa
正文派生色
#d8d2c611.72:1
Aa
次要文字派生色
#b0a99f7.58:1
Aa
弱化文字派生色
#8f89965.20:1
Aa
光标羽扇豆蓝
#619ac35.81:1
Aa
关键字山黎豆红
#c27c885.49:1
Aa
函数涧石蓝
#66a9c96.79:1
Aa
字符串梧枝绿
#69a7946.35:1
Aa
数字山鸡黄
#b78b265.66:1
Aa
类型土黄
#d6a01d7.48:1
Aa
常量土黄
#d6a01d7.48:1
Aa
注释派生色
#85809e4.69:1
Aa
装饰器萝兰紫
#c08eaf6.49:1
Aa
标签白芨红
#de78976.08:1
Aa
错误银朱 · 降彩
#e257374.75:1

Xuanzhi

Color idea

Raw xuan paper, pine-soot ink, mineral washes. Warm paper, cool ink, and mineral colors in between; keywords use a softened cinnabar that reads as a brush annotation, not an alarm.

Aa
画布鱼肚白
#f7f4edcanvas
Aa
面板派生色
#f1ece2panel
Aa
浮起派生色
#eae3d5raised
Aa
浮层派生色
#e3dacboverlay
Aa
边框派生色
#d6ccb9border
Aa
正文派生色
#35322d11.62:1
Aa
次要文字派生色
#5b564c6.64:1
Aa
弱化文字派生色
#746b5e4.77:1
Aa
光标玉鈫蓝
#126e825.34:1
Aa
关键字鹤顶红 · 降彩
#c344354.55:1
Aa
函数飞燕草蓝
#0f59a46.40:1
Aa
字符串荷叶绿
#1a68406.17:1
Aa
数字蟹蝥红
#b14b284.89:1
Aa
类型桔梗紫
#813c856.55:1
Aa
常量蟹蝥红
#b14b284.89:1
Aa
注释派生色
#65706f4.66:1
Aa
装饰器苍黄
#8063325.10:1
Aa
标签玫瑰紫 · 降彩
#b23c7a5.00:1
Aa
错误尖晶玉红 · 降彩
#c231425.02:1

Xuanzhi Dimmed

Color idea

Aged paper in warm gray, with ink a shade deeper. Like an old book page in afternoon light: the paper stops glaring, the pigments fade half a step, but every hue is still recognizable.

Aa
画布派生色
#e9e2d4canvas
Aa
面板派生色
#e3dbcbpanel
Aa
浮起派生色
#dcd3c1raised
Aa
浮层派生色
#d5cbb7overlay
Aa
边框派生色
#cbc0abborder
Aa
正文派生色
#2f2b2510.91:1
Aa
次要文字派生色
#4f4a406.83:1
Aa
弱化文字派生色
#665f534.90:1
Aa
光标玉鈫蓝
#126e824.55:1
Aa
关键字烟红
#894e544.97:1
Aa
函数鷃蓝
#144a747.21:1
Aa
字符串荷叶绿
#1a68405.26:1
Aa
数字驼色
#66462a6.58:1
Aa
类型野菊紫
#5252885.58:1
Aa
常量潭水绿
#6458225.50:1
Aa
注释鼠背灰
#73575c5.02:1
Aa
装饰器芓紫
#8942765.25:1
Aa
标签芓紫
#8942765.25:1
Aa
错误殷红
#82111f7.95:1

Canghai

Color idea

Deep-sea twilight, blue-green minerals, a single touch of vermilion. A cool canvas that stays quiet without going flat.

Aa
画布派生色
#0d1822canvas
Aa
面板派生色
#12202bpanel
Aa
浮起派生色
#182833raised
Aa
浮层派生色
#1f3340overlay
Aa
边框派生色
#29404fborder
Aa
正文派生色
#c8d4dd11.89:1
Aa
次要文字派生色
#9aadbb7.75:1
Aa
弱化文字派生色
#788d9f5.22:1
Aa
光标涧石蓝
#66a9c96.90:1
Aa
关键字银朱 · 降彩
#dc5e414.89:1
Aa
函数霁青
#63bbd08.16:1
Aa
字符串竹绿
#1ba7845.90:1
Aa
数字土黄
#d6a01d7.61:1
Aa
类型萝兰紫
#c08eaf6.60:1
Aa
常量土黄
#d6a01d7.61:1
Aa
注释晚波蓝
#648e934.98:1
Aa
装饰器萝兰紫
#c08eaf6.60:1
Aa
标签山茶红 · 降彩
#e45f6f5.27:1
Aa
错误银朱 · 降彩
#e257374.83:1

Qingci

Color idea

Moon-white glaze, blue-gray ink, sky-after-rain. Like a Ru ware bowl: the color sits under the glaze and never competes with the text — for daylight and light desks.

Aa
画布派生色
#e8f0eccanvas
Aa
面板派生色
#e1eae4panel
Aa
浮起派生色
#d9e3dcraised
Aa
浮层派生色
#d1dcd4overlay
Aa
边框派生色
#c7d5ccborder
Aa
正文青灰
#2b333e11.00:1
Aa
次要文字派生色
#4f5b5a6.08:1
Aa
弱化文字派生色
#5f6b674.78:1
Aa
光标玉鈫蓝
#126e825.06:1
Aa
关键字尖晶玉红 · 降彩
#bc3a464.73:1
Aa
函数玉鈫蓝
#126e825.06:1
Aa
字符串荷叶绿
#1a68405.84:1
Aa
数字驼色
#66462a7.32:1
Aa
类型桔梗紫
#813c856.20:1
Aa
常量潭水绿
#6458226.12:1
Aa
注释战舰灰
#495c696.00:1
Aa
装饰器紫灰
#5d3f517.89:1
Aa
标签芓紫
#8942765.83:1
Aa
错误殷红
#82111f8.84:1