TinyMCE 官方 React 组件库 oxide-components:安装、架构与开发指南
前端富文本UI组件【免费下载链接】tinymceThe worlds #1 JavaScript library for rich text editing. Available for React, Vue and Angular项目地址https://gitcode.com/gh_mirrors/ti/tinymce点击查看免费下载oxide-components是 TinyMCE 富文本编辑器官方维护的 React 组件库它把编辑器界面中复用的 UI 部件按钮、菜单、下拉框、提示气泡、手风琴等以类型安全的 TypeScript 组件形式沉淀下来并深度集成 TinyMCE 的 Oxide 设计系统。读完本文你将掌握该组件库的安装方式、组件清单、源码架构、键盘导航与样式迁移机制以及完整的本地开发与测试流程。一、项目定位TinyMCE 的 React UI 组件集合根据 README.md 的定义oxide-components是a collection of various react components that would be used in the TinyMCE editor——即一组用于构建 TinyMCE 编辑器界面的 React 组件集合。它不是一个独立可用的 UI 框架而是与 TinyMCE 编辑器生态深度绑定组件的外观样式由 modules/oxide 设计系统提供底层依赖则来自 TinyMCE 生态的基础库。从 package.json 可以看到其核心依赖ephox/katamari函数式工具集数组、对象、类型判断等ephox/sugarDOM 操作与遍历工具ephox/sand浏览器特性探测与平台判断peerDependencies 要求react与react-dom均为^18.3.1。组件库由 vite.config.ts 以 library 模式构建入口为 src/main/ts/main.ts产物输出为 ES 格式formats: [es]到lib/main.js同时把react、react-dom等外部化避免重复打包。二、安装方式oxide-components以 npm 包形式发布官方包名为tinymce/oxide-components。按 README.md 的说明通过 npm 即可安装npm install tinymce/oxide-components由于该包将react和react-dom声明为 peerDependencies安装时宿主项目必须自行提供 React 18.3.1 及以上版本包本身不会捆绑 React 运行时。需要说明的是当前仓库中的 package.json 标记了private: true且版本号为0.0.2说明该模块仍在 TinyMCE monorepo 内部迭代演进中。三、组件清单与目录结构组件库的公开 API 全部由 src/main/ts/main.ts 统一导出主要分为四类1. 通用 UI 组件src/main/ts/components/组件源码位置用途Button/IconButtoncomponents/button / components/iconbutton基础按钮与纯图标按钮Menu/MenuRenderercomponents/menu菜单含Item、ToggleItem、SubmenuItem、DividerDropdowncomponents/dropdown下拉弹出层基于 CSS anchor positioning 定位Tooltipcomponents/tooltip提示气泡暴露tooltipsEventTargetAlertcomponents/alert提示/告警条Accordioncomponents/accordion手风琴折叠面板Card/CardListcomponents/card卡片与卡片列表Confirmation/ConfirmationHost/useConfirmationApicomponents/confirmation确认对话框及命令式 APIContextToolbarcomponents/contexttoolbar上下文工具栏Draggablecomponents/draggable拖拽容器ExpandableBoxcomponents/expandablebox可展开/收起盒子FloatingSidebarcomponents/floatingsidebar悬浮侧边栏Iconcomponents/icon图标渲染SegmentedControlcomponents/segmentedcontrol分段选择控件ToolbarInputFormcomponents/toolbarInputForm工具栏输入表单AutoResizingTextareacomponents/autoresizingtextarea自适应高度文本域2. AI 定制组件src/main/ts/bespoke/tinymceai/针对 TinyMCE 的 AI 能力提供三个专用部件UserPromptBubble用户提示气泡、Spinner加载指示器、Tag标签。3. 键盘导航系统src/main/ts/keynav/这是一套完整的可访问性基础设施通过 React HooksKeyboardNavigationHooks.ts将键盘事件绑定到组件支持多种导航模式FlowTypekeyboard/flowtype焦点在容器内按流向移动TabbingType / SpecialType / ExecutionType / EscapingTypekeyboardTab 切换、特殊键、回车执行、Esc 逃逸等navigation/子目录提供底层焦点移动算法ArrNavigation、DomNavigation、DomPinpoint等。例如Menu.Root内部使用useFlowKeyNavigation建立流向导航并在挂载时聚焦第一个可用项。4. 工具与上下文src/main/ts/utils/、contexts/Bem.ts类型安全的 BEM 类名生成器直接引用tinymce/oxide/skins/ui/default/skin.ts导出的Classes类型做编译期校验ContentUiBem.ts面向内容区content UI的 BEM 助手FocusHelpers.ts焦点管理UniverseContext通过UniverseProvider/useUniverse向组件注入编辑器环境资源UniverseTypes.tsx。四、源码级架构模式1. 类型安全的 BEM 类名每个组件都通过Bem.block/Bem.element生成 Oxide 皮肤类名。以 Button.tsx 为例variant属性primary/secondary/outlined/naked与active状态会被编译为对应 BEM 类// variantprimary, activetrue 时生成 tox-button tox-button--active className{${calculateClassFromVariant(variant, { enabled: active })} ${className ?? }}Bem.ts 的核心价值在于它用 TypeScript 模板字面量类型把Classes拆解为Block、BlockModifier、BlockElement、BlockElementModifier四类从而在编译期就禁止写出 Oxide 皮肤中不存在的类名。需要留意的是类型约束作用在输入参数上block()返回的仍是普通string。2. Storybook 驱动的开发模式每个组件都有配套的Component.stories.tsx如 Button.stories.tsx用于文档与交互演示按 CONTRIBUTING.md 的约定组件文件、stories 文件、工具文件ComponentUtils.ts三者分离复杂逻辑不混入 UI 代码。3. 组合示例Tooltip Dropdown 同触发器CLAUDE.md 给出了一种典型组合Tooltip.Trigger与Dropdown.Trigger都基于cloneElement注入事件处理器可以嵌套使用Dropdown.Root Tooltip.Root Tooltip.Trigger Dropdown.Trigger Button active{isOpen} ... / /Dropdown.Trigger /Tooltip.Trigger Tooltip.Content text{tooltipText} / /Tooltip.Root Dropdown.Content onOpenChange{setIsOpen} Menu.Root.../Menu.Root /Dropdown.Content /Dropdown.Root其原理是Dropdown.Trigger会把...props透传给按钮子元素从而转发Tooltip.Trigger注入的鼠标/焦点事件处理器两个组件的 ref 最终通过 ref 转发链指向同一个按钮 DOM 节点。五、开发、构建与测试工作流常用脚本来自 package.json 与 CLAUDE.mdbun install # 安装依赖monorepo 内 bun dev # 启动 Vite 开发服务器默认打开 src/demo/html/index.html bun start # 启动 Storybook 开发服务器端口 6006 bun run build # 完整生产构建Storybook 库构建tsc -b vite build bun lint # ESLint 检查--max-warnings0零警告门槛测试采用 Vitest 三项目结构见 vitest.config.tsatomicNode.js 环境单测src/test/ts/atomic/**/*.spec.tsbrowser基于 Playwright 的真实浏览器交互测试src/test/ts/browser/**/*.spec.{ts,tsx}visual视觉回归测试*.visual.spec.{ts,tsx}使用renderVisual辅助函数渲染真实组件状态并通过toMatchScreenshot比对截图基线存放在__screenshots__/目录。视觉回归有严格的平台约定基线始终以 Linux 渲染为准。本地开发时应通过 Docker/Colima 启动的 Playwright 浏览器服务器执行直接在本机跑 visual 项目会污染 Linux 基线。相关命令bun run test-browser-headless # 无头浏览器测试 bun run test-browser-manual # 可见浏览器测试 bun run test-visual-local # 本地视觉回归可追加文件过滤如 Button.visual bun run test-visual-local-update # 更新视觉回归基线截图首次克隆仓库还需拉取 git-lfs 中的截图基线git lfs fetch git lfs pull。新增组件规范按 CONTRIBUTING.md 的流程在src/main/ts/components/新建组件目录 → 添加Component.tsx→ 编写.stories.tsx→ 在src/test/ts/browser/components/添加行为测试与ComponentName.visual.spec.tsx视觉回归 → 在 main.ts 中导出。六、样式架构从 LESS 到 CSS Custom Properties 的三阶段迁移oxide-components的样式不内联在组件里而是统一收敛到Oxide设计系统modules/oxide以保证与既有皮肤向后兼容。根据 STYLING.md当前正在经历LESS → CSS的迁移划分为三个阶段阶段说明关键特征Legacy遗留组件完全用 LESS 样式化无现代 CSS 特性完全依赖 LESS 变量Transitional过渡在既有 LESS 样式中引入现代 CSSCSS Custom Properties 由特性开关控制LESS 变量仍存在CSS 回退到 LESS与旧皮肤向后兼容Modern CSS现代完全现代化版本纯现代 CSSLESS 彻底移除不再依赖 LESS 变量属破坏性变更旧皮肤不再支持约定所有新组件都应直接按 Transitional 阶段编写以最小化技术债累积。Transitional 阶段的七步迁移法TRANSITIONALCSS.md 给出了详细的操作指南用特性开关保护自定义属性在custom-properties-enabled true时才定义 CSS Custom Properties该开关定义于 modules/oxide/src/less/theme/globals/feature-flags.less.tox-button when (custom-properties-enabled true) { --tox-private-btn-padding: 4px; }新变量统一加tox-private前缀明确表示内部、非公开用途迁移期间可安全调整不会影响客户未来这些变量将演化为皮肤 API 并去掉private前缀。自定义属性必须带 LESS 回退值因为开关关闭时变量根本不存在回退可以是组件 LESS 变量、全局 LESS 变量或固定值.tox-button { padding: var(--tox-private-btn-padding, btn-padding); // 回退到组件 LESS 变量 border-radius: var(--tox-private-btn-border-radius, control-border-radius); // 回退到全局 LESS 变量 height: var(--tox-private-control-height, 36px); // 回退到固定值 }优先使用全局自定义属性避免局部重复定义全局变量同样带tox-private前缀如var(--tox-private-text-color, text-color)。共享变量提升到全局作用域被多个组件复用的 LESS 变量其对应 CSS Custom Property 应提升为全局组件变量禁止被其他组件交叉引用。颜色计算改用相对颜色语法LESS 的darken(bg, 6%)/lighten(bg, 14%)对应 CSS 的hsl(from ...)通道调整hsl(from var(--tox-private-bg) h s calc(l - 6)); hsl(from var(--tox-private-bg) h s calc(l 14));选择hsl()是因为它能直接操作lightness通道from关键字让浏览器从任意合法 CSS 颜色中提取通道值。用light-dark()取代主题相关 LESS 逻辑避免contrast()、.bg-luma-checker等 LESS 函数改用light-dark()与相对颜色.tox-button when (custom-properties-enabled true) { --tox-private-btn-bg: light-dark(#fff, #000); --tox-private-btn-bg: light-dark( hsl(from var(--tox-private-bg) h s calc(l 14)), hsl(from var(--tox-private-bg) h s calc(l - 6)) ); }关于light-dark()的主题控制TRANSITIONALCSS.md 特别说明了全局变量--tox-private-color-scheme的三种取值light强制编辑器仅使用浅色模式等价于当前默认模式dark强制编辑器仅使用深色模式等价于当前深色模式light dark让编辑器通过light-dark()动态跟随终端用户的系统主题这是最现代、系统集成度最高的方案。整个迁移的最终目标是CSS Custom Properties 中的声明保持纯 CSS避免混入 LESS 逻辑从而为平滑进入 Modern CSS 阶段铺路。七、文档资源速查项目定位与安装README.md样式迁移总览与三阶段定义STYLING.mdLegacy 组件到 Transitional 的完整转换指南TRANSITIONALCSS.md架构说明、开发流程与贡献规范CONTRIBUTING.md面向 AI 编码助手的项目速览命令、组件模式、测试约定CLAUDE.md变更记录CHANGELOG.md组件库本身基于 Storybook 提供交互式文档本地运行bun start后访问 http://localhost:6006 即可浏览全部组件的示例与 API 说明这也是理解各组件 props 与行为的最直观入口。赞分享前端富文本UI组件【免费下载链接】tinymceThe worlds #1 JavaScript library for rich text editing. Available for React, Vue and Angular项目地址https://gitcode.com/gh_mirrors/ti/tinymce点击查看免费下载相关推荐10分钟上手CloudProxy从安装到获取第一个代理IP的完整流程10分钟上手CloudProxy从安装到获取第一个代理IP的完整流程 CloudProxy是一款强大的云代理管理工具能够帮助用户轻松隐藏爬虫IP通过跨多个carbon-components-react 使用指南IBM Carbon Design System 的 React 组件库安装、Sass 配置与组件引入carbon components react 使用指南IBM Carbon Design System 的 React 组件库安装、Sass 配置与组件引入前端UI组件设计系统TDesign 组件库开发与安装指南TDesign 组件库开发与安装指南 前言 TDesign 是一款优秀的企业级设计体系与组件库解决方案为开发者提供了丰富的 UI 组件和设计资源。本文将详细介创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Agent Skills 实战:一句话完成环信 Web SDK 集成

