@charcuterie/tokens
设计-接地层. 零依赖性,无反应.
castkit/packages/views 通过佐藤里制作给 ePaper PNG 并需要颜色和
间距值不拉入反应树; slatecast 预算为60KB克兹。 两者
这就是为什么这是一个单独的包 从 @charcuterie/ui。反应消费者从不看到两个
名称 - 它们导入 @charcuterie/ui/tokens。这是建筑图分割,而不是API分割.
运行它
节点 24 直接运行 TypeScript, 所以 不需要安装 用于使用其中任何一种 脚本 :
node scripts/checkContrast.ts # the WCAG 2.2 AA gate — exits non-zero on failure
node scripts/buildTokens.ts # → dist/{variables,theme,first-paint}.css, dist/tokens.json
node scripts/fetchFonts.ts # re-download the three shipped faces → fonts/, src/fonts.css
node scripts/buildPreview.ts # → preview/index.html, the M0 bake-off board
node scripts/buildEpaperPreview.ts # → preview/epaper-palette.html, the ePaper board
这是刻意的,值得保存的:M0烤面包在工作区之前运出 已经存在,一个符号更改应该让一个命令远离重建的棋盘.
fetchFonts.ts 是需要网络的例外, 这是这里唯一的脚本
写一个跟踪二进制。 说得很清楚 fonts/ 在调试之前,因为谷歌
文件名带有内容散列物,覆盖物会让那些老的孤儿在
包永远.
字体
三相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相--font-display),外衬
(单位:千美元)--font-sans)和维克多·莫诺(英语:--font-mono),所有SILOFL. 消费者增加一行:
@import "@charcuterie/tokens/fonts.css";
从 theme.css 进口令牌不应强迫
字体下载。 佐藤店的消费者想独来独往 可以在
@charcuterie/tokens/fonts/<name>.woff2。 。 。 .
单是维克多·莫诺,不是丹克·莫诺. 这是许可证的限制,而不是 偏好,而压倒它每个应用 是一个得到支持的一行 决定 已经 片断。 在这支舰队中,领有执照的Dank Mono woff2不得进入任何回购 通过一个只读的绑定器从NAS上架来达到一个应用程序—— 怎么样。 。 。 .
通过Yarn,从任何地方 在repo:
yarn workspace @charcuterie/tokens build # tsc → dist/*.js + .d.ts, then the CSS
yarn workspace @charcuterie/tokens test # Vitest, including the contrast gate
build 运行 prepack这样 dist/ 产生而不是承诺.
两个源工作流程同时直播 因为 tsconfig.base.json 套装
rewriteRelativeImportExtensions源导入兄弟姐妹 ./contrast.ts - 哪个
是让节点运行它而不建设的, 和Tsc重写这些到 ./contrast.js 打开
离开的路。 没有这种旗帜,这两个工作流程是相互排斥的.
对比门现在是一个考验
src/contrast.test.ts 完成同样的审计 scripts/checkContrast.ts 指纹。 这是
页:1 仅限 m1变了 一个真理的来源,被董事会问
剧本,还有CI一样的——一个剧本大门,只是人们记得要运行的.
两级
第1级 原始斜坡( r)neutral.50…950) (中文(简体) ). 某一构成部分永远不得提及某一构成部分。 他们
因此,一个变体作者有 东西来构建第二级.
第二级 是语义角色,它是唯一可以命名的层次组件 :
| 组 | 作用 |
|---|---|
surface | base, (中文(简体) ), raised, (中文(简体) ), sunken, (中文(简体) ), overlay, (中文(简体) ), inverse |
content | primary, (中文(简体) ), secondary, (中文(简体) ), muted, (中文(简体) ), disabled, (中文(简体) ), onAccent |
border | subtle, (中文(简体) ), default, (中文(简体) ), strong, (中文(简体) ), focus |
intent | {neutral, accent, success, warning, danger, info} × {surface, surfaceHover, border, content, solid, solidHover, onSolid} |
categorical | {1 … 10} • 相同的七个角色 |
focus | ring, (中文(简体) ), ringOffset,以及 focusRing.width 编号 : .offset |
intent 是一个普通的 rindeck的 TONE_CLASS 地图——它目前使用的地图
两者均相同 VerdictBadge.tsx 财务报告和审定财务报表 TowerAlerts.tsx。 。 。 .
intent 意味着什么; categorical 故意没有
每一个成员 intent 是一个 索赔数字 : danger 不是一种颜色,而是关于
如果你按下它,组件打开它会发生什么. categorical 这是
颜色的家族 a 用户选择 ——道克特标签,项目,图表系列——其中:
语义上的名字会是一个谎言 设计系统告诉他们。 编号,因为
没什么好说的.
产生而不是手工挑选: CATEGORICAL_HUES 表示色角并
buildCategoricalScheme 以对比目标解决每个角色
计划。 变体说明其 字符 (单位:千美元)chromaScale, (中文(简体) ), contentContrast永远不会
he.
两道门,不是一道. 每对绝对对 注册在 contrastAudit.ts 旁边
意图——此外 互相攻击,因为两个指数都可以清楚
4.5: 1 在同一地平面上,并且与每一数字的颜色相同
地板绿色. getCategoricalDistinctnessFailures 测量 OKLab 中的每对
最紧 solid 机队中的一对是QQ Eok 0.0893,对手是0.0835 Tableau 10实现
为了自己.
getCategoricalIndex(key) 表示在
特性。 这是一个倒计时,绝不是压倒性——一个存储的拾取胜.
边界与 Swatch数字 : Swatch 取颜色 从世界抵达 (实物)
贴纸,一张相册口音),并且可以保证任何关于它的东西; categorical 是一个被整理的集
用户选择 从这样它就能保证一切.
决定。 。 。 .
为什么意图带有 固态 以及一个 表面
该计划命名了四个意图角色. 建造标本板 第五个需要
马上. surface 这是 有锡 处理机队已经用于状态
药丸(bg-blue-950 text-blue-300); 主按钮为 a 饱和填充 拥有自己的
文本颜色。 从另一层推导出来的 恰恰是这个层的猜测
删除,因此两者都说明——和 onSolid 因为无论白色还是白色
近黑者在给定的填充量上胜负,真实性因意图的不同而异(在 layered白色失败
珊瑚口音和近黑口音在5.4:1时通过.
三轴和一轴
data-scheme {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你这混蛋 data-density (舒适的qq收缩qq亭) ^
data-variant (视觉方向) - 所有三个都是 <html> 属性和所有三个
编曲. 一个属性翻转重取主题 零重递,因为没有
在 React 中观察变化.
ePaper不是第四个轴. 单项出口(@charcuterie/tokens/epaper(中文(简体) )
因为它消除了能力 而不是让他们休息: 没有悬浮, 没有不透明,没有
阴影,没有过渡, 和颜色限制在一个小到可以保持锋利边缘的集合.
建模为 data-scheme="epaper" 将意味着 data-variant 仍然适用,
它不能做到这一点.
六是哪个 像素 可能不是面板能显示的
用来声称其调色板的配置是"面板可以实际渲染出六种颜色" 这是 虚假,这就是为什么限制被理解为任意。 光谱 6 面板 将每个像素设置为六分之一; a 区域 以像素表示的比喻要多得多,因为 司机dithers——这正是舰队相片路径一直依赖的.
真正的规则是按键 正在绘制什么 (单位:千美元)决定:
| 什麽 | 它可能用来什么 | 数到6 |
|---|---|---|
| 图片 | 完全分化的游戏——不是这个简介的生意 | 接近连续 |
| 大面积平地填充 | inks + 键 blends | 第 19 条 |
| 边框、 小文本、 图标 | inks 仅限 | 6个 |
import { epaperPanels, spectra6Blends } from "@charcuterie/tokens/epaper"
// a large fill — the panel-side quantizer turns this one flat hex
// into a 50/50 yellow-red checkerboard
const fill = spectra6Blends.yellowRed // #DB8225
// a 1px rule — six inks only, or it becomes a dotted line
const rule = epaperPanels.spectra6.family === "fixedInk"
? epaperPanels.spectra6.inks.black
: undefined
15个墨子中有两个是 没有,而不是现在和错误数字 : blackYellow
财务报告和审定财务报表 yellowBlue 完全量化为不同的一对,所以没有六分位值
他们.
epaperPanels 被面板键入并受到歧视 family。 。 。 . fixedInk 带面板
inks 编号 : emittedInks 编号 : blends· ; continuousTone 面板 — E 墨水画廊 3 ~ 50,000
颜色 ACEP, 不在舰队里 ——没有携带,因为没有调色板可以
列举,因此没有发明.
node scripts/buildEpaperPreview.ts 画整件事,检查板和所有,从
src/epaper.ts。承诺董事会是
docs/previews/2026-07-31-m6g-epaper-palette.html。 。 。 .
从这里开始的第一纸船——复制,永远不要 <link> 这个
每个应用程序在其条目HTML中需要一行CSS,在任何程序之前涂上画布
样式表已解析,或用一整页的白色闪光打开了深色应用程序. dist/first-paint.css
是这条线,从同一个字头为两个方案生成 variables.css 全文如下:
<style>
html, body { background-color: var(--color-surface-base, #131822); color-scheme: dark; }
</style>
贴上. 别 <link> 这个. 样式表请求是网络回转和跳动
来回旅行是规则的全部工作 连接文件会重新显示它
存在可以防止,同时看起来像 tidier 选项。 已导出
(单位:千美元)@charcuterie/tokens/first-paint.css所以,一个建筑可以读它 所以,"这是哪里做的
片段来自"有一个答案.
这个 var() 这是这艘船从一个包而不是维基页面 得到的原因. 一个
内入 <style> 实值 无层,并且没有层次的作者 CSS 击败每个 @layer 无论
- 尾风 v4 向 @layer utilities所以赤裸裸的形态,
background-color: #131822,不只是画早期: 排行 bg-surface-base 打开
<body> 永久,没有 data-scheme 翻转可以到达页面背景 。 灯光模式
然后在暗色画布上制作轻卡。 写成 倒计时,文字仅适用于
时 --color-surface-base 这是没有定义的——规则曾经存在的那一刻.
3个应用软件手抄了赤色的形态,3个应用软件得到bug. 决定记录 有测量.
color-scheme 需要没有 var()数字 : variables.css是因为 [data-scheme] 规则也是没有层次的,所以
它在特异性上获胜 而不是输给这个.
在应用程序中打开副本
buildFirstPaintRule 仅返回规则——一行,无评论——所以消费者的漂移
测试是一个论断,它把 var() 以及六分卫:
import { buildFirstPaintRule, daylight } from "@charcuterie/tokens"
expect(indexHtml).toContain(
buildFirstPaintRule(daylight, "dark"),
)
这是三个被破的应用程序无法写的大门, 因为每个都只有自己的副本.
colour 在类型脚本中, --color-* 在中央支助系统
这种分裂是蓄意的 绝不能被"固定"。 。 。 .
使用 TS 标识符 colour匹配 e6Colour 编号 : colourMode 编号 : getAccentColour 内
castkit/packages/views/src/viewStyles.ts,按照关于匹配现有
术语。 CSS 自定义属性使用 --color-* 因为 尾风v4's @theme 仅限
生成 bg-* 编号 : text-* 编号 : border-* 水电费 --color- 命名空间。 。 。 .
把他们改头换面 --colour-* 静静地生成一个无功能的样式表 .
仅逻辑属性
每个空间价值都作为逻辑属性消耗—— padding-inline, (中文(简体) ), margin-block, (中文(简体) ),
inset-inline-start, (中文(简体) ), border-inline-start, (中文(简体) ), text-align: start永远 left编号 :right。 。 。 .
在尾风,意思是 ms-编号 :me-编号 :ps-编号 :pe-编号 :start-编号 :end-编号 :border-s编号 :border-e。 。 。 .
现在不花什么钱,让RTL在不久之后几乎自由,这就是为什么这是一条规则
而不是喜欢. scripts/previewStyles.ts 完全是这样写的,是
最终的ESLint规则将被测试.
对比是检验,不是指导
scripts/checkContrast.ts 将每个内容和意向一对穿过每一个
(变相×计划),并退出低于阈值的非零.
- WCAG 2.2是大门 - 4.5:1,案文(1.4.3),3:1,管制界限和重点 指标(1.4.11)。 这是规范性的,也是审计将使用的内容.
- 与APCA一起报道 它的模型在黑暗的UI上 感觉的对比要好得多, 但WCAG 3仍然是一份工作草案, 所以在它上指在移动的目标上.
报告有两个类别,但从未加门,每个类别都有明确的理由:
content.disabled,因为 WCAG 明确豁免不活动控制,并标注它 将强制禁用文本显示已启用.- 装饰行-
border.subtle, (中文(简体) ),border.default,以及 意图 徽章轮廓. 1.4.11 涵盖边界 需要识别控制而不是屏幕上的每一行.border.strong实值 有门,因为那是文本输入、复选框和切换的作用 轨迹自画自画 绝对 边框,因为一个丸读 "Homelab"是用它的颜色和别的东西来识别的 (单位:千美元)决定) (中文(简体) ).
将范围界定错误不是无害的: 3:1的标注装饰产生了65个"失败" 第一跑步,这正是 对比门如何关闭.
审计还声称: 别名漂移数字 : content.onAccent 必须是平等的
intent.accent.onSolid,以及 border.focus 必须是平等的 focus.ring。两个名字换一个
值是一个等待第一个只调取其中之一的bug .
添加变体
复制任何文件 src/variants/,修改数值,添加到 src/variants/index.ts, (中文(简体) ),
然后运行 node scripts/checkContrast.ts。如果退出零,请运行 buildPreview.ts 看着
临Τ 两个步骤都需要——大门证明是 可读,不是说它是 不错。 。 。 .
src/variants.test.ts 也持有属性 一个新的方向最有可能
断开:光模式不是纯白色, raised 财务报告和审定财务报表 sunken 实际从
base,每一个意图 和每个绝对指数 所有七个角色,每个表是
透明六位数的螺旋 十个绝对的螺旋可以分辨
非零宽度。 更新文件中的名册断言
添加一个;该断言存在,所以无法添加变量 安静。 。 。 .
在 M3 关闭: 结构命名空间现在也到达了 Tailwind
theme.css 地图 --color-* 输入 @theme,生成 bg-* 编号 : text-* 编号 : border-*。 。 。 .
到M3的时候,它也是 5个结构命名空间,所以一个组件写入普通
公用事业和获得我们的价值观:
| 发表 | 读取 | 使用它修正 |
|---|---|---|
--text-{xs…2xl} | --font-size-* | text-sm - 而我们的密度 |
--leading-* | --line-height-* | leading-normal |
--shadow-{low,medium,high} | --elevation-* | shadow-low,了解计划 |
--ease-* | --easing-* | ease-standard |
--spacing | space[1] | p-3 是象征值,不是巧合 |
--radius-*, (中文(简体) ), --tracking-*, (中文(简体) ), --font-*,以及 --font-weight-* 不需要桥梁:
与 Tailwind 名称空间相撞 :root 已经, M1 碰撞审计被锁定
如所欲为. --duration-* 财务报告和审定财务报表 --control-* 没有尾风命名空间,所以
组件以 duration-(--duration-fast) 财务报告和审定财务报表 h-(--control-height-md)。 。 。 .
设定由 THEME_BRIDGES 并坚持两种方式: tailwindCollisions.test.ts数字 :
未公布但被公布的桥也失败了 未经公布但被公布的桥也失败了 每个
故意输入 重新定义每个消费者的现有用途 - 这就是重点,
这就是为什么它是一个决定 而不是一个调整:
发展成果评估。 。 。 .
packages/docs/src/TokenSpecimen.tsx 仍然读过 var()左边
作为前相; @charcuterie/ui 是后边.
这里也会产生容器-干燥变体
theme.css 发出一个 @custom-variant 容器 -- -- 干燥度的每步
字义 阈值, 因为容器查询的条件在自定义前解决
属性存在 - @container (min-inline-size: var(--cq-sm)) 无效 CSS :
@custom-variant cq-sm (@container (min-inline-size: 24rem));
这么说吧 cq-sm: . cq-xl: 是我们的,匹配 --cq-*而不是尾风 @sm:,哪个
读取 --container-* 命名空间,我们刻意移走.
决定。 。 。 .