Onyx 前端开发规范指南:基于 Opal 设计系统的 web/ 与 desktop/ 编码标准

发布时间:2026/11/5 10:32:46

Onyx 前端开发规范指南:基于 Opal 设计系统的 web/ 与 desktop/ 编码标准 Onyx 前端开发规范指南基于 Opal 设计系统的 web/ 与 desktop/ 编码标准【免费下载链接】danswerOpen Source AI Platform - AI Chat with advanced features that works with every LLM项目地址: https://gitcode.com/GitHub_Trending/da/danswer导读本文基于 web/CLAUDE.md 整理而成它定义了 Onyx 前端web/目录的 Next.js 应用与desktop/目录的 Tauri 外壳的统一开发标准。核心思想是所有 UI 一律来自 Opal 设计系统opal/*与refresh-components禁止直接使用原生 HTML 控件、裸文本节点与旧组件库。读完本文你将掌握组件来源的优先级选择、设计 Token 与暗色模式的正确用法、i18n 国际化与类型安全的强制约定以及组件测试与 E2E 测试的执行方式可直接套用到 Onyx 前端的日常开发中。适用范围与文件约定这些标准同时适用于web/与desktop/。仓库约定每个 Opal 组件与布局旁边都带有一个README.md说明其架构、props 与用法示例例如 Opal components 目录 中的组件级 README。规范原文明确要求Read that README instead of guessing props—— 在使用某个组件前必须先读它旁边的 README而不是靠猜 props。从仓库根目录的 AGENTS.md 可以确认前端技术栈为Next.js 16、React 19、TypeScript、Tailwind CSSweb/lib/opal与web/lib/shared以 workspace 形式作为本地包onyx-ai/opal、onyx-ai/shared见 web/package.json。web/AGENTS.md 是前端规范的完整入口本文所依据的web/CLAUDE.md是其核心内容摘要。组件来源优先级顺序与禁用清单规范的组件引入顺序优先级从高到低如下web/lib/opal/src/opal/*设计系统本体是 UI 的第一来源。web/src/refresh-components/尚未沉淀进 Opal 的生产组件。web/src/sections/功能组合件实体卡片位于sections/cards/与web/src/layouts/。严禁从web/src/components/引入任何内容 —— 它是遗留代码且正在被删除。唯一的例外是src/components/icons/icons.tsx中的createLogoIcon已在仓库中确认该文件存在。opal/*内部又分两层对应 core README 中像 Rust 的corecrate 一样的比喻opal/core最底层的原语Interactive、Animations等用于构建组件应用代码不应直接使用。opal/components与opal/layouts基于 core 构建的高层组件是应用代码的消费入口如Button、OpenButton、SelectButton、Tag见 components README。常见场景的标准组件选择场景应使用的组件管理页与设置页SettingsLayouts.{Root,Header,Body}来自opal/layouts图标 标题 描述Content或ContentActionopal/layouts空状态与错误页IllustrationContent按钮Buttonopal/components禁用裸button输入类Opal 或 refresh-components禁用裸input、textarea、select文本Textopal/components用font与colorprops禁止裸文本节点图标仅限opal/icons禁止lucide-react或react-icons悬停显现Hoverableopal/core若必须手写需加no-hover:opacity-100以兼容触屏设备关于图标缺失的处理流程若opal/icons中缺少所需图标应通过 Figma MCP 工具从 Figma 引入并添加到lib/opal/src/icons/目录中该目录已在仓库中确认存在。refresh-components 的覆盖范围很广仓库中实际包含AreaChart、Calendar、Chip、Collapsible、DateRangePicker、FrostedDiv、Keycap、PreviewImage、SimplePopover、SimpleTabs等组件以及avatars/、buttons/、cards/、form/、inputs/、messages/、modals/、texts/、tiles/等子目录每个组件旁通常伴随.stories.tsx或.test.tsx文件如DateRangePicker.test.tsx。有原因的规则设计 Token、暗色模式与数据获取禁止dark:Tailwind 修饰符设计 Token 已同时定义明暗两套主题仓库web/lib/shared/tokens/下即有semantic-light.json与semantic-dark.json手动覆盖会破坏暗色模式。因此整个代码库禁止使用dark:修饰符唯一允许使用的是createLogoIcon。禁止内置 Tailwind 颜色不得使用bg-gray-100、text-blue-600这类内置颜色类必须使用 Token 类包括text-0Xbackground-neutral-0Xbackground-tint-0Xborder-0Xaction-selection-0Xaction-danger-0Xstatus-{info,success,warning,error}-0Xtheme-*Token 定义位于 web/lib/shared/tokens/包含primitives.json、semantic-light.json、semantic-dark.json、shadow.json、size.json、typography-presets.json、typography.json等文件由 style-dictionarystyle-dictionary.config.mjs统一管理确保明暗两套语义在同一套 Token 体系内联动。文本 props 接受 Markdown任何渲染为可见文本的 proptitle、description、label应声明为string | RichStr来自opal/types并用Text渲染。调用方通过markdown()opal/utils显式启用解析纯字符串永远不会被当作 Markdown 解析。尺寸 props 默认md当 prop 类型是opal/types的SizeVariants或其子集时默认值统一为md。从 types.ts 源码可见完整尺寸阶梯fit | full | xl | lg | md | sm | xs | 2xs并衍生出ContainerSizeVariants排除full、xl等便捷类型。优先 padding避免包 div使用组件的paddingprop 而非在外面套一层div若库组件没有该 prop应优先给组件本身增加 prop而不是添加 wrapper。数据获取useSWR数据获取统一在客户端、需要数据的组件内部使用useSWR加载期间展示 loader禁止在页面顶层拉取数据再向下传递。这与 AGENTS.md 中调用后端一律经由前端如http://localhost:3000/api/persona而非http://localhost:8080/api/persona的约定配合使用。代码风格约定绝对导入/指向src/opal/指向 Opal禁止../相对路径。函数声明组件用function声明不用箭头函数。类型组织props 接口FooProps与组件放在同一文件共享类型放入同目录的types.ts。interfaces.ts是旧命名碰到时应改名。类名拼接使用cnopal/utils禁止模板字符串拼接。Hooks 归属业务 feature hooks 放web/src/lib/feature/hooks.ts不依赖应用知识的 UI hooks 放 Opalweb/src/hooks/是最后的选择。i18nnext-intl约定禁止硬编码面向用户的字符串src/下的裸文本会触发 oxlint 规则i18n/no-raw-jsx-text而失败。客户端用useTranslations(namespace)服务端用await getTranslations(...)。单一事实来源web/src/i18n/messages/en.json 是英文源文件新增或修改 key 时必须为该目录下所有其他语言文件提供最佳翻译。缺失或多余的 key 会导致types:check失败各语言之间的 ICU 结构必须一致由 web/src/i18n/tests/catalog.test.ts 校验。Key 命名规范namespace.section.element.rolecamelCase例如settings.appearance.colorMode.title。英文文案的措辞修改不会改变 key。ICU参数与复数一律用 ICU 语法禁止拼接翻译片段。日期与数字使用useFormatter与useLocale禁止硬编码en-US。逻辑属性新样式使用ms-、pe-、start-等逻辑属性而非ml-、pr-、left-。仓库中web/src/i18n/目录实际包含messages/、config.ts、config.test.ts、request.ts、types.d.ts与__tests__/i18n 管道与类型生成均已就位。测试约定组件测试Jest React Testing Library规范见 web/tests/README.md。E2E 测试Playwright硬性规则Page Object Model、locator 优先级见 web/tests/e2e/README.md。运行 E2E 测试必须使用cd web bun run playwright TEST_NAME不要使用bunx或npx因为它们可能拉取未锁定版本的 Playwright。根目录 AGENTS.md 还提示Playwright 全局 setup 会创建管理员账号admin_userexample.com/TestPassword123!见 web/tests/e2e/constants.ts应用运行于http://localhost:3000。相关 npm scripts 见 web/package.jsonlintoxlint、types:checknext typegentsc --noEmit、formatoxfmt、testjest、playwrightplaywright test、storybookStorybook dev server等。总结Onyx 前端规范的核心可以浓缩为三句话组件来源有纪律优先 Opal → refresh-components → sections/layouts绝不触碰正在删除的旧components/。样式必须走 Token不用dark:、不用内置 Tailwind 颜色明暗主题由 Token 统一驱动。国际化与类型检查是硬门槛所有用户可见字符串走 next-intl 与en.json单一事实源缺 key 或 ICU 结构不一致都会让 CI 失败。对于任何 Opal 组件先读它旁边的 README 再使用 —— 这是避免踩坑、保持前端代码库长期一致性的最佳实践。【免费下载链接】danswerOpen Source AI Platform - AI Chat with advanced features that works with every LLM项目地址: https://gitcode.com/GitHub_Trending/da/danswer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/31 0:59:00

