Astryx 调色板生成系统(AST-008):astryx-oklch-v1 配方与作者工作流完全指南
2026/9/15 11:47:43 网站建设 项目流程

Astryx 调色板生成系统(AST-008):astryx-oklch-v1 配方与作者工作流完全指南

【免费下载链接】astryxAn open source design system that's fully customizable and agent ready项目地址: https://gitcode.com/GitHub_Trending/as/astryx

Astryx 是一个"fully customizable and agent ready"的开源设计系统,其 CLI(packages/cli)为主题作者提供了完整的主题创作工具链。本文围绕设计规范 docs/specs/AST-008/spec.md 展开,系统讲解 Astryx 的作者时(authoring-time)全调色板生成系统:从设计意图、作者生命周期、16 条功能需求,到astryx-oklch-v1规范配方的每一步色彩数学,再到generateTonalPalette()纯 API 与astryx theme palette generate命令的实战用法。读完本文,你将掌握如何生成、审查、接受、提交一个完整的 OKLCH 调色板候选,理解锚点策略、停止点布局、活力度与中性配置文件的含义,并能结合源码证据复现规范中的确定性夹具(fixtures)。

一、为什么需要一个"作者时"调色板生成系统

主题作者需要一种可重复(repeatable)的方式,来制作完整的全调色板候选(complete tonal palette candidates)。AST-008 把生成定性为作者工作(authoring work):它产出的是供人来检查、调整并接受的色彩,而不是运行时行为。

规范通过以下关键定位约束了整个系统的边界:

  • 生成 ≠ 运行时:普通主题构建(theme build)绝不重跑生成器;生成结果只是候选。
  • 接受后的数据归作者所有:被接受的结果保存为私有的、主题自有的调色板文件(committed snapshot),可自由编辑,不再受生成器控制。
  • 当前仓库状态main分支上已有实验性的 Palette Generator Lab,用于对比候选配方、完整族系(families)、模式(modes)、锚点(anchors)与既有主题。最新的 OKLCH 实现是第一个生产配方的视觉基础。
  • 首个消费者:Astryx CLI 的主题创作工作流。规范同时接受一个纯generateTonalPalette()作者 API 与astryx theme palette generate命令,二者共享同一个版本化引擎,且都处于 Core 主题归一化与运行时行为之外。

Non-goals(规范明确"不做"的事)

理解边界同样重要。AST-008做以下事情:

  • 不向DefineThemeInputDefinedThemedefineThemeexpandColorScale、运行时挂载或主题编译中加入任何调色板数据/生成/映射逻辑;
  • 不要求手工创作或导入的数据带有生成溯源(provenance);
  • 不定义调色板的形状、校验、关联、继承或产物(这部分归 AST-018 提案负责);
  • 不把某个调色板停止点变成语义 token、实时查找、设计审批或无障碍保证。

二、所有权模型与作者生命周期

规范用两张表格明确了"谁负责什么"和"作者流程长什么样"。

所有权(Ownership)

Owner契约(Contract)
AST-008候选生成需求、配方可复现性、候选到接受(candidate-to-acceptance)的边界
Ruby视觉配方与推荐(在完成对比证据之后)
AST-018(若被接受)已接受调色板的形状、所有权、校验边界,以及与运行时主题的分离
theme:<name>已接受的确切调色板值、已保存的映射与偏差、所需状态、兼容性与渲染证据
当前主题架构生产级的defineTheme归一化与编译;AST-008 不改变它们
CLI 作者表面生成命令、纯 API、候选序列化、收据(receipts)与安全写入

作者生命周期(Authoring lifecycle)

阶段必需结果
Create(创建)生成、手工编写或导入一个完整的候选调色板
Review(审查)检查完整族系、模式、诊断信息、对比结果与渲染上下文;可自由调整或拒绝
Accept(接受)将最终确切的调色板数据作为已审查快照,按已接受调色板契约保存
Suggest(建议,可选)从已接受调色板数据到某一个明确主题角色的只读候选映射
Save mapping(保存映射)人工接受后,保存一个字面 CSS 颜色,或对其确切已提交调色板值的有意引用
Verify(验证)在所属主题记录中,为已保存的确切值记录上下文证据