Agent Skills 实战:一句话完成环信 Web SDK 集成

1. 环信 Web SDK 集成为何让人头疼做过即时通讯功能的前端同学大概都有体会:从零把一套 IM SDK 接进业务系统,真正花时间的往往不是写聊天界面,而是那些"看不见"的环节——SDK 初始化参数怎么配、登录态怎么和业务用户体系打通、消…

2026/9/21 16:53:48 阅读更多 →
基于WebSocket+Vue的实时聊天室毕业设计全解析

基于WebSocket+Vue的实时聊天室毕业设计全解析

简介:这是一份面向计算机专业本科生的毕业设计级全栈项目资源,聚焦实时通信场景,基于WebSocket协议与Vue.js框架实现轻量级在线聊天室系统,有效解决传统HTTP轮询在即时消息交互中的高延迟与低效问题。资源包共33个文件&#xff0c…

2026/9/21 16:53:45 阅读更多 →
Meshery 设计实战:在 GKE 上以 NVIDIA A100 80GB GPU 运行 JAX 多节点分布式「Hello World」

Meshery 设计实战:在 GKE 上以 NVIDIA A100 80GB GPU 运行 JAX 多节点分布式「Hello World」

Meshery 设计实战:在 GKE 上以 NVIDIA A100 80GB GPU 运行 JAX 多节点分布式「Hello World」 【免费下载链接】meshery Meshery, the cloud native manager 项目地址: https://gitcode.com/GitHub_Trending/me/meshery 本篇基于 Meshery 官方 Catalog 中的部…