超短脉冲光纤线性传输仿真:高斯脉冲与初始啁啾的频谱解析

简介:面向光纤通信、超短脉冲激光及非线性光纤光学方向的 MATLAB 仿真资源,围绕超短高斯脉冲在光纤内传输时的初始啁啾特性展开,重点呈现高斯脉冲信号频谱及啁啾对脉冲展宽与压缩的影响,适合课程设计、科研入门或激光器脉冲分析等…

2026/10/28 21:01:34

嵌入式低功耗设计的物理层真相:从LDO震荡到PCB地弹

1. 从智能锁“修两次、飞线三周”看低功耗设计的真相智能锁修了两次,板子飞线调了三周——这句话不是段子,是我上个月在客户现场蹲点时的真实记录。客户那批AXU15EGP系列嵌入式开发板做的智能锁,出厂测试电流18μA,贴片量产之后待…

2026/11/5 12:04:19

下班回消息也算加班:北京法院给隐形加班划线

宝企通云关怀:下班后的关怀别变成打扰图1:北京法院:下班后线上沟通满足条件应认定加班一、热搜里发生了什么据人民网报道,北京多家法院发布劳动争议典型案例,首次以司法判决形式明确:下班后线上沟通、节假日…

2026/11/5 11:39:15

PostgreSQL数据类型选择指南与性能优化实践

