中性底 + 两档玻璃;层次靠玻璃、投影、分隔线,不靠边框
底色只写在html上。玻璃.62给侧栏、顶栏这类视口大小的磨砂面;强玻璃.78给条目卡这类随正文长的面,不挂磨砂。
本站这里在用全站 · 侧栏导航
玻璃.62侧栏 · 顶栏 · tab bar磨砂
强玻璃.78条目卡 · 阅读栏
分隔线.12
浅色
玻璃.55侧栏 · 顶栏 · tab bar磨砂
强玻璃.72条目卡 · 阅读栏
分隔线.5
深色
对照换成「靠边框分层」看看:刷刷改版前的面板是1px描边加白底(示意),层次全靠线,光晕、玻璃和投影都没了。
数值
html { background: #F4F5F9; } /* 深:#0B0C10;body 保持透明 */
--glass: rgba(255,255,255,.62); /* 深:rgba(40,42,52,.55) */
--glass-strong: rgba(255,255,255,.78); /* 深:rgba(44,46,58,.72) */
--glass-edge: rgba(255,255,255,.9); /* 顶边亮线;深:rgba(255,255,255,.12) */
--sep: rgba(60,60,67,.12); /* 深:rgba(84,84,88,.5) */
--shadow: 0 10px 30px rgba(20,30,60,.08), inset 0 1px 0 var(--glass-edge);
/* 深:0 10px 30px rgba(0,0,0,.35) */
用在哪
.62磨砂:侧栏、顶栏、tab bar、弹层——视口大小的面。.78不磨砂:条目卡、阅读栏、右栏——随正文长的面。本站同样:侧栏、顶栏挂.62磨砂,条目卡.78不挂。
为什么
屋主要「参考苹果的UI和配色」。分层只靠玻璃、投影和分隔线,不用边框。长面不挂磨砂:长到近两万像素会超显卡纹理上限、整层丢弃,每次滚动还要重新光栅化;屋主台式机没显卡,磨砂正是那台机器的瓶颈。
坑
body也写了不透明背景时,它画在z-index:-1的body::before之上,三团光晕整个被盖掉——而离线算的对比度照样「成立」。底色只写html,body透明。
出处:tools/plan/docs/design/SPEC-apple-glass.md:12「结构」、:15「颜色(苹果系统色)」;tools/gang/design-proposal.md:909「磨砂只放在视口大小的表面上」;tools/shua/design-proposal.md:350「落到刷刷时自己拿的决定」;反例照tools/shua/design-proposal.md:28「做得好、不要动的地方」(面板统一1px描边 + 白底 + 小圆角)
文字分三级:次级.76承载文字,三级.32只作装饰
正文#1C1C1E;次级字统一rgba(60,60,67,.76),深色rgba(235,235,245,.62);三级.32只给chevron与分隔符,不承载文字。
本站这里在用总览 · 章节目录
浅 · 底=强玻璃叠靛光晕最浓角#EFEFFB
正文#1C1C1E14.92
次级rgba(60,60,67,.76)4.91
三级.321.77只作装饰
深 · 底=强玻璃叠青光晕最浓角#273440
正文#F2F2F711.40
次级rgba(235,235,245,.62)5.17
三级.322.48只作装饰
用起来同一张分组列表卡:标题用正文色,副标题和计数用次级,chevron用三级。最后一行是反例——三级色拿来写字,最不利角浅色只有1.77、深色2.48。
数值
--label: #1C1C1E; /* 深 #F2F2F7 */
--label2: rgba(60,60,67,.76); /* 深 rgba(235,235,245,.62);次级,承载文字 */
--label3: rgba(60,60,67,.32); /* 深 rgba(235,235,245,.32);只给 chevron、分隔符 */
为什么是.76
样张原值.62叠最亮光晕角只有3.42;改.73只压过了蓝光晕,绿、橙、粉、青、靛的光晕更深,只有4.28–4.49;.76让六色都过(本站实测条目卡最低4.91)。一个值,不按强调色分表。
各家本地压深
统一值只是起点:plan内容区的字直接压光晕、没有玻璃底,本地压到.85;card的hero副标题、页脚也在裸光晕上,压到.89、深色.64。这两处都有记录,是SPEC允许的本地偏离。本站把所有文字都放在玻璃卡上,分组说明这类压裸光晕的字只用正文色,所以.76够用。
坑
次级字.76直接压在光晕中心(不隔玻璃)只有3.52。字要么上玻璃,要么换正文色,别指望统一值免检。
出处:tools/plan/docs/design/SPEC-apple-glass.md:121「降级与可访问性」、:133「次级字统一值与各项目自测义务」、:176「各家有记录的偏离」
六个苹果强调色:填充档与文字档分开
填充、渐变、图标、色点、焦点环用系统色原值;一当文字用,就换HIG「增强对比度」那组。原值当字不达标:#007AFF压白只有4.02,#34C759只有2.2。
本站这里在用全站 · 强调色
蓝默认
绿
靛
橙
粉
青
每格:填充 浅 / 深 · 渐变(浅端)· 文字档 浅 / 深。文字档那两块的底是「强玻璃叠这个强调色自己的光晕最浓角」的合成色,数字是那一角的对比度(公式法)。
用起来主按钮、次按钮、选中标签、链接、进度条、焦点环,浅深并排。换个颜色看看(默认跟着全站强调色);按Tab走进来,焦点环是填充档原色、2px、外扩2px。点「做一题」进度条往前走。
浅色
专项练习选好题型就能开始
链接一律用文字档:对比度怎么算。
焦点环长这样
深色
专项练习选好题型就能开始
链接一律用文字档:对比度怎么算。
焦点环长这样
文字档
/* 浅色:HIG 增强对比度 */ 蓝 #0040DD · 绿 #1F7A36 · 靛 #3634A3 · 橙 #C93400 · 粉 #D30F45 · 青 #0071A4 · 红 #D70015
/* 深色:HIG 深色增强对比度 */ 蓝 #409CFF · 绿 #30DB5B · 靛 #8E8BFF · 橙 #FFB340 · 粉 #FF6482 · 青 #5AC8F5 · 红 #FF6961
绿用#1F7A36,不用HIG的#248A3D(压白只有4.40);深色靛从HIG的#7D7AFF提亮到#8E8BFF(对#0B0C10是6.8)。
渐变浅端
浅色accent-2:蓝#5AC8FA、绿#A8E063、靛#BF5AF2、橙#FFD60A、粉#FF9AA2、青#64D2FF。深色样张只重写了蓝(#64D2FF),其余沿用浅色那组,本站与岗岗、card一样照这个写。
现状
深色accent-2四家是三种写法:刷刷、plan各自配了一套,互相也对不上。统一与否等控制室定,正在对齐。
出处:tools/plan/docs/design/SPEC-apple-glass.md:17「颜色(苹果系统色)」、:76「自适应」文字档、:122「降级与可访问性」、:201「各家有记录的偏离」
语义色固定、不随强调色;风险必须带文字
红=冲突、逾期、答错;橙=今天截止;绿=完成、答对。填充用系统色,字用文字档压在同色相的实色软底上,旁边一定有字,不只靠颜色。日期标签另有一档黄,只给两天内到期,见下一条。
本站这里在用交互 · 条目里的坑
用起来提示条、带字的风险标签,下面是只靠颜色的反例,浅深并排。点「红绿色弱模拟」:带字的那组照样读得出,只有色点的那组红绿就分不清了。
浅色
已保存改动写进了本机
今天截止还有2项没交
冲突两件事都排在周三上午
风险标签带字
反例只靠颜色
深色
已保存改动写进了本机
今天截止还有2项没交
冲突两件事都排在周三上午
风险标签带字
反例只靠颜色
模拟用的是Machado等2009年发表的绿色盲(deuteranopia)颜色矩阵,SVG feColorMatrix在线性RGB里算,只是示意,不等于每个人看到的样子。
数值
填充(浅 / 深) 文字档(浅 / 深) 实色软底(浅 / 深)
红 #FF3B30 / #FF453A #D70015 / #FF6961 #FFE9E8 / #412021
橙 #FF9500 / #FF9F0A #C93400 / #FFB340 #FFF3E3 / #413019
绿 #34C759 / #30D158 #1F7A36 / #30DB5B #E9F9ED / #1C3927
用在哪
plan的风险色:红=冲突逾期、橙=今天截止、黄=两天内到期(2026-10-08加,只给日期标签,见下一条「黄色只给两天内到期」)、绿=完成、灰=未开始和离截止三天以上;风险色覆盖阶段色,用户不能自定义。刷刷答对绿、答错红。本站条目里的「坑」铺橙色实色软底,左边写着「坑」字,不只靠颜色。
为什么
语义不能跟着强调色变,换了强调色「红」还得是红。色弱的人分不清红绿,所以风险提示必须有文字说明,不能只靠颜色。
本站本地
深色红字HIG原值#FF6961压强玻璃叠青光晕最浓角只有4.49,本站提亮到#FF6E66(4.63);其余五个文字档压最不利角都≥4.62。
出处:tools/plan/docs/design/SPEC-apple-glass.md:18「颜色(苹果系统色)」、:76文字档;tools/plan/docs/BUSINESS_LOGIC.md:1014「风险与颜色逻辑」
黄色只给两天内到期:日期标签按离截止几天分四档,远的一律灰
逾期红、今天截止橙、明天后天黄、其余灰;已完成和已归档的一律灰。强调色不再拿来标日期,只留给能点的东西和进度条;一行里只有日期标签带颜色,「重要」「待重排」这些标签都是灰的。
用起来一组带截止日的假任务(2026年10月)。拖「今天是」滑块(或聚焦后按←→),日期标签按离截止还有几天换档:逾期红、今天截止橙、明天后天黄、其余灰;已完成的一律灰。文案照plan今日页的口径。浅深并排。
数值 / 代码
urgencyTone(days) // days = 截止日 − 今天,按日历天
days < 0 overdue 红 逾期N天
days === 0 today 橙 今天截止
days ≤ 2 soon 黄 明天截止 / 还有2天
其余 normal 灰 还有N天(--fill 底 + 次级字)
已完成 / 已归档 一律 normal,只给灰色的绝对日期(10月5日)
黄(2026-10-08加,只给 soon)
填充 #FFCC00 / #FFD60A 只当填充,不当字:压白1.51、压页面底1.39
文字档 #7A5200 / #FFD60A 压自己的软底6.23 / 9.04
软底 #FDF3CF / #3A3214 (实色)
token 按用途起名 --soon-50: var(--yellow-soft); --soon-700: var(--yellow-text);
用在哪
plan今日、日程、全部任务三页的任务行日期标签,和详情里的截止日期胶囊,同一个urgencyTone。全部任务页近两天之外写绝对日期(周四/9月30日),颜色照样按这四档。SPEC写明四家通用:其余三家以后有日期标签照这一套。和上一条「语义色」的交叉:橙从「即将截止」收窄成「今天截止」,明天、后天归黄。
为什么
改版前不急的日期(「明天」「还有12天」「10月20日」)也用强调色软底+强调色字,和「逾期」一样大、一样粗、一样有颜色,远的和急的一样响。分四档以后,只有真急的带颜色,越急越暖;强调色只留给能点的东西,日期不再冒充按钮。
一眼不知道哪里是重点
坑
系统黄当字压白只有1.51、压页面底1.39:浅色的字必须压到#7A5200,深色那档的字才能直接用系统黄。plan写完对比度测试后先把--yellow-text改回#FFCC00跑一次,当场红,判据才算接上了。已完成、已归档的任务要单独判:不判的话做完的事也挂着「逾期」,plan 10-08修过一次。
出处:tools/plan/docs/design/SPEC-apple-glass.md:19「颜色(苹果系统色)」、:22「2a. 紧急程度标签」;tools/plan/app/src/domain/dateLabel.ts:30「urgencyTone」、:102「isSettledTask」;tools/plan/app/src/styles/tokens.css:186「--yellow-text」、:387「--soon-50」;tools/plan/app/src/styles/tokens.contrast.test.ts:75;tools/plan/docs/BUSINESS_LOGIC.md:1037「黄色:两天内到期」、:1877「紧急程度只用一组色」
承载文字的浅底一律实色;token按用途起名
次按钮、选中项、标签、计数胶囊这类「上面压字」的软底不透明;半透明只留给投影、光晕、描边。--accent-tint实色软底、--accent-shadow投影,各管各的。
本站这里在用收藏 · 标签多选
光晕最淡处
半透明 · 4.06
实色 · 4.59
光晕最浓处
半透明 · 2.67
实色 · 4.59
同一个粉色chip:半透明底rgba(255,45,85,.14)会把底下的光晕吃进来,挪到光晕中心就从4.06掉到2.67;实色底#FFE8EC在哪都是4.59。
拖一拖把光晕从最淡拖到最浓,看同一组标签、次按钮、计数胶囊:半透明底的字一路往下掉,实色底的字一直是4.59。粉色、浅色是六色里最不利的一组。
数值
--fill: #E6E6E6; /* 浅 = 白与正文色 #1C1C1E 兑11%;深 #393A3E = 深底与正文色兑20% */
--accent-tint: #E3F0FF; /* 实色软底:浅 = 填充色兑11%进白;深 = 兑18%进 #17181C(#152B45) */
--accent-shadow: rgba(0,122,255,.13); /* 投影:必须半透明,不压字 */
/* plan 再拆一支 --accent-stroke(描边,半透明,按图形 ≥3判) */
为什么
半透明软底和压在上面的字是同一个色相,底吃进光晕后对比度随位置漂:岗岗实测同色相文字只有3.9–4.4,plan是「同一个chip挪个位置就从4.4掉到3.3」。实色把这一格从「随光晕变」变成确定值,文字档能原封不动用统一值。
命名教训
旧的--accent-soft同时当软底、投影、描边,--on-accent同时当主按钮白字和实底上的字——名字说的是长相,所以谁都拿去用。token的名字必须说明用途,不是说明颜色。
出处:tools/plan/docs/design/SPEC-apple-glass.md:135「次级字统一值与各项目自测义务」、:158「plan本地第三轮」、:173「命名教训」;tools/gang/design-proposal.md:833「例外与理由」;tools/plan/docs/ui-redesign-proposal-v2.md:587「对比度第三轮」
背景是三团光晕:一团跟强调色、一团暖、一团冷
固定在视口的body::before画三团radial-gradient,透明度.2–.55,blur(10px)把边糊软;深色下减弱。点下面的开关,一团一团看。
本站这里在用全站 · 强调色
代码
body::before {
content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
background:
radial-gradient(38vw 38vw at 12% 8%, var(--blob1), transparent 60%),
radial-gradient(34vw 34vw at 92% 18%, var(--blob2), transparent 60%),
radial-gradient(40vw 40vw at 70% 100%, var(--blob3), transparent 60%);
filter: blur(10px);
}
/* 蓝(默认)浅:rgba(90,200,250,.55) rgba(255,214,170,.55) rgba(175,160,255,.45)
深:rgba(10,132,255,.35) rgba(255,159,10,.22) rgba(94,92,230,.35) */
为什么
光晕是这套视觉的主要特征,不为了字色去减淡它——字不够就上玻璃或压深字,别动光晕。用固定伪元素而不是background-attachment:fixed:iOS Safari不支持固定附着,背景会被拉成整页高、越往下越跑偏。
坑
光晕的vw尺寸与blur半径不乘大屏缩放系数;html与body只能有一个写底色(见「中性底」那条)。
出处:tools/plan/docs/design/SPEC-apple-glass.md:20「颜色(苹果系统色)」;tools/plan/docs/design/shua-glass.html:31body::before;tools/gang/styles.css:613「刻意不用background-attachment:fixed」
深色靠两个属性切换;头部同步脚本在样式表前设好,免闪色
html[data-mode]写已解析的light/dark,偏好(含auto)另存data-mode-pref;强调色data-accent。localStorage两个键<项目>-mode、<项目>-accent,默认light + blue。
本站这里在用全站 · 浅深切换
- data-mode-pref
- —
- data-mode
- —
- data-accent
- —
- theme-color
- —
任何元素都能局部切给这块加data-mode="dark",令牌在它身上重算一遍。
左边读的是本页<html>上的实时值:去侧栏底部(手机在「更多」里)换外观或强调色,这里跟着变。
代码
<head>
<meta name="theme-color" content="#F4F5F9"> <!-- 深色 #0B0C10,脚本跟着改 -->
<script src="assets/boot.js"></script> <!-- 同步,排在样式表之前 -->
<link rel="stylesheet" href="assets/star.css">
// boot.js 要点:读 star-mode / star-accent(try/catch,非法值回落 light + blue),
// auto 按 prefers-color-scheme 解析后写进 data-mode,并监听系统翻转。
root.setAttribute("data-mode-pref", pref);
root.setAttribute("data-mode", pref === "auto" ? (mq.matches ? "dark" : "light") : pref);
root.setAttribute("data-accent", accent);
为什么
属性在样式表下载前就在<html>上,首帧拿到正确的令牌:深色下不先白一下,切过强调色刷新也不闪别的色。data-mode写已解析值,CSS只要一份深色块,不必为auto再抄一遍(plan的写法)。file://下读localStorage可能直接抛错,读写一律try/catch。
本站写法
令牌一行一对浅深值:--bg: var(--lt,#F4F5F9) var(--dk,#0B0C10),挂在:root,[data-mode],[data-accent]上,所以样例里任何元素加属性都能局部切——这页的深色样例全是这么做的。
出处:tools/plan/docs/design/SPEC-apple-glass.md:29「主题与切换」;tools/plan/app/src/styles/tokens.css:11文件头「两个维度」;tools/gang/index.html:15外观预置脚本注释
对比度按最不利的那一角算,公式法与像素法两法验收
底色取「玻璃rgba叠在光晕最浓(深色最亮)那一角」的合成色,不取屏幕平均、不取玻璃名义值;半透明字先按alpha压到底上再算。正文与次级≥4.5,图形≥3,高对比≥7。
公式
const L=h=>{const [r,g,b]=[1,3,5].map(i=>parseInt(h.slice(i,i+2),16)/255).map(c=>c<=0.03928?c/12.92:Math.pow((c+0.055)/1.055,2.4));return .2126*r+.7152*g+.0722*b};
const C=(a,b)=>{const x=L(a),y=L(b);return ((Math.max(x,y)+.05)/(Math.min(x,y)+.05)).toFixed(2)};
两法
- 公式法压最不利角:对每个文字色,底取玻璃叠光晕最浓那一角的合成色,套上面的L/C。
- 像素法交叉验证:真实页面逐元素截图,取底色像素众数(含磨砂与光晕的最终合成),浅深 × 六强调色 × 全部承载文字的元素。
两条路各抓得到对方漏的:岗岗公式法抓到粉色光晕下顶栏环节名4.35,像素法抓到深色弹层底太亮、三个强调色选中项4.17–4.25。任一条不过就算不过。
本站实测
条目卡(强玻璃.78叠光晕最浓角),浅深 × 六强调色:次级字最低4.91(浅靛)/5.17(深青);强调色文字档最低4.75(浅粉)/4.68(深蓝)。侧栏磨砂.62叠饱和度提升后的光晕:粉文字档只有4.26,所以侧栏、顶栏、tab bar里的强调色字一律压在强玻璃选中底上(≥4.70)。
坑
读getComputedStyle().backgroundColor只拿到rgba字面量,算不出真实底色;统一值只是起点,各项目必须在自己最不利的光晕角下实测,不够就本地压深并记录。
出处:tools/plan/docs/design/SPEC-apple-glass.md:139「对比度验收方法」、:137「各项目自测义务」;tools/gang/design-proposal.md:772「computed值不可信」
舞台底用随强调色走的深色调,不用纯黑:星野
卡集选卡台的底是屋主从六选里挑的「D星野」:深夜蓝紫160°渐变,中段混18%强调色,中心一团45%强调色柔光,十二颗CSS星点慢慢闪,四周压暗角。浅色模式也用,深色再压一档。
本站这里在用总览 · 条目星球
点色点换这块舞台的强调色(card默认靛);系统开了「减弱动态效果」时星点静止。
代码
--stage-1: #0F1128; --stage-2: #1B1740; --stage-3: #0B0C1E; /* 深色 #0A0B1E #141030 #070812 */
--stage: radial-gradient(50% 45% at 50% 55%, color-mix(in srgb, var(--accent) 45%, transparent), transparent 70%),
linear-gradient(160deg, var(--stage-1), color-mix(in srgb, var(--accent) 18%, var(--stage-2)) 55%, var(--stage-3));
.stage::before { /* 十二颗星:radial-gradient(1.2px 1.2px at 12% 18%, #fff 60%, transparent) × 12 */
opacity: .85; animation: twinkle 9s ease-in-out infinite; }
.stage::after { background: radial-gradient(90% 90% at 50% 50%, transparent 60%, rgba(0,0,0,.5)); } /* 暗角 */
@keyframes twinkle { 0%, 100% { opacity: .85 } 50% { opacity: .55 } }
@media (prefers-reduced-motion: reduce) { .stage::before { animation: none } }
为什么
舞台底随强调色的深色调、不用纯黑:这一句是控制室2026-09-23 02:15下发时自己加的,查不到屋主说过(这里以前写成「屋主裁定」,2026-10-08查会话记录更正,经过见否掉的方向 · 舞台底六选)。屋主从六选(极光雾、聚光舞台、网格渐变加颗粒、星野、玻璃台面、光环)里回了「D」,挑的是星野;球形选卡撤掉之后星野底留了下来。
出处:tools/card/collection/shared/theme.css:24--stage;tools/card/collection/gallery.css:17.globe-stage::before星点、:40减弱动效;tools/card/CLAUDE.md:233「星野」;控制室会话记录(2026-09-23 02:15下发「舞台底改成随强调色的深色调而不是纯黑」,02:20屋主回「D」)