2026/9/21 16:53:39 阅读更多 →

最新新闻

3个坑教你手写实现装饰设计培训项目

3个坑教你手写实现装饰设计培训项目

3个坑教你手写实现装饰设计培训项目 版本升级后 API 全变了,昨天还能跑的装饰工程数据接口,今天全报 404。别急着骂娘,这其实是底层逻辑变了。很多从业者还在死记硬背旧版参数,结果被新版校验机制卡得死死的。与其天天查文档改参数,不如直接手…

2026/9/22 21:58:20 阅读更多 →
qq播放器下载源码拆解:3个实战项目级技巧

qq播放器下载源码拆解:3个实战项目级技巧

qq播放器下载源码拆解:3个实战项目级技巧 学会语法却不知怎么搭项目,是大多数开发者转行或进阶时的最大卡点。很多人背下了 Python 的类继承、Java 的并发包,甚至刷完了 LeetCode 的前 200 题,但面对一个真实的…

2026/9/22 21:58:20 阅读更多 →
2026最新条码查询价格接口源码拆解

2026最新条码查询价格接口源码拆解

2026最新条码查询价格接口源码拆解 配置环境就卡半天,这种痛谁懂?我见过太多开发者,为了接一个 条码查询价格 的功能,在依赖库里折腾一下午,结果连报错日志都看不清。别急,今天咱们不聊虚的,直接掀开底裤,看看2026年主流电商与供应链系统中…