三、16 条功能需求(FR1–FR16):设计契约的核心

规范的主体是功能需求。逐条理解它们,是使用与扩展生成系统的前提。

FR1–FR2:生成可选,请求必须描述完整作者意图

  • FR1:生成、手写与导入的调色板在校验后完全平等。缺少生成溯源只意味着"不是用这个配方生成的",绝不使合法的调色板数据失效。
  • FR2:一次生成请求必须描述完整族系集合、归一化种子、版本化的强度与中性配置文件、精确/有界/灵活的锚点、明确的停止点布局、明暗策略、目标色域与编码,以及其他一切影响输出的参数。工具默认族系阶梯为21 档0, 5, …, 100布局,同时接受任何非空的自定义数值停止点列表。紧凑与专门布局是合法选择而非例外。每个候选都暴露独立的精确黑与白值;生成的族系中 0 和 100 档重复这两个值。blackwhite两个族系 ID 被保留给这两个独立值。

FR2a–FR2b:停止点语法精确、数值是稳定坐标

  • FR2a:每个停止点必须是 0 到 100(含)之间的有限 JSON 数字;停止点必须唯一且严格递增;整数与小数均合法,55.0视为同一停止点不能共存;0 和 100 端点可选;单停止点调色板合法;序列化使用实现产生的规范 JSON 数字拼写,且不得依赖 locale
  • FR2b:对同一配方、族系、模式、种子、活力度、配置文件与兼容锚点,共享停止点在紧凑、完整与自定义布局中必须产生完全相同的颜色;添加/移除其他停止点不得改变它或使其重新编号。生成的 TypeScript只暴露请求的停止键,因此省略某档会导致类型检查失败。

FR3–FR4:模式意图明确;约束与偏好分离

  • FR3:仅亮色、仅暗色、独立的明暗输入、共享候选与命名暗色变换是不同的东西。亮色阶梯不得静默变成已审查的暗色阶梯;标签不得为暗色模式反转。
  • FR4:色域有效性、单调性、精确锚点与有界锚点容差是硬约束;强度、光学平衡与灵活锚点是优化偏好。冲突必须明确失败,而不是移动精确锚点、放宽容差、替换配置文件或改变停止点布局。锚点不得把停止点 0 或 100 变成彩色值——冲突的端点锚点会失败并提示改用内部停止点。

FR5–FR8:确定性、可复现性、候选边界与配方证据

  • FR5:配方身份必须锁定色彩空间、常量、配置文件、调度、锚点、色域处理、精度、取整、序列化与打破平局规则。同一归一化请求必须在支持平台上产生字节级一致的规范候选输出,不受时间、locale、路径、网络、随机性、遍历或未记录依赖的影响。
  • FR6:候选必须携带可复现性证据:完整候选 + 一份分离记录(detached record),记录归一化请求、配方与实现版本、输出格式版本、调整、偏差及每个规范输出摘要。输出变化必然改变匹配的身份或摘要。
  • FR7:生成止步于候选。输出必须自我标识为候选,不得采用值、映射角色或宣称视觉/无障碍批准。预览是只读的。显式输出选项可把候选存为单独的 TypeScript 或 JSON 文件,但不得在无明确作者意图时覆盖已有文件。一旦被采纳,调色板就是普通作者数据;编辑后的数据不得宣称精确再生成,普通主题构建也不得重跑生成器。
  • FR8:第一个生产配方必须由规范算法与规范夹具(canonical fixtures)钉住,而非另一个实现。发布前,版本钉住的证据必须覆盖完整族系集合、渲染的明/暗上下文、色相连续性、亮度与相邻档区分度、色域、族系平衡、CVD 模拟、可复现性与性能。夹具覆盖蓝到紫、黄到棕、不成比例的族系强度,以及蓝/紫、黄/绿、红/橙的区分度。输出在被作者接受前始终是候选。