1. PostgreSQL数据类型概述PostgreSQL作为一款功能强大的开源关系型数据库,其数据类型系统之丰富远超大多数同类产品。我在实际项目中最常遇到的问题是:面对十几种数字类型、多种字符串类型以及各种特殊类型时,开发团队往往凭直觉选择&#x…

2026/11/5 11:34:12

Simulink S-function执行时序与状态管理原理详解

简介:本资源是面向MATLAB/Simulink初学者与控制系统建模学习者的S-Function入门实践包,聚焦自定义系统函数开发这一核心能力,解决标准库无法覆盖的特定数学运算与动态逻辑建模需求。压缩包共4个文件(2个M文件实现核心算法逻辑&…

2026/11/5 11:34:12

低空经济三维智能感知与实时调度技术解析

1. 低空经济三维空间智能感知与管控体系概述低空经济作为新兴经济形态,正在全球范围内快速发展。根据国际航空运输协会(IATA)预测,到2030年,全球城市空中交通市场规模将达到1.5万亿美元。在这一背景下,《低…

2026/11/5 11:34:12

链表数据结构与PTA解题技巧详解

1. 链表基础与数据结构课程实践 链表作为线性表的链式存储结构,是数据结构课程中承前启后的关键内容。在山东理工大学(SDUT)的数据结构与算法课程体系中,链表章节通常安排在顺序表之后、树结构之前,这种教学顺序设计体…

2026/11/5 11:34:12

Simulink S-Function核心机制与两个经典C示例解析

简介:本资源是面向MATLAB/Simulink初学者与控制系统建模学习者的S-Function入门实践包,聚焦自定义系统函数开发这一核心能力,解决标准库无法覆盖的特定数学运算与动态逻辑建模需求。压缩包共4个文件(2个M文件实现核心算法逻辑&…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