Tiptap 简单编辑器模版

上一篇介绍了Tiptap 编辑器的基础使用,本篇主要介绍 Tiptap 的简单编辑器模版Simple template,以及如何改造模版。

Tiptap 是一个基于 ProseMirror 的 Headless 富文本编辑器框架,它采用模块化设计,通过扩展(Extensions)机制来实现各种功能。每个扩展可以定义自己的节点(Nodes)、标记(Marks)、命令(Commands)等。

  1. Editor 实例:Tiptap 的核心,管理整个编辑器的状态和行为
  2. Extensions 扩展:功能模块的基本单位,可以是节点或标记
  3. Nodes 节点:文档结构的基本单位,如段落、标题、列表项等
  4. Marks 标记:应用于文本的样式,如粗体、斜体、链接等
  5. Commands 命令:用于修改编辑器状态的操作方法

simple-editor 模版

Tiptap 的 StarterKit 仅提供基础的富文本功能逻辑,不会自带默认样式(如标题字体大小、段落首行缩进等),需要手动添加 CSS 样式来美化内容。

可以安装一个简单编辑器模版Simple template,其包括常用的开源扩展UI 组件

bash 复制代码
npx @tiptap/cli@latest add simple-editor
  1. SimpleEditor:主编辑器组件,整合所有功能
    • tiptap-templates 文件夹
  2. Toolbar:工具栏组件,提供各种编辑操作按钮
    • tiptap-ui 文件夹
  3. Extensions:预配置的扩展集合,包括基础文本格式、列表、链接等
    • tiptap-ui-primitive 文件夹
  4. Styles:配套的样式文件,提供美观的默认外观

操作完成后,会在项目中加入一系列的文件,包括组件、配置文件、样式文件等等:

global.css全局样式文件中添加模版的样式文件:

css 复制代码
/* tiptap */
@import "./styles/_variables.scss";
@import "./styles/_keyframe-animations.scss";

配置完成后,页面样式乱了呀,影响其他内容样式了,如下图所示:

排查后,发现是暗黑模式默认宽高影响的,需要调整一下:

tsx 复制代码
import { SimpleEditor } from "@/components/tiptap-templates/simple/simple-editor";
import { styled } from "styled-components";

export default function Page() {
  return (
    <Container>
      <SimpleEditor />
    </Container>
  );
}

const Container = styled.div`
  width: 500px;
  margin-top: 30px;
  border: 1px solid #eee;
  .simple-editor-wrapper {
    width: 100%;
    height: 300px;
  }
`;

simple-editor 改造

主题

默认主题是暗黑模式,改为明亮模式:

tsx 复制代码
// 修改theme-toggle.tsx文件

// 注释掉下列代码:
React.useEffect(() => {
  const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
  const handleChange = () => {
    // setIsDarkMode(mediaQuery.matches)
  };
  mediaQuery.addEventListener("change", handleChange);
  return () => mediaQuery.removeEventListener("change", handleChange);
}, []);

// React.useEffect(() => {
//   const initialDarkMode =
//     !!document.querySelector('meta[name="color-scheme"][content="dark"]') ||
//     window.matchMedia("(prefers-color-scheme: dark)").matches;
//   setIsDarkMode(initialDarkMode);
// }, []);

然后在工具条中去掉该功能即可

工具条样式

默认工具条是横向滚动的,改为自适应

css 复制代码
/* 修改simple-editor.css文件 */
.simple-editor-wrapper {
  width: 100%;
  height: 300px;
  border: 1px solid #eee;
  .tiptap-toolbar {
    flex-wrap: wrap;
    /* 或者直接隐藏首个 <Spacer /> 组件 */
    > div:first-of-type {
      flex: 0 !important;
    }
  }
}

调整后效果:

工具条汉化

默认工具条是英文的,改为中文:

  1. 操作组件 undo-redo-button
tsx 复制代码
<UndoRedoButton action="undo" />
<UndoRedoButton action="redo" />
// 修改tiptap-ui/undo-redo-button/use-undo-redo.ts文件
export const historyActionLabels: Record<UndoRedoAction, string> = {
  undo: "撤销",
  redo: "重做",
}
  1. 标题组件 heading-dropdown-menu
  1. 列表组件 list-dropdown-menu
  1. 引用块 blockquote-button
  1. 代码块 code-block-button
  2. 文本样式 mark-button
    • 粗体 bold
    • 斜体 italic
    • 删除线 strike
    • 代码 code
    • 下划线 underline
    • 上标 superscript
    • 下标 subscript
  1. 高亮组件 color-highlight-button
  1. 链接组件 link-popover
  1. 对齐组件 align-align-button
  1. 图片组件 image-upload-button

改造前:

改造中:

改造后:

相关推荐
JieE2121 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
runnerdancer2 小时前
LLM是怎么处理messages数组的,提示词缓存又是什么
前端·agent
陈随易3 小时前
VSCode的Copilot扩展支持接入DeepSeek,Kimi了!
前端·后端·程序员
我不是外星人4 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
candyTong4 小时前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
IT_陈寒7 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
Jackson__8 小时前
分享一个横向滚动案例,带悬停暂停,通用性很强
前端
MariaH8 小时前
git rebase的使用
前端
_柳青杨8 小时前
深入理解 JavaScript 事件循环
前端·javascript
阡陌Jony8 小时前
关于前端性能优化的一些问题:
前端