FR9–FR13:建议、再生成、校验、无障碍与零运行时成本

  • FR9:映射建议是未来的只读辅助:输入已接受调色板产物与摘要、明确的模式与角色、当前已保存值及版本化方法,返回可检查的族系、档位、确切颜色、理由与测量差异,不进行编辑。单独的显式应用动作展示目标与补丁、保留作者编辑、保存字面 CSS 值或有意的已提交调色板引用,并允许调整或拒绝。
  • FR10:再生成绝不隐式重着色主题。新候选不得替换已采纳调色板或改变已保存主题值、归一化 token、CSS、已构建运行时模块或挂载行为。已提交调色板编辑可以有意改变显式引用它的主题映射,但该源码差异与其渲染影响必须一起审查。
  • FR11:校验与构造分离。调色板检查使用主题包测试、内部测试工具或未来显式接受的 CLI checker 中的validate*/check*角色;仅校验的数据与辅助工具必须保持在 Core 运行时主题输入/输出之外。
  • FR12:无障碍是上下文性的。工具可以报告测量属性与显式配对对比度,但不得给孤立的调色板、族系、档位或建议贴"无障碍"标签。主题证据必须指明确切的前景、背景、文字大小、组件状态、模式与无颜色线索。
  • FR13:创作无运行时成本。生成器代码、色彩数学依赖、候选、可复现性数据与建议逻辑不得进入 Core 组件运行时、主题挂载、默认主题 CSS/JS 或主题包默认运行时导出。

FR14–FR16:受支持的表面保持狭窄

  • FR14generateTonalPalette(request)是纯作者函数,返回候选数据而不读写文件;astryx theme palette generate <config>是其非交互文件适配器。TypeScript 是主要提交输出(族系与档位键可被类型检查),JSON 可按需用于互操作工具。两者都不改变defineTheme()或执行语义映射。
  • FR15:视觉审查使用一个标准产物。CLI 可以显式从同一候选数据写出自包含的 HTML 预览(自我标识为palette-preview-v1,展示每个族系、模式、档位与 hex 值,无需网络资源),不得做无障碍声明,遵守与调色板输出相同的覆盖保护,且不得在无单独显式动作时打开浏览器。
  • FR16:面向 Agent 的文档与评测夹具必须区分精确/有界/灵活锚点;保留显式小数与自定义布局;未请求时省略强调色(accent);当强调色含义模糊(一个主题值还是一个明暗族系)时提问而非猜测

四、astryx-oklch-v1规范配方:逐步骤拆解

这是第一个生产配方,由规范算法与规范夹具共同钉住。在源码层面,它的完整实现位于 packages/cli/api/theme/palette/generate/generator.mjs(引擎)与 packages/cli/api/theme/palette/generate/color.mjs(色彩数学)。

4.1 归一化与色彩空间转换

  1. 把支持的种子与锚点颜色归一化为小写六位 sRGB hexnormalizeColor同时接受 3 位/6 位带或不带#的写法,见 color.mjs)。
  2. 通过标准 D65 OKLab 矩阵把 sRGB 转换到 OKLab,再以 OKLCH 表达色相与色度(srgbToLinear/linearRgbToOklab/hexToOklch)。
  3. CIELAB L* 传递函数把请求的 tone 转换为明度:tone > 8 时用((tone + 16) / 116)³,低值用tone / 903.3,结果再开立方作为 OKLab 明度(toneToOklabLightness)。

4.2 色度包络、色相平衡与高端渐隐

  • Tone 色度包络0.18 + 0.82 × sqrt(sin(π × tone / 100))toneChromaEnvelope)。
  • 色相平衡因子[70,115)为 0.94,[115,175)为 0.78,[175,230)为 0.82,[285,340)为 0.90,其余为 1(hueBalanceFactor)。
  • 橙色处理[40,70)色相在 tone < 50 时向红方向旋转最多 8 度,使低档橙色与红色族保持区分(toneAdjustedHue)。
  • 高端渐隐(smoothstep):tone > 60 时,绿色([115,175))平衡色度渐隐到 72%,青/teal([175,200))在 tone 95 时渐隐到 60%,保持亮档光学平衡而不削弱 cyan 或改变中档锚点(highToneChromaFactorsmoothstep见 generator.mjs)。