2026/9/22 21:58:20 阅读更多 →
3步搞定火山石幼龙攻略:图解原理让你从入门到实战

3步搞定火山石幼龙攻略:图解原理让你从入门到实战

3步搞定火山石幼龙攻略:图解原理让你从入门到实战 学会语法却不知怎么搭项目?这大概是很多刚接触新工具或新框架的开发者最大的痛点。你背下了API,看懂了文档,但一动手写代码就卡壳,不知道模块怎么串联,数据流怎么走。别急,今天这篇火山石幼龙攻略…

2026/9/22 21:58:20 阅读更多 →
别背废话了!2868面试最佳实践,3分钟吃透核心考点

别背废话了!2868面试最佳实践,3分钟吃透核心考点

别背废话了!2868面试最佳实践,3分钟吃透核心考点 官方文档翻了三遍还是抓不住重点?别急,大厂面试官眼里,2868的核心逻辑其实只有三层。今天咱们直接撕开官方源码仓库的底层逻辑,用最佳实践帮你把这块硬骨头啃下来。…

2026/9/22 21:58:20 阅读更多 →
3步拆解为什么说双缝实验恐怖图解原理

3步拆解为什么说双缝实验恐怖图解原理

3步拆解为什么说双缝实验恐怖图解原理 版本升级后 API 全变了,代码跑不通,文档还跟不上。很多开发者在重构遗留系统时,常被这种“黑盒”逻辑卡死:输入输出明确,但中间过程完全不可观测,就像量子力学里的双缝实验一样令人抓狂。其实,这种“观测即…

2026/9/22 21:57:19 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →