Skip to content

Details ​

带摘要行和隐藏内容的可折叠切换块,类似 Notion 的 toggle。

安装与注册 ​

从快速开始中的依赖包入手。下面的完整示例注册了该功能并渲染其界面——请选择 React 或 Vue 标签页。如果是在已有的编辑器中使用,把这些导入和扩展项合并进你自己的配置,并把控件放进你已有的 RichTextProvider 中。

tsx
'use client';

import { EditorContent, useEditor } from '@tiptap/react';
import { Document } from '@tiptap/extension-document';
import { Paragraph } from '@tiptap/extension-paragraph';
import { Text } from '@tiptap/extension-text';
import { RichTextProvider, Details, RichTextDetails } from 'ai-sparkwrite-editor';
import 'ai-sparkwrite-editor/style.css';

const extensions = [Document, Paragraph, Text, Details];

export default function DetailsExample() {
  const editor = useEditor({
    extensions,
    content: '<p>Try this feature here.</p>',
    immediatelyRender: false,
  });

  if (!editor) return null;

  return (
    <RichTextProvider editor={editor}>
      <RichTextDetails />
      <EditorContent editor={editor} />
    </RichTextProvider>
  );
}
vue
<script setup lang="ts">
import { EditorContent, useEditor } from '@tiptap/vue-3';
import { Document } from '@tiptap/extension-document';
import { Paragraph } from '@tiptap/extension-paragraph';
import { Text } from '@tiptap/extension-text';
import { Details, RichTextProvider, RichTextDetails } from 'ai-sparkwrite-editor/vue';
import 'ai-sparkwrite-editor/style.css';

const extensions = [Document, Paragraph, Text, Details];

const editor = useEditor({
  extensions,
  content: '<p>Try this feature here.</p>',
});
</script>

<template>
  <RichTextProvider :editor="editor">
    <RichTextDetails />
    <EditorContent :editor="editor" />
  </RichTextProvider>
</template>

使用方式 ​

Details 会一次性注册三个节点:details、detailsSummary 和 detailsContent,因此只需添加这一个扩展。点击工具栏按钮(或按 Mod-Alt-D)可将当前块包裹为折叠块,在折叠块内再次按下则会将其解除包裹。输入 /toggle 可从斜杠菜单中插入一个折叠块。

点击箭头图标即可展开或收起该块。展开状态会保存在文档中(persist: true),因此在保存并重新加载后仍会以 <details open> 的形式保留。

折叠块内的键盘行为:

  • 在摘要行中按 Enter:若该块处于展开状态,会在内容区中创建一个新段落;若处于收起状态,则会在该块之后创建。
  • 在空摘要行开头按 Backspace,会解除该折叠块的包裹。
  • 在内容区最后一个空段落上按 Enter,会退出该折叠块。

从代码中插入 ​

在 editor 非空的情况下,你可以包裹或解除包裹当前选区:

ts
editor.chain().focus().setDetails().run();
editor.chain().focus().unsetDetails().run();

选项 ​

ts
Details.configure({
  // 是否在文档中保留展开状态(默认:true)
  persist: true,
  // 展开时添加到外层容器的类名(默认:'is-open')
  openClassName: 'is-open',
  HTMLAttributes: { class: 'details' },
  // 转发给内部节点
  summary: { HTMLAttributes: { class: 'details-summary' } },
  content: { HTMLAttributes: { class: 'details-content' } },
});

Source ​

Source • Docs

用 ❤️ 打造