4.3 活力度、跨族协调与中性配置文件

  • 活力度(vibrancy):50 为中性。0–25 插值到乘数 0.72;25–50 从 0.72 插值到 1;>50 每点加 0.0096(vibrancyMultiplier)。测试 generator.test.mjs 验证了 vibrancy 25 的 OKLCH 色度低于 vibrancy 75。
  • 跨族协调:源色度混合 35% + 参考色度 0.18 的 65%(coordinatedChroma)。
  • 中性配置文件neutral-v1(色相 0、色度 0)、warm-v1(色相 75、色度 0.018)、cool-v1(色相 250、色度 0.018)、custom(归一化的中性种子)(neutralPolar)。

4.4 模式语义、色域与锚点

  • 停止点字面 tone 语义在两种模式一致:暗色阶梯把色度乘 0.85(DARK_CHROMA_FACTOR),但不静默移动 tone。停止点 0 在两种模式都解析为精确黑,100 为精确白;默认都包含,也可被显式自定义布局省略。测试 generator.test.mjs 验证了light[0] === dark[0] === '#000000'
  • 色域映射:超出色域的 OKLCH 候选保持明度与色相,色度通过[0, 0.4]上的 20 次二分查找求得(maxOklchChromaoklchClampedHex)。
  • 锚点:精确锚点直接替换该档;有界锚点只在声明的 OKLab 欧氏maxDeltaE内移动;灵活锚点向目标色混合 35%(applyAnchor)。锚点校正使用 smoothstep 插值,并在最近锚点之外 25 个 tone 单位处渐隐到零(applyAnchorCorrections/correctionAtStop)。
  • 终输出:各夹紧通道取整到最近 8 位整数,输出小写#rrggbb。规范 JSON 使用两空格缩进、插入有序的族系与档位、末尾一个换行。候选把请求的停止布局暴露为有序stops数组;族系阶梯对象是查找映射,不定义迭代顺序(见serializeGenerationResult)。
  • 失败语义:无效请求在产出候选前失败;族系局部的锚点冲突报告族系 ID 且不产生可采纳输出(generatePaletteSet收集errorsgenerateTonalPalette抛出聚合错误)。

4.5 规范夹具:字节级回归门禁

规范给出了四个用 SHA-256(对 UTF-8 规范 JSON)钉住的规范候选夹具:

Fixture请求摘要候选字节SHA-256
default-three-family中性#777777、蓝#0074e2、橙#d57113;双模式;vibrancy 50;21 默认档375511c40191d508274d89d631bb4e1cb662f70ff0dce6c0dec101c317f9f69d3e25
exact-anchor#0074e2;仅亮色;档 20/50/80;档 50 精确锚点#1682d5327c42929be3c4b5cb857cada078f62bb5a2242c1a22cfa4ae7546a18592540f7f3
single-custom-stop#d62830;仅暗色;档 4025888d3d69865c74c7fb14347b9967575285a7d44ab893087a08bc842bb66b29bbb
high-tone-balance绿#358a3a、teal#0c7365、cyan#0c6f82;双模式;档 60/80/95910873821574fdbe3357304dbc06986bd2e5ec88af80d0f36305626fd826c3cf07b

这四个摘要被逐字锁定在 generator.test.mjs 的测试中,作为"配方兼容性的发布门禁"。此外,单调性、相邻档距离、色相漂移、族系区分度、色域事件与 CVD 模拟被记录为完整候选的设计证据——它们成为孤立颜色的通用无障碍或对比度保证。

五、实战一:纯 APIgenerateTonalPalette()

API 文档位于 packages/cli/api/theme/generateTonalPalette.doc.mjs,签名如下:

generateTonalPalette(input: TonalPaletteGenerationInput): TonalPaletteCandidate

输入类型(源码 JSDoc 见 packages/cli/api/theme/theme.type.mjs):

