:astryx-oklch-v1 配方与作者工作流完全指南)
Astryx 调色板生成系统AST-008astryx-oklch-v1 配方与作者工作流完全指南【免费下载链接】astryxAn open source design system thats fully customizable and agent ready项目地址: https://gitcode.com/GitHub_Trending/as/astryxAstryx 是一个fully customizable and agent ready的开源设计系统其 CLIpackages/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不做以下事情不向DefineThemeInput、DefinedTheme、defineTheme、expandColorScale、运行时挂载或主题编译中加入任何调色板数据/生成/映射逻辑不要求手工创作或导入的数据带有生成溯源provenance不定义调色板的形状、校验、关联、继承或产物这部分归 AST-018 提案负责不把某个调色板停止点变成语义 token、实时查找、设计审批或无障碍保证。二、所有权模型与作者生命周期规范用两张表格明确了谁负责什么和作者流程长什么样。所有权OwnershipOwner契约ContractAST-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 档重复这两个值。black与white两个族系 ID 被保留给这两个独立值。FR2a–FR2b停止点语法精确、数值是稳定坐标FR2a每个停止点必须是 0 到 100含之间的有限 JSON 数字停止点必须唯一且严格递增整数与小数均合法5与5.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 归一化与色彩空间转换把支持的种子与锚点颜色归一化为小写六位 sRGB hexnormalizeColor同时接受 3 位/6 位带或不带#的写法见 color.mjs。通过标准 D65 OKLab 矩阵把 sRGB 转换到 OKLab再以 OKLCH 表达色相与色度srgbToLinear/linearRgbToOklab/hexToOklch。用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其余为 1hueBalanceFactor。橙色处理[40,70)色相在 tone 50 时向红方向旋转最多 8 度使低档橙色与红色族保持区分toneAdjustedHue。高端渐隐smoothsteptone 60 时绿色[115,175)平衡色度渐隐到 72%青/teal[175,200)在 tone 95 时渐隐到 60%保持亮档光学平衡而不削弱 cyan 或改变中档锚点highToneChromaFactorsmoothstep见 generator.mjs。4.3 活力度、跨族协调与中性配置文件活力度vibrancy50 为中性。0–25 插值到乘数 0.7225–50 从 0.72 插值到 150 每点加 0.0096vibrancyMultiplier。测试 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.85DARK_CHROMA_FACTOR但不静默移动 tone。停止点 0 在两种模式都解析为精确黑100 为精确白默认都包含也可被显式自定义布局省略。测试 generator.test.mjs 验证了light[0] dark[0] #000000。色域映射超出色域的 OKLCH 候选保持明度与色相色度通过[0, 0.4]上的 20 次二分查找求得maxOklchChroma、oklchClampedHex。锚点精确锚点直接替换该档有界锚点只在声明的 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-256default-three-family中性#777777、蓝#0074e2、橙#d57113双模式vibrancy 5021 默认档375511c40191d508274d89d631bb4e1cb662f70ff0dce6c0dec101c317f9f69d3e25exact-anchor蓝#0074e2仅亮色档 20/50/80档 50 精确锚点#1682d5327c42929be3c4b5cb857cada078f62bb5a2242c1a22cfa4ae7546a18592540f7f3single-custom-stop红#d62830仅暗色档 4025888d3d69865c74c7fb14347b9967575285a7d44ab893087a08bc842bb66b29bbbhigh-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[]必填至少一个族系idlower-kebab-caseblack/white保留、seed、可选name、kindchromatic/neutral、anchorsvibrancynumber50色度控制0最柔和–50默认–100最鲜艳neutralProfileneutral-v1 \| warm-v1 \| cool-v1 \| customneutral-v1中性族系的色相/色度配置文件modeStrategylight-only \| dark-only \| light-and-darklight-and-dark生成哪些模式stopsnumber[][0,5,…,100]21 档所有族系共享的有序档位支持小数可省略端点锚点类型TonalPaletteAnchortheme.type.mjs字段类型说明modelight \| dark锚点所在模式stopnumber锚点应用的既有请求档位必须在停止布局中colorstring目标色policyexact \| bounded \| flexibleexact保留所选色bounded在maxDeltaE内调整flexible作为引导向它混合maxDeltaEnumber可选bounded必需的非负感知距离上限返回类型TonalPaletteCandidateschemaVersion: 1、status: 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: 1、status: candidate、recipe: astryx-oklch-v1、black: #000000、white: #ffffff。六、实战二CLI 命令astryx theme palette generate命令文档位于 packages/cli/clients/cli/commands/theme-palette-generate.doc.mjs实现为themePaletteGeneratepackages/cli/api/theme/palette/generate/generate.mjs。CLI 表面遵循 docs/architecture/cli-surface.md命令是薄封装parse → call → renderAPI 函数是脚本化、类型化且带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.html6.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包含schemaVersion、recipe、candidateSha256SHA-256 摘要、可选预览摘要、归一化请求与诊断信息逐族系的单调性/相邻档 ΔE/色相漂移/色域映射档/锚点结果以及跨族协调诊断receiptFor。HTML 预览自包含、无网络资源测试断言预览不含https?://与无障碍声明按插入顺序渲染每个族系、模式、档位与 hexrenderRamp/renderMode见 preview.mjs。6.5 安全写入保障实现层面对绝不隐式覆盖作者文件做了工程化落实原子写入所有文件先写入独占临时文件writeExclusiveTemporaryUUID 命名、wx独占创建再统一发布失败时恢复原文件writeFilesAtomically。不覆盖原则无--overwrite时任何目标文件已存在都会返回written: false, reason: exists并保留作者文件测试 generate.test.mjs 验证了跳过与显式覆盖两种行为。路径安全输入/输出路径通过assertWithin校验防止路径穿越resolveSafe输入与输出通过文件系统身份dev:ino检查必须指向不同文件assertDistinctFileIdentities。退出行为无输出请求时命令只返回候选数据而不写文件。七、确定性保证与当前状态影响7.1 确定性如何实现规范 FR5/FR6 在源码层面通过三件事落实同一版本化引擎纯 API 与 CLI 适配器都调用generatePaletteSetgenerator.mjs配方常量由PALETTE_RECIPE astryx-oklch-v1钉住。无环境输入算法只依赖归一化请求与固定常量无时间/locale/路径/网络/随机性输入。摘要证据收据中的candidateSha256使输出变化必然改变摘要可被验证。测试还验证了停止点的布局稳定性FR2bfull21 档、compact11 档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 方向必须由完整创作要求与对比证据支撑cixzhang2026-09-01/02DEC-10已接受调色板是提交快照否决旧 DEC-8 的调色板感知 defineTheme/expandColorScale方向映射用字面 CSS 值或显式快照引用生成绝不隐式运行cixzhang2026-09-03DEC-11一个创作引擎、两个适配器CLI 主题创作工作流是首个消费者generateTonalPalette()无文件副作用astryx theme palette generate增加预览与显式文件输出两者共用astryx-oklch-v1引擎均不进入 Core/defineTheme()cixzhang2026-09-03DEC-12生成器默认值不限制调色板作者默认 21 档0,5,…,100接受任意非空数值档位列表每个候选暴露独立黑/白生成 TS 命名black/white如neutralPalettes.black/neutralPalettes.white名字对族系 ID 保留rubyycheung2026-09-03DEC-13中间档显式生成紧凑与完整预设共享同一 0–100 tone 坐标系需要 12.5 之类中间值就在生成时请求它提交的 TS 会暴露family[12.5]实际类型键否决重新编号与运行时family.get(12.5)cixzhang、rubyycheung2026-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 提案负责所有权、校验边界与运行时主题分离。十、给主题作者的实践建议先默认后定制从 21 档默认布局与vibrancy: 50、neutral-v1开始用astryx theme palette generate palette.config.json只读预览满意后再加--out。把锚点当作者意图来用品牌色用exact允许微调用bounded 合理的maxDeltaE如 2只想给方向用flexible。端点 0/100 锚点必须保持精确黑/白。需要中间值就显式请求如stops: [12.5, 50, 80]提交的 TS 会给出可类型检查的family[12.5]。接受后即作者数据用--out提交候选 收据审查*.receipt.json的归一化请求与诊断把调色板作为主题自有快照提交后续手工编辑不必保留生成溯源。审查而非盲信候选的单调性、相邻档 ΔE、色相漂移与 CVD 模拟是设计证据对比度与无障碍必须在具体的前景/背景/文字大小/组件状态/模式上下文中验证FR12。代理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 thats fully customizable and agent ready项目地址: https://gitcode.com/GitHub_Trending/as/astryx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考