文件向量 dDocs
ddocs. new (英语) 您的隐私专注,开源替代 Google Docs 。 它是一款端到端加密的文档编辑器,在无损于速度或人们对其数据的控制的情况下被优化用于多人协作.
其特征包括:
- 使用后量子加密的端到端加密
- 实时和同步协作
- 建议模式(跟踪更改)和评论
- 标记下和 LaTeX 支持
- 美人鱼JS 图表支持
- 进出口.docx,.md,.pdf,.html等.
- 黑暗模式和颜色主题
- 离线/在线编辑(即使没有WiFi,仍继续编写和打开更老的文件)
- 交叉设备同步(桌面和移动)
- 移动优化的网络应用和PWA
- 通过零知识证明启用的私人访问权限
- 通过零知识证明使私人社会收回账户/档案
- 版本历史
- 端到端加密,可编程的 API 优化代理( opt- in)
该寄存器包含:
/package——核心包码.- 示例和演示源代码以显示 dDocs 功能 .
使用量
先决条件
您的应用程序运行 Tailwind CSS 3.4 并拥有 @tailwind base/components/utilities 输入。 包船只编辑CSS;飞行前、公用事业、 @fileverse/ui 样式,而 KATeX 样式表来自您的构建.
安装导入( I)
import { DdocEditor } from '@fileverse-dev/ddoc';
按此顺序装入样式表( 按导入顺序打印出 CSS ; 下一步将前两个放在根版式上, 将后两个放在编辑器路由上 :
import './globals.css'; // your tailwind entry
import '@fileverse/ui/styles/base'; // tokens and base rules
import 'katex/dist/katex.min.css'; // math; fonts are served as files
import '@fileverse-dev/ddoc/styles'; // editor CSS
大小
DdocEditor 填充其父目录 : width: 100%; height: 100%。父母必须有一个明确的身高。 编辑器从来不读取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取
<div style={{ height: '100dvh', display: 'flex', flexDirection: 'column' }}>
<div style={{ flex: 1, minHeight: 0 }}>
<DdocEditor renderNavbar={renderNavbar} />
</div>
<footer>…</footer>
</div>
如果编辑器不高地制作,则其母版没有.
renderNavbar 输出是编辑器默认的第一行, 已渲染为: 编辑器不添加样式, 所以返回一个带有您自己的背景、 绑定和边框的元素 。 在流动中,它坐落在一个没有风格的行上,它只会使倒塌产生动画. 无 renderNavbar 无所不能 将导航器移到别处, 传出要转换的元素 。 在状态下保持,而不是在裁判中,所以编辑在附加时重新表示:
const [navbarEl, setNavbarEl] = useState<HTMLElement | null>(null);
<header ref={setNavbarEl} />
<DdocEditor navbarContainer={navbarEl} renderNavbar={renderNavbar} />
布局遵循编辑器的宽度,而不是窗口的宽度:在一个窄面板中,它使用其狭长的布局. 已知限制:1 DdocEditor 每页;在宽屏幕上的窄编辑器中,注释页仍然覆盖整个取景口.
同伴依赖关系
此软件包需要在您的工程中安装以下对等依赖 :
npm install @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities @fileverse/ui @fileverse/crypto viem framer-motion frimousse
| 软件包 | 版本 |
|---|---|
@dnd-kit/core | >=6.3.1 |
@dnd-kit/sortable | >=10.0.0 |
@dnd-kit/utilities | >=3.2.2 |
@fileverse/ui | ^5.4.2 |
@fileverse/crypto | >=0.0.21 |
viem | >=2.13.8 |
framer-motion | >=11.2.10 |
frimousse | >=0.3.0 |
对等范围是 @fileverse/ui@^5.4.2。如果你曾经测试过预放出配对,请精确地将两个包钉上:预放出不能满足护身范围.
这些从捆绑中外化,以避免在您的应用程序已经使用时出现重复. 如果没有安装它们,npm(v7+)会自动为您安装.
更新尾风配置
module.exports = {
presets: [require('@fileverse-dev/ddoc/tailwind')],
content: [
'./src/**/*.{js,ts,jsx,tsx}',
'./node_modules/@fileverse-dev/ddoc/dist/**/*.{js,mjs}',
'./node_modules/@fileverse/ui/dist/**/*.{js,mjs}',
],
};
需要两分两分,而不是单分 index.es.js 条目: dits被块(index.es.js
静态进口 use-headless-editor-<hash>.mjs),所以一个单文件条目会留下块
类未生成.
预设作曲 @fileverse/ui/tailwind (基于类的暗模式,动画插件,设计-系统类)并添加 mobile: 960px 屏幕上显示编辑器所用的内容.
tailwindcss@^3.4.0 是一个可选的对等点: 预设会运行在您自己的 Tailwind 构建中, 它也提供 postcss 财务报告和审定财务报表 postcss-js ii 预置负载。 尾风4不支持.
从 4.x 移动
5.0 停止运输前飞行, 尾风公用设备, ui样式表, KaTeX样式表 html, (中文(简体) ), body,以及 * 复发. 要升级 :
-
添加预设和两个
content以上条目. -
导入
@fileverse/ui/styles/base财务报告和审定财务报表katex/dist/katex.min.css照上面的顺序. -
一揽子计划不再提出这些全球宣言:
* { margin: 0; padding: 0 }html, body { height: 100%; width: 100% }html, body { overflow: hidden }body { position: static; user-select: none; -moz-osx-font-smoothing: grayscale }*, ::before, ::after { border-color: hsl(var(--color-border-default)) }
如果你的壳依赖
overflow: hidden或者说user-select: none中,添加到自己的 全局样式表。 其余的由尾风预飞或@fileverse/ui/styles/base床单. -
删除任何重新声明的工作
mobile:类; 预设生成它们. -
添加
katex属于自己的依附者npm install katex@^0.16.11),包裹不再保证被吊起. -
如果你把旧包里的东西按类名排序:
.custom-scrollbar现在.ddoc-scrollbar,以及.highlight-comment-bg, (中文(简体) ),.is-active, (中文(简体) ),.custom-border-bg, (中文(简体) ),.animate-fade-in-out, (中文(简体) ),.placeholder-disabled, (中文(简体) ),.tooltip:before以未使用方式删除. -
编 成
@fileverse/ui预设定义rounded-sm作为calc(var(--radius) - 4px)(4px) (中文(简体) ) 而不是 Tailwind的默认 2px, 所以任何使用 ddoc 的表面rounded-sm现在公用事业 使4px角. -
第三方 CSS ddoc 导入( 突出主题. js, tippy) 仍为全球船舶
.hljs*财务报告和审定财务报表.tippy-box选择者——这超出了软件包自己的选择者所有权担保范围. -
列表规则( E)
ul, (中文(简体) ),ol,而"巢居清单"的计数器)现在被扩大为:where(.ProseMirror, .presentation-mode)不再有风格ol编号 :ul编辑器外或 演示文稿表面。 如果你的应用依赖于Ddoc的全局列表规则 在其他地方,你自己拥有.
你现在应该使用 DDocs !
从 6. x 移走
7.0会改变编辑器的大小. 没有删除道具.
- 给编辑器一个有确定高度的父(参见 Sizing) 。 它已经不再大小了
100dvh。 。 。 . - 把脚印放在编辑器正常流后.
footerHeight没有效果,可以删除. - 导航和工具栏已经不在了
#editor-canvas. 使用的中央支助系统#editor-canvas因为他们的祖先应该使用.ddoc-editor-root。 。 。 . - 编辑器不再将您的导航栏包入
<nav id="Navbar">它使什么renderNavbar返回,因此移动包装的样式(color-bg-default p-2 flex gap-10 items-center justify-between w-full border-b color-border-default)和id,如果选中的话,请在自己的元素上。 "逃生归来"对"编辑"的处理器也随之而去,而现在隐藏起来会倒塌一排没有风格的.ddoc-navbar-row围绕你的元素。 无renderNavbar无所不能 导航器的高度来自其内容;它是一个固定的64px,下面是46pxlg。 。 。 . editorCanvasClassNames不应该设置高度.zoomLevel, (中文(简体) ),isNavbarVisible财务报告和审定财务报表isPreviewMode是可选的。 每个UI状态都可以被忽略,或者用一个值和一个来控制onXChange调用。 这个setX道具还行并被腐烂.- 您的尾风建筑不需要改变配置 。 新的
ddoc-*变体( 随编辑器宽度而来的容器- query 断点)来自@fileverse-dev/ddoc/tailwind预设已使用.
修改时没有更改代码的行为 :
- 没有他们的UI功能
setXprop现在在内部状态上工作. Split View 切换显示, 何时关闭现场协作( 需要)setIsSplitView)),以及注释抽屉,大纲和演示文稿模式打开而不用设置. 为了固定一个, 传递它的值 没有回调, 例如isPresentationMode={false}。对于 Split 视图,isSplitView={false}没有回调时,也会隐藏工具栏切换. onFocusModeChange和堕落者onFocusMode当isFocusMode未通过.#editor-canvas现在是文档滚动器( 它携带data-editor-scroll-container)和根 ([.ddoc-editor-root)为overflow: hidden。 。 。 .- 一个传送到
navbarContainer由您定位并分层;编辑器只将它切入元素。 焦点模式和工具栏的崩溃切换不隐藏它: 隐藏您自己的元素onFocusModeChange财务报告和审定财务报表onNavbarVisibleChange如果你想要,或通过showNavbarToggle={false}以删除崩溃切换. - 工具栏在隐藏时不再滑动或淡出;其行被去掉并被画布取去空间. 一个入流的导航器仍然会滑出并淡出超过300ms. 对于一个传送的导航器,动画是你的:放
ddoc-navbar-row并添加ddoc-navbar-row--hidden来摧毁它. - 移动制表板坐落在编辑器的下边. 它不再添加
24px + env(safe-area-inset-bottom),所以你的脚必须携带安全区域设置. - 编辑的应变课使用
:where()因此他们需要Chrome 88+,Safari 14+或Firefox 78+.
dDocProps 接口
这个 DdocProps 界面是一个 TypeScript 接口,用于定义页面相关组件的属性。 它包括处理预览模式,管理发布数据的属性,以及可选地存储与页面相关的元数据和内容.
核心道具
| 财产 | 类型 | 说明 |
|---|---|---|
initialContent | JSONContent | 编辑器的初始内容 |
onChange | (changes: JSONContent, chunk?: any) => void | 在编辑器内容更改时触发回调 |
ref | React.RefObject | 访问编辑器实例的引用 |
isPreviewMode | boolean | 如果编辑器处于预览/只读模式,则控制 。 可选的,默认为 false |
editorCanvasClassNames | string | 编辑画布的额外 CSS 类 |
ignoreCorruptedData | boolean | 装入时是否忽略已损坏的数据 |
onInvalidContentError | (error: any) => void | 处理无效内容错误的回调 |
协作道具
| 财产 | 类型 | 说明 |
|---|---|---|
enableCollaboration | boolean | 启用实时协作功能 |
collaborationId | string | 协作会话的独特ID( 启用协作时需要) |
username | string | 用户协作的显示名 |
setUsername | (username: string) => void | 更新用户名的函数 |
walletAddress | string | 用户钱包地址 |
onCollaboratorChange | (collaborators?: IDocCollabUsers[]) => void | 合作者更改时召回 |
enableIndexeddbSync | boolean | 启用离线支持的索引DB同步 |
ddocId | string | 独一无二的文档 ID (索引 DB 同步需要) |
UI/UX 推进
每个UI状态都可以被忽略(编辑器保持内部),或者用值和值来控制 onXChange 调用。 这个 setX 道具还行并被腐烂.
| 财产 | 类型 | 说明 |
|---|---|---|
zoomLevel | string | 当前编辑器的缩放级别 。 可选的,默认为 '1' |
onZoomLevelChange | (zoomLevel: string) => void | 缩放已更改 |
setZoomLevel | React.Dispatch<SetStateAction<string>> | 折旧、使用 onZoomLevelChange |
isNavbarVisible | boolean | 控制导航的能见度. 可选的,默认为 true |
onNavbarVisibleChange | (visible: boolean) => void | 显示或隐藏 Navbar |
setIsNavbarVisible | React.Dispatch<SetStateAction<boolean>> | 折旧、使用 onNavbarVisibleChange |
renderNavbar | () => JSX.Element | 自定义导航器渲染器 。 没有它,没有导航器 |
navbarContainer | HTMLElement | null | 使导航器进入的元素。 外为入入入入入. null 除非它附着,否则什么都不做 |
showNavbarToggle | boolean | 显示工具栏的导航崩溃 chevron 。 默认 true |
renderThemeToggle | () => JSX.Element | 自定义主题切换渲染器 |
showTOC | boolean | 控制大纲 |
onShowTOCChange | (show: boolean) => void | 显示或隐藏大纲 |
setShowTOC | React.Dispatch<SetStateAction<boolean>> | 折旧、使用 onShowTOCChange |
commentDrawerOpen | boolean | 控制注释抽屉 |
onCommentDrawerOpenChange | (open: boolean) => void | 打开或关闭评论抽屉 |
setCommentDrawerOpen | React.Dispatch<SetStateAction<boolean>> | 折旧、使用 onCommentDrawerOpenChange |
isPresentationMode | boolean | 控件显示模式 |
onPresentationModeChange | (active: boolean) => void | 输入或左侧的演示模式 |
setIsPresentationMode | React.Dispatch<SetStateAction<boolean>> | 折旧、使用 onPresentationModeChange |
isSplitView | boolean | 控件分割视图 |
onSplitViewChange | (active: boolean) => void | 输入或左侧分割视图 |
setIsSplitView | React.Dispatch<SetStateAction<boolean>> | 折旧、使用 onSplitViewChange |
isFocusMode | boolean | 控制焦点模式 |
onFocusModeChange | (isFocusMode: boolean) => void | 焦点模式已更改 |
onFocusMode | (isFocusMode: boolean) => void | 折旧、使用 onFocusModeChange |
onStatsChange | (stats: { words; characters; selectedWords; pages: number | null }) => void | 活动 Tab 数据; 当任何字段变化时起火 . pages 实值 null 直到测量 |
setWordCount, (中文(简体) ), setCharacterCount, (中文(简体) ), setSelectedWordCount, (中文(简体) ), setPageCount | React.Dispatch<SetStateAction<number>> | 折旧、使用 onStatsChange |
footerHeight | string | 被贬去,无所取效. 把页脚放在编辑器后正常流中 |
sharedSlidesLink | string | 共享演示文稿幻灯片链接 |
documentStyling | DocumentStyling | 文档显示自定义样式 |
fonts | FontDescriptor[] | 消费者提供的字体目录( 见自定义字体) |
文档样式
这个 documentStyling prop允许您自定义文档的视觉外观, 有三个不同的样式区域:
interface ThemeVariantValue {
light: string;
dark: string;
}
interface DocumentStyling {
/**
* Background styling for the outer document area.
* Supports CSS background values including gradients.
* Example: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)"
*/
background?: string | ThemeVariantValue;
/**
* Background color for the editor canvas/content area.
* Should be a solid color value.
* Example: "#ffffff" or "rgb(255, 255, 255)"
*/
canvasBackground?: string | ThemeVariantValue;
/**
* Text color for the editor content.
* Example: "#333333" or "rgb(51, 51, 51)"
*/
textColor?: string | ThemeVariantValue;
/**
* Font family for the editor content.
* Example: "Inter, sans-serif" or "'Times New Roman', serif"
*/
fontFamily?: string;
}
用法示例
<DdocEditor
documentStyling={{
background: {
light: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
dark: 'linear-gradient(135deg, #2a3145 0%, #3a2f59 100%)',
},
canvasBackground: { light: '#ffffff', dark: '#1e1f22' },
textColor: { light: '#333333', dark: '#e8ebec' },
fontFamily: 'Inter, sans-serif',
}}
// ... other props
/>
说明: 文档造型在正则编辑器模式和演示文稿模式两方面都有效. 仅以演示文稿形式 canvasBackground, (中文(简体) ), textColor,以及 fontFamily 用于维护干净的幻灯片外观.
自定义字体
编辑的船载着 仅限系统基准 (Arial, Calibri, Georgia, Times New Roman等)和制作 没有第三方字体请求 ——没有谷歌字体 @import。要提供额外字体,请通过 a fonts 目录. 每个字体都由您的应用程序自行托管并加载 需求 通过 CSS 字体加载 API: 一个字体的 woff2 只有在拾取器中选择或文档(包括远程协作者的更改)实际在其中生成文本时才获取.
type FontDescriptor = {
/** Display name shown in the picker, e.g. "Poppins". */
name: string;
/** CSS font-family stack stored in the content, e.g. "Poppins, sans-serif". */
family: string;
/**
* woff2 source(s). Omit for a pure system font (no loading).
* - string: a single file covering all weights (e.g. a variable font).
* - Record<number, string>: a per-weight map, e.g. { 400: url400, 700: url700 }.
*/
url?: string | Record<number, string>;
/**
* Optional SVG preview rendered in the picker. Any React node that renders an
* <svg>. Falls back to the font name in the default font when absent.
*/
preview?: React.ReactNode;
};
用法示例
import { DdocEditor, FontDescriptor } from '@fileverse-dev/ddoc';
// Self-host the woff2 files however your bundler prefers (e.g. @fontsource/*).
import poppins400 from '@fontsource/poppins/files/poppins-latin-400-normal.woff2';
import poppins700 from '@fontsource/poppins/files/poppins-latin-700-normal.woff2';
const fonts: FontDescriptor[] = [
{
name: 'Poppins',
family: 'Poppins, sans-serif',
url: { 400: poppins400, 700: poppins700 },
preview: <PoppinsPreview />, // optional SVG
},
];
<DdocEditor fonts={fonts} /* ...other props */ />;
注释:
- 采集者列出系统的基线和目录 a-Z 组合 (与 默认 被钉入顶上.
- CSS的面部名称来源于第一个符号:
family这样name纯粹是化妆品,可以有所不同(例如:.name: 'Poppins (Brand)', (中文(简体) ),family: 'Poppins, sans-serif') (中文(简体) ). - 该目录还驱动 PDF/ 打印导出, 该导出
@font-face规则. - 主办您的
woff2文件 原产地 因此,他们既解决编辑器,又解决了印刷物.
注释和协作道具
| 财产 | 类型 | 说明 |
|---|---|---|
initialComments | IComment[] | 要显示的初步注释 |
setInitialComments | (comments: IComment[]) => void | 更新注释的职能 |
onCommentReply | (id: string, reply: IComment) => void | 召回评论回复 |
onNewComment | (comment: IComment) => void | 召回新评论 |
commentDrawerOpen | boolean | 控件注释抽屉可见度 |
onCommentDrawerOpenChange | (open: boolean) => void | 打开或关闭评论抽屉 |
setCommentDrawerOpen | (isOpen: boolean) => void | 折旧、使用 onCommentDrawerOpenChange |
onResolveComment | (commentId: string) => void | 解析批注时召回 |
onUnresolveComment | (commentId: string) => void | 解析批注时召回 |
onDeleteComment | (commentId: string) => void | 删除注释时召回 |
disableInlineComment | boolean | 禁用内置注释特性 |
认证道具
| 财产 | 类型 | 说明 |
|---|---|---|
isConnected | boolean | 用户连接状态 |
isLoading | boolean | 认证加载状态 |
connectViaUsername | (username: string) => Promise<void> | 基于用户名的认证 |
connectViaWallet | () => Promise<void> | 基于钱包的认证 |
isDDocOwner | boolean | 显示是否拥有文档 |
工具软件
| 财产 | 类型 | 说明 |
|---|---|---|
setCharacterCount | React.Dispatch<SetStateAction<number>> | 折旧、使用 onStatsChange更新字符计数 |
setWordCount | React.Dispatch<SetStateAction<number>> | 折旧、使用 onStatsChange更新字数 |
setPageCount | React.Dispatch<SetStateAction<number>> | 折旧、使用 onStatsChange。更新近似。 导出页数 |
ensResolutionUrl | string | ENS 名称分辨率的 URL |
ipfsImageUploadFn | (file: File) => Promise<IpfsImageUploadResponse> | 用于安全图像上传的函数 |
ipfsImageFetchFn | (_data: IpfsImageFetchPayload) => Promise<{ url: string;file: File;}> | 从 IPFS 获取安全图像的函数 |
onError | (error: string) => void | 一般错误处理器 |
onInlineComment | () => void | 调回内行注释 |
onMarkdownExport | () => void | 召回标记下导出 |
onMarkdownImport | () => void | 召回标记下导入 |
onPdfExport | () => void | 回调 pdf 导出 |
onSlidesShare | () => void | 回调共享幻灯片 |
onComment | () => void | 一般性评论回调 |
在当地运行此示例的步骤
npm inpm run dev
它将打开一个 Vite 服务器, 这将拥有 Ddoc 编辑器 .
QQ 此寄存器正在快速开发, 经常更新和更改 。 我们建议暂时不要用于生产.