字段类型默认值说明
familiesTonalPaletteFamilyInput[]必填至少一个族系;id(lower-kebab-case,black/white保留)、seed、可选namekindchromatic/neutral)、anchors
vibrancynumber50色度控制,0(最柔和)–50(默认)–100(最鲜艳)
neutralProfile'neutral-v1' \| 'warm-v1' \| 'cool-v1' \| 'custom''neutral-v1'中性族系的色相/色度配置文件
modeStrategy'light-only' \| 'dark-only' \| 'light-and-dark''light-and-dark'生成哪些模式
stopsnumber[][0,5,…,100](21 档)所有族系共享的有序档位;支持小数;可省略端点

锚点类型TonalPaletteAnchor(theme.type.mjs):

字段类型说明
mode'light' \| 'dark'锚点所在模式
stopnumber锚点应用的既有请求档位(必须在停止布局中)
colorstring目标色
policy'exact' \| 'bounded' \| 'flexible'exact保留所选色;boundedmaxDeltaE内调整;flexible作为引导向它混合
maxDeltaEnumber(可选)bounded必需的非负感知距离上限

返回类型TonalPaletteCandidateschemaVersion: 1status: 'candidate'recipe: 'astryx-oklch-v1'、独立black/white、有序stops数组、palette查找映射(每个族系含name与可选的light/dark阶梯对象)。

官方文档示例(generateTonalPalette.doc.mjs):

// 生成单个族系 generateTonalPalette({families: [{id: 'blue', seed: '#0074e2'}]}); // 保留必选品牌色:exact 锚点 generateTonalPalette({stops: [50], families: [{id: 'brand', seed: '#0074e2', anchors: [{mode: 'light', stop: 50, color: '#1682d5', policy: 'exact'}]}]}); // 允许有限移动:bounded 锚点 generateTonalPalette({stops: [50], families: [{id: 'brand', seed: '#0074e2', anchors: [{mode: 'light', stop: 50, color: '#1682d5', policy: 'bounded', maxDeltaE: 2}]}]}); // 锚点仅作引导:flexible generateTonalPalette({stops: [50], families: [{id: 'pink', seed: '#ff4db8', anchors: [{mode: 'light', stop: 50, color: '#ff4db8', policy: 'flexible'}]}]}); // 显式中间档(12.5) generateTonalPalette({stops: [12.5, 50], families: [{id: 'blue', seed: '#0074e2'}]});

该函数是纯函数:不读文件、不写文件、不做语义映射(源码见 generator.mjs)。测试 generator.test.mjs 断言返回对象包含schemaVersion: 1status: 'candidate'recipe: 'astryx-oklch-v1'black: '#000000'white: '#ffffff'

六、实战二:CLI 命令astryx theme palette generate

命令文档位于 packages/cli/clients/cli/commands/theme-palette-generate.doc.mjs,实现为themePaletteGenerate(packages/cli/api/theme/palette/generate/generate.mjs)。CLI 表面遵循 docs/architecture/cli-surface.md:命令是薄封装(parse → call → render),API 函数是脚本化、类型化且带type判别器的单一事实来源,返回theme.palette.generate信封。

6.1 命令与选项

