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

改造前:

改造中:

改造后:

相关推荐
weixin_382395232 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__2 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.3 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~4 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华5 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子7 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅7 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni7 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学9 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端