astryx theme palette generate <config> [options]
选项说明
-o, --out <path>写入候选 TypeScript 或 JSON 文件及兄弟收据(receipt)文件
--preview <path>写入标准化的自包含 HTML 预览(palette-preview-v1
-f, --overwrite替换已存在的候选与收据文件

退出码:0= 产出候选或既有输出被保留;1= 请求无效或输出无法安全写入。

6.2 配置文件格式

配置是一个 JSON 请求对象,与TonalPaletteGenerationInput一致。测试夹具(generate.test.mjs)给出最小示例:

{ "modeStrategy": "light-only", "stops": [20, 50, 80], "families": [{"id": "blue", "seed": "#0074e2"}] }

6.3 常用用法

# 只打印预览(不写文件) astryx theme palette generate palette.config.json # 写入候选与收据 astryx theme palette generate palette.config.json --out ocean.palette.ts # 同时写入候选、收据与审查预览 astryx theme palette generate palette.config.json --out ocean.palette.ts --preview ocean.palette.html

6.4 输出产物

  • 候选文件.ts输出是可直接 import 的模块,头部注释// Generated by astryx-oklch-v1. Review before committing.,导出export const black = '#000000' as const;export const white = '#ffffff' as const;export const palette = … as const;不包含任何生成器依赖(测试断言candidate不含generateTonalPalette)。.json输出包含相同规范候选值(serializeCandidate只接受.ts.json,否则抛ERR_PALETTE_GENERATION,见 generate.mjs)。
  • 收据(receipt):与候选同名的*.receipt.json,包含schemaVersionrecipecandidateSha256(SHA-256 摘要)、可选预览摘要、归一化请求诊断信息(逐族系的单调性/相邻档 ΔE/色相漂移/色域映射档/锚点结果,以及跨族协调诊断)(receiptFor)。
  • HTML 预览:自包含、无网络资源(测试断言预览不含https?://与无障碍声明),按插入顺序渲染每个族系、模式、档位与 hex(renderRamp/renderMode,见 preview.mjs)。

6.5 安全写入保障

实现层面对"绝不隐式覆盖作者文件"做了工程化落实:

  • 原子写入:所有文件先写入独占临时文件(writeExclusiveTemporary,UUID 命名、wx独占创建),再统一发布;失败时恢复原文件(writeFilesAtomically)。
  • 不覆盖原则:无--overwrite时,任何目标文件已存在都会返回written: false, reason: 'exists'并保留作者文件(测试 generate.test.mjs 验证了跳过与显式覆盖两种行为)。
  • 路径安全:输入/输出路径通过assertWithin校验,防止路径穿越(resolveSafe);输入与输出通过文件系统身份(dev:ino)检查必须指向不同文件(assertDistinctFileIdentities)。
  • 退出行为:无输出请求时,命令只返回候选数据而不写文件。

七、确定性保证与当前状态影响

7.1 确定性如何实现

规范 FR5/FR6 在源码层面通过三件事落实:

  1. 同一版本化引擎:纯 API 与 CLI 适配器都调用generatePaletteSet(generator.mjs),配方常量由PALETTE_RECIPE = 'astryx-oklch-v1'钉住。
  2. 无环境输入:算法只依赖归一化请求与固定常量,无时间/locale/路径/网络/随机性输入。
  3. 摘要证据:收据中的candidateSha256使"输出变化必然改变摘要"可被验证。

测试还验证了停止点的布局稳定性(FR2b):full(21 档)、compact(11 档COMPACT_11_STOPS)与custom[12.5, 50, 80])布局中,共享档位产生相同颜色(generator.test.mjs)。

7.2 当前状态影响矩阵

状态必需结果
生成缺失既有主题、构建、运行时字节与支持的包范围完全不变
产生候选无源码/主题/包/运行时输出变化
接受调色板精确值进入 AST-018 拥有的形状(若被接受);主题记录拥有采纳证据
产生建议源码与输出不变
接受映射一次已审查补丁保存显式值;失败不留部分编辑
生成新候选已采纳调色板与渲染输出在显式审查与保存前不变
编辑已采纳调色板字面映射不变;显式引用有意变化并被审查

八、验证范围与决策记录

8.1 验证要求

规范要求验证覆盖:跨平台确定性向量;硬失败;每个候选来源与溯源状态;完整族系回归/CVD 证据;候选对已接受的同一性;可选原子 suggest/apply;运行时/默认包中无生成器代码;已接受映射的真实 Chromium 证据。本规范 PR 本身不改变任何运行时、构建、主题或包行为,也不携带 Changeset。

8.2 关键决策(Decision log)

决策内容决策者/日期
DEC-5 & DEC-9保留完整配方证据:仅凭色彩空间名或孤立阶梯不能定义生产配方;OKLCH 方向必须由完整创作要求与对比证据支撑cixzhang,2026-09-01/02
DEC-10已接受调色板是提交快照:否决旧 DEC-8 的"调色板感知 defineTheme/expandColorScale"方向;映射用字面 CSS 值或显式快照引用;生成绝不隐式运行cixzhang,2026-09-03
DEC-11一个创作引擎、两个适配器:CLI 主题创作工作流是首个消费者;generateTonalPalette()无文件副作用,astryx theme palette generate增加预览与显式文件输出;两者共用astryx-oklch-v1引擎,均不进入 Core/defineTheme()cixzhang,2026-09-03
DEC-12生成器默认值不限制调色板作者:默认 21 档0,5,…,100,接受任意非空数值档位列表;每个候选暴露独立黑/白;生成 TS 命名black/white(如neutralPalettes.black/neutralPalettes.white),名字对族系 ID 保留rubyycheung,2026-09-03
DEC-13中间档显式生成:紧凑与完整预设共享同一 0–100 tone 坐标系;需要 12.5 之类中间值就在生成时请求它,提交的 TS 会暴露family[12.5]实际类型键;否决重新编号与运行时family.get(12.5)cixzhangrubyycheung,2026-09-03

规范开放问题为空;实现 PR 仍需在成为受支持公共工具前钉住并验证确切配方——那是实现证据,而非开放的视觉方向决策。

九、与相邻架构的关系

  • CLI 表面astryx theme palette generate遵循 docs/architecture/cli-surface.md 的命令、响应、错误、文档、支持与写入契约;API 函数持有自身信封的type判别器。
  • 主题编译/归一化:AST-008 明确不改变生产级defineTheme归一化与编译(见 docs/architecture/theme-compilation.md 与 docs/architecture/theme-application.md 的既有主题架构);生成系统独立于 Core 主题运行时。
  • 已接受调色板形状:由 docs/specs/AST-018/spec.md 提案负责所有权、校验边界与运行时主题分离。

十、给主题作者的实践建议

  1. 先默认后定制:从 21 档默认布局与vibrancy: 50neutral-v1开始;用astryx theme palette generate palette.config.json只读预览,满意后再加--out
  2. 把锚点当作者意图来用:品牌色用exact;允许微调用bounded+ 合理的maxDeltaE(如 2);只想给方向用flexible。端点 0/100 锚点必须保持精确黑/白。
  3. 需要中间值就显式请求:如stops: [12.5, 50, 80],提交的 TS 会给出可类型检查的family[12.5]
  4. 接受后即作者数据:用--out提交候选 + 收据;审查*.receipt.json的归一化请求与诊断;把调色板作为主题自有快照提交,后续手工编辑不必保留生成溯源。
  5. 审查而非盲信:候选的单调性、相邻档 ΔE、色相漂移与 CVD 模拟是设计证据;对比度与无障碍必须在具体的前景/背景/文字大小/组件状态/模式上下文中验证(FR12)。
  6. 代理(Agent)协作要点(FR16):明确锚点类型;保留小数与自定义布局;未请求时不要凭空造强调色;遇到歧义强调色时,先问清它是一个主题值还是一个明暗族系,而不是猜测。

结语

AST-008 为 Astryx 奠定了"可重复、可审查、作者所有"的调色板生成哲学:生成是候选,接受才是数据;引擎版本化,输出确定性,收据可审计;生成永远不进入运行时。无论你通过generateTonalPalette()编程式创作,还是通过astryx theme palette generate在命令行工作,你都在同一个astryx-oklch-v1引擎之上工作——而规范中的四个 SHA-256 夹具,正是这个引擎跨平台可复现性的最终裁判。相关源码入口:引擎与归一化 packages/cli/api/theme/palette/generate/generator.mjs、色彩数学 packages/cli/api/theme/palette/generate/color.mjs、文件适配器 packages/cli/api/theme/palette/generate/generate.mjs、类型定义 packages/cli/api/theme/theme.type.mjs、回归测试 packages/cli/api/theme/palette/generate/generator.test.mjs 与 packages/cli/api/theme/palette/generate/generate.test.mjs。

【免费下载链接】astryxAn open source design system that's fully customizable and agent ready项目地址: https://gitcode.com/GitHub_Trending/as/astryx

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询